$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOTERM0 - MODULE 22>>                                                 00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$TITLE " MAY 27,1976   ASYNCHRONOUS TERMINAL MONITOR"                   00030000
$CONTROL PRIVILEGED, UNCALLABLE, MAIN = IOTERM0                         00032000
$THIRTY                                                                 00034000
  <<                                                                    00036000
       TERMINAL REQUESTS -                                              00038000
                                                                        00040000
  OPERATION         FUNC         PARAMETERS                             00042000
                                                                        00044000
    READ             0    P1.( 0:1)  = NOCRLF IF SET                    00046000
                            .(13:3)  = EOF  SPECIFICATION               00048000
                                                                        00050000
                          P2.(0:8 ) - IF <> 0 THEN SPECIAL RD STOP CHAR 00052000
                            .(11:2) - IF 0 THEN ASCII ELSE BINARY       00054000
                            .(10:1) - OWN DC1/DC2 HANDSHAKE             00056000
                                                                        00058000
                                                                        00060000
    WRITE            1    P1 - VERTICAL FORMAT SPECIFICATION            00062000
                                                                        00064000
                                  1 - USE 1ST DATA CHAR AS FORMAT SPEC  00066000
                                                                        00068000
                                %53 - "+", CR ONLY NO LF                00070000
                                %60 - "0", DOUBLE SPACE                 00072000
                                %61 - "1", TOP OF FORM                  00074000
                                                                        00076000
                                %200-%277,  N-%200 LF'S AND A CR        00078000
                                                                        00080000
                                %320- NO CR OR LF                       00082000
                                                                        00084000
                              ALL OTHERS, DO A CR/LF                    00086000
                                                                        00088000
                          P2.(15:1) - PRESPACE FLAG                     00090000
                            .(11:2) - IF NOT 0 THEN BINARY              00092000
                                                                        00094000
                                                                        00096000
  FILE OPEN      2    IF ONLINE NOP ELSE ALLOCATE WITH DEFAULT <<00190>>00098000
  FILE CLOSE         3    CLEAN UP AND CRLF IF NOT NEW LINE             00100000
  DEVICE CLOSE       4    DISCONNECT                                    00102000
                                                                        00104000
  SET READ TIMEOUT   5    P1 - IF 0 CLEAR TIMEOUT ELSE TIME IN SECONDS  00106000
                                                                        00108000
  SET INPUT SPEED    6    P1 - SPEED IN CHARACTERS/SECOND               00110000
                                OLD SPEED RETURNED IN COUNT             00112000
  SET OUTPUT SPEED   7    P1 - SPEED IN CHARACTERS/SECOND               00114000
                                OLD SPEED RETURNED IN COUNT             00116000
                                                                        00118000
  ENABLE ECHO        8    RETURN OLD ECHO SETTING IN COUNT              00120000
  DISABLE ECHO       9    RETURN OLD ECHO SETTING IN COUNT              00122000
                                                                        00124000
  DISABLE BREAK      10                                                 00126000
  ENABLE  BREAK      11                                                 00128000
                                                                        00130000
  DISABLE CONTROL Y  12                                                 00132000
  ENABLE CONTROL Y   13                                                 00134000
                                                                        00136000
  DISABLE TAPEMODE   14                                                 00138000
  ENABLE  TAPEMODE   15                                                 00140000
                                                                        00142000
  DISABLE READ TIMER 16                                                 00144000
  ENABLE READ TIMER  17                                                 00146000
  RETURN READ TIME   18   COUNT CONTAINS READ TIME IN 1/100 SECONDS     00148000
                                                                        00150000
DISABLE PARITY CHK 19   INVALID IF TTYPE OF 8-BIT DATA         <<AMS00>>00152000
                        SEND/RECEIVE DEVICE (HP2635/45K)       <<AMS00>>00154000
ENABLE PARITY CHK  20   INVALID IF TTYPE OF 8-BIT DATA         <<AMS00>>00156000
                        SEND/RECEIVE DEVICE(HP2635/45K)        <<AMS00>>00158000
                                                                        00160000
  LOGGED ON          21   P1 - IF 1 THEN SESSION, SO ENABLE BREAK       00162000
                               IF 2 THEN JOB, NO BREAK         <<00163>>00164000
                               IF 0 THEN DATA, NO BREAK        <<00163>>00166000
                                                                        00168000
  NOT USED           22                                                 00170000
  SET TERM TYPE      23   P1 - TERM TYPE AS SPECIFIED IN THE MPE ERS    00172000
                                                                        00174000
  ALLOCATE TERMINAL  24   P1 - TERM TYPE AS SPECIFIED IN THE MPE ERS    00176000
                          P2 - SPEED IN CHARACTERS/SECOND               00178000
                                                                        00180000
  CLR FLUSH & WRITE  25   PARAMETERS SAME AS WRITE                      00182000
                                                                        00184000
  CNTRL X ECHO ON    26                                                 00186000
  CNTRL X ECHO OFF   27                                                 00188000
                                                                        00190000
  NO OPERATION       28                                                 00192000
                                                                        00194000
  PTAPE READ         29   P1, P2 - SPOOL BUFFER BEGINNING DISC ADDRESS  00196000
                                                                        00198000
  SET BREAK MODE     30   P1 - ODD = SET, EVEN = CLEAR BREAK MODE       00200000
                                                                        00202000
  SET CONSOLE MODE   31   P1 - ODD = SET, EVEN = CLEAR CONSOLE MODE     00204000
                                                                        00206000
  SET PARITY         32   P1 - 0  - NO PARITY GENERATE, BIT 8 ALWAYS 0  00208000
                               1  - NO PARITY GENERATE, BIT 8 ALWAYS 1  00210000
                               2  - EVEN PARITY ON WRITE, EXPECTED ON RD00212000
                               3  - ODD PARITY ON WRITE,EXPECTED ON READ00214000
  ******NOTE: FUNC. INVALID IF TTYPE=HP2635/45K****************<<AMS00>>00216000
                                                                        00218000
  ALLOCATE TERMINAL  33   P1 - TERM TYPE AS SPECIFIED IN THE MPE ERS    00220000
                          P2 - SPEED IN CHARACTERS/SECOND               00222000
                                                                        00224000
  SET TERM TYPE      34   P1 - TERM TYPE AS SPECIFIED IN THE MPE ERS    00226000
                                                                        00228000
  RETURN TERM TYPE   35   TERMINAL TYPE RETURNED IN COUNT WORD          00230000
                                                                        00232000
  RETURN OUT SPEED   36   OUTPUT SPEED RETURNED IN COUNT WORD           00234000
                                                                        00236000
  SET STOP CHARS     37   P1 - IF 0 THEN DISABLE SPECIAL EOR AND        00238000
                               SUBSYSTEM BREAK CHARACTERS ELSE          00240000
                            .(0:8) = SUB SYSTEM BREAK CHARACTER         00242000
                            .(8:8) = END OF RECORD CHARACER             00244000
                                                                        00246000
  SET CONS INTERRUPT 38   P1 - ODD,ENABLE CNTRL A; EVEN DISABLE CNTRL A 00248000
                                                                        00250000
                                                                        00252000
                                                                        00254000
                                                                        00256000
    TERMINAL STATUS RETURNS -                                           00258000
                                                                        00260000
      %00  - NOT COMPLETED OR NOT STARTED                               00262000
                                                                        00264000
       01  - NORMAL COMPLETION                                          00266000
       11  - COMPLETED ON SPECIAL READ STOP CHARACTER                   00268000
                                                                        00270000
       X2  - END OF FILE                                                00272000
                                                                        00274000
       13  - PARITY ERROR ON READ                                       00276000
     14  - TRANSMISSION ERROR (RETUNED FROM 2631B  ONLY)       <<01781>>00278000
       23  - READ TIMED OUT                                             00280000
       33  - I/O ABORTED EXTERNALLY                                     00282000
       43  - DATA LOST, NO BUFFER AVAILABLE OR TOO LONG TAPEMODE RECORD 00284000
       53  - NOT ON LINE, DATA SET NOT READY OR DISCONNECT              00286000
      153  - ENABLE SUB SYS BRK REQUESTED & NO CY PIN                   00288000
      163  - READ TIME RETURNED > (2**16-1) HUNDREDTHS                  00290000
      173  - READ STOPPED WHEN A BREAK DETECTED                         00292000
                                                                        00294000
       04  - INVALID REQUEST, FUNCTION OR PARAMETER                     00296000
       24  - BLOCK MODE READ TIMED OUT                         <<02004>>00298000
       34  - TIMING ERROR, UNIT WAS NOT SERVICED IN TIME                00300000
  >>                                                                    00302000
$PAGE                                                                   00304000
BEGIN    << TERMINAL MONITOR AND DRIVER >>                              00306000
                                                                        00308000
