$CONTROL USLINIT,MAP                                           <<04836>>00010000
<< TERMRES - MODULE 99 >>                                               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
$TP                                                                     00030000
                                                               <<04836>>00032000
$CONTROL SEGMENT=TERMRES                                                00034000
                                                               <<04836>>00036000
BEGIN                                                          <<04836>>00038000
                                                               <<04836>>00040000
$PAGE "GLOBAL EQUATES"                                                  00042000
  EQUATE                                                                00044000
    WRTBASE   = 23,        << SIO PROG STARTING ADDRESS >>     <<04836>>00046000
    ABORTED   = 5,                                             <<04836>>00048000
    ACK        = 6,         << ASCII ACKNOWLEDGE CHARACTER >>           00050000
    ACTIVE'   = 2,         << MONITOR IS RUNNING AGAINST THIS DEVICE >> 00052000
    BANDWAIT  = 5,         << WAITING FOR LESS TERM ACTIVITY >>         00054000
    BLKDIO    =%200,       << BLOCKED I/O WAIT BIT >>                   00056000
    BLOCKED'  = 5,         << BLOCKED I/O REQUEST >>                    00058000
    BLOCKMODRD= WRTBASE+233,                                            00060000
    BLOCKTIMEOUT= 8,                                           <<04836>>00062000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00064000
    BREAKSTOP = 1,         << READ STOP CODE AFTER BREAK ACCEPTED >>    00066000
    CB'       = 5,         << CLEAR TO SEND, REQST TO SEND DELAYED >>   00068000
    CF'       = 4,         << CARRIER DETECTED IF SET >>                00070000
    CFAILTO   = 1,         << CARRIER FAIL TIME OUT REQUEST >>          00072000
    CMODE'    =11,         << TERMINAL IS IN CONSOLE MODE >>            00074000
    CNTRLA     = 1,         << ASCII CONTROL A CHARACTTER >>            00076000
    CNTRLY     =%31,        << ASCII CONTROL Y CHARACTER >>             00078000
    CR        =%15,                                                     00080000
    CRWAIT    = 1,                                                      00082000
    CRWAITLF  = 2,                                                      00084000
    CSTPADDR  = 0,         << ABSOLUTE ADDR OF CST POINTER >>  <<04836>>00086000
    CY'ETX    = %14403,    << CONTROL Y, ETX >>                <<04836>>00088000
    DBCNT     =12,         << READ,WRITE BYTE COUNTER AND LIMITS >>     00090000
    DBLKTAIL  = 36,                                                     00092000
    DBREAK    =30,         << IOQP TO SAVED BROKEN READ DATA >>         00094000
    DBTIME    = 16,                                            <<04836>>00096000
    DC1'ETX   = %10403,    << DC1 TRIGGER AND ETX CHARACTERS>> <<04836>>00098000
    DC2       =%22,        << 2640 RESPONSE TO DC1(XON) SENT OUT >>     00100000
    DC2PAIR   = 4,                                                      00102000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00104000
    DCNT      = 18,        << COUNT TO UNUSUAL RD/WRT ACTION >>         00106000
    DDLTP     = 4,         << DLT POINTER >>                            00108000
    DELECHO'  = 2,         << ECHO A \ ON CHARACTER DELETION >>         00110000
                           << 0 - NOTHING, 1 - \, 2 - LF, 3 - C'Y >>    00112000
    DHEAD     = 19,        << SYSDB POINTER TO HEAD OF TBUF LIST >>     00114000
    DILTP     = 5,         << ILT POINTER >>                            00116000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00118000
    DLAST     =23,                                                      00120000
    DLINK     = 1,         << POINTER TO NEXT DIT REQUESTING RESOURCE >>00122000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00124000
    DNXTB     = 25,        << TBUF POINTER OF A SAVE TBUF IF NOT 0 >>   00126000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00128000
    DMONTR    = 34,                                                     00130000
    DPNTR     = 21,        << BYTE POINTER TO ACCESS TBUFS >>           00132000
    DRBCT     = 11,        << REQUESTED TRANSFER COUNT IN BYTES >>      00134000
    DRQST     = 6,         << MONITOR SERVICE REQUEST FLAGS >>          00136000
                           << 0 - HANGUPTO    8  - READTO               00138000
                              1 - DISCONNECT  9  - ONLINE               00140000
                              2 - CFAILTO     10 - DSTREADY             00142000
                              3 - TURNTO      11 - LOGONTO              00144000
                              4 - IOERROR     12 - BREAK                00146000
                              5 - IODONE      13 - CONTROL Y            00148000
                              6 - SPOOLEND    14 - CFAIL                00150000
                              7 - SPOOLSW     15 - UNUSED               00152000
                           >>                                           00154000
    DRT3      = 3,         << LAST WORD OF DRT ENTRY >>                 00156000
    DRTMAX    =28,         << MAXIMUM TIME FOR READ TIMEOUT, SECONDS >> 00158000
    DRTIME    =26,         <<  INDEX TO I/O READ TIME >>                00160000
    DRTIMED   =DRTIME/2,   << DOUBLE INDEX TO I/O READ TIME >>          00162000
    DSAVE     =13,         << HOLDS WAITED DSTATE, HSTATE & TURN CHAR >>00164000
    DSIOPC    = 35,                                                     00166000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00168000
    DSTATE'   =12,         << DEVICE STATE                              00170000
                               0 - NULL         %10 - EOR SYNC          00172000
                               1 - WRITING      %11 - WRITE BUF FILL    00174000
                               2 - READING      %12 - SEND XON NEXT     00176000
                               3 - XON WRITE    %13 - DELETE CR         00178000
                               4 - WRITE TURN   %14 - SYNCS OR "!"S     00180000
                               5 - BAND WAIT    %15 - READ DATA ECHO    00182000
                               6 - EOR LF       %16 - START READ        00184000
                               7 - EOR CR       %17 - STOP READ >>      00186000
    DSTOP     = 14,        << SUB SYS BRK AND EOR CHARACTERS >>         00188000
    DSYNC     = 29,        << CR,LF SYNC DATA AND SYNC COUNTER >>       00190000
    DTAIL     = 20,        << SYSDB POINTER TO END OF TBUF LIST >>      00192000
    DTBLK     = 24,        << LINK WORD FOR QUEUED TBUF REQUESTS >>     00194000
    DTANKB    = 33,                                                     00196000
    DTBUF     =18,         << FIRST TBUF POINTER  >>                    00198000
    DTBUFD    = DTBUF/2,   << DOUBLE INDEX TO FIRST TWO TBUF POINTERS >>00200000
    DTRLX     = 31,        << TIME OUR REQUEST TRLX'S >>                00202000
    DTYPE     = 7,         << PAIRCODE, TERMTYPE, HSTATE,TIMER FLAGS>>  00204000
    ECHO'     = 3,         << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00206000
    EORLF     = 6,         << DSTATE - EOR LF IN PROGRESS >>            00208000
    EORSYNC   =%10,                                                     00210000
    ESC       =%33,        << ESC CHARACTER >>                          00212000
    ESCSEQ    = 24,                                                     00214000
    FINISEND  = WRTBASE+121,                                            00216000
    FINREAD   =%17,                                                     00218000
    ICF'55    =4, <<CPU NUMBER OF ICF 55>>                     <<04836>>00220000
    HANGINGUP =  7,        <<MODEM BEING HANGED UP>>           <<04836>>00222000
    HANGUPTURN=  6,        <<LINE BEING TURNAROUND>>           <<04836>>00224000
                                                               <<04836>>00226000
    HP2640X   = 11,        << 2640 WITH NO ECHO ON START READ >>        00228000
    HP2640TO  = 0,         << 2640/44 READ/WRITE TIME OUT REQUEST >>    00230000
    ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>        <<04836>>00232000
    IDITP     = 14,        << BEGINNING OF DITP'S IN ILT >>    <<04836>>00234000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00236000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00238000
    ISIOP     = 8,         << POINTS TO SIO PROGRAM AREA >>    <<04836>>00240000
    JUNKWAIT  = %20,                                                    00242000
    LF'ETX    = %5003,     << LINE FEED, ETX >>                <<04836>>00244000
    LOGGINGON = 2,         << HSTATE LOGGING ON >>                      00246000
    LOGONTO   = 4,         << LOG ON TIME OUT REQUEST TYPE >>           00248000
    LOSTCHAR  = 4,         << MPX NOT SERVICED IN TIME >>               00250000
    LOSTDATA  = 3,         << BUFFER NOT AVAILABLE >>                   00252000
    LYNX'TYPE = %50017,   <<LYNX CHANNEL ID VALUE>>            <<04836>>00254000
    M202'     = 2,         << 202 OR 2002 MODEM >>                      00256000
    M202      =M202'+1,    << CIRCULAR SHIFT COUNT TO GET 202 TO BIT15>>00258000
    MODSIOCNTRL=WRTBASE+154,                                            00260000
    NEWLINE'  = 8,         << LF WAS LAST CHARACTER OUTPUT >>           00262000
    NEWSPECCHAR=WRTBASE+258,<<SIO PROG ADDRESS FOR SPEC CHAR>> <<04836>>00264000
    NODATAYET = 5,                                                      00266000
    NOECHO    = 3,                                                      00268000
    NOIMPEDE  = 0,         << DONT IMPEDE FLAG TO AWAKEIO >>            00270000
    NOPROTOCOL=18, <<TERM TYPE WITHOUT DC1 READ OR ENQ WRITES>><<04836>>00272000
                          <<SET IN 8TH BIT>>                   <<04836>>00274000
    NOTRDYMSG = 11,        << NOT READY LDEV MESSAGE NUMBER >>          00276000
    NOTREADING = 0,         << DEVICE NOT IN READING STATE >>           00278000
    NOSYNC'   = 7,         << 2640 SERIES TERMINAL >>                   00280000
    NOWAIT    = 0,         << DONT WAIT IN WAKE >>                      00282000
    NULL      = 0,                                                      00284000
    NXTNULL   = 3,         <<SIO INTERRUPT CODE IN CPVA1>>              00286000
    NXTCRLF   = 4,                                                      00288000
    NXTRD     = 5,                                                      00290000
    ONLINE    = 1,         << SPEED SENSED AND CAN DO I/O HSTATE >>     00292000
    OPCONSOLE = 0,         << OUTPUT MESSAGE TO OPERATOR >>             00294000
    PAIR'     = 7,         << ESCAPE OR TERMINET XOFF LAST >>           00296000
    PAPOUTMSG = 14,        << CI MSG INDEX FOR PAPER OUT >>    <<04836>>00298000
    PCBSIZE   =16,                                                      00300000
    PREMPTSTOP= 3,         << STOP READ FOR PREMPTIVE REQUEST >>        00302000
    PRETOPOST =%30,        << ADDING A CR/LF IN PRE TO POST SPACING >>  00304000
    PRIMARY   = 1,         << GET ONLY FROM PRIMARY TABLE >>            00306000
    PRIMED'   = 10,        << 2640 READY TO SEND A BLOCK >>             00308000
    PTAPEFUNC =29,         << PAPER TAPE SPOOLING FUNCTION >>           00310000
    PTYERROR  = 5,         << READ PARITY ERROR >>                      00312000
    QFUNC     = 6,         << FUNCTION  >>                              00314000
    QLDEV     = 2,         << LOGICAL DEVICE NUMBER >>                  00316000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00318000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00320000
                  << .(0:8)-READ TO TRLX; .(12:4)-REQUEST STATE>>       00322000
    QPAR1     = 8,         << READ EOF CONTROL; WRITE SPACE CONTROL >>  00324000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00326000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00328000
    RDDATAINSTR=WRTBASE+91,                                             00330000
    RDSPECL   = 2,         <<CPVA2 INTERRUPT CODE>>                     00332000
    RDSTRT    =WRTBASE+43,                                              00334000
    RDINTRPT  =WRTBASE+147,                                             00336000
    RDWAIT    =WRTBASE+76,                                              00338000
    READBINARY= 1,         << BINARY READ IN PROGRESS >>                00340000
    READCMPLTD=%43,        << RSTATE - READ COMPLETED >>                00342000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>               00344000
    READTIMEOUT= 3,        << READ TIME OUT REQUEST TYPE >>             00346000
    READTO    = 6,         << READ TIMED OUT READERRORS CODE >>         00348000
    READWAITING= 5,        << READ WAITING TO START AFTER WRITE DONE >> 00350000
    RESTART'  = 1,         << RESTART WRITE AFTER BUFFER FILL >>        00352000
    REPEATING =%14,        << WRITING SYNC'S OR "!"'S >>                00354000
    REQUEST'  = 3,         << MONITOR SERVICE REQUESTED WHILE ACTIVE >> 00356000
    SECONDARY = 2,         << GET TBUF FROM 2ND IF PRIMARY EMPTY >>     00358000
    RECVOFF   =WRTBASE+50,                                              00360000
    SBUFMAXB  = 256,                                                    00362000
    SENDLF    = 8,         <<CPVA1 CODE TO SEND LF/SYNCS>>     <<04836>>00364000
    SIOBASE   = -46,       << OFFSET FROM INITTCP TO SIO AREA>><<04836>>00366000
    SP'ETX    = %20003,    << SPACE, ETX >>                    <<04836>>00368000
    SPECIALSTOP= 1,        << READ TERMINATED ON SPECIAL STOP CHAR >>   00370000
    SPOOLEND' = 7,         << PTAPE READ COMPLTD SERVICE REQUES<<04836>>00372000
    SPOOLING' = 5,         << PTAPE READ IN PROGRESS >>                 00374000
    SPOOLSW'  = 6,         << PTAPE BUFFER FULL SERVICE REQUEST<<04836>>00376000
    SPSENBAUD =WRTBASE+178,                                             00378000
    SPDSENSIO = 7,         <<SPEEDSENSE SIO PROG ACTIVE DSTATE>>        00380000
    SRQOFF    = WRTBASE+209,                                            00382000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00384000
    STOPPED   =%44,        << READ STOPPED REQUEST STATE >>             00386000
    SYSDB     =%1000,                                                   00388000
    SYNC'CR   = 6,                                                      00390000
    SYNC'LF   = 7,                                                      00392000
    SYNSTRT   =WRTBASE+57,                                              00394000
    SYSINITTCP=%347,       << SYSGLOB OFFSET >>                <<04836>>00396000
    SYSIOQ    = 5,                                                      00398000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00400000
    SYSSBUF   = 6,                                                      00402000
    SYSTBUF   =%16,                                                     00404000
    TAPEMODE' = 0,         << PAPER TAPE READ MODE;NO EDIT RESPONSES >> 00406000
    TBMAXB    = 60,                                                     00408000
    TBQN      = 0,        <<RESOURCE QUEUE# FOR TBUF REQUESTS>>         00410000
                       << BECAUSE THE LIMIT REGISTER IS >>     <<04836>>00412000
                       << UPDATED BY THE FIRMWARE BEFORE>>     <<04836>>00414000
                       << IT GETS TO TICK(SEE TICK PROC >>     <<04836>>00416000
    TERMCHAR' =10,         << TERMINATE INPUT ON STOP CHAR >>           00418000
    THEAD     = 2,         << HEAD INDEX  >>                            00420000
    TOVRFL    = 5,         << OVERFLOW OF PRIMARY TABLE COUNTER >>      00422000
    TRANSERR' = %14,       << IOSTAT ERROR FOR 2631'S >>       <<04836>>00424000
    TRANSMIT  = 4,         << FINSH TURNING 202 TO WRITE STATE >>       00426000
    TRANSMIT' = 5,        << FINISH TURN OF HALF DUPLEX LINE >><<04836>>00428000
    TRQSTS    = 3,         << REQUEST FOR ELEMENTS COUNTER, DOUBLE >>   00430000
    TSIZE     = 1,         << ELEMENT SIZE AND IMPEDED PCB >>           00432000
    TTAIL     = 3,         << INDEX OF LAST ELEMENT  >>                 00434000
    TURN202    = 4,        << DSTATE, TURNING 202 TO READ OR WRITE >>   00436000
    TURNTO     = 2,        << 202 TURN AROUND TIME OUT TYPE >>          00438000
    TUSE      = 4,         << MAX IN USE AND CURRENT IN USE >>          00440000
    UP'       = 1,         << ON LINE,SPEED SENSED AND CAN DO I/O >>    00442000
    WAIT2SIO  = WRTBASE+251,                                            00444000
    WAITED    =%11,        << WRITE/READ/BANDWAIT HELD FOR BREAK >>     00446000
    WAITACK   = 16,        <<CPVA2 INTERRUPT CODE>>                     00448000
    WAITCR    = 14,        <<CPVA2 INTERRUPT CODE>>                     00450000
    WAITC'A   = 18,        <<CPVA2 INTERRUPT CODE>>                     00452000
    WAITING   = 7,        << QMISC STATE FOR WAITED REQ'S >>   <<04836>>00454000
    WAITSPDS  =8,                                                       00456000
    WRITING   = 1,         << DSTATE IS WRITING >>                      00458000
    WRTDATAINSTR=WRTBASE+34,                                            00460000
    WRT'RD    =WRTBASE+66,                                              00462000
    WRT'RD2   = WRTBASE+246,                                            00464000
    WRTSPECL  = 3,                                             <<04836>>00466000
    XMITON    =WRTBASE+5,                                               00468000
    XMITOFF   =WRTBASE+71,                                              00470000
    XON       =%21,                                                     00472000
    XOFF       =%23,        << ASCII CONTROL X CHARACTER >>             00474000
    XOFFTIMEOUT= 9,        << XOFF TIMER REQUEST >>            <<04836>>00476000
  ENDEQ       = 0;                                                      00478000
                                                               <<04836>>00480000
$PAGE "GLOBAL DEFINES"                                                  00482000
  DEFINE                                                                00484000
    ABORTWRT  =( 5:1)#,                                                 00486000
    ABS       = ABSOLUTE#,                                              00488000
    ACTIVE    =(ACTIVE'  :1)#,                                          00490000
    AUTOHANDSH=IOQPL(QPAR2).(9:1)#, << DO VIEWS READ >>        <<04836>>00492000
    BINARYREAD=(11:1)#,    << IF SET THEN XFER 8 BITS ON READ >>        00494000
    ASMB      = ASSEMBLE#,                                              00496000
    BINARY    =(11:2)#,    << IF 0 THEN ASCII ELSE BINARY READ >>       00498000
    BLOCKED   =(BLOCKED':1)#,<< REQUEST WAITS UNTIL COMPLETION >>       00500000
    BLOCKRD   =(10:1)#,                                                 00502000
    BRKRQST   =(12:1)#,                                                 00504000
    CB        =(CB':1)#,                                                00506000
    CBSB      =(CB':2)#,   << CURRENT STATE OF CB AND SB >>             00508000
    CCVALUE   =( 9:1)#,    << OLD CC STATUS KEPT IN DSAVE>>             00510000
    CF        = (CF':1)#,  << CARRIER DETECTED >>                       00512000
    CF'CB'SB  =( 4:3)#,    << HALF DUPLEX STATE >>             <<04836>>00514000
    CFAILCNT  =( 4:6)#,    << CARRIER FAILURE COUNTER >>       <<04836>>00516000
    CFAILTRLX = DITP(32).(0:8)#, << CARRIER FAIL TIMER INDEX>> <<04836>>00518000
    CMODE     =(CMODE':1)#,<< TERMINAL IN CONSOLE MODE >>               00520000
    CONSINTRPT=(11:1)#,    << CONSOLE INTERRUPT OK IF SET >>   <<04836>>00522000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<04836>>00524000
    DELACK    =( 8:1)#,                                                 00526000
    DELECHO   =(DELECHO':2)#,                                           00528000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     00530000
    DISCONNECT=( 1:1)#,    << DISCONNECT SERVICE REQUEST TO TERM >>     00532000
    DOMOD     =( 6:1)#,                                                 00534000
    DONXTMOD  =( 3:3)#,                                                 00536000
    DOSTATREQ  =( 3:1)#,   << REQUEST STATUS AFTER DATA >>     <<04836>>00538000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           00540000
    DMONTRP   = DITP(DMONTR)#,                                 <<04836>>00542000
    DRTNUMBER =(7:9)#,                                         <<04836>>00544000
    DSAVEPL   = DITPL(DSAVE)#,                                 <<04836>>00546000
    DSETREADY =(10:1)#,    << DATA SET READY SERVICE REQUEST TO TERM >> 00548000
    DSTATE    =(DSTATE'  :4)#,                                          00550000
    ECHO      =(ECHO':1)#,                                              00552000
    ECHOON    =( 2:1)#,  <<WHEN RESTART RD, ENABLE ECHO>>               00554000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     00556000
    ENQACKWAIT=(11:1)#,    << 2640 WRITE ENQ/ACK WAIT >>                00558000
    ENQOFFSET =(1:15)#,                                                 00560000
    EORCHAR    =( 8:8)#,    << TRANSPARENT READ EOR CHARACTER >>        00562000
    F         = ABSOLUTE#,                                              00564000
    FILLING   =(14:1)#,    <<IOTERM IS FILLING TBUFS WITH WRT DATA>>    00566000
    FLUSH     =(0:1)#,     << BRK/SSBRK FLUSH IN PROGRESS >>            00568000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   00570000
    HIOP      =CON %20302;CON 1#,                                       00572000
    HIOPWAIT  =( 0:1)#,                                                 00574000
    HP2631B   = (19 <= DITP(DTYPE).TTYPE <= 22)#,              <<04836>>00576000
    HP2631BFX  = (21 <= DITP(DTYPE).TTYPE <= 22)#,             <<04836>>00578000
    HSTATE    =( 4:3)#,    << HANG UP STATE                             00580000
                               0 - HUNGUP       3 - HNGP SPD SNS DISCNCT00582000
                               1 - ONLINE       4 - DCLOSE DISCONNECT   00584000
                               2 - LOGGING ON   5 - LO SPD SNS DISCNCT  00586000
                               6 - HANG UP TURN 7 - HANGING UP >>       00588000
    IDLESIO   =(0:3)#,<<0-RUNSTATUS,1-CHNG STAT,2-PWR RECVRY>>          00590000
    ININ      =(14:1)#,    <<SYSTEM INITIALIZATION FLAG>>      <<04836>>00592000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         00594000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           00596000
                               1 - 240 CPS         5 - 15 CPS           00598000
                               2 - 120 CPS         6 - 10 CPS           00600000
                               3 -  60 CPS         7 - 14 CPS  >>       00602000
    INUSE     =(8:8)#,     << NUMBER OF ELEMENTS CURRENTY IN USE >>     00604000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00606000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           00608000
    LFLAST    =( 1:1)#,                                                 00610000
    LFSYNC    =( 0:4)#,    << NUMBER OF SYNC'S AFTER A LF >>            00612000
    LIMIT1    =(8:8)#,     << PRIMARY TABLE SIZE  >>                    00614000
    MCODE     =(10:6)#,    << MONITORING TO BE DONE CODE >>             00616000
    MODACTIVE =( 6:1)#,    <<INTERF MODEM CONTROL PROG ACTIVE>>         00618000
    MODEM     =( 2:2)#,     << MODEM TYPE NUMBER >>            <<04836>>00620000
    MODCA     =(12:1)#,                                                 00622000
    MODCH     =(14:1)#,                                                 00624000
    MODCBREF  =( 3:1)#,                                                 00626000
    MODCCREF  =( 4:1)#,                                                 00628000
    MODCFREF  =( 6:1)#,                                                 00630000
    MODSBREF  =( 7:1)#,                                                 00632000
    MODCFMSK  =(14:1)#,                                                 00634000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                00636000
                                0 - HARDWIRED   2 - 202C                00638000
                                1 - 103         3 - 2002   >>           00640000
    MSECS'24'DAYS= 2073600000D#,<< MILLISEC IN 24 DAYS>><<01.03>>       00642000
    NEWLINE   =(NEWLINE' :1)#,                                          00644000
    NOSYNC    =(NOSYNC':1)#,<< NO SYNC TERMINAL, USES ENQ AND ACK >>    00646000
    NO'CX'ECHO=( 1:1)#,    << IF SET DONT ECHO !!! ON CONTROL X >>      00648000
    NXTDSTATE =( 9:4)#,    << NEXT DSTATE AFTER 202 TURN AROUND >>      00650000
    OE        =( 5:1)#,                                                 00652000
    OEPE      =( 5:2)#,    <<UART OVERRUN,PTY ERROR STATUS>>            00654000
    OFFLINE   = (13:1)#,   << OF STATUS FROM HP263X >>         <<04836>>00656000
    OWNREAD   =(10:1)#,    << USER DOES OWN DC1/DC2 HANDSHAKING >>      00658000
    PAIR      =(PAIR'    :1)#,                                          00660000
    PAIRCODE  =(12:4)#,    << DENOTES LAST PAIR CHAR INPUT >>           00662000
    PAPEROUT  = (15:1)#,   << STATUS FROM HP263X >>            <<04836>>00664000
    PCBN      =( 0:8)#,    << QSTAT, PCB NUMBER >>                      00666000
    PE        =( 6:1)#,    <<UART PARITY ERROR BIT>>                    00668000
    PTYCHK    =( 9:1)#,                                                 00670000
    PTYON     =( 7:1)#,                                                 00672000
    PTYONODD  =( 7:2)#,    <<PTY ON FLAG; ODD PTY FLAG>>       <<04836>>00674000
    PRIMED    =(PRIMED':1)#,<< 2640 READY TO SEND A BLOCK >>            00676000
    RDCOUNTED =( 8:1)#,    << RDCOUNTER INCREMENTED >>                  00678000
    RDFLUSH   =( 2:1)#,                                        <<04836>>00680000
    READTRLX  =( 8:8)#,    << TRLX FOR READ & LOGON TIME OUTS >>        00682000
    READSTOP  =( 7:3)#,    << IF NOT ZERO THEN STOP READ BECAUSE        00684000
                                 0 - NONE        4 - LOGON TIMED OUT    00686000
                                 1 - BREAK       5 - ABORTED            00688000
                                 2 - PREMPT      6 - NOT USED           00690000
                                 3 - TIMED OUT   7 - NOT USED  >>       00692000
    READERRORS=(10:3)#,    << 0-OK,1-SPECIALSTOP,2-PTY ERR              00694000
                              3-LOST DATA,4-LOST CHAR,5-BREAK >>        00696000
    RESTART   =(RESTART':1)#,                                           00698000
    RESTSPD   =(10:1)#,                                                 00700000
    REQUEST   =(REQUEST':1)#,<< REQUEST FOR SERVICE WHILE ACTIVE >>     00702000
    RIOA      =CON %20302;CON %13#,                            <<04836>>00704000
    RIOC      =CON %20302;CON 2#,                              <<04836>>00706000
    RPLEVEL   =(13:3)#,    << REQUEST PREMPT LEVEL,SEE LPLEVEL  >>      00708000
    RSTATE    =(10:6)#,    << REQUEST STATE -                           00710000
                              0 - NEW       %30 - PRE TO POST TBUF WAIT 00712000
                              1 - STARTED   %31 - PRESPACE TBUF WAIT    00714000
                              2 - READING    32 - WRT DATA TBUF WAIT    00716000
                             43 - RD CMPLTD  33 - POSTSPACE TBUF WAIT   00718000
                             44 - RD STOPPED                            00720000
                              5 - READ WAITING                          00722000
                             %34-%37 SAME A %30-%33 BUT ENQ ADD WAIT    00724000
                           >>                                           00726000
    SB        =( 6:1)#,                                                 00728000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS  00.02>>00730000
    SIOHIOP   =( 2:1)#,                                                 00732000
    SPDFOUND  = ( 9:1)#,   << ON LINE OR SPD SNSE SERVICE REQST >>      00734000
    SPDSENSING=( 4:1)#,                                                 00736000
    SPDSIO    =( 2:1)#,                                                 00738000
    SPOOLEND  =(SPOOLEND':1)#,                                          00740000
    SPOOLING  =(SPOOLING':1)#,                                          00742000
    SPOOLSW   =(SPOOLSW' :1)#,                                          00744000
    SSBRQST   =(13:1)#,                                                 00746000
    SSBRKCHAR  =( 0:8)#,    << TRANSPARENT READ SUB SYS BRK CHARACTER >>00748000
    STARTSIO  =ASMB(CON %20302;CON 0)#,                                 00750000
    STATDONE  = (15:1)#,   << DRQST, STAT REQ COMPLETE >>      <<04836>>00752000
    STATREQ   = DITPL(DSAVE).(13:1)#, << STAT REQ ACTIVE >>    <<04836>>00754000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  00756000
    STOPSIO = ASMB(CON %20302; CON 1)#,                        <<04836>>00758000
    STRTWRT   =(14:1)#,                                                 00760000
    SYNCSTATE =( 4:4)#,    << SAVED INTERRUPT FOR SYNCS >>     <<04836>>00762000
    TAPEMODE  =(TAPEMODE':1)#,                                          00764000
    TERMCHAR  =(TERMCHAR':1)#,                                          00766000
    TERMSPEED =(10:6)#,   <<DEFAULT SPEED>>                    <<04836>>00768000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            00770000
    TESTBIT   = ASSEMBLE(TBC#,                                          00772000
    TIMING    = (0:1)#,    << A TIMED READ IS IN PROGRESS >>            00774000
    TIMEREAD  =( 1:1)#,    << TIME READ OPERATIONS >>                   00776000
    TMODE     =(11:2)#,    << TERMINAL MODE                             00778000
                                 0 - NORMAL   2 - CONSOLE               00780000
                                 1 - BREAK    3 - CONSOLE FROM BREAK >> 00782000
    TRANSERR  = (12:1)#,   << STATUS FROM 2635X >>             <<04836>>00784000
    TURNTOWRITE=( 7:1)#,   << IF SET, 202 TURNING TO WRITE ELSE READ >> 00786000
    UP        =(UP':1)#,   << UNIT IS ON LINE & SPEED SENSED >>         00788000
    WAITEDSTATE=(0:4)#,    << STATE WAITED FOR BREAK >>                 00790000
    WAITXON   =(10:1)#,    <<WRITE HALTED TO WAIT FOR XON>>    <<04836>>00792000
    WIOA      =CON %20302;CON %14#,                            <<04836>>00794000
    WIOC      =CON %20302;CON 3#,                              <<04836>>00796000
    WRTCOUNTED=( 9:1)#,    << WRTCOUNTER INCREMENTED >>                 00798000
    WRTENQ    =( 0:1)#;                                                 00800000
$PAGE "GLOBAL VARIABLE DECLARATIONS"                                    00802000
                                                                        00804000
  <<----------- GENERAL SERVICE VARIABLES ----------------->>           00806000
                                                                        00808000
                                                                        00810000
    LOGICAL SYSUP = DB + %73;  << SYSTEM UP FLAG >>                     00812000
    INTEGER ARRAY ILT(*) = DB;                                          00814000
   ARRAY TDS'DB(*) = DB; <<TO ACCESS TERMINAL DATA SEGMENT>>   <<04836>>00816000
                                                                        00818000
  INTEGER POINTER PS0 = S-0;                                            00820000
  LOGICAL LS0 = S-0, LS1 = S-1;                                         00822000
  INTEGER S0 = S-0, X = X;                                              00824000
                                                                        00826000
    INTEGER ARRAY WA0(*) = DB + 0;                                      00828000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    00830000
                                                                        00832000
                                                                        00834000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               00836000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               00838000
    INTEGER ARRAY IOQ (@) = DB + SYSIOQ ;                               00840000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               00842000
    INTEGER ARRAY TBUF(@) = DB + SYSTBUF;                               00844000
    INTEGER ARRAY SIOP(@) = DB + SYSINITTCP;                   <<04836>>00846000
    << THE SIO PROGRAM AREA FOR PRINTCHAR AND READCHAR IS    >><<04836>>00848000
    << LOCATED 46 WORDS BEFORE THE INITTCP AREA IN BANK 0.   >><<04836>>00850000
    << TO SAVE A SYSGLOB CELL, THE SIO AREA WILL BE ACCESSED >><<04836>>00852000
    << BY USING THE POINTER TO INITTCP(-46) OR SIOP(SIOBASE).>><<04836>>00854000
                                                                        00856000
    INTEGER WRTCOUNTER = DB + %65; << # OF TERMNAL WRITES IN PROGRESS >>00858000
                                                                        00860000
    INTEGER CONSLDEV   = DB + %74;  << SYSTEM CONSOLE LDEV >>           00862000
    INTEGER POWERFAIL  = DB + %72;  << POWERFAIL STATE >>               00864000
    INTEGER PROGENPCBP = DB + %141;  << PROGEN PCB INDEX >>             00866000
    LOGICAL LOGONTIME  = DB + %120; << MAX LOGON TIME IN SECONDS >>     00868000
                                                                        00870000
  <<-------------- MONITORING DECLARATIONS ---------------->>           00872000
                                                                        00874000
    INTEGER DSETB = DB + %66;                                           00876000
    DOUBLE LASTTIMER = DB + %67;                                        00878000
                                                                        00880000
                                                                        00882000
$PAGE "PROCEDURE DECLARATIONS"                                          00884000
                                                                        00886000
  <<---------EXTERNAL PROCEDURE DECLARATIONS ------------->>            00888000
                                                                        00890000
                                                                        00892000
PROCEDURE ABORTTIMEREQ(TRLX);                                           00894000
  VALUE TRLX;   INTEGER TRLX;   OPTION EXTERNAL;                        00896000
                                                                        00898000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       00900000
  VALUE PCBPT, N, WAITF;                                                00902000
  INTEGER PCBPT, N, WAITF;  OPTION EXTERNAL;                            00904000
                                                               <<04836>>00906000
DOUBLE PROCEDURE B08'LOGICAL'DVR(LDEV, QMISC, DSTX, ADDR,      <<04836>>00908000
                                 FNCT, CNT, P1, P2, FLAGS);    <<04836>>00910000
                                                               <<04836>>00912000
VALUE                            LDEV, QMISC, DSTX, ADDR,      <<04836>>00914000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04836>>00916000
                                                               <<04836>>00918000
INTEGER                          LDEV, QMISC, DSTX, ADDR,      <<04836>>00920000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04836>>00922000
                                                               <<04836>>00924000
OPTION EXTERNAL;                                               <<04836>>00926000
                                                               <<04836>>00928000
                                                                        00930000
INTEGER PROCEDURE GETSBUF(TYPE);                                        00932000
  VALUE TYPE;  INTEGER TYPE;                                            00934000
  OPTION EXTERNAL;                                                      00936000
                                                                        00938000
INTEGER PROCEDURE GETIOQ(TYPE);                                         00940000
  VALUE TYPE;   INTEGER TYPE;   OPTION EXTERNAL;                        00942000
                                                                        00944000
INTEGER PROCEDURE RETURNSBUF(PNTR);                                     00946000
  VALUE PNTR;   INTEGER POINTER PNTR;   OPTION EXTERNAL;                00948000
                                                                        00950000
INTEGER PROCEDURE RETURNIOQ(PNTR);                                      00952000
  VALUE PNTR;   INTEGER POINTER PNTR;   OPTION EXTERNAL;                00954000
                                                                        00956000
                                                                        00958000
PROCEDURE HELP;   OPTION EXTERNAL;                                      00960000
                                                                        00962000
PROCEDURE IDLEWAIT (DITP);                                              00964000
  INTEGER ARRAY DITP;                                                   00966000
  OPTION FORWARD;                                                       00968000
                                                                        00970000
PROCEDURE IOIMPEDE(TBASE);                                              00972000
  VALUE TBASE;  INTEGER TBASE;                                          00974000
  OPTION EXTERNAL;                                                      00976000
                                                                        00978000
PROCEDURE LOGERROR(A,B,C);                                              00980000
VALUE A,B,C;                                                            00982000
INTEGER C;                                                              00984000
INTEGER POINTER A,B;                                                    00986000
OPTION EXTERNAL;                                                        00988000
                                                                        00990000
LOGICAL PROCEDURE READ'DEVICE'REG(DRT, REG'NUM);               <<04836>>00992000
VALUE DRT, REG'NUM;                                            <<04836>>00994000
LOGICAL DRT, REG'NUM;                                          <<04836>>00996000
OPTION FORWARD;                                                <<04836>>00998000
                                                               <<04836>>01000000
PROCEDURE WRITE'DEVICE'REG(DRT, REG'NUM, DATA'OUT);            <<04836>>01002000
VALUE DRT, REG'NUM, DATA'OUT;                                  <<04836>>01004000
LOGICAL DRT, REG'NUM, DATA'OUT;                                <<04836>>01006000
OPTION FORWARD;                                                <<04836>>01008000
                                                               <<04836>>01010000
LOGICAL PROCEDURE CHANNEL'ID(LDEV);                            <<04836>>01012000
VALUE LDEV;                                                    <<04836>>01014000
INTEGER LDEV;                                                  <<04836>>01016000
OPTION FORWARD;                                                <<04836>>01018000
                                                                        01020000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QUEUENUMBER);                       01022000
  VALUE LINKINDEX, QUEUENUMBER;   INTEGER LINKINDEX, QUEUENUMBER;       01024000
OPTION EXTERNAL;                                                        01026000
                                                                        01028000
PROCEDURE AWAKEIO( DITP,FLAGS);                                         01030000
  VALUE DITP, FLAGS;                                                    01032000
  INTEGER POINTER DITP;  INTEGER FLAGS;                                 01034000
  OPTION EXTERNAL;                                                      01036000
                                                                        01038000
PROCEDURE SUDDENDEATH(N);                                               01040000
  VALUE N;  INTEGER N;                                                  01042000
  OPTION EXTERNAL;                                                      01044000
                                                                        01046000
DOUBLE PROCEDURE TIMER;     OPTION EXTERNAL;                            01048000
                                                                        01050000
PROCEDURE IOUNIMPEDE(TABLE);                                            01052000
  VALUE TABLE;   INTEGER TABLE;   OPTION EXTERNAL;                      01054000
                                                                        01056000
PROCEDURE STORE'IOQ(IOQP,FLAGS);                                        01058000
  VALUE IOQP,FLAGS;   LOGICAL FLAGS;   POINTER IOQP;                    01060000
  OPTION EXTERNAL;                                                      01062000
                                                                        01064000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               01066000
  VALUE CODE, REQ, TIME;                                                01068000
  INTEGER CODE, REQ;   DOUBLE TIME;                                     01070000
  OPTION EXTERNAL;                                                      01072000
                                                                        01074000
PROCEDURE WAIT(WAITF,WAITTYPE);                                         01076000
  VALUE WAITF, WAITTYPE;                                                01078000
  INTEGER WAITF, WAITTYPE;                                              01080000
  OPTION EXTERNAL;                                                      01082000
                                                                        01084000
$PAGE                                                          <<04836>>01086000
LOGICAL PROCEDURE PRINTCHAR(CHAR);                             <<04836>>01088000
  VALUE CHAR;INTEGER CHAR;                                              01090000
  OPTION FORWARD;                                                       01092000
                                                               <<04836>>01094000
INTEGER PROCEDURE GETDRT(DRT,OFFSET);                          <<04836>>01096000
VALUE DRT,OFFSET;                                              <<04836>>01098000
INTEGER DRT,OFFSET;                                            <<04836>>01100000
OPTION EXTERNAL;                                                        01102000
                                                               <<04836>>01104000
PROCEDURE PUTDRT(DRT,OFFSET,NUM);                              <<04836>>01106000
VALUE DRT,OFFSET,NUM;                                          <<04836>>01108000
INTEGER DRT,OFFSET,NUM;                                        <<04836>>01110000
OPTION EXTERNAL;                                                        01112000
                                                               <<04836>>01114000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<04836>>01116000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<04836>>01118000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<04836>>01120000
   IOTYPE;                                                     <<04836>>01122000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<04836>>01124000
   IOTYPE;                                                     <<04836>>01126000
INTEGER POINTER DITP;                                          <<04836>>01128000
OPTION VARIABLE,EXTERNAL;                                               01130000
                                                               <<04836>>01132000
procedure MPE'TABLE'FULL(TABNUM);                              <<04836>>01134000
value TABNUM;  integer TABNUM;                                 <<04836>>01136000
OPTION EXTERNAL;                                                        01138000
                                                               <<04836>>01140000
PROCEDURE CHECKINDEX(INDX,TB);                                          01142000
  VALUE INDX,TB;   INTEGER INDX;   INTEGER POINTER TB;                  01144000
  OPTION EXTERNAL;                                                      01146000
                                                                        01148000
PROCEDURE ISSUE'HARD'MSG(MSGNO,PARM,FLAGS);                             01150000
  VALUE MSGNO,PARM,FLAGS;                                               01152000
  INTEGER MSGNO,PARM;   LOGICAL FLAGS;   OPTION EXTERNAL;               01154000
                                                                        01156000
                                                                        01158000
                                                                        01160000
$PAGE "AWAKETERMINAL"                                                   01162000
PROCEDURE AWAKETERMINAL(DITP);                                          01164000
  INTEGER ARRAY DITP;                                                   01166000
    OPTION UNCALLABLE,PRIVILEGED;                              <<04836>>01168000
  <<                                                                    01170000
    THIS PROCEDURE SEARCHES THE IOQ LIST OF THE DEVICE SPECIFIED BY     01172000
    DITP AND IF ANY BLOCKED I/O OPERATION IS FOUND, THAT PROCESS IS     01174000
    AWAKENED TO RUN THE TERMINAL MONITOR. IF NO BLOCKED I/O PROCESS     01176000
    IS FOUND, THE SYSTEM I/O PROCESS IS AWAKENED.                       01178000
  >>                                                                    01180000
  BEGIN                                                                 01182000
    X := DITP(DIOQP);                                                   01184000
    WHILE <> DO   << SEARCH FOR A BLOCKED REQUEST >>                    01186000
      IF LOGICAL(WA0(X)).BLOCKED THEN                                   01188000
        BEGIN   << A BLOCKED REQUEST FOUND >>                           01190000
          X := X + QSTAT;   << INDEX TO PCB NUMBER >>                   01192000
          AWAKE(WA0(X).PCBN*PCBSIZE,BLKDIO,NOWAIT);                     01194000
          RETURN;                                                       01196000
        END                                                             01198000
      ELSE X := WA0(X:=X+QLINK);   << STEP TO NEXT IOQ >>               01200000
                                                                        01202000
    AWAKEIO(DITP,NOIMPEDE);                                             01204000
  END;   << AWAKE TERMINAL >>                                           01206000
$PAGE "DMONITOR"                                                        01208000
                                                                        01210000
PROCEDURE DMONITOR(DITP,ID,P1,P2);                                      01212000
  VALUE ID, P1, P2;   INTEGER ID, P1, P2;                               01214000
  INTEGER ARRAY DITP;                                                   01216000
  OPTION PRIVILEGED, UNCALLABLE;                                        01218000
  BEGIN                                                                 01220000
    INTEGER POINTER PS1 = S - 1;                                        01222000
    INTEGER Q0 = Q - 0;                                                 01224000
                                                                        01226000
    TOS := DITP(DMONTR).MCODE;   << SET MNCODE >>              <<04836>>01228000
    TOS := TOS LAND LOGICAL(ID) LAND %70; << CHECK CALLER WITH FLAGS >> 01230000
    IF = THEN RETURN;  << CALLER NOT BEING MONITORED >>                 01232000
                                                                        01234000
    TOS := DSETB;                                                       01236000
    IF = THEN  << GET A SBUF FOR MONITORING >>                          01238000
      BEGIN                                                             01240000
        TOS := GETSBUF(1);   << PRIMARY AREA ONLY >>                    01242000
        ASMB( TEST );   IF = THEN RETURN;   << NONE AVAILABLE >>        01244000
        DSETB := TOS - 1;  << SET BASE TO FIRST WORD OF BUFFER >>       01246000
     END;                                                               01248000
                                                                        01250000
    X := DITP(X).(13:3);   << EXTRACT MONITORING FUNCTION >>            01252000
    ASMB(BR *+1,X;   EXIT 4;   BR CALLHELP;  BR MNTR;   BR HISTO;       01254000
      NOP;     NOP;     NOP;    EXIT 4);                                01256000
                                                                        01258000
CALLHELP:                                                               01260000
    DISABLE;                                                            01262000
    PUSH( Q );   TOS := S0-Q0;   SET( Q );                              01264000
    HELP;                                                               01266000
    SET(  Q );   RETURN;                                                01268000
                                                                        01270000
HISTO:                                                                  01272000
    WA0(DSETB) := WA0(DSETB) + 1;                                       01274000
    TOS := TIMER;   ASMB(DDUP     );                                    01276000
    TOS:=LASTTIMER; ASMB(DSUB);  << DELTA T >>                 <<04836>>01278000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<04836>>01280000
              << THAT TIMER HAS OVERFLOWED    >>               <<04836>>01282000
       TOS:= TOS+MSECS'24'DAYS;                                <<04836>>01284000
    ASMB(DELB);                                                <<04836>>01286000
    IF S0>127 THEN BEGIN  DEL;  TOS := 127;  END;                       01288000
    ASMB(ADAX,INCX);                                                    01290000
    WA0(X) := WA0(X) + 1;  << BUMP THIS TIME SLOT COUNT >>              01292000
    LASTTIMER := TOS;                                                   01294000
    RETURN;                                                             01296000
                                                                        01298000
MNTR:                                                                   01300000
    IF P2=-1 THEN  << USE DEFAULT PARAMETER >>                          01302000
      BEGIN                                                             01304000
        TOS := DITP(DIOQP);   << SET IOQ POINTER >>                     01306000
        TOS := PS0(QMISC);   << Q FLUSH AND REQUEST STATE >>            01308000
        TOS.( 1:6) := DITP(DMODEM);  << PRIMED,TMODE,LPLEVEL >>         01310000
        TOS.( 7:3) := PS1;   << RPLEVEL >>                              01312000
        P2 := TOS;                                                      01314000
      END;                                                              01316000
                                                                        01318000
    TOS := TIMER;   ASMB(DDUP     );                                    01320000
    DISABLE;                                                            01322000
    TOS :=LASTTIMER;                                                    01324000
    ASMB(DSUB);  << DELTA T >>                                 <<04836>>01326000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<04836>>01328000
              << THAT TIMER HAS OVERFLOWED    >>               <<04836>>01330000
       TOS:= TOS+MSECS'24'DAYS;                                <<04836>>01332000
    ASMB(ZROX,XCH,DEL);                                        <<04836>>01334000
    IF <> THEN  BEGIN  DEL;   TOS := %7777;   END                       01336000
    ELSE                                                                01338000
      BEGIN                                                             01340000
        WHILE S0.( 0:6)<>0 DO                                           01342000
          BEGIN   X := X+1;   TOS := TOS&LSR(3);   END;                 01344000
        TOS.( 4:2) := X;                                                01346000
      END;                                                              01348000
    TOS.( 0:4) := ID;                                                   01350000
                                                                        01352000
    TOS := WA0(DSETB);  << GET INDEX >>                                 01354000
    WA0(X) := S0 + 4;  << STEP TO NEXT >>                               01356000
    TOS := TOS.(9:7);  << MOD 128 >>                                    01358000
    ASMB( ADAX,INCX);  << FORM INDEX TO THIS BLOCK >>                   01360000
    WA0(X) := TOS;     << SAVE DELTA T >>                               01362000
    LASTTIMER := TOS;                                                   01364000
    ASMB(LDXA,INCA);  << SAVE INDEX AND BUMP >>                         01366000
    TOS := DITP;                                                        01368000
    TOS.( 0:4) := DITP(DLDEV).( 4:4);  << UNIT >>                       01370000
    TOS.( 4:1) := DITP.PAIR;                                   <<04836>>01372000
    TOS.(10:1) := DITP(DLDEV).FLUSH;                                    01374000
    TOS.( 5:2) := DITP(DMODEM).(CB':2);  << CB, SB >>                   01376000
    TOS.( 7:3) := DITP.(UP':3);  << UP, ACTIVE, REQUEST >>              01378000
    TOS.(11:1) := DITP.BINARYREAD;                                      01380000
    ENABLE;    ASMB(STBX,DELB);   << RESTORE INDEX >>                   01382000
    WA0(X) := TOS;    << SAVE DMODEM >>                                 01384000
    WA0(X:=X+1) := P1;                                                  01386000
    WA0(X:=X+1) := P2;  << FLAG LAST WORD OF BLOCK >>                   01388000
  END;   << DMONITOR  >>                                                01390000
$PAGE "LYNX'PF'CHECK"                                                   01392000
                                                                        01394000
PROCEDURE LYNX'PF'CHECK;                                       <<04836>>01396000
<<  THIS PROCEDURE MUST BE CALLED WHILE THE 'POWER ON'       >><<04836>>01398000
<<  INTERRUPT IS BEING PROCESSED ON THE ICS.  THIS ROUTINE   >><<04836>>01400000
<<  FINDS ANY CONFIGURED LYNX CHANNELS AND FOR EACH FOUND    >><<04836>>01402000
<<  CHANNEL DOES THE FOLLOWING FOR EACH LOGICAL DEVICE       >><<04836>>01404000
<<  CONFIGURED IN THE DATA SEGMENT FOR THE CHANNEL:          >><<04836>>01406000
<<  1. INITIALIZES REGISTERS 0 THRU 6                        >><<04836>>01408000
<<  2. SET THE POWERFAIL FLAG IN ALL THREE DITS              >><<04836>>01410000
<<  3. BUILDS A DUMMY CONTROL PROGRAM (END CONTROL ORDER)    >><<04836>>01412000
BEGIN                                                          <<04836>>01414000
EQUATE                                                         <<04836>>01416000
   PORT'POINTER = 8,                                           <<04836>>01418000
   LYNX'BOARD = %50017,                                        <<04836>>01420000
   CHANNEL'CONFIG = %(16)E,                                    <<04836>>01422000
   ININ'DRT'TRAP = %105401,                                    <<04836>>01424000
   MAX'DMABANK'VALUE = %140377,                                <<04836>>01426000
   END'CNTRL'PRGRM = %177777;                                  <<04836>>01428000
DEFINE                                                         <<04836>>01430000
   LD'PF'FLAG = SYSDB'BASE(TDS'DB(HW'DIT'OFFSET)+8).(12:1)#,   <<04836>>01432000
   INTRRPT'PLABEL = LOGICAL(GETDRT(DRT,2))#,                   <<04836>>01434000
   PD'PF'FLAG = TDS'DB(TDS'DB(HW'DIT'OFFSET+1)+1).(15:1)#,     <<04836>>01436000
   HW'PF'FLAG = TDS'DB(HW'DIT'OFFSET + 5).(1:1)#;              <<04836>>01438000
DOUBLE TDS;                                                    <<04836>>01440000
LOGICAL HW'DIT'OFFSET, TDS'BANK = TDS, TDS'OFFSET = TDS + 1;   <<04836>>01442000
LOGICAL HW'CP'AREA, ILTX'OFFSET, ILT'LOCATION;                 <<04836>>01444000
integer MAX'DRT, I;                                            <<04836>>01446000
INTEGER DRT := 0;                                              <<04836>>01448000
LOGICAL POINTER SYSDB'BASE = 0;                                <<04836>>01450000
                                                               <<04836>>01452000
SUBROUTINE SET'REGISTERS;                                      <<04836>>01454000
BEGIN                                                          <<04836>>01456000
WRITE'DEVICE'REG(DRT,PORT'POINTER,I);                          <<04836>>01458000
WRITE'DEVICE'REG(DRT,0,-1);                                    <<04836>>01460000
WRITE'DEVICE'REG(DRT,1,MAX'DMABANK'VALUE);                     <<04836>>01462000
WRITE'DEVICE'REG(DRT,2,HW'CP'AREA+ TDS'OFFSET);                <<04836>>01464000
WRITE'DEVICE'REG(DRT,3,%100000 LOR TDS'BANK);                  <<04836>>01466000
WRITE'DEVICE'REG(DRT,4,-1);                                    <<04836>>01468000
WRITE'DEVICE'REG(DRT,5,MAX'DMABANK'VALUE);                     <<04836>>01470000
WRITE'DEVICE'REG(DRT,6,0);                                     <<04836>>01472000
END;                                                           <<04836>>01474000
                                                               <<04836>>01476000
MAX'DRT := SYSDB'BASE(%71);                                    <<04836>>01478000
WHILE DRT < MAX'DRT - 7 DO                                     <<04836>>01480000
   BEGIN                                                       <<04836>>01482000
   DRT := DRT + 8;                                             <<04836>>01484000
   ILT'LOCATION := GETDRT(DRT,1) - %1000;  <<SDB relative>>    <<04836>>01486000
   ILTX'OFFSET := SYSDB'BASE(ILT'LOCATION + 13).(9:7)          <<04836>>01488000
                  + ILT'LOCATION + 15;                         <<04836>>01490000
   IF INTRRPT'PLABEL = SYSDB'BASE(ILTX'OFFSET + 5)             <<04836>>01492000
      AND INTRRPT'PLABEL <> ININ'DRT'TRAP                      <<04836>>01494000
      AND READ'DEVICE'REG(DRT, CHANNEL'CONFIG) = LYNX'BOARD    <<04836>>01496000
      THEN BEGIN   <<must be a LYNX>>                          <<04836>>01498000
      TDS'BANK := SYSDB'BASE(ILTX'OFFSET+1);                   <<04836>>01500000
      TDS'OFFSET := SYSDB'BASE(ILTX'OFFSET+2);                 <<04836>>01502000
      TOS := TDS;                                              <<04836>>01504000
      ASSEMBLE( XCHD );                                        <<04836>>01506000
      I := -1;                                                 <<04836>>01508000
      WHILE I < 127 DO   <<at most 128 ports>>                 <<04836>>01510000
         BEGIN                                                 <<04836>>01512000
         HW'DIT'OFFSET := TDS'DB(TDS'DB(1) + LOGICAL(I:= I+1));<<04836>>01514000
         IF HW'DIT'OFFSET <> %177777                           <<04836>>01516000
            THEN BEGIN   <<must reset this device>>            <<04836>>01518000
            LD'PF'FLAG := TRUE;                                <<04836>>01520000
            PD'PF'FLAG := TRUE;                                <<04836>>01522000
            HW'PF'FLAG := TRUE;                                <<04836>>01524000
            HW'CP'AREA := TDS'DB(HW'DIT'OFFSET + 2);           <<04836>>01526000
            TDS'DB(HW'CP'AREA) := END'CNTRL'PRGRM;             <<04836>>01528000
            SET'REGISTERS;                                     <<04836>>01530000
            END;                                               <<04836>>01532000
         END;                                                  <<04836>>01534000
      ASSEMBLE( XCHD );                                        <<04836>>01536000
      DDEL;                                                    <<04836>>01538000
      END;  <<LYNX channel>>                                   <<04836>>01540000
   END;                                                        <<04836>>01542000
END;                                                           <<04836>>01544000
$PAGE "MPXWRITE"                                                        01546000
                                                                        01548000
PROCEDURE MPXWRITE( DATA, DITP);                                        01550000
  VALUE DATA;   INTEGER DATA;                                           01552000
  INTEGER ARRAY DITP;  OPTION PRIVILEGED, UNCALLABLE;                   01554000
  <<                                                                    01556000
     THIS PROCEDURE WRITES THE DATA TO THE MULTIPLEXOR UNIT SPECIFIED BY01558000
     DITP. IF DATA IS NULL, A SYNC IS SENT UNLESS DSTATE IS NULL, THEN  01560000
     NOTHING IS DONE.                                                   01562000
  >>                                                                    01564000
  BEGIN                                                                 01566000
  END;    << MPX WRITE  >>                                              01568000
$PAGE "MPXCONTROL"                                                      01570000
                                                                        01572000
PROCEDURE MPXCONTROL(FUNCTION,DITP);                                    01574000
  VALUE FUNCTION, DITP; INTEGER FUNCTION;                               01576000
  INTEGER POINTER DITP;                                                 01578000
  OPTION UNCALLABLE, PRIVILEGED;                                        01580000
                                                                        01582000
    <<  THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO INITIALIZE AND    01584000
        FOR ECHO CONTROL OF THE MULTIPLEXER BOARD.  IT CLEARS           01586000
        DIAGNOSE IF NOT SPEED SENSING OR SETS IT IF SPEED SENSING       01588000
                                                                        01590000
         FUNC:   -1 - INITIALIZE WRITE CHANNEL                          01592000
                  0 - TURN ECHO OFF                                     01594000
                  1 - TURN ECHO ON IF ECHO ENABLE                       01596000
                  2 - DISABLE INTERRUPTS & TURN ECHO OFF                01598000
    >>                                                                  01600000
  BEGIN                                                                 01602000
  END;   <<  MPX  CONTROL >>                                            01604000
$PAGE "DSETCONTROL"                                                     01606000
PROCEDURE DSETCONTROL(CONTROL,DITP);                                    01608000
VALUE CONTROL;  INTEGER CONTROL;                                        01610000
INTEGER ARRAY DITP;                                                     01612000
OPTION PRIVILEGED, UNCALLABLE;                                          01614000
BEGIN                                                                   01616000
END;                                                                    01618000
$PAGE "GETTBUF"                                                         01620000
INTEGER PROCEDURE GETTBUF(TYPE);                                        01622000
  VALUE  TYPE;   INTEGER TYPE;                                          01624000
  OPTION UNCALLABLE, PRIVILEGED;                                        01626000
                                                                        01628000
  << THIS PROCEDURE GETS AN I/O TABLE ENTRY FROM A PRIMARY OR           01630000
     SECONDARY TABLE, IF THE TABLE IS EMPTY THE CALLER MAY BE           01632000
     IMPEDED IF HE SO SPECIFIES.  RETURNS A SYSDB RELATIVE POINTER TO   01634000
     THE GOTTEN BUFFER.                                                 01636000
                                                                        01638000
     TYPE -   0  - IMPEDE IF PRIMARY TABLE EMPTY                        01640000
              1  - GET FROM PRIMARY ONLY, RETURN 0 IF EMPTY             01642000
              2  - GET FROM PRIMARY OR SECONDARY, RETURN 0 IF BOTH EMPTY01644000
  >>                                                                    01646000
  BEGIN                                                                 01648000
                                                               <<04836>>01650000
    integer TBLNUM    = q+1;   << tbl # being accessed >>      <<04836>>01652000
    integer pointer TBASE = q+2; << ptr to table base >>       <<04836>>01654000
    integer pointer TBASE1= q+3; << base of tbl +/- 1 >>       <<04836>>01656000
    DOUBLE POINTER DTBASE = TBASE;                                      01658000
    LOGICAL POINTER LTBASE = TBASE;                                     01660000
                                                                        01662000
    INTEGER THISPCB = Q+2;   << PCB NUMBER OF CALLER >>                 01664000
                                                                        01666000
                                                                        01668000
    tos := 0;   << tbl 0 is TBUF >>                            <<04836>>01670000
    TOS := @TBUF;    << SET TBASE TO TBUF BASE >>                       01672000
    TOS := S0;  << TBUF LINKS IN ZEROTH ELEMENT >>                      01674000
    TOS := DTBASE(TRQSTS);  << GET REQUEST COUNTER >>                   01676000
    TOS := TOS + 1;  << INCREMENT REQUEST COUNTER >>                    01678000
    IF CARRY THEN ASMB(INCB     );                                      01680000
    DTBASE(X) := TOS;                                                   01682000
                                                                        01684000
L3:                                                                     01686000
    DISABLE;                                                            01688000
    IF TBASE(TUSE).INUSE>=TBASE.LIMIT1 THEN                             01690000
      BEGIN   << PRIMARY TABLE EMPTY >>                                 01692000
       << if first time table overflowed, send message >>      <<04836>>01694000
       tos := TBASE(TOVRFL);                                   <<04836>>01696000
       if = then                                               <<04836>>01698000
         MPE'TABLE'FULL(TBLNUM);                               <<04836>>01700000
       TBASE(TOVRFL) := tos + 1; << inc ovrflow ctr >>         <<04836>>01702000
        IF TYPE = PRIMARY THEN RETURN;  << GET FROM PRIMARY ONLY >>     01704000
        IF < THEN  << IMPEDABLE >>                                      01706000
          BEGIN  IOIMPEDE(@TBASE);  GOTO L3;  END;                      01708000
      END;                                                              01710000
                                                                        01712000
    TOS := TBASE(THEAD);                                                01714000
    IF = THEN RETURN;     << SECONDARY TABLE EMPTY >>                   01716000
                                                                        01718000
    X := S0;          << POINT TO LINK >>                               01720000
    CHECKINDEX(S0,TBASE);                                               01722000
    GETTBUF := TOS + @TBASE;   << FORM SYSDB RELATIVE POINTER >>        01724000
                                                                        01726000
    TOS := TBASE1(X);     << GET LINK OF NEXT ELEMENT >>                01728000
    IF = THEN   << TABLE EMPTY NOW >>                                   01730000
      TBASE(TTAIL) := THEAD+@TBASE-@TBASE1                              01732000
    ELSE                                                                01734000
      TBASE1(X) := 0;     << CLEAR LINK IN  GOTTEN ELEMENT >>           01736000
    TBASE(THEAD) := TOS; << RE LINK REST OF LIST >>                     01738000
                                                                        01740000
    TBASE(TUSE) := TBASE(TUSE) + 1;                                     01742000
    IF LTBASE(X)<LTBASE(X)&LSL(8) THEN << MAX<CURRENT IN USE >>         01744000
      TBASE(X) := TBASE(X) + %400;   << BUMP MAX IN USE >>              01746000
  END;    <<  GETTBUF  >>                                               01748000
$PAGE "RETURNTBUF"                                                      01750000
PROCEDURE RETURNTBUF(PNTR);                                             01752000
  VALUE PNTR;   INTEGER POINTER PNTR;                                   01754000
  OPTION PRIVILEGED, UNCALLABLE;                                        01756000
                                                                        01758000
  << THIS PROCEDURE RETURNS THE ELEMENT POINTED TO BY PNTR AND IF       01760000
     UNIMPEDES ANY WAITING PROCESSES                                    01762000
  >>                                                                    01764000
  BEGIN                                                                 01766000
    DEFINE  SIZE = TBASE(1).(8:8)#,      << SIZE OF TABLE ENT>><<04836>>01768000
            NOOFENTRIES = TBASE&LSR(8)#; << NO. OF ENTRIES >>  <<04836>>01770000
    INTEGER POINTER DITP   = Q+1;                                       01772000
    INTEGER POINTER TBASE  = Q+1;    << POINTS TO BASE OF I/O TABLE >>  01774000
    INTEGER POINTER TBASE1 = Q+2; << TBASE MODIFIED TO ADDR LINKS >>    01776000
                                                                        01778000
    IF TBUF(TTAIL)=(@PNTR-@TBUF)                                        01780000
      OR 1<=PNTR<=@TBUF THEN  << ALREADY IN FREE LIST >>                01782000
        SUDDENDEATH(202);                                               01784000
                                                                        01786000
    TOS := DEQUEUE(DTBLK,TBQN);    << SET DITP >>                       01788000
    ASMB(TEST     );                                                    01790000
    IF > THEN   << A REQUEST FOR A TBUF QUEUED >>                       01792000
      BEGIN                                                             01794000
        DISABLE;                                                        01796000
        X := DITP(DIOQP);  << ANY REQUESTS WAITING >>                   01798000
        IF <> AND WA0(X:=X+QMISC).RSTATE>=PRETOPOST THEN                01800000
          BEGIN  << REQUEST WAITING FOR A TBUF >>                       01802000
            DITP(DNXTB) := @PNTR;                                       01804000
            PNTR := 0;   << CLEAR LINK >>                               01806000
            AWAKETERMINAL(DITP);                                        01808000
            RETURN;                                                     01810000
          END;                                                          01812000
      END;                                                              01814000
                                                                        01816000
    TOS := @TBUF;    <<  SET TBASE  >>                                  01818000
    DELB;  TOS := S0;  << DELETE DITP, TBUF LINK IS WORD 0 >>           01820000
    DISABLE;                                                            01822000
    TBASE(TUSE) := TBASE(TUSE) - 1;                                     01824000
    TOS := @PNTR - @TBASE;  << FORM ELEMENT INDEX >>                    01826000
    CHECKINDEX(S0,TBASE);                                               01828000
    ASMB( DUP,STBX);                                                    01830000
    TBASE1(X) := 0;    << ZERO LINK OF ONE BEING RETURNED  >>           01832000
    X := TBASE(TTAIL);         << INDEX OF LAST ENTRY >>                01834000
    TBASE1(X) := TOS;      << LINK THIS TO LAST >>                      01836000
    TBASE(TTAIL) := TOS;  << SET TAIL POINTER >>                        01838000
                                                                        01840000
    TOS := TBASE(TSIZE).PCBN;    << GET IMPEDED LINK >>                 01842000
    IF <> AND TBASE(TUSE).INUSE<TBASE.LIMIT1 THEN                       01844000
      IOUNIMPEDE(@TBASE);                                               01846000
  END;   <<  RETURNTBUF  >>                                             01848000
$PAGE "MODCONTROL"                                                      01850000
PROCEDURE MODCONTROL (CONTROL, DITP);                                   01852000
  VALUE CONTROL;  INTEGER CONTROL;                                      01854000
  INTEGER ARRAY DITP;                                                   01856000
  OPTION PRIVILEGED, UNCALLABLE;                                        01858000
  <<                                                                    01860000
    THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO THE DSETS TO SET      01862000
    THEM IN THE FOLLOWING STATES:                                       01864000
    CONTROL:  0 - INITIALIZE AND MAKE READY FOR LOGGON                  01866000
              1 - START WRITE TURNAROUND ( LOWER SA )                   01868000
              2 - SET TO READING STATE                                  01870000
              3 - HANG UP                                               01872000
              4 - FINISH WRITE TURNAROUND ( RAISE CA )                  01874000
              5 - TURN HALF DUPLEX LINE, SB HIGH FIRST         <<MODEM  01876000
  >>                                                                    01878000
BEGIN                                                                   01880000
   INTEGER ARRAY CONTRLBYTE(0:5) = PB :=                       <<04836>>01882000
                      << ECHO CA CD CH SA >>                            01884000
      %07,            <<  0   0  1  1  1  >>                            01886000
      %06,            <<  0   0  1  1  0  >>                            01888000
      %07,            <<  0   0  1  1  1  >>                            01890000
      %02,            <<  0   0  0  1  0  >>                            01892000
      %16,            <<  0   1  1  1  0  >>                   <<04836>>01894000
      %16;            <<  0   1  1  1  0  >>                   <<04836>>01896000
   INTEGER ARRAY MODEMSTATUS(0:5) = PB :=                      <<04836>>01898000
              <<REF CB CC CE CF SB;MSK CB CC CE CF SB >>                01900000
      %00050, << 0  0  0  0  0  0   1  0  1  0  0  0  >>                01902000
      %05052, << 0  0  1  0  1  0   1  0  1  0  1  0  >>                01904000
      %15073, << 0  1  1  0  1  0   1  1  1  0  1  1  >>                01906000
      %00040, << 0  0  0  0  0  0   1  0  0  0  0  0  >>                01908000
      %04073, << 0  0  1  0  0  0   1  1  1  0  1  1  >>       <<04836>>01910000
      %04473; << 0  0  1  0  0  1   1  1  1  0  1  1  >>       <<04836>>01912000
   INTEGER MODEMTYPE, SIOADDR, SIOPC;                                   01914000
   LOGICAL POINTER DITPL = DITP;                                        01916000
                                                                        01918000
      IF NOT DITPL.MODACTIVE THEN                              <<04836>>01920000
      BEGIN                                                             01922000
         DISABLE;                                                       01924000
   HALTIO:                                                     <<04836>>01926000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        01928000
         ASMB(HIOP);                                                    01930000
         IF <> THEN BEGIN                                               01932000
                    IF < THEN ASMB(HALT);                               01934000
                    DITP(DCNTRL).HIOPWAIT:=1;                  <<04836>>01936000
                    GOTO HALTIO;                               <<04836>>01938000
                                                               <<04836>>01940000
                                                               <<04836>>01942000
                    END;                                                01944000
         ENABLE;    DITP(DCNTRL).SPDSIO:=0;                             01946000
      END;                                                              01948000
      IF DITPL.MODACTIVE THEN                                           01950000
      BEGIN         <<MODEM CONTROL PROG ALREADY ACTIVE>>               01952000
         TOS:=DITP(DCNTRL);                                             01954000
         TOS.DOMOD:=1;    TOS.DONXTMOD:=CONTROL;  <<SAVE CONTROL CODE>> 01956000
         DITP(DCNTRL):=TOS;                                             01958000
      END                                                               01960000
         ELSE                                                           01962000
      BEGIN                                                             01964000
         SIOPC:=MODSIOCNTRL;                                            01966000
         MODEMTYPE:=DITP(DMODEM).MTYPE;                                 01968000
         TOS:=CONTRLBYTE(CONTROL);                                      01970000
         IF MODEMTYPE=3 THEN TOS.MODCH:=0  <<SET UP 2002 FOR SLOW SPD>> 01972000
            ELSE                                                        01974000
         IF CONTROL=INITDSET AND (MODEMTYPE=1 OR MODEMTYPE=5)  <<04836>>01976000
            THEN TOS.MODCA:=1; <<REG OR NON-SPDSEN 103>>       <<04836>>01978000
         SIOADDR:=WA0(DITP(DILTP)+ISIOP);                               01980000
         WA0(SIOADDR+14):=TOS;   <<PUT CONTROL BYTE INTO BUFFER>>       01982000
         TOS:=MODEMSTATUS(CONTROL);                                     01984000
         IF CONTROL=INITDSET AND (MODEMTYPE=1 OR MODEMTYPE=5)  <<04836>>01986000
            THEN TOS.MODCFMSK:=1;<<ON 103,MONITOR FOR CC,CF=1>><<04836>>01988000
         WA0(SIOADDR+15):=TOS;   <<PUT REF/MSK BYTES INTO BUFFER>>      01990000
         IF CONTROL=INITDSET AND MODEMTYPE=2 THEN                       01992000
         BEGIN       <<202 MODEM,RESET SPEEDSENSE BAUDRATE>>            01994000
            WA0(SIOADDR+SPSENBAUD+11):=-36;                             01996000
            <<190 TO 154:MODSIOCNTRL>>                                  01998000
            WA0(SIOADDR+8).(8:8):=%27;  <<RECV BAUDRATE AT 240CPS>>     02000000
            WA0(SIOADDR+4):=%14400; <<UART CNTRL:8 BITS,NO PTY>>        02002000
            WA0(SIOADDR+RDDATAINSTR+2):=[8/0 ,8/1];                     02004000
            SIOPC:=SPSENBAUD;                                           02006000
            DITP(DCNTRL).SPDSIO := 1;                          <<04836>>02008000
         END;                                                           02010000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        02012000
         X:=GETDRT(S0,DRT3).IDLESIO;                           <<04836>>02014000
         IF <> THEN SUDDENDEATH(209);                          <<04836>>02016000
         DITP.MODACTIVE:=1;                                             02018000
         TOS:=SYSDB+SIOADDR+SIOPC;                                      02020000
         STARTSIO;                                                      02022000
         IF < THEN BEGIN                                       <<04836>>02024000
                   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;     <<04836>>02026000
                   PUTDRT(*,DRT3,0); <<ZERO WORD 3 OF DRT>>    <<04836>>02028000
                   END;                                        <<04836>>02030000
      END;                                                              02032000
END;     <<----------------END OF MODCONTROL------------------->>       02034000
$PAGE "STOPTIMEOUT"                                                     02036000
PROCEDURE STOPTIMEOUT(TYPE,DITP);                                       02038000
  VALUE TYPE;     INTEGER TYPE;                                         02040000
  INTEGER ARRAY DITP;                                                   02042000
  OPTION UNCALLABLE, PRIVILEGED;                                        02044000
  <<                                                                    02046000
    THIS PROCEDURE RETURNS ANY OUTSTANDING TIME OUT REQUEST OF          02048000
    OF THE TYPE IDENTIFIED BY TYPE. IT ALSO CLEARS THE ASSOCIATED       02050000
    REQUEST BIT IN DRQST.                                               02052000
                                                                        02054000
      TYPE:  0 - 2640 READ OR WRITE TIME OUT                            02056000
             1 - CARRIER FAILED TIME OUT                                02058000
             2 - TURN 202 TO WRITE TIMEOUT                              02060000
             3 - READ OPERATION TIMED OUT                               02062000
             4 - LOGON TIMED OUT                                        02064000
             5 - HANGUP TIME OUT                                        02066000
             6 - SPEED SENSING NOT SUCCESSFUL TIME OUT                  02068000
             7 - DISCONNECT SPEED SENSING TIME OUT                      02070000
             8 - BLOCKMODE READ TIME OUT                       <<DM.03  02072000
             9 - XOFF TIME OUT FOR HP2631B                     <<F.001  02074000
  >>                                                                    02076000
  BEGIN                                                                 02078000
    ARRAY TRLXINDEX(0:9) = PB :=                               <<04836>>02080000
      <<  0:7 - NOT USED,  7:6 - BIT TO CLEAR IN DRQST,                 02082000
         13:3 - BYTE OFFSET TO BYTE HOLDING TRLX FROM DTRLX >>          02084000
      [7/0,6/04,3/0],[7/0,6/2,3/2],[7/0,6/03,3/3],[7/0,6/08,3/1],       02086000
      [7/0,6/11,3/1],[7/0,6/0,3/1],[7/0,6/16,3/0],[7/0,6/16,3/0],       02088000
      [7/0,6/14,3/0],[7/0,6/4,3/0];                            <<04836>>02090000
                                                                        02092000
    INTEGER REQUESTBIT;      << BIT TO CLEAR IN DRQST >>                02094000
    INTEGER TRLXOFFSET;      << BYTE OFFSET FOR DTRLX >>                02096000
                                                                        02098000
    REQUESTBIT := TRLXINDEX(TYPE).(7:6);                                02100000
    TRLXOFFSET := TRLXINDEX(TYPE).(13:3);                               02102000
                                                                        02104000
    DISABLE;                                                            02106000
    IF REQUESTBIT<16 THEN << CLEAR BIT IN DRQST >>                      02108000
      BEGIN                                                             02110000
        TOS := DITP(DRQST);                                             02112000
        X := REQUESTBIT;   ASMB( TRBC 0,X );  << CLEAR BIT >>           02114000
        DITP(DRQST) := TOS;                                             02116000
      END;                                                              02118000
                                                                        02120000
    TOS := BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET); << GET TRLX >>         02122000
    BA0(X) := 0;  << CLEAR TO INDICATE RETURNED >>                      02124000
                                                                        02126000
    IF S0 <> 0 THEN                                                     02128000
    ABORTTIMEREQ( * );                                                  02130000
  END;    << STOP TIME OUT >>                                           02132000
$PAGE "STARTTIMEOUT"                                                    02134000
PROCEDURE STARTTIMEOUT(TYPE,DITP);                                      02136000
  VALUE TYPE;    INTEGER TYPE;                                          02138000
  INTEGER ARRAY DITP;                                                   02140000
  OPTION UNCALLABLE, PRIVILEGED;                                        02142000
  <<                                                                    02144000
    THIS PROCEDURE STARTS A TIME OUT REQUEST OF THE TYPE SPECIFIED BY   02146000
    TYPE. IN SOME CASE IF A TIME OUT IS PENDING IT IS STOPPED AND THE   02148000
    NEW REQUEST STARTED, OTHERWISE 	IF A TIMEOUT IS IN PROGRESS NO NEW  02150000
     REQUEST IS STARTED.                                                02152000
  >>                                                                    02154000
  BEGIN                                                                 02156000
    ARRAY TRLXINDEX(0:9) = PB :=                               <<04836>>02158000
      <<  0:1 - IF SET THEN ABORT AND RESTART TIMEOUT                   02160000
          1:6 - TIMEOUT TIME IN SECONDS                                 02162000
          7:6 - TIMEOUT REQUEST CODE TYPE                               02164000
         13:3 - BYTE OFFSET FROM DTRLX TO TRLX STORAGE                  02166000
       >>                                                               02168000
      [1/1,6/10,6/7,3/0],[1/0,6/30,6/1,3/2],                   <<04836>>02170000
      [1/1,6/05,6/2,3/3],[1/0,6/00,6/3,3/1],                            02172000
      [1/0,6/00,6/4,3/1],[1/1,6/05,6/0,3/1],                            02174000
      [1/1,6/01,6/7,3/0],[1/1,6/01,6/7,3/0],                   <<04836>>02176000
      [1/1,6/00,6/9,3/0],[1/1,6/60,6/7,3/0];                   <<04836>>02178000
                                                                        02180000
    INTEGER TRLXOFFSET, REQCODE;                                        02182000
    DOUBLE TIME;                                                        02184000
                                                                        02186000
    TOS := TRLXINDEX(TYPE);  << TEST BIT 0 >>                           02188000
    REQCODE := S0.(7:6);                                       <<04836>>02190000
    TRLXOFFSET := S0.(13:3);                                   <<04836>>02192000
    IF S0 < 0 THEN STOPTIMEOUT(TYPE,DITP)                      <<04836>>02194000
    ELSE IF INTEGER(BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET))<>0   <<04836>>02196000
         THEN RETURN;                                          <<04836>>02198000
                                                               <<04836>>02200000
                                                               <<04836>>02202000
                                                                        02204000
    TOS := TOS.(1:6);  << EXTRACT TIME IN SECONDS >>                    02206000
    IF = THEN  << LOGON OR READ TIMEOUT >>                              02208000
      BEGIN                                                             02210000
        TOS :=      IF TYPE = LOGONTO      THEN LOGONTIME      <<04836>>02212000
               ELSE IF TYPE = READTIMEOUT  THEN DITP(DRTMAX)   <<04836>>02214000
               ELSE IF TYPE = BLOCKTIMEOUT THEN DITP(DBTIME)   <<04836>>02216000
               ELSE 0;                                         <<04836>>02218000
        IF = THEN RETURN;  << NO TIME OUT REQUESTED >>                  02220000
      END;                                                              02222000
    TIME := TOS**1000;  << TIME IN MS >>                                02224000
                                                                        02226000
    TOS := TIMEREQ(REQCODE,@DITP,TIME);                                 02228000
    DISABLE;                                                            02230000
                                                               <<04836>>02232000
    BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET) := TOS                <<04836>>02234000
                                                               <<04836>>02236000
  END;   << START TIME OUT >>                                           02238000
                                                                        02240000
$PAGE "PRINTPFMSG"                                             <<04836>>02242000
PROCEDURE PRINTPFMSG (MSG,WORDS);                                       02244000
VALUE MSG,WORDS;  DOUBLE MSG;                                           02246000
INTEGER WORDS;                                                          02248000
OPTION UNCALLABLE, PRIVILEGED;                                          02250000
BEGIN                                                                   02252000
INTEGER POINTER DITP, DLTP;                                    <<04836>>02254000
   INTEGER DRTN, COUNT, SIOADDR;                                        02256000
                                                                        02258000
   @DITP:=LPDT( (CONSLDEV)&LSL(1) );                                    02260000
   DRTN:=WA0( DITP(DILTP)+ICNTRL ).DRTNUMBER;                  <<04836>>02262000
                                                               <<04836>>02264000
   << Call new procedure to print out msg instead of WRITE2 >> <<04836>>02266000
   ISSUE'HARD'MSG(2,0,4);  << Do HARD I/O to console >>        <<04836>>02268000
                                                               <<04836>>02270000
 IF CHANNEL'ID(CONSLDEV) = LYNX'TYPE                           <<04836>>02272000
   THEN BEGIN   <<CALL LYNX DRIVER INITIALIZATION PROCEDURE>>  <<04836>>02274000
   @DLTP := DITP(DDLTP);                                       <<04836>>02276000
   TOS := 0;     <<SPECIAL PARAMETER FOR DRIVER INIT PROC>>    <<04836>>02278000
   TOS := DLTP(7);            <<PLABEL>>                       <<04836>>02280000
   IF <> THEN ASSEMBLE ( PCAL 0 ) ELSE DDEL;  <<DRIVER INIT>>  <<04836>>02282000
   END                                                         <<04836>>02284000
  ELSE BEGIN <<ADCC>>                                          <<04836>>02286000
   IF DITP.DSTATE<>WRITING THEN IDLEWAIT(DITP)                          02288000
      ELSE                                                              02290000
   BEGIN      <<FLUSH REMAINING DATA IN TANKED TBUFS>>                  02292000
      SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                  02294000
      IF WA0(SIOADDR+WRTDATAINSTR+1)<>0 THEN                            02296000
         COUNT:=XMITON                                                  02298000
         ELSE                                                           02300000
     BEGIN                                                              02302000
      DITP.ENQACKWAIT := 0;                                    <<04836>>02304000
      STOPTIMEOUT(HP2640TO,DITP);                              <<04836>>02306000
      WA0(SIOADDR+WRTDATAINSTR+5):=[8/1,1/1,7/1];                       02308000
      WA0(X:=X+1):=1;  <<TBEMPTY INTERRUPT CODE>>                       02310000
      COUNT:=WRTDATAINSTR+5; <<START AT INTERRUPT/HALT>>                02312000
     END;                                                               02314000
      TOS:=DRTN;                                                        02316000
      TOS:=SYSDB+SIOADDR+COUNT;                                         02318000
      STARTSIO;  <<FAKE A TBUF EMPTY INTERRUPT TO CONTINUE WRITE>>      02320000
      IF < THEN PUTDRT(DRTN,DRT3,0);                           <<04836>>02322000
   END;                                                                 02324000
  END;       <<ADCC>>                                          <<04836>>02326000
END;                                                                    02328000
$PAGE "SETREADERROR"                                                    02330000
PROCEDURE SETREADERROR(IOQP,ENUMB);                                     02332000
  VALUE ENUMB;   INTEGER ENUMB;                                         02334000
  INTEGER ARRAY IOQP;    OPTION PRIVILEGED, UNCALLABLE;                 02336000
  BEGIN                                                                 02338000
    X := @IOQP;                                                         02340000
    IF <> AND IOQP.READERRORS<ENUMB AND IOQP(QMISC).RSTATE=    <<04836>>02342000
       READING THEN                                            <<04836>>02344000
      IOQP.READERRORS := ENUMB;                                         02346000
  END;                                                                  02348000
$PAGE "BREAKOK"                                                         02350000
LOGICAL PROCEDURE BREAKOK(DITP);                                        02352000
  VALUE DITP;   POINTER DITP;                                           02354000
  OPTION UNCALLABLE, PRIVILEGED;                                        02356000
                                                                        02358000
  <<  RETURNS TRUE IF BREAK/SUB SYS BREAK ENABLE AND NOT ALREADY IN     02360000
       BREAK/SUB SYS BREAK MODE AND NOT IN CONSOLE MODE >>              02362000
                                                                        02364000
  BEGIN                                                                 02366000
    ENTRY SSBREAKOK;                                                    02368000
    INTEGER TYPE = Q+1;                                                 02370000
                                                                        02372000
    TOS := BREAK';   << BIT POSITION FOR BREAK >>                       02374000
    GOTO L1;                                                            02376000
                                                                        02378000
SSBREAKOK:                                                              02380000
    TOS := SSBREAK';   <<  BIT POSITION FOR SUB SYS BREAK  >>           02382000
                                                                        02384000
L1:                                                                     02386000
    IF NOT DITP(DMODEM).CMODE AND NOT DITP(X).RDCOUNTED THEN            02388000
      IF DITP.DSTATE <= WRTSPECL OR                            <<04836>>02390000
         DITP.DSTATE = REPEATING OR                            <<04836>>02392000
         DITP.DSTATE = BANDWAIT THEN                           <<04836>>02394000
        BEGIN                                                           02396000
          TOS := DITP(DSPEED);                                          02398000
          X := TYPE;    ASMB( TBC 1,X );                                02400000
          IF <> THEN  << BREAK/SSBREAK ENABLED >>                       02402000
            BEGIN                                                       02404000
              TOS := DITP(DLDEV);                                       02406000
              IF TYPE=BREAK' THEN  << CHECK THE FLUSH FLAG >>           02408000
                TOS := TOS.FLUSH                                        02410000
              ELSE  << SUB SYS BREAK  >>                                02412000
                BEGIN   << CHECK IF ALREADY SET >>                      02414000
                  TOS := LPDTD(TOS.LDEVN);                              02416000
                  TOS := TOS.(SSBREAK':1);                              02418000
                END;                                                    02420000
                                                                        02422000
              IF NOT TOS THEN   << FLAG WAS NOT SET >>                  02424000
                BREAKOK := TRUE;                                        02426000
            END;                                                        02428000
        END;                                                            02430000
  END;   << ESCAPE OK   BREAK OK  >>                                    02432000
$PAGE "DOCRLFSYNC"                                                      02434000
                                                                        02436000
PROCEDURE DOCRLFSYNC (LFONLY,CPVACODE,DITP);                            02438000
VALUE LFONLY, CPVACODE;                                                 02440000
LOGICAL LFONLY;                                                         02442000
INTEGER CPVACODE;                                                       02444000
INTEGER ARRAY DITP;                                                     02446000
OPTION PRIVILEGED, UNCALLABLE;                                          02448000
BEGIN                                                                   02450000
   INTEGER SIOADDR, COUNT:=0;                                  <<04836>>02452000
   LOGICAL CRNOTDONE:=FALSE;                                   <<04836>>02454000
                                                                        02456000
   SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                     02458000
   DITP(DLDEV).SYNCSTATE := CPVACODE; <<SAVE INTERRUPT CODE >> <<04836>>02460000
   X:=SIOADDR+12;                                                       02462000
   WA0(X):=0;    <<PUT SYNC BYTES INTO BUFFER AREA>>                    02464000
   WA0(X:=X+1):=0;                                                      02466000
   WA0(X:=X+1):=0;                                                      02468000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRT DATA INSTR>>     <<04836>>02470000
   WA0(X:=X+1):=COUNT;                                         <<04836>>02472000
   WA0(X:=X+1):=1;                                             <<04836>>02474000
   WA0(X:=X+1):=[1/1,1/1,1/1,13/0];  <<START FROM RIGHT BYTE>> <<04836>>02476000
   WA0(X:=X+1):=SYSDB+SIOADDR+11;    <<ADDR OF CR/SYNC/LF>>    <<04836>>02478000
   WA0(X:=X+1):=[8/1,1/1,7/1];       <<INTERRUPT/HALT>>        <<04836>>02480000
   WA0(X:=X+1):=CPVACODE; <<PUT IN INTERRUPT CODE>>            <<04836>>02482000
                                                               <<04836>>02484000
   IF NOT LFONLY THEN                                                   02486000
   BEGIN                                                                02488000
      WA0(SIOADDR+11).(8:8):=%15;   <<PUT CR BYTE INTO BUFFER>>         02490000
      TOS:=DITP(DSYNC).CRSYNC;                                          02492000
      IF S0 > 7 THEN TOS:=(TOS-6)*5;                                    02494000
      IF S0 > 6 THEN                                           <<04836>>02496000
      BEGIN                                                             02498000
         TOS:=TOS-6;                                           <<04836>>02500000
         DITP(DSYNC).SCOUNT:=TOS;                                       02502000
         COUNT:=7;   <<ADD 1 MORE TO INCLUDE CR BYTE>>         <<04836>>02504000
         WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'CR;<<INTRRPT CODE>> <<04836>>02506000
         RETURN;                                               <<04836>>02508000
      END                                                      <<04836>>02510000
         ELSE                                                           02512000
      COUNT:=TOS+1;   <<INCLUDE CR BYTE IN WRITE COUNT>>                02514000
   END;                                                                 02516000
   IF COUNT < 7 THEN                                           <<04836>>02518000
   BEGIN                                                                02520000
      IF LOGICAL(COUNT) THEN                                            02522000
         WA0(SIOADDR+12+COUNT&LSR(1)).(0:8):=%12                        02524000
         ELSE         <<PUT IN LF BYTE>>                                02526000
         WA0(SIOADDR+11+COUNT&LSR(1)).(8:8):=%12;                       02528000
         COUNT:=COUNT+1;  <<INCLUDE LF>>                       <<04836>>02530000
      TOS:=DITP(DSYNC).LFSYNC;                                          02532000
      IF S0>7 THEN TOS:=(TOS-6)*5;                                      02534000
      IF (S0+COUNT) > 7 THEN                                   <<04836>>02536000
      BEGIN                                                             02538000
         TOS:=TOS-( 7-COUNT);  <<REMAINING SYNCS TO OUTPUT>>   <<04836>>02540000
         DITP(DSYNC).SCOUNT:=TOS;                                       02542000
         WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;<<INTRRPT CODE>> <<04836>>02544000
         COUNT:=7;                                             <<04836>>02546000
      END                                                               02548000
         ELSE                                                           02550000
         COUNT:=COUNT+TOS;     <<TOTAL BYTES TO OUTPUT>>                02552000
   END                                                         <<04836>>02554000
      ELSE                                                     <<04836>>02556000
      WA0(SIOADDR+WRTDATAINSTR+6):=SENDLF;<<NO ROOM FOR LF>>   <<04836>>02558000
                                                               <<04836>>02560000
   WA0(SIOADDR+WRTDATAINSTR+1) := COUNT;                       <<04836>>02562000
                                                               <<04836>>02564000
                                                               <<04836>>02566000
                                                               <<04836>>02568000
                                                               <<04836>>02570000
                                                               <<04836>>02572000
                                                               <<04836>>02574000
                                                               <<04836>>02576000
END;      <<-------------------END OF DOCRLFSYNC---------------->>      02578000
$PAGE "SENDCRLF"                                                        02580000
PROCEDURE SENDCRLF(INTRPTCODE,DITP);                                    02582000
VALUE INTRPTCODE;   INTEGER INTRPTCODE;                                 02584000
INTEGER ARRAY DITP;                                                     02586000
OPTION PRIVILEGED, UNCALLABLE;                                          02588000
BEGIN                                                                   02590000
  LOGICAL POINTER DITPL = DITP;                                         02592000
  INTEGER TEMP;                                                         02594000
                                                                        02596000
  DITP.NEWLINE:=1;        <<CARRIAGE IS AT A NEW LINE>>                 02598000
  IF DITP(DMODEM).MODEM <> 0 AND NOT DSAVEPL.CCVALUE THEN      <<04836>>02600000
     BEGIN << MUST BE FROM HIOTERM0; DO NXTNULL >>             <<04836>>02602000
     DITP.DSTATE := NULL;                                      <<04836>>02604000
     IDLEWAIT(DITP);                                           <<04836>>02606000
     RETURN;                                                   <<04836>>02608000
     END;                                                      <<04836>>02610000
  TEMP:=WA0(DITP(DILTP)+ISIOP);                                         02612000
                                                                        02614000
  IF NOT DITPL(DMODEM).NOSYNC THEN DOCRLFSYNC(0,INTRPTCODE,    <<04836>>02616000
     DITP)  ELSE                                               <<04836>>02618000
  BEGIN                                                        <<04836>>02620000
                                                                        02622000
  WA0(TEMP+WRTDATAINSTR):=[8/4,8/0]; << WRITE DATA INST. >>    <<04836>>02624000
  WA0(X:=X+1):=2;                 <<WRITE OUT 2 BYTES>>                 02626000
  WA0(X:=X+1):=1;                                                       02628000
  WA0(X:=X+1):=[1/1,1/1,1/1,13/0];  <<START FROM RIGHT BYTE>>           02630000
  WA0(X:=X+1):=SYSDB+TEMP;        <<BUFFER ADDR FOR CR/LF>>             02632000
  WA0(X:=X+1):=[8/1,1/1,7/1];     <<INTERRUPT/HALT>>                    02634000
  WA0(X:=X+1):=INTRPTCODE;        <<PUT IN SIO PROG INTERRUPT CODE>>    02636000
  END;                                                         <<04836>>02638000
  TOS:=DITP(DMODEM)&CSL(M202);                                          02640000
  IF TOS AND DITP(DMODEM).CBSB <> 3 THEN                                02642000
  BEGIN      <<202 NOT IN WRITE STATE>>                                 02644000
     STARTTIMEOUT(TURNTO,DITP);                                         02646000
     MODCONTROL(WRITING,DITP);                                          02648000
     DITP(DSAVE).TURNTOWRITE:=1;                                        02650000
     DITP(DCNTRL).NXTDSTATE:=DITP;                                      02652000
     DITP.DSTATE:=TURN202;                                              02654000
     DITP(DSIOPC) := SYSDB+TEMP+XMITON;                        <<04836>>02656000
  END                                                                   02658000
     ELSE                                                               02660000
  BEGIN                                                                 02662000
  TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                               02664000
  X:=GETDRT(S0,DRT3).IDLESIO;                                  <<04836>>02666000
  IF <> THEN SUDDENDEATH(209);                                 <<04836>>02668000
  TOS := SYSDB+TEMP+XMITON;                                    <<04836>>02670000
  STARTSIO;                                                             02672000
  IF < THEN BEGIN                                              <<04836>>02674000
            TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;            <<04836>>02676000
            PUTDRT(*,DRT3,0);                                  <<04836>>02678000
            END;                                               <<04836>>02680000
  END;                                                                  02682000
END;                                                                    02684000
$PAGE "IDLEWAIT"                                                        02686000
PROCEDURE IDLEWAIT (DITP);                                              02688000
INTEGER ARRAY DITP;                                                     02690000
OPTION PRIVILEGED, UNCALLABLE;                                          02692000
BEGIN                                                                   02694000
   INTEGER SIOADDR, SIOPC ;                                             02696000
   LOGICAL POINTER DITPL=DITP;                                          02698000
   SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                     02700000
                  WA0(SIOADDR+4):=%14400;<<UART CNTRL:8 BITS,NO PTY>>   02702000
                  WA0(X:=X+1):=%6014;  <<NO ECHO,CA ON,CD ON>>          02704000
                  WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0];                  02706000
                  WA0(X:=X+1):=1;                                       02708000
                  WA0(X:=X+2):=[1/1,1/1,4/1,10/0];                      02710000
                  WA0(X:=X+1):=SYSDB+SIOADDR+10;                        02712000
                  IF DITP(DLDEV).DLDEVN=CONSLDEV.DLDEVN THEN            02714000
                  BEGIN                                                 02716000
                     IF NOT DITPL.UP THEN                      <<04836>>02718000
                     BEGIN                                     <<04836>>02720000
                        WA0(SIOADDR+RDDATAINSTR+2):=[8/0,8/1]; <<04836>>02722000
                                                               <<04836>>02724000
                     END                                       <<04836>>02726000
                     ELSE WA0(SIOADDR+RDDATAINSTR+2):=[8/%361,8/1];     02728000
                     <<NON-SPECL CHAR,JMP OF -15 TO WAIT SRQ>>          02730000
                     WA0(X:=X+4):=WAITC'A;                              02732000
                                                                        02734000
                  END                                                   02736000
                     ELSE                                               02738000
                  BEGIN                                                 02740000
                                                               <<04836>>02742000
                     WA0(SIOADDR+RDDATAINSTR+2):=IF NOT DITPL.UP THEN   02744000
                        [8/0 ,8/1]   <<JMP TO INTERRUPT/CODE=8>>        02746000
                        ELSE [8/%361,8/1];  <<-15 BACK TO WAIT SRQ>>    02748000
                     <<JMP OF 51 TO INTERRUPT/CODE=8>>                  02750000
                     WA0(X:=X+4):=WAITSPDS;                             02752000
                                                                        02754000
                  END;                                                  02756000
     WA0(SIOADDR+8).(8:8):=%27; <<DEFAULT SPEED AT 240 CPS>>   <<04836>>02758000
     X:=DITP(DMODEM).MTYPE;                                    <<04836>>02760000
     IF X=4 OR X=5 THEN WA0(SIOADDR+8).(12:4):=                <<04836>>02762000
                      DITP(DLAST).TERMSPEED; <<DEFAULT SPD>>   <<04836>>02764000
     SIOPC:=SPSENBAUD;                                                  02766000
     IF DITPL(DMODEM)&CSL(M202) THEN                                    02768000
     BEGIN                                                              02770000
        IF DITPL.UP THEN SIOPC:=XMITOFF                                 02772000
           ELSE WA0(SIOADDR+SPSENBAUD+11):=-119; <<190 TO 71:XMITOFF>>  02774000
     END                                                                02776000
        ELSE                                                            02778000
        IF DITPL.UP THEN SIOPC:=WRT'RD                                  02780000
           ELSE WA0(SIOADDR+SPSENBAUD+11):=-124; <<190 TO 66:WRT'RD>>   02782000
     DITP(DCNTRL).SPDSIO:=1;                                            02784000
     TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                            02786000
     TOS:=SYSDB+SIOADDR+SIOPC;                                          02788000
     STARTSIO;    <<START SPEED SENSE OR IDLE WAIT PROG>>               02790000
     IF < THEN BEGIN                                           <<04836>>02792000
               TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;         <<04836>>02794000
               PUTDRT(*,DRT3,0);  <<ZERO WORD 3 OF DRT>>       <<04836>>02796000
               END;                                                     02798000
END;              <<----------------END OF IDLEWAIT------------->>      02800000
$PAGE "STATREQUEST"                                                     02802000
PROCEDURE STATREQUEST(DITP);                                   <<04836>>02804000
INTEGER ARRAY DITP;                                            <<04836>>02806000
OPTION PRIVILEGED, UNCALLABLE;                                 <<04836>>02808000
                                                               <<04836>>02810000
<< PROCEDURE WILL SET UP ADCC TO FIRST WRITE OUT 3 BYTE ESC >> <<04836>>02812000
<< SEQ TO REQUEST STATUS FROM 2631B.  IT WILL THEN JUMP TO  >> <<04836>>02814000
<< IDLE WAIT CHANEL PROGRAM TO WAIT FOR STATUS REPLY.  ADCC >> <<04836>>02816000
<< MUST BE ABLE TO HANDLE DC1'S OR DC3'S FROM THE PRINTER   >> <<04836>>02818000
<< WHILE REQUESTING STATUS.    >>                              <<04836>>02820000
  BEGIN                                                        <<04836>>02822000
                                                               <<04836>>02824000
  ARRAY ESCQMDC1(0:1)=PB := %15477, %10400; <<ESC, ?, DC1, 0>> <<04836>>02826000
  LOGICAL SIOADDR, CSP, BANKNUM, BANKOFFSET;                   <<04836>>02828000
  ARRAY DITPL(*)=DITP;                                         <<04836>>02830000
                                                               <<04836>>02832000
                                                               <<04836>>02834000
  << STOP IDLE WAIT OR SPEED SENSE PROG >>                     <<04836>>02836000
   DISABLE;                                                    <<04836>>02838000
   DITP(DLDEV).DOSTATREQ := 0;                                 <<04836>>02840000
   IF DITPL(DCNTRL).SPDSIO THEN                                <<04836>>02842000
   BEGIN         <<SPEED SENSE OR IDLE WAIT SIO PROG ACTIVE>>  <<04836>>02844000
                                                               <<04836>>02846000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  <<04836>>02848000
      STOPSIO;                                                 <<04836>>02850000
      WHILE <> DO                                              <<04836>>02852000
        BEGIN      <<SIO PROG CAN'T BE HALTED IMMEDIATELY>>    <<04836>>02854000
        IF < THEN ASMB(HALT);                                  <<04836>>02856000
        DITPL(DCNTRL).HIOPWAIT:=1;                             <<04836>>02858000
        STOPSIO;                                               <<04836>>02860000
        END;                                                   <<04836>>02862000
      MOVE WA0(DITP(DILTP)) := 4(0);                           <<04836>>02864000
   END;                                                        <<04836>>02866000
   ENABLE;                                                     <<04836>>02868000
                                                               <<04836>>02870000
                                                               <<04836>>02872000
  STATREQ := 1;                                                <<04836>>02874000
  DITPL(DCNTRL).SPDSIO := 0; << DON'T LET IOTERM STOP C.P. >>  <<04836>>02876000
                                                               <<04836>>02878000
  << SET UP IDLE WAIT FOR STATUS. ALSO MUST HANDLE DCX'S >>    <<04836>>02880000
  SIOADDR := WA0(DITP(DILTP)+ISIOP); <<SIO STARTING ADDRESS >> <<04836>>02882000
  WA0(X:=X+5) := %6014;              <<UART CONTROL         >> <<04836>>02884000
  WA0(SIOADDR + RDDATAINSTR) := [8/3,8/0];                     <<04836>>02886000
  WA0(X:=X+1) := 1;                                            <<04836>>02888000
  WA0(X:=X+1) := [8/0,8/1];  << INTERUPT ON ANY INPUT >>       <<04836>>02890000
  WA0(X:=X+1) := [1/1,1/1,4/1,10/0];                           <<04836>>02892000
  WA0(X:=X+1) := SYSDB+SIOADDR+10;                             <<04836>>02894000
  WA0(X:=X+2) := 8; << INTERUPT CODE IN CPVA 2 = SERVSPSENSE>> <<04836>>02896000
                                                               <<04836>>02898000
  PUSH(STATUS);                                                <<04836>>02900000
  CSP := TOS.(8:8)*4+ABS(CSTPADDR);                            <<04836>>02902000
  BANKNUM:=ABS(CSP+2);                                                  02904000
  BANKOFFSET := ABS(CSP+3);                                    <<04836>>02906000
                                                               <<04836>>02908000
  X:=SIOADDR+WRTDATAINSTR;                                     <<04836>>02910000
  WA0(X):=[8/4,8/0];     <<WRT DATA CHANNEL INSTR>>            <<04836>>02912000
  WA0(X:=X+1):=3;                                              <<04836>>02914000
  WA0(X:=X+1):=1;                                              <<04836>>02916000
  WA0(X:=X+1) := %120000 LOR BANKNUM;                          <<04836>>02918000
  WA0(X:=X+1):= BANKOFFSET + LOGICAL(@ ESCQMDC1);<< PB REL >>  <<04836>>02920000
  WA0(X:=X+1):=[8/0,8/0];                                      <<04836>>02922000
  WA0(X:=X+1):=WRT'RD-(WRTDATAINSTR+7);   <<JUMP TO IDLEWAIT>> <<04836>>02924000
                                                               <<04836>>02926000
  TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                      <<04836>>02928000
  X:=ABS(S0*4+3).IDLESIO;                                      <<04836>>02930000
  IF <> THEN SUDDENDEATH(209);                                 <<04836>>02932000
                                                               <<04836>>02934000
  STARTTIMEOUT(HP2640TO,DITP);  << SET 10 SEC T.O. >>          <<04836>>02936000
                                                               <<04836>>02938000
  TOS:=SYSDB+SIOADDR+WRTBASE;                                  <<04836>>02940000
  STARTSIO;                                                    <<04836>>02942000
END;     <<-------------END OF STATUS REQUEST----------->>     <<04836>>02944000
$PAGE "TERMINAL INTERRUPT PROCESSOR"                                    02946000
PROCEDURE TIP;          <<---------TERMINAL INTERRUPT PROCESSOR------->>02948000
OPTION PRIVILEGED, UNCALLABLE;                                          02950000
BEGIN                                                                   02952000
   ARRAY DUMMY (0:2) = Q;                                               02954000
   LOGICAL POINTER DITPL;                                               02956000
   INTEGER ARRAY DITP(*) = DITPL;                                       02958000
   LOGICAL POINTER IOQPL;                                               02960000
   INTEGER ARRAY IOQP(*) =IOQPL;                                        02962000
   INTEGER POINTER                                                      02964000
      DBCNTP,                                                           02966000
      DCNTP;                                                            02968000
                                                                        02970000
   INTEGER                                                              02972000
      I,                                                                02974000
      J,                                                                02976000
      K,                                                                02978000
      TEMP,          << 4 GENERAL WORK VARIABLES >>                     02980000
      SIOADDR,                                                          02982000
      RDDATA;                                                           02984000
   LOGICAL POINTER CPVAPL;                                              02986000
   INTEGER ARRAY CPVAP(*) = CPVAPL;                                     02988000
   LOGICAL FLAG;                                                        02990000
   LOGICAL RIGHT;                                                       02992000
                                                                        02994000
   LOGICAL READTIMED = TEMP;                                            02996000
   DOUBLE POINTER DITPD = DITPL;                                        02998000
   INTEGER POINTER SAVEP = I;                                           03000000
                                                                        03002000
   ARRAY DISABLE'HOME(0:2)=PB := %15543,%15510,%10403;         <<04836>>03004000
   INTEGER ARRAY CPS(0:8) = PB := 240, 960, 480, 0, 120, 0, 30,<<04836>>03006000
                                  15, 10;                      <<04836>>03008000
                                                                        03010000
SUBROUTINE SIOSYNC;                                                     03012000
BEGIN                                                                   03014000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              03016000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>03018000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>03020000
   TOS := SYSDB+SIOADDR+XMITON;                                <<04836>>03022000
   STARTSIO;                                                            03024000
   ASMB(IXIT);                                                          03026000
END;                                                                    03028000
                                                                        03030000
                                                                        03032000
                                                                        03034000
SUBROUTINE SERVSENDLF;                                                  03036000
BEGIN                                                                   03038000
   WA0(SIOADDR+11).(8:8):=%12; <<PUT LF INTO BUFFER AREA>>     <<04836>>03040000
   TOS:=DITP(DSYNC).LFSYNC;    <<GET NO.OF PAD CHARS REQUIRED>><<04836>>03042000
   IF S0>7 THEN TOS:=(TOS-6)*5;                                <<04836>>03044000
   IF S0>6 THEN      <<HAVE TO SEND MORE THAN 6 PAD CHARS>>    <<04836>>03046000
   BEGIN                                                       <<04836>>03048000
      TOS:=TOS-6;                                                       03050000
      DITP(DSYNC).SCOUNT:=TOS; <<REMAINING PAD CHARS TO SEND>> <<04836>>03052000
      K:=6;                                                    <<04836>>03054000
      WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;                    <<04836>>03056000
   END                                                         <<04836>>03058000
      ELSE                                                     <<04836>>03060000
   BEGIN                                                       <<04836>>03062000
      K:=TOS;                                                  <<04836>>03064000
      DITP(DSYNC).SCOUNT:=0;                                   <<04836>>03066000
      WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;      <<04836>>03068000
      <<RESTORE ORIGINAL INTERRUPT CODE>>                               03070000
   END;                                                        <<04836>>03072000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>03074000
   WA0(X:=X+3):=SYSDB+SIOADDR+12; <<PAD CHAR BUFFER ADDRESS>>  <<04836>>03076000
   SIOSYNC;  <<START SIO PROG BY ENABLING XMIT SRQ>>           <<04836>>03078000
END;         <<------------END OF SERVSENDLF-------------->>   <<04836>>03080000
                                                                        03082000
                                                                        03084000
SUBROUTINE RESTARTREAD;                                        <<04836>>03086000
BEGIN                                                          <<04836>>03088000
   DITP.DSTATE := READING;                                     <<04836>>03090000
   TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>03092000
   X := ABS(S0*4+3).IDLESIO;                                   <<04836>>03094000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>03096000
   IF DITPL(DSAVE).BLOCKRD THEN                                <<04836>>03098000
   BEGIN                                                       <<04836>>03100000
     WA0(SIOADDR+FINISEND+5) :=[8/0,8/0];                      <<04836>>03102000
     WA0(X:=X+1) :=118;   <<128 TO 246>>                       <<04836>>03104000
     TOS := SYSDB+SIOADDR+FINISEND;                            <<04836>>03106000
   END                                                         <<04836>>03108000
   ELSE TOS := SYSDB+SIOADDR+WRT'RD;                           <<04836>>03110000
   STARTSIO;                                                   <<04836>>03112000
END;                                                           <<04836>>03114000
                                                                        03116000
                                                                        03118000
                                                                        03120000
SUBROUTINE SERVSYNC'CR;                                                 03122000
BEGIN                                                                   03124000
   X:=SIOADDR+12;                                                       03126000
   WA0(X):=0;       <<REGENERATE SYNC BYTES AGAIN>>                     03128000
   WA0(X:=X+1):=0;                                                      03130000
   WA0(X:=X+1):=0;                                                      03132000
                                                               <<04836>>03134000
                                                               <<04836>>03136000
   TOS:=DITP(DSYNC).SCOUNT;  <<REMAINING SYNCS TO WRITE>>               03138000
   IF S0 >= 6 THEN                                             <<04836>>03140000
   BEGIN                                                                03142000
      TOS:=TOS-6;  <<REMAINING PAD CHARS TO SEND>>             <<04836>>03144000
      DITP(DSYNC).SCOUNT:=TOS;                                          03146000
      K:=6;                                                    <<04836>>03148000
   END                                                                  03150000
      ELSE                                                              03152000
   BEGIN                                                                03154000
      K:=TOS;                                                           03156000
      DITP(DSYNC).SCOUNT:=0;                                            03158000
      WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;                    <<04836>>03160000
      IF LOGICAL(K) THEN                                                03162000
         WA0(SIOADDR+12+K&LSR(1)).(8:8):=%12   <<PUT IN LF>>            03164000
         ELSE                                                           03166000
         WA0(SIOADDR+12+K&LSR(1)).(0:8):=%12;                           03168000
      K:=K+1;                                                           03170000
      TOS:=DITP(DSYNC).LFSYNC;                                          03172000
      IF S0>7 THEN TOS:=(TOS-6)*5;                                      03174000
      IF(S0+K)>6 THEN <<NOT ENOUGH BUFFER SPACE>>              <<04836>>03176000
      BEGIN                                                             03178000
         TOS:=TOS-(6-K);  <<REMAINING PAD CHARS TO SEND>>      <<04836>>03180000
         DITP(DSYNC).SCOUNT:=TOS;   <<STORE COUNT OF REMAINING SYNCS>>  03182000
         K:=6;     <<NO.OF BYTES TO OUTPUT>>                   <<04836>>03184000
      END                                                               03186000
         ELSE                                                           03188000
      BEGIN                                                             03190000
         K:=K+TOS;         <<TOTAL BYTES TO OUTPUT>>                    03192000
         WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;   <<04836>>03194000
         <<RESTORE ORIGINAL INTERRUPT CODE>>                            03196000
      END;                                                              03198000
   END;                                                                 03200000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>03202000
   WA0(X:=X+3):=SYSDB+SIOADDR+12;  <<SYNCS BUFFER ADDRESS>>             03204000
   SIOSYNC;    <<START SIO PROG TO WRITE CR/LF/SYNCS>>                  03206000
END;           <<--------------END OF SERVSYNC'CR--------------->>      03208000
                                                                        03210000
                                                                        03212000
SUBROUTINE SERVSYNC'LF;                                                 03214000
BEGIN                                                                   03216000
   WA0(SIOADDR+12):=0;   <<REGENERATE SYNC BYTES AGAIN>>                03218000
   WA0(X:=X+1):=0;                                                      03220000
   WA0(X:=X+1):=0;                                                      03222000
                                                               <<04836>>03224000
                                                               <<04836>>03226000
   TOS:=DITP(DSYNC).SCOUNT;    <<REMAINING COUNT OF SYNCS TO WRITE>>    03228000
   IF S0 > 6 THEN   <<TOO MANY PAD CHARS FOR THE BUFFER>>      <<04836>>03230000
   BEGIN                                                                03232000
      TOS:=TOS-6;   <<REMAINING PAD CHARS TO SEND>>            <<04836>>03234000
      DITP(DSYNC).SCOUNT:=TOS; <<NEW COUNT OF SYNCS TO WRITE>>          03236000
      K:=6;                                                    <<04836>>03238000
   END                                                                  03240000
      ELSE                                                              03242000
   BEGIN                                                                03244000
      DITP(DSYNC).SCOUNT:=0;                                            03246000
      K:=TOS;                                                           03248000
      WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;      <<04836>>03250000
      <<RESTORE ORIGINAL INTERRUPT CODE>>                               03252000
   END;                                                                 03254000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>03256000
   WA0(X:=X+3):=SYSDB+SIOADDR+12;  <<SYNC BUFFER ADDRESS>>              03258000
   SIOSYNC;   <<START SIO PROG TO OUTPUT CR/LF/SYNC>>                   03260000
END;                                                                    03262000
                                                                        03264000
                                                                        03266000
                                                                        03268000
SUBROUTINE LOOKFORCR;                                                   03270000
BEGIN                                                                   03272000
            DITP.PAIR:=1;                                               03274000
            X:=SIOADDR+RDDATAINSTR;   <<ADDR OF RD DATA CHANNEL INSTR>> 03276000
            WA0(X):=[8/3,8/0];    <<GENERATE RD DATA CHANNEL INSTR>>    03278000
            WA0(X:=X+1):=1;       <<READ 1 BYTE>>                       03280000
            WA0(X:=X+1):=[8/%361,8/1];                                  03282000
                         <<TERMINATION JMP OF -15 BACK TO WAIT SRQ>>    03284000
            WA0(X:=X+1):=[1/1,1/1,4/1,10/0]; <<RIGHT BYTE,NO UPDATE>>   03286000
            WA0(X:=X+1):=SYSDB+SIOADDR+10; <<BOTTOMLESS DATA DUMP>>     03288000
            WA0(X:=X+2):=49;       <<JMP FROM 98 TO 147:RDINTRPT>>      03290000
        WA0(SIOADDR+RDINTRPT+6):=WAITCR;                                03292000
            TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     03294000
            X:=GETDRT(S0,DRT3).IDLESIO;                        <<04836>>03296000
            IF <> THEN SUDDENDEATH(209);                       <<04836>>03298000
            TOS:=SYSDB+SIOADDR+RDWAIT;  <<START SIO AT WAIT SRQ>>       03300000
            DISABLE;                                           <<04836>>03302000
            STARTSIO;                                                   03304000
            ASMB(IXIT);                                                 03306000
END;                                                                    03308000
                                                                        03310000
                                                                        03312000
                                                                        03314000
                                                                        03316000
SUBROUTINE SPEEDFOUND;                                                  03318000
BEGIN                                                                   03320000
   DITP(DSPEED).SPDSENSING:=0;                                          03322000
   DITP(DRQST).SPDFOUND:=1; <<SET FLAG FOR IOTERM SERVICE>>             03324000
   DITP(DCNTRL).SPDSIO:=0;                                              03326000
   DITP.PTYCHK := DITP(DCNTRL).PTYON;                          <<04836>>03328000
   AWAKETERMINAL(DITP);                                                 03330000
   ASMB(IXIT);  <<LEAVING ON A JET PLANE>>                              03332000
END;                                                                    03334000
                                                                        03336000
                                                                        03338000
                                                                        03340000
                                                                        03342000
                                                                        03344000
SUBROUTINE RESTRTWAIT;                                                  03346000
BEGIN                                                                   03348000
   X:=DITP.DSTATE;                                                      03350000
   IF = AND NOT DITPL(DCNTRL).SPDSIO THEN ASMB(IXIT);                   03352000
   <<IDLE WAIT PROG WAS ALREADY STOPPED,DO NOT RESTART>>                03354000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              03356000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>03358000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>03360000
   TOS:=SYSDB+SIOADDR+RDWAIT;  <<START AT WAIT SRQ CHANNEL INSTR>>      03362000
   DISABLE;                                                    <<04836>>03364000
   STARTSIO;                                                            03366000
   ASMB(IXIT);                                                          03368000
END;                                                                    03370000
                                                                        03372000
                                                                        03374000
                                                                        03376000
                                                                        03378000
SUBROUTINE CLEANUPRD;                                                   03380000
BEGIN                                                                   03382000
   READTIMED:= IF DITP(DTRLX).READTRLX<>0 AND                           03384000
               DITP(DSAVE).HSTATE=ONLINE THEN TRUE ELSE FALSE;          03386000
   IOQP(QMISC).RSTATE:=READCMPLTD;   <<INFORM IOTERM0 THAT READ         03388000
                                       OPERATION IS COMPLETED>>         03390000
   X:=IOQP(QMISC).READSTOP;                                             03392000
   IF <> THEN          <<READ HAS BEEN STOPPED>>                        03394000
   BEGIN                                                                03396000
      IF X=PREMPTSTOP THEN                                              03398000
      BEGIN     <<READ WAS PREMPTED,RESTORE TIMING FLAGS>>              03400000
         DITP(DTYPE).TIMING:=0;                                         03402000
         IF <> THEN DITP(DTYPE).TIMEREAD:=1;                            03404000
      END                                                               03406000
         ELSE                                                           03408000
      IF X=BREAKSTOP AND READTIMED THEN                                 03410000
         SETREADERROR(IOQP,READTO);                                     03412000
                                                                        03414000
      IOQP(QMISC).RSTATE:=STOPPED;                                      03416000
   END;                                                                 03418000
                                                                        03420000
   DITP(DTYPE).TIMING:=0;                                               03422000
   IF <> THEN       <<COMPUTE DURATION OF READ OPERATION>>              03424000
   BEGIN                                                                03426000
      TOS:=TIMER-DITPD(DRTIMED);                                        03428000
      IF < THEN << NEGATIVE TIME INTERVAL MEANS >>             <<04836>>03430000
                << THAT TIMER HAS OVERFLOWED    >>             <<04836>>03432000
         TOS:= TOS+MSECS'24'DAYS;                              <<04836>>03434000
      TOS:=10;      <<DIVIDE MSEC BY 10 TO GET 100THS OF SECONDS>>      03436000
      ASMB(LDIV, DEL);                                                  03438000
      IF OVERFLOW THEN                                                  03440000
      BEGIN       DEL;     TOS:=-1;      END;                           03442000
      DITP(DRTIME):=TOS;                                                03444000
   END;                                                                 03446000
                                                                        03448000
   IF READTIMED THEN                                                    03450000
   BEGIN                                                                03452000
      IF IOQP(QMISC).READSTOP<>PREMPTSTOP THEN                          03454000
         DITP(DRTMAX):=0;     <<CLR USER REQUESTED READ TIME LIMIT>>    03456000
      STOPTIMEOUT(READTIMEOUT,DITP);                                    03458000
   END;                                                                 03460000
                                                                        03462000
   DITP.PAIR:=0;       <<NOT READING ANY MORE>>                         03464000
                                                                        03466000
    DITP(DTYPE).PAIRCODE:=NOTREADING;                                   03468000
   DITP(DMODEM).PRIMED:=0;                                              03470000
   IF <> THEN                                                  <<04836>>03472000
      BEGIN                                                    <<04836>>03474000
      WA0(SIOADDR+12) := %15412;  << ESCAPE AND LINE FEED >>   <<04836>>03476000
      WA0(X:=X+1) := ";:";                                     <<04836>>03478000
      WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/5];<<RESET CHAR >>   <<04836>>03480000
      WA0(X:=X+1) := 4;                                        <<04836>>03482000
      WA0(X:=X+1) := 1;                                        <<04836>>03484000
      WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>> <<04836>>03486000
      WA0(X:=X+1) := SYSDB+SIOADDR+12;                         <<04836>>03488000
      WA0(X:=X+1) := [8/1,1/1,7/2];<<INTERRUPT HALT TO CPVA2>> <<04836>>03490000
      WA0(X:=X+1) := 10;                                       <<04836>>03492000
      TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                <<04836>>03494000
      X := ABS(S0*4 + 3).IDLESIO;                              <<04836>>03496000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>03498000
      TOS := SYSDB + SIOADDR + NEWSPECCHAR;                    <<04836>>03500000
      STARTSIO;                                                <<04836>>03502000
      STOPTIMEOUT(BLOCKTIMEOUT, DITP);                         <<04836>>03504000
      DITP(DBTIME) := 0;                                       <<04836>>03506000
      END;                                                     <<04836>>03508000
   <<*******CHECKTQUEUE*************>>                                  03510000
END;      <<----------------END OF CLEANUPRD----------------->>         03512000
                                                                        03514000
                                                                        03516000
SUBROUTINE NOTBUF;                                                      03518000
BEGIN                                                                   03520000
   ASMB(IXIT);                                                 <<04836>>03522000
END;                                                                    03524000
                                                                        03526000
                                                                        03528000
                                                                        03530000
                                                                        03532000
SUBROUTINE RDCOMPLETE;                                                  03534000
      BEGIN        <<TERMCHAR=0, BINREAD=1>>                            03536000
         CLEANUPRD;                                                     03538000
         DITP.DSTATE:=NULL;                                             03540000
         IDLEWAIT(DITP);  <<START IDLE WAIT SIO PROG>>                  03542000
         X:=@IOQP;                                                      03544000
         IF <> THEN AWAKETERMINAL(DITP);                                03546000
      END;                                                              03548000
                                                                        03550000
                                                                        03552000
                                                                        03554000
                                                                        03556000
                                                                        03558000
                                                                        03560000
                                                                        03562000
INTEGER SUBROUTINE LASTBYTE;                                            03564000
BEGIN                                                                   03566000
   X:=SIOADDR+3+    <<ADDR OF RD DATA CHANNEL INSTR 4TH WORD>>          03568000
      ( IF DITPL(DSAVE).BLOCKRD THEN                                    03570000
           BLOCKMODRD ELSE RDDATAINSTR );                               03572000
   RIGHT:=IF LOGICAL(WA0(X).(1:1))  THEN TRUE ELSE FALSE;               03574000
          <<SET FLAG IF NEXT BYTE GOES INTO RIGHT HALF>>                03576000
   FLAG:=IF LOGICAL(WA0(X).(5:1)) THEN TRUE                             03578000
                                  ELSE FALSE;                           03580000
         <<SET NO UPDATE FLAG ACCORDING TO INSTR CONTENTS>>             03582000
   I:=IF RIGHT THEN WA0(X:=X+1) ELSE WA0(X:=X+1) - 1;                   03584000
          <<GET ADDRESS OF THE LAST BYTE READ>>                         03586000
   X:=I - SYSDB;                                                        03588000
   LASTBYTE.(9:7):=IF RIGHT AND NOT FLAG THEN WA0(X).(1:7)              03590000
                            ELSE WA0(X).(9:7);                          03592000
END;       <<--------------END OF LASTBYTE-------------------->>        03594000
                                                                        03596000
SUBROUTINE READDONE(NOCRLF);                                            03598000
VALUE NOCRLF;      LOGICAL NOCRLF;                                      03600000
BEGIN                                                                   03602000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>03604000
      DITPL(DLDEV).RDFLUSH := 0;                               <<04836>>03606000
      RDCOMPLETE;                                              <<04836>>03608000
      ASMB(IXIT)  END;                                         <<04836>>03610000
   CLEANUPRD;                                                           03612000
   X:=IOQP(QPAR1);        <<TEST NO CR/LF FLAG>>                        03614000
   IF < OR DITPL(DSPEED).TAPEMODE OR NOCRLF THEN                        03616000
   BEGIN        <<DO NOT SEND CARRIAGE CNTRL BYTES>>                    03618000
      DITP.DSTATE:=NULL;     <<BACK TO NATURE>>                         03620000
      IDLEWAIT(DITP);        <<START IDLE WAIT SIO PROG>>               03622000
      X:=@IOQP;                                                         03624000
      IF <> THEN AWAKETERMINAL(DITP);                                   03626000
   END                                                                  03628000
      ELSE                                                              03630000
   BEGIN                                                                03632000
      IOQP(QMISC).RSTATE := READING;<< WE'RE NOT DONE YET>>    <<04836>>03634000
      TOS:=DITP;                                                        03636000
      TOS.NEWLINE:=1;                                                   03638000
      TOS.DSTATE:=EORSYNC;   <<SENDING CARRIAGE CNTRL BYTES>>           03640000
      DITP:=TOS;                                                        03642000
      FLAG:=IF LASTBYTE=CR THEN TRUE ELSE FALSE;                        03644000
            <<SET FLAG IF ONLY LF IS SENT>>                             03646000
      J := WRTBASE;                                            <<04836>>03648000
      IF NOT DITPL(DMODEM).NOSYNC THEN  <<TERM NEEDS DELAYS>>  <<04836>>03650000
     BEGIN   <<SEND LF/SYNCS, THEN CR/SYNCS>>                  <<04836>>03652000
         IF FLAG THEN DOCRLFSYNC(1,NXTNULL,DITP) <<LF ONLY>>   <<04836>>03654000
                 ELSE DOCRLFSYNC(0,NXTNULL,DITP);              <<04836>>03656000
     END                                                       <<04836>>03658000
        ELSE                                                   <<04836>>03660000
     BEGIN                                                     <<04836>>03662000
                                                               <<04836>>03664000
      X:=SIOADDR+WRTDATAINSTR;                                 <<04836>>03666000
      WA0(X):=[8/4,8/0];     <<GENERATE WRITE DATA CHANNEL INSTR>>      03668000
      WA0(X:=X+1):=IF FLAG THEN 1 ELSE 2;    <<LF OR CR/LF>>            03670000
      WA0(X:=X+1):=1;                                                   03672000
      WA0(X:=X+1):=[1/1,1/1,1/1,13/0];    <<FROM RIGHT BYTE>>           03674000
      WA0(X:=X+1):=IF FLAG THEN SYSDB+SIOADDR+1  <<ADDR OF LF>>         03676000
                           ELSE SYSDB+SIOADDR;   <<ADDR OF CR/LF>>      03678000
      WA0(X:=X+1):=[8/1,1/1,7/1];  <<INTERRUPT/HALT,CODE TO CPVA1>>     03680000
      WA0(X:=X+1):=NXTNULL;   <<INTERRUPT CODE FOR SENDING CR,LF>>      03682000
     END;                                                      <<04836>>03684000
     TOS:=DITP(DMODEM)&CSL(M202);                                       03686000
     IF TOS AND DITP(DMODEM).CBSB <> 3 THEN                             03688000
     BEGIN      <<202 NOT IN WRITE STATE>>                              03690000
        STARTTIMEOUT(TURNTO,DITP);                                      03692000
                                                               <<04836>>03694000
        DITP(DSAVE).TURNTOWRITE:=1;                                     03696000
        DITP(DCNTRL).NXTDSTATE:=DITP;                                   03698000
        DITP.DSTATE:=TURN202;                                           03700000
        DITP(DSIOPC) := SYSDB + SIOADDR + J;                   <<04836>>03702000
        MODCONTROL(WRITING,DITP);                              <<04836>>03704000
     END                                                                03706000
        ELSE                                                            03708000
     BEGIN                                                              03710000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           03712000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>03714000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>03716000
      TOS:=SYSDB+SIOADDR+J;                                    <<04836>>03718000
           <<START SIO PROG AT WRITE INTERFACE CONTROL>>                03720000
      STARTSIO;                                                         03722000
     END;                                                               03724000
   END;                                                                 03726000
   ASMB(IXIT);                                                          03728000
END;       <<---------------END OF READDONE----------------->>          03730000
                                                                        03732000
                                                               <<04836>>03734000
                                                               <<04836>>03736000
                                                               <<04836>>03738000
SUBROUTINE NEWSPDRD;                                           <<04836>>03740000
BEGIN                                                          <<04836>>03742000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     <<04836>>03744000
   TOS:=SYSDB+SIOADDR+SPSENBAUD+5;                             <<04836>>03746000
   STARTSIO;        ASMB(IXIT);                                <<04836>>03748000
END;                                                           <<04836>>03750000
                                                                        03752000
                                                                        03754000
SUBROUTINE SPEEDSENSE;                                                  03756000
BEGIN                                                                   03758000
   RDDATA:=WA0(SIOADDR+10).(8:8);    <<GET CHAR JUST READ>>             03760000
   IF NOT DITPL(DSPEED).SPDSENSING THEN                                 03762000
   BEGIN                                                                03764000
      IF SYSUP THEN                                                     03766000
    BEGIN                                                               03768000
      TEMP:=DITP(DMODEM).MTYPE; <<GET SUBTYPE>>                <<04836>>03770000
      <<FIRST CHAR JUST RECVD,GO INTO SPEEDSENSING MODE>>               03772000
      IF RDDATA=%15 OR RDDATA=%215 THEN                        <<04836>>03774000
      BEGIN                                                             03776000
         IF TEMP=4 OR TEMP=5 THEN DCNTP:=DITP(DLAST).TERMSPEED <<04836>>03778000
            ELSE   <<USE CONFIGURED SPEED FOR NON-SPDSEN DEV>> <<04836>>03780000
         DCNTP:=%7;   <<ADCC CODE FOR 240CPS>>                 <<04836>>03782000
         IF RDDATA=%215 THEN DITP(DCNTRL).PTYONODD:=%2;        <<04836>>03784000
         <<PTY BIT WAS ON,SO SET PTY FLAG AND ODD PTY=0>>      <<04836>>03786000
         SPEEDFOUND;                                           <<04836>>03788000
      END                                                               03790000
         ELSE                                                           03792000
      IF TEMP=4 OR TEMP=5 THEN RESTRTWAIT <<NON-SPDSEN DEV>>   <<04836>>03794000
         ELSE                 <<CHECK FOR OTHER BAUDRATES>>    <<04836>>03796000
      BEGIN                                                             03798000
         DITP(DSPEED).SPDSENSING:=1;                                    03800000
         DITPD(DRTIMED):=TIMER;       <<RECORD WHEN 1ST CHAR IS RECVD>> 03802000
         IF RDDATA=%346 THEN                                   <<04836>>03804000
         BEGIN    <<POSSIBLE CR AT 1200 BAUDS>>                <<04836>>03806000
            DCNTP:=0;                                          <<04836>>03808000
            RESTRTWAIT;   <<WAIT FOR 2ND CHAR>>                <<04836>>03810000
         END                                                   <<04836>>03812000
            ELSE                                               <<04836>>03814000
         IF RDDATA=%170 THEN                                   <<04836>>03816000
         BEGIN     <<POSSIBLE CR AT 60CPS>>                    <<04836>>03818000
            DCNTP.(13:3):=3;  <<60CPS STATE ASSIGNMENT>>       <<04836>>03820000
            WA0(SIOADDR+8).(12:4):=%6;   <<ADCC CODE, 60CPS>>  <<04836>>03822000
            NEWSPDRD;  <<CHANGE SPEED TO 120CPS FOR NEXT BYTE>><<04836>>03824000
         END                                                   <<04836>>03826000
            ELSE                                               <<04836>>03828000
         IF RDDATA=%200 THEN                                   <<04836>>03830000
         BEGIN      <<POSSIBLE CR AT 60 OR 30 CPS>>                     03832000
            DCNTP.(13:3):=IF RDDATA=%170 THEN 3  <<60 CPS STATE ASSIGN  03834000
                                                   MENT TO DETECT CR>>  03836000
                                         ELSE 2; <<30CPS ASSIGNMENT>>   03838000
            WA0(SIOADDR+8).(12:4):=%15; <<ADCC CODE,30CPS>>    <<04836>>03840000
            NEWSPDRD; <<CHANGE TO 30CPS TO WAIT FOR NEXT BYTE>><<04836>>03842000
         END                                                            03844000
            ELSE                                                        03846000
         IF RDDATA=0 THEN    <<BREAK WAS RECVD,POSSIBLE CR AT 150 OR 11 03848000
                               0 CPS>>                                  03850000
         BEGIN       <<CHANGE ADCC RECV BAUDRATE TO 15CPS>>             03852000
            WA0(SIOADDR+8).(12:4):=%16;   <<ADCC CODE FOR 15 CPS>>      03854000
            DCNTP.(13:3):=1;       <<11 & 15 CPS STATE ASSIGNMENT>>     03856000
            NEWSPDRD; <<CHANGE TO 15CPS TO READ NEXT CHAR>>    <<04836>>03858000
                                                               <<04836>>03860000
                                                               <<04836>>03862000
                                                               <<04836>>03864000
         END                                                            03866000
      END;                                                              03868000
    END;                                                                03870000
      DITP(DSPEED).SPDSENSING:=0;                                       03872000
                                                               <<04836>>03874000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           03876000
      TOS:=SYSDB+SIOADDR+XMITOFF;                              <<04836>>03878000
      STARTSIO;                                                         03880000
                                                                        03882000
   END                                                                  03884000
      ELSE                                                              03886000
   BEGIN                                                                03888000
      <<ALREADY IN SPEEDSENSE MODE>>                                    03890000
      TEMP:=DCNTP.(13:3);     <<GET BAUDRATE STATE ASSIGNMENT>>         03892000
      TOS:=TIMER-DITPD(DRTIMED);    <<COMPUTE TIME BETWEEN CHARS>>      03894000
      IF < THEN << NEGATIVE TIME INTERVAL MEANS >>             <<04836>>03896000
                << THAT TIMER HAS OVERFLOWED    >>             <<04836>>03898000
         TOS:= TOS+MSECS'24'DAYS;                              <<04836>>03900000
      I:=TOS;                                                           03902000
      IF TOS=0 THEN    <<MOST SIGNIF WORD=0,TIME SMALL ENOUGH>>         03904000
      BEGIN                                                             03906000
         IF TEMP=3 THEN                                                 03908000
         BEGIN         <<POSSIBLE CR AT 60CPS,1ST CHAR WAS %170>>       03910000
            IF RDDATA=%370 OR RDDATA=%374 THEN                 <<04836>>03912000
            BEGIN                                                       03914000
               IF I<=17 AND SYSUP THEN                         <<04836>>03916000
               BEGIN                                                    03918000
                  <<CR DETECTED AT 60CPS>>                              03920000
                  DCNTP:=6;     <<ADCC CODE FOR 60CPS>>                 03922000
                   IF RDDATA=%374 THEN DITP(DCNTRL).PTYONODD   <<04836>>03924000
                      :=%2;  <<PTY ON,ODD PTY=0>>              <<04836>>03926000
                  SPEEDFOUND;                                           03928000
               END;                                                     03930000
            END;                                                        03932000
            <<DON'T JIVE, RESTART SPEEDSENSE ALL OVER AGAIN>>           03934000
            DCNTP:=0;                                                   03936000
            DITP(DSPEED).SPDSENSING:=0;                                 03938000
         WA0(SIOADDR+8).(12:4):=%7; <<ADCC CODE FOR 240CPS>>   <<04836>>03940000
         NEWSPDRD; <<CHANGE TO 240CPS TO RESTART SPEEDSENSE>>  <<04836>>03942000
         END                                                            03944000
            ELSE                                                        03946000
         IF TEMP=2 THEN                                                 03948000
         BEGIN         <<POSSIBLE 30CPS,PREVIOUS CHAR WAS %200>>        03950000
            IF RDDATA=%303 OR RDDATA=%343 THEN                 <<04836>>03952000
            BEGIN                                              <<04836>>03954000
               IF I<=40 AND SYSUP THEN                         <<04836>>03956000
               BEGIN    <<BYTE RECEIVED WITHIN TIME LIMITS>>   <<04836>>03958000
                  DCNTP:=%15;  <<ADCC CODE FOR 30CPS>>         <<04836>>03960000
                  IF RDDATA=%343 THEN DITP(DCNTRL).PTYONODD    <<04836>>03962000
                     :=%2;   <<PTY ON,ODD PTY=0>>              <<04836>>03964000
                  SPEEDFOUND;                                  <<04836>>03966000
               END;                                            <<04836>>03968000
            END;                                               <<04836>>03970000
                                                               <<04836>>03972000
                                                               <<04836>>03974000
                                                               <<04836>>03976000
                                                               <<04836>>03978000
                                                               <<04836>>03980000
                                                               <<04836>>03982000
                                                               <<04836>>03984000
                                                               <<04836>>03986000
                                                               <<04836>>03988000
                                                               <<04836>>03990000
                                                               <<04836>>03992000
                                                               <<04836>>03994000
                                                               <<04836>>03996000
            DCNTP:=0;                                                   03998000
            DITP(DSPEED).SPDSENSING:=0;                                 04000000
            WA0(SIOADDR+8).(12:4):=%7; <<ADCC CODE,240CPS>>    <<04836>>04002000
            NEWSPDRD;                                          <<04836>>04004000
         END                                                            04006000
            ELSE                                                        04008000
         IF TEMP=1 THEN                                                 04010000
         BEGIN        <<POSSIBLE CR AT 15CPS OR 11CPS>>                 04012000
               IF RDDATA=%303 OR RDDATA=%343 THEN  <<PTY ON:%343>>      04014000
               BEGIN                                                    04016000
                  TEMP:=%16;  <<ADCC CODE FOR 15CPS>>                   04018000
                  J:=80;      <<TIME LIMIT BETWN CHARS>>                04020000
                  IF RDDATA=%343 THEN DITP(DCNTRL).PTYONODD    <<04836>>04022000
                     :=%2;  <<PTY ON,ODD PTY=0>>               <<04836>>04024000
               END                                                      04026000
                  ELSE                                                  04028000
               IF RDDATA=%7 OR RDDATA=%6 OR RDDATA=%206 OR              04030000
                  RDDATA=%207 THEN  <<PTY ON: %206,%207>>               04032000
               BEGIN                                                    04034000
                  TEMP:=%17;  <<ADCC CODE FOR 11CPS>>                   04036000
                  J:=85;                                                04038000
                  IF LOGICAL(RDDATA.(8:1)) THEN DITP(DCNTRL).  <<04836>>04040000
                     PTYONODD:=%2;  <<PTY ON,ODD PTY=0>>       <<04836>>04042000
               END;                                                     04044000
               X:=TEMP-%16;                                             04046000
               IF >= AND I<=J AND SYSUP THEN                            04048000
               BEGIN    <<CHAR RECVD WITHIN TIME LIMITS>>               04050000
                  DCNTP:=TEMP;                                          04052000
                  SPEEDFOUND;                                           04054000
               END;                                                     04056000
         END                                                            04058000
            ELSE                                               <<04836>>04060000
         BEGIN   <<STATE=0,POSSIBLE 2ND BYTE OF CR AT 120CPS>> <<04836>>04062000
            IF RDDATA=%200 OR RDDATA=%340 THEN                 <<04836>>04064000
            BEGIN                                              <<04836>>04066000
               IF I<=10 AND SYSUP THEN                         <<04836>>04068000
               BEGIN                                           <<04836>>04070000
                  DCNTP:=%13;  <<ADCC CODE FOR 120CPS>>        <<04836>>04072000
                  IF RDDATA=%340 THEN DITP(DCNTRL).PTYONODD:=  <<04836>>04074000
                     %2;                                       <<04836>>04076000
                  SPEEDFOUND;                                  <<04836>>04078000
               END;                                            <<04836>>04080000
            END;                                               <<04836>>04082000
         END;                                                  <<04836>>04084000
      END;                                                              04086000
      DCNTP:=0;     <<SPEEDSENSE FAILED, RETRY AGAIN>>                  04088000
      DITP(DSPEED).SPDSENSING:=0;                                       04090000
      WA0(SIOADDR+8).(12:4):=%7;   <<ADCC CODE FOR 240CPS>>             04092000
                                                                        04094000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           04096000
      TOS:=SYSDB+SIOADDR+SPSENBAUD;                                     04098000
      STARTSIO;                                                         04100000
   END;                                                                 04102000
                                                                        04104000
END;          <<--------------END OF SPEEDSENSE---------------->>       04106000
                                                                        04108000
                                                                        04110000
                                                                        04112000
                                                                        04114000
                                                                        04116000
                                                                        04118000
                                                                        04120000
                                                                        04122000
                                                                        04124000
SUBROUTINE PREFETCH;                                                    04126000
BEGIN                                                                   04128000
   WA0(I):=[8/125,8/1];  <<96 TO 221:NXTBLKRD-INTERRUPT/NO HALT>>       04130000
   TOS:=GETTBUF(SECONDARY);                                             04132000
   TOS:=S0;                                                             04134000
   IF = THEN                                                            04136000
   BEGIN                                                                04138000
      DDEL;                                                             04140000
      SETREADERROR(IOQP,LOSTDATA);                                      04142000
      ASMB(IXIT);                                                       04144000
   END                                                                  04146000
      ELSE                                                              04148000
   BEGIN                                                                04150000
      DITP(DBLKTAIL):=TOS;                                              04152000
      X:=SIOADDR+BLOCKMODRD+4;                                          04154000
      WA0(X):=TOS+SYSDB+2;                                              04156000
      K:=K-DCNTP;  <<BYTES REMAINING FOR 2ND TBUF TO FILL>>             04158000
      IF K > TBMAXB THEN                                                04160000
      BEGIN        <<2ND TBUF STILL NOT ENOUGH>>                        04162000
         WA0(SIOADDR+BLOCKMODRD+1):=TBMAXB;                             04164000
         WA0(X:=X+1):=[8/4,8/1]; <<238 TO 242:INTERRUPT/NO HALT>>       04166000
      END                                                               04168000
         ELSE                                                           04170000
      BEGIN                                                             04172000
         WA0(SIOADDR+BLOCKMODRD+1):=K;                                  04174000
         WA0(X:=X+1):=[8/%222,8/1]; <<238 TO 128:RDEXIT>>               04176000
      END;                                                              04178000
      WA0(X:=X+1):=[1/1,1/0,14/0];  <<INTO LEFT BYTE>>                  04180000
   END;                                                                 04182000
END;    <<--------------END OF PREFETCH--------------------->>          04184000
                                                                        04186000
SUBROUTINE RDTOWRT; BEGIN                                      <<04836>>04188000
   STARTTIMEOUT(TURNTO, DITP);                                 <<04836>>04190000
   MODCONTROL(WRITING, DITP);                                  <<04836>>04192000
   DITP(DSAVE).TURNTOWRITE := 1;                               <<04836>>04194000
   DITP(DCNTRL).NXTDSTATE := DITP;                             <<04836>>04196000
   DITP.DSTATE := TURN202;                                     <<04836>>04198000
   DITP(DSIOPC) := SYSDB + SIOADDR + RECVOFF;                  <<04836>>04200000
   ASMB(IXIT);  END;                                           <<04836>>04202000
                                                                        04204000
LOGICAL SUBROUTINE WAITFORCR;                                           04206000
BEGIN                                                                   04208000
   X:=DITP(DSPEED);       <<GET TAPEMODE FLAG>>                         04210000
   IF < AND NOT DITPL(DMODEM).NOSYNC   <<TAPEMODE AND NOT A 2640X>>     04212000
      OR                                                                04214000
   DITPL(DMODEM).PRIMED AND DITP(DTYPE).TTYPE=HP2640X                   04216000
      THEN       <<OR TERMTYPE=11 AND BLOCK MODE READ IN PROGRESS>>     04218000
      IF LASTBYTE<>CR THEN WAITFORCR:=TRUE;                             04220000
END;                                                                    04222000
                                                                        04224000
                                                                        04226000
SUBROUTINE KILLREAD;  BEGIN                                    <<04836>>04228000
   DISABLE;                                                    <<04836>>04230000
   J := DITP(DRBCT) - DBCNTP - (IF CPVAP(3) <> 0 THEN TBMAXB   <<04836>>04232000
                                                 ELSE 0);      <<04836>>04234000
                                                               <<04836>>04236000
                                                               <<04836>>04238000
                                                               <<04836>>04240000
   IOQP(QMISC).READSTOP := ABORTED;                            <<04836>>04242000
   CPVAP(3) := 0;                                              <<04836>>04244000
   DCNTP := DBCNTP:= DITP(DPNTR) := DITP(DTANKB) := 0;         <<04836>>04246000
   DITP(DSAVE).BLOCKRD := 0;                                   <<04836>>04248000
   DITP(DMODEM).PRIMED := 0;                                   <<04836>>04250000
   DITPL(DLDEV).RDFLUSH := 1;                                  <<04836>>04252000
   ENABLE;                                                     <<04836>>04254000
   X := DITP(DHEAD);                                           <<04836>>04256000
   WHILE <> DO BEGIN                                           <<04836>>04258000
      TOS := X;                                                <<04836>>04260000
      X := WA0(X);                                             <<04836>>04262000
      RETURNTBUF( * );                                         <<04836>>04264000
      ENABLE  END;                                             <<04836>>04266000
   DITP(DHEAD) := DITP(DTAIL) := 0;                            <<04836>>04268000
   TOS := DITP(DBLKTAIL);                                      <<04836>>04270000
   DITP(X) := 0;                                               <<04836>>04272000
   IF <> THEN RETURNTBUF( * );                                 <<04836>>04274000
   WA0(SIOADDR + RDDATAINSTR) := [8/3, 8/0];                   <<04836>>04276000
   WA0(X := X+1) := J;                                         <<04836>>04278000
   WA0(X := X+1) := [8/32, 8/1];                               <<04836>>04280000
   WA0(X := X+1) := [1/1, 1/1, 1/0, 3/1, 10/0];                <<04836>>04282000
   WA0(X := X+1) := SYSDB + SIOADDR + 10;                      <<04836>>04284000
   WA0(X := X+2) := RDSPECL;                                   <<04836>>04286000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>04288000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>04290000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>04292000
   TOS := SYSDB + SIOADDR + RDWAIT;                            <<04836>>04294000
   STARTSIO;                                                   <<04836>>04296000
   ASMB(IXIT)  END;                                            <<04836>>04298000
                                                                        04300000
                                                                        04302000
SUBROUTINE BUILD2SIO;                                                   04304000
BEGIN                                                                   04306000
   TOS:=GETTBUF(SECONDARY);                                             04308000
   ASMB(TEST);                                                 <<04836>>04310000
   IF = THEN                                                            04312000
      DEL                                                      <<04836>>04314000
                                                               <<04836>>04316000
                                                               <<04836>>04318000
                                                               <<04836>>04320000
                                                               <<04836>>04322000
      ELSE                                                              04324000
   BEGIN                                                                04326000
      DITP(DBLKTAIL):=TOS;                                              04328000
      WA0(SIOADDR+BLOCKMODRD+4):=SYSDB+DITP(DBLKTAIL)+2;                04330000
      J:=DITP(DRBCT)-DBCNTP-DCNTP; <<BYTES REMAINING TO READ>>          04332000
      IF J > TBMAXB THEN                                                04334000
      BEGIN    <<EVEN 2ND TBUF IS NOT ENOUGH>>                          04336000
         WA0(SIOADDR+BLOCKMODRD+1):=TBMAXB;                             04338000
         WA0(X:=X+1):=[8/4,8/1]; <<238 TO 242:INTERRUPT/NO HALT>>       04340000
      END                                                               04342000
         ELSE                                                           04344000
      BEGIN                                                             04346000
         WA0(SIOADDR+BLOCKMODRD+1):=J;                                  04348000
         WA0(X:=X+1):=[8/%222,8/1]; <<238 TO 128:RDEXIT>>               04350000
      END;                                                              04352000
      WA0(X:=X+1):=[1/1,1/0,14/0];  <<FROM LEFT BYTE>>                  04354000
      WA0(X:=X+3) := RDSPECL;                                  <<04836>>04356000
   END;                                                                 04358000
END;   <<-------------------END OF BUILD2SIO------------------->>       04360000
                                                                        04362000
INTEGER SUBROUTINE BLOCKTIME;                                  <<04836>>04364000
   BLOCKTIME := (DITP(DRBCT)/CPS(DITP(DSPEED).INSPEED-7))      <<04836>>04366000
                &ASL(1) + 30;                                  <<04836>>04368000
                                                                        04370000
SUBROUTINE READBLOCK;                                                   04372000
BEGIN                                                                   04374000
   DITP(DBTIME) := BLOCKTIME;                                  <<04836>>04376000
   STARTTIMEOUT(BLOCKTIMEOUT,DITP);                            <<04836>>04378000
   STOPTIMEOUT(READTIMEOUT, DITP);<<STOP USER TIMER AT ENTER>> <<04836>>04380000
   DITP(DRTMAX) := 0; << CLEAR REQUEST FOR A TIMER >>          <<04836>>04382000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; << WRITE DATA INSTR>> <<04836>>04384000
   WA0(X:=X+1):=1;                                                      04386000
   WA0(X:=X+1):=1;                                                      04388000
   WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; <<FROM LEFT BYTE>>         <<04836>>04390000
   WA0(X:=X+1):=SYSDB+SIOADDR+4;    <<ADDR FOR DC1,ETX>>       <<04836>>04392000
   WA0(X:=X+1):=[8/1,1/1,7/1];                                 <<04836>>04394000
   WA0(X:=X+1):=9;                                             <<04836>>04396000
   WA0(SIOADDR+4) := DC1'ETX;                                  <<04836>>04398000
   WA0(SIOADDR+12) := %15412; << ESCAPE AND LINE FEED >>       <<04836>>04400000
   WA0(X:=X+1) := ";:";                                        <<04836>>04402000
   WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/4];<<CLEAR SPEC CHAR>>  <<04836>>04404000
   WA0(X:=X+1) := 4;                                           <<04836>>04406000
   WA0(X:=X+1) := 1;                                           <<04836>>04408000
   WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>>    <<04836>>04410000
   WA0(X:=X+1) := SYSDB + SIOADDR + 12;                        <<04836>>04412000
   WA0(X:=X+1) := [8/0, 8/0]; << JUMP TO OUTPUT DC1 >>         <<04836>>04414000
   WA0(X:=X+1) := RECVOFF - NEWSPECCHAR - 7;                   <<04836>>04416000
   IF AUTOHANDSH AND NOT DITPL.SPOOLING THEN                   <<04836>>04418000
     BEGIN                                                     <<04836>>04420000
     PUSH(STATUS);                                             <<04836>>04422000
     J := TOS.(8:8)*4+ABS(0);      <<ABSOLUTE CST ADDRESS>>    <<04836>>04424000
     I := ABSOLUTE (J+2) ;                                              04426000
     J := ABS(J+3);         << CODE SEG BANK ADDRESS >>        <<04836>>04428000
     WA0(SIOADDR+WRTDATAINSTR+1) := 5;                         <<04836>>04430000
     WA0(X:=X+2) := %120000 LOR LOGICAL(I);  <<L BYTE & BANK>> <<04836>>04432000
     WA0(X:=X+1) := J + @DISABLE'HOME;     <<PB BANK ADDR>>    <<04836>>04434000
     END;                                                      <<04836>>04436000
   J:=TBMAXB-(DBCNTP MOD TBMAXB); <<REMAINING ROOM IN TBUF>>            04438000
   K:=DITP(DRBCT)-DBCNTP; <<BYTES REMAINING TO READ>>                   04440000
   IF K > J THEN                                                        04442000
   BEGIN        DCNTP:=J;                                               04444000
      WA0(SIOADDR+RDDATAINSTR+1):=J;                                    04446000
      WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>                  04448000
   END                                                                  04450000
      ELSE                                                              04452000
   BEGIN        DCNTP:=K;                                               04454000
      WA0(SIOADDR+RDDATAINSTR+1):=K;                                    04456000
      WA0(X:=X+1):=[8/32,8/1]; <<96 TO 128:RDEXIT>>                     04458000
   END;                                                                 04460000
   WA0(X:=X+1):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                       04462000
                              ELSE [1/1,1/0,14/0];                      04464000
   WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTAIL)+2+(DBCNTP MOD          04466000
                               TBMAXB)&LSR(1);                          04468000
   DITP.DSTATE :=WRTSPECL;                                     <<04836>>04470000
   IF DITPL(DMODEM)&CSL(M202) THEN BEGIN                       <<04836>>04472000
      X := SIOADDR + WRTDATAINSTR + 1;                         <<04836>>04474000
      WA0(X) := WA0(X) + 1;               << OUTPUT ETX TOO >> <<04836>>04476000
                                                               <<04836>>04478000
      WA0(X:=X+4) := [8/1, 1/1, 7/2];                          <<04836>>04480000
      WA0(X:=X+1) := 22;                                       <<04836>>04482000
      RDTOWRT;                                                 <<04836>>04484000
   END;                                                        <<04836>>04486000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              04488000
   TOS := SYSDB + SIOADDR + NEWSPECCHAR;                       <<04836>>04490000
   STARTSIO;                                                            04492000
   ASMB(IXIT);                                                          04494000
END;    <<----------------END OF READBLOCK-------------------->>        04496000
                                                                        04498000
                                                                        04500000
                                                                        04502000
                                                                        04504000
                                                                        04506000
SUBROUTINE SERV1FULL;                                                   04508000
BEGIN                                                                   04510000
   DITP(DSAVE).BLOCKRD:=1; <<DATA IS BEING READ BY 2ND SIO PROG>>       04512000
   DBCNTP:=DBCNTP+DCNTP;   <<INCLUDE COUNT OF DATA IN 1ST TBUF>>        04514000
   J:=DITP(DRBCT)-DBCNTP;  <<BYTES REMAINING TO READ>>                  04516000
   TOS:=DITP(DBLKTAIL);                                                 04518000
   DITP(X):=0;                                                          04520000
   WA0(DITP(DTAIL)):=S0;   <<LINK CURRENT TBUF>>                        04522000
   DITP(DTAIL):=TOS;                                                    04524000
   IF J < TBMAXB THEN DCNTP:=J                                          04526000
      ELSE                                                              04528000
   BEGIN  <<CURRENT TBUF NOT ENOUGH TO HANDLE READ>>                    04530000
      DCNTP:=TBMAXB;                                                    04532000
      TOS:=GETTBUF(SECONDARY);                                          04534000
   ASMB(TEST);                                                 <<04836>>04536000
      IF = THEN                                                         04538000
      DEL                                                      <<04836>>04540000
                                                               <<04836>>04542000
                                                               <<04836>>04544000
                                                               <<04836>>04546000
                                                               <<04836>>04548000
         ELSE                                                           04550000
      BEGIN                                                             04552000
         DITP(DBLKTAIL):=TOS;                                           04554000
         WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DBLKTAIL)+2;            04556000
         J:=DITP(DRBCT)-DBCNTP-DCNTP;                                   04558000
         IF J > TBMAXB THEN                                             04560000
         BEGIN                                                          04562000
            WA0(SIOADDR+RDDATAINSTR+1):=TBMAXB;                         04564000
            WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>            04566000
         END                                                            04568000
            ELSE                                                        04570000
         BEGIN                                                          04572000
            WA0(SIOADDR+RDDATAINSTR+1):=J;                              04574000
            WA0(X:=X+1):=[8/32,8/1]; <<96 TO 128:RDEXIT>>               04576000
         END;                                                           04578000
         WA0(X:=X+1):=[1/1,1/0,14/0]; <<FROM LEFT BYTE>>                04580000
         WA0(X:=X+3) := RDSPECL;                               <<04836>>04582000
      END;                                                              04584000
   END;                                                                 04586000
END;     <<--------------END OF SERV1FULL------------------->>          04588000
                                                                        04590000
SUBROUTINE SERV2FULL;                                                   04592000
BEGIN                                                                   04594000
   DITP(DSAVE).BLOCKRD:=0;                                              04596000
   DBCNTP:=DBCNTP+DCNTP;  <<DATA IS BEING READ BY 1ST SIO PROG>>        04598000
   TOS:=DITP(DBLKTAIL);                                                 04600000
   DITP(X):=0;                                                          04602000
   WA0(DITP(DTAIL)):=S0;                                                04604000
   DITP(DTAIL):=TOS;                                                    04606000
   J:=DITP(DRBCT)-DBCNTP;                                               04608000
   IF J < TBMAXB THEN DCNTP:=J    <<BYTE COUNT FOR CURRENT SIO PROG>>   04610000
      ELSE                                                              04612000
   BEGIN                                                                04614000
      DCNTP:=TBMAXB;                                                    04616000
      BUILD2SIO;                                                        04618000
   END;                                                                 04620000
END;   <<-------------------END OF SERV2FULL------------------->>       04622000
                                                                        04624000
                                                                        04626000
                                                                        04628000
SUBROUTINE ALLREAD;                                                     04630000
BEGIN                                                                   04632000
   DBCNTP:=DBCNTP+DCNTP;                                                04634000
   IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                     04636000
      ELSE                                                              04638000
   BEGIN                                                                04640000
      IF NOT WAITFORCR THEN READDONE(0) <<CLEANUPRD,DO CR/LF>>          04642000
         ELSE                                                           04644000
      BEGIN                                                             04646000
         X:=DITP(DSTOP);                                                04648000
         TOS:= IF = THEN CRWAITLF                                       04650000
                    ELSE CRWAIT;                                        04652000
         DITP(DTYPE).PAIRCODE:=TOS;                                     04654000
         LOOKFORCR;                                                     04656000
      END;                                                              04658000
   END;                                                                 04660000
   ASMB(IXIT);                                                          04662000
END;    <<------------------END OF ALLREAD------------------->>         04664000
                                                                        04666000
                                                                        04668000
                                                                        04670000
                                                                        04672000
                                                                        04674000
                                                                        04676000
SUBROUTINE CONTINUERD;                                                  04678000
BEGIN                                                                   04680000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>04682000
      IF WA0(SIOADDR+RDDATAINSTR+1) = 0 THEN ALLREAD           <<04836>>04684000
      ELSE I := RDWAIT  END                                    <<04836>>04686000
   ELSE BEGIN                                                  <<04836>>04688000
      IF NOT DITPL(DSAVE).BLOCKRD THEN                                  04690000
      BEGIN       <<1ST SIO PROG ACTIVE READING>>                       04692000
         IF WA0(SIOADDR+RDDATAINSTR+1)=0 THEN                           04694000
         BEGIN    <<FINISHED FILLING 1ST TBUF>>                         04696000
            IF DITP(DRBCT)<=DBCNTP+DCNTP THEN ALLREAD;                  04698000
            SERV1FULL;    <<SET UP 2ND SIO PROG TO CONTINUE RD>>        04700000
            I:=WAIT2SIO;  <<ENABLE RECV SRQ,THEN TO BLOCKWAIT>>         04702000
         END                                                            04704000
            ELSE                                                        04706000
            I:=RDWAIT;                                                  04708000
      END                                                               04710000
         ELSE                                                           04712000
      BEGIN     <<2ND SIO PROG ACTIVE READING>>                         04714000
         IF WA0(SIOADDR+BLOCKMODRD+1)=0 THEN                            04716000
         BEGIN                                                          04718000
            IF DITP(DRBCT)<=DBCNTP+DCNTP THEN ALLREAD;                  04720000
            SERV2FULL;    <<SET UP 1ST SIO PROG TO CONTINUE RD>>        04722000
            I:=RDWAIT;    <<ENABLE SRQ,THEN WAIT SRQ>>                  04724000
         END                                                            04726000
            ELSE                                                        04728000
            I:=WAIT2SIO;                                                04730000
      END;                                                              04732000
   END;                                                        <<04836>>04734000
END;   <<------------------END OF CONTINUERD----------------->>         04736000
                                                                        04738000
                                                                        04740000
                                                                        04742000
                                                                        04744000
                                                                        04746000
                                                                        04748000
SUBROUTINE RESTARTSPDS;                                                 04750000
BEGIN                                                                   04752000
   X:=DITP.DSTATE;                                                      04754000
   IF = AND NOT DITPL(DCNTRL).SPDSIO THEN ASMB(IXIT);                   04756000
   <<IDLE WAIT PROG WAS ALREADY STOPPED,DO NOTHING>>                    04758000
   IF DITP.DSTATE=READING THEN CONTINUERD ELSE I:=RDWAIT;               04760000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              04762000
   DITP(DSPEED).ECHOON:=0;                                              04764000
   IF <> THEN TOS:=SYSDB+SIOADDR+( IF DITPL(DSAVE).BLOCKRD THEN WRT'RD2 04766000
                                      ELSE WRT'RD )                     04768000
      ELSE                                                              04770000
      TOS:=SYSDB+SIOADDR+I;                                             04772000
      DISABLE;                                                 <<04836>>04774000
   STARTSIO;                                                            04776000
   ASMB(IXIT);                                                 <<04836>>04778000
END;                                                                    04780000
                                                                        04782000
                                                                        04784000
                                                                        04786000
                                                                        04788000
                                                                        04790000
                                                                        04792000
                                                                        04794000
                                                                        04796000
                                                                        04798000
                                                                        04800000
SUBROUTINE STRTSIORD (STARTLOC);                                        04802000
VALUE STARTLOC;    INTEGER STARTLOC;                                    04804000
BEGIN                                                                   04806000
   TOS:=DITP;                                                           04808000
   TOS.NEWLINE:=0;                                                      04810000
   TOS.PAIR:=0;                                                         04812000
   IF <> AND DITP(DTYPE).PAIRCODE=DC2PAIR THEN                          04814000
      TOS.PAIR:=1;      <<XOFF,DELETE,CRWAIT OR CRWAITLF>>              04816000
   DITP:=TOS;                                                           04818000
   WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0]; <<READ DATA CHANNEL INSTR>>     04820000
   I:=X+1;                                                              04822000
   IF DITP(DRBCT)=0 THEN                                                04824000
   BEGIN            <<NO READ BYTE COUNT SPECIFIED>>                    04826000
      IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                  04828000
         ELSE                                                           04830000
         READDONE(0);                                                   04832000
      ASMB(IXIT);                                                       04834000
   END                                                                  04836000
      ELSE                                                              04838000
   BEGIN                                                                04840000
      TEMP:=IF DITPL.SPOOLING THEN SBUFMAXB ELSE TBMAXB;                04842000
      J:=TEMP - (DBCNTP MOD TEMP);  <<REMAINING ROOM IN TBUF>>          04844000
      K:=DITP(DRBCT) - DBCNTP;    <<BYTES REMAINING TO BE READ>>        04846000
      TOS:=IF K <= J THEN K ELSE J;                                     04848000
      IF NOT DITPL.SPOOLING THEN DCNTP:=S0;                             04850000
      WA0(I):=TOS;     <<CHANNEL INSTR BYTE COUNT>>                     04852000
      I:=X+1;                                                           04854000
      IF NOT DITPL.SPOOLING AND K>J THEN PREFETCH                       04856000
         ELSE                                                           04858000
      WA0(I):=[8/32,8/1];  <<FROM 96 TO 128 TO INTERRUPT>>              04860000
      WA0(I+1):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                       04862000
                                 ELSE [1/1,1/0,14/0];                   04864000
      <<IF ODD BYTES REMAINING,NEXT BYTE GOES TO RIGHT HALF>>           04866000
                                                                        04868000
      IF DITPL.SPOOLING THEN                                            04870000
         WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTBUF)                  04872000
         ELSE                                                           04874000
     BEGIN                                                              04876000
      IF DBCNTP MOD TBMAXB = 0 THEN                                     04878000
      BEGIN                                                             04880000
         TOS:=GETTBUF(SECONDARY);                                       04882000
         TOS:=S0;        TOS:=S0;                                       04884000
         IF = THEN                                                      04886000
         BEGIN           <<BANKRUPT>>                                   04888000
            DDEL;        DEL;                                           04890000
            SETREADERROR(IOQP,LOSTDATA);                                04892000
            ASMB(IXIT);                                                 04894000
                                                                        04896000
         END                                                            04898000
            ELSE                                                        04900000
         BEGIN                                                          04902000
            IF DBCNTP=0 THEN DITP(DHEAD):=TOS                           04904000
                        ELSE WA0(DITP(DTAIL)):=TOS;                     04906000
            DITP(DTAIL):=TOS;    <<LINK TO HEAD OF LIST>>               04908000
            X:=SIOADDR+RDDATAINSTR+4;                                   04910000
            WA0(X):=TOS+SYSDB+2;                                        04912000
                        <<TBUF STARTING ADDRESS>>                       04914000
         END;                                                           04916000
      END                                                               04918000
         ELSE                                                           04920000
      WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTAIL)+2+                  04922000
                                  (DBCNTP MOD TBMAXB)&LSR(1);           04924000
     END;                                                               04926000
      WA0(SIOADDR+RDDATAINSTR+6):=RDSPECL; <<SPECL CHAR DETECTED >>     04928000
      WA0(SIOADDR+BLOCKMODRD+6):=RDSPECL;                               04930000
                                                                        04932000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   04934000
      BEGIN                                                             04936000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>04938000
         WA0(X:=X+1):=2;                                       <<04836>>04940000
         WA0(X:=X+1):=1;                                                04942000
         WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; << LEFT BYTE>>       <<04836>>04944000
         WA0(X:=X+1):=SYSDB+SIOADDR+4;  <<ETX BUFFER ADDRESS>>          04946000
         WA0(X:=X+1):=[8/1, 1/1, 7/2];                         <<04836>>04948000
         WA0(X:=X+1):=22;                                      <<04836>>04950000
         WA0(SIOADDR+4):=DC1'ETX;                              <<04836>>04952000
                                                               <<04836>>04954000
                                                               <<04836>>04956000
         IF DITP(DTYPE).TTYPE = NOPROTOCOL THEN BEGIN          <<04836>>04958000
             WA0(SIOADDR+WRTDATAINSTR+1) := 1;                 <<04836>>04960000
            WA0(X:=X+2) := [1/1,1/1,1/1,13/0];                 <<04836>>04962000
         END;                                                  <<04836>>04964000
      END;                                                     <<04836>>04966000
                                                               <<04836>>04968000
     BEGIN                                                              04970000
      X:=DBCNTP;                                                        04972000
      IF = THEN                                                         04974000
     BEGIN                                                              04976000
      IF DITPL(DMODEM).NOSYNC AND NOT DITPL(DMODEM).PRIMED THEN         04978000
      BEGIN                                                             04980000
         IF DITPL(DSPEED).TAPEMODE OR DITPL(DMODEM)&CSL(M202) OR        04982000
         IOQPL(QPAR2).OWNREAD OR DITP(DTYPE).TTYPE<>HP2640X OR          04984000
         DITP.(TERMCHAR':2)=READBINARY OR NOT DITPL(DSPEED).ECHO        04986000
         THEN                                                           04988000
         BEGIN                                                          04990000
            IF DITPL(DMODEM)&CSL(M202) THEN WA0(SIOADDR+5).(11:1):=0    04992000
               ELSE                                                     04994000
               WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                04996000
            DITP.PAIR:=1;                                               04998000
            DITP(DTYPE).PAIRCODE:=NODATAYET;                            05000000
         END                                                            05002000
            ELSE                                                        05004000
         BEGIN                                                          05006000
            WA0(SIOADDR+5).(11:1):=0;  <<TURN OFF INTERF CNTRL ECHO>>   05008000
            DITP.PAIR:=1;                                               05010000
            DITP(DTYPE).PAIRCODE:=NOECHO;                               05012000
            DCNTP:=1;       <<READ ONLY 1 BYTE>>                        05014000
            WA0(SIOADDR+RDDATAINSTR+1):=1;                              05016000
            WA0(X:=X+1):=[8/32,8/1];<<JMP FROM 96 TO 128:RDEXIT>>       05018000
         END;                                                           05020000
      END                                                               05022000
         ELSE                                                           05024000
      WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                         05026000
     END                                                                05028000
         ELSE                                                           05030000
      WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                         05032000
     END;                                                               05034000
   END;                                                                 05036000
   I:=SYSDB+SIOADDR+STARTLOC;                                           05038000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              05040000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>05042000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>05044000
   TOS:=I;                                                              05046000
   STARTSIO;                                                            05048000
   ASMB(IXIT);                                                          05050000
END;       <<------------------END OF STRTSIORD------------------->>    05052000
                                                                        05054000
                                                                        05056000
                                                                        05058000
                                                                        05060000
                                                                        05062000
                                                                        05064000
SUBROUTINE SENDDC1;                                                     05066000
BEGIN                                                                   05068000
   IF DITPL(DMODEM).PRIMED THEN BEGIN                          <<04836>>05070000
      STOPTIMEOUT(READTIMEOUT, DITP);<<STOP TIMER AT ENTER>>   <<04836>>05072000
      DITP(DRTMAX) := 0; << CLEAR REQUEST FOR A TIMER >>       <<04836>>05074000
      DITP(DBTIME) := BLOCKTIME;                               <<04836>>05076000
      STARTTIMEOUT(BLOCKTIMEOUT,DITP)  END;                    <<04836>>05078000
                                                                        05080000
   IF IOQP.RPLEVEL=NULL THEN                                            05082000
   BEGIN       <<OK TO DO TIMING OPERATIONS>>                           05084000
      STARTTIMEOUT(READTIMEOUT,DITP);                                   05086000
      <<TIMEOUT IF CALLER REQUESTED A READ TIME LIMIT>>                 05088000
      DITP(DTYPE).TIMEREAD:=0;                                          05090000
      IF <> THEN          <<TIME THE DURATION OF READ OPERATION>>       05092000
      BEGIN                                                             05094000
         DITP(DTYPE).TIMING:=1;                                         05096000
         DITPD(DRTIMED):=TIMER;                                         05098000
      END;                                                              05100000
   END;                                                                 05102000
                                                                        05104000
   DITP(DSPEED).RESTART:=0;                                             05106000
   DITP(DPNTR):=0;                                                      05108000
   IF NOT DITPL(DMODEM).PRIMED AND IOQP(QPAR2)&LSR(8)<>NULL AND NOT     05110000
   DITPL.SPOOLING THEN BEGIN                                            05112000
      WA0(SIOADDR+RDSTRT+6):=0;  <<DO NOT SKIP SEND DC1>>               05114000
      I:=RDSTRT;                                                        05116000
   END                                                                  05118000
      ELSE                                                              05120000
      I:=RECVOFF;                                                       05122000
   IF NOT DITPL(DMODEM)&CSL(M202) THEN                                  05124000
  BEGIN                                                                 05126000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; <<WRITE DATA INSTR >> <<04836>>05128000
   WA0(X:=X+1):=1;            <<WRITE 1 BYTE>>                          05130000
   WA0(X:=X+1):=1;                                                      05132000
   WA0(X:=X+1):=[1/1,1/1,1/1,13/0];    <<FROM RIGHT BYTE>>              05134000
   WA0(X:=X+1):=SYSDB+SIOADDR+9;    <<ADDR FOR SYNC,DC1>>               05136000
   WA0(X:=X+1):=[8/1,1/1,7/1];                                 <<04836>>05138000
                                                                        05140000
   WA0(X:=X+1):=9;                                             <<04836>>05142000
   IF DITPL(DMODEM).PRIMED THEN <<BLOCK MODE, CLEAR SPEC>>     <<04836>>05144000
      BEGIN                                                    <<04836>>05146000
      WA0(SIOADDR+12) := %15412; << ESCAPE AND LINE FEED >>    <<04836>>05148000
      WA0(X:=X+1) := ";:";                                     <<04836>>05150000
      WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/4];<<CLR SPEC CHAR>> <<04836>>05152000
      WA0(X:=X+1) := 4;                                        <<04836>>05154000
      WA0(X:=X+1) := 1;                                        <<04836>>05156000
      WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>> <<04836>>05158000
      WA0(X:=X+1) := SYSDB + SIOADDR + 12;                     <<04836>>05160000
      WA0(X:=X+1) := [8/0, 8/0]; << JUMP TO OUTPUT DC1 >>      <<04836>>05162000
      WA0(X:=X+1) := RECVOFF - NEWSPECCHAR - 7;                <<04836>>05164000
      I := NEWSPECCHAR;                                        <<04836>>05166000
      END;                                                     <<04836>>05168000
   IF DITP(DTYPE).TTYPE=NOPROTOCOL THEN                        <<04836>>05170000
     BEGIN                                                     <<04836>>05172000
     DITP.DSTATE := READING;                                   <<04836>>05174000
     WA0(SIOADDR+WRTDATAINSTR) := [8/0,8/0]; <<JUMP DC1 >>     <<04836>>05176000
     WA0(X:=X+1) := 30;                                        <<04836>>05178000
     END                                                       <<04836>>05180000
     ELSE DITP.DSTATE := WRTSPECL;                             <<04836>>05182000
  END;                                                                  05184000
   STRTSIORD(I);              <<----SETREADING---->>                    05186000
END;      <<-----------------------END OF SENDDC1------------------->>  05188000
                                                                        05190000
                                                                        05192000
                                                                        05194000
                                                                        05196000
                                                                        05198000
SUBROUTINE SERVWAITCR;                                                  05200000
BEGIN                                                                   05202000
   IF LASTBYTE=CR THEN                                                  05204000
  BEGIN                                                                 05206000
   DITP(DSPEED).RESTART:=0;                                             05208000
   IF <> THEN                                                           05210000
   BEGIN                                                                05212000
      DITP.PAIR:=0;                                                     05214000
      SENDDC1;     <<SEND DC1 TO RESTART READ>>                         05216000
   END                                                                  05218000
      ELSE                                                              05220000
   IF DITP(DTYPE).PAIRCODE=CRWAIT THEN READDONE(1)  <<NO CR/LF>>        05222000
                                  ELSE READDONE(0); <<SEND LF>>         05224000
  END                                                                   05226000
      ELSE                                                              05228000
   RESTARTSPDS;                                                         05230000
END;                                                                    05232000
                                                                        05234000
                                                                        05236000
                                                                        05238000
                                                                        05240000
                                                               <<04836>>05242000
                                                               <<04836>>05244000
                                                               <<04836>>05246000
                                                               <<04836>>05248000
                                                               <<04836>>05250000
                                                               <<04836>>05252000
                                                               <<04836>>05254000
                                                               <<04836>>05256000
                                                               <<04836>>05258000
                                                               <<04836>>05260000
                                                                        05262000
                                                                        05264000
                                                                        05266000
                                                                        05268000
                                                                        05270000
SUBROUTINE DELETBUF;                                                    05272000
BEGIN                                                                   05274000
   TOS:=DITP(DBLKTAIL);                                                 05276000
   DITP(X):=0;                                                          05278000
   IF <> THEN RETURNTBUF (*)                                            05280000
         ELSE DEL;                                                      05282000
   IF DITPL(DSAVE).BLOCKRD THEN DITP(X).BLOCKRD:=0                      05284000
                           ELSE DITP(X).BLOCKRD:=1;                     05286000
         TOS:=DITP(DTAIL);                                              05288000
         X:=@DITP(DHEAD);                                               05290000
         WHILE S0 <> WA0(X) DO X:=WA0(X);                               05292000
               <<STEP DOWN TO THE LAST TBUF>>                           05294000
         TOS:=X;          <<POINTER TO LAST TBUF>>                      05296000
         WA0(X):=0;       <<CLEAR LINK TO CURRENT TBUF>>                05298000
         DITP(DTAIL):=TOS;                                              05300000
         DITP(DBLKTAIL):=TOS;                                           05302000
         DCNTP:=1;                                                      05304000
   IF DITPL(DSAVE).BLOCKRD THEN                                         05306000
   BEGIN                                                                05308000
      J:=SIOADDR+RDDATAINSTR+1;                                         05310000
      WA0(J):=WA0(J)+1;   <<RESTORE ORIGINAL BYTE COUNT>>               05312000
      WA0(X:=X+2):=[1/1,1/0,14/0]; <<1ST BYTE GOES TO LEFT>>            05314000
      WA0(SIOADDR+BLOCKMODRD+1):=1; <<RESET BYTE COUNT>>                05316000
      WA0(X:=X+1):=[8/4,8/1];  <<238 TO 242:INTERRUPT/NO HALT>>         05318000
   END                                                                  05320000
      ELSE                                                              05322000
   BEGIN                                                                05324000
      J:=SIOADDR+BLOCKMODRD+1;                                          05326000
      WA0(J):=WA0(J)+1;                                                 05328000
      WA0(X:=X+2):=[1/1,1/0,14/0];                                      05330000
      WA0(SIOADDR+RDDATAINSTR+1):=1;                                    05332000
      WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>                  05334000
   END;                                                                 05336000
   WA0(X:=X+1):=[1/1,1/1,14/0]; <<INTO RIGHT BYTE>>                     05338000
   J:=X+1;                                                              05340000
   WA0(J):=SYSDB+DITP(DTAIL)+1+TBMAXB/2;                                05342000
END;                                                                    05344000
                                                                        05346000
                                                                        05348000
                                                                        05350000
                                                                        05352000
                                                                        05354000
SUBROUTINE STARTREAD;                                                   05356000
BEGIN                                                                   05358000
   IF DITP.DSTATE=NULL THEN                                             05360000
   BEGIN                                                                05362000
      TOS:=DITPL LAND %174700;                                          05364000
      IF IOQP(QFUNC).FUNC=PTAPEFUNC THEN TOS.SPOOLING:=1                05366000
         ELSE                                                           05368000
      IF IOQP(QPAR2).BINARY <> 0 THEN TOS.BINARYREAD:=1                 05370000
         ELSE                                                           05372000
      BEGIN                                                             05374000
         IF IOQP(QPAR2)&LSR(8) <> NULL THEN                             05376000
         BEGIN                                                          05378000
            TOS.TERMCHAR:=1;                                            05380000
            WA0(SIOADDR+13).(8:8):=IOQP(QPAR2).(0:8);                   05382000
         END;                                                           05384000
         X:=DITP(DSTOP);                                                05386000
         IF <> AND DITP(DMODEM).TMODE=NULL THEN                         05388000
         BEGIN                                                          05390000
            TOS.TERMCHAR:=1;                                            05392000
            TOS.BINARYREAD:=1;                                          05394000
         END;                                                           05396000
      END;                                                              05398000
      DITP:=TOS;                                                        05400000
      @SAVEP:=DITP(DBREAK);                                             05402000
      IF <> AND DITP(DMODEM).TMODE=0 THEN                               05404000
      BEGIN         <<BEGIN WITH PREVIOUSLY SAVED DATA ALREADY READ>>   05406000
         DITP(DBREAK):=0;                                               05408000
         DBCNTP:=SAVEP;     <<RESTORE COUNT OF TOTAL BYTES READ>>       05410000
         MOVE DCNTP:=SAVEP(6),(4);  <<RESTORE DCNT,DHEAD,DTAIL,PNTR>>   05412000
         RETURNIOQ(SAVEP);                                              05414000
         IF DITP(DRBCT) <= DBCNTP THEN                                  05416000
         BEGIN             <<ENOUGH ALREADY READ>>                      05418000
            CLEANUPRD;                                                  05420000
            IOQP(QMISC).RSTATE := READING;<< NOT DONE YET>>    <<04836>>05422000
            DITP.DSTATE:=EORSYNC;                                       05424000
            SENDCRLF(NXTNULL,DITP);                                     05426000
            ASMB(IXIT);                                                 05428000
         END;                                                           05430000
      END;                                                              05432000
      IOQP(QMISC).RSTATE:=READING;                                      05434000
      SENDDC1;                                                          05436000
   END;                                                                 05438000
END;      <<-----------------END OF STARTREAD-------------------->>     05440000
                                                                        05442000
                                                                        05444000
                                                                        05446000
                                                                        05448000
                                                                        05450000
                                                                        05452000
                                                                        05454000
                                                                        05456000
SUBROUTINE SERVC'H;                                                     05458000
BEGIN                                                                   05460000
   DITP.PAIR:=0;                                                        05462000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  05464000
   X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD    <<GET SIO BYTE COUNT>>     05466000
                  THEN BLOCKMODRD ELSE RDDATAINSTR );                   05468000
   I:=DCNTP-WA0(X)-1;  <<COUNT OF DATA BYTES READ,EXCLUDING CH>>        05470000
   DBCNTP:=DBCNTP+I;   <<UPDATE NUMBER OF BYTES READ>>                  05472000
   IF DBCNTP <> 0 THEN                                                  05474000
   BEGIN              <<DATA HAS BEEN INPUT,OK TO DELETE>>              05476000
      X:=DBCNTP MOD TBMAXB;                                             05478000
      IF = THEN DELETBUF                                                05480000
         ELSE                                                           05482000
      DCNTP:=DCNTP-(I-1); <<NEW BYTE CNT=OLD CNT-BYTES INPUT>>          05484000
                                                                        05486000
      DBCNTP:=DBCNTP-1;   <<DECREMENT TOTAL BYTES READ>>                05488000
      J:=DBCNTP MOD TBMAXB;                                             05490000
      X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD            05492000
                                   ELSE RDDATAINSTR );                  05494000
      WA0(X):=DCNTP;                                                    05496000
      WA0(X:=X+2):=IF LOGICAL(J) THEN [1/1,1/1,14/0] <<RIGHT BYTE>>     05498000
                                 ELSE [1/1,1/0,14/0];<<LEFT BYTE>>      05500000
      K:=X+1;                                                           05502000
      WA0(K):=SYSDB+DITP(DTAIL)+2+J&LSR(1);                             05504000
      K:=DITP(DTYPE).DELECHO;                                  <<04836>>05506000
      X:=I;                                                             05508000
      IF <> AND K=2 OR K=3  THEN  <<SEND LF OR C'Y TO BACKSP>> <<04836>>05510000
      BEGIN                                                             05512000
         X := SIOADDR + 4;                                     <<04836>>05514000
         IF K = 3 THEN WA0(X) := CY'ETX                        <<04836>>05516000
                  ELSE WA0(X) := LF'ETX;                       <<04836>>05518000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>05520000
         WA0(X:=X+1):=1;                                                05522000
         WA0(X:=X+1):=1;                                                05524000
         WA0(X:=X+1):=[1/1, 1/0, 1/1, 13/0];                   <<04836>>05526000
         WA0(X:=X+1):=SYSDB+SIOADDR+4;                         <<04836>>05528000
         K:=X+1;                                                        05530000
         DITP.DSTATE := WRTSPECL;                              <<04836>>05532000
         IF DITPL(DMODEM)&CSL(M202) THEN                                05534000
         BEGIN                                                          05536000
            WA0(K):=[8/1,1/1,7/2];                                      05538000
            WA0(X:=X+1):=22; <<FINISHED WRT,STRT RD TURNAROUND>>        05540000
            WA0(X:=X-5) := 2;                                  <<04836>>05542000
            RDTOWRT;                                                    05544000
         END                                                            05546000
            ELSE                                                        05548000
        BEGIN                                                           05550000
         WA0(K) := [8/1,1/1,7/1];                              <<04836>>05552000
         WA0(X+1) := 9;                                        <<04836>>05554000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        05556000
         TOS:=SYSDB+SIOADDR+XMITON;                            <<04836>>05558000
         STARTSIO;                                                      05560000
        END;                                                            05562000
         ASMB(IXIT);                                                    05564000
      END                                                               05566000
         ELSE                                                           05568000
      RESTARTSPDS;      <<RESTART RD SIO PROG AT WAIT SRQ>>             05570000
      ASMB(IXIT);                                                       05572000
   END                                                                  05574000
      ELSE                                                              05576000
   BEGIN                <<NO DATA TO DELETE>>                           05578000
      J:=DBCNTP MOD TBMAXB;                                             05580000
      X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD            05582000
                                             ELSE RDDATAINSTR);         05584000
      WA0(X):=DCNTP;                                                    05586000
      WA0(X:=X+2):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                    05588000
                                 ELSE [1/1,1/0,14/0];                   05590000
      I:=X+1;                                                           05592000
      WA0(I):=SYSDB+DITP(DTAIL)+2+J&LSR(1);                             05594000
      IF DITP(DTYPE).DELECHO=3 THEN BEGIN                      <<04836>>05596000
                                    RESTARTSPDS;               <<04836>>05598000
                                    ASMB(IXIT);                <<04836>>05600000
                                    END;                       <<04836>>05602000
      WA0(SIOADDR+11) := SP'ETX;                               <<04836>>05604000
      WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRITE DATA INSTR>><<04836>>05606000
      WA0(X:=X+1):=1;                                                   05608000
      WA0(X:=X+1):=1;                                                   05610000
      WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<FROM LEFT BYTE>>             05612000
      WA0(X:=X+1):=SYSDB+SIOADDR+11;  <<ADDR FOR "SP">>                 05614000
      K:=X+1;                                                           05616000
      DITP.DSTATE := WRTSPECL;                                 <<04836>>05618000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   05620000
      BEGIN                                                             05622000
         WA0(K):=[8/1,1/1,7/2];                                         05624000
         WA0(X:=X+1):=22;   <<FINISHED WRT,STRT RD TURNAROUND>>         05626000
         WA0(X:=X-5) := 2;                                     <<04836>>05628000
         RDTOWRT;                                                       05630000
      END                                                               05632000
         ELSE                                                           05634000
     BEGIN                                                              05636000
      WA0(K) := [8/1,1/1,7/1];                                 <<04836>>05638000
      WA0(X+1) := 9;                                           <<04836>>05640000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           05642000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>05644000
      STARTSIO;                                                         05646000
     END;                                                               05648000
      ASMB(IXIT);                                                       05650000
   END;                                                                 05652000
END;       <<------------END OF SERVCH------------------>>              05654000
                                                                        05656000
                                                                        05658000
                                                                        05660000
                                                                        05662000
                                                                        05664000
                                                                        05666000
SUBROUTINE SPOOLBFULL;                                                  05668000
   BEGIN                                                                05670000
      DITP(DRQST).SPOOLSW:=1;                                           05672000
      IF <> THEN SETREADERROR(IOQP,LOSTDATA);                           05674000
      TOS:=DITPD(DTBUFD);                                               05676000
      ASMB(XCH);                                                        05678000
      DITPD(X):=TOS;                                                    05680000
      AWAKEIO(DITP,NOIMPEDE);                                           05682000
      DBCNTP:=DBCNTP+SBUFMAXB;                                          05684000
      IF < THEN BEGIN    DBCNTP:=%77777;                                05686000
                         SETREADERROR(IOQP,LOSTDATA);                   05688000
                END;                                                    05690000
      WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0];                              05692000
      WA0(X:=X+1):=SBUFMAXB;                                            05694000
      WA0(X:=X+1):=[8/32,8/1];                                          05696000
                   <<JUMP FROM 96 TO 128:RDEXIT>>                       05698000
      WA0(X:=X+1):=[1/1,1/0,14/0];                                      05700000
      J:=X+1;                                                           05702000
      WA0(J):=SYSDB+DITP(DTBUF);                                        05704000
      RESTRTWAIT;                                                       05706000
   END;                                                                 05708000
                                                                        05710000
                                                                        05712000
                                                                        05714000
                                                                        05716000
SUBROUTINE NEWTBUFRD;                                                   05718000
BEGIN                                                                   05720000
   DITP.PAIR:=0;                                                        05722000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  05724000
   TOS:=GETTBUF(SECONDARY);                                             05726000
   TOS:=S0;                                                             05728000
   IF = THEN NOTBUF;                                                    05730000
   IF DBCNTP=0 THEN DITP(DHEAD):=TOS                                    05732000
               ELSE WA0(DITP(DTAIL)):=TOS;                              05734000
   DITP(DTAIL):=TOS;      <<LINK NEW TBUF TO LAST,UPDATE NEW TAIL>>     05736000
                                                                        05738000
   TEMP:=DITP(DRBCT)-DBCNTP;    <<REMAINING BYTES TO READ>>             05740000
   DCNTP:=IF TEMP<TBMAXB THEN TEMP ELSE TBMAXB;                         05742000
   X:=SIOADDR+RDDATAINSTR;                                              05744000
   WA0(X):=[8/3,8/0];      <<REGENERATE READ DATA CHANNEL INSTR>>       05746000
   WA0(X:=X+1):=DCNTP;      <<READ BYTE COUNT>>                         05748000
   I:=X+1;                                                              05750000
   IF TEMP > TBMAXB THEN PREFETCH                                       05752000
      ELSE                                                              05754000
   WA0(I):=[8/32,8/1];  <<JMP OF 32 TO 128 RDEXIT:INTRPT/CODE2>>        05756000
   WA0(I+1):=[1/1,1/0,14/0];   <<READ INTO LEFT HALF>>                  05758000
   I:=X+1;                                                              05760000
   WA0(I):=SYSDB+DITP(DTAIL)+2;                                         05762000
   WA0(SIOADDR+RDDATAINSTR+6):=RDSPECL;  <<PUT IN INTERRUPT CODE>>      05764000
   WA0(SIOADDR+BLOCKMODRD+6):=RDSPECL;                                  05766000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              05768000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>05770000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>05772000
   TOS:=SYSDB+SIOADDR+RDWAIT;                                           05774000
   STARTSIO;                                                            05776000
END;          <<--------------END OF NEWTBUFRD---------------->>        05778000
                                                                        05780000
                                                                        05782000
                                                                        05784000
                                                                        05786000
SUBROUTINE SIORESTART;                                                  05788000
BEGIN                                                                   05790000
   IF DITP.DSTATE=READING THEN CONTINUERD                               05792000
      ELSE                                                              05794000
   IF DITP.DSTATE=WRITING THEN                                          05796000
   BEGIN                                                                05798000
      IF DITPL.ENQACKWAIT OR DITPL(DTYPE).WAITXON OR STATREQ   <<04836>>05800000
         THEN                                                  <<04836>>05802000
      BEGIN                                                             05804000
         X:=WA0(SIOADDR+WRTDATAINSTR+1);  <<GET BYTE COUNT>>            05806000
      IF = OR DITPL(DTYPE).WAITXON AND NOT STATREQ             <<04836>>05808000
              THEN I:=RDWAIT                                   <<04836>>05810000
              ELSE I:=XMITON;                                  <<04836>>05812000
      END                                                               05814000
         ELSE                                                           05816000
         I:=XMITON;                                            <<04836>>05818000
   END                                                                  05820000
      ELSE                                                              05822000
   IF DITP.DSTATE=EORSYNC THEN I:=XMITON                       <<04836>>05824000
      ELSE                                                     <<04836>>05826000
   IF DITP.DSTATE=TURN202 THEN                                          05828000
      I:=RDWAIT+5    <<DO NOT ENABLE RECV SRQ>>                         05830000
      ELSE                                                              05832000
   IF DITP.DSTATE = NULL THEN                                  <<04836>>05834000
      BEGIN                                                    <<04836>>05836000
      IF STATREQ THEN                                          <<04836>>05838000
         BEGIN                                                 <<04836>>05840000
         IF WA0(SIOADDR+WRTDATAINSTR+1) > 0 THEN               <<04836>>05842000
            I := XMITON                                        <<04836>>05844000
         ELSE                                                  <<04836>>05846000
            I := RDWAIT;                                       <<04836>>05848000
         END                                                   <<04836>>05850000
      ELSE                                                     <<04836>>05852000
         BEGIN                                                 <<04836>>05854000
         IF NOT DITPL(DCNTRL).SPDSIO THEN                      <<04836>>05856000
            ASMB(IXIT)                                         <<04836>>05858000
         ELSE                                                  <<04836>>05860000
            I := RDWAIT;                                       <<04836>>05862000
         END;                                                  <<04836>>05864000
      END                                                      <<04836>>05866000
      ELSE                                                     <<04836>>05868000
   IF DITP.DSTATE = WRTSPECL THEN I:=XMITON                    <<04836>>05870000
      ELSE                                                     <<04836>>05872000
   IF DITP.DSTATE=REPEATING THEN I:=XMITON                     <<04836>>05874000
      ELSE                                                     <<04836>>05876000
      I:=RDWAIT;   <<RESUME READ OR IDLE WAIT>>                         05878000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              05880000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>05882000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>05884000
   TOS:=SYSDB+SIOADDR+I;                                                05886000
   DISABLE;                                                    <<04836>>05888000
   STARTSIO;                                                            05890000
   ASMB(IXIT);                                                          05892000
END;       <<----------------END OF SIORESTART----------------->>       05894000
                                                                        05896000
                                                                        05898000
                                                                        05900000
                                                                        05902000
                                                                        05904000
                                                                        05906000
                                                                        05908000
                                                                        05910000
SUBROUTINE SERVHIOP;                                                    05912000
BEGIN                                                                   05914000
   DITP(DLDEV).SIOHIOP:=0;                                              05916000
   IF = THEN        <<NOT HALTED BY THE BAD GUY>>                       05918000
   BEGIN                                                                05920000
                                                                        05922000
   TOS:=DITP(DCNTRL);                                                   05924000
   TOS.HIOPWAIT:=0;                                                     05926000
   TOS.SPDSIO:=0;                                                       05928000
   DITP(DCNTRL):=S0;                                                    05930000
   IF LS0.SPDSIO THEN                                                   05932000
   BEGIN         <<SPEED SENSE OR IDLE WAIT PROG WAS HALTED>>           05934000
      IF S0.NXTDSTATE=READING THEN STARTREAD                            05936000
         ELSE                                                           05938000
      IF S0.NXTDSTATE=WRITING THEN                                      05940000
         BEGIN                                                          05942000
            DITP(DRQST).STRTWRT:=1;                                     05944000
            AWAKETERMINAL(DITP);                                        05946000
         END                                                            05948000
         ELSE                                                           05950000
      IF S0.NXTDSTATE=EORSYNC THEN                                      05952000
      BEGIN                                                             05954000
         DITP.DSTATE:=EORSYNC;                                          05956000
         SENDCRLF(NXTNULL,DITP);                                        05958000
      END                                                               05960000
         ELSE                                                           05962000
      ASMB(HALT);                                                       05964000
                                                                        05966000
      ASMB(IXIT);                                                       05968000
   END;                                                                 05970000
   DEL;                                                                 05972000
   IF DITP.DSTATE=FINREAD THEN                                          05974000
   BEGIN             <<CLEAN UP READ OPERATION>>                        05976000
      <<READ ABORTED OR PREEMPTED>>                                     05978000
      I:=DITP(DCNTRL).NXTDSTATE;                                        05980000
      DITP(X).NXTDSTATE:=0;                                             05982000
      IF I=EORLF THEN                                                   05984000
      BEGIN      <<READ WAS ABORTED,IOTERM0 COULDN'T HALT SIO PROG>>    05986000
         CLEANUPRD;                                                     05988000
         DITP.DSTATE:=NULL;                                             05990000
         X:=@IOQP;                                                      05992000
         IF <> THEN AWAKETERMINAL(DITP);                                05994000
      END                                                               05996000
         ELSE                                                           05998000
      IF I=EORSYNC THEN                                                 06000000
      BEGIN    <<READ PREEMPTED,SIO PROG WAS NOT HALTED IMMEDIATELY>>   06002000
         CLEANUPRD;                                                     06004000
         DBCNTP:=1;      <<FAKE DBCNT TO RETURN TBUFS IN CASE 1ST TBUF>>06006000
         DITP.DSTATE:=EORSYNC;                                          06008000
         SENDCRLF(NXTNULL,DITP);     <<SEND CR/LF W/INTRPT CODE=3>>     06010000
      END                                                               06012000
         ELSE ASMB(HALT);                                               06014000
   END                                                                  06016000
      ELSE                                                              06018000
   IF DITP.DSTATE=WRITING THEN                                          06020000
   BEGIN          <<WRITE WAS ABORTED,IOTERM0 COULDN'T HALT SIO PROG>>  06022000
      DITP(DRQST).ABORTWRT:=1;    <<FLAG FOR IOTERM0 SERVICE>>          06024000
      DITP.DSTATE:=NULL;                                                06026000
      AWAKETERMINAL(DITP);                                              06028000
   END                                                                  06030000
      ELSE                                                              06032000
   IF DITP.DSTATE=SPDSENSIO THEN                                        06034000
   BEGIN                                                                06036000
      DITP.DSTATE:=NULL;                                                06038000
      X:=@IOQP;                                                         06040000
      IF <> THEN AWAKETERMINAL(DITP);                                   06042000
   END                                                                  06044000
      ELSE                                                              06046000
   ASMB(HALT);                                                          06048000
                                                                        06050000
   ASMB(IXIT);                                                          06052000
                                                                        06054000
   END;                                                                 06056000
END;         <<------------------END OF SERVHIOP----------------->>     06058000
                                                                        06060000
                                                                        06062000
SUBROUTINE WAIT'ON'MODEM;                                      <<04836>>06064000
   BEGIN                                                       <<04836>>06066000
   TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>06068000
   TOS := SYSDB + SIOADDR + SRQOFF;                            <<04836>>06070000
   STARTSIO;                                                   <<04836>>06072000
   END;                                                        <<04836>>06074000
                                                                        06076000
                                                                        06078000
SUBROUTINE STATUSRD;                                                    06080000
BEGIN                                                                   06082000
   K:=WA0(SIOADDR+10).OEPE;   <<GET DEVICE STATUS JUST READ>>           06084000
   IF <> AND (DITP.DSTATE <= WRTSPECL OR                       <<04836>>06086000
              DITP.DSTATE = REPEATING) THEN                    <<04836>>06088000
   BEGIN                                                                06090000
      IF LOGICAL( WA0(SIOADDR+10).OE ) THEN                             06092000
         SETREADERROR(IOQP,LOSTCHAR)                                    06094000
         ELSE                                                           06096000
      IF LOGICAL(WA0(X).PE) AND DITPL.PTYCHK THEN                       06098000
         SETREADERROR(IOQP,PTYERROR);                                   06100000
      SIORESTART;                                                       06102000
   END                                                                  06104000
      ELSE                                                              06106000
   BEGIN                                                                06108000
      DISABLE;                                                 <<04836>>06110000
      K:=WA0(SIOADDR+15);     <<GET MODEM STATUS JUST READ>>            06112000
      WA0(SIOADDR+15).(0:3):=0; <<SET MODEM REF BIT IN BYTE>>           06114000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           06116000
      TOS:=SYSDB+SIOADDR+MODSIOCNTRL+10;                                06118000
      STARTSIO;  <<UPDATE MODEM LINE REFERENCES>>                       06120000
      WA0(DITP(DILTP)) := 0; << CLEAR CPVA 0 TO IGNORE INT.>>  <<04836>>06122000
      J:=DITP(DMODEM);        <<SAVE OLD MODEM STATUS>>                 06124000
      DITP(DMODEM).CF:=K.MODCFREF;                                      06126000
      DITP(DMODEM).CB:=K.MODCBREF;                                      06128000
      DITP(DMODEM).SB:=K.MODSBREF;  <<UPDATE MODEM STATUS>>             06130000
      FLAG:=DITPL(DSAVE).CCVALUE XOR LOGICAL(K.MODCCREF);               06132000
      IF FLAG THEN                                                      06134000
      BEGIN      <<CC HAS CHANGED>>                                     06136000
         DITP(DCNTRL).SPDSIO:=0;                                        06138000
         DITP(DSAVE).CCVALUE:=K.MODCCREF;                               06140000
         TOS:=DITP(DRQST);                                              06142000
         IF DITPL(DSAVE).CCVALUE THEN TOS.DSETREADY:=1                  06144000
                            ELSE TOS.DISCONNECT:=1;                     06146000
         DITP(DRQST):=TOS;                                              06148000
         AWAKETERMINAL(DITP);                                           06150000
         ASMB(IXIT);                                                    06152000
      END;                                                              06154000
      TOS:=DITP(DSAVE).HSTATE;                                          06156000
      IF TOS<=LOGGINGON THEN                                            06158000
      BEGIN     <<ON LINE, OR LOGON IN PROGRESS>>                       06160000
         IF NOT DITPL(DMODEM)&CSL(M202) THEN BEGIN             <<04836>>06162000
         << FULL DUPLEX MODEM, CHECK ONLY CF (DCD) >>          <<04836>>06164000
            FLAG := LOGICAL(J.CF) XOR DITPL(DMODEM).CF;        <<04836>>06166000
            IF FLAG THEN   << CARRIER HAS ACTUALLY CHANGED >>  <<04836>>06168000
               BEGIN                                           <<04836>>06170000
               IF DITPL(DMODEM).CF THEN << CARRIER NOW THERE>> <<04836>>06172000
                  BEGIN                                        <<04836>>06174000
                  STOPTIMEOUT(CFAILTO, DITP);                  <<04836>>06176000
                  SIORESTART;                                  <<04836>>06178000
                  END                                          <<04836>>06180000
               ELSE     << CARRIER HAS FAILED >>               <<04836>>06182000
                  BEGIN                                        <<04836>>06184000
                  IF DITP.DSTATE = READING OR                  <<04836>>06186000
                     DITP.DSTATE = WRTSPECL OR                 <<04836>>06188000
                     DITP.DSTATE = REPEATING THEN              <<04836>>06190000
                     BEGIN                                     <<04836>>06192000
                     TOS := DITP(DIOQP);                       <<04836>>06194000
                     SETREADERROR(*, LOSTDATA);                <<04836>>06196000
                     IF DITP(DMONTR).CFAILCNT > 50 THEN        <<04836>>06198000
                        BEGIN                                  <<04836>>06200000
                        DITP(DRQST).DISCONNECT := 1;           <<04836>>06202000
                        AWAKETERMINAL(DITP);                   <<04836>>06204000
                        ASMB(IXIT);                            <<04836>>06206000
                        END;                                   <<04836>>06208000
                     DMONTRP.CFAILCNT := DMONTRP.CFAILCNT + 1; <<04836>>06210000
                     END;                                      <<04836>>06212000
                  STARTTIMEOUT(CFAILTO, DITP);                 <<04836>>06214000
                  WAIT'ON'MODEM;                               <<04836>>06216000
                  END;                                         <<04836>>06218000
               END                                             <<04836>>06220000
            ELSE   << MUST HAVE JUST BEEN A GLITCH >>          <<04836>>06222000
               SIORESTART;                                     <<04836>>06224000
            END                                                <<04836>>06226000
         ELSE << WE HAVE A HALF DUPLEX MODEM >>                <<04836>>06228000
            BEGIN                                              <<04836>>06230000
            CASE DITP(DMODEM).CF'CB'SB OF                      <<04836>>06232000
<<CF CB SB>>BEGIN                                              <<04836>>06234000
                                                               <<04836>>06236000
<< F  F  F >>  BEGIN << PHONE DISCONNECT; TRANSITION >>        <<04836>>06238000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06240000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>06242000
                  THEN MODCONTROL(TRANSMIT, DITP)              <<04836>>06244000
               ELSE                                            <<04836>>06246000
                  WAIT'ON'MODEM;                               <<04836>>06248000
               END;                                            <<04836>>06250000
                                                               <<04836>>06252000
<< F  F  T >>  BEGIN <<TRANSITION FROM READ TO WRITE >>        <<04836>>06254000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06256000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>06258000
                  THEN MODCONTROL(TRANSMIT', DITP)             <<04836>>06260000
               ELSE                                            <<04836>>06262000
                  WAIT'ON'MODEM;                               <<04836>>06264000
               END;                                            <<04836>>06266000
                                                               <<04836>>06268000
<< F  T  F >>  BEGIN << PHONE DISCONNECT; NOISE; BREAK >>      <<04836>>06270000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06272000
               IF DITP.DSTATE = WRITING OR                     <<04836>>06274000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>06276000
                  DITP.DSTATE = REPEATING OR                   <<04836>>06278000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>06280000
                  DITPD(DRTIMED) := TIMER;                     <<04836>>06282000
               WAIT'ON'MODEM;                                  <<04836>>06284000
               END;                                            <<04836>>06286000
                                                               <<04836>>06288000
<< F  T  T >>  BEGIN << READY TO TRANSMIT DATA >>              <<04836>>06290000
               STOPTIMEOUT(CFAILTO, DITP);                     <<04836>>06292000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>06294000
                  THEN BEGIN                                   <<04836>>06296000
                  STOPTIMEOUT(TURNTO, DITP);                   <<04836>>06298000
                  DITP.DSTATE := DITP(DCNTRL).NXTDSTATE;       <<04836>>06300000
                  DITPD(DRTIMED) := 0D;                        <<04836>>06302000
                  END;                                         <<04836>>06304000
               IF DITP.DSTATE = WRITING OR                     <<04836>>06306000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>06308000
                  DITP.DSTATE = REPEATING OR                   <<04836>>06310000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>06312000
                  BEGIN                                        <<04836>>06314000
                  IF BREAKOK(DITP) AND                         <<04836>>06316000
                     DITPD(DRTIMED) > 0D AND                   <<04836>>06318000
                     TIMER - DITPD(DRTIMED) > 50D THEN         <<04836>>06320000
                     BEGIN                                     <<04836>>06322000
                     DITPD(DRTIMED) := 0D;                     <<04836>>06324000
                     DITP(DSAVE).WAITEDSTATE := DITP;          <<04836>>06326000
                     DITP.DSTATE := WAITED;                    <<04836>>06328000
                     DITP(DRQST).BRKRQST := 1;                 <<04836>>06330000
                     AWAKETERMINAL(DITP);                      <<04836>>06332000
                     END                                       <<04836>>06334000
                  ELSE                                         <<04836>>06336000
                     BEGIN                                     <<04836>>06338000
                     DITPD(DRTIMED) := 0D;                     <<04836>>06340000
                     SIORESTART;                               <<04836>>06342000
                     END;                                      <<04836>>06344000
                  END                                          <<04836>>06346000
               ELSE IF DITP.DSTATE = READING THEN              <<04836>>06348000
                  BEGIN                                        <<04836>>06350000
                  DITPD(DRTIMED) := 0D;                        <<04836>>06352000
                  DSAVEPL.TURNTOWRITE := 0;                    <<04836>>06354000
                  DITP.DSTATE := TURN202;                      <<04836>>06356000
                  STARTTIMEOUT(TURNTO, DITP);                  <<04836>>06358000
                  MODCONTROL(READING, DITP);                   <<04836>>06360000
                  END                                          <<04836>>06362000
               ELSE                                            <<04836>>06364000
                  BEGIN                                        <<04836>>06366000
                  DITPD(DRTIMED) := 0D;                        <<04836>>06368000
                  SIORESTART;                                  <<04836>>06370000
                  END;                                         <<04836>>06372000
               END;                                            <<04836>>06374000
                                                               <<04836>>06376000
<< T  F  F >>  BEGIN << READY TO RECEIVE DATA >>               <<04836>>06378000
               IF DITP.DSTATE = READING AND CFAILTRLX <> 0 THEN<<04836>>06380000
                  BEGIN                                        <<04836>>06382000
                  TOS := DITP(DIOQP);                          <<04836>>06384000
                  SETREADERROR(*, LOSTDATA);                   <<04836>>06386000
                  IF DMONTRP.CFAILCNT > 50 THEN                <<04836>>06388000
                     BEGIN                                     <<04836>>06390000
                     STOPTIMEOUT(CFAILTO, DITP);               <<04836>>06392000
                     DITP(DRQST).DISCONNECT := 1;              <<04836>>06394000
                     AWAKETERMINAL(DITP);                      <<04836>>06396000
                     ASMB(IXIT);                               <<04836>>06398000
                     END;                                      <<04836>>06400000
                  DMONTRP.CFAILCNT := DMONTRP.CFAILCNT + 1;    <<04836>>06402000
                  END;                                         <<04836>>06404000
               STOPTIMEOUT(CFAILTO, DITP);                     <<04836>>06406000
               IF DITP.DSTATE = TURN202 AND                    <<04836>>06408000
                  NOT DSAVEPL.TURNTOWRITE THEN                 <<04836>>06410000
                  BEGIN                                        <<04836>>06412000
                  STOPTIMEOUT(TURNTO, DITP);                   <<04836>>06414000
                  DITP.DSTATE := DITP(DCNTRL).NXTDSTATE;       <<04836>>06416000
                  END;                                         <<04836>>06418000
               IF DITP.DSTATE = WRITING OR                     <<04836>>06420000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>06422000
                  DITP.DSTATE = REPEATING OR                   <<04836>>06424000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>06426000
                  BEGIN                                        <<04836>>06428000
                  DSAVEPL.TURNTOWRITE := 1;                    <<04836>>06430000
                  DITP.DSTATE := TURN202;                      <<04836>>06432000
                  STARTTIMEOUT(TURNTO, DITP);                  <<04836>>06434000
                  MODCONTROL(WRITING, DITP);                   <<04836>>06436000
                  END                                          <<04836>>06438000
               ELSE                                            <<04836>>06440000
                  SIORESTART;                                  <<04836>>06442000
               END;                                            <<04836>>06444000
                                                               <<04836>>06446000
<< T  F  T >>  BEGIN << TRANSITION; BAD MODEM; BAD TERMINAL >> <<04836>>06448000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06450000
               WAIT'ON'MODEM;                                  <<04836>>06452000
               END;                                            <<04836>>06454000
                                                               <<04836>>06456000
<< T  T  F >>  BEGIN << BAD MODEM; RESET ON TERMINAL >>        <<04836>>06458000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06460000
               DITP(DCNTRL).NXTDSTATE := DITP;                 <<04836>>06462000
               DSAVEPL.TURNTOWRITE := 1;                       <<04836>>06464000
               DITP.DSTATE := TURN202;                         <<04836>>06466000
               MODCONTROL(WRITING, DITP);                      <<04836>>06468000
               END;                                            <<04836>>06470000
                                                               <<04836>>06472000
<< T  T  T >>  BEGIN << TRANSITION FROM READ TO WRITE >>       <<04836>>06474000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>06476000
               WAIT'ON'MODEM;                                  <<04836>>06478000
               END;                                            <<04836>>06480000
                                                               <<04836>>06482000
            END;                                               <<04836>>06484000
         END;                                                  <<04836>>06486000
      END;                                                     <<04836>>06488000
   END;                                                                 06490000
END;          <<---------------END OF STATUSRD--------------------->>   06492000
                                                                        06494000
                                                                        06496000
                                                                        06498000
SUBROUTINE TBFULL;                                                      06500000
BEGIN                                                                   06502000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>06504000
      DITPL(DLDEV).RDFLUSH := 0;                               <<04836>>06506000
      RDCOMPLETE;                                              <<04836>>06508000
      ASMB(IXIT)  END;                                         <<04836>>06510000
   IF NOT DITPL.SPOOLING THEN                                           06512000
  BEGIN                                                                 06514000
   DBCNTP:=DBCNTP+DCNTP;   <<INCREMENT COUNT OF BYTES READ SO FAR>>     06516000
   IF DBCNTP>=DITP(DRBCT) THEN                                          06518000
   BEGIN           <<REQUESTED RD COUNT HAS BEEN SATISFIED>>            06520000
      IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                  06522000
         ELSE                                                           06524000
      BEGIN                                                             06526000
         IF NOT WAITFORCR THEN READDONE(0) <<CLEANUPRD,DO CR/LF         06528000
                                             OR LF IF NECESSARY>>       06530000
            ELSE                                                        06532000
         BEGIN                                                          06534000
            X:=DITP(DSTOP);  <<TEST FOR TRANSPARENT READ MODE>>         06536000
            TOS:= IF= THEN CRWAITLF  <<ECHO LF AFTER CR DETECTED>>      06538000
                      ELSE CRWAIT;   <<JUST WAIT FOR CR>>               06540000
            DITP(DTYPE).PAIRCODE:=TOS;                                  06542000
            LOOKFORCR;    <<START SIO PROG TO WAIT FOR CR>>             06544000
         END;                                                           06546000
      END;                                                              06548000
   END                                                                  06550000
      ELSE                                                              06552000
                                                                        06554000
   BEGIN                                                                06556000
      IF DITP(DTYPE).PAIRCODE=NOECHO AND DBCNTP=1 THEN                  06558000
      BEGIN    <<1ST BYTE RECVD WHEN ECHO WAS OFF>>                     06560000
         DITP(X).PAIRCODE:=0;   DITP.PAIR:=0;                           06562000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>06564000
         WA0(X:=X+1):=1;   <<ECHO BACK CHAR JUST READ>>                 06566000
         WA0(X:=X+1):=1;                                                06568000
         WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<LEFT BYTE>>               06570000
         J:=X+1;                                                        06572000
         WA0(J):=SYSDB+DITP(DTAIL)+2;                                   06574000
         WA0(X:=X+1):=[8/0,8/0];                                        06576000
         WA0(X:=X+1):=25;                                      <<04836>>06578000
         TEMP:=DITP(DRBCT)-DBCNTP;                                      06580000
         DCNTP:=IF TEMP<TBMAXB THEN TEMP ELSE (TBMAXB-1);               06582000
         WA0(SIOADDR+RDDATAINSTR+1):=DCNTP;  <<RESTORE BYTE COUNT>>     06584000
         J:=X+1;  IF TEMP+1>TBMAXB THEN WA0(J):=[8/125,8/1]<<96 TO 221>>06586000
                                 ELSE WA0(J):=[8/32,8/1];<<96 TO 128>>  06588000
         WA0(X:=X+1):=[1/1,1/1,14/0]; <<NEXT BYTE GOES TO RIGHT>>       06590000
         J:=X+1;                                                        06592000
         WA0(J):=SYSDB+DITP(DTAIL)+2;                                   06594000
         WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                      06596000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        06598000
         TOS:=SYSDB+SIOADDR+RECVOFF; <<START AT XMIT SRQ ENABLE>>       06600000
         STARTSIO;                                                      06602000
         ASMB(IXIT);                                                    06604000
      END                                                               06606000
         ELSE                                                           06608000
      NEWTBUFRD;   <<GET A NEW TBUF TO CONTINUE READ OPERATION>>        06610000
   END;                                                                 06612000
  END                                                                   06614000
      ELSE                                                              06616000
   SPOOLBFULL;                                                          06618000
END;           <<-----------------END OF TBFULL----------------->>      06620000
                                                                        06622000
                                                                        06624000
                                                                        06626000
                                                                        06628000
                                                                        06630000
                                                                        06632000
SUBROUTINE FINCRLF;                                                     06634000
BEGIN                                                                   06636000
   IF DITP.DSTATE=EORSYNC THEN                                          06638000
   <<CR/LF WAS SENT TO CLEAN UP PREVIOUS OPERATION>>                    06640000
   BEGIN                                                                06642000
      DITP.DSTATE:=NULL;                                                06644000
      IDLEWAIT(DITP);   <<START IDLE WAIT SIO PROG>>                    06646000
      X:=@IOQP;                                                         06648000
      IF <> THEN BEGIN                                         <<04836>>06650000
         IF IOQP(QFUNC).FUNC = 0 << READ >> THEN BEGIN         <<04836>>06652000
            IF IOQP(QMISC).READSTOP <> 0 THEN                  <<04836>>06654000
               IOQP(QMISC).RSTATE := STOPPED                   <<04836>>06656000
            ELSE                                               <<04836>>06658000
               IOQP(QMISC).RSTATE := READCMPLTD;               <<04836>>06660000
            END;                                               <<04836>>06662000
         AWAKETERMINAL(DITP);                                  <<04836>>06664000
         END;                                                  <<04836>>06666000
   END                                                                  06668000
      ELSE                                                              06670000
   ASMB(HALT);                                                          06672000
END;                                                                    06674000
                                                                        06676000
                                                                        06678000
                                                                        06680000
SUBROUTINE TBEMPTY;                                                     06682000
BEGIN                                                                   06684000
   DBCNTP:=DBCNTP-DCNTP;   <<UPDATE COUNT OF REMAINING WRITE BYTES>>    06686000
   IF <= THEN                                                           06688000
   BEGIN                   <<NO MORE WRITE BYTES REMAINING>>            06690000
      DBCNTP:=0;                                                        06692000
                                                               <<04836>>06694000
      IF DITPL(DCNTRL).FILLING THEN                                     06696000
      BEGIN                <<IOTERM0 IS FILLING CURRENT TBUF>>          06698000
         DITP(DPNTR):=DITP(DPNTR)+DCNTP;                                06700000
                      <<UPDATE BYTE PNTR FOR IOTERM0 TO RESTART>>       06702000
         IF DITP(DPNTR) >= TBMAXB THEN BEGIN                   <<04836>>06704000
            DITP(DTANKB) := DITP(DTANKB) - TBMAXB;             <<04836>>06706000
            DITP(DPNTR) := 0;                                  <<04836>>06708000
            TOS := DITP(DHEAD);                                <<04836>>06710000
            DITP(DHEAD) := WA0(S0);                            <<04836>>06712000
            RETURNTBUF( * );                                   <<04836>>06714000
         END;                                                  <<04836>>06716000
         DCNTP:=-2;   <<SET FLAG TO INFORM IOTERM0 OF PAUSED WRT>>      06718000
      END                                                               06720000
         ELSE                                                           06722000
      BEGIN           <<WRITE OPERATION IS COMPLETED>>                  06724000
         DITP(DCNTRL).LFLAST:=0;                                        06726000
         IF <> THEN DITP.NEWLINE:=1;<<POSTSPACE LF HAS BEEN OUTPUT>>    06728000
         TOS:=DITP(DHEAD);    DITP(X):=0;                               06730000
         IF S0 <> 0 THEN                                       <<04836>>06732000
            RETURNTBUF( * )                                    <<04836>>06734000
         ELSE DEL;                                             <<04836>>06736000
         DITP(DTANKB):=0;                                               06738000
         DITP(DPNTR):=0;                                                06740000
         DITP.DSTATE:=NULL;                                             06742000
         <<**************CHECKTQUEUE******************>>                06744000
         DITP(DMODEM).WRTCOUNTED:=0;                                    06746000
         IF <> THEN WRTCOUNTER:=WRTCOUNTER-1;                           06748000
         <<DECREMENT NUMBER OF TERMINALS DOING FAST WRITE>>             06750000
         IF HP2631B AND DITPL(DLDEV).DOSTATREQ THEN            <<04836>>06752000
             BEGIN                                             <<04836>>06754000
             DCNTP := 0;                                       <<04836>>06756000
             STATREQUEST(DITP);                                <<04836>>06758000
             RETURN;                                           <<04836>>06760000
             END;                                              <<04836>>06762000
         X:=DITP(DRQST);                                                06764000
         IF = THEN                                                      06766000
         BEGIN                                                          06768000
            IF DITPL.ACTIVE THEN BEGIN                         <<04836>>06770000
               DITP.REQUEST := 1;                              <<04836>>06772000
               IDLEWAIT(DITP);                                 <<04836>>06774000
            END                                                <<04836>>06776000
            <<IOTERM0 CURRENTLY ACTIVE,SET FLAG TO REQUEST SERVICE>>    06778000
               ELSE                                                     06780000
            BEGIN                                                       06782000
               X:=@IOQP;                                                06784000
               IF <> AND IOQP(QMISC).RSTATE=READWAITING THEN            06786000
                  STARTREAD                                             06788000
                  ELSE                                                  06790000
               BEGIN                                                    06792000
                  X:=@IOQP;                                             06794000
                  IF = OR @IOQP<>0 AND NOT IOQPL(QMISC).(11:1)          06796000
                     THEN      <<NO REQUEST,OR NOT WAITING TO TANK>>    06798000
                  IDLEWAIT (DITP);                                      06800000
                  IF @IOQP <> 0 THEN AWAKETERMINAL(DITP);               06802000
               END;                                                     06804000
            END;                                                        06806000
         END;                                                           06808000
      END;                                                              06810000
   END                                                                  06812000
         ELSE                                                           06814000
      BEGIN       <<CURRENT TBUF HAS BEEN EMPTIED>>                     06816000
      IF DITP(DPNTR)+DCNTP >= TBMAXB THEN                               06818000
         BEGIN                                                          06820000
            DITP(DTANKB):=DITP(DTANKB)-TBMAXB;                          06822000
            <<UPDATE COUNT OF BYTES IN OUTSTANDING TBUFS>>              06824000
            DITP(DPNTR):=0;                                             06826000
            TOS:=DITP(DHEAD);          <<GET PNTR TO CURRENT TBUF>>     06828000
            DITP(DHEAD):=WA0(S0);    <<GET NEXT LINKED TBUF>>           06830000
            RETURNTBUF(*);                                              06832000
         END                                                            06834000
         ELSE                                                           06836000
            DITP(DPNTR):=DITP(DPNTR)+DCNTP; <<MORE IN CURRENT TBUF>>    06838000
                                                                        06840000
         X:=SIOADDR+WRTDATAINSTR;                                       06842000
         K:=X+1;                                                        06844000
         WA0(X):=[8/4,8/0];   <<REGENERATE WRITE DATA CHANNEL INSTR>>   06846000
         WA0(X:=X+2):=1;      <<BURST LENGTH=1>>                        06848000
         J:=X+1;                                                        06850000
         IF DITPL(DPNTR) THEN WA0(J):=[1/1,1/1,1/1,13/0]                06852000
                         ELSE WA0(J):=[1/1,1/0,1/1,13/0];               06854000
         WA0(J+1):=SYSDB+DITP(DHEAD)+2+DITP(DPNTR)&LSR(1);              06856000
         IF LOGICAL(WA0(DITP(DHEAD)+1).WRTENQ)  THEN                    06858000
         BEGIN        <<ENQ WAS IMBEDDED IN CURRENT TBUF>>              06860000
            WA0(X).WRTENQ:=0;                                           06862000
            J:=WA0(X).ENQOFFSET;  <<OFFSET OF ENQ IN TBUF>>             06864000
            DCNTP:=J+1-DITP(DPNTR);                                     06866000
            IF DCNTP<=0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);          06868000
            WA0(K):=DCNTP;                                              06870000
            WA0(X:=X+4):=[8/0,8/0];                                     06872000
            <<AFTER ENQ,JMP FROM 41 TO 71:DISABLE XMIT SRQ;RD ACK>>     06874000
            WA0(X:=X+1):=30;                                            06876000
            X:=SIOADDR+RDDATAINSTR;                                     06878000
            WA0(X):=[8/3,8/0];    <<GENERATE READ DATA CHENNEL INSTR>>  06880000
            WA0(X:=X+1):=1;       <<READ 1 BYTE>>                       06882000
            WA0(X:=X+1):=[8/%361,8/1];                                  06884000
                         <<TERMINATION JMP OF -15 BACK TO WAIT SRQ>>    06886000
            WA0(X:=X+1):=[1/1,1/1,4/1,10/0];  <<RIGHT BYTE,NO UPDATE>>  06888000
            WA0(X:=X+1):=SYSDB+SIOADDR+10;  <<BOTTOMLESS DATA DUMP>>    06890000
            DITP.ENQACKWAIT:=1;                                         06892000
            STARTTIMEOUT(HP2640TO,DITP);   <<SET TIMEOUT LIMIT=10SEC>>  06894000
                                                                        06896000
         END                                                            06898000
            ELSE                                                        06900000
         BEGIN                                                          06902000
            J:=TBMAXB-DITP(DPNTR);                                      06904000
            DCNTP:=IF J < DBCNTP THEN J                                 06906000
                                 ELSE DBCNTP;                           06908000
            IF DCNTP<=0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);          06910000
            WA0(K):=DCNTP;                                              06912000
            WA0(X:=X+4):=[8/1,1/1,7/1];                                 06914000
            <<INTERRUPT/HALT WITH CODE=1:TBUF EMPTY>>                   06916000
            WA0(X:=X+1):=1;                                             06918000
                                                                        06920000
         END;                                                           06922000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        06924000
         X:=GETDRT(S0,DRT3).IDLESIO;                           <<04836>>06926000
         IF <> THEN SUDDENDEATH(209);                          <<04836>>06928000
          TOS := SYSDB + SIOADDR + WRTBASE;                    <<04836>>06930000
         STARTSIO;     <<START SIO AT WAIT SRQ>>                        06932000
      END;                                                              06934000
END;              <<------------END OF TBEMPTY------------->>           06936000
                                                                        06938000
                                                                        06940000
                                                                        06942000
                                                                        06944000
                                                                        06946000
                                                                        06948000
                                                                        06950000
                                                                        06952000
                                                                        06954000
                                                                        06956000
                                                                        06958000
                                                                        06960000
SUBROUTINE DELETEBYTE;                                                  06962000
BEGIN                                                                   06964000
   IF DITPL(DSAVE).BLOCKRD                                              06966000
      THEN J:=BLOCKMODRD                                                06968000
      ELSE J:=RDDATAINSTR;                                              06970000
   X:=SIOADDR+J+3;                                                      06972000
   RIGHT:=IF LOGICAL(WA0(X).(1:1)) THEN TRUE <<NXT BYTE GOES TO RIGHT>> 06974000
                                   ELSE FALSE;                          06976000
   IF RIGHT THEN                                                        06978000
      WA0(X).(1:1):=0   <<DELETE C'Y SO NEXT BYTE GOES TO LEFT>>        06980000
      ELSE                                                              06982000
   BEGIN                                                                06984000
      WA0(X).(1:1):=1;  <<C'Y NOW IN RIGHT,WHERE NEXT WILL GO>>         06986000
      I:=X+1;                                                           06988000
      WA0(I):=WA0(I)-1; <<DECREMENT TBUF ADDRESS>>                      06990000
   END;                                                                 06992000
   I:=SIOADDR+J+1;                                                      06994000
   WA0(I):=WA0(I)+1;    <<INCREMENT RD BYTE COUNT TO DELETE C'Y>>       06996000
END;                                                                    06998000
                                                                        07000000
                                                                        07002000
                                                                        07004000
SUBROUTINE SERVC'Y;                                                     07006000
BEGIN                                                                   07008000
   IF @IOQP<>0 AND DITP.DSTATE=READING THEN                             07010000
  BEGIN                                                                 07012000
   IF DITPL(DSAVE).BLOCKRD THEN                                         07014000
            J:=BLOCKMODRD                                               07016000
      ELSE  J:=RDDATAINSTR;                                             07018000
   K:=DCNTP-WA0(SIOADDR+J+1)-1;                                         07020000
   <<TOTAL NUMBER OF BYTES READ,EXCLUDING C'Y>>                         07022000
   DBCNTP:=DBCNTP+K;   <<UPDATE TOTAL BYTES READ>>                      07024000
   DCNTP:=DCNTP-K;     <<UPDATE REMAINING BYTES TO BE READ>>            07026000
  END;                                                                  07028000
   DITP(DSPEED).TAPEMODE:=0;                                            07030000
   IF <> OR NOT SSBREAKOK(DITP) THEN                                    07032000
   BEGIN                                                                07034000
      IF DITP.DSTATE=READING AND @IOQP<>0 THEN                          07036000
     BEGIN                                                              07038000
      IF DBCNTP=0 THEN                                                  07040000
      BEGIN                                                             07042000
         TOS:=DITP(DHEAD);   DITP(X):=0;                                07044000
         RETURNTBUF(*);                                                 07046000
         TOS:=DITP(DBLKTAIL);                                           07048000
         DITP(X):=0;                                                    07050000
         IF <> THEN RETURNTBUF (*)                                      07052000
               ELSE DEL;                                                07054000
         STRTSIORD(RDWAIT);   <<CONTINUE READ OPERATION>>               07056000
      END                                                               07058000
         ELSE                                                           07060000
                                                                        07062000
         DELETEBYTE;     <<DELETE C'Y FROM TBUF>>                       07064000
     END;                                                               07066000
         SIORESTART;     <<RESTART SIO PROG AT WAIT SRQ>>               07068000
                                                                        07070000
   END                                                                  07072000
      ELSE                                                              07074000
   BEGIN       <<OK TO ACCEPT C'Y>>                                     07076000
      DITP(DSAVE).WAITEDSTATE:=DITP;                                    07078000
      DITP.DSTATE:=WAITED;                                              07080000
      DITP(DRQST).SSBRQST:=1; <<SET BIT TO REQUEST IOTERM SERVICE>>     07082000
      AWAKETERMINAL(DITP);                                              07084000
      ASMB(IXIT);                                                       07086000
   END;                                                                 07088000
END;                                                                    07090000
                                                                        07092000
                                                                        07094000
                                                                        07096000
                                                                        07098000
                                                                        07100000
SUBROUTINE SERVWAITACK;                                                 07102000
BEGIN                                                                   07104000
   I:=WA0(SIOADDR+10).(9:7);                                            07106000
   WA0(X):=0;                                                           07108000
   IF I = ACK AND DITPL.ENQACKWAIT THEN                        <<04836>>07110000
   BEGIN                                                                07112000
                                                                        07114000
      DITP.ENQACKWAIT:=0;                                               07116000
      STOPTIMEOUT(HP2640TO,DITP);                                       07118000
      IF DITPL(DTYPE).WAITXON THEN RESTRTWAIT                  <<04836>>07120000
                              ELSE TBEMPTY;                    <<04836>>07122000
   END                                                                  07124000
      ELSE                                                              07126000
   IF I=XOFF THEN                                                       07128000
   BEGIN                                                                07130000
      STOPTIMEOUT(HP2640TO,DITP);                                       07132000
      DITP(DTYPE).WAITXON := 1;                                <<04836>>07134000
      RESTRTWAIT;                                                       07136000
   END                                                                  07138000
      ELSE                                                              07140000
   IF I=XON AND DITP(DTRLX).(0:8)=0 THEN                                07142000
   BEGIN                                                                07144000
      STOPTIMEOUT(XOFFTIMEOUT, DITP);                          <<04836>>07146000
      DITP(DTYPE).WAITXON := 0;                                <<04836>>07148000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>07150000
         BEGIN                                                 <<04836>>07152000
         STARTTIMEOUT(HP2640TO, DITP);                         <<04836>>07154000
         RESTRTWAIT;                                           <<04836>>07156000
         END                                                   <<04836>>07158000
      ELSE                                                     <<04836>>07160000
         TBEMPTY;                                              <<04836>>07162000
   END                                                                  07164000
      ELSE                                                     <<04836>>07166000
   IF I=CNTRLY THEN SERVC'Y                                    <<04836>>07168000
      ELSE                                                              07170000
   RESTRTWAIT;                                                          07172000
END;                                                                    07174000
                                                                        07176000
                                                                        07178000
                                                                        07180000
                                                                        07182000
                                                                        07184000
                                                                        07186000
                                                                        07188000
                                                                        07190000
SUBROUTINE SERVWAITC'A;                                                 07192000
BEGIN                                                                   07194000
   I:=LASTBYTE;                                                         07196000
   IF I=CNTRLA THEN                                                     07198000
   BEGIN                                                                07200000
                                                                        07202000
      IF DITPL(DTYPE).CONSINTRPT AND DITP(DLDEV).DLDEVN=CONSLDEV        07204000
         THEN AWAKE (PROGENPCBP, JUNKWAIT, NOWAIT);                     07206000
      RESTRTWAIT;                                                       07208000
   END                                                                  07210000
      ELSE IF NOT DITPL.UP THEN SPEEDSENSE ELSE                <<04836>>07212000
   IF I=CNTRLY THEN SERVC'Y                                             07214000
      ELSE IF I = XON AND DITPL(DTYPE).WAITXON THEN            <<04836>>07216000
   BEGIN                                                                07218000
      DITP(DTYPE).WAITXON:=0;                                  <<04836>>07220000
      STOPTIMEOUT(XOFFTIMEOUT, DITP);                          <<04836>>07222000
      WA0(SIOADDR+RDDATAINSTR+6) := WAITACK;                   <<04836>>07224000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>07226000
         BEGIN                                                 <<04836>>07228000
         STARTTIMEOUT(HP2640TO, DITP);                         <<04836>>07230000
         IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN              <<04836>>07232000
            TBEMPTY                                            <<04836>>07234000
         ELSE                                                  <<04836>>07236000
            RESTRTWAIT;                                        <<04836>>07238000
         END                                                   <<04836>>07240000
      ELSE                                                     <<04836>>07242000
         TBEMPTY;                                              <<04836>>07244000
   END                                                                  07246000
      ELSE                                                              07248000
   RESTRTWAIT;                                                          07250000
END;                                                                    07252000
                                                                        07254000
                                                                        07256000
                                                                        07258000
                                                                        07260000
                                                                        07262000
SUBROUTINE SERVNXTCRLF;                                                 07264000
BEGIN                                                                   07266000
   SENDCRLF(NXTRD,DITP);                                                07268000
   <<SEND CR/LF; WHEN COMPLETED, RESTART READ>>                         07270000
END;                                                                    07272000
                                                                        07274000
                                                                        07276000
                                                                        07278000
                                                                        07280000
                                                                        07282000
SUBROUTINE SERVNXTRD;                                                   07284000
BEGIN                                                                   07286000
   IF DITPL(DMODEM)&CSL(M202) THEN                                      07288000
   BEGIN                                                       <<04836>>07290000
     DITP.DSTATE := WRTSPECL;                                  <<04836>>07292000
     STRTSIORD(XMITON);                                        <<04836>>07294000
   END                                                         <<04836>>07296000
   ELSE                                                        <<04836>>07298000
   BEGIN                                                       <<04836>>07300000
     DITP.DSTATE := READING;                                   <<04836>>07302000
     STRTSIORD(WRT'RD);                                        <<04836>>07304000
   END;                                                        <<04836>>07306000
                                                               <<04836>>07308000
END;                                                                    07310000
                                                                        07312000
                                                                        07314000
                                                               <<04836>>07316000
                                                               <<04836>>07318000
SUBROUTINE DELETEINPUT;                                        <<04836>>07320000
BEGIN                                                          <<04836>>07322000
   DBCNTP:=DCNTP:=0;                                           <<04836>>07324000
   DITP.PAIR:=0;                                               <<04836>>07326000
   DITPL(DSAVE).BLOCKRD:=0;                                    <<04836>>07328000
   X:=DITP(DHEAD);                                             <<04836>>07330000
   WHILE <> DO                                                 <<04836>>07332000
   BEGIN         <<RETURN ALL OUTSTANDING TBUFS>>              <<04836>>07334000
      TOS:=X;    <<GET POINTER TO HEAD OF LIST>>               <<04836>>07336000
      X:=WA0(X); <<GET POINTER TO NEXT>>                       <<04836>>07338000
      RETURNTBUF(*);                                           <<04836>>07340000
   END;                                                        <<04836>>07342000
   DITP(DHEAD) := 0;                                           <<04836>>07344000
   TOS:=DITP(DBLKTAIL);                                        <<04836>>07346000
   DITP(X):=0;                                                 <<04836>>07348000
   IF <> THEN RETURNTBUF (*)                                   <<04836>>07350000
         ELSE DEL;                                             <<04836>>07352000
END;                                                           <<04836>>07354000
                                                               <<04836>>07356000
                                                               <<04836>>07358000
                                                                        07360000
                                                                        07362000
SUBROUTINE SERVC'X;                                                     07364000
BEGIN                                                                   07366000
   DELETEINPUT;                                                <<04836>>07368000
   X:=DITP(DSPEED);                                                     07370000
   IF < OR DITPL(DMODEM).PRIMED THEN                                    07372000
   BEGIN         <<TAPEMODE OR BLOCK MODE READ>>                        07374000
      IF NOT DITPL(DMODEM).NOSYNC OR DITPL(DMODEM).PRIMED AND           07376000
      DITP(DTYPE).TTYPE=HP2640X THEN                                    07378000
      BEGIN      <<WAIT FOR CR TO RESTART READ>>                        07380000
         DITP(DSPEED).RESTART:=1;                                       07382000
         DITP(DTYPE).PAIRCODE:=CRWAIT;                                  07384000
         LOOKFORCR;                                                     07386000
         ASMB(IXIT);                                                    07388000
      END                                                               07390000
         ELSE                                                           07392000
      NEWTBUFRD;  <<GET A NEW TBUF TO CONTINUE READ>>                   07394000
   END                                                                  07396000
      ELSE                                                              07398000
   IF DITPL(DLDEV).NO'CX'ECHO THEN                                      07400000
      STRTSIORD(RDWAIT)  <<SUPPRESS ECHO,GO RESTART READ AGAIN>>        07402000
      ELSE                                                              07404000
   BEGIN                                                                07406000
      DITP.DSTATE:=REPEATING;  <<ECHO !!!,CR/LF THEN RESTART RD>>       07408000
      WA0(SIOADDR+12):="!!";                                            07410000
      WA0(X:=X+1).(0:8):="!";                                           07412000
      WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRITE DATA INSTR>><<04836>>07414000
      WA0(X:=X+1):=3;       <<WRITE BYTE COUNT>>                        07416000
      WA0(X:=X+1):=1;                                                   07418000
      WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<START FROM LEFT>>            07420000
      WA0(X:=X+1):=SYSDB+SIOADDR+12;                                    07422000
      WA0(X:=X+1):=[8/1,1/1,7/1];  <<INTRPT/HALT,CODE TO CPVA1>>        07424000
      WA0(X:=X+1):=NXTCRLF; <<INTRPT CODE: SEND CR/LF NEXT>>            07426000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   07428000
         RDTOWRT    <<START WRITE TURNAROUND>>                          07430000
         ELSE                                                           07432000
     BEGIN                                                              07434000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           07436000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>07438000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>07440000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>07442000
                                                               <<04836>>07444000
      STARTSIO;                                                         07446000
     END;                                                               07448000
   END;                                                                 07450000
   ASMB(IXIT);                                                          07452000
END;                                                                    07454000
                                                                        07456000
                                                                        07458000
                                                                        07460000
                                                                        07462000
                                                                        07464000
SUBROUTINE EORFOUND;                                                    07466000
BEGIN                                                                   07468000
   IF DITPL(DSAVE).BLOCKRD                                              07470000
      THEN K:=BLOCKMODRD                                                07472000
      ELSE K:=RDDATAINSTR;                                              07474000
   DBCNTP:=DBCNTP+DCNTP-WA0(SIOADDR+K+1);<<INCLUDE EOR>>                07476000
   SETREADERROR(IOQP,SPECIALSTOP);                                      07478000
   IF NOT WAITFORCR THEN READDONE(1); <<DO NOT SEND CR/LF>>             07480000
   DITP.PAIR:=1;                                                        07482000
   DITP(DTYPE).PAIRCODE:=CRWAIT;                                        07484000
   LOOKFORCR;                                                           07486000
END;                                                                    07488000
                                                                        07490000
                                                                        07492000
                                                                        07494000
                                                                        07496000
SUBROUTINE CHECKEOR;                                                    07498000
BEGIN                                                                   07500000
   DITP.PAIR:=0;                                                        07502000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  07504000
   IF DITPL.(TERMCHAR':1) AND IOQP(QPAR2)&LSR(8)=I AND I<>0             07506000
      THEN EORFOUND                                                     07508000
      ELSE                                                              07510000
   RESTARTSPDS;                                                         07512000
END;                                                                    07514000
                                                                        07516000
                                                                        07518000
                                                                        07520000
                                                                        07522000
SUBROUTINE SERVDC2;                                                     07524000
BEGIN                                                                   07526000
   I:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD                     07528000
                            THEN BLOCKMODRD ELSE RDDATAINSTR ));        07530000
   IF DITP(DTYPE).PAIRCODE=NODATAYET OR                        <<04836>>07532000
      AUTOHANDSH AND NOT DITPL(DMODEM).PRIMED THEN             <<04836>>07534000
   BEGIN                                                                07536000
      DITP(DTYPE).PAIRCODE := DC2PAIR;                         <<04836>>07538000
                                                                        07540000
      X:=I-1;                                                           07542000
      IF = AND NOT IOQPL(QPAR2).OWNREAD OR AUTOHANDSH THEN     <<04836>>07544000
      BEGIN    <<DC2 WAS IST BYTE READ AND NOT OWN HANDSHAKE>>          07546000
         IF I>1 THEN               <<GARBAGE BEFORE DC2>>      <<04836>>07548000
            BEGIN                                              <<04836>>07550000
              DELETEINPUT;  <<RETURN ALL TBUFS>>               <<04836>>07552000
              TOS:=GETTBUF(SECONDARY);                         <<04836>>07554000
              TOS:=S0;                                         <<04836>>07556000
              IF = THEN                                        <<04836>>07558000
                 BEGIN  <<NONE AVAILABLE>>                     <<04836>>07560000
                   DDEL;  <<CLEAN UP STACK>>                   <<04836>>07562000
                   SETREADERROR(IOQP,LOSTDATA);                <<04836>>07564000
                   ASMB(IXIT);                                 <<04836>>07566000
                 END                                           <<04836>>07568000
               ELSE                                            <<04836>>07570000
                 BEGIN                                         <<04836>>07572000
                   DITP(DHEAD):=TOS;   <<DBCNT=0, 1ST TBUF>>   <<04836>>07574000
                   DITP(DTAIL):=TOS;                           <<04836>>07576000
                 END;                                          <<04836>>07578000
            END;                                               <<04836>>07580000
         DITP(DMODEM).PRIMED:=1;                                        07582000
         READBLOCK;                                                     07584000
      END;                                                              07586000
   END;                                                                 07588000
   DBCNTP:=DBCNTP+I;                                                    07590000
   DCNTP:=DCNTP-I;                                                      07592000
   DITP.PAIR:=1;                                                        07594000
   DITP(DTYPE).PAIRCODE:=DC2PAIR;                                       07596000
   RESTARTSPDS;                                                         07598000
END;                                                                    07600000
                                                                        07602000
                                                                        07604000
                                                                        07606000
                                                                        07608000
SUBROUTINE SERVESC;                                                     07610000
BEGIN                                                                   07612000
   DITP.PAIR:=0;                                                        07614000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  07616000
   TESTBIT TERMCHAR');                                                  07618000
   IF <> AND IOQP(QPAR2)&LSR(8)=I THEN EORFOUND                         07620000
      ELSE                                                              07622000
   BEGIN                                                                07624000
      CONTINUERD;                                                       07626000
      I:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN             07628000
                     BLOCKMODRD ELSE RDDATAINSTR ));                    07630000
      DBCNTP:=DBCNTP+I;                                                 07632000
      DCNTP:=DCNTP-I;                                                   07634000
      WA0(X:=X+5) := ESCSEQ;                                   <<04836>>07636000
      TOS := X - 16 + SYSDB; << READ WAIT INSTRUCTION >>       <<04836>>07638000
      TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                <<04836>>07640000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>07642000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>07644000
      ASMB(XCH); << PUT THE VALUES IN THE RIGHT ORDER >>       <<04836>>07646000
      STARTSIO;                                                <<04836>>07648000
   END;                                                                 07650000
END;                                                                    07652000
                                                                        07654000
                                                                        07656000
                                                                        07658000
                                                                        07660000
SUBROUTINE SERVCR;                                                      07662000
BEGIN                                                                   07664000
   I:=DITP(DTYPE).PAIRCODE;                                             07666000
   DITP(X).PAIRCODE:=0;    DITP.PAIR:=0;                                07668000
      K:=IF DITPL(DSAVE).BLOCKRD                                        07670000
         THEN BLOCKMODRD                                                07672000
         ELSE RDDATAINSTR;                                              07674000
      J:=DCNTP-WA0(SIOADDR+K+1)-1;                                      07676000
         <<BYTE COUNT EXCLUDING CR>>                                    07678000
      IF I=DC2PAIR THEN                                                 07680000
      BEGIN                                                             07682000
         IF J=0 THEN   <<CR FOLLOWING DC2>>                             07684000
            IF IOQPL(QPAR2).OWNREAD THEN READDONE(0)                    07686000
            ELSE                                                        07688000
         BEGIN      <<DELETE EVERYTHING READ SO FAR>>                   07690000
            X:=DITP(DHEAD);                                             07692000
            WHILE <> DO                                                 07694000
            BEGIN                                                       07696000
               TOS:=X;                                                  07698000
               X:=WA0(X);                                               07700000
               RETURNTBUF(*);                                           07702000
            END;                                                        07704000
            DITP(DHEAD) := 0;                                  <<04836>>07706000
            DBCNTP:=DCNTP:=0;                                           07708000
            DITP(DMODEM).PRIMED:=1;                                     07710000
            SENDDC1;    <<RESTART READ>>                                07712000
         END;                                                           07714000
      END;              <<CR NOT FOLLOWING A DC2>>                      07716000
      DBCNTP:=DBCNTP+J;                                                 07718000
      READDONE(0);                                                      07720000
END;                                                                    07722000
                                                                        07724000
                                                                        07726000
                                                                        07728000
                                                                        07730000
SUBROUTINE PAIRWAITCR;                                                  07732000
BEGIN                                                                   07734000
   IF I=CR THEN                                                         07736000
   BEGIN                                                                07738000
      IF J=CRWAIT THEN READDONE(1) <<SET NO CR/LF FLAG>>                07740000
         ELSE                                                           07742000
      IF J=CRWAITLF THEN READDONE(0); <<SEND CR/LF>>                    07744000
   END;                                                                 07746000
END;                                                                    07748000
                                                                        07750000
                                                                        07752000
                                                                        07754000
                                                                        07756000
                                                                        07758000
SUBROUTINE PAIRNOECHO;                                                  07760000
BEGIN                                                                   07762000
   IF I=DC2 THEN                                                        07764000
            BEGIN                                                       07766000
               DITP.PAIR:=1;                                            07768000
               DITP(DTYPE).PAIRCODE:=DC2PAIR;                           07770000
               DITP(DMODEM).PRIMED:=1;                                  07772000
               IF NOT IOQPL(QPAR2).OWNREAD THEN READBLOCK               07774000
                  ELSE                                                  07776000
               BEGIN                                                    07778000
                  DBCNTP:=DBCNTP+1;                                     07780000
                  DCNTP:=DCNTP-1;                                       07782000
                  RESTARTSPDS;                                          07784000
               END;                                                     07786000
            END                                                         07788000
               ELSE                                                     07790000
            BEGIN   <<PROCESS AS REGULAR SPECIAL CHAR>>                 07792000
               K:=DITP(DRBCT)-DBCNTP;                                   07794000
               DITP.DSTATE:=WRTSPECL;                          <<04836>>07796000
               DCNTP:=IF K<=TBMAXB THEN K ELSE TBMAXB;                  07798000
               WA0(SIOADDR+RDDATAINSTR+1):=DCNTP-1;                     07800000
               WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                07802000
               DITP(DSPEED).ECHOON:=1;                                  07804000
               WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];           <<04836>>07806000
               WA0(X:=X+1):=1;                                          07808000
               WA0(X:=X+1):=1;                                          07810000
               WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; <<FROM LEFT BYTE>>      07812000
               J:=X+1;                                                  07814000
               WA0(J):=SYSDB+DITP(DTAIL)+2;                             07816000
               WA0(X:=X+1):=[8/0,8/0]; << 41 TO 121 >>         <<04836>>07818000
               WA0(X:=X+1):=80;                                <<04836>>07820000
               WA0(SIOADDR+FINISEND+5):=[8/1,1/1,7/2];                  07822000
               WA0(X:=X+1):=RDSPECL;                                    07824000
               TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  07826000
               TOS:=SYSDB+SIOADDR+XMITON;                      <<04836>>07828000
               STARTSIO;                                                07830000
               ASMB(IXIT);                                              07832000
            END;                                                        07834000
END;     <<------------------END OF PAIRNOECHO------------------>>      07836000
                                                                        07838000
                                                                        07840000
                                                                        07842000
                                                                        07844000
                                                                        07846000
SUBROUTINE PAIRDC2P;                                                    07848000
BEGIN                                                                   07850000
   IF I=CR THEN                                                         07852000
   BEGIN                                                                07854000
      K:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN             07856000
                               BLOCKMODRD ELSE RDDATAINSTR ))-1;        07858000
      IF K=0 THEN                                                       07860000
                                                               <<04836>>07862000
         IF IOQPL(QPAR2).OWNREAD THEN READDONE(0)                       07864000
            ELSE                                                        07866000
                                                               <<04836>>07868000
                                                               <<04836>>07870000
                                                               <<04836>>07872000
      BEGIN                                                             07874000
         X:=DITP(DHEAD);                                                07876000
         WHILE <> DO                                                    07878000
         BEGIN                                                          07880000
            TOS:=X;                                                     07882000
            X:=WA0(X);                                                  07884000
            RETURNTBUF (*);                                             07886000
         END;                                                           07888000
         DITP(DHEAD) := 0;                                     <<04836>>07890000
         TOS:=DITP(DBLKTAIL);                                           07892000
         DITP(X):=0;                                                    07894000
         IF <> THEN RETURNTBUF (*)                                      07896000
               ELSE DEL;                                                07898000
         DBCNTP:=DCNTP:=0;                                              07900000
         DITP(DMODEM).PRIMED:=1;                                        07902000
         SENDDC1;                                                       07904000
      END;                                                              07906000
   END;                                                                 07908000
END;                                                                    07910000
                                                                        07912000
                                                                        07914000
                                                                        07916000
                                                                        07918000
                                                                        07920000
                                                                        07922000
SUBROUTINE SERVLF;                                             <<04836>>07924000
BEGIN                                                          <<04836>>07926000
   J:=IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD ELSE RDDATAINSTR;<<04836>>07928000
   I:=SIOADDR + J + 1;                                         <<04836>>07930000
   WA0(I):=WA0(I)+1;  <<LF DELETED,MODIFY BYTE COUNT FOR 1 MORE BYTE>>  07932000
   I:=X+2;                                                     <<04836>>07934000
   RIGHT:=IF LOGICAL(WA0(I).(1:1)) THEN TRUE ELSE FALSE;       <<04836>>07936000
   WA0(I).(1:1):=IF RIGHT THEN 0 ELSE 1;                       <<04836>>07938000
   IF NOT RIGHT THEN WA0(I+1):=WA0(I+1)-1; <<BACK UP BUFFER ADDRESS>>   07940000
   IF DITPL(DMODEM).PRIMED THEN RESTRTWAIT;  <<RESTART READ>>  <<04836>>07942000
   WA0(SIOADDR+12):=%6403;    <<CR; ETX>>                      <<04836>>07944000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; <<WRITE DATA INSTR >> <<04836>>07946000
   WA0(X:=X+1):=1;                                             <<04836>>07948000
   WA0(X:=X+1):=1;                                             <<04836>>07950000
   WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<START FROM LEFT>>      <<04836>>07952000
   WA0(X:=X+1):=SYSDB+SIOADDR+12;                              <<04836>>07954000
   I:=X+1;                                                     <<04836>>07956000
   DITP.DSTATE := WRTSPECL;                                    <<04836>>07958000
   IF DITPL(DMODEM)&CSL(M202) THEN                             <<04836>>07960000
   BEGIN                                                       <<04836>>07962000
      WA0(I):=[8/1,1/1,7/2];          <<INTERRUPT/HALT>>       <<04836>>07964000
      WA0(X:=X+1):=22;                <<ETX SENT,START READ TURNAROUND>>07966000
      WA0(X:=X-5) := 2;                                        <<04836>>07968000
      RDTOWRT;                        <<START LINE TURNAROUND TO WRITE>>07970000
   END                                                         <<04836>>07972000
      ELSE                                                     <<04836>>07974000
   BEGIN                                                       <<04836>>07976000
      WA0(I) := [8/1,1/1,7/1];                                 <<04836>>07978000
      WA0(X+1) := 9;                                           <<04836>>07980000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  <<04836>>07982000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>07984000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>07986000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>07988000
      STARTSIO;                                                <<04836>>07990000
      ASMB(IXIT);                                              <<04836>>07992000
   END;                                                        <<04836>>07994000
END;             <<---------------END OF SERVLF---------------->>       07996000
                                                               <<04836>>07998000
                                                               <<04836>>08000000
                                                               <<04836>>08002000
                                                               <<04836>>08004000
                                                               <<04836>>08006000
                                                               <<04836>>08008000
SUBROUTINE SERVC'A;                                                     08010000
BEGIN                                                                   08012000
   IF DITP(DLDEV).DLDEVN<>CONSLDEV THEN SIORESTART                      08014000
      ELSE                                                              08016000
   BEGIN                                                                08018000
      IF DITPL(DTYPE).CONSINTRPT THEN                                   08020000
         AWAKE(PROGENPCBP,JUNKWAIT,NOWAIT);                             08022000
      DELETEBYTE;                                                       08024000
      RESTARTSPDS;                                                      08026000
   END;                                                                 08028000
END;                                                                    08030000
                                                                        08032000
                                                                        08034000
                                                                        08036000
                                                                        08038000
SUBROUTINE RSPECLCHAR;                                                  08040000
BEGIN                                                                   08042000
   IF NOT DITPL.UP THEN SPEEDSENSE                                      08044000
      ELSE                                                              08046000
  BEGIN                                                                 08048000
    IF DITP.DSTATE = WRTSPECL THEN                             <<04836>>08050000
       DITP.DSTATE := READING;                                 <<04836>>08052000
   I:=LASTBYTE;                                                         08054000
   IF DITP.(TERMCHAR':2)<>READBINARY AND                       <<04836>>08056000
     (NOT AUTOHANDSH OR DITPL.SPOOLING) THEN                   <<04836>>08058000
   BEGIN    <<NOT IN BINARY READ MODE>>                                 08060000
      IF DITPL.SPOOLING THEN                                            08062000
      BEGIN                                                             08064000
         IF I=CNTRLY THEN    <<END OF SPOOLING>>                        08066000
         BEGIN                                                          08068000
            DITP(DRQST).SPOOLEND:=1;                                    08070000
            READDONE(1);  <<DO NOT SEND CR/LF>>                         08072000
         END                                                            08074000
            ELSE                                                        08076000
         BEGIN                                                          08078000
            IF WA0(SIOADDR+RDDATAINSTR+1)=0 THEN                        08080000
               SPOOLBFULL                                               08082000
               ELSE                                                     08084000
               RESTRTWAIT;                                              08086000
         END;                                                           08088000
      END;                                                              08090000
      IF DITPL.PAIR AND %170000&CSL(DITP(DTYPE).PAIRCODE) THEN          08092000
      BEGIN  <<PAIRCODE=CRWAIT,CRWAITLF,NOECHO,DC2PAIR>>                08094000
         DITP.PAIR:=0;                                                  08096000
         J:=DITP(DTYPE).PAIRCODE;                                       08098000
         DITP(X).PAIRCODE:=0;                                           08100000
         X:=J-1;                                                        08102000
         CASE X OF                                                      08104000
         BEGIN                                                          08106000
            PAIRWAITCR;                                                 08108000
            PAIRWAITCR;                                                 08110000
            PAIRNOECHO;                                                 08112000
            PAIRDC2P;                                                   08114000
         END;                                                           08116000
      END;                                                              08118000
                                                                        08120000
      X:=DITP(DSTOP);                                                   08122000
      IF <> THEN                                                        08124000
      BEGIN     <<TRANSPARENT READ>>                                    08126000
         IF I=DITP(DSTOP).EORCHAR THEN                                  08128000
         BEGIN                                                          08130000
            IF DITPL(DSAVE).BLOCKRD                                     08132000
               THEN J:=DCNTP-WA0(SIOADDR+BLOCKMODRD+1)-1                08134000
               ELSE J:=DCNTP-WA0(SIOADDR+RDDATAINSTR+1)-1;              08136000
            DBCNTP:=DBCNTP+J;                                           08138000
            IF NOT WAITFORCR THEN READDONE(1);<<NO CR/LF>>              08140000
            DITP.PAIR:=1;                                               08142000
            DITP(DTYPE).PAIRCODE:=CRWAIT;                               08144000
            LOOKFORCR;                                                  08146000
         END                                                            08148000
            ELSE                                                        08150000
         IF I=CNTRLA THEN SERVC'A                                       08152000
            ELSE                                                        08154000
         IF I=DITP(DSTOP).SSBRKCHAR THEN SERVC'Y                        08156000
            ELSE                                                        08158000
         IF I=IOQP(QPAR2)&LSR(8) THEN EORFOUND                          08160000
            ELSE                                                        08162000
         RESTARTSPDS;  <<RESTART RD PROG AT RDWAIT>>                    08164000
      END                                                               08166000
         ELSE                                                           08168000
      BEGIN                                                             08170000
         X:=I-ESC;                                                      08172000
         IF <= AND NOT DITPL(DLDEV).RDFLUSH THEN               <<04836>>08174000
            CASE I OF                                                   08176000
            BEGIN                                                       08178000
               CHECKEOR;                                                08180000
               SERVC'A;                                                 08182000
               CHECKEOR;                                                08184000
               CHECKEOR;                                                08186000
               CHECKEOR;                                                08188000
               CHECKEOR;                                                08190000
               CHECKEOR;                                                08192000
               CHECKEOR;    <<%7>>                                      08194000
               SERVC'H;     <<%10>>                                     08196000
               CHECKEOR;                                                08198000
               SERVLF;      <<%12--LF>>                        <<04836>>08200000
               CHECKEOR;                                                08202000
               CHECKEOR;                                                08204000
               SERVCR;                                                  08206000
               CHECKEOR;                                                08208000
               CHECKEOR;                                                08210000
               CHECKEOR;                                                08212000
               CHECKEOR;    <<%21--XON>>                                08214000
               SERVDC2;                                                 08216000
               CHECKEOR;    <<%23--XOFF>>                               08218000
               CHECKEOR;                                                08220000
               CHECKEOR;                                                08222000
               CHECKEOR;                                                08224000
               CHECKEOR;    <<%27>>                                     08226000
               SERVC'X;     <<%30>>                                     08228000
               SERVC'Y;     <<%31>>                                     08230000
               CHECKEOR;                                                08232000
               SERVESC;     <<%33>>                                     08234000
            END                                                         08236000
               ELSE IF I=CR THEN SERVCR                        <<04836>>08238000
               ELSE                                                     08240000
            CHECKEOR;                                                   08242000
         END;                                                           08244000
      END                                                               08246000
         ELSE                                                           08248000
         BEGIN                                                 <<04836>>08250000
         IF AUTOHANDSH THEN                                    <<04836>>08252000
           BEGIN                                               <<04836>>08254000
           IF I = DC2 THEN SERVDC2 ELSE                        <<04836>>08256000
           IF I=CR AND NOT DITPL(DMODEM).PRIMED THEN SERVCR;   <<04836>>08258000
           END;                                                <<04836>>08260000
         CHECKEOR;   << BINARY READ IN PROGRESS >>             <<04836>>08262000
         END;                                                  <<04836>>08264000
   END;                                                                 08266000
END;                                                                    08268000
                                                                        08270000
                                                                        08272000
                                                                        08274000
                                                                        08276000
                                                                        08278000
SUBROUTINE SERVESCSEQ;                                                  08280000
BEGIN                                                                   08282000
   J:=DCNTP-WA0(SIOADDR+1+(IF DITPL(DSAVE).BLOCKRD THEN        <<04836>>08284000
                BLOCKMODRD ELSE RDDATAINSTR));                 <<04836>>08286000
   WA0(X:=X+5):=RDSPECL;                                       <<04836>>08288000
   I:=LASTBYTE;                                                         08290000
   TEMP:=";" - I;                                                       08292000
   IF ( = OR TEMP=1) AND J = 1 THEN                            <<04836>>08294000
   BEGIN         <<COLON OR SEMICOLON>>                                 08296000
      DITP(DSPEED).ECHO:=TEMP;                                          08298000
      X:=DBCNTP MOD TBMAXB;                                             08300000
      IF = THEN                                                         08302000
         DELETBUF                                                       08304000
         ELSE                                                           08306000
     BEGIN                                                              08308000
      DELETEBYTE;  <<DELETE COLON/SEMICOLON>>                           08310000
      DELETEBYTE;  <<DELETE ESC>>                                       08312000
                                                                        08314000
      DCNTP:=DCNTP+1;                                                   08316000
     END;                                                               08318000
      DBCNTP:=DBCNTP-1;   <<EXCLUDE ESC>>                               08320000
      WA0(SIOADDR+5).(11:1):=TEMP;                                      08322000
      DITP(DSPEED).ECHOON:=1;                                           08324000
      RESTARTSPDS;                                                      08326000
   END                                                                  08328000
      ELSE                                                              08330000
   RSPECLCHAR;                                                          08332000
END;                                                                    08334000
                                                                        08336000
                                                                        08338000
                                                                        08340000
                                                                        08342000
                                                                        08344000
SUBROUTINE SERVMODEM;                                                   08346000
BEGIN                                                                   08348000
   DITP.MODACTIVE:=0;                                                   08350000
   IF = THEN RETURN; << FROM STATUSRD, DON'T START IDLEREAD >> <<04836>>08352000
   DITP(DSAVE).ININ:=0;                                        <<04836>>08354000
   IF <> AND DITP(DLDEV).DLDEVN<>CONSLDEV.DLDEVN THEN          <<04836>>08356000
   BEGIN                                                       <<04836>>08358000
      IF DITP.DSTATE=WRITING THEN <<INTERRUPT CAUSED BY INIT>> <<04836>>08360000
      BEGIN                                                    <<04836>>08362000
         IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN              <<04836>>08364000
            I:=XMITON                                          <<04836>>08366000
            ELSE                                               <<04836>>08368000
         BEGIN                                                 <<04836>>08370000
            DITP.ENQACKWAIT:=0;  <<PFAIL RECOVERY>>            <<04836>>08372000
            STOPTIMEOUT(HP2640TO,DITP);                        <<04836>>08374000
            WA0(SIOADDR+WRTDATAINSTR+5):=[8/1,1/1,7/1];        <<04836>>08376000
            WA0(X:=X+1):=1;  <<TBUF EMPTY INTERRUPT>>          <<04836>>08378000
            I:=WRTDATAINSTR+5;  <<START SIO PROG TO INTERRUPT>><<04836>>08380000
         END;                                                  <<04836>>08382000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;               <<04836>>08384000
         TOS:=SYSDB+SIOADDR+I;                                 <<04836>>08386000
         STARTSIO;                                             <<04836>>08388000
         ASMB(IXIT);                                           <<04836>>08390000
      END;                                                              08392000
   END;                                                                 08394000
                                                                        08396000
   DITP(DCNTRL).DOMOD:=0;                                               08398000
   IF <> THEN                                                           08400000
   BEGIN     <<MODEM CONTROL WAS REQUESTED>>                            08402000
      TOS:=DITP(X).DONXTMOD;                                            08404000
      MODCONTROL(*,DITP);                                               08406000
      ASMB(IXIT);                                                       08408000
   END;                                                                 08410000
   IF NOT DITPL(DMODEM)&CSL(M202) THEN BEGIN                   <<04836>>08412000
                             K:=DITP(DSAVE).HSTATE;            <<04836>>08414000
                             IF K<>HANGUPTURN AND K<>HANGINGUP <<04836>>08416000
                                THEN IDLEWAIT(DITP);           <<04836>>08418000
                                END                            <<04836>>08420000
ELSE                                                           <<04836>>08422000
   BEGIN                                                       <<04836>>08424000
                                                               <<04836>>08426000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>08428000
   TOS := SYSDB + SIOADDR + SRQOFF;                            <<04836>>08430000
   STARTSIO;                                                   <<04836>>08432000
   END;                                                        <<04836>>08434000
   ASMB(IXIT);                                                          08436000
END;                                                                    08438000
                                                                        08440000
                                                                        08442000
SUBROUTINE SERVETXSENT;                                        <<04836>>08444000
   BEGIN                                                       <<04836>>08446000
   WA0(SIOADDR+SYNSTRT) := [8/2, 8/0];                         <<04836>>08448000
   WA0(X:=X+1) := 0;                                           <<04836>>08450000
   WA0(X:=X+1) := [8/1, 1/1, 7/2];                             <<04836>>08452000
   WA0(X:=X+1) := 30;                                          <<04836>>08454000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>08456000
   TOS := SYSDB + SIOADDR + SYNSTRT;                           <<04836>>08458000
   STARTSIO;                                                   <<04836>>08460000
   ASMB(IXIT);                                                 <<04836>>08462000
   END;                                                        <<04836>>08464000
                                                                        08466000
                                                                        08468000
SUBROUTINE SERVTURNTORD;                                                08470000
BEGIN                                                                   08472000
   STARTTIMEOUT(TURNTO, DITP);                                 <<04836>>08474000
   DITP(DSAVE).TURNTOWRITE:=0;                                          08476000
   DITP(DCNTRL).NXTDSTATE:=READING;                            <<04836>>08478000
   DITP.DSTATE:=TURN202;                                                08480000
   MODCONTROL(READING,DITP);                                   <<04836>>08482000
   ASMB(IXIT);                                                          08484000
END;                                                                    08486000
                                                                        08488000
                                                                        08490000
                                                                        08492000
                                                                        08494000
                                                                        08496000
SUBROUTINE SERVRDNULL;                                                  08498000
BEGIN                                                                   08500000
   IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                     08502000
      ELSE                                                              08504000
   READDONE(0);                                                         08506000
END;                                                                    08508000
                                                                        08510000
                                                                        08512000
                                                                        08514000
                                                                        08516000
                                                                        08518000
                                                                        08520000
SUBROUTINE BREAK;                                                       08522000
BEGIN                                                                   08524000
   IF NOT DITPL.UP THEN SPEEDSENSE                                      08526000
      ELSE                                                              08528000
   BEGIN        <<BREAK WAS RECEIVED AND NOT IN SPEEDSENSE MODE>>       08530000
      J:=WA0(SIOADDR+10).(8:8);     <<GET CHAR FOR SCRUTINY>>           08532000
      IF J=NULL THEN                                                    08534000
      BEGIN                         <<FOR REAL!>>                       08536000
         IF NOT DITPL.SPOOLING AND BREAKOK(DITP) THEN                   08538000
         BEGIN                                                          08540000
            IF @IOQP<>0 AND DITP.DSTATE=READING THEN                    08542000
           BEGIN                                                        08544000
            K:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN       08546000
                         BLOCKMODRD ELSE RDDATAINSTR ));                08548000
            <<TOTAL NUMBER OF BYTES READ>>                              08550000
            DBCNTP:=DBCNTP+K;   <<UPDATE TOTAL BYTES READ>>             08552000
            DCNTP:=DCNTP-K;     <<UPDATE REMAINING BYTES TO READ>>      08554000
           END                                                          08556000
              ELSE                                                      08558000
            IF DITP.DSTATE=WRITING AND DITPL.ENQACKWAIT AND             08560000
               WA0(SIOADDR+WRTDATAINSTR+1)=0 THEN                       08562000
                  DITP(DSAVE).DELACK:=1;                                08564000
            DITP(DSAVE).WAITEDSTATE:=DITP;                              08566000
            DITP.DSTATE:=WAITED;                                        08568000
            DITP(DRQST).BRKRQST:=1;  <<SET FLAG TO REQUEST IOTERM0>>    08570000
            DITP(DCNTRL).SPDSIO:=0;  <<CLR IDLE WAIT PROG ACTIVE FLAG>> 08572000
            AWAKETERMINAL(DITP);     <<SERVICE AND AWAKE>>              08574000
         END                                                            08576000
            ELSE                                                        08578000
         SIORESTART;   <<IGNORE BREAK,RESTART SIO PROG>>                08580000
      END                                                               08582000
         ELSE                                                           08584000
      SIORESTART;                                                       08586000
   END;                                                                 08588000
END;        <<----------------------END OF BREAK------------------->>   08590000
                                                                        08592000
                                                                        08594000
                                                                        08596000
                                                                        08598000
                                                                        08600000
SUBROUTINE WSPECLCHAR;                                                  08602000
BEGIN                                                                   08604000
   IF WA0(SIOADDR+10).(9:7)=XON AND STATREQ THEN               <<04836>>08606000
     BEGIN                                                     <<04836>>08608000
                                                               <<04836>>08610000
     DITP(DTYPE).WAITXON := 0;                                 <<04836>>08612000
     STOPTIMEOUT(XOFFTIMEOUT, DITP);                           <<04836>>08614000
     TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                 <<04836>>08616000
     TOS := SYSDB + SIOADDR + XMITON ;                         <<04836>>08618000
     STARTSIO;  << RESTART STATUS REQUEST >>                   <<04836>>08620000
     RETURN;                                                   <<04836>>08622000
     END;                                                      <<04836>>08624000
   IF WA0(SIOADDR+10).(9:7)=CNTRLY                                      08626000
      THEN  SERVC'Y                                                     08628000
      ELSE                                                              08630000
   IF WA0(SIOADDR+10).(9:7)=XOFF THEN                                   08632000
   BEGIN                                                                08634000
       IF STATREQ THEN                                         <<04836>>08636000
         BEGIN                                                 <<04836>>08638000
                                                               <<04836>>08640000
         DITP(DTYPE).WAITXON := 1;                             <<04836>>08642000
         IF HP2631BFX THEN                                     <<04836>>08644000
            STARTTIMEOUT(XOFFTIMEOUT, DITP);                   <<04836>>08646000
         TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;             <<04836>>08648000
         TOS := SYSDB + SIOADDR + XMITON ;                     <<04836>>08650000
         STARTSIO;  << RESTART STATUS REQUEST >>               <<04836>>08652000
         RETURN;                                               <<04836>>08654000
         END;                                                  <<04836>>08656000
      IF DITP.DSTATE <> WRITING THEN SIORESTART;               <<04836>>08658000
      DCNTP:=DCNTP-WA0(SIOADDR+WRTDATAINSTR+1);<<BYTES WRITTEN>>        08660000
      IF DCNTP<0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);                 08662000
      WA0(SIOADDR+10) := 0;                                    <<04836>>08664000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>08666000
      BEGIN                                                             08668000
         STOPTIMEOUT(HP2640TO,DITP);                                    08670000
         X:=WA0(SIOADDR+WRTDATAINSTR+1);   IF <> THEN          <<04836>>08672000
         WA0(DITP(DHEAD)+1).WRTENQ:=1;                                  08674000
      END;                                                              08676000
      DITP(DTYPE).WAITXON:=1;                                  <<04836>>08678000
      IF HP2631B THEN                                          <<04836>>08680000
         BEGIN                                                 <<04836>>08682000
         IF HP2631BFX THEN                                     <<04836>>08684000
            BEGIN                                              <<04836>>08686000
            STARTTIMEOUT(XOFFTIMEOUT, DITP);                   <<04836>>08688000
            IDLEWAIT(DITP);                                    <<04836>>08690000
            DITP(DCNTRL).SPDSIO := 0;                          <<04836>>08692000
            END                                                <<04836>>08694000
         ELSE                                                  <<04836>>08696000
            STATREQUEST(DITP);                                 <<04836>>08698000
         END                                                   <<04836>>08700000
      ELSE   BEGIN                                             <<04836>>08702000
      IDLEWAIT(DITP);                                                   08704000
      DITP(DCNTRL).SPDSIO:=0;   <<ZAP THEM LITTLE BUGS>>                08706000
      END;                                                     <<04836>>08708000
   END                                                                  08710000
      ELSE                                                              08712000
   SIORESTART;                                                          08714000
END;                                                                    08716000
                                                                        08718000
                                                                        08720000
                                                                        08722000
                                                                        08724000
SUBROUTINE SERVCNTRL;                                                   08726000
BEGIN                                                                   08728000
   DITP.DSTATE:=NULL;                                                   08730000
   DITP(DSPEED).RESTSPD:=0;                                             08732000
   IF <> THEN IDLEWAIT (DITP);                                          08734000
   X:=@IOQP;                                                            08736000
   IF <> THEN AWAKETERMINAL (DITP);                                     08738000
   ASMB(IXIT);                                                          08740000
END;                                                                    08742000
                                                                        08744000
                                                                        08746000
                                                                        08748000
                                                                        08750000
SUBROUTINE SERVSPSENSE;                                        <<04836>>08752000
<< HANDLES INTERRUPTS FROM SPEEDSENSE, IDLE WAIT, AND STATUS >><<04836>>08754000
<< REQUEST CHANEL PROGRAMS >>                                  <<04836>>08756000
                                                               <<04836>>08758000
  BEGIN                                                        <<04836>>08760000
  IF DITPL.UP THEN                                             <<04836>>08762000
    BEGIN                                                      <<04836>>08764000
    TEMP := WA0(SIOADDR + 10).(9:7); << CHAR JUST READ >>      <<04836>>08766000
                                                               <<04836>>08768000
    IF TEMP = CNTRLY THEN                                      <<04836>>08770000
      BEGIN                                                    <<04836>>08772000
      SERVC'Y;                                                 <<04836>>08774000
      RETURN;                                                  <<04836>>08776000
      END;                                                     <<04836>>08778000
                                                               <<04836>>08780000
    IF TEMP = XON THEN                                         <<04836>>08782000
      BEGIN                                                    <<04836>>08784000
                                                               <<04836>>08786000
      DITPL(DTYPE).WAITXON := 0;                               <<04836>>08788000
      IF <> AND NOT STATREQ AND DITP.DSTATE=WRITING THEN       <<04836>>08790000
        BEGIN << RESTART WRITE >>                              <<04836>>08792000
        STOPTIMEOUT(XOFFTIMEOUT, DITP);                        <<04836>>08794000
        WA0(SIOADDR + RDDATAINSTR + 6) := WAITACK;             <<04836>>08796000
        IF DITPL.ENQACKWAIT THEN                               <<04836>>08798000
           BEGIN                                               <<04836>>08800000
           STARTTIMEOUT(HP2640TO, DITP);                       <<04836>>08802000
           IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN            <<04836>>08804000
              TBEMPTY                                          <<04836>>08806000
           ELSE                                                <<04836>>08808000
              RESTRTWAIT;                                      <<04836>>08810000
           END                                                 <<04836>>08812000
        ELSE                                                   <<04836>>08814000
           TBEMPTY;                                            <<04836>>08816000
        END                                                    <<04836>>08818000
      ELSE                                                     <<04836>>08820000
        BEGIN                                                  <<04836>>08822000
        IF NOT STATREQ THEN IDLEWAIT(DITP) ELSE                <<04836>>08824000
          BEGIN << RESTART REQUEST STATUS WAIT >>              <<04836>>08826000
          STOPTIMEOUT(XOFFTIMEOUT, DITP);                      <<04836>>08828000
          TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;            <<04836>>08830000
          TOS := SYSDB + SIOADDR + RDWAIT ;                    <<04836>>08832000
          STARTSIO;  << RESTART STATUS READ >>                 <<04836>>08834000
          END;                                                 <<04836>>08836000
        END;                                                   <<04836>>08838000
      RETURN;                                                  <<04836>>08840000
      END; << XON >>                                           <<04836>>08842000
                                                               <<04836>>08844000
   IF TEMP = XOFF AND HP2631B THEN                             <<04836>>08846000
     BEGIN                                                     <<04836>>08848000
     DITPL(DTYPE).WAITXON := 1;                                <<04836>>08850000
                                                               <<04836>>08852000
     IF NOT STATREQ THEN BEGIN                                 <<04836>>08854000
        IF HP2631BFX THEN                                      <<04836>>08856000
           BEGIN                                               <<04836>>08858000
           STARTTIMEOUT(XOFFTIMEOUT, DITP);                    <<04836>>08860000
           IDLEWAIT(DITP);                                     <<04836>>08862000
           DITP(DCNTRL).SPDSIO := 0;                           <<04836>>08864000
           END                                                 <<04836>>08866000
        ELSE                                                   <<04836>>08868000
           STATREQUEST(DITP);                                  <<04836>>08870000
        END                                                    <<04836>>08872000
     ELSE                                                      <<04836>>08874000
       BEGIN << RESTART REQUEST STATUS WAIT >>                 <<04836>>08876000
       STARTTIMEOUT(XOFFTIMEOUT, DITP);                        <<04836>>08878000
       TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;               <<04836>>08880000
       TOS := SYSDB + SIOADDR + RDWAIT ;                       <<04836>>08882000
       STARTSIO;  << RESTART STATUS READ >>                    <<04836>>08884000
       END;                                                    <<04836>>08886000
     RETURN;                                                   <<04836>>08888000
     END; << XOFF >>                                           <<04836>>08890000
                                                               <<04836>>08892000
  IF STATREQ THEN                                              <<04836>>08894000
    BEGIN << MUST BE RETURNED STATUS FROM DEVICE >>            <<04836>>08896000
    STATREQ := FALSE;                                          <<04836>>08898000
    STOPTIMEOUT(HP2640TO,DITP);                                <<04836>>08900000
    IF LOGICAL(TEMP).OFFLINE OR LOGICAL(TEMP).PAPEROUT THEN    <<04836>>08902000
      BEGIN                                                    <<04836>>08904000
      DITP(DTYPE).WAITXON := 1;                                <<04836>>08906000
                                                               <<04836>>08908000
      IF NOT IOMESSAGE (1,IF LOGICAL(TEMP).PAPEROUT THEN       <<04836>>08910000
      PAPOUTMSG ELSE NOTRDYMSG, %10000, DITP(DLDEV).DLDEVN,    <<04836>>08912000
      ,,,,OPCONSOLE) THEN                                      <<04836>>08914000
        BEGIN  << NO SYSTEM MESSAGE BUFFER  >>                 <<04836>>08916000
        END;                                                   <<04836>>08918000
      END;                                                     <<04836>>08920000
    IF LOGICAL(TEMP).TRANSERR AND @IOQP <> 0 THEN              <<04836>>08922000
      IOQP(QSTAT).IOSTAT := TRANSERR';                         <<04836>>08924000
    X := DITP(DBCNT);                                          <<04836>>08926000
    IF = AND @IOQP<>0 AND IOQP(QMISC).(12:4)=WAITING THEN      <<04836>>08928000
      BEGIN                                                    <<04836>>08930000
      DITP.DSTATE := NULL;                                     <<04836>>08932000
      DITP(DRQST).STATDONE := TRUE;                            <<04836>>08934000
      AWAKETERMINAL(DITP);                                     <<04836>>08936000
      END;                                                     <<04836>>08938000
    IF NOT DITPL(DTYPE).WAITXON THEN                           <<04836>>08940000
      BEGIN  << RESTART WRITE >>                               <<04836>>08942000
      TBEMPTY;                                                 <<04836>>08944000
      RETURN;                                                  <<04836>>08946000
      END;                                                     <<04836>>08948000
                                                               <<04836>>08950000
    IDLEWAIT(DITP);                                            <<04836>>08952000
    IF DITPL(DTYPE).WAITXON THEN DITP(DCNTRL).SPDSIO := 0;     <<04836>>08954000
    RETURN;                                                    <<04836>>08956000
    END;   << STATUS REQUEST REPLY >>                          <<04836>>08958000
                                                               <<04836>>08960000
    RESTARTSPDS;                                               <<04836>>08962000
    END                                                        <<04836>>08964000
                                                               <<04836>>08966000
  ELSE IF DITP(DMODEM).MODEM > 0 AND NOT DITPL(DSAVE).CCVALUE  <<04836>>08968000
     THEN RESTRTWAIT                                           <<04836>>08970000
                                                               <<04836>>08972000
  ELSE   SPEEDSENSE;  << DIT NOT UP >>                         <<04836>>08974000
                                                               <<04836>>08976000
  END;                                                         <<04836>>08978000
                                                                        08980000
                                                                        08982000
                                                                        08984000
<<*******************>>                                        <<04836>>08986000
<<  MAIN LINE        >>                                        <<04836>>08988000
<<*******************>>                                        <<04836>>08990000
                                                                        08992000
                                                                        08994000
@DITPL:=ILT(IDITP);       <<FORM DIT POINTER>>                          08996000
SIOADDR:=ILT(ISIOP);                                                    08998000
TOS:=%1000D;                                                            09000000
ASMB(XCHD);          <<SET DB TO SYSDB,SAME BANK>>                      09002000
@IOQPL:=DITP(DIOQP);                                                    09004000
@DBCNTP:=@DITPL+DBCNT;                                                  09006000
@DCNTP:=@DITPL+DCNT;                                                    09008000
@CPVAPL:=DITP(DILTP);                                                   09010000
                                                                        09012000
                                                                        09014000
DITP(DCNTRL).HIOPWAIT:=0;                                               09016000
IF <> THEN                                                              09018000
BEGIN     <<HIOP WAS ISSUED TO HALT SIO PROG>>                          09020000
   CPVAP(0):=0;                                                         09022000
   CPVAP(X:=X+1):=0;                                                    09024000
   CPVAP(X:=X+1):=0;                                                    09026000
   CPVAP(X:=X+1):=0;                                                    09028000
   ASMB(IXIT);                                                          09030000
END;                                                                    09032000
                                                                        09034000
IF CPVAP(0).(1:15) <> 0 THEN BEGIN                             <<04836>>09036000
   I := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER*4;                   <<04836>>09038000
   IF DITP.DSTATE = READING AND ABS(ABS(I)) = %1400 AND        <<04836>>09040000
      ABS(ABS(I) + 1) = 0 THEN BEGIN                           <<04836>>09042000
                                                               <<04836>>09044000
      SETREADERROR(IOQP, LOSTDATA);                            <<04836>>09046000
      CPVAP(0) := 0;                                           <<04836>>09048000
      KILLREAD  END                                            <<04836>>09050000
   ELSE IF CPVAP(0) = %160040 AND I.(11:3) = 3 THEN BEGIN      <<04836>>09052000
      CPVAP(0) := 0;                                           <<04836>>09054000
      @IOQPL := GETIOQ(2);    << GET DUMMY IOQ FOR LOGERROR >> <<04836>>09056000
      ASMB(TEST); << SEE IF WE GOT ONE >>                      <<04836>>09058000
      IF = THEN ASMB(IXIT); << IF NOT, JUST FORGET IT >>       <<04836>>09060000
      MOVE IOQP := 11(0);                                      <<04836>>09062000
      IOQP(QLDEV) := DITP(DLDEV).LDEVN; << BUILD DUMMY IOQ >>  <<04836>>09064000
      IOQP(QFUNC) := IOQP(QPAR1) := IOQP(QPAR2) := %160040;    <<04836>>09066000
      IOQP(QSTAT) := %124;    << FATAL SYSTEM ERROR >>         <<04836>>09068000
      LOGERROR(DITP, IOQP, 0);                                 <<04836>>09070000
      RETURNIOQ(IOQP);        << IT'S SERVED ITS PURPOSE >>    <<04836>>09072000
      DITP(DRQST).DISCONNECT := 1; << DISCONNECT THE TERMINAL>><<04836>>09074000
      IF DITPL.ACTIVE THEN                                     <<04836>>09076000
         DITP.REQUEST := 1                                     <<04836>>09078000
      ELSE                                                     <<04836>>09080000
         AWAKETERMINAL(DITP);                                  <<04836>>09082000
      ASMB(IXIT);                                              <<04836>>09084000
      END                                                      <<04836>>09086000
   ELSE                                                        <<04836>>09088000
      SUDDENDEATH(208)                                         <<04836>>09090000
   END;                                                        <<04836>>09092000
                                                                        09094000
IF CPVAP(3)<>0 THEN                                                     09096000
BEGIN                                                                   09098000
   I:=CPVAP(3).(8:8);                                                   09100000
   CPVAP(X):=0;                                                         09102000
   DITP.PAIR:=0;                                                        09104000
   DITP(DTYPE).PAIRCODE:=0;                                             09106000
   X:=I-1;                                                              09108000
   CASE X OF                                                            09110000
   BEGIN                                                                09112000
      SERV1FULL;                                                        09114000
      SERV2FULL;                                                        09116000
   END;                                                                 09118000
END;                                                                    09120000
                                                                        09122000
IF CPVAP(1)<>0 THEN                                                     09124000
BEGIN                                                                   09126000
   I:=CPVAP(1);                                                         09128000
   CPVAP(X):=0;                                                         09130000
   X:=DITP(DCNTRL);                                                     09132000
   IF < THEN SERVHIOP                                                   09134000
      ELSE                                                              09136000
   BEGIN                                                                09138000
      X:=I.(8:8)-1;                                                     09140000
      CASE X OF                                                         09142000
      BEGIN                                                             09144000
         TBEMPTY;     <<INTERRUPT DUE TO TBUF BEING EMPTIED>>           09146000
         TBFULL;      <<CAUSED BY TBUF BEING FILLED>>                   09148000
         FINCRLF;     <<CAUSED BY FINISH WRITING CR/LF>>                09150000
         SERVNXTCRLF; <<ECHOED !!! AFTER C'X>>                          09152000
         SERVNXTRD;   <<CR/LF SENT AFTER !!!>>                          09154000
         SERVSYNC'CR; <<SYNCS WERE SENT AFTER CR>>                      09156000
         SERVSYNC'LF; <<SYNCS WERE SENT AFTER LF>>                      09158000
         SERVSENDLF;  <<CR/SYNCS WERE SENT,LF/SYNCS NEXT>>     <<04836>>09160000
         RESTARTREAD; <<SPECIAL CHARS WRITTEN, RESTART READ>>  <<04836>>09162000
      END;                                                              09164000
   END;                                                                 09166000
END                                                                     09168000
   ELSE                                                                 09170000
IF CPVAP(2)<>0 THEN                                                     09172000
BEGIN                                                                   09174000
   I:=CPVAP(2).(8:8);                                                   09176000
   CPVAP(X):=0;                                                         09178000
   X:=DITP(DCNTRL);                                                     09180000
   IF < THEN SERVHIOP                                                   09182000
   ELSE                                                                 09184000
   BEGIN                                                                09186000
                                                                        09188000
      IF LOGICAL(I) THEN                                                09190000
      BEGIN           <<INTERRUPT CAUSED BY WRITE SIO PROG>>            09192000
         X:=I&LSR(1)-1;                                                 09194000
         CASE X OF                                                      09196000
         BEGIN                                                          09198000
            WSPECLCHAR;    <<SPECIAL CHAR DETECTED DURING WRITE>>       09200000
            BREAK;         <<POSSIBLE BREAK WAS RECEICED>>              09202000
            SUDDENDEATH(207);                                  <<04836>>09204000
         END;                                                           09206000
      END                                                               09208000
         ELSE                                                           09210000
      BEGIN                                                             09212000
         <<INTERRUPT CAUSED BY READ SIO PROG>>                          09214000
         X:=I&LSR(1)-1;                                                 09216000
         CASE X OF                                                      09218000
         BEGIN                                                          09220000
            RSPECLCHAR;    <<SPECL CHAR DETECTED DURING READING>>       09222000
            BREAK;                                                      09224000
            STATUSRD;        <<RSTATUS>>                                09226000
            SERVSPSENSE;    <<NON-SPECL CHAR RECVD DURING SPEEDSENSE>>  09228000
            ASMB(IXIT);  << DONE RESETTING SPEC CHARS >>       <<04836>>09230000
            SUDDENDEATH(207);                                  <<04836>>09232000
            SERVWAITCR;    <<WAITING FOR CR TO TERMINATE READ>>         09234000
            SERVWAITACK;   <<WAITING FOR ACK AFTER ENQ TO RESTART WRT>> 09236000
            SERVWAITC'A;   <<WAITING FOR C'A FROM SYS CONSOLE>>         09238000
            SERVCNTRL;     <<FINISHED SETTING BAUDRATE/MODEM CNTRL>>    09240000
            SERVETXSENT;                                       <<04836>>09242000
            SERVESCSEQ;                                                 09244000
            SERVMODEM;                                                  09246000
            SERVRDNULL;                                                 09248000
            SERVTURNTORD;                                      <<04836>>09250000
         END;                                                           09252000
      END;                                                              09254000
   END;                                                                 09256000
END;                                                                    09258000
                                                                        09260000
                                                                        09262000
                                                                        09264000
ASMB(IXIT);     <<FLY AWAY,JONATHAN>>                                   09266000
END;  <<--------------------END OF TIP----------------------->>         09268000
$PAGE "READ'DEVICE'REG"                                        <<04836>>09270000
LOGICAL PROCEDURE READ'DEVICE'REG(DRT, REG'NUM);               <<04836>>09272000
   VALUE DRT, REG'NUM;                                         <<04836>>09274000
   LOGICAL DRT, REG'NUM;                                       <<04836>>09276000
BEGIN                                                          <<04836>>09278000
   EQUATE                                                      <<04836>>09280000
      READ'COMMAND = 0;                                        <<04836>>09282000
                                                               <<04836>>09284000
TOS := DRT;                                                    <<04836>>09286000
TOS := READ'COMMAND CAT REG'NUM(4:12:4);                       <<04836>>09288000
ASSEMBLE(PCN);                                                 <<04836>>09290000
IF TOS = ICF'55                                                <<04836>>09292000
   THEN BEGIN                                                  <<04836>>09294000
   ASSEMBLE(RIOA);                                             <<04836>>09296000
   END                                                         <<04836>>09298000
  <<>>                                                         <<04836>>09300000
   ELSE BEGIN  <<NOT ICF55>>                                   <<04836>>09302000
   ASSEMBLE(OR; RIOC);                                         <<04836>>09304000
   END;                                                        <<04836>>09306000
IF = THEN READ'DEVICE'REG := TOS;   <<CAN DO MUCH ON FAILURE>> <<04836>>09308000
END;                                                           <<04836>>09310000
$PAGE "WRITE'DEVICE'REG"                                       <<04836>>09312000
PROCEDURE WRITE'DEVICE'REG(DRT, REG'NUM, DATA'OUT);            <<04836>>09314000
   VALUE DRT, REG'NUM, DATA'OUT;                               <<04836>>09316000
   LOGICAL DRT, REG'NUM, DATA'OUT;                             <<04836>>09318000
BEGIN                                                          <<04836>>09320000
   EQUATE                                                      <<04836>>09322000
      WRITE'COMMAND = 0;                                       <<04836>>09324000
ASSEMBLE(PCN);                                                 <<04836>>09326000
IF TOS = ICF'55                                                <<04836>>09328000
   THEN BEGIN                                                  <<04836>>09330000
   TOS := DRT;                                                 <<04836>>09332000
   TOS := WRITE'COMMAND CAT REG'NUM(4:12:4);                   <<04836>>09334000
   TOS := DATA'OUT;                                            <<04836>>09336000
   ASSEMBLE(WIOA);                                             <<04836>>09338000
   END                                                         <<04836>>09340000
  <<>>                                                         <<04836>>09342000
   ELSE BEGIN                                                  <<04836>>09344000
   TOS := WRITE'COMMAND CAT REG'NUM(4:12:4) LOR DRT;           <<04836>>09346000
   TOS := DATA'OUT;                                            <<04836>>09348000
   ASSEMBLE(WIOC);                                             <<04836>>09350000
   END;                                                        <<04836>>09352000
<<NO CHECK IF IT DOESN'T WORK>>                                <<04836>>09354000
END;                                                           <<04836>>09356000
$PAGE "CHANNEL'ID"                                             <<04836>>09358000
LOGICAL PROCEDURE CHANNEL'ID(LDEV);                            <<04836>>09360000
   VALUE LDEV; INTEGER LDEV;                                   <<04836>>09362000
BEGIN                                                          <<04836>>09364000
   EQUATE                                                      <<04836>>09366000
      CHANNEL'CONFIG = %(16)E,                                 <<04836>>09368000
      DIT'DILTP = 5,   <<OFFSET IN DIT TO ILT POINTER>>        <<04836>>09370000
      ILT'ICNTRL = 7;   <<OFFEST IN ILT OF DRT NUMBER>>        <<04836>>09372000
   DEFINE                                                      <<04836>>09374000
      DRT = (7:9)#;                                            <<04836>>09376000
   POINTER LPDT'INDEX = %10,                                   <<04836>>09378000
           SYSDB'INDEX = 0;                                    <<04836>>09380000
                                                               <<04836>>09382000
CHANNEL'ID:=READ'DEVICE'REG(SYSDB'INDEX(SYSDB'INDEX(LPDT'INDEX <<04836>>09384000
          (2*LDEV)+DIT'DILTP)+ILT'ICNTRL).DRT, CHANNEL'CONFIG);<<04836>>09386000
END;                                                           <<04836>>09388000
$PAGE "PRINTCHAR"                                              <<04836>>09390000
LOGICAL PROCEDURE PRINTCHAR(CHAR);                             <<04836>>09392000
VALUE CHAR;  INTEGER CHAR;                                              09394000
OPTION UNCALLABLE, PRIVILEGED;                                          09396000
<< THIS PROCEDURE OUTPUTS THE BYTE "CHAR" DIRECTLY TO THE               09398000
   SYSTEM CONSOLE, WHICH IS SPECIFIED IN SYSDB + %74  >>                09400000
                                                                        09402000
BEGIN   << START OF PRINT CHAR >>                              <<04836>>09404000
EQUATE                                                         <<04836>>09406000
   R0    = 0,                                                  <<04836>>09408000
   R1    = 1,                                                  <<04836>>09410000
   R2    = 2,                                                  <<04836>>09412000
   R3    = 3,                                                  <<04836>>09414000
   R4    = 4,                                                  <<04836>>09416000
   R5    = 5,                                                  <<04836>>09418000
   R6    = 6,                                                  <<04836>>09420000
   R7    = 7,                                                  <<04836>>09422000
   R8    = 8,                                                  <<04836>>09424000
   R9    = 9,                                                  <<04836>>09426000
   RA    = %(16)A,                                             <<04836>>09428000
   RB    = %(16)B,                                             <<04836>>09430000
   RC    = %(16)C,                                             <<04836>>09432000
   RD    = %(16)D,                                             <<04836>>09434000
   RE    = %(16)E,                                             <<04836>>09436000
   RF    = %(16)F;                                             <<04836>>09438000
EQUATE                                                         <<04836>>09440000
   BIT0 = %100000,                                             <<04836>>09442000
   BIT2 = %20000,                                              <<04836>>09444000
   B14'SET = 2,                                                <<04836>>09446000
   B14'CLEAR = 0,                                              <<04836>>09448000
   DMA'CONTROL = %100000,                                      <<04836>>09450000
   DMA'RIGHT = %40000,                                         <<04836>>09452000
   ENABLE'MASK = %177577,                                      <<04836>>09454000
   GO'LYNX = %(16)BF8D,                                        <<04836>>09456000
   PORT'HCP = 8,                                               <<04836>>09458000
   READ'DONE = 6,                                              <<04836>>09460000
   SIO'PORT = 4,                                               <<04836>>09462000
   WRITE'DONE = %16;                                           <<04836>>09464000
DEFINE   << DEFINES FOR LYNX REGISTERS >>                      <<04836>>09466000
   WRITE'DMA'ADDR      = R0#,                                  <<04836>>09468000
   WRITE'DMA'BANK       = R1#,                                 <<04836>>09470000
   CONTROL'DMA'ADDR     = R2#,                                 <<04836>>09472000
   CONTROL'DMA'BANK     = R3#,                                 <<04836>>09474000
   READ'DMA'ADDR        = R4#,                                 <<04836>>09476000
   READ'DMA'BANK        = R5#,                                 <<04836>>09478000
   TERM'INTRPT'REASON   = R6#,                                 <<04836>>09480000
   INTRPTS'NO'FLUSH     = R8#,                                 <<04836>>09482000
   PORT'POINTER         = R8#,                                 <<04836>>09484000
   INTRPTS'FLUSH        = R9#,                                 <<04836>>09486000
   BOARD'ENABLE         = R9#,                                 <<04836>>09488000
   DIAG'REGA            = RA#,                                 <<04836>>09490000
   DIAG'WRITE           = RA#,                                 <<04836>>09492000
   DIAG'REGB            = RB#,                                 <<04836>>09494000
   DIRECT'COMMAND       = RB#,                                 <<04836>>09496000
   DISABLE'INTRPTS = ASSEMBLE( SED 0 )#,                       <<04836>>09498000
   CHANNEL'CONFIG       = RE#,                                 <<04836>>09500000
   CHANNEL'CONFIG'2     = RF#;                                 <<04836>>09502000
LOGICAL   << NOTE !!! -DON'T MOVE Q+1 THROUGH Q+7 >>           <<04836>>09504000
   CHARACTER,                                                  <<04836>>09506000
   READ'BRK,                                                   <<04836>>09508000
   CP'PRINTCHAR := %(16)8409,                                  <<04836>>09510000
                               << 0:1 ENABLE TTY DELAYS   >>   <<04836>>09512000
                               << 1:1 DO FORM FEEDS       >>   <<04836>>09514000
                               << 2:1 DO XON/XOFF HANDSHAK>>   <<04836>>09516000
                               << 3:1 NOT USED            >>   <<04836>>09518000
                               << 4:4 OP CODE - SET PORTPC>>   <<04836>>09520000
                               << 8:1 USE 8 BIT CHARACTERS>>   <<04836>>09522000
                               << 9:1 GENERATE OUT PARITY >>   <<04836>>09524000
                               <<10:1 PARITY BIT CONTROL  >>   <<04836>>09526000
                               << ODD OR FORCED ONE       >>   <<04836>>09528000
                               <<11:1 DO PARITY CHECKING  >>   <<04836>>09530000
                               <<12:4 LINESPEED CODE      >>   <<04836>>09532000
   CP'PRINTCHAR1 := %(16)0101, <<                        >>    <<04836>>09534000
                               <<0:8 # CR DELAYS          >>   <<04836>>09536000
                               << 8:8 # LF DELAYS        >>    <<04836>>09538000
   CP'PRINTCHAR2 := %(16)0101, <<                         >>   <<04836>>09540000
                               << 0:8 # FF DELAYS         >>   <<04836>>09542000
                               << BEGIN WRITE             >>   <<04836>>09544000
                               << 8:4 NOT USED            >>   <<04836>>09546000
                               <<12:4 OPCODE - PERFORMIO  >>   <<04836>>09548000
   CP'PRINTCHAR3 := %(16)0200, <<                         >>   <<04836>>09550000
                               << 0:1 PRIMARY READ CHARS  >>   <<04836>>09552000
                               << 1:1 DO ECHO             >>   <<04836>>09554000
                               << 2:1 HANDSHAKE IF READ   >>   <<04836>>09556000
                               << 3:1 NOT USED            >>   <<04836>>09558000
                               << 4:2 TYPE (0=WRITE ONLY) >>   <<04836>>09560000
                               << 6:1 ABORT HANDSHAKE WAIT>>   <<04836>>09562000
                               << 7:1 SAVE PRIOR 'IN' DATA>>   <<04836>>09564000
                               << 8:8 HIGHBYTE WRITE COUNT>>   <<04836>>09566000
   CP'PRINTCHAR4 := %(16)0100,  <<                       >>    <<04836>>09568000
                               << 0:8 LOW BYTE WRITE COUNT>>   <<04836>>09570000
                               << 8:8 HIGH BYTE READ COUNT>>   <<04836>>09572000
   CP'PRINTCHAR5 := %(16)00FF, <<                         >>   <<04836>>09574000
                               << 0:8 LOW BYTE READ COUNT >>   <<04836>>09576000
                               << 8:8 'END' CONTROL ORDER >>   <<04836>>09578000
   AIB'ENABLE,                                                 <<04836>>09580000
   BOARD'TYPE,                                                 <<04836>>09582000
   CONS'AIB,                                                   <<04836>>09584000
   CONS'PORT,                                                  <<04836>>09586000
   CONS'DRT := 0,                                              <<04836>>09588000
   CPUNUM,                                                     <<04836>>09590000
   DB'REG,      << CURRENT DB FOR PRINT >>                     <<04836>>09592000
   DMA'BANK,    << DMA BANK FOR PRINT   >>                     <<04836>>09594000
   DIT'INDEX,                                                  <<04836>>09596000
   ILT'INDEX,                                                  <<04836>>09598000
   INIT'COMMAND := %20000,                                     <<04836>>09600000
   INTRPT'ERROR,                                               <<04836>>09602000
   INTRPT'REASON,                                              <<04836>>09604000
   LDEV'NUMB,                                                  <<04836>>09606000
   TEMP,                                                       <<04836>>09608000
   TEMP1,                                                      <<04836>>09610000
   TEMP2,                                                      <<04836>>09612000
   LYNX'INTRPT,                                                <<04836>>09614000
   PRINT'ADDR,                                                 <<04836>>09616000
   READ'COMMAND := 0,                                          <<04836>>09618000
   STARTIME,                                                   <<04836>>09620000
   SYS'UP := FALSE,                                            <<04836>>09622000
   TERM'INTRPT  := 0,                                          <<04836>>09624000
   WRITE'COMMAND := 0,                                         <<04836>>09626000
   WAIT'LIMIT := 4;    << 4 MILLISECOND DELAY >>               <<04836>>09628000
INTEGER                                                        <<04836>>09630000
   S2 = S-2,                                                   <<04836>>09632000
   S3 = S-3,                                                   <<04836>>09634000
   I,                                                          <<04836>>09636000
   J;                                                          <<04836>>09638000
POINTER                                                        <<04836>>09640000
   LPDT'INDEX = %10,                                           <<04836>>09642000
   SYS'BASE'INDEX = 0;                                         <<04836>>09644000
INTEGER ARRAY LYNX'CONVERT(6:18) = PB :=  <<ADCC TO LYNX    >> <<04836>>09646000
 2,4,9,5,99,10,99,11,1,0,6,7,3;     <<BAUDRATE CONVERSIONS  >> <<04836>>09648000
  INTEGER SIOLOC, DRTN, LIMIT;                                          09650000
                                                               <<04836>>09652000
  INTEGER POINTER DITP;        <<POINTER TO ACCESS DIT>>                09654000
  INTEGER OLDDB, OLDBK;   << DB SAVE AREA >>                   <<04836>>09656000
  DOUBLE STARTTIME;                                                     09658000
  INTEGER ARRAY SIOPROG (0:22) = PB :=                         <<04836>>09660000
                                                                        09662000
    [8/4,8/3],       << 0--WRITE TO ENABLE CSRQ          >>    <<04836>>09664000
    1,               << 1--                              >>    <<04836>>09666000
    1,               << 2--                              >>    <<04836>>09668000
    [1/1,1/0,1/1,3/1,10/0],  << 3--LEFT BYTE, NO UPDATE  >>    <<04836>>09670000
    0,               << 4--BUFFER ADDRESS                >>    <<04836>>09672000
    [8/4,8/0],       << 5--WRITE DATA CHANNEL INSTRUCTION>>    <<04836>>09674000
    1,               << 6--                              >>    <<04836>>09676000
    1,               << 7--                              >>    <<04836>>09678000
    [1/1,1/1,1/1,3/1,10/0],  << 8--RIGHT BYTE, NO UPDATE >>    <<04836>>09680000
    0,               << 9--BUFFER ADDRESS                >>    <<04836>>09682000
    [8/2,8/0],       << 10--IDLE WAIT                    >>    <<04836>>09684000
    0,               << 11--                             >>    <<04836>>09686000
    [8/4,8/3],       << 12--WRITE TO DISABLE CSRQ        >>    <<04836>>09688000
    1,               << 13--                             >>    <<04836>>09690000
    1,               << 14--                             >>    <<04836>>09692000
    [1/1,1/1,1/1,3/1,10/0],  << 15--RIGHT BYTE, NO UPDATE>>    <<04836>>09694000
    0,               << 16--BUFFER ADDRESS               >>    <<04836>>09696000
    [8/2,8/0],       << 17--IDLE WAIT                    >>    <<04836>>09698000
    0,               << 18--                             >>    <<04836>>09700000
    0,               << 19--JUMP BACK TO IDLE WAIT       >>    <<04836>>09702000
    -4,              << 20--                             >>    <<04836>>09704000
    0,               << 21--BUFFER FOR WRITE DATA        >>    <<04836>>09706000
    [8/5,8/1];       << 22--BUFFER FOR WRITE, CSRQ       >>    <<04836>>09708000
                                                                        09710000
   ARRAY LYNX'SPEEDS(0:9) = PB := 10,15,30,60,120,180,         <<04836>>09712000
                                     240,480,960,-1;           <<04836>>09714000
   ARRAY LYNX'SPEEDCODES(0:9) = PB := 0,1,11,2,10,3,4,5,9,9;   <<04836>>09716000
$PAGE                                                          <<04836>>09718000
<< START OF PRINTCHAR PROCEDURE >>                             <<04836>>09720000
ASSEMBLE( PCN );   << WHAT PROCESSOR TYPE >>                   <<04836>>09722000
CPUNUM := TOS;                                                 <<04836>>09724000
X := %74;   << SYS BASE INDEX TO CONSOLE LDEV NUMB >>          <<04836>>09726000
LDEV'NUMB := SYS'BASE'INDEX(X);   << READ CONS LDEV NUMBER>>   <<04836>>09728000
DIT'INDEX := LPDT'INDEX(2 * LDEV'NUMB);                        <<04836>>09730000
ILT'INDEX := SYS'BASE'INDEX(DIT'INDEX + 5);                    <<04836>>09732000
CONS'PORT := SYS'BASE'INDEX(DIT'INDEX).(8:8);                  <<04836>>09734000
CONS'DRT.(7:6) := SYS'BASE'INDEX(ILT'INDEX + 7).(7:6);         <<04836>>09736000
CONS'AIB := CONS'PORT.(9:3);   << GET LYNX AIB BOARD NUMB >>   <<04836>>09738000
BOARD'TYPE := CHANNEL'ID(LDEV'NUMB);                           <<04836>>09740000
IF BOARD'TYPE = LYNX'TYPE THEN                                 <<04836>>09742000
   BEGIN   << SIB IS A LYNX >>                                 <<04836>>09744000
   DISABLE'INTRPTS;                                            <<04836>>09746000
   AIB'ENABLE := ENABLE'MASK&LSR(CONS'AIB);                    <<04836>>09748000
   << THAW LYNX >>                                             <<04836>>09750000
   WRITE'DEVICE'REG(CONS'DRT, DIAG'WRITE, GO'LYNX);            <<04836>>09752000
   << ENABLE ONLY CONSOLE AIB >>                               <<04836>>09754000
   WRITE'DEVICE'REG(CONS'DRT, BOARD'ENABLE, AIB'ENABLE);       <<04836>>09756000
   TEMP := SYS'BASE'INDEX(ILT'INDEX+13).(9:7)+ILT'INDEX+16;    <<04836>>09758000
   TEMP1 := SYS'BASE'INDEX(DIT'INDEX+9);  <<OFFSET TO DSEG>>   <<04836>>09760000
   TOS := SYS'BASE'INDEX(TEMP);                                <<04836>>09762000
   TOS := SYS'BASE'INDEX(TEMP+1);                              <<04836>>09764000
   ASSEMBLE(XCHD);  <<DB SET TO TERMINAL DATA SEGMENT NOW>>    <<04836>>09766000
   TEMP := TDS'DB(TEMP1+5);  <<GETS SPEED>>                    <<04836>>09768000
   TEMP2 := TDS'DB(TEMP1+7);  <<GETS PARITY>>                  <<04836>>09770000
   ASSEMBLE(XCHD; DDEL);                                       <<04836>>09772000
   TEMP1 := 0;                                                 <<04836>>09774000
   WHILE LYNX'SPEEDS(TEMP1) <> TEMP AND LYNX'SPEEDS(TEMP1)<> -1<<04836>>09776000
      DO TEMP1 := TEMP1+1;                                     <<04836>>09778000
   CP'PRINTCHAR.(12:4) := LYNX'SPEEDCODES(TEMP1);              <<04836>>09780000
   CP'PRINTCHAR.(9:2) := TEMP2.(2:2);   <<SET PARITY>>         <<04836>>09782000
   << SET UP PORT POINTER TO CONSOLE >>                        <<04836>>09784000
   WRITE'DEVICE'REG(CONS'DRT, PORT'POINTER, CONS'PORT);        <<04836>>09786000
   PUSH(SBANK);                                                <<04836>>09788000
   DMA'BANK := TOS LOR DMA'CONTROL;                            <<04836>>09790000
   PUSH(DB);                                                   <<04836>>09792000
   PUSH(Q);                                                    <<04836>>09794000
   DB'REG := LOGICAL(TOS) + LOGICAL(TOS);                      <<04836>>09796000
   << SET UP CONTROL BANK >>                                   <<04836>>09798000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'BANK, DMA'BANK);     <<04836>>09800000
   << SET UP CONTROL ADDR >>                                   <<04836>>09802000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(3);                 <<04836>>09804000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'ADDR, PRINT'ADDR);   <<04836>>09806000
   << SET UP WRITE DMA BANK >>                                 <<04836>>09808000
   WRITE'DEVICE'REG(CONS'DRT, WRITE'DMA'BANK, DMA'RIGHT LOR    <<04836>>09810000
                                              DMA'BANK);       <<04836>>09812000
   << SET UP WRITE DMA ADDR >>                                 <<04836>>09814000
   CHARACTER := CHAR;                                          <<04836>>09816000
   WRITE'DEVICE'REG(CONS'DRT, WRITE'DMA'ADDR, LOGICAL(1) +     <<04836>>09818000
                                 LOGICAL(DB'REG));             <<04836>>09820000
   << SET UP READ DMA BANK >>                                  <<04836>>09822000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'BANK, DMA'BANK);        <<04836>>09824000
   << SET UP READ DMA ADDR >>                                  <<04836>>09826000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(2);                 <<04836>>09828000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'ADDR, PRINT'ADDR);      <<04836>>09830000
   << START WRITE CONTROL PROGRAM >>                           <<04836>>09832000
   WRITE'DEVICE'REG(CONS'DRT, DIRECT'COMMAND, SIO'PORT);       <<04836>>09834000
   LYNX'INTRPT := FALSE;                                       <<04836>>09836000
   << LOOP UNTIL WRITE IS COMPLETE >>                          <<04836>>09838000
   PRINTCHAR := 0;                                             <<04836>>09840000
   DO                                                          <<04836>>09842000
      BEGIN   << WAIT FOR INTERRUPT >>                         <<04836>>09844000
      TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'NO'FLUSH); <<04836>>09846000
      IF TERM'INTRPT.(0:1) THEN                                <<04836>>09848000
         BEGIN   << INTERRUPT HAS OCCURED >>                   <<04836>>09850000
         TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'FLUSH); <<04836>>09852000
         IF TERM'INTRPT.(9:7) = CONS'PORT.(9:7) THEN           <<04836>>09854000
            BEGIN   << CORRECT PORT INTERRUPTED >>             <<04836>>09856000
            LYNX'INTRPT := TRUE;                               <<04836>>09858000
            INTRPT'REASON:=READ'DEVICE'REG(CONS'DRT,           <<04836>>09860000
                                           TERM'INTRPT'REASON);<<04836>>09862000
            IF INTRPT'REASON&LSR(8) <> WRITE'DONE THEN         <<04836>>09864000
               BEGIN   << NOT CORRECT REASON - ERROR >>        <<04836>>09866000
               PRINTCHAR := INTRPT'REASON.(0:8) LOR            <<04836>>09868000
                            BIT0;                              <<04836>>09870000
               END;    << NOT CORRECT REASON - ERROR >>        <<04836>>09872000
            END      << CORRECT PORT INTERRUPTED >>            <<04836>>09874000
         END     << INTERRUPT HAS OCCURED >>                   <<04836>>09876000
      ELSE                                                     <<04836>>09878000
         BEGIN   << CHECK HARDWARE ERROR >>                    <<04836>>09880000
         IF TERM'INTRPT.(2:1) THEN                             <<04836>>09882000
            BEGIN                                              <<04836>>09884000
            LYNX'INTRPT := TRUE;                               <<04836>>09886000
            INTRPT'ERROR:=READ'DEVICE'REG(CONS'DRT, DIAG'REGA);<<04836>>09888000
            PRINTCHAR := INTRPT'ERROR.(8:8) LOR BIT2;          <<04836>>09890000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137613);    <<04836>>09892000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137611);    <<04836>>09894000
            END;                                               <<04836>>09896000
         END;    << CHECK HARDWARE ERROR >>                    <<04836>>09898000
      END     << WAIT FOR INTERRUPT >>                         <<04836>>09900000
   UNTIL LYNX'INTRPT = TRUE;                                   <<04836>>09902000
   END     << SIB IS A LYNX >>                                 <<04836>>09904000
ELSE                                                           <<04836>>09906000
   BEGIN   << SIB IS A ADCC >>                                 <<04836>>09908000
    << SET DB TO SYSTEM DB.                    >>              <<04836>>09910000
                                                               <<04836>>09912000
    TOS:=DOUBLE(SYSDB);                                        <<04836>>09914000
    ASMB(XCHD);                                                <<04836>>09916000
    OLDDB:=TOS;  OLDBK:=TOS;                                   <<04836>>09918000
                                                               <<04836>>09920000
                                                                        09922000
    @DITP:=LPDT((CONSLDEV)&LSL(1));                                     09924000
    DRTN:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>09926000
    TOS := DRTN;                                               <<04836>>09928000
    ASMB(HIOP);                                                <<04836>>09930000
    WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                   <<04836>>09932000
                               <<WAIT FOR PROG HALT>>          <<04836>>09934000
                                                                        09936000
    MOVE SIOP(SIOBASE) := SIOPROG, (23);                       <<04836>>09938000
    << MOVE SIO PROGRAM TO BANK 0 >>                           <<04836>>09940000
                                                               <<04836>>09942000
                                                               <<04836>>09944000
                                                               <<04836>>09946000
    SIOLOC := @SIOP(SIOBASE)+%1000; <<ABSOLUTE BUFFER ADDRESS>><<04836>>09948000
    SIOP(SIOBASE + 4 ) := SIOLOC + 22;                         <<04836>>09950000
    SIOP(SIOBASE + 9 ) := SIOLOC + 21;                         <<04836>>09952000
    SIOP(SIOBASE + 16) := SIOLOC + 22;                         <<04836>>09954000
    SIOP(SIOBASE + 21) := CHAR;                                <<04836>>09956000
AGAIN:                                                                  09958000
    TOS:=DRTN;        <<SYS CONSOLE DRT NUMBER>>                        09960000
    TOS:=SIOLOC;                                                        09962000
    STARTSIO;        <<START SIO PROG>>                                 09964000
    IF <> THEN GOTO AGAIN;                                              09966000
    WHILE F(DRTN*4) - SIOLOC < 17 DO;                          <<04836>>09968000
    TOS:=DRTN;                                                          09970000
    ASMB(HIOP);            <<STOP SIO PROG>>                            09972000
    WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                   <<04836>>09974000
                      <<WAIT FOR SIOPROG HALT>>                         09976000
                                                               <<04836>>09978000
    << NOW WE MUST RESET THE DB REGISTER >>                    <<04836>>09980000
                                                               <<04836>>09982000
    TOS:=OLDBK;  TOS:=OLDDB;                                   <<04836>>09984000
    ASMB(XCHD; DDEL);                                          <<04836>>09986000
                                                               <<04836>>09988000
   END     << SIB IS A ADCC >>                                 <<04836>>09990000
END;   <<------------------END OF PRINTCHAR------------------->>        09992000
$PAGE  "READCHAR"                                              <<04836>>09994000
  INTEGER PROCEDURE READCHAR( WAITMS);                         <<04836>>09996000
  VALUE WAITMS;                                                <<04836>>09998000
  LOGICAL WAITMS;    << TIME-OUT FOR READ >>                   <<04836>>10000000
  OPTION VARIABLE;                                             <<04836>>10002000
      COMMENT                                                  <<04836>>10004000
        THIS PROCEDURE READS A BYTE DIRECTLY FROM THE          <<04836>>10006000
        SYSTEM CONSOLE.  THE OPTIONAL PARAMETER IS USED        <<04836>>10008000
        FOR AUTOMATIC SPEED SENSING.  IF AN ACK DOES NOT       <<04836>>10010000
        COME BACK IN WAITMS MILLISECONDS AFTER AN ENQ          <<04836>>10012000
        WAS SENT, THE CHANNEL PROGRAM IS HALTED.               <<04836>>10014000
      ;                                                        <<04836>>10016000
BEGIN   << START OF READCHAR >>                                <<04836>>10018000
EQUATE                                                         <<04836>>10020000
   R0    = 0,                                                  <<04836>>10022000
   R1    = 1,                                                  <<04836>>10024000
   R2    = 2,                                                  <<04836>>10026000
   R3    = 3,                                                  <<04836>>10028000
   R4    = 4,                                                  <<04836>>10030000
   R5    = 5,                                                  <<04836>>10032000
   R6    = 6,                                                  <<04836>>10034000
   R7    = 7,                                                  <<04836>>10036000
   R8    = 8,                                                  <<04836>>10038000
   R9    = 9,                                                  <<04836>>10040000
   RA    = %(16)A,                                             <<04836>>10042000
   RB    = %(16)B,                                             <<04836>>10044000
   RC    = %(16)C,                                             <<04836>>10046000
   RD    = %(16)D,                                             <<04836>>10048000
   RE    = %(16)E,                                             <<04836>>10050000
   RF    = %(16)F;                                             <<04836>>10052000
EQUATE                                                         <<04836>>10054000
   BIT0 = %100000,                                             <<04836>>10056000
   BIT2 = %20000,                                              <<04836>>10058000
   B14'SET = 2,                                                <<04836>>10060000
   B14'CLEAR = 0,                                              <<04836>>10062000
   DMA'CONTROL = %100000,                                      <<04836>>10064000
   DMA'RIGHT = %40000,                                         <<04836>>10066000
   ENABLE'MASK = %177577,                                      <<04836>>10068000
   GO'LYNX = %(16)BF8D,                                        <<04836>>10070000
   HIO'PORT = 8,                                               <<04836>>10072000
   NULL = 0,                                                   <<04836>>10074000
   PORT'HCP = 8,                                               <<04836>>10076000
   READ'DONE = 6,                                              <<04836>>10078000
   SIO'PORT = 4,                                               <<04836>>10080000
   WRITE'DONE = %16;                                           <<04836>>10082000
DEFINE   << DEFINES FOR LYNX REGISTERS >>                      <<04836>>10084000
   WRITE'DMA'ADDR      = R0#,                                  <<04836>>10086000
   WRITE'DMA'BANK       = R1#,                                 <<04836>>10088000
   CONTROL'DMA'ADDR     = R2#,                                 <<04836>>10090000
   CONTROL'DMA'BANK     = R3#,                                 <<04836>>10092000
   READ'DMA'ADDR        = R4#,                                 <<04836>>10094000
   READ'DMA'BANK        = R5#,                                 <<04836>>10096000
   TERM'INTRPT'REASON   = R6#,                                 <<04836>>10098000
   INTRPTS'NO'FLUSH     = R8#,                                 <<04836>>10100000
   PORT'POINTER         = R8#,                                 <<04836>>10102000
   INTRPTS'FLUSH        = R9#,                                 <<04836>>10104000
   BOARD'ENABLE         = R9#,                                 <<04836>>10106000
   DIAG'REGA            = RA#,                                 <<04836>>10108000
   DIAG'WRITE           = RA#,                                 <<04836>>10110000
   DIAG'REGB            = RB#,                                 <<04836>>10112000
   DIRECT'COMMAND       = RB#,                                 <<04836>>10114000
   DISABLE'INTRPTS = ASSEMBLE( SED 0 )#,                       <<04836>>10116000
   CHANNEL'CONFIG       = RE#,                                 <<04836>>10118000
   CHANNEL'CONFIG'2     = RF#;                                 <<04836>>10120000
LOGICAL   << NOTE !!! - DONT MOVE Q+1 THROUGH Q+4 >>           <<04836>>10122000
   CHARACTER,                                                  <<04836>>10124000
   READ'BRK,                                                   <<04836>>10126000
   CP'READCHAR  := %(16)0142,   <<SET PRINTCHAR FOR DESCRIPT>> <<04836>>10128000
   CP'READCHAR1 := %(16)0000,   <<                         >>  <<04836>>10130000
                                                               <<04836>>10132000
   CP'READCHAR2 := %(16)0001,   <<                         >>  <<04836>>10134000
   CP'READCHAR3 := %(16)FFFF,   <<                         >>  <<04836>>10136000
   AIB'ENABLE,                                                 <<04836>>10138000
   BOARD'TYPE,                                                 <<04836>>10140000
   CONS'AIB,                                                   <<04836>>10142000
   CONS'DRT := 0,                                              <<04836>>10144000
   CONS'PORT,                                                  <<04836>>10146000
   CPUNUM,                                                     <<04836>>10148000
   DB'REG,      << CURRENT DB FOR PRINT >>                     <<04836>>10150000
   DMA'BANK,    << DMA BANK FOR PRINT   >>                     <<04836>>10152000
   DIT'INDEX,                                                  <<04836>>10154000
   ILT'INDEX,                                                  <<04836>>10156000
   INIT'COMMAND := %20000,                                     <<04836>>10158000
   INTRPT'ERROR,                                               <<04836>>10160000
   INTRPT'REASON,                                              <<04836>>10162000
   LDEV'NUMB,                                                  <<04836>>10164000
   LYNX'INTRPT,                                                <<04836>>10166000
   PRINT'ADDR,                                                 <<04836>>10168000
   READ'COMMAND := 0,                                          <<04836>>10170000
   SYS'UP := FALSE,                                            <<04836>>10172000
   TERM'INTRPT  := 0,                                          <<04836>>10174000
   WRITE'COMMAND := 0,                                         <<04836>>10176000
   WAIT'LIMIT := 4,                                            <<04836>>10178000
   CURTIME,                                                    <<04836>>10180000
   STARTIME,                                                   <<04836>>10182000
   TEMP,                                                       <<04836>>10184000
   TIMEOUT;                                                    <<04836>>10186000
INTEGER                                                        <<04836>>10188000
   S2 = S-2,                                                   <<04836>>10190000
   S3 = S-3,                                                   <<04836>>10192000
   PARMS = Q-4,                                                <<04836>>10194000
   I,                                                          <<04836>>10196000
   J;                                                          <<04836>>10198000
POINTER                                                        <<04836>>10200000
   LPDT'INDEX = %10,                                           <<04836>>10202000
   SYS'BASE'INDEX = 0;                                         <<04836>>10204000
INTEGER ARRAY LYNX'CONVERT(6:18) = PB :=  <<ADCC TO LYNX    >> <<04836>>10206000
 2,4,9,5,99,10,99,11,1,0,6,7,3;    << BAUDRATE CONVERSIONS  >> <<04836>>10208000
                                                               <<04836>>10210000
  INTEGER                                                               10212000
    DRTN,                                                               10214000
    SIOLOC;                                                             10216000
  INTEGER OLDDB, OLDBK;    << DB SAVE AREA >>                  <<04836>>10218000
                                                                        10220000
  INTEGER POINTER DITP;                                        <<04836>>10222000
                                                               <<04836>>10224000
                                                               <<04836>>10226000
                                                                        10228000
  INTEGER ARRAY SIOPROG(0:45)= PB :=                           <<04836>>10230000
                                                                        10232000
  [8/4,8/1],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               10234000
          <<WRITE MOD1 :RESET,8BITS,NO PTY,2 STOPBITS>>        <<04836>>10236000
  [8/4,8/2],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               10238000
          <<WRITE MOD2,SET ECHO & CD,CLEAR CA>>                         10240000
  [8/4,8/3],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               10242000
          <<WRITE MOD3,ENABLE SRQ ON INPUT>>                            10244000
  [8/4,8/6],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               10246000
          <<WRITE MOD6,SET BAUD RATE>>                         <<04836>>10248000
  [8/2,8/0],0,       <<WAIT FOR INPUT SRQ>>                             10250000
  [8/3,8/0],1,1,[1/1,1/1,4/1,10/0],0,                                   10252000
          <<READ MOD0,INPUT CHAR FROM TERMINAL>>                        10254000
  [8/4,8/3],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               10256000
          <<WRITE MOD3,DISABLE SRQ ON INPUT>>                           10258000
  [8/4,8/2],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               10260000
          <<WRITE MOD2,DISABLE ECHO>>                                   10262000
  [8/2,8/0],0,     <<WAIT FOR WRITE COMPLETE,THEN IDLE>>                10264000
  0,-4,            <<BACK TO IDLE WAIT>>                                10266000
  -1,              <<SIO PROG END>>                                     10268000
  [8/%235,8/%024], <<DATA BYTES FOR WRITES>>                   <<04836>>10270000
  [8/%006,8/%027],                                                      10272000
  0,               <<DATA BUFFER FOR CHAR>>                             10274000
  [8/%002,8/%004];                                                      10276000
<< START AND OUTER BLOCK OF READCHAR PROCEDURE >>              <<04836>>10278000
ASSEMBLE( PCN );   << WHAT PROCESSOR TYPE >>                   <<04836>>10280000
CPUNUM := TOS;                                                 <<04836>>10282000
X := %74;   << SYS BASE INDEX TO CONS LDEV NUMB >>             <<04836>>10284000
LDEV'NUMB := SYS'BASE'INDEX(X);   << READ CONS LDEV NUMBER >>  <<04836>>10286000
DIT'INDEX := LPDT'INDEX(2 * LDEV'NUMB);                        <<04836>>10288000
ILT'INDEX := SYS'BASE'INDEX(DIT'INDEX + 5);                    <<04836>>10290000
CONS'PORT := SYS'BASE'INDEX(DIT'INDEX).(8:8);                  <<04836>>10292000
CONS'DRT.(7:6) := SYS'BASE'INDEX(ILT'INDEX + 7).(7:6);         <<04836>>10294000
CONS'AIB := CONS'PORT.(9:3);                                   <<04836>>10296000
BOARD'TYPE := CHANNEL'ID(LDEV'NUMB);                           <<04836>>10298000
IF BOARD'TYPE = LYNX'TYPE THEN                                 <<04836>>10300000
   BEGIN   << SIB IS A LYNX >>                                 <<04836>>10302000
   DISABLE'INTRPTS;                                            <<04836>>10304000
   << SET UP PORT POINTER TO CONSOLE >>                        <<04836>>10306000
   WRITE'DEVICE'REG(CONS'DRT, PORT'POINTER, CONS'PORT);        <<04836>>10308000
   PUSH(SBANK);                                                <<04836>>10310000
   DMA'BANK := TOS LOR DMA'CONTROL;                            <<04836>>10312000
   PUSH(DB);                                                   <<04836>>10314000
   PUSH(Q);                                                    <<04836>>10316000
   DB'REG := LOGICAL(TOS) + LOGICAL(TOS);                      <<04836>>10318000
   << SET UP CONTROL BANK >>                                   <<04836>>10320000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'BANK, DMA'BANK);     <<04836>>10322000
   << SET UP CONTROL ADDR >>                                   <<04836>>10324000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(3);                 <<04836>>10326000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'ADDR, PRINT'ADDR);   <<04836>>10328000
   << SET UP READ DMA BANK >>                                  <<04836>>10330000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'BANK, DMA'BANK LOR      <<04836>>10332000
                                             DMA'RIGHT);       <<04836>>10334000
   << SET UP READ DMA ADDR >>                                  <<04836>>10336000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(1);                 <<04836>>10338000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'ADDR, PRINT'ADDR);      <<04836>>10340000
   READCHAR := NULL;                                           <<04836>>10342000
   << START READ CONTROL PROGRAM >>                            <<04836>>10344000
   WRITE'DEVICE'REG(CONS'DRT, DIRECT'COMMAND, SIO'PORT);       <<04836>>10346000
   LYNX'INTRPT := FALSE;                                       <<04836>>10348000
   << LOOP UNTIL READ IS COMPLETE >>                           <<04836>>10350000
   IF PARMS.(15:1) = 1 THEN                                    <<04836>>10352000
      BEGIN   << TIME READ >>                                  <<04836>>10354000
      TEMP := %(16)A200;                                       <<04836>>10356000
      TIMEOUT := WAITMS;                                       <<04836>>10358000
      END     << TIME READ >>                                  <<04836>>10360000
   ELSE                                                        <<04836>>10362000
      BEGIN                                                    <<04836>>10364000
      TEMP := %(16)2200;                                       <<04836>>10366000
      TIMEOUT := 0;                                            <<04836>>10368000
      END;                                                     <<04836>>10370000
   ASSEMBLE(RCLK);  << SAVE CURRENT CLOCK FOR TIMEOUT >>       <<04836>>10372000
   STARTIME := TOS;                                            <<04836>>10374000
   DO                                                          <<04836>>10376000
      BEGIN   << WAIT FOR INTERRUPT >>                         <<04836>>10378000
      TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT, INTRPTS'NO'FLUSH);<<04836>>10380000
      IF TERM'INTRPT.(0:1) THEN                                <<04836>>10382000
         BEGIN   << INTERRUPT HAS OCCURED >>                   <<04836>>10384000
         TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'FLUSH); <<04836>>10386000
         IF TERM'INTRPT.(9:7) = CONS'PORT.(9:7) THEN           <<04836>>10388000
            BEGIN   << CORRECT PORT INTERRUPTED >>             <<04836>>10390000
            LYNX'INTRPT := TRUE;                               <<04836>>10392000
           INTRPT'REASON:=READ'DEVICE'REG(CONS'DRT,            <<04836>>10394000
                                          TERM'INTRPT'REASON); <<04836>>10396000
            IF INTRPT'REASON&LSR(8) <> READ'DONE THEN          <<04836>>10398000
               BEGIN   << NOT CORRECT REASON - ERROR >>        <<04836>>10400000
               READCHAR := INTRPT'REASON.(0:8) LOR             <<04836>>10402000
                           BIT0;                               <<04836>>10404000
               END     << NOT CORRECT REASON - ERROR >>        <<04836>>10406000
            ELSE                                               <<04836>>10408000
               READCHAR := CHARACTER.(8:8);                    <<04836>>10410000
            END      << CORRECT PORT INTERRUPTED >>            <<04836>>10412000
         END     << INTERRUPT HAS OCCURED >>                   <<04836>>10414000
      ELSE                                                     <<04836>>10416000
         BEGIN   << CHECK HARDWARE ERROR >>                    <<04836>>10418000
         IF TERM'INTRPT.(2:1) THEN                             <<04836>>10420000
            BEGIN                                              <<04836>>10422000
            LYNX'INTRPT := TRUE;                               <<04836>>10424000
            INTRPT'ERROR:=READ'DEVICE'REG(CONS'DRT, DIAG'REGA);<<04836>>10426000
            READCHAR := INTRPT'ERROR.(8:8) LOR BIT2;           <<04836>>10428000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137613);    <<04836>>10430000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137611);    <<04836>>10432000
            END;                                               <<04836>>10434000
         END;    << CHECK HARDWARE ERROR >>                    <<04836>>10436000
      IF LYNX'INTRPT = FALSE AND TIMEOUT <> 0 THEN             <<04836>>10438000
         BEGIN                                                 <<04836>>10440000
         ASSEMBLE( RCLK );                                     <<04836>>10442000
         CURTIME := TOS;                                       <<04836>>10444000
         IF CURTIME-STARTIME > TIMEOUT THEN                    <<04836>>10446000
            BEGIN                                              <<04836>>10448000
            READCHAR := NULL;                                  <<04836>>10450000
            WRITE'DEVICE'REG(CONS'DRT,DIRECT'COMMAND,HIO'PORT);<<04836>>10452000
            DO                                                 <<04836>>10454000
               BEGIN   << WAIT FOR HALT >>                     <<04836>>10456000
              TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,           <<04836>>10458000
                                           INTRPTS'NO'FLUSH);  <<04836>>10460000
               IF TERM'INTRPT.(0:1) THEN                       <<04836>>10462000
                  BEGIN   << HALT OCCURED >>                   <<04836>>10464000
                  TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,       <<04836>>10466000
                                               INTRPTS'FLUSH); <<04836>>10468000
                  LYNX'INTRPT := TRUE;                         <<04836>>10470000
                  END;    << HALT OCCURED >>                   <<04836>>10472000
               END     << WAIT FOR HALT >>                     <<04836>>10474000
            UNTIL LYNX'INTRPT = TRUE;                          <<04836>>10476000
            END;                                               <<04836>>10478000
         END;                                                  <<04836>>10480000
      END     << WAIT FOR INTERRUPT >>                         <<04836>>10482000
   UNTIL LYNX'INTRPT = TRUE;                                   <<04836>>10484000
   END     << SIB IS A LYNX >>                                 <<04836>>10486000
ELSE                                                           <<04836>>10488000
   BEGIN   << SIB IS A ADCC >>                                 <<04836>>10490000
  << SET DB TO SYSTEM DB.                    >>                <<04836>>10492000
                                                               <<04836>>10494000
    TOS:=DOUBLE(SYSDB);                                        <<04836>>10496000
    ASMB(XCHD);                                                <<04836>>10498000
    OLDDB:=TOS; OLDBK:=TOS;                                    <<04836>>10500000
                                                               <<04836>>10502000
                                                                        10504000
  @DITP:=LPDT(CONSLDEV&LSL(1));                                         10506000
  DRTN:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     <<04836>>10508000
  IF GETDRT(DRTN,DRT3).IDLESIO<> 0 THEN ASMB(HALT %15;BR *-1); <<04836>>10510000
                   <<STOP IF SIO PROG ALREADY ACTIVE>>                  10512000
                                                               <<04836>>10514000
                                                               <<04836>>10516000
                                                               <<04836>>10518000
  MOVE SIOP(SIOBASE) := SIOPROG, (46);                         <<04836>>10520000
  << MOVE SIO PROGRAM TO BANK 0 >>                             <<04836>>10522000
  SIOLOC := @SIOP(SIOBASE) + %1000;<<ABSOLUTE BUFFER ADDRESS>><<<04836>>10524000
                                                                        10526000
  SIOP(SIOBASE+4):=SIOP(SIOBASE+9):=SIOLOC + 42;               <<04836>>10528000
  SIOP(SIOBASE+14):=SIOP(SIOBASE+19):=SIOLOC + 43;             <<04836>>10530000
  SIOP(SIOBASE+26):=SIOLOC + 44;                               <<04836>>10532000
  SIOP(SIOBASE+31):=SIOP(SIOBASE+36):=SIOLOC + 45;             <<04836>>10534000
  SIOP(SIOBASE+43).(8:8):=DITP(DSPEED).INSPEED+%20;<<SET BAUD>><<04836>>10536000
                                                                        10538000
                                                               <<04836>>10540000
TRYAGAIN:                                                      <<04836>>10542000
                                                               <<04836>>10544000
  TOS:=DRTN;                                                            10546000
  TOS:= SIOLOC;  <<SPECIFY SIOPROG STARTING LOCATION>>                  10548000
  STARTSIO;             <<START SIO PROGRAM>>                           10550000
  IF <> THEN GO TO TRYAGAIN;                                   <<04836>>10552000
  WHILE GETDRT(DRTN,0)-SIOLOC < 37 DO;                         <<04836>>10554000
                   <<WAIT FOR PROGRAM TO GO TO IDLE WAIT>>              10556000
  TOS:=DRTN;                                                            10558000
  ASMB(HIOP);               <<HALT SIO PROGRAM>>                        10560000
  WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                     <<04836>>10562000
                   <<WAIT FOR DRT STATUS TO SHOW HALTED PROG>>          10564000
  READCHAR:=SIOP(SIOBASE+44); <<GET BYTE READ FROM TERMINAL>>  <<04836>>10566000
                                                               <<04836>>10568000
  << NOW WE MUST RESET THE DB REGISTER >>                      <<04836>>10570000
                                                               <<04836>>10572000
    TOS:=OLDBK; TOS:=OLDDB;                                    <<04836>>10574000
    ASMB(XCHD; DDEL);                                          <<04836>>10576000
                                                               <<04836>>10578000
   END     << SIB IS A ADCC >>                                 <<04836>>10580000
END;                                                           <<04836>>10582000
                                                                        10584000
$CONTROL SEGMENT=MAIN                                                   10586000
END.    << TERMRES >>                                                   10588000