EQUATE                                                                  00310000
    ABORTED   =%33,        << REQUEST ABORTED RETURN STATUS >>          00312000
    ABORTSTOP = 5,         << READ ABORTED STOP >>                      00314000
    ACTIVE'   = 2,         << MONITOR IS RUNNING AGAINST THIS DEVICE >> 00316000
    AJOBS'    = 2,         << THIS DEVICE ACCEPTS JOBS >>               00318000
    ALLOCATE  =24,         << ALLOCATE TERMINAL FUNCTION  CODE >>       00320000
    ALLOCATEX =33,         << ALLOCATE TERMINAL FUNCTION  CODE >>       00322000
    BADPARITY =%13,        << PARITY ERROR REQUEST ERROR STATUS >>      00324000
    BANDWAIT  = 5,         << WAITING FOR LESS TERM ACTIVITY >>         00326000
    BLOCKED'  = 5,         << BLOCKED I/O REQUEST >>                    00328000
    BLOCKTIMED= %24,       << BLOCK TIMEOUT STATUS >>          <<02004>>00330000
    BLOCKTIMEOUT= 8,       << TIMER TYPE >>                    <<02004>>00332000
    BLOCKTO   = 7,         << READ ERROR >>                    <<02004>>00334000
    BLOCKTOSTOP=6,         << READ STOP  >>                    <<02004>>00336000
    BMODE'    =12,         << TERMINAL IN BREAK MODE >>                 00338000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00340000
    BRKEND    = 2,         << READ ENDED WITH BREAK STATUS INDEX >>     00342000
    BREAKEND  =%173,       << READ COMPLETED WHEN A BREAK DETECTED >>   00344000
    BREAKSTOP = 1,         << READ STOP CODE AFTER BREAK ACCEPTED >>    00346000
    BRKOK'    =BREAK'+1,   << BREAK IS ENABLED >>                       00348000
    CFAILTO   = 1,         << CARRIER FAIL TIME OUT REQUEST >>          00350000
    CLOSED    = 4,         << DCLOSE REQUESTED HSTATE >>                00352000
    CMODE'    =11,         << TERMINAL IS IN CONSOLE MODE >>            00354000
    COMPLETED'= 6,         << I/O REQUEST HAS BEEN COMPLETED >>         00356000
    CONSMODE  = 2,         << TMODE OR PREMPT LEVEL OF CONSOLE >>       00358000
    CPCB      = 4,         << CURRENT PCB INDEX >>                      00360000
    CR        = %15,       << OCTAL VALUE OF CARRAGE RETURN >> <<01469>>00362000
    DBREAK    =30,         << IOQP TO SAVED BROKEN READ DATA >>         00364000
    DCNT      = 18,        << COUNT OF BUFFER BEING WRITTEN , ALSO      00366000
                                HOLDS SPEED DURING SPEED SENSING >>     00368000
    DHEAD     = 19,        << SYSDB POINTER TO HEAD OF TBUF LIST >>     00370000
    DILTP     = 5,         << ILT POINTER >>                            00372000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00374000
    DISCNCT'  = 1,         << DATA SET HAS DISCONNECTED >>              00376000
    DLINK     = 1,         << DITP LINK TO QUEUED REQUESTS WAITING >>   00378000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00380000
    DMONTR    = 33,        << HOLDS MONITORING CODE >>         <<00.06>>00382000
    DNXTB     = 25,        << TBUF POINTER OF A SAVE TBUF IF NOT 0 >>   00384000
    DPNTR     = 21,        << BYTE POINTER DURING READ & WRITE >>       00386000
    DRCNT     = 17,        << HOLDS COUNT OF READ DATA SAVED >>         00388000
    DRPTR     = 22,        << IF <> 0 THEN HEAD OF READ DATA SAVED >>   00390000
    DRQST     = 6,         << MONITOR SERVICE REQUEST FLAGS >>          00392000
                           << 0 - HANGUPTO    8  - READTO               00394000
                              1 - DISCONNECT  9  - ONLINE               00396000
                              2 - CFAILTO     10 - DSTREADY             00398000
                              3 - TURNTO      11 - LOGONTO              00400000
                              4 - IOERROR     12 - BREAK                00402000
                              5 - IODONE      13 - CONTROL Y            00404000
                              6 - SPOOLEND    14 - CFAIL                00406000
                              7 - SPOOLSW     15 - UNUSED               00408000
                           >>                                           00410000
    DRTMAX    =28,         << MAXIMUM TIME FOR READ TIMEOUT, SECONDS >> 00412000
    DRTIME    =26,         <<  INDEX TO I/O READ TIME >>                00414000
    DSAVE     =13,         << HOLDS WAITED DSTATE, HSTATE & TURN CHAR >>00416000
    DSTATE'   =12,         << DEVICE STATE                              00418000
                               0 - NULL         %10 - EOR SYNC          00420000
                               1 - WRITING      %11 - WRITE BUF FILL    00422000
                               2 - READING      %12 - SEND XON NEXT     00424000
                               3 - XON WRITE    %13 - DELETE CR         00426000
                               4 - WRITE TURN   %14 - DOING SYNCS OR "!"00428000
                               5 - BAND WAIT    %15 - READ CHAR ECHO    00430000
                               6 - EOR LF       %16 - START READ        00432000
                               7 - EOR CR       %17 - STOP READ >>      00434000
    DSTOP     = 14,        << SUB SYS BRK AND EOR CHARACTERS >>         00436000
    DSYNC     = 29,        << CR,LF SYNC DATA AND SYNC COUNTER >>       00438000
    DTAIL     = 20,        << SYSDB POINTER TO END OF TBUF LIST >>      00440000
    DTBLK     = 24,        << LINK WORD FOR QUEUED TBUF REQUESTS >>     00442000
    DTBUF     =18,         << FIRST TBUF POINTER  >>                    00444000
    DTBUFD    = DTBUF/2,   << DOUBLE INDEX TO FIRST TWO TBUF POINTERS >>00446000
    DTBF2     = DTBUFD+1,  << DBL INDEX TO DTBUF2, DISC ADDR IN PTAPE >>00448000
    DTRLX     = 31,        << HOLDS 2640/SPEED AND           >><<01448>>00450000
                           << LOGON/HANGUP/READ TIM.REQ.IND. >><<01448>>00452000
    DWAIT     = 15,        << DITP TO NEXT DEV ON ACTIVITY WAIT >>      00454000
    ECHO'     = 3,         << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00456000
    ECHOOFF   = 0,         << TURN ECHO OFF CODE TO MPXCONTROL >>       00458000
    ENQ       = 5,         << ENQ CHAR >>                      <<00234>>00460000
    EORLF     = 6,         << DSTATE - EOR LF IN PROGRESS >>            00462000
    EORSYNC   =%10,        << DSTATE EOR SEQUENCE START SYNC >>         00464000
    ESC       = %33,       << OCTAL VALUE OF ESCAPE CHAR >>    <<01469>>00466000
    FF        = %14,       << OCTAL VALUE OF FORM FEED CHAR >> <<01469>>00468000
     FILEOPEN  = 2,        << FILE OPEN FUNCTION CODE>>        <<00190>>00470000
    FINREAD   =%17,        << FINISH STOPPED READ DSTATE >>             00472000
    FMAX      = 38,        << MAXIMUM FUNCTION CODE >>                  00474000
    FORMFEED'  = 4,        << DEVICE RESPONDES TO A FORM FEED >>        00476000
    GOODIO    = 1,         << SUCCESSFUL I/O STATUS RETURN >>           00478000
    HANGINGUP = 7,         << DSET HANGUP DELAY IN PROGRESS >>          00480000
    HANGUP    = 3,         << HANG UP DSET CONTROL CODE >>              00482000
    HANGUPTURN= 6,         << HANGUP 202 TURN TK READ WAIT >>           00484000
    HANGUPTO  = 5,         << HANGUP TIMEOUT REQUEST TYPE >>            00486000
    HP2640TO  = 0,         << 2640/44 READ/WRITE TIME OUT REQUEST >>    00488000
    HP2635    = 15,        <<HP2635 8-BIT TTYPE>>              <<AMS00>>00490000
    HP2635A   = 15,        << HP2635 8 BIT TTYPE>>             <<00234>>00492000
    HP2631B   = 19,        << 2631B, 7 BIT DATA >>             <<01469>>00494000
    ISIOP     = 8,         << POINTS TO SIO PROGRAM AREA >>    <<01300>>00496000
    INITTO    = 7,         << SPEED SENSE DISCONNECTED TIME REQUEST >>  00498000
    INVALIDOP = 4,         << INVALID OPERATION REQUESTED >>            00500000
    IOQSIZE   =11,         << IOQ ELEMENT SIZE >>                       00502000
    IOWAIT    =%100,       << UNBLOCKED I/O WAIT >>                     00504000
    IOWAKE'   = 4,         << WAKE CALLER ON COMPLETION IF SET >>       00506000
    JMATdst   = 25,                                            <<01470>>00508000
    JMATsir   = 15,                                            <<01470>>00510000
    JUNKWAIT  = %20,                                                    00512000
    LDTDST    = 14,        << LOGICAL DEVICE TABLE DST NUMBER >>        00514000
    LOGGINGON = 2,         << HSTATE LOGGING ON >>                      00516000
    LOGONTO   = 4,         << LOG ON TIME OUT REQUEST TYPE >>           00518000
    LOSTCSTAT =%34,        << LOST CHARACTER REQUEST ERROR STATUS >>    00520000
    LOSTDATA  = 3,         << BUFFER NOT AVAILABLE >>                   00522000
    LOSTDSTAT =%43,        << LOST DATA REQUEST ERROR STATUS >>         00524000
    M202'     = 2,         << 202 OR 2002 MODEM >>                      00526000
    M202      =M202'+1,    << CIRCULAR SHIFT COUNT TO GET 202 TO BIT15>>00528000
    MAXSPEED  = 7,         << MAXIMUM SPEED INDEX >>                    00530000
    MAXTIO    = 12,        << MAX TERM I/O TO PREVENT BLOCK OVERRUNS >> 00532000
    NEWLINE'  = 8,         << LF WAS LAST CHARACTER OUTPUT >>           00534000
    NOEOFCHECK= 5,         << NO CHECK & KEEP ANY SAVED DATA >>         00536000
    NOCYPIN   =%153,       << ENABLE ESCAPE & NO CY PIN ERROR >>        00538000
    NOPTY'    = 2,         <<8-BIT DATA  FLAG-->>              <<AMS00>>00540000
                           <<SET IN 8TH BIT>>                  <<AMS00>>00542000
    NOTNEW    = 1,         << REQUEST PROCESSING HAS STARTED >>         00544000
    NOTREADING = 0,         << DEVICE NOT IN READING STATE >>  <<01.02>>00546000
    NOTRDYMSG = 11,        << CONSOLE MESAGE INDEX >>          <<01469>>00548000
    NOWAIT    = 0,         << DONT WAIT IN WAKE >>                      00550000
    NULL      = 0,                                                      00552000
    OFFLINE   =%53,        << DEVICE OFFLINE OR HUNGUP RETURN STATUS >> 00554000
    ONLINE    = 1,         << SPEED SENSED AND ONLINE HSTATE >>         00556000
    OPCONSOLE = 0,         << DIRECTS IOMESSAGE TO CONSOLE >>  <<01469>>00558000
    OUTSPD    = 7,         << SET OUT SPEED FUNCTION CODE >>            00560000
    PCB3      = 3,         << FOURTH WORD OF PCB >>                     00562000
    PCB9      = 9,                                                      00564000
    PCBSIZE   =16,                                                      00566000
    POSTSPACE =%33,        << RSTATE, POSTSPACE TBUF WAIT >>            00568000
    PREMPT'   = 0,         << A PREMPTIVE REQUEST IS IN THE QUEUE >>    00570000
    PREMPTSTOP= 3,         << STOP READ FOR PREMPTIVE REQUEST >>        00572000
    PRESPLAST'=13,         << LAST WRITE WAS A PRESPACE >>              00574000
    PRESPACE  =%31,        << REQUEST WAITING FOR TBUF FOR PRESPACE >>  00576000
    PRETOPOST =%30,        << ADDING A CR/LF IN PRE TO POST SPACING >>  00578000
    PRIMARY   = 1,         << GET ONLY FROM PRIMARY TABLE >>            00580000
    PTYCHK'   = 9,         << PARITY CHECK READS >>                     00582000
    PTYCNTRL' = 7,         << PARITY IS TO BE SENT IN 8TH BIT >>        00584000
    PTYERROR  = 5,         << READ PARITY ERROR >>             <<01.02>>00586000
    QADDR     = 5,         << TARGET BANK OF DST OFFSET >>              00588000
    QDSTN     = 4,         << BANK OR DST NUMBER >>                     00590000
    QFUNC     = 6,         << FUNCTION  >>                              00592000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00594000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00596000
    QPAR1     = 8,         << READ EOF CONTROL; WRITE SPACE CONTROL >>  00598000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00600000
    QP1D      = QPAR1/2,   << DOUBLE INDEX TO QPAR1 AND QPAR2 >>        00602000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00604000
    QWBCT     = 7,         << WORD (+) OR BYTE (-) COUNT >>             00606000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>               00608000
    READTO    = 6,         << READ TIMED OUT READERRORS CODE >>         00610000
    HP2635B   = 16,        << HP2635 7 BIT TTYPE>>             <<00234>>00612000
    READTIMEOUT= 3,        << READ TIME OUT REQUEST TYPE >>             00614000
    READTOSTOP= 4,         << STOP READ AFTER READ TIME OUT >>          00616000
    READWAITING= 5,        << READ WAITING TO START AFTER WRITE DONE >> 00618000
    REQUEST'  = 3,         << MONITOR SERVICE REQUESTED WHILE ACTIVE >> 00620000
    RESET31   = 6,         << REQ STATE WHEN RESETTING 31B >>  <<01469>>00622000
    RTOVERFLOW=%163,       << READ TIME RETURNED TO LARGE ERROR >>      00624000
    SENDXON   =%12,        << READ TO BE ACTUALLY STARTED DSTATE >>     00626000
    SESSION   = 1,         << JOB TYPE IS A SESSION >>                  00628000
    SIOSIZE   = 8,                                             <<01469>>00630000
    SIOSIZED2 =(SIOSIZE+1)/2, <<FIX B.O. FIX FOR ILT'S>>       <<01469>>00632000
    SOFTKILL  =%20,        << SOFT KILL FLAG >>                         00634000
    SOFTPREMPT=3,          << PREMPT READS IF NOTHING INPUT SO FAR >>   00636000
    SPECIALEND=%11,        << TERM READ TERMINATE ON SPECIAL CHAR >>    00638000
    SPDSENSING'= 4,        << DEVICE IS IN DIAGNOSTIC OR SPD SNSE MODE>>00640000
    SPEEDTO   = 6,         << SPEED SENSING TIMEOUT TYPE >>             00642000
    SPOOLING' = 5,         << PTAPE READ IN PROGRESS >>                 00644000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00646000
    SSBRKSTOP = 2,         << SUB SYSTEM BREAK READ STOP CODE >>        00648000
    SSBRKOK'  =SSBREAK'+1, << SUB SYS BRK IS ENABLED >>                 00650000
    STARTREAD =%16,        << TIP TO START READ NEXT >>                 00652000
    SYSBUFR'  =  3,        << REQUEST DATA IS IN SYSTEM BUFFERS >>      00654000
    SYSDISK   = 1,         << SYSTEM DISK LOGICAL DEVICE # >>           00656000
    SYSDB     =%1000,                                                   00658000
    SYSDB1    = SYSDB + 1,                                              00660000
    SYSDST    = 2,                                             <<00.05>>00662000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00664000
    SYSPCB    = 3,                                                      00666000
    SYSSBUF   = 6,                                                      00668000
    TAPEMODE' = 0,         << PAPER TAPE READ MODE;NO EDIT RESPONSES >> 00670000
    TBMAXB    = 30,        << TBUF SIZE IN BYTES >>                     00672000
    TBQN      = 0,         << RESOUCE QUEUE # FOR TBUF REQUESTS >>      00674000
    TBMAXW    = TBMAXB/2,  << TBUF SIZE IN WORDS >>                     00676000
    TBWAIT    =%32,        << REQUEST WAITING FOR TBUF OR TBUF SPACE >> 00678000
    TDITSIZE  = 37,        << TERM DIT SIZE >>                 <<01469>>00680000
    TIMEDOUT  =%23,        << READ TIMED OUT REQUESTERROR STATUS >>     00682000
    TQUEUE    = DLINK,     << RESOUCE NUMBER OF TERMINAL I/O QUEUE >>   00684000
    TRANSMIT  = 4,         << FINSH TURNING 202 TO WRITE STATE >>       00686000
    TURN202    = 4,        << DSTATE, TURNING 202 TO READ OR WRITE >>   00688000
    TURNTO     = 2,        << 202 TURN AROUND TIME OUT TYPE >>          00690000
    UNDEFINED =%37,        << UNDEFINED TERMINAL TYPE >>                00692000
    UP'       = 1,         << ON LINE,SPEED SENSED AND CAN DO I/O >>    00694000
    WAITED    =%11,        << READ/WRITE/BANDWAIT HELD FOR BREAK >>     00696000
    WRITING   = 1,         << DSTATE IS WRITING >>                      00698000
       WRITEWAIT = 7,         <<RQSTATE FOR 2631B WRITES>>     <<01781>>00700000
    WRTCHAN   =-1,         << FLAG TO INDICATE WRITE CHANNEL MPXCNTRL >>00702000
    YCINTRPT  = 2,         << CONTROL Y PSEUDOINTERRUPT FLAG >>         00704000
    XONWRIT   = 3,         << DSTATE XON WRITE >>                       00706000
  ENDEQ       = 0;                                                      00708000
                                                                        00710000
  DEFINE                                                                00712000
    ABS       =ABSOLUTE#,                                               00714000
    ACCEPTING =(AJOBS':2)#,<< ACCEPTING JOBS AND DATA FIELDS IN LPDT >> 00716000
    ACKWAIT   = (11:1)#,                                       <<01468>>00718000
    ACTIVE    =(ACTIVE'  :1)#,                                          00720000
    ASMB      = ASSEMBLE#,                                              00722000
    BINARY    =(11:2)#,    << IF 0 THEN ASCII ELSE BINARY READ >>       00724000
    BLOCKED   =(BLOCKED':1)#,<< BLOCKED, WAIT CALLER UNTIL COMPLETION >>00726000
    BMODE     =(BMODE':1)#,<< TERMINAL IN BREAK MODE >>                 00728000
    BRKOK     =(BRKOK':1)#,                                             00730000
    BWRITE    =( 7:1)#,    << BINARY WRITE, PTY DISABLE >>              00732000
    CB        = ( 5:1)#,   << CLEAR TO SEND, REQST TO SEND DELAYED >>   00734000
    CF        =( 4:1)#,    << CARRIER DETECTED IF SET >>                00736000
    CFAILCNT  =( 4:6)#,    << CARRIER FAILURE COUNTER >>                00738000
    CMODE     =(CMODE':1)#,<< TERMINAL IN CONSOLE MODE >>               00740000
    COMPLETED =(COMPLETED':1)#,   << REQUEST COMPLETED >>               00742000
    CYPIN     =( 8:8)#,    << SUB SYSTEM BREAK PIN IN LDT >>            00744000
    CONSINTRPT=(11:1)#,    << CONSOLE INTERRUPT OK IF SET >>            00746000
    DEVREC    =( 0:2)#,    <<  DEVICE RECOGNITION STATE >>              00748000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     00750000
    DISCNCT   =(DISCNCT' :1)#,                                          00752000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           00754000
    DSTATE    =(DSTATE'  :4)#,                                          00756000
    DPAGEEJECT=DITPL(DMONTR).(3:1)#, << 1 -> AUTO EJECT >>     <<01469>>00758000
    DSTFIELD  =(1:10)#,    << DST NUMBER EXTRACT FROM PCB >>            00760000
    ECHO      =(ECHO':1)#,                                              00762000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     00764000
    ENQACKWAIT=(11:1)#,    << 2640 WRITE ENQ/ACK WAIT >>                00766000
    EOFCODE   =(13:3)#,    << EOF CHECK SPECIFICATION >>                00768000
    ESIZE     =(8:8)#,     << TABLE ENTRY SIZE >>                       00770000
    FILLING   =(10:1)#,    << TERM IS FILLING TBUFS WITH WRITE DATA >>  00772000
    FLUSH     =( 0:1)#,    << FLUSH AFTER BREAK OR CONTROL Y >>         00774000
    FORMFEED  =(FORMFEED':1)#,                                          00776000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   00778000
    HSTATE    =( 4:3)#,    << HANG UP STATE                             00780000
                               0 - HUNGUP       3 - HNGP SPD SNS DISCNCT00782000
                               1 - ONLINE       4 - DCLOSE DISCONNECT   00784000
                               2 - LOGGING ON   5 - LO SPD SNS DISCNCT  00786000
                               6 - HANG UP TURN 7 - HANGING UP >>       00788000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         00790000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           00792000
                               1 - 240 CPS         5 - 15 CPS           00794000
                               2 - 120 CPS         6 - 10 CPS           00796000
                               3 -  60 CPS         7 - 14 CPS  >>       00798000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00800000
    IOWAKE    =(IOWAKE':1)#,                                            00802000
    LOADMEMORY=ASSEMBLE( LSEA )#,                              <<00.05>>00804000
    LOGONTRLX =(8:8)#,     << TIM. REQ. INDEX FOR LOGONTO >>   <<01448>>00806000
    LOGONTYPE =(0:2)#,     <<:DATA=0  :HELLO=1   :JOB=2>>      <<00163>>00808000
    LPLEVEL   =(13:3)#,    << LAST PREMPT LEVEL                         00810000
                                0 - NONE       3 - SOFT PREMPT          00812000
                                1 - NOT USED   4 - HARD PREMPT          00814000
                                2 - CONSOLE                      >>     00816000
    MAINPIN   =( 0:8)#,    << JOB MAIN PIN IN LDT >>                    00818000
    MCODE     =(10:6)#,    << MONITORING FUNCTION CODE >>               00820000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                00822000
                                0 - HARDWIRED   2 - 202C                00824000
                                1 - 103         3 - 2002   >>           00826000
MEASURE = LOGICAL(ABS(%1267))#,                                <<01240>>00828000
    NEWFORM   = DLASTPL.(11:1)#,                               <<01469>>00830000
    NEWLINE   =(NEWLINE' :1)#,                                          00832000
    NO'CX'ECHO=( 1:1)#,    << IF SET DONT ECHO !!! ON CONTROL X >>      00834000
    NOPREMPT  =(11:1)#,    << NO PREMPTS OF THIS STATE ALLOWED >>       00836000
    NOPTY     =(NOPTY':1)#,   <<8-BIT DATA FLAG-->>            <<AMS00>>00838000
                          <<NO PARITY SET IN 8TH BIT>>         <<AMS00>>00840000
    NOSTOP    =(10:1)#,    << NO PREMPTS OR ABORTS ALLOWED >>           00842000
    NOSYNC    =( 7:1)#,    << NO SYNC TERMINAL, USES ENQ AND ACK >>     00844000
    NXTDSTATE =( 9:4)#,    << NEXT DSTATE AFTER 202 TURN AROUND >>      00846000
    OUTSPEED  =( 6:4)#,    << OUTPUT SPEED AND CHARACTER SIZE CODE      00848000
                               SEE INSPEED FOR MEANING >>               00850000
    PAIR      =( 7:1)#,    << INDICATES SPECIAL ACTION ON NEXT CHAR >>  00852000
    PCBS      =LSR(8)#,    << SHIFT TO GET PCB NUMBER FROM IOQ >>       00854000
    PDISABLE  = ASSEMBLE( PSDB )#,     << PSUEDO DISABLE >>             00856000
    PAIRCODE  =(12:4)#,    << DENOTES LAST PAIR CHAR INPUT >>  <<01.02>>00858000
    PENABLE   = ASSEMBLE( PSEB )#,     << PSEUDO ENABLE >>              00860000
    PARITYBITS=(PTYCNTRL':2)#,<< PARITY CONTROL AND SENSE >>            00862000
    PARITYSAVE=( 8:2)#,    << HOLDS PRTY CNTRL DURING BINARY OPS >>     00864000
    PTYCHK    =(PTYCHK'  :1)#,                                          00866000
    PRESPLAST =(PRESPLAST':1)#,                                         00868000
    PREMPT    =(PREMPT' :1)#,                                           00870000
    QPAGEEJECT=IOQPL(QPAR2).(14:1)#, << 0 -> AUTO EJECT >>     <<01469>>00872000
    RBYTE     =(8:8)#,                                                  00874000
    RDCOUNTED =( 8:1)#,    << RDCOUNTER INCREMENTED >>                  00876000
    READSTOP  =( 7:3)#,    << IF NOT ZERO THEN STOP READ BECAUSE        00878000
                                 0 - NONE        4 - LOGON TIMED OUT    00880000
                                 1 - BREAK       5 - ABORTED            00882000
                                 2 - PREMPT      6 - NOT USED           00884000
                                 3 - TIMED OUT   7 - NOT USED  >>       00886000
    REQUEST   =(REQUEST':1)#,<< REQUEST FOR SERVICE WHILE ACTIVE >>     00888000
    RPLEVEL   =(13:3)#,    << REQUEST PREMPT LEVEL,SEE LPLEVEL  >>      00890000
    RSTATE    =(10:6)#,    << REQUEST STATE -                           00892000
                              0 - NEW       %30 - PRE TO POST TBUF WAIT 00894000
                              1 - STARTED   %31 - PRESPACE TBUF WAIT    00896000
                              2 - READING    32 - WRT DATA TBUF WAIT    00898000
                             43 - RD CMPLTD  33 - POSTSPACE TBUF WAIT   00900000
                             44 - RD STOPPED                            00902000
                              5 - READ WAITING                          00904000
                             %34-%37 SAME A %30-%33 BUT ENQ ADD WAIT    00906000
                           >>                                           00908000
    READERRORS=(10:3)#,    << 0-OK,1-SPECIALSTOP,2-PTY ERR,3-LOST DATA, 00910000
                              4-LOST CHAR,5-BRK STOP,6-TIMEDOUT >>      00912000
    SB        =( 6:1)#,    << SECONDARY CARRIER DETECT >>               00914000
    SERVREQ   =( 0:1)#,    << DEVICE RECOGNITION SERVICE REQUEST >>     00916000
    SPDSENSING=(SPDSENSING':1)#,                                        00918000
    SPOOLING  =(SPOOLING':1)#,                                          00920000
    SSBRKOK   =(SSBRKOK':1)#,                                           00922000
    REQSTAT   = DITPL(36).(12:1)#, << 2631 STAT REQ ACTIVE >>  <<01469>>00924000
    STATDONE   = (15:1)#,  << DRQST, STAT REQ COMPLETED >>     <<01469>>00926000
    SYSBUFR   =(SYSBUFR':1)#,                                           00928000
    TAPEMODE  =(TAPEMODE':1)#,                                          00930000
    TIMEREAD  =( 1:1)#,    << TIME READ OPERATIONS >>                   00932000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            00934000
    TERMINALTYPE=( 0:7)#,  << DEFAULT TERMINAL TYPE >>                  00936000
    TERMSPEED =(12:4)#,    << PRECONFIGURED TERMINAL SPEED >>  <<00.06>>00938000
    TESTBIT   = ASSEMBLE(TBC#,                                          00940000
    TMODE     =(11:2)#,    << TERMINAL MODE                             00942000
                                 0 - NORMAL   2 - CONSOLE               00944000
                                 1 - BREAK    3 - CONSOLE FROM BREAK >> 00946000
    UP        =(UP'      :1)#,                                          00948000
    WAITEDSTATE=(0:4)#,    << STATE WAITED FOR BREAK >>                 00950000
    WRTCOUNTED=( 9:1)#,    << WRTCOUNTER INCREMENTED >>                 00952000
    XONWAIT   =(2:1)#,                                         <<01468>>00954000
    ENDDEF    = 0#;                                                     00956000
                                                                        00958000
                                                                        00960000
                                                                        00962000
                                                                        00964000
                                                                        00966000
  <<----------- GENERAL SERVICE VARIABLES -------------->>              00968000
                                                                        00970000
    INTEGER POINTER PS0 = S-0;                                          00972000
    LOGICAL LS0 = S-0,  LX = X;                                         00974000
    INTEGER S0=S-0, S1=S-1, S2=S-2, S3=S-3, S4=S-4, X = X;     <<01469>>00976000
                                                                        00978000
    INTEGER ARRAY WA0(*) = DB + 0;                                      00980000
    BYTE    ARRAY BA0(*) = DB + 0;                                      00982000
    BYTE POINTER  BPS1   = S  - 1;                                      00984000
                                                                        00986000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               00988000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               00990000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               00992000
    INTEGER ARRAY PCB (@) = DB + SYSPCB ;                               00994000
    INTEGER ARRAY DST (@) = DB + SYSDST;                       <<00.05>>00996000
    DOUBLE ARRAY DSTD (@) = DB + SYSDST;                       <<00.05>>00998000
                                                                        01000000
    INTEGER RDCOUNTER  = DB + %64; << # OF TERMINAL READS IN PROGESS >> 01002000
    INTEGER WRTCOUNTER = DB + %65; << # OF TERMNAL WRITES IN PROGRESS >>01004000
                                                                        01006000
    INTEGER DEVRECPCBP = DB + %145;  << DEVICE RECOGNITION PCB INDEX >> 01008000
    INTEGER CONSLDEV   = DB + %74;  << SYSTEM CONSOLE LDEV >>           01010000
$PAGE " EXTERNAL PROCEDURE DECLARATIONS"                                01012000
                                                                        01014000
  << DIT DEFINITION AND DRIVER LINKAGE DATA >>                          01016000
                                                                        01018000
BYTE ARRAY DLT(0:7 ) = DB :=                                            01020000
  TDITSIZE, 2, 0, 0, 0, 0, SIOSIZED2, 0;  << TYPE 2 MONITOR >> <<01300>>01022000
                                                                        01024000
ARRAY DIT(1:TDITSIZE) = DB :=                                           01026000
  %100400,   << SET TERMINAL FLAG AND PAIR >>                           01028000
  0, 0, 0, 0, 0, 0, %20, 0, << BIT SET TO ENABLE CONTROL A >>           01030000
  %014000,   << SET ECHO ON, SPEED SENSE >>                             01032000
  %602,      << MPX CONTROL WORD AND GENERATE PARITY>>                  01034000
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;         <<01469>>01036000
                                                                        01038000
ARRAY SIOA( 1:SIOSIZE) = DB :=                                          01040000
  %11415,%05012,%11415,%06005, << DC3,CR,LF,LF,DC3,FF,ENQ >>   <<01469>>01042000
  %15446,%66060,%00000,%53000; << ESC,&,l,0,NULL,NULL,V >>     <<01469>>01044000
                                                                        01046000
                                                                        01048000
PROCEDURE ABORTJOB(UMAINPIN);                                  <<01470>>01050000
  VALUE UMAINPIN; INTEGER UMAINPIN;                            <<01470>>01052000
  OPTION EXTERNAL;                                             <<01470>>01054000
                                                               <<01470>>01056000
PROCEDURE ADDTAIL(DITP,LINKINDEX,QUEUENUMBER);                          01058000
  VALUE LINKINDEX, QUEUENUMBER;   INTEGER LINKINDEX, QUEUENUMBER;       01060000
  ARRAY DITP;   OPTION EXTERNAL;                                        01062000
                                                                        01064000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADDR,FNCT,CNT,P1,P2,FLAGS);   01066000
  VALUE LDEV,QMISC,DSTX,ADDR,FNCT,CNT,P1,P2,FLAGS;                      01068000
  INTEGER LDEV,QMISC,DSTX,ADDR,FNCT,CNT,P1,P2,FLAGS;                    01070000
  OPTION EXTERNAL;                                                      01072000
                                                                        01074000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       01076000
  VALUE PCBPT, N, WAITF;                                                01078000
  INTEGER PCBPT, N, WAITF;                                              01080000
  OPTION EXTERNAL;                                                      01082000
                                                                        01084000
PROCEDURE BREAKJOB(LDEV, PIN );                                         01086000
  VALUE LDEV, PIN;  INTEGER LDEV, PIN;                                  01088000
  OPTION EXTERNAL;                                                      01090000
                                                                        01092000
PROCEDURE BREAKSS(LDEV, PINS );                                <<DS.06>>01094000
  VALUE LDEV, PINS;  INTEGER LDEV, PINS;                       <<DS.06>>01096000
  OPTION EXTERNAL;                                             <<DS.06>>01098000
                                                               <<DS.06>>01100000
PROCEDURE CHECKTQUEUE(DITP);                                            01102000
  ARRAY DITP;   OPTION EXTERNAL;                                        01104000
                                                                        01106000
PROCEDURE DELAY(TIME);                                                  01108000
  VALUE TIME;  DOUBLE TIME;                                             01110000
  OPTION EXTERNAL;                                                      01112000
                                                                        01114000
PROCEDURE EOFCHECK(IOQP,BUFADDR,COUNT,HARDEOF);                         01116000
  VALUE BUFADDR,COUNT,HARDEOF;  DOUBLE BUFADDR;                         01118000
  ARRAY IOQP;  INTEGER COUNT,HARDEOF;                                   01120000
  OPTION EXTERNAL;                                                      01122000
                                                                        01124000
PROCEDURE DMONITOR(DITP,ID,P1,P2);                                      01126000
  VALUE ID, P1, P2;  INTEGER ID, P1,P2;                                 01128000
  INTEGER ARRAY DITP;  OPTION EXTERNAL;                                 01130000
                                                                        01132000
PROCEDURE DSET1;  OPTION EXTERNAL;                                      01134000
                                                                        01136000
PROCEDURE DSET2;  OPTION EXTERNAL;                                      01138000
PROCEDURE DSETCONTROL( CONTROL, DITP );                                 01140000
  VALUE CONTROL, DITP;  INTEGER CONTROL;                                01142000
  INTEGER POINTER DITP;                                                 01144000
  OPTION EXTERNAL;                                                      01146000
                                                                        01148000
INTEGER PROCEDURE EXCHANGEDB(DSTNUMBER);                                01150000
  VALUE DSTNUMBER;  INTEGER DSTNUMBER;                                  01152000
  OPTION EXTERNAL;                                                      01154000
                                                                        01156000
INTEGER PROCEDURE GETIOQ(TYPE);                                         01158000
  VALUE TYPE;  INTEGER TYPE;                                            01160000
  OPTION EXTERNAL;                                                      01162000
                                                                        01164000
INTEGER PROCEDURE GETTBUF(FLAG);                                        01166000
  VALUE FLAG;  INTEGER FLAG;                                            01168000
  OPTION EXTERNAL;                                                      01170000
                                                                        01172000
INTEGER PROCEDURE GETSBUF(FLAG);                                        01174000
  VALUE FLAG;  INTEGER FLAG;                                            01176000
  OPTION EXTERNAL;                                                      01178000
                                                                        01180000
Logical Procedure Getsir (Sir);                                <<01470>>01182000
Value Sir;                                                     <<01470>>01184000
Integer Sir;                                                   <<01470>>01186000
OPTION EXTERNAL;                                               <<01470>>01188000
                                                               <<01470>>01190000
PROCEDURE HELP;  OPTION EXTERNAL;                                       01192000
                                                                        01194000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<01469>>01196000
  DEST,REPLY,OFFSET,DITP,IOTYPE);                              <<01469>>01198000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<01469>>01200000
  IOTYPE;                                                      <<01469>>01202000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<01469>>01204000
  IOTYPE;                                                      <<01469>>01206000
INTEGER POINTER DITP;                                          <<01469>>01208000
OPTION VARIABLE,EXTERNAL;                                      <<01469>>01210000
                                                               <<01469>>01212000
DOUBLE PROCEDURE IOSTATUS(IOQX);                                        01214000
  VALUE IOQX;  INTEGER IOQX;                                            01216000
  OPTION EXTERNAL;                                                      01218000
                                                                        01220000
PROCEDURE INITCHANNEL(DITP);                                            01222000
  INTEGER ARRAY DITP;  OPTION EXTERNAL;                                 01224000
                                                                        01226000
PROCEDURE LOGERROR(DITP,IOQP,DEVSTAT);                         <<00.05>>01228000
  VALUE DEVSTAT;  ARRAY DITP,IOQP;                             <<00.05>>01230000
  INTEGER DEVSTAT;    OPTION EXTERNAL;                         <<00.05>>01232000
                                                               <<00.05>>01234000
PROCEDURE MMSTAT(EVENTNUM,P1,P2,P3);                           <<01240>>01236000
VALUE EVENTNUM,P1,P2,P3;                                       <<01240>>01238000
INTEGER EVENTNUM,P1,P2,P3;                                     <<01240>>01240000
OPTION EXTERNAL;                                               <<01240>>01242000
                                                               <<01240>>01244000
PROCEDURE MPXWRITE(CHAR,DITP);                                          01246000
  VALUE DITP, CHAR;  INTEGER CHAR;                                      01248000
  INTEGER POINTER DITP;                                                 01250000
  OPTION EXTERNAL;                                                      01252000
                                                                        01254000
PROCEDURE MPXCONTROL( DATA, DITP );                                     01256000
  VALUE DITP, DATA;  INTEGER DATA;                                      01258000
  INTEGER POINTER DITP;                                                 01260000
  OPTION EXTERNAL;                                                      01262000
                                                                        01264000
Procedure Relsir (Sir,Sirstat);                                <<01470>>01266000
Value Sir,Sirstat;                                             <<01470>>01268000
Integer Sir;                                                   <<01470>>01270000
Logical Sirstat;                                               <<01470>>01272000
OPTION EXTERNAL;                                               <<01470>>01274000
                                                               <<01470>>01276000
PROCEDURE RESETDB(OLDDB);                                               01278000
  VALUE OLDDB;  INTEGER OLDDB;                                          01280000
  OPTION EXTERNAL;                                                      01282000
                                                                        01284000
PROCEDURE RETURNSYSBUF(INDEX);                                          01286000
  VALUE INDEX;  INTEGER INDEX;                                          01288000
  OPTION EXTERNAL;                                                      01290000
                                                                        01292000
PROCEDURE RETURNTBUF(TBUFP);                                            01294000
  VALUE TBUFP;  INTEGER TBUFP;                                          01296000
  OPTION EXTERNAL;                                                      01298000
                                                                        01300000
PROCEDURE RETURNIOQ(IOQP);                                              01302000
  VALUE IOQP;  INTEGER IOQP;                                            01304000
  OPTION EXTERNAL;                                                      01306000
                                                                        01308000
PROCEDURE SENDSYNC(NEWDSTATE,DITP);                                     01310000
  VALUE NEWDSTATE;  INTEGER NEWDSTATE;                                  01312000
  ARRAY DITP;   OPTION EXTERNAL;                                        01314000
                                                                        01316000
PROCEDURE SET'PSIF(PCBPT,FLAG);                                         01318000
  VALUE PCBPT, FLAG;  INTEGER PCBPT, FLAG;                              01320000
  OPTION EXTERNAL;                                                      01322000
                                                                        01324000
PROCEDURE SETREADERROR(IOQP,ENUMB);                                     01326000
  VALUE ENUMB;  INTEGER ENUMB;                                          01328000
  ARRAY IOQP;   OPTION EXTERNAL;                                        01330000
                                                                        01332000
INTEGER PROCEDURE SETSYSDB;  OPTION EXTERNAL;                           01334000
                                                                        01336000
PROCEDURE SETTERMTYPE(TYPE,ISPD,OSPD,DITP);                             01338000
  VALUE    TYPE, ISPD,OSPD;                                             01340000
  INTEGER  TYPE, ISPD,OSPD;                                             01342000
  ARRAY DITP;   OPTION EXTERNAL;                                        01344000
                                                                        01346000
PROCEDURE STARTTIMEOUT(TYPE,DITP);                                      01348000
  VALUE TYPE;   INTEGER TYPE;                                           01350000
  ARRAY DITP;   OPTION EXTERNAL;                                        01352000
                                                                        01354000
PROCEDURE STOPTIMEOUT(TYPE,DITP);                                       01356000
  VALUE TYPE;    INTEGER TYPE;                                          01358000
  ARRAY DITP;    OPTION EXTERNAL;                                       01360000
                                                               <<01.02>>01362000
PROCEDURE SUDDENDEATH(N);                                      <<01.02>>01364000
  VALUE N;  INTEGER N;                                         <<01.02>>01366000
  OPTION EXTERNAL;                                             <<01.02>>01368000
                                                                        01370000
PROCEDURE TERMINIT(DITP);                                               01372000
  INTEGER ARRAY DITP;                                                   01374000
  OPTION EXTERNAL;                                                      01376000
                                                               <<01240>>01378000
DOUBLE PROCEDURE TIMER; OPTION EXTERNAL;                       <<01240>>01380000
                                                                        01382000
PROCEDURE TIP;   OPTION EXTERNAL;                                       01384000
$PAGE                                                          <<00.05>>01386000
                                                               <<00.05>>01388000
DOUBLE PROCEDURE DATA'ADR(IOQP);                               <<00.05>>01390000
  INTEGER ARRAY IOQP;                                          <<00.05>>01392000
  <<                                                                    01394000
    THIS PROCEDURE MAKES THE DATA SEGMENT REFERENCED IN THE IOQ         01396000
    PRESENT AND RETURNS THE DST NUMBER AND OFFSET TO THE TARGET         01398000
    IT MUST BE CALLED WITH ONE LEVEL OF PSEUDO DISABLE IN EFFECT        01400000
    IF THE DST IN NOT CORE RESIDENT.                                    01402000
  >>                                                                    01404000
  BEGIN                                                        <<00.05>>01406000
    INTEGER DSTN, OFFSET := 0;                                 <<00.05>>01408000
                                                               <<00.05>>01410000
    X := IOQP(QDSTN)&LSL(2);  << DST # TIMES 4 >>              <<00.05>>01412000
    DSTN := X&LSR(2);   << STRIP OFF DB RELATIVE BIT >>        <<00.05>>01414000
                                                               <<00.05>>01416000
    WHILE DST(X)<0 DO  << ABSENT, SO MAKE PRESENT >>           <<00.05>>01418000
      BEGIN  << DUMY MOVE TO MAKE PRESENT >>                   <<00.05>>01420000
        PENABLE;                                               <<00.05>>01422000
        TOS := DSTN;                                           <<00.05>>01424000
        ASMB(ZERO,DDUP);                                       <<00.05>>01426000
        TOS := 1;    ASMB( MDS );                              <<00.05>>01428000
        PDISABLE;                                              <<00.05>>01430000
      END;                                                     <<00.05>>01432000
                                                               <<00.05>>01434000
    IF IOQP(QDSTN)<0 THEN  << STACK, ADD DB OFFSET TO ADDR >>  <<00.05>>01436000
      BEGIN                                                    <<00.05>>01438000
        TOS := DSTD(DSTN*2+1);    << BANK AND OFFSET >>        <<00.05>>01440000
        TOS := TOS + 1;   << ADDR OF DB OFFSET >>              <<00.05>>01442000
        LOADMEMORY;       << DB TO DL OFFSET   >>              <<00.05>>01444000
        OFFSET := TOS;                                         <<00.05>>01446000
      END;                                                     <<00.05>>01448000
                                                               <<00.05>>01450000
    TOS := DSTN;                                               <<00.05>>01452000
    TOS := IOQP(QADDR) + OFFSET;                               <<00.05>>01454000
    DATA'ADR := TOS;                                           <<00.05>>01456000
  END;   << DATA  ADR >>                                       <<00.05>>01458000
$PAGE " ASYNCHRONOUS TERMINAL MONITOR - TERM"                           01460000
                                                                        01462000
PROCEDURE TERMIOM(DITP,FLAGS);                                          01464000
  VALUE   FLAGS;  INTEGER FLAGS;                                        01466000
  INTEGER ARRAY DITP;                                                   01468000
  OPTION UNCALLABLE, PRIVILEGED;                                        01470000
  <<                                                                    01472000
    TERMINAL MONITOR.  THIS PROCEDURE HANDLES INITIATION, COMPLETION    01474000
    AND OTHER FUNCTIONS ASSOCIATED WITH I/O TO TERMINALS CONNECTED      01476000
    TO THE ASYNCHRONOUS TERMINAL MULTIPLEXER                            01478000
  >>                                                                    01480000
  BEGIN                                                                 01482000
                                                                        01484000
    INTEGER ARRAY  Q0(  *  ) = Q + 0;                                   01486000
    INTEGER ARRAY  Q1( 0:30) = Q;  << TEMP WRITE DATA BUFFER >>         01488000
    BYTE    ARRAY BQ1(  *  ) = Q1;                                      01490000
                                                                        01492000
    INTEGER                                                             01496000
      BCNT,             << BYTE COUNT OF DATA TO BE TRANSFERED >>       01498000
      WCNT,             << WORD TRANSFER COUNT FOR READS >>             01500000
      SCNT,             << SPACE COUNT OR END OF SBUF COUNT >>          01502000
      TEMP,             << TEMP AND I ARE USED A PAIR IN SPOOLING >>    01504000
      I,                << GENERAL INDEX VARIABLE >>                    01506000
      IFLAG,            << FOR SETTING FLAG >>                          01508000
      RQSTATE,          << CURRENT REQUEST STATE >>                     01510000
      FUNCTION,         << FUNCTION CODE FOR CURRENT REQUEST >>         01512000
      TADDR,            << OFFSET IN DST OF TARGET BUFFER >>            01514000
      STACKDST,         << DST NUMBER OF CURRENT STACK >>               01516000
      TBASE;            << TBUF PNTR OR OFFSET TO ARRAY Q1 >>           01518000
                                                                        01520000
    DOUBLE                                                              01522000
      Q1ADDR  = STACKDST, << DSTN AND OFFSET OF ARRAY Q1 >>             01524000
      SIOADDR = TBASE +1; << DSTN & OFFSET OF CARRIAGE CONTROL CHARS >> 01526000
                                                                        01528000
    INTEGER                                                             01530000
    ABSSIOADDR = SIOADDR + 1,                                  <<01469>>01532000
      LDEV    = SIOADDR + 2,                                            01534000
      TCNT    = IFLAG,     << WORDS REMAINING TO FILL TBUF >>           01536000
      NPL     = I;         << NEW PREMPT LEVEL >>                       01538000
                                                                        01540000
    LOGICAL                                                             01542000
      FLAG   = IFLAG,                                                   01544000
      LFLAGS = FLAGS;                                                   01546000
                                                                        01548000
    INTEGER POINTER                                                     01550000
      THISP  = BCNT,    << POINTER TO IOQ TO BE EXAMINED >>             01552000
      LASTP  = BCNT+1,  << POINTER TO PREVIOUS IOQ >>                   01554000
      STHISP = SCNT,  << POINTER TO IOQ WITH HIGHEST PREMPT LEVEL >>    01556000
      SLASTP = SCNT+1;<< POINTER TO IOQ PRECEDING MOST PREMPTIVE >>     01558000
$PAGE                                                                   01560000
                                                                        01562000
    INTEGER ARRAY                                                       01564000
      IOQP(@)    = LDEV + 1,                                            01566000
      QMISCP(@)  = IOQP + 1,                                            01568000
      QWBCTP(@)  = QMISCP + 1,                                          01570000
      QPAR1P(@)  = QWBCTP + 1,                                          01572000
      DRQSTP(@)  = QPAR1P + 1,                                          01574000
      DTYPEP(@)  = DRQSTP + 1,                                          01576000
      DMODEMP(@) = DTYPEP + 1,                                          01578000
      DSPEEDP(@) = DMODEMP + 1,                                         01580000
      DCNTRLP(@) = DSPEEDP + 1,                                         01582000
      DRBCTP(@)  = DCNTRLP + 1,                                         01584000
      DBCNTP(@)  = DRBCTP  + 1,                                         01586000
      DXCNTP(@)  = DBCNTP  + 1,                                         01588000
      DLASTP(@)  = DXCNTP  + 1;                                         01590000
                                                                        01592000
    LOGICAL POINTER                                                     01594000
      DMODEMPL = DMODEMP,                                               01596000
      DSPEEDPL = DSPEEDP,                                               01598000
      DTYPEPL  = DTYPEP,                                                01600000
      DITPL    = DITP,                                                  01602000
      DLASTPL  = DLASTP,                                                01604000
      QMISCPL  = QMISCP,                                                01606000
      IOQPL    = IOQP;                                                  01608000
                                                                        01610000
    DOUBLE POINTER                                                      01612000
      DITPD   = DITP,                                                   01614000
      IOQPD   = IOQP;                                                   01616000
                                                                        01618000
    DOUBLE                                                              01620000
      DS6     = S - 6,  << TO REFERENCE BUFADR IN MOVEDATA >>           01622000
      TEMPD   = TEMP,                                                   01624000
      RQSFUNC = RQSTATE,<< FOR SETTING RQSTATE AND FUNCTION >>          01626000
      QPQM    = IOQP,   << FOR SETTING IOQP AND QMISCP >>               01628000
      QCQP1   = QWBCTP, << FOR SETTING QWBCTP AND QPAR1P >>             01630000
      THESEPS = THISP,  << FOR SAVING POINTERS >>                       01632000
      SAVEPS  = STHISP;                                                 01634000
                                                                        01636000
    INTEGER ARRAY READSTATUS(0:7) = PB :=                      <<02004>>01638000
      GOODIO,SPECIALEND,BREAKEND,LOSTDSTAT,LOSTCSTAT,          <<02004>>01640000
      BADPARITY,TIMEDOUT,BLOCKTIMED;                           <<02004>>01642000
                                                                        01644000
                                                                        01646000
    INTEGER ARRAY SPEED(0:MAXSPEED) = PB :=                             01648000
      240,240,120, 60, 30, 15, 10, 14;                                  01650000
  BYTE ARRAY B'RESET31B(0:67) = PB :=                          <<01469>>01652000
   ESC,"&dA",  ESC,"&k1E",  ESC,")A",  ESC,"(@",  ESC,"&k0I",  <<01469>>01654000
   %17,  ESC,"&klF",  ESC,"&s1I",  ESC,"&k0S",  ESC,"&l6D",    <<01469>>01656000
   ESC,"&l1L",  ESC,"&l3M",  ESC,"&l0N",                       <<01469>>01658000
   ESC,"3",  ESC,"&s0C",  ESC,"Z",  CR,  FF, 0;                <<01469>>01660000
  ARRAY RESET31B(*) = B'RESET31B;                              <<01469>>01662000
$PAGE                                                                   01664000
                                                                        01666000
SUBROUTINE RETURNBUFS;                                                  01668000
  <<                                                                    01670000
     THIS SUBROUTINE RETURNS ANY TBUFS OUTSTANDING AS INDICATED         01672000
     BY NON ZERO TBUF POINTERS IN THE DIT. IF SPOOLING SET THEN         01674000
     THE POINTER AREA IS JUST CLEARED.                                  01676000
  >>                                                                    01678000
  BEGIN                                                                 01680000
    CHECKTQUEUE(DITP);   << START ANY WAITING OPERATIONS >>             01682000
                                                                        01684000
    DISABLE;                                                            01686000
    TEMP := DITP(DNXTB);   DITP(X) := 0;                                01688000
    IF <> THEN  BEGIN  TOS := TEMP;   RETURNTBUF( * );  END;            01690000
                                                                        01692000
    TOS := DBCNTP;    << SAVE RETURN BUFS TEST >>                       01694000
    DITP(DCNT) := DBCNTP := 0;                                          01696000
                                                               <<01.02>>01698000
    TOS := DITP;                                               <<01.02>>01700000
    TOS.ENQACKWAIT := 0;  << IN CASE SET FROM BINARY READ >>   <<01.02>>01702000
    TOS.SPOOLING := 0;                                         <<01.02>>01704000
    DITP := TOS;                                               <<01.02>>01706000
    ENABLE;                                                             01708000
                                                                        01710000
    IF <> THEN ASMB( DEL,ZERO);  << SPOOLING,NO TBUFS TO RETURN >>      01712000
                                                                        01714000
    IF TOS<>0 THEN X := DITP(DHEAD);  << DBCNT#0, TBUFS TO RETURN >>    01716000
    WHILE <> DO  << RETURN TBUFS >>                                     01718000
      BEGIN                                                             01720000
        TOS := X;   << GET POINTER FOR RETURNING >>                     01722000
        X := WA0(X);      << GET LINK TO NEXT >>                        01724000
        RETURNTBUF( * );                                                01726000
      END;                                                              01728000
    DITP(DHEAD) := 0;<<SO WE DON'T TRY TO RETURN THEM AGAIN>>  <<02085>>01730000
  END;  << RETURN BUFS >>                                               01732000
                                                                        01734000
                                                                        01736000
                                                                        01738000
                                                                        01740000
                                                                        01742000
SUBROUTINE CLEANUP;                                                     01744000
  <<                                                                    01746000
    THIS ROUTIME CLEANS UP TAPEMODE, NO CONTROL X ECHO, TIMEOUTS,       01748000
    SPECIAL EOR AND SUB SYSTEM BREAK AND PARITY CHECK FLAGS.            01750000
  >>                                                                    01752000
  BEGIN                                                                 01754000
    DSPEEDP.TAPEMODE := 0;                                              01756000
    DITP(DLDEV).NO'CX'ECHO := 0;                                        01758000
    DITP(DRTMAX) := 0;   << DISABLE READ TIMEOUTS >>                    01760000
    DITP(DSTOP) := 0;   << DISABLE SPECIAL SUB SYS BRK & EOR  >>        01762000
                                                                        01764000
    DISABLE;                                                            01766000
  IF DITP(DLDEV).NOPTY <> 0 THEN <<CHECKS 8-BIT DATA FLAG>>    <<AMS00>>01768000
    BEGIN                                                      <<AMS00>>01770000
    DITP.PTYCHK :=1;  << SETS 8-BIT DATA PTYCHK>>              <<AMS00>>01772000
    DCNTRLP.PARITYBITS :=0;  <<DISABLE PARITY GEN>>            <<AMS00>>01774000
    END                                                        <<AMS00>>01776000
    ELSE                                                       <<+1.M3>>01778000
    DITP.PTYCHK := 0;                                                   01780000
    DTYPEP.TIMEREAD := 0;                                               01782000
                                                                        01784000
    TOS := LPDTD(LDEV);                                                 01786000
    TOS.(SSBREAK':1) := 0;                                              01788000
    LPDTD( X ) := TOS;                                                  01790000
                                                               <<00.05>>01792000
    TOS := DITP(DBREAK);                                       <<00.05>>01794000
    IF <> THEN  << RETURN BREAK SAVE IOQ AND TBUFS >>          <<00.05>>01796000
      BEGIN                                                    <<00.05>>01798000
        DITP(DBREAK) := 0;   << CLEAR BREAK SAVE >>            <<00.05>>01800000
        X := PS0( 7 );    << GET HEAD POINTER >>               <<00.05>>01802000
        WHILE <> DO   << RETURN ANY SAVED TBUFS >>             <<00.05>>01804000
          BEGIN                                                <<00.05>>01806000
            TOS := X;   << GET POINTER FOR RETURNTBUF >>       <<00.05>>01808000
            X := WA0(X);     << GET LINK TO NEXT TBUF >>       <<00.05>>01810000
            RETURNTBUF( * );                                   <<00.05>>01812000
          END;                                                 <<00.05>>01814000
        RETURNIOQ( S0 );                                       <<00.05>>01816000
      END;                                                     <<00.05>>01818000
                                                                        01820000
    DEL;  << DELETE DBREAK WORD >>                             <<00.05>>01822000
    RETURNBUFS;                                                <<00.05>>01824000
  END;    << CLEAN UP >>                                       <<00.05>>01826000
                                                                        01828000
                                                                        01830000
                                                                        01832000
                                                                        01834000
SUBROUTINE STARTWRITE;                                                  01836000
  <<                                                                    01838000
      THIS SUBROUTINE STARTS NEW WRITE REQUESTS                         01840000
  >>                                                                    01842000
  BEGIN                                                                 01844000
    X := DBCNTP; << CHECK PENDING WRITE COUNT >>                        01846000
    IF <> AND DITP.DSTATE=NULL THEN                                     01848000
      BEGIN   << NULL AND NON ZERO BYTE COUNT >>                        01850000
        DISABLE;                                                        01852000
        SENDSYNC(WRITING,DITP);                                         01856000
      END;                                                              01858000
  END;    << START WRITE >>                                             01860000
$PAGE                                                                   01862000
                                                                        01864000
SUBROUTINE STOPREAD(STOPTYPE);                                          01866000
  VALUE STOPTYPE;  INTEGER STOPTYPE;                                    01868000
  <<                                                                    01870000
    THIS ROUTINE STOPS READ OPERATIONS. THE STOPTYPE IS SET IN READSTOP 01872000
    SO THAT WHEN THEN READ STOP IS COMPLETED, THE TYPE OF STOP AND NEXT 01874000
    ACTION REQUIRED CAN BE IDENTIFIED. MUST BE CALLED DISABLED.         01876000
  >>                                                                    01878000
    BEGIN                                                               01880000
      X := @IOQP;                                                       01882000
      IF <> AND QMISCP.RSTATE=READING AND QMISCP.READSTOP<STOPTYPE THEN 01884000
        BEGIN                                                           01886000
          TOS := QMISCP;                                                01888000
          TOS.READSTOP := S2;    << STOP TYPE >>                        01890000
          TOS.NOSTOP := 1;  << SUPPRESS ABORTS AND PREMPTS >>           01892000
          QMISCP := TOS;                                                01894000
                                                                        01896000
          IF DITP.DSTATE=READING AND NOT DMODEMPL.RDCOUNTED THEN        01898000
            BEGIN    << STOP NON BLOCK MODE READS >>                    01900000
              MPXCONTROL(ECHOOFF,DITP);                                 01902000
              DCNTRLP.NXTDSTATE :=     << DSTATE AFTER FINREAD >>       01904000
                IF DITPL.NEWLINE OR STOPTYPE=SSBRKSTOP OR      <<00.05>>01906000
                  STOPTYPE=READTOSTOP THEN EORLF ELSE EORSYNC; <<00.05>>01908000
              SENDSYNC(FINREAD,DITP); << STOP READ, CLEAN UP CARRIAGE >>01910000
            END;                                                        01912000
        END;                                                            01914000
      END;  << STOP READ >>                                             01916000
                                                                        01918000
                                                                        01920000
LOGICAL SUBROUTINE READABORTED;                                         01922000
  <<                                                                    01924000
    THIS ROUTINE CHECKS IF A READ IS AND CAN BE ABORTED. IF A READ      01926000
    IS ABORTED THEN A TRUE INDICATION IS RETURNED. CALL DISABLED ONLY.  01928000
  >>                                                                    01930000
  BEGIN                                                                 01932000
    X := @IOQP;                                                         01934000
    IF <> THEN   << A REQUEST IS OUTSTANDING >>                         01936000
      BEGIN                                                             01938000
        X := IOQP;  << TEST IF ABORTED >>                               01940000
        IF < AND RQSTATE=READING THEN   << READING AND ABORTED >>       01942000
          BEGIN                                                         01944000
            STOPREAD(ABORTSTOP);                                        01946000
            DCNTRLP.NXTDSTATE := EORLF;                                 01948000
            SENDSYNC(FINREAD,DITP);                                     01950000
            READABORTED := TRUE;                                        01952000
          END;                                                          01954000
      END;                                                              01956000
  END;    << READ ABORTED >>                                            01958000
$PAGE                                                                   01960000
                                                                        01962000
SUBROUTINE STOPOPERATION(STOPTYPE);                                     01964000
  VALUE STOPTYPE;   INTEGER STOPTYPE;                                   01966000
  <<                                                                    01968000
    THIS ROUTINE STOPS THE CURRENT READ OR WRITE OPERATION AND IN       01970000
    THE CASE OF READ SETS THE STOPTYPE IN READSTOP FOR IDENTIFICATION   01972000
    OF THE STOP TYPE WHEN THE READ STOP CLEAN UP HAS BEEN COMPLETED.    01974000
  >>                                                                    01976000
    IF DITP.DSTATE=WAITED THEN  << FINISH STOPPING OPERATION >>         01978000
      BEGIN                                                             01980000
        TEMP := DITP(DSAVE).WAITEDSTATE;                                01982000
        IF TEMP=BANDWAIT THEN TEMP := DCNTRLP.NXTDSTATE;                01984000
                                                                        01986000
        DISABLE;                                                        01988000
        DITP.DSTATE := TEMP;   << RESTORE DSTATE >>                     01990000
        MPXCONTROL(ECHOOFF,DITP);  << ENABLE CHANNEL INTERRUPTS >>      01992000
                                                                        01994000
        IF QMISCP.RSTATE=READWAITING THEN QMISCP := 0; << RESTART >>    01996000
        STOPREAD(STOPTYPE);    << STOP READ IF READING >>               01998000
        STOPTIMEOUT(HP2640TO,DITP);                                     02000000
                                                                        02002000
        IF TEMP=WRITING THEN                                            02004000
          BEGIN                                                         02006000
            DITP.ENQACKWAIT := 0;                                       02008000
            RETURNBUFS;                                                 02010000
            MPXWRITE(NULL,DITP);   << CONTINUE WRITE IF NECESSARY >>    02012000
          END;                                                          02014000
                                                                        02016000
        DITP(DMONTR).XONWAIT:=0;                               <<01468>>02018000
                                                               <<01468>>02020000
        ENABLE;                                                         02022000
      END;    << STOP OPERATION >>                                      02024000
$PAGE                                                                   02026000
                                                                        02028000
SUBROUTINE RESTARTOPERATION;                                            02030000
  <<                                                                    02032000
    THIS ROUTINE RESTARTS READ AND WRITES STOPPED FOR BREAK AND         02034000
    SUB SYSTEM BREAK CHECKS.                                            02036000
  >>                                                                    02038000
    IF DITP.DSTATE=WAITED THEN   << RESTART OPERATION >>                02040000
      BEGIN                                                             02042000
        TEMP := DITP(DSAVE).WAITEDSTATE;                                02044000
        DISABLE;                                                        02046000
        SENDSYNC(NULL,DITP);  << JUST SET DSTATE NULL >>                02048000
        MPXCONTROL(ECHOOFF,DITP);   << ENABLE CHANNEL INTERRUPTS >>     02050000
                                                                        02052000
        IF TEMP=WRITING THEN SENDSYNC(WRITING,DITP)  << RESTART WRITE >>02054000
        ELSE IF TEMP=READING THEN SENDSYNC(XONWRIT,DITP) << RESTART >>  02056000
        ELSE IF TEMP=BANDWAIT THEN   << RESTART WAITED OPERATION >>     02058000
          IF DCNTRLP.NXTDSTATE=WRITING THEN STARTWRITE                  02060000
            ELSE SENDSYNC(SENDXON,DITP);                                02062000
                                                                        02064000
        ENABLE;                                                         02066000
      END;    << RESTART OPERATION >>                                   02068000
                                                               <<00.05>>02070000
                                                               <<00.05>>02072000
                                                               <<00.05>>02074000
SUBROUTINE WRTSPOOLBUF(SBUFP);                                 <<00.05>>02076000
  VALUE SBUFP;   INTEGER SBUFP;                                <<00.05>>02078000
  <<                                                                    02080000
    THIS SUBROUTINE WRITES OUT THE 128 WORDS OF THE SBUF POINTER        02082000
    BY SBUFP TO THE DISC ADDRESS HELD IN DITPD(DTBF2). IT WAITS         02084000
    UNTIL THE I/O IS COMPLETED AND SETS LOST DATA STATUS IF AN          02086000
    ERROR OCCURS.                                                       02088000
  >>                                                                    02090000
  BEGIN                                                        <<00.05>>02092000
    TOS := ATTACHIO(SYSDISK,0,8,SBUFP-@SBUF,WRITING,128,       <<00.05>>02094000
                    DITP(DTAIL),DITP(DPNTR),%11);              <<00.05>>02096000
    DEL;                                                       <<00.05>>02098000
    IF TOS.(13:3)<>GOODIO THEN SETREADERROR(IOQP,LOSTDATA);    <<00.05>>02100000
    DITPD(DTBF2) := DITPD(DTBF2) + 1 D; << BUMP DISC ADDR >>   <<00.05>>02102000
  END;   << WRT SPOOL BUF >>                                   <<00.05>>02104000
$PAGE                                                                   02106000
                                                                        02108000
SUBROUTINE MOVEDATA(BUFADR,COUNT,OFFSET);                               02110000
  VALUE BUFADR, COUNT, OFFSET;   INTEGER COUNT, OFFSET;   DOUBLE BUFADR;02112000
  <<                                                                    02114000
    THIS SUBROUTINE MOVES DATA INTO THE TERMINAL BUFFERS. IT CHECKS     02116000
    FOR ADDING AN ENQ AFTER 80 CHARACTERS ON THE HP2640.                02118000
                                                                        02120000
    RETURN CC - CCE = DATA TRANSFER COMPLETED                           02122000
                CCG = TOO MUCH DATA TO TANK NOW OR NO TBUF AVAILABLE    02124000
                                                                        02126000
     BUFADR - DST NUMBER AND OFFSET OF DATA TO BE WRITTEN               02128000
     COUNT  - NUMBER OF BYTES TO BE TANKED.                             02130000
     OFFSET - OFFSET IN BYTES FROM BUFADR TO START FROM                 02132000
  >>                                                                    02134000
  BEGIN                                                                 02136000
    X := DITP(DLDEV);   << TEST BREAK FLUSH IN BIT 0 >>                 02138000
    IF < OR QMISCPL.FLUSH THEN IF IOQP.RPLEVEL=NULL THEN                02140000
      BEGIN  << BREAK OR CONTROL Y FLUSH, DONT MOVE DATA >>             02142000
        DXCNTP := DXCNTP + COUNT;                                       02144000
        ASMB(DZRO, CMP);  RETURN;  << RETURN WITH CC = CCE >>           02146000
      END;                                                              02148000
                                                                        02150000
STARTM:                                                                 02152000
    I := COUNT;   IF = THEN RETURN;   << NO DATA TO TRANSFER >>         02154000
                                                                        02156000
    IF IOQPL.SYSBUFR THEN                                               02158000
      BEGIN  << FORM ADDR TO GET DATA AND CHECK COUNT >>                02160000
        TEMP := OFFSET&LSR(8);  << SBUF NUMBER IN LINKED LIST >>        02162000
        TOS := BUFADR;                                                  02164000
MV1:                                                                    02166000
        TEMP := TEMP - 1;                                               02168000
        IF >= THEN  << FIND SYSBUF IN LINKED LIST >>                    02170000
          BEGIN  X := TOS-1;  TOS := SBUF(X);  GOTO MV1; END;           02172000
                                                                        02174000
        X := TOS;   DEL;   << SAVE BASE OF SYSBUF IN X >>               02176000
        TADDR := X + OFFSET.(8:7) - INTEGER(BUFADR);                    02178000
        X := 256 - OFFSET.(8:8);                                        02180000
        IF X<I THEN I := X;   << REMAINING IN SYSBUF IS CONSTRAINT >>   02182000
      END                                                               02184000
    ELSE TADDR := OFFSET&LSR(1);   << OFFSET IN DST IN WORDS >>         02186000
                                                                        02188000
    X := 270 - DBCNTP;                                                  02190000
    IF = THEN  BEGIN  X := COUNT;  RETURN;  END; << NO ROOM LEFT >>     02192000
    IF X<I THEN   << LIMIT ON MAX TANKED IS CONSTRAINT >>               02194000
      IF 270>COUNT THEN RETURN   << DONT BREAK UP THIS BLOCK >>         02196000
        ELSE I := X;    << MAX TANK IS CONSTRAINT >>                    02198000
                                                                        02200000
    IF DMODEMPL.NOSYNC THEN    << CHECK FOR 80 CHARS TO 2640 >>         02202000
      BEGIN  X := DITP(DSYNC);    IF X<I THEN I := X;  END;             02204000
                                                                        02206000
    X := I;                                                             02208000
    IF <> THEN   << SOMETHING TO MOVE >>                                02210000
      BEGIN                                                             02212000
        DISABLE;                                                        02214000
                                                                        02216000
        TOS := DBCNTP MOD TBMAXB;   TOS := -S0;                         02218000
        IF = THEN    << NEW TBUF NEEDED >>                              02220000
          BEGIN                                                         02222000
            TOS := DITP(DNXTB);  TOS := S0;   DITP(X) := 0;             02224000
            IF = THEN  << NO TBUF SAVED FOR THIS DEVICE >>              02226000
              BEGIN                                                     02228000
                DDEL;                                                   02230000
                TOS := GETTBUF(PRIMARY);     TOS := S0;                 02232000
                IF = THEN   << NO TBUF AVAILABLE >>                     02234000
                  BEGIN                                                 02236000
                    ENABLE;                                             02238000
                    DDEL;  DDEL;     << CLEAN UP STACK >>               02240000
                    ADDTAIL(DITP, DTBLK, TBQN); << QUEUE TBUF REQUEST >>02242000
                    RETURN;   << WITH CC = CCG >>                       02244000
                  END;                                                  02246000
              END;                                                      02248000
                                                                        02250000
            X := DBCNTP;  << TEST BYTE COUNT SO FAR >>                  02252000
            IF = THEN  << ADDING 1ST TBUF >>                            02254000
              BEGIN                                                     02256000
                DITP(DPNTR) := S0&LSL(1) + 1;                           02258000
                DITP(DHEAD) := TOS;                                     02260000
              END                                                       02262000
            ELSE  WA0(DITP(DTAIL)) := TOS;   << LINK TO END >>          02264000
            DITP(DTAIL) := TOS;     << SET NEW END POINTER >>           02266000
          END;                                                          02268000
                                                                        02270000
        DSPEEDP.FILLING := 1;                                           02272000
        ENABLE;                                                         02274000
                                                                        02276000
        X := TOS + TBMAXB;   IF X<I THEN TEMP := I := X;                02278000
        TEMP := TOS + DITP(DTAIL)&LSL(1) + 2;                           02280000
                                                                        02282000
        IF LOGICAL(OFFSET) OR LOGICAL(TEMP) THEN                        02284000
          BEGIN   << MOVE FROM OR TO ODD BYTE BOUNDRY REQUIRED >>       02286000
            TOS := BUFADR;  DEL;   << LEAVE SOURCE DST # ON TOS >>      02288000
            IF TOS<>FLAGS&LSR(6) THEN  << DATA NOT ON THIS STACK >>     02290000
              BEGIN   << MOVE DATA TO THE LOCAL BUFFER >>               02292000
                TOS := Q1ADDR;                                          02294000
                TOS := DS6;   << GET BUFADR >>                          02296000
                TOS := TOS + TADDR;                                     02298000
                TOS := (I+2)&LSR(1);   ASMB( MDS );                     02300000
                TADDR := 0;  << NO OFFSET FROM TBASE >>                 02302000
              END                                                       02304000
            ELSE                                                        02306000
              TADDR := INTEGER(BUFADR) + TADDR - TBASE;                 02308000
                                                                        02310000
            X := OFFSET.(15:1);                                         02312000
            PDISABLE;   PUSH( Q );                                      02314000
                                                                        02316000
            TOS := TEMP;  << BYTE POINTER TO ENTER IN TBUF >>           02318000
            TOS := I;     << BYTE COUNT TO MOVE >>                      02320000
            TOS := S2 + TADDR;     << BASE OF SOURCE BUFFER >>          02322000
            SET( Q );                                                   02324000
                                                                        02326000
MV2:                                                                    02328000
            BPS1 := BQ1(X);    << MOVE A BYTE >>                        02330000
            ASMB(INCX,INCB);   << BUMP ADDRESSES >>                     02332000
            TOS := TOS - 1;    IF > THEN GOTO MV2;                      02334000
                                                                        02336000
            DDEL;      SET( Q );                                        02338000
            PENABLE;                                                    02340000
          END                                                           02342000
        ELSE                                                            02344000
          BEGIN   << MOVE WORDS >>                                      02346000
          IF S4<>0 THEN                                        <<01469>>02348000
            BEGIN << MOVE NOT PB REL >>                        <<01469>>02350000
            TOS := 6;  TOS := TEMP&LSR(1)+SYSDB;  << TBUF OFFSET >>     02352000
            TOS := DS6;     << GET BUFADR >>                            02354000
            TOS := TOS + TADDR;                                         02356000
            TOS := (I+1)&LSR(1);    ASMB( MDS );                        02358000
            END                                                <<01469>>02360000
          ELSE << MOVE FROM PB ARRAY >>                        <<01469>>02362000
            MOVE WA0(TEMP&LSR(1)) := RESET31B(TADDR),          <<01469>>02364000
            ((I+1)&LSR(1));                                    <<01469>>02366000
          END;                                                          02368000
                                                                        02370000
        DISABLE;                                                        02372000
        DSPEEDP.FILLING := 0;                                           02374000
                                                                        02376000
        IF DITP(DCNT)=-2 THEN  << TBUF END DURING FILL >>               02378000
          BEGIN   << RESTORE DCNT AND RESTART >>                        02380000
            DITP( X ) := 1;                                             02382000
            MPXWRITE(NULL,DITP);                                        02384000
          END;                                                          02386000
                                                                        02388000
        IF DBCNTP<TBMAXB THEN  << DATA ADDED TO CURRENT TBUF >>         02390000
          DITP(DCNT) := (IF DITP.DSTATE=NULL THEN DBCNTP                02392000
                              ELSE DITP(DCNT)) + I;                     02394000
        DBCNTP := DBCNTP + I;   << NEW CURRENT WRITE BYTE COUNT >>      02396000
        ENABLE;                                                         02398000
                                                                        02400000
        IF DMODEMPL.NOSYNC THEN DITP(DSYNC) := DITP(DSYNC) - I;         02402000
        DXCNTP := DXCNTP + I;    OFFSET := OFFSET + I;                  02404000
      END;                                                              02406000
                                                                        02408000
                                                                        02410000
    COUNT := COUNT - I;    IF = THEN RETURN;  << MOVE DONE >>           02412000
                                                                        02414000
    IF DMODEMPL.NOSYNC AND DITP(DSYNC)=0 THEN                           02416000
      BEGIN                                                             02418000
        DITP(DSYNC) := 80;                                     <<01227>>02420000
        IF NOT DLASTPL.BWRITE AND NOT DMODEMPL&CSL(M202) THEN           02422000
          BEGIN   << ADD ENQ FOR 2640 NOT ON A 202 >>                   02424000
            TOS := DXCNTP;   << SAVE DXCNT  OVER CALL >>       <<01.02>>02426000
            MOVEDATA(SIOADDR,1,7);   << ADD ENQ >>                      02428000
            DXCNTP := TOS;   << RESTORE DXCNT >>               <<01.02>>02430000
            IF <> THEN     << ENQ NOT ADDED, WAIT REQUEST >>            02432000
              BEGIN                                                     02434000
                RQSTATE := RQSTATE + 4;  << INDICATE AN ADD ENQ WAIT >> 02436000
                RETURN;    << WITH CC = CCG >>                          02438000
              END;                                                      02440000
          END;                                                          02442000
      END;                                                              02444000
                                                                        02446000
    GOTO STARTM;        << CONTINUE THIS OPERATION >>                   02448000
                                                                        02450000
  END;   << MOVE DATA >>                                                02452000
                                                                        02454000
                                                                        02456000
                                                                        02458000
                                                                        02460000
SUBROUTINE DOSPACE;                                                     02462000
  <<                                                                    02464000
    THIS SUBROUTINE PUTS THE SPECIFED CARRIAGE CONTROL CHARACTERS IN    02466000
    THE TERMINAL TANKS.                                                 02468000
                                                                        02470000
    RETURN CC - CCE = DATA TRANSFER COMPLETED                           02472000
                CCG = TOO MUCH DATA TO TANK NOW OR NO TBUF AVAILABLE    02474000
  >>                                                                    02476000
  BEGIN                                                                 02478000
     IF DTYPEP.TTYPE=HP2631B AND DPAGEEJECT=QPAGEEJECT THEN    <<01469>>02480000
       BEGIN  << TANK ESC SEQ TO OR NOT TO AUTO PAGE EJECT >>  <<01469>>02482000
       ABS(ABSSIOADDR+6) := IF QPAGEEJECT THEN %30114          <<01469>>02484000
         ELSE %30514;                                          <<01469>>02486000
       MOVEDATA(SIOADDR,6-DXCNTP,8+DXCNTP);                    <<01469>>02488000
       IF <> THEN RETURN;                                      <<01469>>02490000
       DPAGEEJECT := NOT DPAGEEJECT;                           <<01469>>02492000
       DXCNTP := 0;                                            <<01469>>02494000
       END;                                                    <<01469>>02496000
    IF DLASTPL.BWRITE THEN GOTO ALLDONE;                                02498000
    TEMP := 0;     << INDEX TO LF EOR SEQUENCE >>                       02500000
                                                                        02502000
    IF QPAR1P=1 THEN  << SPACE CONTROL IMBEDED IN BUFFER >>             02504000
      BEGIN                                                             02506000
        X := BCNT;                                                      02508000
        IF = THEN GOTO BADREQUEST;                                      02510000
        PDISABLE;                                              <<00.05>>02512000
        TOS := Q1ADDR;     TOS := DATA'ADR(IOQP);              <<00.05>>02514000
        TOS := 1;    ASMB( MDS );     << FIRST WORD TO ARRAY Q1 >>      02516000
        PENABLE;                                               <<00.05>>02518000
        X := BQ1;   << GET FIRST BYTE >>                                02520000
      END                                                               02522000
    ELSE X := QPAR1P;   << PUT SPACE CONTROL IN X >>                    02524000
                                                                        02526000
  NEWFORM := IF X="1" THEN TRUE ELSE FALSE;                    <<01469>>02528000
    X := X-%53;                                                         02530000
    IF < THEN GOTO SINGLESPACE;                                         02532000
    IF = THEN GOTO DS1;    << "+" = %53 = NO LF >>                      02534000
    X := X-5;    << X = CHAR - %60 >>                                   02536000
    IF = THEN   <<  "0" = %60 = DOUBLE SPACE >>                         02538000
      BEGIN   X := 2;  GOTO DS1;    END;                                02540000
    X := X-1;    << X = CHAR - %61 >>                                   02542000
    IF = AND DTYPEPL.FORMFEED THEN  << "1" = TOP OF FORM >>             02544000
      TEMP := 4;   << OFFSET TO XOFF, CR AND FF >>                      02546000
  IF %217<=X AND X<%237 AND DTYPEPL.TTYPE=HP2631B THEN         <<01469>>02548000
    BEGIN    << FORM VFC SEQ >>                                <<01469>>02550000
    TEMP := 8; SCNT := 0; I := 7-DXCNTP;                       <<01469>>02552000
    TOS := (X-%216) MOD 10 + %60;                              <<01469>>02554000
    IF X>%227 THEN TOS := TOS LOR %30400                       <<01469>>02556000
      ELSE TOS := TOS LOR %30000;                              <<01469>>02558000
    ABS(ABSSIOADDR+6) := TOS;                                  <<01469>>02560000
    GOTO DESC;                                                 <<01469>>02562000
    END;                                                       <<01469>>02564000
    X := X-%237;    << X = CHAR - %320 >>                               02566000
    IF <> THEN   << NOT A %320 >>                                       02568000
      BEGIN                                                             02570000
        X := X+%120;   << X = CHAR - %200 >>                            02572000
        IF NOT (0<=X<=%77) THEN    << NOT MULTIPLE LINE FEEDS >>        02574000
SINGLESPACE:                                                            02576000
          X := 1;   << SET X TO SINGLE SPACE >>                         02578000
DS1:                                                                    02580000
        SCNT := X + 2;   << LF COUNT + 2 FOR XOFF, CR >>                02582000
                                                                        02584000
        X := DXCNTP;  << NO XOFF IF TERM NOT HARD COPY >>      <<01.02>>02586000
        IF = AND DTYPEP.TTYPE>6 THEN DXCNTP := DXCNTP+1;      <<00.06>> 02588000
        I := (IF SCNT>4 THEN 4 ELSE SCNT) - DXCNTP;                     02590000
        IF > THEN  << ADD XOFF, CR, 1 OR 2 LF'S OR FF >>                02592000
DESC:                                                          <<01469>>02594000
          BEGIN                                                         02596000
            MOVEDATA( SIOADDR, I, DXCNTP+TEMP );                        02598000
            IF <> THEN RETURN;   << GO WAIT REQUEST >>                  02600000
          END;                                                          02602000
                                                                        02604000
        WHILE DXCNTP<SCNT DO                                            02606000
          BEGIN                                                         02608000
            MOVEDATA(SIOADDR, 1, 2);   << APPEND LINE FEEDS >>          02610000
            IF <> THEN RETURN;  << GO WAIT REQUEST >>                   02612000
          END;                                                          02614000
      END;                                                              02616000
                                                                        02618000
ALLDONE:                                                                02620000
    ASMB(DZRO,CMP );   << SET CC = CCE >>                               02622000
  END;    << DO SPACE >>                                                02624000
                                                                        02626000
                                                                        02628000
                                                                        02630000
INTEGER SUBROUTINE PINWORD;                                             02632000
  <<                                                                    02634000
     THIS SUBROUTINE RETURNS THE PIN OF THE MAIN PROCESS TO WHICH       02636000
     THE DEVICE IS CURRENTLY ATTACHED.                                  02638000
  >>                                                                    02640000
    BEGIN                                                               02642000
      RESETDB(-1);                                                      02644000
      TEMP := EXCHANGEDB(LDTDST);                                       02646000
      PINWORD := WA0(WA0.ESIZE*LDEV+1);                                 02648000
      TOS := EXCHANGEDB(TEMP);   << RESTORE DB >>                       02650000
      ASMB( PCAL SETSYSDB );   DEL;                                     02652000
    END;    << MAIN PIN >>                                              02654000
                                                                        02656000
                                                                        02658000
SUBROUTINE SETUPCHANNEL;                                                02660000
  << THIS SUBROUTINE INITIALIZES THE WRITE AND READ CHANNELS >>         02662000
  BEGIN                                                                 02664000
    DISABLE;                                                            02666000
    DITP.UP := 1;                                                       02668000
    IF = THEN                                                  <<01469>>02670000
      BEGIN                                                    <<01469>>02672000
      IF DITP(DTRLX).LOGONTRLX <> 0 THEN                       <<01448>>02674000
        STOPTIMEOUT(LOGONTO,DITP);                             <<01448>>02676000
      IF DTYPEP.TTYPE=HP2631B THEN RQSTATE := RESET31;         <<01469>>02678000
      END;                                                     <<01469>>02680000
    DSPEEDP.SPDSENSING := 0;                                            02682000
    ENABLE;                                                             02684000
                                                                        02686000
    MPXCONTROL( WRTCHAN, DITP);   << INITIALIZE WRITE CHANNEL >>        02688000
    MPXCONTROL(ECHOOFF, DITP);  << INITIALIZE RECIEVE CHANNEL >>        02690000
  END;  << SET UP CHANNEL >>                                            02692000
$PAGE "ASYCHRONOUS TERMINAL MONITOR  -  TERM "                          02694000
                                                                        02696000
       <<--------- BEGIN MONITOR/DRIVER ------------>>                  02698000
                                                                        02700000
    TOS := 6;    << DST NUMBER OF CORE >>                               02702000
    TOS := SYSDB + WA0(DITP(DILTP)+ISIOP);  << SET SIOADDR >>           02704000
    TOS := DITP(DLDEV).DLDEVN;   << SET LDEV >>                         02706000
    TOS := 0 D;  TOS := 0 D;   << ROOM FOR IOQP,QMISCP,QWBCTP,QPAR1P >> 02708000
                                                                        02710000
    TOS := @DITP+DRQST;          <<  SET DRQSTP >>                      02712000
    TOS := S0 + 1;               <<  SET DTYPEP  >>                     02714000
    TOS := S0 + 1;               <<  SET DMODEMP >>                     02716000
    TOS := S0 + 1;               <<  SET DSPEEDP >>                     02718000
    TOS := S0 + 1;               <<  SET DCNTRLP >>                     02720000
    TOS := S0 + 1;               <<  SET DRBCTP  >>                     02722000
    TOS := S0 + 1;               <<  SET DBCNTP  >>                     02724000
    TOS := S0 + 4;               <<  SET DXCNTP  >>                     02726000
    TOS := S0 + 7;               <<  SET DLASTP  >>                     02728000
                                                                        02730000
    DISABLE;                                                            02732000
    TOS := DITP;                                                        02734000
    TOS.ACTIVE := 1;                                                    02736000
    IF = THEN GOTO CONTINUE;  << SERVICE REQUEST HERE >>                02738000
                                                                        02740000
    TOS.REQUEST := 1;   << ALREADY ACTIVE SET REQUEST FLAG >>           02742000
    DITP := TOS;                                                        02744000
    RETURN;                                                             02746000
                                                                        02748000
GOWAIT:                                                                 02750000
    X := DBCNTP;                                               <<01.02>>02752000
    IF <> AND NOT DITPL.UP THEN SUDDENDEATH(203);              <<01.02>>02754000
                                                               <<01.02>>02756000
    DISABLE;                                                            02758000
    TOS := DITP;                                                        02760000
    TOS.REQUEST := 0;                                                   02762000
    IF <> THEN GOTO CONTINUE;  << SERVICE REQUESTED, EXECUTE AGAIN >>   02764000
                                                                        02766000
    TOS.ACTIVE := 0;                                                    02768000
    DITP := TOS;                                                        02770000
    RETURN;                                                             02772000
                                                                        02774000
AGAIN:                                                                  02776000
    DISABLE;                                                            02778000
    TOS := DITP;                                                        02780000
$PAGE                                                                   02782000
                                                                        02784000
CONTINUE:                                                               02786000
    TOS := DITP(DIOQP);   TOS := S0;  << GET IOQP >>                    02788000
    TOS := S0 + QMISC;    << FORM QMISCP >>                             02790000
    QPQM  := TOS;         << SET IOQP   AND QMISCP >>                   02792000
                                                                        02794000
    ASMB(TEST     );   << TEST IOQP >>                                  02796000
    IF <> THEN << USER REQUEST PENDING >>                               02798000
      BEGIN                                                             02800000
        TOS := QMISCP.RSTATE;   << SET RQSTATE >>                       02802000
        TOS := IOQP(QFUNC).FUNC; << SET FUNCTION >>                     02804000
      END                                                               02806000
    ELSE ASMB(DZRO,DECB);  << NULL RSTATE & INVALID FUNCTION >>         02808000
    RQSFUNC := TOS;        << SET RQSTATE AND FUNCTION >>               02810000
                                                                        02812000
    TOS := TOS + QWBCT;    << FORM QWBCTP >>                            02814000
    TOS := S0 + 1;         << FORM QPAR1P >>                            02816000
    QCQP1 := TOS;          << SET QWBCTP AND QPAR1P >>                  02818000
                                                                        02820000
    X := DBCNTP;                                               <<01.02>>02822000
    IF <> AND NOT DITPL.UP THEN SUDDENDEATH(203);              <<01.02>>02824000
                                                               <<01.02>>02826000
                                                                        02828000
    <<------------ CHECK FOR ONLINE ---------->>                        02830000
                                                                        02832000
    TOS.REQUEST := 0;                                                   02834000
    TESTBIT UP');                                                       02836000
    DITP := TOS;                                                        02838000
                                                                        02840000
    IF = AND DRQSTP=0 THEN    << NOT ONLINE & NO SERVICE REQUESTS >>    02842000
      BEGIN                                                             02844000
        X := @IOQP;                                                     02846000
        IF = THEN GOTO GOWAIT;  << NO REQUESTS PENDING >>               02848000
         IF FUNCTION = FILEOPEN THEN FUNCTION := ALLOCATE;     <<00190>>02850000
                                                                        02852000
        IF NOT(1<=(FUNCTION-ALLOCATE+1)<=16) OR %077647&CSL(X) <<01469>>02854000
        OR RQSTATE<>0 THEN << OR NOT OLD REQUEST >>            <<01469>>02856000
          BEGIN  << NOT ALLOCATE,GET SPD, GET TYPE >>          <<00.06>>02858000
            TOS := OFFLINE;                                             02860000
            GOTO CLEARCOUNT;                                            02862000
          END;                                                          02864000
      END;                                                              02866000
$PAGE                                                                   02868000
                                                                        02870000
    <<-------- CHECK FOR ANY TERMINAL SERVICE REQUESTS ----------- >>   02872000
                                                                        02874000
    X := DRQSTP;      << TEST SERVICE REQUEST FLAGS >>                  02876000
    IF = THEN GOTO CHKABORT;    << NO SERVICE REQUESTS PENDING >>       02878000
                                                                        02880000
    DMONITOR(DITP,%12,DITP,DRQSTP);                                     02882000
                                                                        02884000
    TOS := DRQSTP;    ASMB( SCAN 0 );    DEL;                           02886000
                                                                        02888000
    TOS := DRQSTP;        << CLEAR REQUEST FLAG >>                      02890000
    ASMB( TRBC 0,X );                                                   02892000
    DRQSTP := TOS;                                                      02894000
    ENABLE;                                                             02896000
                                                                        02898000
    ASMB( LOAD RTABLE,X; ADAX      ;  BR RTABLE,X;                      02900000
                                                                        02902000
RTABLE:  << TERM SERVICE REQUEST JUMP TABLE >>                          02904000
                                                                        02906000
      CON HANGUPTOL;CON DISCNCTL;  CON CFAILTOL; CON TURNTOL;           02908000
      CON HP2640TOL;CON CHKABORT;  CON SPOOLSWL; CON SPOOLENDL;<<00.06>>02910000
      CON READTOL;  CON ONLINEL;   CON DSETRDYL; CON LOGONTOL;          02912000
      CON BREAKL;   CON SSBREAKL;  CON BLOCKTOL; CON CHKSTAT); <<02004>>02914000
                                                                        02916000
                                                                        02918000
  CHKSTAT:                                                     <<01469>>02920000
    IF @IOQP=0 THEN GOTO GOWAIT;                               <<01469>>02922000
    TOS := IOQP(QSTAT).IOSTAT;                                 <<01469>>02924000
    IF <> AND FUNCTION<>FILEOPEN THEN GOTO SETSTATUS;          <<01469>>02926000
    DEL;                                                       <<01469>>02928000
    GOTO GOODDONE;                                             <<01469>>02930000
                                                                        02932000
  <<-------- CHECK FOR REQUEST ABORT OR PREMPT ------------->>          02934000
                                                                        02936000
CHKABORT:                                                               02938000
    X := @IOQP;                                                         02940000
    IF = THEN GOTO GOWAIT;     << NO USER REQUESTS >>                   02942000
                                                                        02944000
    <<------------ CHECK FOR ABORTS AND PREMPTIONS ------------ >>      02946000
                                                                        02948000
    DISABLE;                                                            02950000
    IF QMISCPL.NOSTOP THEN GOTO RSWITCH; << NO ABORT/PREMPT >>          02952000
    IF READABORTED THEN GOTO GOWAIT;                                    02954000
                                                                        02956000
    IF DITP.DSTATE=WRITING AND (DITP(DMONTR).XONWAIT=1 OR      <<01468>>02958000
      DITP.ACKWAIT=1) THEN                                     <<01468>>02960000
      BEGIN                                                    <<00.06>>02962000
        @THISP := @IOQP;                                       <<00.06>>02964000
        WHILE <> DO << LOOK FOR ABORTED REQUESTS >>            <<00.06>>02966000
          BEGIN                                                <<00.06>>02968000
            IF THISP<0 THEN << REQUEST ABORTED >>              <<00.06>>02970000
              BEGIN  << RESTART PAUSED WRITE >>                <<00.06>>02972000
                DITP.ENQACKWAIT := 0;                          <<00.06>>02974000
                DITP(DMONTR).XONWAIT := 0;                     <<01468>>02976000
                SENDSYNC(WRITING,DITP);                        <<00.06>>02978000
              END;                                             <<00.06>>02980000
            @THISP := THISP(QLINK);   << STEP TO NEXT >>       <<00.06>>02982000
          END;                                                 <<00.06>>02984000
      END;                                                     <<00.06>>02986000
                                                               <<00.06>>02988000
    X := IOQP;   << TEST BIT 0 FOR ABORT >>                             02990000
    IF < THEN  << ABORT REQUESTED >>                                    02992000
      BEGIN                                                             02994000
        IF DITP.DSTATE=STARTREAD THEN SENDSYNC(NULL,DITP);              02996000
ABORTL:                                                                 02998000
        DISABLE;                                               <<00.06>>03000000
    IF DITP.DSTATE=WRITING THEN                                <<01469>>03002000
      BEGIN                                                    <<01469>>03004000
      DITP.DSTATE := NULL;                                     <<01469>>03006000
      IF DTYPEP.TTYPE=HP2631B THEN SENDSYNC(EORSYNC,DITP);     <<01469>>03008000
      END;                                                     <<01469>>03010000
        RETURNBUFS;                                                     03012000
        TOS := ABORTED;                                                 03014000
CLEARCOUNT:                                                             03016000
        QWBCTP := 0;                                                    03018000
        GOTO SETSTATUS;                                                 03020000
      END;     <<  ABORT PROCESSING >>                                  03022000
                                                                        03024000
    ENABLE;                                                             03026000
                                                                        03028000
                                                                        03030000
  <<-------------- CHECK FOR AND PROCESS PREMPTS --------------->>      03032000
                                                                        03034000
    X := DMODEMP;   << BIT 0 PREMPTIVE REQUEST INDICATOR >>             03036000
    IF < AND NOT QMISCPL.NOPREMPT THEN                                  03038000
      BEGIN  << PREMPTABLE AND PREMPT REQUESTED >>                      03040000
        @THISP := @IOQP;    NPL := 0;                                   03042000
        WHILE <> DO  << FIND MOST PREMPTIVE >>                          03044000
          BEGIN                                                         03046000
            IFLAG := THISP.RPLEVEL;                                     03048000
            IF IFLAG=CONSMODE AND NOT DMODEMPL.CMODE THEN               03050000
              THISP.RPLEVEL := NULL   << SET CORRECT PREMPT LEVEL >>    03052000
                                                                        03054000
            ELSE IF IFLAG>NPL THEN  << MORE PREMPTIVE >>                03056000
              BEGIN                                                     03058000
                NPL := THISP.RPLEVEL;                                   03060000
                SAVEPS := THESEPS;    << SAVE THISP AND LASTP >>        03062000
              END;                                                      03064000
            @LASTP := @THISP;  @THISP := THISP(QLINK); <<STEP TO NEXT>> 03066000
          END;                                                          03068000
                                                                        03070000
        DISABLE;                                                        03072000
        TOS := NPL;                                                     03074000
        IF = THEN DMODEMP.PREMPT :=  0;  << NO PREMPTIVE REQUESTS >>    03076000
                                                                        03078000
        IF TOS>IOQP.RPLEVEL THEN  << FIRST HAS BEEN PREMPTED >>         03080000
          BEGIN                                                         03082000
            IFLAG := QMISCP.RSTATE;                                     03084000
            IF = OR IFLAG=READWAITING THEN  << NEW SO JUST RELINK >>    03086000
              BEGIN                                                     03088000
                IF DITP.DSTATE=STARTREAD THEN SENDSYNC(NULL,DITP);      03090000
                QMISCP := 0;   << FORCE RESTART OF REQUEST >>           03092000
                DITP(DIOQP) := @STHISP;  << LINK NEW TO DIT >>          03094000
                SLASTP(QLINK) := STHISP(QLINK); << DELINK,RELINK REST >>03096000
                STHISP(QLINK) := @IOQP;  << LINK REST TO NEW >>         03098000
                GOTO AGAIN;                                             03100000
              END;                                                      03102000
                                                                        03104000
            IF NPL>=SOFTPREMPT AND (> OR DBCNTP=0) THEN                 03106000
              STOPREAD(PREMPTSTOP);  << HARD OR SOFT & NO INPUT >>      03108000
            GOTO GOWAIT;                                                03110000
          END;                                                          03112000
      END;     << PREMPT PROCESSING  >>                                 03114000
$PAGE                                                                   03116000
                                                                        03118000
    << SWITCH ON REQUEST STATE, NO SERVICE REQUESTS PENDING >>          03120000
RSWITCH:                                                                03122000
    ENABLE;                                                             03124000
    DMONITOR(DITP,%10,QPAR1P CAT IOQP(QFUNC) (0:9:7), -1);              03126000
                                                                        03128000
    IF FUNCTION<=WRITING THEN   << FORM WORD AND BYTE COUNTS >>         03130000
      BEGIN                                                             03132000
        TOS := DRBCTP;                                                  03134000
        WCNT := (S0+1)&LSR(1);    BCNT := TOS;                          03136000
                                                                        03138000
        TOS := ABS(ABS(CPCB)+PCB3).DSTFIELD;   << STACK DST NUMBER >>   03140000
        PUSH( Q, DL );    TOS := TOS-TOS+1;  << OFFSET TO PCB LENGTH >> 03142000
        X := -S0;                                                       03144000
        TOS := TOS + Q0(X);   << DST RELATIVE ADDR OF Q+1 >>            03146000
        Q1ADDR := TOS;   << SET STACKDST AND TBASE >>                   03148000
      END;                                                              03150000
                                                                        03152000
    X := RQSTATE.(12:4);  << MASK TO SWITCH PART >>                     03154000
    ASMB( LOAD RQTABLE,X;  ADAX;   BR RQTABLE,X;                        03156000
                                                                        03158000
RQTABLE:                                                                03160000
      CON NEWL;       CON NOTNEWL;  CON GOWAIT;     CON READDONEL;      03162000
      CON STOPPEDL;  CON RDSTART1;  CON RESETL;  CON GOWAIT;   <<01469>>03164000
      CON PRETOPOSTL; CON PRESPACEL;CON TBWAITL;    CON POSTSPACEL;     03166000
      CON FINISHENQ;  CON FINISHENQ;CON FINISHENQ;  CON FINISHENQ);     03168000
$PAGE                                                                   03170000
                                                                        03172000
    << ------------ START NEW REQUESTS -------------- >>                03174000
                                                                        03176000
NEWL:                                                                   03178000
    IF DITP(DSAVE).HSTATE >= HANGUPTURN THEN BEGIN             <<02859>>03180000
        TOS := OFFLINE;                                        <<02859>>03182000
        GOTO SETSTATUS;                                        <<02859>>03184000
    END;                                                       <<02859>>03186000
    IF DMODEMP.TMODE>=CONSMODE AND IOQP.RPLEVEL<CONSMODE THEN           03188000
      GOTO GOWAIT;   << MODE LEVEL HOLD OFF OF REQUEST >>               03190000
                                                                        03192000
    FLAG := (IOQP(QPAR2).BINARY<>0) XOR DLASTPL.BWRITE;                 03194000
    IF FLAG OR IOQP.RPLEVEL<>DMODEMP.LPLEVEL OR FUNCTION>WRITING        03196000
     OR DITP.DSTATE>WRITING THEN                                        03198000
      BEGIN   << CAN NOT CONCATENATE WRITES >>                          03200000
        IF DITP.DSTATE<>NULL THEN GOTO GOWAIT;                          03202000
                                                                        03204000
        IF FUNCTION<>WRITING OR FLAG THEN                               03206000
          BEGIN  << RESTORE PARITY TO ORGINAL SENSE >>                  03208000
            DLASTP.BWRITE := 0;                                         03210000
            IF <> THEN   << WAS IN BINARY MODE, SO RESTORE >>           03212000
              BEGIN                                                     03214000
                DCNTRLP.PARITYBITS := DLASTP.PARITYSAVE;                03216000
                SETUPCHANNEL;                                           03218000
              END;                                                      03220000
          END;                                                          03222000
                                                                        03224000
        IF IOQP.RPLEVEL>DMODEMP.LPLEVEL AND NOT DITPL.NEWLINE THEN      03226000
          BEGIN    << HIGHER PREMPT LEVEL AND NOT NEW LINE >>           03228000
            SENDSYNC(EORSYNC,DITP);   << DO A CR/LF >>                  03230000
            GOTO GOWAIT;                                                03232000
          END;                                                          03234000
      END;                                                              03236000
                                                                        03238000
    DISABLE;                                                            03240000
    DMODEMP.LPLEVEL := IOQP;         << SET NEW PREMPT LEVEL >>         03242000
                                                                        03244000
    TOS := QWBCTP;                                                      03246000
    IF < THEN TOS := -TOS ELSE TOS := TOS&LSL(1);                       03248000
    IF < THEN BEGIN DEL; TOS := %77777; END;                            03250000
    DRBCTP := TOS;                                                      03252000
                                                                        03254000
    DXCNTP := 0;                                                        03256000
    RQSTATE := NOTNEW;                                                  03258000
    GOTO RSWITCH;   << SET COUNTS AND SWITCH ON FUNCTION >>             03260000
$PAGE                                                                   03262000
                                                                        03264000
NOTNEWL:                                                                03266000
    <<------------ SWITCH ON FUNCTION ------------->>                   03268000
                                                                        03270000
    X := FUNCTION;                                                      03272000
    X := X-FMAX;                                                        03274000
    IF <= THEN    << FUNCTION OK  >>                                    03276000
      ASMB( LOAD FTABEND,X;  ADAX      ;  BR FTABEND,X;                 03278000
        CON READL;    CON WRITEL;   CON FOPENL;    CON FCLOSEL;         03280000
        CON DCLOSEL;  CON SETTOL;   CON INSPDL;    CON OUTSPDL;         03282000
        CON ECHOONL;  CON ECHOOFFL; CON BRKOFFL;   CON BRKONL;          03284000
        CON SSBRKOFFL;CON SSBRKONL; CON TAPEOFFL;  CON TAPEONL;         03286000
        CON TIMEOFFL; CON TIMEONL;  CON READTIMEL; CON PRTYOFFL;        03288000
        CON PRTYONL;  CON LOGGEDONL;CON BADREQUEST;CON TERMTYPEL;       03290000
        CON ALLOCATEL;CON CFWRITEL; CON CXECHOON;  CON CXECHOOFF;       03292000
        CON GOODDONE; CON PTAPEL;   CON SETBMODEL; CON SETCMODEL;       03294000
        CON SETPTYL;  CON ALLOCATEL;CON TERMTYPEL; CON GETTERMTYPE;     03296000
        CON RETURNSPD;CON STOPCHARS;                           <<00.03>>03298000
FTABEND:                                                                03300000
        CON SETCNTRLA);                                        <<00.03>>03302000
                                                                        03304000
BADREQUEST:                                                             03306000
    TOS := INVALIDOP;                                                   03308000
    GOTO CLEARCOUNT;                                                    03310000
                                                                        03312000
                                                                        03314000
FINISHENQ:                                                              03316000
    TOS := DXCNTP;            << SAVE TRANSFER COUNT >>                 03318000
    MOVEDATA(SIOADDR, 1,7);   << ADD AN ENQ >>                          03320000
    DXCNTP := TOS;            << RESTORE TRANSFER COUNT >>              03322000
    IF <> THEN GOTO GOWAIT;   << STILL NOT POSSIBLE TO ADD ENQ >>       03324000
    RQSTATE := RQSTATE - 4;   << RESTORE BACK TO INTERUPTED OPERATION >>03326000
    GOTO RSWITCH;                                                       03328000
$PAGE                                                                   03330000
                                                                        03332000
    << ------------- INITIATE READS -------------- >>                   03334000
                                                                        03336000
READL:                                                                  03338000
    IF IOQP.RPLEVEL=NULL THEN  << OK TO FLUSH >>                        03340000
      BEGIN                                                             03342000
        X:= DITP(DLDEV);  << TEST FOR BREAK FLUSH >>                    03344000
        IF < THEN  << BREAK FLUSH >>                                    03346000
          BEGIN                                                         03348000
            TOS := BREAKEND;                                            03350000
            GOTO CLEARCOUNT;                                            03352000
          END;                                                          03354000
                                                                        03356000
        X := QMISCP;                                                    03358000
        IF < THEN GOTO CNTRLDONE;  << CONTROL Y FLUSH, RETURN DONE OK >>03360000
      END;                                                              03362000
                                                                        03364000
    EOFCHECK(IOQP, 0 D, 0, 0);                                          03366000
    IF <> THEN    << END OF FILE, NO READ >>                            03368000
      BEGIN                                                             03370000
        TOS := IOQP(QSTAT);   << GET EOF STATUS >>                      03372000
        GOTO SETSTATUS;                                                 03374000
      END;                                                              03376000
                                                                        03378000
    X := DITP(DRPTR);  << TEST FOR SAVED READ DATA >>                   03380000
    IF <> AND QPAR1P.EOFCODE<>NOEOFCHECK THEN                           03382000
      BEGIN  << SET UP AS IF JUST READ >>                               03384000
        IF DITP.DSTATE<>NULL THEN GOTO GOWAIT;                          03386000
        TOS := DITP(DRPTR);  DITP(DRPTR) := 0;                          03388000
        DITP(DHEAD) := TOS;   << LINK IN TBUFS >>                       03390000
        DBCNTP := DITP(DRCNT);                                          03392000
        GOTO READDONEL;                                                 03394000
      END;                                                              03396000
                                                                        03398000
READSTART:                                                              03400000
    DISABLE;                                                   <<WH.30>>03402000
    QMISCP.RSTATE := READWAITING;                                       03404000
                                                                        03406000
RDSTART1:                                                               03408000
    DISABLE;                                                   <<WH.23>>03410000
    IF DITP.DSTATE=NULL AND QMISCP.RSTATE=READWAITING THEN     <<00209>>03412000
MEASUREMENT1:                                                  <<01240>>03414000
       BEGIN                                                   <<01240>>03416000
       IF MEASURE THEN DITPD(17):=TIMER;                       <<01240>>03418000
       SENDSYNC(STARTREAD,DITP);                               <<00209>>03420000
       END;                                                    <<01240>>03422000
    GOTO GOWAIT;                                                        03424000
$PAGE                                                                   03426000
   <<------------------ READ STOPPED ------------------->>              03428000
                                                                        03430000
STOPPEDL:                                                               03432000
    X := QMISCP.READSTOP - 1;                                           03434000
    ASMB( LOAD STOPTAB,X;  ADAX;  BR STOPTAB,X;                         03436000
                                                                        03438000
STOPTAB:                                                                03440000
      CON BRKSTOP;   CON READDONEL;   CON PRMPTSTOP; CON TIMEOUTL;      03442000
      CON ABORTL;    CON BKTIMEOUTL);                          <<02004>>03444000
                                                                        03446000
PRMPTSTOP:                                                              03448000
    RETURNBUFS;                                                         03450000
    QMISCP := 0;   << RESTORE REQUEST TO NEW STATE >>                   03452000
    GOTO AGAIN;                                                         03454000
                                                                        03456000
TIMEOUTL:                 << READ TIMED OUT AND STOPPED >>              03458000
    RETURNBUFS;                                                         03460000
    SETREADERROR(IOQP,READTO);                                          03462000
    GOTO READDONEL;                                                     03464000
                                                               <<02004>>03466000
BKTIMEOUTL:                                                    <<02004>>03468000
    RETURNBUFS;                                                <<02004>>03470000
    SETREADERROR(IOQP, BLOCKTO);                               <<02004>>03472000
    GO TO READDONEL;                                           <<02004>>03474000
                                                                        03476000
BRKSTOP:                                                                03478000
    X := DBCNTP;   << ANY BROKEN READ DATA? >>                          03480000
    IF <>  AND IOQP.READERRORS= NULL THEN                               03482000
    << CHECK FOR DOUBLE BREAK (POSSIBLE VIA INTERACTIVE >>     <<00195>>03484000
    << STREAM COMMAND).                                 >>     <<00195>>03486000
    IF DITP(DBREAK) = 0 THEN   << IF NOT  DOUBLE BREAK>>       <<00195>>03488000
      BEGIN  << GET AN IOQ AND SAVE BROKEN READ RESTART DATA >>         03490000
        TOS := GETIOQ( 0 );   << IMPEDE IF NO IOQ AVAILABLE >>          03492000
        MOVE PS0 := DBCNTP,(10);                                        03494000
        PS0(QLINK) := 0;  << NECESSARY FOR IOQ RETURN TEST >>  <<01.02>>03496000
        DITP(DBREAK) := TOS;   << SAVE IOQP TO SAVED DATA >>            03498000
        DBCNTP := 0;  << SO NO TBUF RETURN >>                           03500000
      END;                                                              03502000
                                                                        03504000
    SETREADERROR(IOQP,BRKEND);                                          03506000
$PAGE                                                                   03508000
                                                                        03510000
    <<-------------- READ COMPLETION -------------->>                   03512000
                                                                        03514000
READDONEL:                                                              03516000
    TOS := IF DRBCTP<DBCNTP THEN DRBCTP ELSE DBCNTP;                    03518000
    WCNT := (S0+1)&LSR(1);    BCNT := TOS;                              03520000
                                                                        03522000
    IF LOGICAL(BCNT) THEN   << ADD IN LAST ODD CHAR FOR WORD MOVES >>   03524000
      BEGIN                                                             03526000
        X := DITP(DHEAD);                                               03528000
        TEMP := BCNT/TBMAXB;   << NUMBER OF BUFFERS - 1 MORE OR LESS >> 03530000
        WHILE > DO   << STEP DOWN CHAINED BUFS TO ONE TO MODIFY >>      03532000
          BEGIN   X := WA0(X);   TEMP := TEMP -1;  END;                 03534000
        TEMP := BCNT MOD TBMAXB + (X+1)&LSL(1); << BYTE ADDRESS >>      03536000
        PDISABLE;                                              <<00.05>>03538000
        TOS := Q1ADDR;    TOS := DATA'ADR(IOQP);               <<00.05>>03540000
        TOS := TOS + WCNT - 1;  << ADDRESS OF LAST WORD >>     <<00.05>>03542000
        TOS := 1;    ASMB( MDS );  << GET LAST WORD >>         <<00.05>>03544000
        BA0(TEMP) := Q1;  << BYTE TO BE RESTORED >>            <<00.05>>03546000
        PENABLE;                                               <<00.05>>03548000
      END;                                                     <<00.05>>03550000
                                                                        03552000
    IF IOQP.READERRORS<BRKEND AND IOQP(QPAR2).BINARY=0 THEN    <<01.02>>03554000
      BEGIN   << NO BAD ERRORS AND NOT BINARY, SO CHECK FOR EOF >>      03556000
        EOFCHECK(IOQP,DOUBLE(DITP(DHEAD)+SYSDB1),-DBCNTP,1);            03558000
        IF <> THEN      << AN EOF >>                                    03560000
          BEGIN                                                         03562000
            IF < THEN << BACKUP, SAVE DATA >>                           03564000
              BEGIN                                                     03566000
                DITP(DRCNT) := DBCNTP;   << SAVE DATA READ COUNT >>     03568000
                DITP(DRPTR) := DITP(DHEAD);                             03570000
                DBCNTP := 0;   << SO NO TBUFS RETURNED >>               03572000
              END;                                                      03574000
                                                                        03576000
            RETURNBUFS;                                                 03578000
            TOS := IOQP(QSTAT);  << GET EOF STATUS >>                   03580000
            GOTO SETSTATUS;                                             03582000
          END;                                                          03584000
      END;                                                              03586000
                                                                        03588000
    X := QWBCTP;                                                        03590000
    QWBCTP := IF >= THEN WCNT ELSE -BCNT;                               03592000
                                                                        03594000
    PDISABLE;                                                  <<00.05>>03596000
    TOS := DATA'ADR(IOQP);                                     <<00.05>>03598000
    TADDR := TOS;      TEMP := TOS;                            <<00.05>>03600000
    SCNT := IF IOQPL.SYSBUFR THEN 128 ELSE WCNT;               <<00.05>>03602000
    TCNT := TBMAXW;    TBASE := DITP(DHEAD);                   <<00.05>>03604000
                                                               <<00.05>>03606000
    WHILE WCNT>0 DO                                            <<00.05>>03608000
      BEGIN                                                    <<00.05>>03610000
        I := WCNT;                                             <<00.05>>03612000
        IF I>TCNT THEN I := TCNT;  << TBUF END IS MOVE CONSTRAINT >>    03614000
        IF I>SCNT THEN I := SCNT;  << SBUF END IS CONSTRAINT >>         03616000
                                                                        03618000
        TOS := TEMP;   TOS := TADDR;                           <<00.05>>03620000
        TOS := 6;    TOS := TBASE + SYSDB1;                             03622000
        TOS := I;    ASMB( MDS );                                       03624000
                                                                        03626000
        WCNT := WCNT - I;   << UPDATE REMAINING WORD COUNT >>           03628000
        IF <> THEN      << MORE TO MOVE >>                              03630000
          BEGIN                                                         03632000
            TBASE := TBASE + I;                                <<01.02>>03634000
            TADDR := TADDR + I;                                         03636000
            TCNT  := TCNT  - I;                                         03638000
            IF = THEN   << END OF A TBUF >>                             03640000
             BEGIN TBASE:=WA0(TBASE-TBMAXW); TCNT:=TBMAXW; END;<<01.02>>03642000
                                                                        03644000
            SCNT := SCNT - I;                                           03646000
            IF = THEN    << END OF AN SBUF >>                           03648000
              BEGIN                                                     03650000
                TADDR := SBUF(TADDR-129);   << STEP TO NEXT SBUF >>     03652000
                SCNT := 128;                                            03654000
              END;                                                      03656000
          END;                                                 <<00.05>>03658000
      END;                                                     <<00.05>>03660000
                                                               <<00.05>>03662000
    PENABLE;                                                   <<00.05>>03664000
                                                                        03666000
READDONE1:                                                              03668000
    DISABLE;                                                            03670000
    IF DMODEMPL.NOSYNC THEN DITP(DSYNC) := 80;                 <<01227>>03672000
                                                                        03674000
    RETURNBUFS;                                                         03676000
    TOS := READSTATUS(IOQP.READERRORS);                                 03678000
    GOTO SETSTATUS;                                                     03680000
$PAGE                                                                   03682000
                                                                        03684000
  <<----------- PROCESS WRITES ----------------->>                      03686000
                                                                        03688000
WRITEL:                                                                 03690000
    IF IOQP(QPAR2).BINARY<>0 AND NOT DLASTPL.BWRITE THEN                03692000
      BEGIN << MODES DONT AGREE, SO SET TO BINARY MODE >>               03694000
        TOS := DLASTP;                                                  03696000
        TOS.BWRITE := 1;                                                03698000
        TOS.PARITYSAVE := DCNTRLP.PARITYBITS;                           03700000
        DCNTRLP.PARITYBITS := 0;  << NO PARITY GENERATE >>              03702000
        DLASTP := TOS;                                                  03704000
        SETUPCHANNEL;                                                   03706000
      END;                                                              03708000
MEASUREMENT4:                                                  <<01240>>03710000
  IF MEASURE THEN MMSTAT(232,LDEV,0,BCNT);                     <<01240>>03712000
                                                                        03714000
    IF IOQPL(QPAR2) THEN  << PRESPACE >>                                03716000
      BEGIN                                                             03718000
        RQSTATE := PRESPACE;                                            03720000
PRESPACEL:                                                              03722000
        DOSPACE;                                                        03724000
        IF <> THEN GOTO WAITREQUEST;                                    03726000
      END                                                               03728000
    ELSE                                                                03730000
      BEGIN                                                             03732000
        DCNTRLP.PRESPLAST := 0;                                         03734000
        IF <> AND NOT DITPL.NEWLINE THEN  << DO A CR/LF >>              03736000
          BEGIN                                                         03738000
            RQSTATE := PRETOPOST;                                       03740000
PRETOPOSTL:                                                             03742000
            MOVEDATA(SIOADDR, 2, 1);   << ADD A CR/LF >>                03744000
            IF <> THEN GOTO WAITREQUEST;                                03746000
          END;                                                          03748000
      END;                                                              03750000
                                                                        03752000
    DXCNTP := 0;                                               <<01.02>>03754000
    IF QPAR1P=1 THEN   << CHECK BYTE COUNT >>                  <<01.02>>03756000
      BEGIN                                                    <<01.02>>03758000
        IF BCNT=0 THEN GOTO BADREQUEST;  << INVALID BYTE COUNT <<01.02>>03760000
        DXCNTP := DXCNTP + 1;   << STEP OVER CONTROL BYTE >>   <<01.02>>03762000
      END;                                                     <<01.02>>03764000
                                                               <<01.02>>03766000
    RQSTATE := TBWAIT;                                                  03768000
                                                                        03770000
TBWAITL:                                                                03772000
    PDISABLE;                                                  <<00.05>>03774000
    MOVEDATA( DATA'ADR(IOQP), BCNT-DXCNTP, DXCNTP );           <<00.05>>03776000
    IF <> THEN   << MOVE NOT COMPLETED, SO WAIT REQUEST >>              03778000
      BEGIN                                                             03780000
        PENABLE;                                               <<00.05>>03782000
WAITREQUEST:                                                            03784000
        QMISCP.RSTATE := RQSTATE;   << SAVE REQUEST STATE FOR RESTART >>03786000
        STARTWRITE;                                                     03788000
        GOTO GOWAIT;                                                    03790000
      END;                                                              03792000
    PENABLE;                                                   <<00.05>>03794000
                                                                        03796000
    IF NOT IOQPL(QPAR2) THEN  << POST SPACE >>                          03798000
      BEGIN                                                             03800000
        RQSTATE := POSTSPACE;   DXCNTP := 0;                            03802000
POSTSPACEL:                                                             03804000
        DOSPACE;                                                        03806000
        IF <> THEN GOTO WAITREQUEST;   << SPACING NOT COMPLETED >>      03808000
      END;                                                              03810000
                                                                        03812000
    IF DTYPEPL.TTYPE=HP2631B AND DBCNTP<>0 THEN                <<01469>>03814000
      BEGIN                                                    <<01469>>03816000
      RQSTATE := WRITEWAIT;    << GO WAIT UNTIL STATUS DONE>>  <<01781>>03818000
      GOTO WAITREQUEST;                                        <<01469>>03820000
      END;                                                     <<01469>>03822000
    STARTWRITE;                                                         03824000
                                                                        03826000
                                                                        03828000
    <<-------- FINISH UP USER REQUESTS ------------->>                  03830000
                                                                        03832000
GOODDONE:                                                               03834000
RESETL:                                                        <<01469>>03836000
    IF RQSTATE=RESET31 THEN                                    <<01469>>03838000
      BEGIN                                                    <<01469>>03840000
      NEWFORM := 1;                                            <<01469>>03842000
      IF = THEN I := 68 ELSE I := 66;                          <<01469>>03844000
      MOVEDATA(0D,I-DXCNTP,DXCNTP);                            <<01469>>03846000
      IF <> THEN                                               <<01469>>03848000
        BEGIN                                                  <<01469>>03850000
        QMISCP.RSTATE := RQSTATE;                              <<01469>>03852000
        GOTO GOWAIT;                                           <<01469>>03854000
        END;                                                   <<01469>>03856000
      RQSTATE := WRITEWAIT;    << GO WAIT UNTIL STATUS DONE>>  <<01781>>03858000
      REQSTAT := 1;                                            <<01469>>03860000
      DPAGEEJECT := 1;                                         <<01469>>03862000
      GOTO WAITREQUEST;                                        <<01469>>03864000
      END;                                                     <<01469>>03866000
    TOS := GOODIO;                                                      03868000
                                                                        03870000
SETSTATUS:                                                              03872000
    DMONITOR(DITP,%11,S0 CAT IOQP(QFUNC) (0:9:7), -1);        <<00.05>> 03874000
                                                                        03876000
    DISABLE;                                                            03878000
    DITP(DMONTR).CFAILCNT := 0; << RESET CARRIER FAILURE COUNTER 01.01>>03880000
    IOQP(QSTAT).IOSTAT := TOS;   << SET COMPLETION STATUS >>            03882000
    IOQP.COMPLETED := 1;                                                03884000
    TEMP := IOQP(QSTAT)&PCBS;    << EXTRACT PCB NUMBER >>               03886000
    DITP(DIOQP) := IOQP(QLINK);                                         03888000
    ENABLE;                                                             03890000
                                                                        03892000
    IF LOSTDATA<=IOQP.READERRORS<=PTYERROR THEN                <<00.05>>03894000
      LOGERROR(DITP,IOQP,RDCOUNTER+WRTCOUNTER);                <<00.05>>03896000
                                                                        03898000
    IF IOQPL.IOWAKE THEN                                                03900000
      AWAKE(TEMP*PCBSIZE,IOWAIT&LSL(IOQP.BLOCKED),NOWAIT);              03902000
                                                                        03904000
    X := TEMP;     << TEST PCB NUMBER >>                                03906000
    IF = THEN    << NO PCB I/O, RETURN IOQ AND SYSBUFS >>               03908000
      BEGIN                                                             03910000
        X := IOQP(QADDR);  << CHECK FOR SYSBUF TO BE RETURNED >>        03912000
        IF <> THEN RETURNSYSBUF( X );                                   03914000
        RETURNIOQ(@IOQP);                                               03916000
      END;                                                              03918000
                                                                        03920000
    GOTO AGAIN;  << CHECK FOR FURTHER REQUESTS >>                       03922000
$PAGE                                                                   03924000
                                                                        03926000
   << --------- FILE CLOSE AND DEVICE CLOSE -------------- >>           03928000
                                                                        03930000
FCLOSEL:                                                                03932000
    IF DMODEMP.TMODE=NULL THEN CLEANUP;                                 03934000
    IF NOT DITPL.NEWLINE AND DTYPEP.TTYPE<>HP2631B THEN        <<01469>>03936000
      SENDSYNC(EORSYNC,DITP); << CR, LF >>                     <<01469>>03938000
    GOTO FOPENL;                                               <<01469>>03940000
                                                                        03942000
DCLOSEL:                                                                03944000
    DITP(DSAVE).HSTATE := CLOSED;  << SO NO SOFTKILL >>                 03946000
    DRQSTP.DISCNCT := 1;                                                03948000
MEASUREMENT3:                                                  <<01240>>03950000
  IF MEASURE THEN MMSTAT(235,LDEV,0,0);                        <<01240>>03952000
                                                                        03954000
FOPENL:                                                                 03956000
  IF DTYPEPL.TTYPE=HP2631B THEN                                <<01469>>03958000
    BEGIN                                                      <<01469>>03960000
    NEWFORM := 1;                                              <<01469>>03962000
    IF = THEN BEGIN                                            <<01469>>03964000
      MPXWRITE(CR, DITP);  DELAY(100D);                        <<01469>>03966000
      MPXWRITE(FF, DITP);  DELAY(100D);  END;                  <<01469>>03968000
    END;                                                       <<01469>>03970000
CNTRLDONE:                                                              03972000
    ENABLE;                                                             03974000
    TOS := 0;                                                           03976000
                                                                        03978000
CNTRLDONE1:                                                             03980000
    QWBCTP := TOS;                                                      03982000
    GOTO GOODDONE;                                                      03984000
                                                                        03986000
SETTOL:                                                                 03988000
    DITP(DRTMAX) := QPAR1P;                                             03990000
    GOTO CNTRLDONE;                                                     03992000
                                                                        03994000
INSPDL:                                                                 03996000
OUTSPDL:                                                                03998000
    TOS := DTYPEP.TTYPE;   << GET TERMINAL TYPE >>                      04000000
    TOS := QPAR1P;         << GET NEW SPEED VALUE >>                    04002000
                                                                        04004000
FINDSPEED:                                                              04006000
    TEMP := TOS;    << SAVE REQUESTED SPEED >>                          04008000
    X := MAXSPEED;   << SEARCH SPEED TABLE FOR SPEED >>                 04010000
    DO IF TEMP=SPEED(X) THEN GOTO SPEEDFOUND UNTIL DXBZ;                04012000
    GOTO BADREQUEST;   << SPEED NOT FOUND >>                            04014000
                                                                        04016000
SPEEDFOUND:                                                             04018000
    TOS := X;   << SPEED NUMBER TO TOS >>                               04020000
    IF FUNCTION<>ALLOCATE AND FUNCTION<>ALLOCATEX THEN                  04022000
      BEGIN << RETURN OLD SPEED >>                                      04024000
        TOS := DSPEEDP.INSPEED;                                         04026000
        TOS := DSPEEDP.OUTSPEED;                                        04028000
                                                                        04030000
        IF FUNCTION=OUTSPD THEN ASMB( CAB     );  << SPD # TO TOS >>    04032000
                                                                        04034000
        ASMB( XCH,STAX);   << OLD SPEED # TO X >>                       04036000
        QWBCTP := SPEED( X );  << RETURN OLD SPEED >>                   04038000
      END                                                               04040000
    ELSE TOS := S0;   << DUP NEW SPEED NUMBER >>                        04042000
                                                                        04044000
SETTYPE:                                                                04046000
    SETTERMTYPE( *, *, *, DITP );                                       04048000
    IF <> THEN GOTO BADREQUEST;  << INVALID TYPE OR SPEED >>            04050000
                                                                        04052000
    SETUPCHANNEL;                                                       04054000
    DISABLE;                                                            04056000
    DITP(DSAVE).HSTATE := ONLINE;                                       04058000
    ENABLE;                                                             04060000
    GOTO GOODDONE;                                                      04062000
                                                                        04064000
ECHOONL:                                                                04066000
ECHOOFFL:                                                               04068000
    TOS := (NOT DSPEEDPL).ECHO; << RTN CURRENT STATE >>        <<01.01>>04070000
    DSPEEDP.ECHO := NOT LOGICAL(FUNCTION);  << SET OR RESET >>          04072000
    GOTO CNTRLDONE1;                                                    04074000
                                                                        04076000
BRKOFFL:                                                                04078000
BRKONL:                                                                 04080000
    DSPEEDP.BRKOK := FUNCTION;   << SET OR RESET >>                     04082000
    GOTO CNTRLDONE;                                                     04084000
                                                                        04086000
SSBRKONL:                                                               04088000
SSBRKOFFL:                                                              04090000
    DISABLE;                                                            04092000
    TOS := LPDTD(LDEV);                                                 04094000
    TOS.(SSBREAK':1) := 0;   << CLEAR SUB SYS BRK OCCURRED FLAG >>      04096000
    LPDTD(X) := TOS;                                                    04098000
                                                                        04100000
    DSPEEDP.SSBRKOK := FUNCTION;                                        04102000
    GOTO CNTRLDONE;                                                     04104000
                                                                        04106000
TAPEOFFL:                                                               04108000
TAPEONL:                                                                04110000
    DSPEEDP.TAPEMODE := FUNCTION;                                       04112000
    GOTO CNTRLDONE;                                                     04114000
                                                                        04116000
TIMEOFFL:                                                               04118000
TIMEONL:                                                                04120000
    DTYPEP.TIMEREAD := FUNCTION;                                        04122000
    GOTO CNTRLDONE;                                                     04124000
$PAGE                                                                   04126000
                                                                        04128000
    <<****** FORM TIME OF LAST READ IN 1/100 SECONDS *********>>        04130000
                                                                        04132000
READTIMEL:                                                              04134000
    IF DITP(DRTIME)<>-1 THEN   << VALID TIME, NO OVERFLOW >>            04136000
      BEGIN                                                             04138000
        TOS := DITP(X);   << GET TIME TAKEN TO COMPLETE READ >>         04140000
        GOTO CNTRLDONE1;                                                04142000
      END;                                                              04144000
                                                                        04146000
    TOS := RTOVERFLOW;                                                  04148000
    GOTO CLEARCOUNT;                                                    04150000
                                                                        04152000
PRTYOFFL:                                                               04154000
PRTYONL:                                                                04156000
    DISABLE;                                                            04158000
    IF DITP(DLDEV).NOPTY <>0 THEN  GOTO BADREQUEST;            <<AMS00>>04160000
 <<PARITY CHECKING NOT ALLOWED IF TTYPE IS 8-BIT TTYPE>>       <<AMS00>>04162000
    DITP.PTYCHK := NOT LOGICAL(FUNCTION);                               04164000
    GOTO CNTRLDONE;                                                     04166000
                                                                        04168000
LOGGEDONL:                                                              04170000
    STOPTIMEOUT(LOGONTO,DITP);                                          04172000
    IF DITP(DSAVE).HSTATE=LOGGINGON THEN                                04174000
      DITP(DSAVE).HSTATE := ONLINE;                                     04176000
                                                                        04178000
    IF QPAR1P=SESSION THEN DSPEEDP.BRKOK := 1;                          04180000
    DITP(DMONTR).LOGONTYPE := QPAR1P;                          <<00163>>04182000
MEASUREMENT2:                                                  <<01240>>04184000
  IF MEASURE THEN MMSTAT(234,LDEV,0,0);                        <<01240>>04186000
    GOTO CNTRLDONE;                                                     04188000
                                                                        04190000
ALLOCATEL:                                                              04192000
                                                                        04194000
    X := LOGICAL(QPAR1P) LOR IOQPL(QPAR2); << TEST FOR DEFAULT   00.06>>04196000
    IF = THEN  << USE PRECONFIGURED VALUES >>                  <<00.06>>04198000
      BEGIN                                                    <<00.06>>04200000
        TOS := DLASTP.TERMINALTYPE;                            <<00.06>>04202000
        TOS := SPEED(DLASTP.TERMSPEED);                        <<00.06>>04204000
      END                                                      <<00.06>>04206000
    ELSE                                                       <<00.06>>04208000
      BEGIN                                                    <<00.06>>04210000
        TOS := QPAR1P;  << TERMINAL TYPE >>                    <<00.06>>04212000
        TOS := IOQP(QPAR2);   << SPEED SPECIFICATION >>        <<00.06>>04214000
      END;                                                     <<00.06>>04216000
    IF = THEN GOTO BADREQUEST ELSE GOTO FINDSPEED;                      04218000
                                                                        04220000
    <<---------------- CLEAR FLUSH FLAG THEN WRITE ----------------->>  04222000
                                                                        04224000
CFWRITEL:                                                               04226000
    DITP(DLDEV).FLUSH := 0;                                             04228000
    IF <> THEN DCNTRLP.PRESPLAST := 1;   << FORCE NEWLINE >>            04230000
    IOQP(QFUNC).FUNC := WRITING;                                        04232000
    GOTO AGAIN;  << GO DO WRITE >>                                      04234000
                                                                        04236000
CXECHOON:                                                               04238000
CXECHOOFF:                                                              04240000
    DITP(DLDEV).NO'CX'ECHO := FUNCTION;                                 04242000
    GOTO CNTRLDONE;                                                     04244000
$PAGE                                                                   04246000
                                                                        04248000
SETBMODEL:                                                              04250000
    DISABLE;                                                            04252000
    DMODEMP.BMODE := QPAR1P;                                            04254000
    GOTO CNTRLDONE;                                                     04256000
                                                                        04258000
SETCMODEL:                                                              04260000
    DISABLE;                                                            04262000
    DMODEMP.CMODE := QPAR1P;                                            04264000
    GOTO CNTRLDONE;                                                     04266000
                                                                        04268000
SETPTYL:                                                                04270000
    IF DITP(DLDEV).NOPTY<>0 OR LOGICAL(QPAR1P) > 3 THEN        <<AMS00>>04272000
        GOTO BADREQUEST;                                       <<AMS00>>04274000
 <<PARITY SET FUNC. NOT ALLOWED IF TTYPE IS 8-BIT TTYPE>>      <<AMS00>>04276000
    TOS := DCNTRLP.PARITYBITS;                                          04278000
    DCNTRLP.PARITYBITS := QPAR1P;                                       04280000
                                                                        04282000
    SETUPCHANNEL;                                                       04284000
    GOTO CNTRLDONE1;                                                    04286000
                                                                        04288000
TERMTYPEL:                                                              04290000
    TOS := QPAR1P;        << SET NEW TERM TYPE >>                       04292000
    TOS := DSPEEDP.INSPEED;                                             04294000
    TOS := DSPEEDP.OUTSPEED;                                            04296000
    GOTO SETTYPE;                                                       04298000
                                                                        04300000
GETTERMTYPE:                                                            04302000
    TOS := DTYPEP.TTYPE;   << GET TERMINAL TYPE >>                      04304000
    GOTO CNTRLDONE1;                                                    04306000
                                                                        04308000
RETURNSPD:                                                     <<00.03>>04310000
    TOS := SPEED(DSPEEDP.OUTSPEED);                                     04312000
    GOTO CNTRLDONE1;                                                    04314000
                                                                        04316000
STOPCHARS:                                                              04318000
    DITP(DSTOP) := QPAR1P;    << SET SUB SYS BRK & EOR CHARS >>         04320000
    GOTO CNTRLDONE;                                                     04322000
                                                               <<00.03>>04324000
SETCNTRLA:                                                     <<00.03>>04326000
    DTYPEP.CONSINTRPT := QPAR1P;                               <<00.03>>04328000
    GOTO CNTRLDONE;                                            <<00.03>>04330000
$PAGE                                                                   04332000
                                                                        04334000
    << -------------DATA SET READY SERVICE ------------->>              04336000
                                                                        04338000
DSETRDYL:                                                               04340000
    IF DITP(DSAVE).HSTATE=0 AND LPDT(LDEV*2+1).ACCEPTING<>0 THEN<<0.04>>04342000
      BEGIN                                                             04344000
        DITP(DSAVE).HSTATE := LOGGINGON;                                04346000
        STARTTIMEOUT(LOGONTO,DITP);                                     04348000
      END;                                                              04350000
                                                                        04352000
    IF DMODEMPL&CSL(M202) THEN                                          04354000
      BEGIN   << TURN TERMINAL TO READ STATE >>                         04356000
        DSETCONTROL(WRITING,DITP);                                      04358000
        DSETCONTROL(TRANSMIT,DITP);  << RAISE CA >>                     04360000
        DELAY( 2000 D );   << LET CF RAISE AT TERMINAL >>               04362000
        DSETCONTROL(READING,DITP);                                      04364000
      END;                                                              04366000
                                                                        04368000
    GOTO AGAIN;                                                         04370000
                                                                        04372000
                                                                        04374000
        <<---------- ON LINE SERVICE -------------->>                   04376000
                                                                        04378000
ONLINEL:                                                                04380000
    TEMP := DITP(DSAVE).HSTATE;                                         04382000
    IF = OR TEMP=LOGGINGON THEN   << CHECK FOR DEVICE RECOGNITION >>    04384000
      IF LPDT(LDEV*2+1).DEVREC=0 AND LPDT(X).ACCEPTING<>0 THEN <<00.04>>04386000
        BEGIN                                                           04388000
          DISABLE;                                                      04390000
          LPDT(X).SERVREQ := 1;  << REQUEST DEVREC SERVICE >>           04392000
          LPDT(1) := LPDT(1) + 1;<< BUMP SERVICE REQUEST COUNTER >>     04394000
          ENABLE;                                                       04396000
                                                                        04398000
          SETTERMTYPE(DLASTP.TERMINALTYPE,DITP(DCNT),DITP(X),DITP);     04400000
          IF <> THEN  << CONFIGURE AS UNDEFINED TERMTYPE >>             04402000
            BEGIN                                                       04404000
              SETTERMTYPE(UNDEFINED,DITP(X),DITP(X),DITP);              04406000
              IF <> THEN GOTO DISCNCTL;                                 04408000
            END;                                                        04410000
                                                                        04412000
          SETUPCHANNEL;                                                 04414000
          DITP(DSAVE).HSTATE := LOGGINGON;                              04416000
          STOPTIMEOUT(SPEEDTO,DITP);                                    04418000
          STARTTIMEOUT(LOGONTO,DITP);                                   04420000
          AWAKE(DEVRECPCBP,JUNKWAIT,NOWAIT);                            04422000
        END;                                                            04424000
                                                                        04426000
    GOTO AGAIN;                                                         04428000
$PAGE                                                                   04430000
                                                                        04432000
         <<--------- BREAK ACCEPTED SERVICE ---------------->>          04434000
                                                                        04436000
BREAKL:                                                                 04438000
    BREAKJOB(LDEV,PINWORD.MAINPIN);                            <<DS.06>>04440000
    IF = THEN       << BREAK ACCEPTED, STOP OPERATION >>                04442000
      BEGIN                                                             04444000
        DITP(DLDEV).FLUSH := 1;                                         04446000
        STOPOPERATION(BREAKSTOP);                                       04448000
      END                                                               04450000
    ELSE  RESTARTOPERATION;   << BREAK REFUSED >>                       04452000
    GOTO AGAIN;                                                         04454000
                                                                        04456000
                                                                        04458000
   <<--------CONTROL Y ACCEPTED SERVICE ------------>>                  04460000
                                                                        04462000
SSBREAKL:                                                               04464000
    BREAKSS(LDEV,PINWORD);                                     <<DS.06>>04466000
    IF = AND DMODEMP.TMODE=NULL THEN  << NOT IN A BREAK >>     <<DS.06>>04468000
      BEGIN   << STOP READ/WRITE AND FLUSH REQUESTS >>         <<DS.06>>04470000
        STOPOPERATION(SSBRKSTOP);                              <<DS.06>>04472000
        X := @IOQP;                                            <<DS.06>>04474000
        WHILE <> DO  << SET FLUSH FLAGS >>                     <<DS.06>>04476000
          BEGIN                                                <<DS.06>>04478000
            DISABLE;                                           <<DS.06>>04480000
            IOQP(QMISC).FLUSH := 1;                            <<DS.06>>04482000
            @IOQP := IOQP(QLINK);  << STEP TO NEXT >>          <<DS.06>>04484000
          END;                                                 <<DS.06>>04486000
        GOTO AGAIN;                                            <<DS.06>>04488000
      END;                                                     <<DS.06>>04490000
                                                                        04492000
    RESTARTOPERATION;   << NO CY PIN SO NO SUB SYS BREAK >>             04494000
    GOTO AGAIN;                                                         04496000
$PAGE                                                                   04498000
                                                                        04500000
                                                                        04502000
  <<--------- 202 TURN AROUND TIMED OUT -------->>                      04504000
                                                                        04506000
TURNTOL:                                                                04508000
    STOPTIMEOUT(TURNTO,DITP);                                           04510000
    DISABLE;                                                            04512000
    IF READABORTED OR DITP.DSTATE<>TURN202 THEN GOTO AGAIN;             04514000
    SENDSYNC(NULL,DITP);  << SO ANY INTERRUPTS ARE IGNORED >>           04516000
    ENABLE;                                                             04518000
                                                                        04520000
    DSETCONTROL(READING,DITP);  << RAISE SB AT TERMINAL >>              04522000
    DELAY( 2000 D );  << LET RAISE >>                                   04524000
    SENDSYNC(TURN202,DITP);    << TRY TO WRITE AGAIN >>                 04526000
    GOTO AGAIN;                                                         04528000
                                                                        04530000
    <<-------- HP2640 READ OR WRITE TIME OUT SERVICE ---------->>       04532000
                                                                        04534000
HP2640TOL:                                                              04536000
    STOPTIMEOUT(HP2640TO,DITP);                                         04538000
    CHECKTQUEUE(DITP);  << DEQUEUE THIS AND START ANY WAITING >>        04540000
                                                                        04542000
    TEMP := DITP(DSAVE).HSTATE;                                         04544000
    IF %55&LSR(TEMP) THEN   << A SPEED SENSING TIMEOUT >>               04546000
      BEGIN                                                             04548000
        IF TEMP<=LOGGINGON THEN  << DISCONNECT SPEED SENSING >>         04550000
          BEGIN                                                         04552000
            DITP(DSAVE).HSTATE := TEMP+3;  << SAVE OLD HSTATE >>        04554000
            DSPEEDP.SPDSENSING := 0;                                    04556000
            STARTTIMEOUT(INITTO,DITP);                                  04558000
          END                                                           04560000
        ELSE   << RECONNECT SPEED SENSING >>                            04562000
          BEGIN                                                         04564000
            DSPEEDP.SPDSENSING := 1;                                    04566000
            DITP(DSAVE).HSTATE := TEMP-3;  << RESTORE HSTATE >>         04568000
          END;                                                          04570000
                                                                        04572000
        MPXCONTROL(ECHOOFF,DITP);                                       04574000
        GOTO AGAIN                                                      04576000
      END;                                                              04578000
                                                                        04580000
    DISABLE;                                                            04582000
    X := @IOQP;                                                         04584000
     IF <> OR DBCNTP<>0 THEN    << REQUEST NOT DONE >>         <<01227>>04586000
      BEGIN                                                             04588000
        IF RQSTATE=READING THEN                                         04590000
          BEGIN                                                         04592000
            TEMP := QMISCP.READSTOP;   << BLOCK MODE READ STOPPED? >>   04594000
            IF <> THEN   << BLOCK MODE READ STOP WAS REQUESTED >>       04596000
              BEGIN                                                     04598000
                QMISCP.READSTOP := NULL;                                04600000
                STOPREAD(TEMP);  <<  STOP READ NOW >>                   04602000
              END;                                                      04604000
          END                                                           04606000
        ELSE   << RESTART ANY WAITING WRITES >>                         04608000
          IF (DTYPEP.TTYPE = HP2635A OR                        <<00234>>04610000
             DTYPEP.TTYPE = HP2635B) AND                       <<00234>>04612000
             NOT DMODEMPL&CSL(M202) THEN                       <<00234>>04614000
             BEGIN  <<ASSUME PAPEROUT CONDITION ON HP2635>>    <<00234>>04616000
                STARTTIMEOUT(HP2640TO,DITP);                   <<00234>>04618000
                DITP.ENQACKWAIT := 1;                          <<00234>>04620000
                MPXWRITE(ENQ,DITP);                            <<00234>>04622000
                DITP.PAIR := 1;                                <<00234>>04624000
             END                                               <<00234>>04626000
          ELSE                                                 <<00234>>04628000
             BEGIN                                             <<00234>>04630000
                IF DTYPEPL.TTYPE=HP2631B THEN                  <<01469>>04632000
                  BEGIN  << STATUS REQUEST TIMED OUT >>        <<01469>>04634000
                  IF NOT IOMESSAGE (1,NOTRDYMSG, %10000,       <<01469>>04636000
                  DITP(DLDEV).DLDEVN,,,,,OPCONSOLE) THEN       <<01469>>04638000
                  BEGIN   END; << NO SYSTEM MESSAGE BUFF >>    <<01469>>04640000
                  REQSTAT := 0;                                <<01469>>04642000
                  DRQSTP.STATDONE := 0;                        <<01469>>04644000
                  GOTO DISCNCTL;                               <<01469>>04646000
                  END;                                         <<01469>>04648000
                DITP.ENQACKWAIT := 0;                          <<00234>>04650000
                MPXWRITE(NULL,DITP); <<SEND SYNC CHAR TO GET   <<00234>>04652000
                                     <<WRITE OPERATION GOING>> <<00234>>04654000
             END;                                              <<00234>>04656000
      END;                                                              04658000
                                                                        04660000
    GOTO AGAIN;                                                         04662000
                                                                        04664000
                                                                        04666000
                                                                        04668000
  <<----- INITWAIT, SPEED TIMEOUT AND HANGUP SERVICE ---------->>       04670000
                                                                        04672000
HANGUPTOL:                                                              04674000
    STOPTIMEOUT(HANGUPTO,DITP);                                         04676000
    IF DITP(DSAVE).HSTATE=HANGUPTURN THEN                               04678000
      GOTO HANGUPDSET  << 202 TURN TO READ COMPLETED >>                 04680000
        ELSE GOTO INITCHAN;  << HANG UP WAIT COMPLETED >>               04682000
                                                                        04684000
                                                                        04686000
   <<------- READ OPERATION TIMED OUT SERVICE --------->>               04688000
                                                                        04690000
READTOL:                                                                04692000
    STOPTIMEOUT(READTIMEOUT,DITP);                                      04694000
    DISABLE;                                                            04696000
    DITP(DRTMAX) := 0;  <<  CLEAR TIME OUT REQUEST FLAG >>              04698000
    STOPREAD(READTOSTOP);                                               04700000
    GOTO AGAIN;                                                         04702000
                                                                        04704000
BLOCKTOL:                                                      <<02004>>04706000
    STOPTIMEOUT(BLOCKTIMEOUT, DITP);                           <<02004>>04708000
    DISABLE;                                                   <<02004>>04710000
    DMODEMPL.RDCOUNTED := 0;                                   <<02004>>04712000
    IF <> THEN                                                 <<02004>>04714000
       RDCOUNTER := RDCOUNTER - 1;                             <<02004>>04716000
    STOPREAD(BLOCKTOSTOP);                                     <<02004>>04718000
    GO TO AGAIN;                                               <<02004>>04720000
                                                                        04722000
    <<-------- CARRIER FAILED TIME OUT SERVICE ---------->>             04724000
                                                                        04726000
CFAILTOL:                                                               04728000
    STOPTIMEOUT(CFAILTO,DITP);                                          04730000
                                                                        04732000
    IF NOT DMODEMPL&CSL(M202) THEN GOTO DISCNCTL;              <<00.02>>04734000
                                                               <<00.02>>04736000
    IF DMODEMPL.CB THEN  << CHECK FOR SB >>                    <<00.02>>04738000
      BEGIN IF NOT DMODEMPL.SB THEN GOTO DISCNCTL; END         <<00.02>>04740000
    ELSE IF NOT DMODEMPL.CF THEN GOTO DISCNCTL;                <<00.02>>04742000
                                                               <<00.02>>04744000
    DISABLE;                                                   <<00.02>>04746000
    READABORTED;  << ABORT READ IF REQUESTED >>                <<00.02>>04748000
    ENABLE;                                                    <<00.02>>04750000
                                                               <<00.02>>04752000
    IF DITP.DSTATE=TURN202 THEN  << TRY TO TURN AGAIN >>       <<00.02>>04754000
      BEGIN                                                    <<00.02>>04756000
        DSETCONTROL(TRANSMIT,DITP);  << RAISE CF AT TERMINAL >><<00.02>>04758000
        DELAY( 2000 D );  << WAIT FOR CF TO RAISE >>           <<00.02>>04760000
        MPXWRITE(NULL,DITP);                                   <<00.02>>04762000
      END;                                                     <<00.02>>04764000
                                                               <<00.02>>04766000
    GOTO AGAIN;                                                <<00.02>>04768000
$PAGE                                                                   04770000
                                                                        04772000
           <<-------- DISCONNECT AND HANG UP ---------->>               04774000
                                                                        04776000
LOGONTOL:                                                               04778000
    STOPTIMEOUT(LOGONTO,DITP);                                          04780000
                                                               <<02859>>04782000
                                                               <<02859>>04784000
                                                                        04786000
DISCNCTL:                                                               04788000
                                                               <<02859>>04790000
                                                               <<02859>>04792000
    IF DITP(DSAVE).HSTATE>=HANGUPTURN THEN                              04794000
      GOTO AGAIN;    << CURRENTLY IN A HANGUP SEQUENCE >>               04796000
                                                                        04798000
    DISABLE;                                                   <<00.02>>04800000
    TOS := DITPL LAND %176200;                                 <<01.02>>04802000
    TOS.PAIR := 1;   << RESTORE PAIR FOR NO READING FLAG >>    <<01.02>>04804000
    DITP := TOS;                                               <<01.02>>04806000
    DTYPEP.PAIRCODE := NOTREADING;                             <<01.02>>04808000
    CLEANUP;                                                            04810000
                                                                        04812000
    X := DITP(DRPTR);                                                   04814000
    WHILE <> DO   << RETURN ANY SAVED TBUFS >>                          04816000
      BEGIN                                                             04818000
        TOS := X;   << GET POINTER FOR RETURNTBUF >>                    04820000
        X := WA0(X);     << GET LINK TO NEXT TBUF >>                    04822000
        RETURNTBUF( * );                                                04824000
      END;                                                              04826000
    DITP(DRPTR) := 0;                                                   04828000
                                                                        04830000
    DISABLE;                                                            04832000
    DITP(DLDEV).FLUSH := 0;                                             04834000
                                                                        04836000
    TOS := DSPEEDP;                                                     04838000
    TOS.TAPEMODE := 0;      TOS.ECHO := 1;                              04840000
    TOS.SSBRKOK := 0;       TOS.BRKOK := 0;                             04842000
    DSPEEDP := TOS;                                                     04844000
    DITP(DMONTR).XONWAIT := 0;                                 <<01468>>04846000
                                                                        04848000
    TOS := LPDTD(LDEV);                                                 04850000
    TOS := TOS LAND %173017; << CLEAR EOF,(SS)BRK,& LOGON >>   <<02859>>04852000
    LPDTD(X) := TOS;                                                    04854000
    ENABLE;                                                             04856000
                                                                        04858000
    IF DITP(DSAVE).HSTATE <> CLOSED AND                        <<01132>>04860000
       DITP(DMONTR).LOGONTYPE <> NULL THEN                     <<02859>>04862000
      BEGIN       << KILL MAIN >>                              <<01132>>04864000
        X := PINWORD.MAINPIN*PCBSIZE;                                   04866000
        IF <> THEN    << KILL MAIN PROCESS >>                           04868000
          BEGIN                                                         04870000
            DISABLE;                                                    04872000
            IF PCB(X:=X+PCB9)<0 THEN  << ALIVE >>                       04874000
      << CHANGE FROM SETING SOFTKILL BIT TO ABORTING JOB >>    <<01470>>04876000
      << WILL ABORT ALL I/O ASSOCIATED WITH PROCESS AND  >>    <<01470>>04878000
      << THEN SOFT KILL PROCESS.   3/80 >>                     <<01470>>04880000
              Begin                                            <<01470>>04882000
              Enable;                                          <<01470>>04884000
              TOS := Getsir (JMATsir);                         <<01470>>04886000
              ResetDB (-1);                                    <<01470>>04888000
              TOS := ExchangeDB (JMATdst);                     <<01470>>04890000
              Abortjob (X/PCBsize);                            <<01470>>04892000
              Assemble (ZERO,XCH);                             <<01470>>04894000
              TOS := ExchangeDB (*);                           <<01470>>04896000
              Assemble (PCAL SETSYSDB);                        <<01470>>04898000
              TOS := JMATsir;                                  <<01470>>04900000
              Assemble (DELB,XCH);                             <<01470>>04902000
              Relsir (*,*);                                    <<01470>>04904000
              End;                                             <<01470>>04906000
          END;                                                          04908000
      END;                                                              04910000
                                                                        04912000
    DISABLE;                                                   <<00163>>04914000
    DITP(DMONTR).LOGONTYPE := 0;  <<CLEAR LOGONTYPE  >>        <<00163>>04916000
                                                               <<00163>>04918000
    DITP.UP := 0;                                                       04920000
    IF LDEV=CONSLDEV THEN GO TO INITCHAN1;<<AVOID HANGUP ON CON<<00552>>04922000
                                                                        04924000
    IF (DMODEMP.MTYPE).(14:2)<>0 THEN  << HANG UP DATA PHONE >><<01.01>>04926000
      BEGIN                                                             04928000
        IF DMODEMPL&CSL(M202) THEN                                      04930000
          BEGIN                                                         04932000
            DSETCONTROL(READING,DITP);    << SET 202 TO READ STATE >>   04934000
            TOS := HANGUPTURN;                                          04936000
          END                                                           04938000
        ELSE                                                            04940000
          BEGIN                                                         04942000
                                                                        04944000
HANGUPDSET:                                                             04946000
            DSETCONTROL(HANGUP,DITP);  << HANGUP DSET,CLEAR CD & SA >>  04948000
            TOS := HANGINGUP;                                           04950000
          END;                                                          04952000
                                                                        04954000
        DITP(DSAVE).HSTATE := TOS;                                      04956000
        STARTTIMEOUT(HANGUPTO,DITP);                                    04958000
        GOTO AGAIN;                                                     04960000
      END;                                                              04962000
                                                                        04964000
INITCHAN:                                                               04966000
    DISABLE;                                                            04968000
INITCHAN1:                                                     <<00552>>04970000
    DITP(DMONTR).CFAILCNT := 0; << RESET CARRIER FAILURE COUNTER 01.01>>04972000
    DMODEMP := DMODEMPL LAND %077000;                                   04974000
    << CLEAR PREMPT,NOSYNC,RDCOUNTED,WRTCOUNTED,PRIMED,TMODE,LPLEVEL >> 04976000
    DITP(DSAVE) := 0;  << CLEAR HSTATE >>                               04978000
    DSPEEDP := (DLASTP.TERMSPEED+%140)&LSL(6);  <<SET ECHO & SPD SNS >> 04980000
    IF DMODEMP.MTYPE>3 THEN << NO SPEED SENSING >>             <<01.01>>04982000
      BEGIN                                                    <<01.01>>04984000
        DSPEEDP.SPDSENSING := 0;                               <<01.01>>04986000
        DSPEEDP.INSPEED := DSPEEDP.OUTSPEED;                   <<01.01>>04988000
      END;                                                     <<01.01>>04990000
    IF  DITP(DLDEV).NOPTY <> 0 THEN                            <<AMS00>>04992000
      DCNTRLP.PARITYBITS := 0   <<GENERATE NO PARITY>>         <<AMS00>>04994000
      ELSE                                                     <<AMS00>>04996000
     DCNTRLP.(7:1):= 1;                                        <<AMS00>>04998000
    DTYPEP.TTYPE := DLASTP.TERMINALTYPE;                       <<00.06>>05000000
    ENABLE;                                                             05002000
                                                                        05004000
    X := INITTO;                                                        05006000
    DO STOPTIMEOUT(X,DITP) UNTIL DXBZ; << CLEAN UP ANY TIME OUTS >>     05008000
    INITCHANNEL(DITP);  << INITIALIZE CHANNEL >>                        05010000
    GOTO AGAIN;                                                         05012000
$PAGE                                                                   05014000
                                                                        05016000
   <<----------- INITIATE PTAPE READS ------------>>                    05018000
                                                                        05020000
PTAPEL:                                                                 05022000
    DITPD(DTBF2) := IOQPD(QP1D);    << MOVE DISC BUFFER ADDRESSES >>    05024000
    TOS := @SBUF + IOQP(QADDR);    << POINTER TO 1ST SBUF >>            05026000
    TOS := @SBUF + SBUF(IOQP(X)-1);  << FORM ADDRESS OF 2ND SYSBUF >>   05028000
    DITPD(DTBUFD) := TOS;                                               05030000
                                                                        05032000
    GOTO READSTART;                                                     05034000
                                                                        05036000
                                                                        05038000
   <<---------SPOOLING COMPLETED SERVICE ----------->>                  05040000
                                                                        05042000
SPOOLENDL:                                                              05044000
    X := @IOQP;                                                <<00.05>>05046000
    IF = THEN GOTO AGAIN;  << NO USER REQUEST >>               <<00.05>>05048000
                                                               <<00.05>>05050000
    WRTSPOOLBUF(DITP(DCNT));                                  <<00.06>> 05052000
    QWBCTP := 0;                                               <<00.05>>05054000
    GOTO READDONE1;                                            <<00.05>>05056000
                                                               <<00.05>>05058000
                                                               <<00.05>>05060000
   <<--------- SPOOL BUFFER WRITE OUT SERVICE --------->>      <<00.05>>05062000
                                                               <<00.05>>05064000
SPOOLSWL:                                                      <<00.05>>05066000
    X := @IOQP;                                                <<00.05>>05068000
    IF <> THEN WRTSPOOLBUF(DITP(DHEAD));                       <<00.05>>05070000
    GOTO AGAIN;                                                <<00.05>>05072000
                                                                        05074000
  END;   << TERMIOM >>                                                  05076000
$PAGE "DRIVER LINKAGE AREA"                                             05078000
                                                                        05080000
ASMB(                                                                   05082000
  PCAL TERMIOM;   << MONITOR PLABEL >>                                  05084000
  PCAL HELP;      << NO INITIATOR >>                                    05086000
  CON  0;         << NO COMPLETOR >>                                    05088000
  CON  0;         << USE SYSTEM I/O PROCESS >>                          05090000
                                                                        05092000
  PCAL TERMINIT;  << TERMINAL INITIALIZATION  >>                        05094000
                                                                        05096000
  CON  3;         << THREE INTERRUPT HANDLERS >>                        05098000
  PCAL TIP;                                                             05100000
  PCAL DSET1;                                                           05102000
  PCAL DSET2 );                                                         05104000
                                                                        05106000
                                                                        05108000
END.   << TERMINAL MONITOR CODE SEGMENT >>                              05110000
