$CONTROL USLINIT,MAP                                           <<04836>>00010000
<< TERMRES - MODULE 99 >>                                               00015000
<< HP32002C MPE SOURCE C.00.00 >>                                       00020000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00025000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00030000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00035000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00040000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00045000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00050000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00055000
$TP                                                                     00060000
                                                               <<04836>>00065000
$CONTROL SEGMENT=TERMRES                                                00070000
                                                               <<04836>>00075000
BEGIN                                                          <<04836>>00080000
                                                               <<04836>>00085000
$PAGE "GLOBAL EQUATES"                                                  00090000
  EQUATE                                                                00095000
    WRTBASE   = 23,        << SIO PROG STARTING ADDRESS >>     <<04836>>00100000
    ABORTED   = 5,                                             <<04836>>00105000
    ACK        = 6,         << ASCII ACKNOWLEDGE CHARACTER >>           00110000
    ACTIVE'   = 2,         << MONITOR IS RUNNING AGAINST THIS DEVICE >> 00115000
    BANDWAIT  = 5,         << WAITING FOR LESS TERM ACTIVITY >>         00120000
    BLKDIO    =%200,       << BLOCKED I/O WAIT BIT >>                   00125000
    BLOCKED'  = 5,         << BLOCKED I/O REQUEST >>                    00130000
    BLOCKMODRD= WRTBASE+233,                                            00135000
    BLOCKTIMEOUT= 8,                                           <<04836>>00140000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00145000
    BREAKSTOP = 1,         << READ STOP CODE AFTER BREAK ACCEPTED >>    00150000
    CB'       = 5,         << CLEAR TO SEND, REQST TO SEND DELAYED >>   00155000
    CF'       = 4,         << CARRIER DETECTED IF SET >>                00160000
    CFAILTO   = 1,         << CARRIER FAIL TIME OUT REQUEST >>          00165000
    CMODE'    =11,         << TERMINAL IS IN CONSOLE MODE >>            00170000
    CNTRLA     = 1,         << ASCII CONTROL A CHARACTTER >>            00175000
    CNTRLY     =%31,        << ASCII CONTROL Y CHARACTER >>             00180000
    CR        =%15,                                                     00185000
    CRWAIT    = 1,                                                      00190000
    CRWAITLF  = 2,                                                      00195000
    CSTPADDR  = 0,         << ABSOLUTE ADDR OF CST POINTER >>  <<04836>>00200000
    CY'ETX    = %14403,    << CONTROL Y, ETX >>                <<04836>>00205000
    DBCNT     =12,         << READ,WRITE BYTE COUNTER AND LIMITS >>     00210000
    DBLKTAIL  = 36,                                                     00215000
    DBREAK    =30,         << IOQP TO SAVED BROKEN READ DATA >>         00220000
    DBTIME    = 16,                                            <<04836>>00225000
    DC1'ETX   = %10403,    << DC1 TRIGGER AND ETX CHARACTERS>> <<04836>>00230000
    DC2       =%22,        << 2640 RESPONSE TO DC1(XON) SENT OUT >>     00235000
    DC2PAIR   = 4,                                                      00240000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00245000
    DCNT      = 18,        << COUNT TO UNUSUAL RD/WRT ACTION >>         00250000
    DDLTP     = 4,         << DLT POINTER >>                            00255000
    DELECHO'  = 2,         << ECHO A \ ON CHARACTER DELETION >>         00260000
                           << 0 - NOTHING, 1 - \, 2 - LF, 3 - C'Y >>    00265000
    DHEAD     = 19,        << SYSDB POINTER TO HEAD OF TBUF LIST >>     00270000
    DILTP     = 5,         << ILT POINTER >>                            00275000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00280000
    DLAST     =23,                                                      00285000
    DLINK     = 1,         << POINTER TO NEXT DIT REQUESTING RESOURCE >>00290000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00295000
    DNXTB     = 25,        << TBUF POINTER OF A SAVE TBUF IF NOT 0 >>   00300000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00305000
    DMONTR    = 34,                                                     00310000
    DPNTR     = 21,        << BYTE POINTER TO ACCESS TBUFS >>           00315000
    DRBCT     = 11,        << REQUESTED TRANSFER COUNT IN BYTES >>      00320000
    DRQST     = 6,         << MONITOR SERVICE REQUEST FLAGS >>          00325000
                           << 0 - HANGUPTO    8  - READTO               00330000
                              1 - DISCONNECT  9  - ONLINE               00335000
                              2 - CFAILTO     10 - DSTREADY             00340000
                              3 - TURNTO      11 - LOGONTO              00345000
                              4 - IOERROR     12 - BREAK                00350000
                              5 - IODONE      13 - CONTROL Y            00355000
                              6 - SPOOLEND    14 - CFAIL                00360000
                              7 - SPOOLSW     15 - UNUSED               00365000
                           >>                                           00370000
    DRT3      = 3,         << LAST WORD OF DRT ENTRY >>                 00375000
    DRTMAX    =28,         << MAXIMUM TIME FOR READ TIMEOUT, SECONDS >> 00380000
    DRTIME    =26,         <<  INDEX TO I/O READ TIME >>                00385000
    DRTIMED   =DRTIME/2,   << DOUBLE INDEX TO I/O READ TIME >>          00390000
    DSAVE     =13,         << HOLDS WAITED DSTATE, HSTATE & TURN CHAR >>00395000
    DSIOPC    = 35,                                                     00400000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00405000
    DSTATE'   =12,         << DEVICE STATE                              00410000
                               0 - NULL         %10 - EOR SYNC          00415000
                               1 - WRITING      %11 - WRITE BUF FILL    00420000
                               2 - READING      %12 - SEND XON NEXT     00425000
                               3 - XON WRITE    %13 - DELETE CR         00430000
                               4 - WRITE TURN   %14 - SYNCS OR "!"S     00435000
                               5 - BAND WAIT    %15 - READ DATA ECHO    00440000
                               6 - EOR LF       %16 - START READ        00445000
                               7 - EOR CR       %17 - STOP READ >>      00450000
    DSTOP     = 14,        << SUB SYS BRK AND EOR CHARACTERS >>         00455000
    DSYNC     = 29,        << CR,LF SYNC DATA AND SYNC COUNTER >>       00460000
    DTAIL     = 20,        << SYSDB POINTER TO END OF TBUF LIST >>      00465000
    DTBLK     = 24,        << LINK WORD FOR QUEUED TBUF REQUESTS >>     00470000
    DTANKB    = 33,                                                     00475000
    DTBUF     =18,         << FIRST TBUF POINTER  >>                    00480000
    DTBUFD    = DTBUF/2,   << DOUBLE INDEX TO FIRST TWO TBUF POINTERS >>00485000
    DTRLX     = 31,        << TIME OUR REQUEST TRLX'S >>                00490000
    DTYPE     = 7,         << PAIRCODE, TERMTYPE, HSTATE,TIMER FLAGS>>  00495000
    ECHO'     = 3,         << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00500000
    EORLF     = 6,         << DSTATE - EOR LF IN PROGRESS >>            00505000
    EORSYNC   =%10,                                                     00510000
    ESC       =%33,        << ESC CHARACTER >>                          00515000
    ESCSEQ    = 24,                                                     00520000
    FINISEND  = WRTBASE+121,                                            00525000
    FINREAD   =%17,                                                     00530000
    ICF'55    =4, <<CPU NUMBER OF ICF 55>>                     <<04836>>00535000
    HANGINGUP =  7,        <<MODEM BEING HANGED UP>>           <<04836>>00540000
    HANGUPTURN=  6,        <<LINE BEING TURNAROUND>>           <<04836>>00545000
                                                               <<04836>>00550000
    HP2640X   = 11,        << 2640 WITH NO ECHO ON START READ >>        00555000
    HP2640TO  = 0,         << 2640/44 READ/WRITE TIME OUT REQUEST >>    00560000
    ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>        <<04836>>00565000
    IDITP     = 14,        << BEGINNING OF DITP'S IN ILT >>    <<04836>>00570000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00575000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00580000
    ISIOP     = 8,         << POINTS TO SIO PROGRAM AREA >>    <<04836>>00585000
    JUNKWAIT  = %20,                                                    00590000
    LF'ETX    = %5003,     << LINE FEED, ETX >>                <<04836>>00595000
    LOGGINGON = 2,         << HSTATE LOGGING ON >>                      00600000
    LOGONTO   = 4,         << LOG ON TIME OUT REQUEST TYPE >>           00605000
    LOSTCHAR  = 4,         << MPX NOT SERVICED IN TIME >>               00610000
    LOSTDATA  = 3,         << BUFFER NOT AVAILABLE >>                   00615000
    LYNX'TYPE = %50017,   <<LYNX CHANNEL ID VALUE>>            <<04836>>00620000
    M202'     = 2,         << 202 OR 2002 MODEM >>                      00625000
    M202      =M202'+1,    << CIRCULAR SHIFT COUNT TO GET 202 TO BIT15>>00630000
    MODSIOCNTRL=WRTBASE+154,                                            00635000
    NEWLINE'  = 8,         << LF WAS LAST CHARACTER OUTPUT >>           00640000
    NEWSPECCHAR=WRTBASE+258,<<SIO PROG ADDRESS FOR SPEC CHAR>> <<04836>>00645000
    NODATAYET = 5,                                                      00650000
    NOECHO    = 3,                                                      00655000
    NOIMPEDE  = 0,         << DONT IMPEDE FLAG TO AWAKEIO >>            00660000
    NOPROTOCOL=18, <<TERM TYPE WITHOUT DC1 READ OR ENQ WRITES>><<04836>>00665000
                          <<SET IN 8TH BIT>>                   <<04836>>00670000
    NOTRDYMSG = 11,        << NOT READY LDEV MESSAGE NUMBER >>          00675000
    NOTREADING = 0,         << DEVICE NOT IN READING STATE >>           00680000
    NOSYNC'   = 7,         << 2640 SERIES TERMINAL >>                   00685000
    NOWAIT    = 0,         << DONT WAIT IN WAKE >>                      00690000
    NULL      = 0,                                                      00695000
    NXTNULL   = 3,         <<SIO INTERRUPT CODE IN CPVA1>>              00700000
    NXTCRLF   = 4,                                                      00705000
    NXTRD     = 5,                                                      00710000
    ONLINE    = 1,         << SPEED SENSED AND CAN DO I/O HSTATE >>     00715000
    OPCONSOLE = 0,         << OUTPUT MESSAGE TO OPERATOR >>             00720000
    PAIR'     = 7,         << ESCAPE OR TERMINET XOFF LAST >>           00725000
    PAPOUTMSG = 14,        << CI MSG INDEX FOR PAPER OUT >>    <<04836>>00730000
    PCBSIZE   =16,                                                      00735000
    PREMPTSTOP= 3,         << STOP READ FOR PREMPTIVE REQUEST >>        00740000
    PRETOPOST =%30,        << ADDING A CR/LF IN PRE TO POST SPACING >>  00745000
    PRIMARY   = 1,         << GET ONLY FROM PRIMARY TABLE >>            00750000
    PRIMED'   = 10,        << 2640 READY TO SEND A BLOCK >>             00755000
    PTAPEFUNC =29,         << PAPER TAPE SPOOLING FUNCTION >>           00760000
    PTYERROR  = 5,         << READ PARITY ERROR >>                      00765000
    QFUNC     = 6,         << FUNCTION  >>                              00770000
    QLDEV     = 2,         << LOGICAL DEVICE NUMBER >>                  00775000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00780000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00785000
                  << .(0:8)-READ TO TRLX; .(12:4)-REQUEST STATE>>       00790000
    QPAR1     = 8,         << READ EOF CONTROL; WRITE SPACE CONTROL >>  00795000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00800000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00805000
    RDDATAINSTR=WRTBASE+91,                                             00810000
    RDSPECL   = 2,         <<CPVA2 INTERRUPT CODE>>                     00815000
    RDSTRT    =WRTBASE+43,                                              00820000
    RDINTRPT  =WRTBASE+147,                                             00825000
    RDWAIT    =WRTBASE+76,                                              00830000
    READBINARY= 1,         << BINARY READ IN PROGRESS >>                00835000
    READCMPLTD=%43,        << RSTATE - READ COMPLETED >>                00840000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>               00845000
    READTIMEOUT= 3,        << READ TIME OUT REQUEST TYPE >>             00850000
    READTO    = 6,         << READ TIMED OUT READERRORS CODE >>         00855000
    READWAITING= 5,        << READ WAITING TO START AFTER WRITE DONE >> 00860000
    RESTART'  = 1,         << RESTART WRITE AFTER BUFFER FILL >>        00865000
    REPEATING =%14,        << WRITING SYNC'S OR "!"'S >>                00870000
    REQUEST'  = 3,         << MONITOR SERVICE REQUESTED WHILE ACTIVE >> 00875000
    SECONDARY = 2,         << GET TBUF FROM 2ND IF PRIMARY EMPTY >>     00880000
    RECVOFF   =WRTBASE+50,                                              00885000
    SBUFMAXB  = 256,                                                    00890000
    SENDLF    = 8,         <<CPVA1 CODE TO SEND LF/SYNCS>>     <<04836>>00895000
    SIOBASE   = -46,       << OFFSET FROM INITTCP TO SIO AREA>><<04836>>00900000
    SP'ETX    = %20003,    << SPACE, ETX >>                    <<04836>>00905000
    SPECIALSTOP= 1,        << READ TERMINATED ON SPECIAL STOP CHAR >>   00910000
    SPOOLEND' = 7,         << PTAPE READ COMPLTD SERVICE REQUES<<04836>>00915000
    SPOOLING' = 5,         << PTAPE READ IN PROGRESS >>                 00920000
    SPOOLSW'  = 6,         << PTAPE BUFFER FULL SERVICE REQUEST<<04836>>00925000
    SPSENBAUD =WRTBASE+178,                                             00930000
    SPDSENSIO = 7,         <<SPEEDSENSE SIO PROG ACTIVE DSTATE>>        00935000
    SRQOFF    = WRTBASE+209,                                            00940000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00945000
    STOPPED   =%44,        << READ STOPPED REQUEST STATE >>             00950000
    SYSDB     =%1000,                                                   00955000
    SYNC'CR   = 6,                                                      00960000
    SYNC'LF   = 7,                                                      00965000
    SYNSTRT   =WRTBASE+57,                                              00970000
    SYSINITTCP=%347,       << SYSGLOB OFFSET >>                <<04836>>00975000
    SYSIOQ    = 5,                                                      00980000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00985000
    SYSSBUF   = 6,                                                      00990000
    SYSTBUF   =%16,                                                     00995000
    TAPEMODE' = 0,         << PAPER TAPE READ MODE;NO EDIT RESPONSES >> 01000000
    TBMAXB    = 60,                                                     01005000
    TBQN      = 0,        <<RESOURCE QUEUE# FOR TBUF REQUESTS>>         01010000
                       << BECAUSE THE LIMIT REGISTER IS >>     <<04836>>01015000
                       << UPDATED BY THE FIRMWARE BEFORE>>     <<04836>>01020000
                       << IT GETS TO TICK(SEE TICK PROC >>     <<04836>>01025000
    TERMCHAR' =10,         << TERMINATE INPUT ON STOP CHAR >>           01030000
    THEAD     = 2,         << HEAD INDEX  >>                            01035000
    TOVRFL    = 5,         << OVERFLOW OF PRIMARY TABLE COUNTER >>      01040000
    TRANSERR' = %14,       << IOSTAT ERROR FOR 2631'S >>       <<04836>>01045000
    TRANSMIT  = 4,         << FINSH TURNING 202 TO WRITE STATE >>       01050000
    TRANSMIT' = 5,        << FINISH TURN OF HALF DUPLEX LINE >><<04836>>01055000
    TRQSTS    = 3,         << REQUEST FOR ELEMENTS COUNTER, DOUBLE >>   01060000
    TSIZE     = 1,         << ELEMENT SIZE AND IMPEDED PCB >>           01065000
    TTAIL     = 3,         << INDEX OF LAST ELEMENT  >>                 01070000
    TURN202    = 4,        << DSTATE, TURNING 202 TO READ OR WRITE >>   01075000
    TURNTO     = 2,        << 202 TURN AROUND TIME OUT TYPE >>          01080000
    TUSE      = 4,         << MAX IN USE AND CURRENT IN USE >>          01085000
    UP'       = 1,         << ON LINE,SPEED SENSED AND CAN DO I/O >>    01090000
    WAIT2SIO  = WRTBASE+251,                                            01095000
    WAITED    =%11,        << WRITE/READ/BANDWAIT HELD FOR BREAK >>     01100000
    WAITACK   = 16,        <<CPVA2 INTERRUPT CODE>>                     01105000
    WAITCR    = 14,        <<CPVA2 INTERRUPT CODE>>                     01110000
    WAITC'A   = 18,        <<CPVA2 INTERRUPT CODE>>                     01115000
    WAITING   = 7,        << QMISC STATE FOR WAITED REQ'S >>   <<04836>>01120000
    WAITSPDS  =8,                                                       01125000
    WRITING   = 1,         << DSTATE IS WRITING >>                      01130000
    WRTDATAINSTR=WRTBASE+34,                                            01135000
    WRT'RD    =WRTBASE+66,                                              01140000
    WRT'RD2   = WRTBASE+246,                                            01145000
    WRTSPECL  = 3,                                             <<04836>>01150000
    XMITON    =WRTBASE+5,                                               01155000
    XMITOFF   =WRTBASE+71,                                              01160000
    XON       =%21,                                                     01165000
    XOFF       =%23,        << ASCII CONTROL X CHARACTER >>             01170000
    XOFFTIMEOUT= 9,        << XOFF TIMER REQUEST >>            <<04836>>01175000
  ENDEQ       = 0;                                                      01180000
                                                               <<04836>>01185000
$PAGE "GLOBAL DEFINES"                                                  01190000
  DEFINE                                                                01195000
    ABORTWRT  =( 5:1)#,                                                 01200000
    ABS       = ABSOLUTE#,                                              01205000
    ACTIVE    =(ACTIVE'  :1)#,                                          01210000
    AUTOHANDSH=IOQPL(QPAR2).(9:1)#, << DO VIEWS READ >>        <<04836>>01215000
    BINARYREAD=(11:1)#,    << IF SET THEN XFER 8 BITS ON READ >>        01220000
    ASMB      = ASSEMBLE#,                                              01225000
    BINARY    =(11:2)#,    << IF 0 THEN ASCII ELSE BINARY READ >>       01230000
    BLOCKED   =(BLOCKED':1)#,<< REQUEST WAITS UNTIL COMPLETION >>       01235000
    BLOCKRD   =(10:1)#,                                                 01240000
    BRKRQST   =(12:1)#,                                                 01245000
    CB        =(CB':1)#,                                                01250000
    CBSB      =(CB':2)#,   << CURRENT STATE OF CB AND SB >>             01255000
    CCVALUE   =( 9:1)#,    << OLD CC STATUS KEPT IN DSAVE>>             01260000
    CF        = (CF':1)#,  << CARRIER DETECTED >>                       01265000
    CF'CB'SB  =( 4:3)#,    << HALF DUPLEX STATE >>             <<04836>>01270000
    CFAILCNT  =( 4:6)#,    << CARRIER FAILURE COUNTER >>       <<04836>>01275000
    CFAILTRLX = DITP(32).(0:8)#, << CARRIER FAIL TIMER INDEX>> <<04836>>01280000
    CMODE     =(CMODE':1)#,<< TERMINAL IN CONSOLE MODE >>               01285000
    CONSINTRPT=(11:1)#,    << CONSOLE INTERRUPT OK IF SET >>   <<04836>>01290000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<04836>>01295000
    DELACK    =( 8:1)#,                                                 01300000
    DELECHO   =(DELECHO':2)#,                                           01305000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     01310000
    DISCONNECT=( 1:1)#,    << DISCONNECT SERVICE REQUEST TO TERM >>     01315000
    DOMOD     =( 6:1)#,                                                 01320000
    DONXTMOD  =( 3:3)#,                                                 01325000
    DOSTATREQ  =( 3:1)#,   << REQUEST STATUS AFTER DATA >>     <<04836>>01330000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           01335000
    DMONTRP   = DITP(DMONTR)#,                                 <<04836>>01340000
    DRTNUMBER =(7:9)#,                                         <<04836>>01345000
    DSAVEPL   = DITPL(DSAVE)#,                                 <<04836>>01350000
    DSETREADY =(10:1)#,    << DATA SET READY SERVICE REQUEST TO TERM >> 01355000
    DSTATE    =(DSTATE'  :4)#,                                          01360000
    ECHO      =(ECHO':1)#,                                              01365000
    ECHOON    =( 2:1)#,  <<WHEN RESTART RD, ENABLE ECHO>>               01370000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     01375000
    ENQACKWAIT=(11:1)#,    << 2640 WRITE ENQ/ACK WAIT >>                01380000
    ENQOFFSET =(1:15)#,                                                 01385000
    EORCHAR    =( 8:8)#,    << TRANSPARENT READ EOR CHARACTER >>        01390000
    F         = ABSOLUTE#,                                              01395000
    FILLING   =(14:1)#,    <<IOTERM IS FILLING TBUFS WITH WRT DATA>>    01400000
    FLUSH     =(0:1)#,     << BRK/SSBRK FLUSH IN PROGRESS >>            01405000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   01410000
    HIOP      =CON %20302;CON 1#,                                       01415000
    HIOPWAIT  =( 0:1)#,                                                 01420000
    HP2631B   = (19 <= DITP(DTYPE).TTYPE <= 22)#,              <<04836>>01425000
    HP2631BFX  = (21 <= DITP(DTYPE).TTYPE <= 22)#,             <<04836>>01430000
    HSTATE    =( 4:3)#,    << HANG UP STATE                             01435000
                               0 - HUNGUP       3 - HNGP SPD SNS DISCNCT01440000
                               1 - ONLINE       4 - DCLOSE DISCONNECT   01445000
                               2 - LOGGING ON   5 - LO SPD SNS DISCNCT  01450000
                               6 - HANG UP TURN 7 - HANGING UP >>       01455000
    IDLESIO   =(0:3)#,<<0-RUNSTATUS,1-CHNG STAT,2-PWR RECVRY>>          01460000
    ININ      =(14:1)#,    <<SYSTEM INITIALIZATION FLAG>>      <<04836>>01465000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         01470000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           01475000
                               1 - 240 CPS         5 - 15 CPS           01480000
                               2 - 120 CPS         6 - 10 CPS           01485000
                               3 -  60 CPS         7 - 14 CPS  >>       01490000
    INUSE     =(8:8)#,     << NUMBER OF ELEMENTS CURRENTY IN USE >>     01495000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          01500000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           01505000
    LFLAST    =( 1:1)#,                                                 01510000
    LFSYNC    =( 0:4)#,    << NUMBER OF SYNC'S AFTER A LF >>            01515000
    LIMIT1    =(8:8)#,     << PRIMARY TABLE SIZE  >>                    01520000
    MCODE     =(10:6)#,    << MONITORING TO BE DONE CODE >>             01525000
    MODACTIVE =( 6:1)#,    <<INTERF MODEM CONTROL PROG ACTIVE>>         01530000
    MODEM     =( 2:2)#,     << MODEM TYPE NUMBER >>            <<04836>>01535000
    MODCA     =(12:1)#,                                                 01540000
    MODCH     =(14:1)#,                                                 01545000
    MODCBREF  =( 3:1)#,                                                 01550000
    MODCCREF  =( 4:1)#,                                                 01555000
    MODCFREF  =( 6:1)#,                                                 01560000
    MODSBREF  =( 7:1)#,                                                 01565000
    MODCFMSK  =(14:1)#,                                                 01570000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                01575000
                                0 - HARDWIRED   2 - 202C                01580000
                                1 - 103         3 - 2002   >>           01585000
    MSECS'24'DAYS= 2073600000D#,<< MILLISEC IN 24 DAYS>><<01.03>>       01590000
    NEWLINE   =(NEWLINE' :1)#,                                          01595000
    NOSYNC    =(NOSYNC':1)#,<< NO SYNC TERMINAL, USES ENQ AND ACK >>    01600000
    NO'CX'ECHO=( 1:1)#,    << IF SET DONT ECHO !!! ON CONTROL X >>      01605000
    NXTDSTATE =( 9:4)#,    << NEXT DSTATE AFTER 202 TURN AROUND >>      01610000
    OE        =( 5:1)#,                                                 01615000
    OEPE      =( 5:2)#,    <<UART OVERRUN,PTY ERROR STATUS>>            01620000
    OFFLINE   = (13:1)#,   << OF STATUS FROM HP263X >>         <<04836>>01625000
    OWNREAD   =(10:1)#,    << USER DOES OWN DC1/DC2 HANDSHAKING >>      01630000
    PAIR      =(PAIR'    :1)#,                                          01635000
    PAIRCODE  =(12:4)#,    << DENOTES LAST PAIR CHAR INPUT >>           01640000
    PAPEROUT  = (15:1)#,   << STATUS FROM HP263X >>            <<04836>>01645000
    PCBN      =( 0:8)#,    << QSTAT, PCB NUMBER >>                      01650000
    PE        =( 6:1)#,    <<UART PARITY ERROR BIT>>                    01655000
    PTYCHK    =( 9:1)#,                                                 01660000
    PTYON     =( 7:1)#,                                                 01665000
    PTYONODD  =( 7:2)#,    <<PTY ON FLAG; ODD PTY FLAG>>       <<04836>>01670000
    PRIMED    =(PRIMED':1)#,<< 2640 READY TO SEND A BLOCK >>            01675000
    RDCOUNTED =( 8:1)#,    << RDCOUNTER INCREMENTED >>                  01680000
    RDFLUSH   =( 2:1)#,                                        <<04836>>01685000
    READTRLX  =( 8:8)#,    << TRLX FOR READ & LOGON TIME OUTS >>        01690000
    READSTOP  =( 7:3)#,    << IF NOT ZERO THEN STOP READ BECAUSE        01695000
                                 0 - NONE        4 - LOGON TIMED OUT    01700000
                                 1 - BREAK       5 - ABORTED            01705000
                                 2 - PREMPT      6 - NOT USED           01710000
                                 3 - TIMED OUT   7 - NOT USED  >>       01715000
    READERRORS=(10:3)#,    << 0-OK,1-SPECIALSTOP,2-PTY ERR              01720000
                              3-LOST DATA,4-LOST CHAR,5-BREAK >>        01725000
    RESTART   =(RESTART':1)#,                                           01730000
    RESTSPD   =(10:1)#,                                                 01735000
    REQUEST   =(REQUEST':1)#,<< REQUEST FOR SERVICE WHILE ACTIVE >>     01740000
    RIOA      =CON %20302;CON %13#,                            <<04836>>01745000
    RIOC      =CON %20302;CON 2#,                              <<04836>>01750000
    RPLEVEL   =(13:3)#,    << REQUEST PREMPT LEVEL,SEE LPLEVEL  >>      01755000
    RSTATE    =(10:6)#,    << REQUEST STATE -                           01760000
                              0 - NEW       %30 - PRE TO POST TBUF WAIT 01765000
                              1 - STARTED   %31 - PRESPACE TBUF WAIT    01770000
                              2 - READING    32 - WRT DATA TBUF WAIT    01775000
                             43 - RD CMPLTD  33 - POSTSPACE TBUF WAIT   01780000
                             44 - RD STOPPED                            01785000
                              5 - READ WAITING                          01790000
                             %34-%37 SAME A %30-%33 BUT ENQ ADD WAIT    01795000
                           >>                                           01800000
    SB        =( 6:1)#,                                                 01805000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS  00.02>>01810000
    SIOHIOP   =( 2:1)#,                                                 01815000
    SPDFOUND  = ( 9:1)#,   << ON LINE OR SPD SNSE SERVICE REQST >>      01820000
    SPDSENSING=( 4:1)#,                                                 01825000
    SPDSIO    =( 2:1)#,                                                 01830000
    SPOOLEND  =(SPOOLEND':1)#,                                          01835000
    SPOOLING  =(SPOOLING':1)#,                                          01840000
    SPOOLSW   =(SPOOLSW' :1)#,                                          01845000
    SSBRQST   =(13:1)#,                                                 01850000
    SSBRKCHAR  =( 0:8)#,    << TRANSPARENT READ SUB SYS BRK CHARACTER >>01855000
    STARTSIO  =ASMB(CON %20302;CON 0)#,                                 01860000
    STATDONE  = (15:1)#,   << DRQST, STAT REQ COMPLETE >>      <<04836>>01865000
    STATREQ   = DITPL(DSAVE).(13:1)#, << STAT REQ ACTIVE >>    <<04836>>01870000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  01875000
    STOPSIO = ASMB(CON %20302; CON 1)#,                        <<04836>>01880000
    STRTWRT   =(14:1)#,                                                 01885000
    SYNCSTATE =( 4:4)#,    << SAVED INTERRUPT FOR SYNCS >>     <<04836>>01890000
    TAPEMODE  =(TAPEMODE':1)#,                                          01895000
    TERMCHAR  =(TERMCHAR':1)#,                                          01900000
    TERMSPEED =(10:6)#,   <<DEFAULT SPEED>>                    <<04836>>01905000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            01910000
    TESTBIT   = ASSEMBLE(TBC#,                                          01915000
    TIMING    = (0:1)#,    << A TIMED READ IS IN PROGRESS >>            01920000
    TIMEREAD  =( 1:1)#,    << TIME READ OPERATIONS >>                   01925000
    TMODE     =(11:2)#,    << TERMINAL MODE                             01930000
                                 0 - NORMAL   2 - CONSOLE               01935000
                                 1 - BREAK    3 - CONSOLE FROM BREAK >> 01940000
    TRANSERR  = (12:1)#,   << STATUS FROM 2635X >>             <<04836>>01945000
    TURNTOWRITE=( 7:1)#,   << IF SET, 202 TURNING TO WRITE ELSE READ >> 01950000
    UP        =(UP':1)#,   << UNIT IS ON LINE & SPEED SENSED >>         01955000
    WAITEDSTATE=(0:4)#,    << STATE WAITED FOR BREAK >>                 01960000
    WAITXON   =(10:1)#,    <<WRITE HALTED TO WAIT FOR XON>>    <<04836>>01965000
    WIOA      =CON %20302;CON %14#,                            <<04836>>01970000
    WIOC      =CON %20302;CON 3#,                              <<04836>>01975000
    WRTCOUNTED=( 9:1)#,    << WRTCOUNTER INCREMENTED >>                 01980000
    WRTENQ    =( 0:1)#;                                                 01985000
$PAGE "GLOBAL VARIABLE DECLARATIONS"                                    01990000
                                                                        01995000
  <<----------- GENERAL SERVICE VARIABLES ----------------->>           02000000
                                                                        02005000
                                                                        02010000
    LOGICAL SYSUP = DB + %73;  << SYSTEM UP FLAG >>                     02015000
    INTEGER ARRAY ILT(*) = DB;                                          02020000
   ARRAY TDS'DB(*) = DB; <<TO ACCESS TERMINAL DATA SEGMENT>>   <<04836>>02025000
                                                                        02030000
  INTEGER POINTER PS0 = S-0;                                            02035000
  LOGICAL LS0 = S-0, LS1 = S-1;                                         02040000
  INTEGER S0 = S-0, X = X;                                              02045000
                                                                        02050000
    INTEGER ARRAY WA0(*) = DB + 0;                                      02055000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    02060000
                                                                        02065000
                                                                        02070000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               02075000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               02080000
    INTEGER ARRAY IOQ (@) = DB + SYSIOQ ;                               02085000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               02090000
    INTEGER ARRAY TBUF(@) = DB + SYSTBUF;                               02095000
    INTEGER ARRAY SIOP(@) = DB + SYSINITTCP;                   <<04836>>02100000
    << THE SIO PROGRAM AREA FOR PRINTCHAR AND READCHAR IS    >><<04836>>02105000
    << LOCATED 46 WORDS BEFORE THE INITTCP AREA IN BANK 0.   >><<04836>>02110000
    << TO SAVE A SYSGLOB CELL, THE SIO AREA WILL BE ACCESSED >><<04836>>02115000
    << BY USING THE POINTER TO INITTCP(-46) OR SIOP(SIOBASE).>><<04836>>02120000
                                                                        02125000
    INTEGER WRTCOUNTER = DB + %65; << # OF TERMNAL WRITES IN PROGRESS >>02130000
                                                                        02135000
    INTEGER CONSLDEV   = DB + %74;  << SYSTEM CONSOLE LDEV >>           02140000
    INTEGER POWERFAIL  = DB + %72;  << POWERFAIL STATE >>               02145000
    INTEGER PROGENPCBP = DB + %141;  << PROGEN PCB INDEX >>             02150000
    LOGICAL LOGONTIME  = DB + %120; << MAX LOGON TIME IN SECONDS >>     02155000
                                                                        02160000
  <<-------------- MONITORING DECLARATIONS ---------------->>           02165000
                                                                        02170000
    INTEGER DSETB = DB + %66;                                           02175000
    DOUBLE LASTTIMER = DB + %67;                                        02180000
                                                                        02185000
                                                                        02190000
$PAGE "PROCEDURE DECLARATIONS"                                          02195000
                                                                        02200000
  <<---------EXTERNAL PROCEDURE DECLARATIONS ------------->>            02205000
                                                                        02210000
                                                                        02215000
PROCEDURE ABORTTIMEREQ(TRLX);                                           02220000
  VALUE TRLX;   INTEGER TRLX;   OPTION EXTERNAL;                        02225000
                                                                        02230000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       02235000
  VALUE PCBPT, N, WAITF;                                                02240000
  INTEGER PCBPT, N, WAITF;  OPTION EXTERNAL;                            02245000
                                                               <<04836>>02250000
DOUBLE PROCEDURE B08'LOGICAL'DVR(LDEV, QMISC, DSTX, ADDR,      <<04836>>02255000
                                 FNCT, CNT, P1, P2, FLAGS);    <<04836>>02260000
                                                               <<04836>>02265000
VALUE                            LDEV, QMISC, DSTX, ADDR,      <<04836>>02270000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04836>>02275000
                                                               <<04836>>02280000
INTEGER                          LDEV, QMISC, DSTX, ADDR,      <<04836>>02285000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04836>>02290000
                                                               <<04836>>02295000
OPTION EXTERNAL;                                               <<04836>>02300000
                                                               <<04836>>02305000
                                                                        02310000
INTEGER PROCEDURE GETSBUF(TYPE);                                        02315000
  VALUE TYPE;  INTEGER TYPE;                                            02320000
  OPTION EXTERNAL;                                                      02325000
                                                                        02330000
INTEGER PROCEDURE GETIOQ(TYPE);                                         02335000
  VALUE TYPE;   INTEGER TYPE;   OPTION EXTERNAL;                        02340000
                                                                        02345000
INTEGER PROCEDURE RETURNSBUF(PNTR);                                     02350000
  VALUE PNTR;   INTEGER POINTER PNTR;   OPTION EXTERNAL;                02355000
                                                                        02360000
INTEGER PROCEDURE RETURNIOQ(PNTR);                                      02365000
  VALUE PNTR;   INTEGER POINTER PNTR;   OPTION EXTERNAL;                02370000
                                                                        02375000
                                                                        02380000
PROCEDURE HELP;   OPTION EXTERNAL;                                      02385000
                                                                        02390000
PROCEDURE IDLEWAIT (DITP);                                              02395000
  INTEGER ARRAY DITP;                                                   02400000
  OPTION FORWARD;                                                       02405000
                                                                        02410000
PROCEDURE IOIMPEDE(TBASE);                                              02415000
  VALUE TBASE;  INTEGER TBASE;                                          02420000
  OPTION EXTERNAL;                                                      02425000
                                                                        02430000
PROCEDURE LOGERROR(A,B,C);                                              02435000
VALUE A,B,C;                                                            02440000
INTEGER C;                                                              02445000
INTEGER POINTER A,B;                                                    02450000
OPTION EXTERNAL;                                                        02455000
                                                                        02460000
LOGICAL PROCEDURE READ'DEVICE'REG(DRT, REG'NUM);               <<04836>>02465000
VALUE DRT, REG'NUM;                                            <<04836>>02470000
LOGICAL DRT, REG'NUM;                                          <<04836>>02475000
OPTION FORWARD;                                                <<04836>>02480000
                                                               <<04836>>02485000
PROCEDURE WRITE'DEVICE'REG(DRT, REG'NUM, DATA'OUT);            <<04836>>02490000
VALUE DRT, REG'NUM, DATA'OUT;                                  <<04836>>02495000
LOGICAL DRT, REG'NUM, DATA'OUT;                                <<04836>>02500000
OPTION FORWARD;                                                <<04836>>02505000
                                                               <<04836>>02510000
LOGICAL PROCEDURE CHANNEL'ID(LDEV);                            <<04836>>02515000
VALUE LDEV;                                                    <<04836>>02520000
INTEGER LDEV;                                                  <<04836>>02525000
OPTION FORWARD;                                                <<04836>>02530000
                                                                        02535000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QUEUENUMBER);                       02540000
  VALUE LINKINDEX, QUEUENUMBER;   INTEGER LINKINDEX, QUEUENUMBER;       02545000
OPTION EXTERNAL;                                                        02550000
                                                                        02555000
PROCEDURE AWAKEIO( DITP,FLAGS);                                         02560000
  VALUE DITP, FLAGS;                                                    02565000
  INTEGER POINTER DITP;  INTEGER FLAGS;                                 02570000
  OPTION EXTERNAL;                                                      02575000
                                                                        02580000
PROCEDURE SUDDENDEATH(N);                                               02585000
  VALUE N;  INTEGER N;                                                  02590000
  OPTION EXTERNAL;                                                      02595000
                                                                        02600000
DOUBLE PROCEDURE TIMER;     OPTION EXTERNAL;                            02605000
                                                                        02610000
PROCEDURE IOUNIMPEDE(TABLE);                                            02615000
  VALUE TABLE;   INTEGER TABLE;   OPTION EXTERNAL;                      02620000
                                                                        02625000
PROCEDURE STORE'IOQ(IOQP,FLAGS);                                        02630000
  VALUE IOQP,FLAGS;   LOGICAL FLAGS;   POINTER IOQP;                    02635000
  OPTION EXTERNAL;                                                      02640000
                                                                        02645000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               02650000
  VALUE CODE, REQ, TIME;                                                02655000
  INTEGER CODE, REQ;   DOUBLE TIME;                                     02660000
  OPTION EXTERNAL;                                                      02665000
                                                                        02670000
PROCEDURE WAIT(WAITF,WAITTYPE);                                         02675000
  VALUE WAITF, WAITTYPE;                                                02680000
  INTEGER WAITF, WAITTYPE;                                              02685000
  OPTION EXTERNAL;                                                      02690000
                                                                        02695000
$PAGE                                                          <<04836>>02700000
LOGICAL PROCEDURE PRINTCHAR(CHAR);                             <<04836>>02705000
  VALUE CHAR;INTEGER CHAR;                                              02710000
  OPTION FORWARD;                                                       02715000
                                                               <<04836>>02720000
INTEGER PROCEDURE GETDRT(DRT,OFFSET);                          <<04836>>02725000
VALUE DRT,OFFSET;                                              <<04836>>02730000
INTEGER DRT,OFFSET;                                            <<04836>>02735000
OPTION EXTERNAL;                                                        02740000
                                                               <<04836>>02745000
PROCEDURE PUTDRT(DRT,OFFSET,NUM);                              <<04836>>02750000
VALUE DRT,OFFSET,NUM;                                          <<04836>>02755000
INTEGER DRT,OFFSET,NUM;                                        <<04836>>02760000
OPTION EXTERNAL;                                                        02765000
                                                               <<04836>>02770000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<04836>>02775000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<04836>>02780000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<04836>>02785000
   IOTYPE;                                                     <<04836>>02790000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<04836>>02795000
   IOTYPE;                                                     <<04836>>02800000
INTEGER POINTER DITP;                                          <<04836>>02805000
OPTION VARIABLE,EXTERNAL;                                               02810000
                                                               <<04836>>02815000
procedure MPE'TABLE'FULL(TABNUM);                              <<04836>>02820000
value TABNUM;  integer TABNUM;                                 <<04836>>02825000
OPTION EXTERNAL;                                                        02830000
                                                               <<04836>>02835000
PROCEDURE CHECKINDEX(INDX,TB);                                          02840000
  VALUE INDX,TB;   INTEGER INDX;   INTEGER POINTER TB;                  02845000
  OPTION EXTERNAL;                                                      02850000
                                                                        02855000
PROCEDURE ISSUE'HARD'MSG(MSGNO,PARM,FLAGS);                             02860000
  VALUE MSGNO,PARM,FLAGS;                                               02865000
  INTEGER MSGNO,PARM;   LOGICAL FLAGS;   OPTION EXTERNAL;               02870000
                                                                        02875000
                                                                        02880000
                                                                        02885000
$PAGE "AWAKETERMINAL"                                                   02890000
PROCEDURE AWAKETERMINAL(DITP);                                          02895000
  INTEGER ARRAY DITP;                                                   02900000
    OPTION UNCALLABLE,PRIVILEGED;                              <<04836>>02905000
  <<                                                                    02910000
    THIS PROCEDURE SEARCHES THE IOQ LIST OF THE DEVICE SPECIFIED BY     02915000
    DITP AND IF ANY BLOCKED I/O OPERATION IS FOUND, THAT PROCESS IS     02920000
    AWAKENED TO RUN THE TERMINAL MONITOR. IF NO BLOCKED I/O PROCESS     02925000
    IS FOUND, THE SYSTEM I/O PROCESS IS AWAKENED.                       02930000
  >>                                                                    02935000
  BEGIN                                                                 02940000
    X := DITP(DIOQP);                                                   02945000
    WHILE <> DO   << SEARCH FOR A BLOCKED REQUEST >>                    02950000
      IF LOGICAL(WA0(X)).BLOCKED THEN                                   02955000
        BEGIN   << A BLOCKED REQUEST FOUND >>                           02960000
          X := X + QSTAT;   << INDEX TO PCB NUMBER >>                   02965000
          AWAKE(WA0(X).PCBN*PCBSIZE,BLKDIO,NOWAIT);                     02970000
          RETURN;                                                       02975000
        END                                                             02980000
      ELSE X := WA0(X:=X+QLINK);   << STEP TO NEXT IOQ >>               02985000
                                                                        02990000
    AWAKEIO(DITP,NOIMPEDE);                                             02995000
  END;   << AWAKE TERMINAL >>                                           03000000
$PAGE "DMONITOR"                                                        03005000
                                                                        03010000
PROCEDURE DMONITOR(DITP,ID,P1,P2);                                      03015000
  VALUE ID, P1, P2;   INTEGER ID, P1, P2;                               03020000
  INTEGER ARRAY DITP;                                                   03025000
  OPTION PRIVILEGED, UNCALLABLE;                                        03030000
  BEGIN                                                                 03035000
    INTEGER POINTER PS1 = S - 1;                                        03040000
    INTEGER Q0 = Q - 0;                                                 03045000
                                                                        03050000
    TOS := DITP(DMONTR).MCODE;   << SET MNCODE >>              <<04836>>03055000
    TOS := TOS LAND LOGICAL(ID) LAND %70; << CHECK CALLER WITH FLAGS >> 03060000
    IF = THEN RETURN;  << CALLER NOT BEING MONITORED >>                 03065000
                                                                        03070000
    TOS := DSETB;                                                       03075000
    IF = THEN  << GET A SBUF FOR MONITORING >>                          03080000
      BEGIN                                                             03085000
        TOS := GETSBUF(1);   << PRIMARY AREA ONLY >>                    03090000
        ASMB( TEST );   IF = THEN RETURN;   << NONE AVAILABLE >>        03095000
        DSETB := TOS - 1;  << SET BASE TO FIRST WORD OF BUFFER >>       03100000
     END;                                                               03105000
                                                                        03110000
    X := DITP(X).(13:3);   << EXTRACT MONITORING FUNCTION >>            03115000
    ASMB(BR *+1,X;   EXIT 4;   BR CALLHELP;  BR MNTR;   BR HISTO;       03120000
      NOP;     NOP;     NOP;    EXIT 4);                                03125000
                                                                        03130000
CALLHELP:                                                               03135000
    DISABLE;                                                            03140000
    PUSH( Q );   TOS := S0-Q0;   SET( Q );                              03145000
    HELP;                                                               03150000
    SET(  Q );   RETURN;                                                03155000
                                                                        03160000
HISTO:                                                                  03165000
    WA0(DSETB) := WA0(DSETB) + 1;                                       03170000
    TOS := TIMER;   ASMB(DDUP     );                                    03175000
    TOS:=LASTTIMER; ASMB(DSUB);  << DELTA T >>                 <<04836>>03180000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<04836>>03185000
              << THAT TIMER HAS OVERFLOWED    >>               <<04836>>03190000
       TOS:= TOS+MSECS'24'DAYS;                                <<04836>>03195000
    ASMB(DELB);                                                <<04836>>03200000
    IF S0>127 THEN BEGIN  DEL;  TOS := 127;  END;                       03205000
    ASMB(ADAX,INCX);                                                    03210000
    WA0(X) := WA0(X) + 1;  << BUMP THIS TIME SLOT COUNT >>              03215000
    LASTTIMER := TOS;                                                   03220000
    RETURN;                                                             03225000
                                                                        03230000
MNTR:                                                                   03235000
    IF P2=-1 THEN  << USE DEFAULT PARAMETER >>                          03240000
      BEGIN                                                             03245000
        TOS := DITP(DIOQP);   << SET IOQ POINTER >>                     03250000
        TOS := PS0(QMISC);   << Q FLUSH AND REQUEST STATE >>            03255000
        TOS.( 1:6) := DITP(DMODEM);  << PRIMED,TMODE,LPLEVEL >>         03260000
        TOS.( 7:3) := PS1;   << RPLEVEL >>                              03265000
        P2 := TOS;                                                      03270000
      END;                                                              03275000
                                                                        03280000
    TOS := TIMER;   ASMB(DDUP     );                                    03285000
    DISABLE;                                                            03290000
    TOS :=LASTTIMER;                                                    03295000
    ASMB(DSUB);  << DELTA T >>                                 <<04836>>03300000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<04836>>03305000
              << THAT TIMER HAS OVERFLOWED    >>               <<04836>>03310000
       TOS:= TOS+MSECS'24'DAYS;                                <<04836>>03315000
    ASMB(ZROX,XCH,DEL);                                        <<04836>>03320000
    IF <> THEN  BEGIN  DEL;   TOS := %7777;   END                       03325000
    ELSE                                                                03330000
      BEGIN                                                             03335000
        WHILE S0.( 0:6)<>0 DO                                           03340000
          BEGIN   X := X+1;   TOS := TOS&LSR(3);   END;                 03345000
        TOS.( 4:2) := X;                                                03350000
      END;                                                              03355000
    TOS.( 0:4) := ID;                                                   03360000
                                                                        03365000
    TOS := WA0(DSETB);  << GET INDEX >>                                 03370000
    WA0(X) := S0 + 4;  << STEP TO NEXT >>                               03375000
    TOS := TOS.(9:7);  << MOD 128 >>                                    03380000
    ASMB( ADAX,INCX);  << FORM INDEX TO THIS BLOCK >>                   03385000
    WA0(X) := TOS;     << SAVE DELTA T >>                               03390000
    LASTTIMER := TOS;                                                   03395000
    ASMB(LDXA,INCA);  << SAVE INDEX AND BUMP >>                         03400000
    TOS := DITP;                                                        03405000
    TOS.( 0:4) := DITP(DLDEV).( 4:4);  << UNIT >>                       03410000
    TOS.( 4:1) := DITP.PAIR;                                   <<04836>>03415000
    TOS.(10:1) := DITP(DLDEV).FLUSH;                                    03420000
    TOS.( 5:2) := DITP(DMODEM).(CB':2);  << CB, SB >>                   03425000
    TOS.( 7:3) := DITP.(UP':3);  << UP, ACTIVE, REQUEST >>              03430000
    TOS.(11:1) := DITP.BINARYREAD;                                      03435000
    ENABLE;    ASMB(STBX,DELB);   << RESTORE INDEX >>                   03440000
    WA0(X) := TOS;    << SAVE DMODEM >>                                 03445000
    WA0(X:=X+1) := P1;                                                  03450000
    WA0(X:=X+1) := P2;  << FLAG LAST WORD OF BLOCK >>                   03455000
  END;   << DMONITOR  >>                                                03460000
$PAGE "LYNX'PF'CHECK"                                                   03465000
                                                                        03470000
PROCEDURE LYNX'PF'CHECK;                                       <<04836>>03475000
<<  THIS PROCEDURE MUST BE CALLED WHILE THE 'POWER ON'       >><<04836>>03480000
<<  INTERRUPT IS BEING PROCESSED ON THE ICS.  THIS ROUTINE   >><<04836>>03485000
<<  FINDS ANY CONFIGURED LYNX CHANNELS AND FOR EACH FOUND    >><<04836>>03490000
<<  CHANNEL DOES THE FOLLOWING FOR EACH LOGICAL DEVICE       >><<04836>>03495000
<<  CONFIGURED IN THE DATA SEGMENT FOR THE CHANNEL:          >><<04836>>03500000
<<  1. INITIALIZES REGISTERS 0 THRU 6                        >><<04836>>03505000
<<  2. SET THE POWERFAIL FLAG IN ALL THREE DITS              >><<04836>>03510000
<<  3. BUILDS A DUMMY CONTROL PROGRAM (END CONTROL ORDER)    >><<04836>>03515000
BEGIN                                                          <<04836>>03520000
EQUATE                                                         <<04836>>03525000
   PORT'POINTER = 8,                                           <<04836>>03530000
   LYNX'BOARD = %50017,                                        <<04836>>03535000
   CHANNEL'CONFIG = %(16)E,                                    <<04836>>03540000
   ININ'DRT'TRAP = %105401,                                    <<04836>>03545000
   MAX'DMABANK'VALUE = %140377,                                <<04836>>03550000
   END'CNTRL'PRGRM = %177777;                                  <<04836>>03555000
DEFINE                                                         <<04836>>03560000
   LD'PF'FLAG = SYSDB'BASE(TDS'DB(HW'DIT'OFFSET)+8).(12:1)#,   <<04836>>03565000
   INTRRPT'PLABEL = LOGICAL(GETDRT(DRT,2))#,                   <<04836>>03570000
   PD'PF'FLAG = TDS'DB(TDS'DB(HW'DIT'OFFSET+1)+1).(15:1)#,     <<04836>>03575000
   HW'PF'FLAG = TDS'DB(HW'DIT'OFFSET + 5).(1:1)#;              <<04836>>03580000
DOUBLE TDS;                                                    <<04836>>03585000
LOGICAL HW'DIT'OFFSET, TDS'BANK = TDS, TDS'OFFSET = TDS + 1;   <<04836>>03590000
LOGICAL HW'CP'AREA, ILTX'OFFSET, ILT'LOCATION;                 <<04836>>03595000
integer MAX'DRT, I;                                            <<04836>>03600000
INTEGER DRT := 0;                                              <<04836>>03605000
LOGICAL POINTER SYSDB'BASE = 0;                                <<04836>>03610000
                                                               <<04836>>03615000
SUBROUTINE SET'REGISTERS;                                      <<04836>>03620000
BEGIN                                                          <<04836>>03625000
WRITE'DEVICE'REG(DRT,PORT'POINTER,I);                          <<04836>>03630000
WRITE'DEVICE'REG(DRT,0,-1);                                    <<04836>>03635000
WRITE'DEVICE'REG(DRT,1,MAX'DMABANK'VALUE);                     <<04836>>03640000
WRITE'DEVICE'REG(DRT,2,HW'CP'AREA+ TDS'OFFSET);                <<04836>>03645000
WRITE'DEVICE'REG(DRT,3,%100000 LOR TDS'BANK);                  <<04836>>03650000
WRITE'DEVICE'REG(DRT,4,-1);                                    <<04836>>03655000
WRITE'DEVICE'REG(DRT,5,MAX'DMABANK'VALUE);                     <<04836>>03660000
WRITE'DEVICE'REG(DRT,6,0);                                     <<04836>>03665000
END;                                                           <<04836>>03670000
                                                               <<04836>>03675000
MAX'DRT := SYSDB'BASE(%71);                                    <<04836>>03680000
WHILE DRT < MAX'DRT - 7 DO                                     <<04836>>03685000
   BEGIN                                                       <<04836>>03690000
   DRT := DRT + 8;                                             <<04836>>03695000
   ILT'LOCATION := GETDRT(DRT,1) - %1000;  <<SDB relative>>    <<04836>>03700000
   ILTX'OFFSET := SYSDB'BASE(ILT'LOCATION + 13).(9:7)          <<04836>>03705000
                  + ILT'LOCATION + 15;                         <<04836>>03710000
   IF INTRRPT'PLABEL = SYSDB'BASE(ILTX'OFFSET + 5)             <<04836>>03715000
      AND INTRRPT'PLABEL <> ININ'DRT'TRAP                      <<04836>>03720000
      AND READ'DEVICE'REG(DRT, CHANNEL'CONFIG) = LYNX'BOARD    <<04836>>03725000
      THEN BEGIN   <<must be a LYNX>>                          <<04836>>03730000
      TDS'BANK := SYSDB'BASE(ILTX'OFFSET+1);                   <<04836>>03735000
      TDS'OFFSET := SYSDB'BASE(ILTX'OFFSET+2);                 <<04836>>03740000
      TOS := TDS;                                              <<04836>>03745000
      ASSEMBLE( XCHD );                                        <<04836>>03750000
      I := -1;                                                 <<04836>>03755000
      WHILE I < 127 DO   <<at most 128 ports>>                 <<04836>>03760000
         BEGIN                                                 <<04836>>03765000
         HW'DIT'OFFSET := TDS'DB(TDS'DB(1) + LOGICAL(I:= I+1));<<04836>>03770000
         IF HW'DIT'OFFSET <> %177777                           <<04836>>03775000
            THEN BEGIN   <<must reset this device>>            <<04836>>03780000
            LD'PF'FLAG := TRUE;                                <<04836>>03785000
            PD'PF'FLAG := TRUE;                                <<04836>>03790000
            HW'PF'FLAG := TRUE;                                <<04836>>03795000
            HW'CP'AREA := TDS'DB(HW'DIT'OFFSET + 2);           <<04836>>03800000
            TDS'DB(HW'CP'AREA) := END'CNTRL'PRGRM;             <<04836>>03805000
            SET'REGISTERS;                                     <<04836>>03810000
            END;                                               <<04836>>03815000
         END;                                                  <<04836>>03820000
      ASSEMBLE( XCHD );                                        <<04836>>03825000
      DDEL;                                                    <<04836>>03830000
      END;  <<LYNX channel>>                                   <<04836>>03835000
   END;                                                        <<04836>>03840000
END;                                                           <<04836>>03845000
$PAGE "MPXWRITE"                                                        03850000
                                                                        03855000
PROCEDURE MPXWRITE( DATA, DITP);                                        03860000
  VALUE DATA;   INTEGER DATA;                                           03865000
  INTEGER ARRAY DITP;  OPTION PRIVILEGED, UNCALLABLE;                   03870000
  <<                                                                    03875000
     THIS PROCEDURE WRITES THE DATA TO THE MULTIPLEXOR UNIT SPECIFIED BY03880000
     DITP. IF DATA IS NULL, A SYNC IS SENT UNLESS DSTATE IS NULL, THEN  03885000
     NOTHING IS DONE.                                                   03890000
  >>                                                                    03895000
  BEGIN                                                                 03900000
  END;    << MPX WRITE  >>                                              03905000
$PAGE "MPXCONTROL"                                                      03910000
                                                                        03915000
PROCEDURE MPXCONTROL(FUNCTION,DITP);                                    03920000
  VALUE FUNCTION, DITP; INTEGER FUNCTION;                               03925000
  INTEGER POINTER DITP;                                                 03930000
  OPTION UNCALLABLE, PRIVILEGED;                                        03935000
                                                                        03940000
    <<  THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO INITIALIZE AND    03945000
        FOR ECHO CONTROL OF THE MULTIPLEXER BOARD.  IT CLEARS           03950000
        DIAGNOSE IF NOT SPEED SENSING OR SETS IT IF SPEED SENSING       03955000
                                                                        03960000
         FUNC:   -1 - INITIALIZE WRITE CHANNEL                          03965000
                  0 - TURN ECHO OFF                                     03970000
                  1 - TURN ECHO ON IF ECHO ENABLE                       03975000
                  2 - DISABLE INTERRUPTS & TURN ECHO OFF                03980000
    >>                                                                  03985000
  BEGIN                                                                 03990000
  END;   <<  MPX  CONTROL >>                                            03995000
$PAGE "DSETCONTROL"                                                     04000000
PROCEDURE DSETCONTROL(CONTROL,DITP);                                    04005000
VALUE CONTROL;  INTEGER CONTROL;                                        04010000
INTEGER ARRAY DITP;                                                     04015000
OPTION PRIVILEGED, UNCALLABLE;                                          04020000
BEGIN                                                                   04025000
END;                                                                    04030000
$PAGE "GETTBUF"                                                         04035000
INTEGER PROCEDURE GETTBUF(TYPE);                                        04040000
  VALUE  TYPE;   INTEGER TYPE;                                          04045000
  OPTION UNCALLABLE, PRIVILEGED;                                        04050000
                                                                        04055000
  << THIS PROCEDURE GETS AN I/O TABLE ENTRY FROM A PRIMARY OR           04060000
     SECONDARY TABLE, IF THE TABLE IS EMPTY THE CALLER MAY BE           04065000
     IMPEDED IF HE SO SPECIFIES.  RETURNS A SYSDB RELATIVE POINTER TO   04070000
     THE GOTTEN BUFFER.                                                 04075000
                                                                        04080000
     TYPE -   0  - IMPEDE IF PRIMARY TABLE EMPTY                        04085000
              1  - GET FROM PRIMARY ONLY, RETURN 0 IF EMPTY             04090000
              2  - GET FROM PRIMARY OR SECONDARY, RETURN 0 IF BOTH EMPTY04095000
  >>                                                                    04100000
  BEGIN                                                                 04105000
                                                               <<04836>>04110000
    integer TBLNUM    = q+1;   << tbl # being accessed >>      <<04836>>04115000
    integer pointer TBASE = q+2; << ptr to table base >>       <<04836>>04120000
    integer pointer TBASE1= q+3; << base of tbl +/- 1 >>       <<04836>>04125000
    DOUBLE POINTER DTBASE = TBASE;                                      04130000
    LOGICAL POINTER LTBASE = TBASE;                                     04135000
                                                                        04140000
    INTEGER THISPCB = Q+2;   << PCB NUMBER OF CALLER >>                 04145000
                                                                        04150000
                                                                        04155000
    tos := 0;   << tbl 0 is TBUF >>                            <<04836>>04160000
    TOS := @TBUF;    << SET TBASE TO TBUF BASE >>                       04165000
    TOS := S0;  << TBUF LINKS IN ZEROTH ELEMENT >>                      04170000
    TOS := DTBASE(TRQSTS);  << GET REQUEST COUNTER >>                   04175000
    TOS := TOS + 1;  << INCREMENT REQUEST COUNTER >>                    04180000
    IF CARRY THEN ASMB(INCB     );                                      04185000
    DTBASE(X) := TOS;                                                   04190000
                                                                        04195000
L3:                                                                     04200000
    DISABLE;                                                            04205000
    IF TBASE(TUSE).INUSE>=TBASE.LIMIT1 THEN                             04210000
      BEGIN   << PRIMARY TABLE EMPTY >>                                 04215000
       << if first time table overflowed, send message >>      <<04836>>04220000
       tos := TBASE(TOVRFL);                                   <<04836>>04225000
       if = then                                               <<04836>>04230000
         MPE'TABLE'FULL(TBLNUM);                               <<04836>>04235000
       TBASE(TOVRFL) := tos + 1; << inc ovrflow ctr >>         <<04836>>04240000
        IF TYPE = PRIMARY THEN RETURN;  << GET FROM PRIMARY ONLY >>     04245000
        IF < THEN  << IMPEDABLE >>                                      04250000
          BEGIN  IOIMPEDE(@TBASE);  GOTO L3;  END;                      04255000
      END;                                                              04260000
                                                                        04265000
    TOS := TBASE(THEAD);                                                04270000
    IF = THEN RETURN;     << SECONDARY TABLE EMPTY >>                   04275000
                                                                        04280000
    X := S0;          << POINT TO LINK >>                               04285000
    CHECKINDEX(S0,TBASE);                                               04290000
    GETTBUF := TOS + @TBASE;   << FORM SYSDB RELATIVE POINTER >>        04295000
                                                                        04300000
    TOS := TBASE1(X);     << GET LINK OF NEXT ELEMENT >>                04305000
    IF = THEN   << TABLE EMPTY NOW >>                                   04310000
      TBASE(TTAIL) := THEAD+@TBASE-@TBASE1                              04315000
    ELSE                                                                04320000
      TBASE1(X) := 0;     << CLEAR LINK IN  GOTTEN ELEMENT >>           04325000
    TBASE(THEAD) := TOS; << RE LINK REST OF LIST >>                     04330000
                                                                        04335000
    TBASE(TUSE) := TBASE(TUSE) + 1;                                     04340000
    IF LTBASE(X)<LTBASE(X)&LSL(8) THEN << MAX<CURRENT IN USE >>         04345000
      TBASE(X) := TBASE(X) + %400;   << BUMP MAX IN USE >>              04350000
  END;    <<  GETTBUF  >>                                               04355000
$PAGE "RETURNTBUF"                                                      04360000
PROCEDURE RETURNTBUF(PNTR);                                             04365000
  VALUE PNTR;   INTEGER POINTER PNTR;                                   04370000
  OPTION PRIVILEGED, UNCALLABLE;                                        04375000
                                                                        04380000
  << THIS PROCEDURE RETURNS THE ELEMENT POINTED TO BY PNTR AND IF       04385000
     UNIMPEDES ANY WAITING PROCESSES                                    04390000
  >>                                                                    04395000
  BEGIN                                                                 04400000
    DEFINE  SIZE = TBASE(1).(8:8)#,      << SIZE OF TABLE ENT>><<04836>>04405000
            NOOFENTRIES = TBASE&LSR(8)#; << NO. OF ENTRIES >>  <<04836>>04410000
    INTEGER POINTER DITP   = Q+1;                                       04415000
    INTEGER POINTER TBASE  = Q+1;    << POINTS TO BASE OF I/O TABLE >>  04420000
    INTEGER POINTER TBASE1 = Q+2; << TBASE MODIFIED TO ADDR LINKS >>    04425000
                                                                        04430000
    IF TBUF(TTAIL)=(@PNTR-@TBUF)                                        04435000
      OR 1<=PNTR<=@TBUF THEN  << ALREADY IN FREE LIST >>                04440000
        SUDDENDEATH(202);                                               04445000
                                                                        04450000
    TOS := DEQUEUE(DTBLK,TBQN);    << SET DITP >>                       04455000
    ASMB(TEST     );                                                    04460000
    IF > THEN   << A REQUEST FOR A TBUF QUEUED >>                       04465000
      BEGIN                                                             04470000
        DISABLE;                                                        04475000
        X := DITP(DIOQP);  << ANY REQUESTS WAITING >>                   04480000
        IF <> AND WA0(X:=X+QMISC).RSTATE>=PRETOPOST THEN                04485000
          BEGIN  << REQUEST WAITING FOR A TBUF >>                       04490000
            DITP(DNXTB) := @PNTR;                                       04495000
            PNTR := 0;   << CLEAR LINK >>                               04500000
            AWAKETERMINAL(DITP);                                        04505000
            RETURN;                                                     04510000
          END;                                                          04515000
      END;                                                              04520000
                                                                        04525000
    TOS := @TBUF;    <<  SET TBASE  >>                                  04530000
    DELB;  TOS := S0;  << DELETE DITP, TBUF LINK IS WORD 0 >>           04535000
    DISABLE;                                                            04540000
    TBASE(TUSE) := TBASE(TUSE) - 1;                                     04545000
    TOS := @PNTR - @TBASE;  << FORM ELEMENT INDEX >>                    04550000
    CHECKINDEX(S0,TBASE);                                               04555000
    ASMB( DUP,STBX);                                                    04560000
    TBASE1(X) := 0;    << ZERO LINK OF ONE BEING RETURNED  >>           04565000
    X := TBASE(TTAIL);         << INDEX OF LAST ENTRY >>                04570000
    TBASE1(X) := TOS;      << LINK THIS TO LAST >>                      04575000
    TBASE(TTAIL) := TOS;  << SET TAIL POINTER >>                        04580000
                                                                        04585000
    TOS := TBASE(TSIZE).PCBN;    << GET IMPEDED LINK >>                 04590000
    IF <> AND TBASE(TUSE).INUSE<TBASE.LIMIT1 THEN                       04595000
      IOUNIMPEDE(@TBASE);                                               04600000
  END;   <<  RETURNTBUF  >>                                             04605000
$PAGE "MODCONTROL"                                                      04610000
PROCEDURE MODCONTROL (CONTROL, DITP);                                   04615000
  VALUE CONTROL;  INTEGER CONTROL;                                      04620000
  INTEGER ARRAY DITP;                                                   04625000
  OPTION PRIVILEGED, UNCALLABLE;                                        04630000
  <<                                                                    04635000
    THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO THE DSETS TO SET      04640000
    THEM IN THE FOLLOWING STATES:                                       04645000
    CONTROL:  0 - INITIALIZE AND MAKE READY FOR LOGGON                  04650000
              1 - START WRITE TURNAROUND ( LOWER SA )                   04655000
              2 - SET TO READING STATE                                  04660000
              3 - HANG UP                                               04665000
              4 - FINISH WRITE TURNAROUND ( RAISE CA )                  04670000
              5 - TURN HALF DUPLEX LINE, SB HIGH FIRST         <<MODEM  04675000
  >>                                                                    04680000
BEGIN                                                                   04685000
   INTEGER ARRAY CONTRLBYTE(0:5) = PB :=                       <<04836>>04690000
                      << ECHO CA CD CH SA >>                            04695000
      %07,            <<  0   0  1  1  1  >>                            04700000
      %06,            <<  0   0  1  1  0  >>                            04705000
      %07,            <<  0   0  1  1  1  >>                            04710000
      %02,            <<  0   0  0  1  0  >>                            04715000
      %16,            <<  0   1  1  1  0  >>                   <<04836>>04720000
      %16;            <<  0   1  1  1  0  >>                   <<04836>>04725000
   INTEGER ARRAY MODEMSTATUS(0:5) = PB :=                      <<04836>>04730000
              <<REF CB CC CE CF SB;MSK CB CC CE CF SB >>                04735000
      %00050, << 0  0  0  0  0  0   1  0  1  0  0  0  >>                04740000
      %05052, << 0  0  1  0  1  0   1  0  1  0  1  0  >>                04745000
      %15073, << 0  1  1  0  1  0   1  1  1  0  1  1  >>                04750000
      %00040, << 0  0  0  0  0  0   1  0  0  0  0  0  >>                04755000
      %04073, << 0  0  1  0  0  0   1  1  1  0  1  1  >>       <<04836>>04760000
      %04473; << 0  0  1  0  0  1   1  1  1  0  1  1  >>       <<04836>>04765000
   INTEGER MODEMTYPE, SIOADDR, SIOPC;                                   04770000
   LOGICAL POINTER DITPL = DITP;                                        04775000
                                                                        04780000
      IF NOT DITPL.MODACTIVE THEN                              <<04836>>04785000
      BEGIN                                                             04790000
         DISABLE;                                                       04795000
   HALTIO:                                                     <<04836>>04800000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        04805000
         ASMB(HIOP);                                                    04810000
         IF <> THEN BEGIN                                               04815000
                    IF < THEN ASMB(HALT);                               04820000
                    DITP(DCNTRL).HIOPWAIT:=1;                  <<04836>>04825000
                    GOTO HALTIO;                               <<04836>>04830000
                                                               <<04836>>04835000
                                                               <<04836>>04840000
                    END;                                                04845000
         ENABLE;    DITP(DCNTRL).SPDSIO:=0;                             04850000
      END;                                                              04855000
      IF DITPL.MODACTIVE THEN                                           04860000
      BEGIN         <<MODEM CONTROL PROG ALREADY ACTIVE>>               04865000
         TOS:=DITP(DCNTRL);                                             04870000
         TOS.DOMOD:=1;    TOS.DONXTMOD:=CONTROL;  <<SAVE CONTROL CODE>> 04875000
         DITP(DCNTRL):=TOS;                                             04880000
      END                                                               04885000
         ELSE                                                           04890000
      BEGIN                                                             04895000
         SIOPC:=MODSIOCNTRL;                                            04900000
         MODEMTYPE:=DITP(DMODEM).MTYPE;                                 04905000
         TOS:=CONTRLBYTE(CONTROL);                                      04910000
         IF MODEMTYPE=3 THEN TOS.MODCH:=0  <<SET UP 2002 FOR SLOW SPD>> 04915000
            ELSE                                                        04920000
         IF CONTROL=INITDSET AND (MODEMTYPE=1 OR MODEMTYPE=5)  <<04836>>04925000
            THEN TOS.MODCA:=1; <<REG OR NON-SPDSEN 103>>       <<04836>>04930000
         SIOADDR:=WA0(DITP(DILTP)+ISIOP);                               04935000
         WA0(SIOADDR+14):=TOS;   <<PUT CONTROL BYTE INTO BUFFER>>       04940000
         TOS:=MODEMSTATUS(CONTROL);                                     04945000
         IF CONTROL=INITDSET AND (MODEMTYPE=1 OR MODEMTYPE=5)  <<04836>>04950000
            THEN TOS.MODCFMSK:=1;<<ON 103,MONITOR FOR CC,CF=1>><<04836>>04955000
         WA0(SIOADDR+15):=TOS;   <<PUT REF/MSK BYTES INTO BUFFER>>      04960000
         IF CONTROL=INITDSET AND MODEMTYPE=2 THEN                       04965000
         BEGIN       <<202 MODEM,RESET SPEEDSENSE BAUDRATE>>            04970000
            WA0(SIOADDR+SPSENBAUD+11):=-36;                             04975000
            <<190 TO 154:MODSIOCNTRL>>                                  04980000
            WA0(SIOADDR+8).(8:8):=%27;  <<RECV BAUDRATE AT 240CPS>>     04985000
            WA0(SIOADDR+4):=%14400; <<UART CNTRL:8 BITS,NO PTY>>        04990000
            WA0(SIOADDR+RDDATAINSTR+2):=[8/0 ,8/1];                     04995000
            SIOPC:=SPSENBAUD;                                           05000000
            DITP(DCNTRL).SPDSIO := 1;                          <<04836>>05005000
         END;                                                           05010000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        05015000
         X:=GETDRT(S0,DRT3).IDLESIO;                           <<04836>>05020000
         IF <> THEN SUDDENDEATH(209);                          <<04836>>05025000
         DITP.MODACTIVE:=1;                                             05030000
         TOS:=SYSDB+SIOADDR+SIOPC;                                      05035000
         STARTSIO;                                                      05040000
         IF < THEN BEGIN                                       <<04836>>05045000
                   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;     <<04836>>05050000
                   PUTDRT(*,DRT3,0); <<ZERO WORD 3 OF DRT>>    <<04836>>05055000
                   END;                                        <<04836>>05060000
      END;                                                              05065000
END;     <<----------------END OF MODCONTROL------------------->>       05070000
$PAGE "STOPTIMEOUT"                                                     05075000
PROCEDURE STOPTIMEOUT(TYPE,DITP);                                       05080000
  VALUE TYPE;     INTEGER TYPE;                                         05085000
  INTEGER ARRAY DITP;                                                   05090000
  OPTION UNCALLABLE, PRIVILEGED;                                        05095000
  <<                                                                    05100000
    THIS PROCEDURE RETURNS ANY OUTSTANDING TIME OUT REQUEST OF          05105000
    OF THE TYPE IDENTIFIED BY TYPE. IT ALSO CLEARS THE ASSOCIATED       05110000
    REQUEST BIT IN DRQST.                                               05115000
                                                                        05120000
      TYPE:  0 - 2640 READ OR WRITE TIME OUT                            05125000
             1 - CARRIER FAILED TIME OUT                                05130000
             2 - TURN 202 TO WRITE TIMEOUT                              05135000
             3 - READ OPERATION TIMED OUT                               05140000
             4 - LOGON TIMED OUT                                        05145000
             5 - HANGUP TIME OUT                                        05150000
             6 - SPEED SENSING NOT SUCCESSFUL TIME OUT                  05155000
             7 - DISCONNECT SPEED SENSING TIME OUT                      05160000
             8 - BLOCKMODE READ TIME OUT                       <<DM.03  05165000
             9 - XOFF TIME OUT FOR HP2631B                     <<F.001  05170000
  >>                                                                    05175000
  BEGIN                                                                 05180000
    ARRAY TRLXINDEX(0:9) = PB :=                               <<04836>>05185000
      <<  0:7 - NOT USED,  7:6 - BIT TO CLEAR IN DRQST,                 05190000
         13:3 - BYTE OFFSET TO BYTE HOLDING TRLX FROM DTRLX >>          05195000
      [7/0,6/04,3/0],[7/0,6/2,3/2],[7/0,6/03,3/3],[7/0,6/08,3/1],       05200000
      [7/0,6/11,3/1],[7/0,6/0,3/1],[7/0,6/16,3/0],[7/0,6/16,3/0],       05205000
      [7/0,6/14,3/0],[7/0,6/4,3/0];                            <<04836>>05210000
                                                                        05215000
    INTEGER REQUESTBIT;      << BIT TO CLEAR IN DRQST >>                05220000
    INTEGER TRLXOFFSET;      << BYTE OFFSET FOR DTRLX >>                05225000
                                                                        05230000
    REQUESTBIT := TRLXINDEX(TYPE).(7:6);                                05235000
    TRLXOFFSET := TRLXINDEX(TYPE).(13:3);                               05240000
                                                                        05245000
    DISABLE;                                                            05250000
    IF REQUESTBIT<16 THEN << CLEAR BIT IN DRQST >>                      05255000
      BEGIN                                                             05260000
        TOS := DITP(DRQST);                                             05265000
        X := REQUESTBIT;   ASMB( TRBC 0,X );  << CLEAR BIT >>           05270000
        DITP(DRQST) := TOS;                                             05275000
      END;                                                              05280000
                                                                        05285000
    TOS := BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET); << GET TRLX >>         05290000
    BA0(X) := 0;  << CLEAR TO INDICATE RETURNED >>                      05295000
                                                                        05300000
    IF S0 <> 0 THEN                                                     05305000
    ABORTTIMEREQ( * );                                                  05310000
  END;    << STOP TIME OUT >>                                           05315000
$PAGE "STARTTIMEOUT"                                                    05320000
PROCEDURE STARTTIMEOUT(TYPE,DITP);                                      05325000
  VALUE TYPE;    INTEGER TYPE;                                          05330000
  INTEGER ARRAY DITP;                                                   05335000
  OPTION UNCALLABLE, PRIVILEGED;                                        05340000
  <<                                                                    05345000
    THIS PROCEDURE STARTS A TIME OUT REQUEST OF THE TYPE SPECIFIED BY   05350000
    TYPE. IN SOME CASE IF A TIME OUT IS PENDING IT IS STOPPED AND THE   05355000
    NEW REQUEST STARTED, OTHERWISE 	IF A TIMEOUT IS IN PROGRESS NO NEW  05360000
     REQUEST IS STARTED.                                                05365000
  >>                                                                    05370000
  BEGIN                                                                 05375000
    ARRAY TRLXINDEX(0:9) = PB :=                               <<04836>>05380000
      <<  0:1 - IF SET THEN ABORT AND RESTART TIMEOUT                   05385000
          1:6 - TIMEOUT TIME IN SECONDS                                 05390000
          7:6 - TIMEOUT REQUEST CODE TYPE                               05395000
         13:3 - BYTE OFFSET FROM DTRLX TO TRLX STORAGE                  05400000
       >>                                                               05405000
      [1/1,6/10,6/7,3/0],[1/0,6/30,6/1,3/2],                   <<04836>>05410000
      [1/1,6/05,6/2,3/3],[1/0,6/00,6/3,3/1],                            05415000
      [1/0,6/00,6/4,3/1],[1/1,6/05,6/0,3/1],                            05420000
      [1/1,6/01,6/7,3/0],[1/1,6/01,6/7,3/0],                   <<04836>>05425000
      [1/1,6/00,6/9,3/0],[1/1,6/60,6/7,3/0];                   <<04836>>05430000
                                                                        05435000
    INTEGER TRLXOFFSET, REQCODE;                                        05440000
    DOUBLE TIME;                                                        05445000
                                                                        05450000
    TOS := TRLXINDEX(TYPE);  << TEST BIT 0 >>                           05455000
    REQCODE := S0.(7:6);                                       <<04836>>05460000
    TRLXOFFSET := S0.(13:3);                                   <<04836>>05465000
    IF S0 < 0 THEN STOPTIMEOUT(TYPE,DITP)                      <<04836>>05470000
    ELSE IF INTEGER(BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET))<>0   <<04836>>05475000
         THEN RETURN;                                          <<04836>>05480000
                                                               <<04836>>05485000
                                                               <<04836>>05490000
                                                                        05495000
    TOS := TOS.(1:6);  << EXTRACT TIME IN SECONDS >>                    05500000
    IF = THEN  << LOGON OR READ TIMEOUT >>                              05505000
      BEGIN                                                             05510000
        TOS :=      IF TYPE = LOGONTO      THEN LOGONTIME      <<04836>>05515000
               ELSE IF TYPE = READTIMEOUT  THEN DITP(DRTMAX)   <<04836>>05520000
               ELSE IF TYPE = BLOCKTIMEOUT THEN DITP(DBTIME)   <<04836>>05525000
               ELSE 0;                                         <<04836>>05530000
        IF = THEN RETURN;  << NO TIME OUT REQUESTED >>                  05535000
      END;                                                              05540000
    TIME := TOS**1000;  << TIME IN MS >>                                05545000
                                                                        05550000
    TOS := TIMEREQ(REQCODE,@DITP,TIME);                                 05555000
    DISABLE;                                                            05560000
                                                               <<04836>>05565000
    BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET) := TOS                <<04836>>05570000
                                                               <<04836>>05575000
  END;   << START TIME OUT >>                                           05580000
                                                                        05585000
$PAGE "PRINTPFMSG"                                             <<04836>>05590000
PROCEDURE PRINTPFMSG (MSG,WORDS);                                       05595000
VALUE MSG,WORDS;  DOUBLE MSG;                                           05600000
INTEGER WORDS;                                                          05605000
OPTION UNCALLABLE, PRIVILEGED;                                          05610000
BEGIN                                                                   05615000
INTEGER POINTER DITP, DLTP;                                    <<04836>>05620000
   INTEGER DRTN, COUNT, SIOADDR;                                        05625000
                                                                        05630000
   @DITP:=LPDT( (CONSLDEV)&LSL(1) );                                    05635000
   DRTN:=WA0( DITP(DILTP)+ICNTRL ).DRTNUMBER;                  <<04836>>05640000
                                                               <<04836>>05645000
   << Call new procedure to print out msg instead of WRITE2 >> <<04836>>05650000
   ISSUE'HARD'MSG(2,0,4);  << Do HARD I/O to console >>        <<04836>>05655000
                                                               <<04836>>05660000
 IF CHANNEL'ID(CONSLDEV) = LYNX'TYPE                           <<04836>>05665000
   THEN BEGIN   <<CALL LYNX DRIVER INITIALIZATION PROCEDURE>>  <<04836>>05670000
   @DLTP := DITP(DDLTP);                                       <<04836>>05675000
   TOS := 0;     <<SPECIAL PARAMETER FOR DRIVER INIT PROC>>    <<04836>>05680000
   TOS := DLTP(7);            <<PLABEL>>                       <<04836>>05685000
   IF <> THEN ASSEMBLE ( PCAL 0 ) ELSE DDEL;  <<DRIVER INIT>>  <<04836>>05690000
   END                                                         <<04836>>05695000
  ELSE BEGIN <<ADCC>>                                          <<04836>>05700000
   IF DITP.DSTATE<>WRITING THEN IDLEWAIT(DITP)                          05705000
      ELSE                                                              05710000
   BEGIN      <<FLUSH REMAINING DATA IN TANKED TBUFS>>                  05715000
      SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                  05720000
      IF WA0(SIOADDR+WRTDATAINSTR+1)<>0 THEN                            05725000
         COUNT:=XMITON                                                  05730000
         ELSE                                                           05735000
     BEGIN                                                              05740000
      DITP.ENQACKWAIT := 0;                                    <<04836>>05745000
      STOPTIMEOUT(HP2640TO,DITP);                              <<04836>>05750000
      WA0(SIOADDR+WRTDATAINSTR+5):=[8/1,1/1,7/1];                       05755000
      WA0(X:=X+1):=1;  <<TBEMPTY INTERRUPT CODE>>                       05760000
      COUNT:=WRTDATAINSTR+5; <<START AT INTERRUPT/HALT>>                05765000
     END;                                                               05770000
      TOS:=DRTN;                                                        05775000
      TOS:=SYSDB+SIOADDR+COUNT;                                         05780000
      STARTSIO;  <<FAKE A TBUF EMPTY INTERRUPT TO CONTINUE WRITE>>      05785000
      IF < THEN PUTDRT(DRTN,DRT3,0);                           <<04836>>05790000
   END;                                                                 05795000
  END;       <<ADCC>>                                          <<04836>>05800000
END;                                                                    05805000
$PAGE "SETREADERROR"                                                    05810000
PROCEDURE SETREADERROR(IOQP,ENUMB);                                     05815000
  VALUE ENUMB;   INTEGER ENUMB;                                         05820000
  INTEGER ARRAY IOQP;    OPTION PRIVILEGED, UNCALLABLE;                 05825000
  BEGIN                                                                 05830000
    X := @IOQP;                                                         05835000
    IF <> AND IOQP.READERRORS<ENUMB AND IOQP(QMISC).RSTATE=    <<04836>>05840000
       READING THEN                                            <<04836>>05845000
      IOQP.READERRORS := ENUMB;                                         05850000
  END;                                                                  05855000
$PAGE "BREAKOK"                                                         05860000
LOGICAL PROCEDURE BREAKOK(DITP);                                        05865000
  VALUE DITP;   POINTER DITP;                                           05870000
  OPTION UNCALLABLE, PRIVILEGED;                                        05875000
                                                                        05880000
  <<  RETURNS TRUE IF BREAK/SUB SYS BREAK ENABLE AND NOT ALREADY IN     05885000
       BREAK/SUB SYS BREAK MODE AND NOT IN CONSOLE MODE >>              05890000
                                                                        05895000
  BEGIN                                                                 05900000
    ENTRY SSBREAKOK;                                                    05905000
    INTEGER TYPE = Q+1;                                                 05910000
                                                                        05915000
    TOS := BREAK';   << BIT POSITION FOR BREAK >>                       05920000
    GOTO L1;                                                            05925000
                                                                        05930000
SSBREAKOK:                                                              05935000
    TOS := SSBREAK';   <<  BIT POSITION FOR SUB SYS BREAK  >>           05940000
                                                                        05945000
L1:                                                                     05950000
    IF NOT DITP(DMODEM).CMODE AND NOT DITP(X).RDCOUNTED THEN            05955000
      IF DITP.DSTATE <= WRTSPECL OR                            <<04836>>05960000
         DITP.DSTATE = REPEATING OR                            <<04836>>05965000
         DITP.DSTATE = BANDWAIT THEN                           <<04836>>05970000
        BEGIN                                                           05975000
          TOS := DITP(DSPEED);                                          05980000
          X := TYPE;    ASMB( TBC 1,X );                                05985000
          IF <> THEN  << BREAK/SSBREAK ENABLED >>                       05990000
            BEGIN                                                       05995000
              TOS := DITP(DLDEV);                                       06000000
              IF TYPE=BREAK' THEN  << CHECK THE FLUSH FLAG >>           06005000
                TOS := TOS.FLUSH                                        06010000
              ELSE  << SUB SYS BREAK  >>                                06015000
                BEGIN   << CHECK IF ALREADY SET >>                      06020000
                  TOS := LPDTD(TOS.LDEVN);                              06025000
                  TOS := TOS.(SSBREAK':1);                              06030000
                END;                                                    06035000
                                                                        06040000
              IF NOT TOS THEN   << FLAG WAS NOT SET >>                  06045000
                BREAKOK := TRUE;                                        06050000
            END;                                                        06055000
        END;                                                            06060000
  END;   << ESCAPE OK   BREAK OK  >>                                    06065000
$PAGE "DOCRLFSYNC"                                                      06070000
                                                                        06075000
PROCEDURE DOCRLFSYNC (LFONLY,CPVACODE,DITP);                            06080000
VALUE LFONLY, CPVACODE;                                                 06085000
LOGICAL LFONLY;                                                         06090000
INTEGER CPVACODE;                                                       06095000
INTEGER ARRAY DITP;                                                     06100000
OPTION PRIVILEGED, UNCALLABLE;                                          06105000
BEGIN                                                                   06110000
   INTEGER SIOADDR, COUNT:=0;                                  <<04836>>06115000
   LOGICAL CRNOTDONE:=FALSE;                                   <<04836>>06120000
                                                                        06125000
   SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                     06130000
   DITP(DLDEV).SYNCSTATE := CPVACODE; <<SAVE INTERRUPT CODE >> <<04836>>06135000
   X:=SIOADDR+12;                                                       06140000
   WA0(X):=0;    <<PUT SYNC BYTES INTO BUFFER AREA>>                    06145000
   WA0(X:=X+1):=0;                                                      06150000
   WA0(X:=X+1):=0;                                                      06155000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRT DATA INSTR>>     <<04836>>06160000
   WA0(X:=X+1):=COUNT;                                         <<04836>>06165000
   WA0(X:=X+1):=1;                                             <<04836>>06170000
   WA0(X:=X+1):=[1/1,1/1,1/1,13/0];  <<START FROM RIGHT BYTE>> <<04836>>06175000
   WA0(X:=X+1):=SYSDB+SIOADDR+11;    <<ADDR OF CR/SYNC/LF>>    <<04836>>06180000
   WA0(X:=X+1):=[8/1,1/1,7/1];       <<INTERRUPT/HALT>>        <<04836>>06185000
   WA0(X:=X+1):=CPVACODE; <<PUT IN INTERRUPT CODE>>            <<04836>>06190000
                                                               <<04836>>06195000
   IF NOT LFONLY THEN                                                   06200000
   BEGIN                                                                06205000
      WA0(SIOADDR+11).(8:8):=%15;   <<PUT CR BYTE INTO BUFFER>>         06210000
      TOS:=DITP(DSYNC).CRSYNC;                                          06215000
      IF S0 > 7 THEN TOS:=(TOS-6)*5;                                    06220000
      IF S0 > 6 THEN                                           <<04836>>06225000
      BEGIN                                                             06230000
         TOS:=TOS-6;                                           <<04836>>06235000
         DITP(DSYNC).SCOUNT:=TOS;                                       06240000
         COUNT:=7;   <<ADD 1 MORE TO INCLUDE CR BYTE>>         <<04836>>06245000
         WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'CR;<<INTRRPT CODE>> <<04836>>06250000
         RETURN;                                               <<04836>>06255000
      END                                                      <<04836>>06260000
         ELSE                                                           06265000
      COUNT:=TOS+1;   <<INCLUDE CR BYTE IN WRITE COUNT>>                06270000
   END;                                                                 06275000
   IF COUNT < 7 THEN                                           <<04836>>06280000
   BEGIN                                                                06285000
      IF LOGICAL(COUNT) THEN                                            06290000
         WA0(SIOADDR+12+COUNT&LSR(1)).(0:8):=%12                        06295000
         ELSE         <<PUT IN LF BYTE>>                                06300000
         WA0(SIOADDR+11+COUNT&LSR(1)).(8:8):=%12;                       06305000
         COUNT:=COUNT+1;  <<INCLUDE LF>>                       <<04836>>06310000
      TOS:=DITP(DSYNC).LFSYNC;                                          06315000
      IF S0>7 THEN TOS:=(TOS-6)*5;                                      06320000
      IF (S0+COUNT) > 7 THEN                                   <<04836>>06325000
      BEGIN                                                             06330000
         TOS:=TOS-( 7-COUNT);  <<REMAINING SYNCS TO OUTPUT>>   <<04836>>06335000
         DITP(DSYNC).SCOUNT:=TOS;                                       06340000
         WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;<<INTRRPT CODE>> <<04836>>06345000
         COUNT:=7;                                             <<04836>>06350000
      END                                                               06355000
         ELSE                                                           06360000
         COUNT:=COUNT+TOS;     <<TOTAL BYTES TO OUTPUT>>                06365000
   END                                                         <<04836>>06370000
      ELSE                                                     <<04836>>06375000
      WA0(SIOADDR+WRTDATAINSTR+6):=SENDLF;<<NO ROOM FOR LF>>   <<04836>>06380000
                                                               <<04836>>06385000
   WA0(SIOADDR+WRTDATAINSTR+1) := COUNT;                       <<04836>>06390000
                                                               <<04836>>06395000
                                                               <<04836>>06400000
                                                               <<04836>>06405000
                                                               <<04836>>06410000
                                                               <<04836>>06415000
                                                               <<04836>>06420000
                                                               <<04836>>06425000
END;      <<-------------------END OF DOCRLFSYNC---------------->>      06430000
$PAGE "SENDCRLF"                                                        06435000
PROCEDURE SENDCRLF(INTRPTCODE,DITP);                                    06440000
VALUE INTRPTCODE;   INTEGER INTRPTCODE;                                 06445000
INTEGER ARRAY DITP;                                                     06450000
OPTION PRIVILEGED, UNCALLABLE;                                          06455000
BEGIN                                                                   06460000
  LOGICAL POINTER DITPL = DITP;                                         06465000
  INTEGER TEMP;                                                         06470000
                                                                        06475000
  DITP.NEWLINE:=1;        <<CARRIAGE IS AT A NEW LINE>>                 06480000
  IF DITP(DMODEM).MODEM <> 0 AND NOT DSAVEPL.CCVALUE THEN      <<04836>>06485000
     BEGIN << MUST BE FROM HIOTERM0; DO NXTNULL >>             <<04836>>06490000
     DITP.DSTATE := NULL;                                      <<04836>>06495000
     IDLEWAIT(DITP);                                           <<04836>>06500000
     RETURN;                                                   <<04836>>06505000
     END;                                                      <<04836>>06510000
  TEMP:=WA0(DITP(DILTP)+ISIOP);                                         06515000
                                                                        06520000
  IF NOT DITPL(DMODEM).NOSYNC THEN DOCRLFSYNC(0,INTRPTCODE,    <<04836>>06525000
     DITP)  ELSE                                               <<04836>>06530000
  BEGIN                                                        <<04836>>06535000
                                                                        06540000
  WA0(TEMP+WRTDATAINSTR):=[8/4,8/0]; << WRITE DATA INST. >>    <<04836>>06545000
  WA0(X:=X+1):=2;                 <<WRITE OUT 2 BYTES>>                 06550000
  WA0(X:=X+1):=1;                                                       06555000
  WA0(X:=X+1):=[1/1,1/1,1/1,13/0];  <<START FROM RIGHT BYTE>>           06560000
  WA0(X:=X+1):=SYSDB+TEMP;        <<BUFFER ADDR FOR CR/LF>>             06565000
  WA0(X:=X+1):=[8/1,1/1,7/1];     <<INTERRUPT/HALT>>                    06570000
  WA0(X:=X+1):=INTRPTCODE;        <<PUT IN SIO PROG INTERRUPT CODE>>    06575000
  END;                                                         <<04836>>06580000
  TOS:=DITP(DMODEM)&CSL(M202);                                          06585000
  IF TOS AND DITP(DMODEM).CBSB <> 3 THEN                                06590000
  BEGIN      <<202 NOT IN WRITE STATE>>                                 06595000
     STARTTIMEOUT(TURNTO,DITP);                                         06600000
     MODCONTROL(WRITING,DITP);                                          06605000
     DITP(DSAVE).TURNTOWRITE:=1;                                        06610000
     DITP(DCNTRL).NXTDSTATE:=DITP;                                      06615000
     DITP.DSTATE:=TURN202;                                              06620000
     DITP(DSIOPC) := SYSDB+TEMP+XMITON;                        <<04836>>06625000
  END                                                                   06630000
     ELSE                                                               06635000
  BEGIN                                                                 06640000
  TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                               06645000
  X:=GETDRT(S0,DRT3).IDLESIO;                                  <<04836>>06650000
  IF <> THEN SUDDENDEATH(209);                                 <<04836>>06655000
  TOS := SYSDB+TEMP+XMITON;                                    <<04836>>06660000
  STARTSIO;                                                             06665000
  IF < THEN BEGIN                                              <<04836>>06670000
            TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;            <<04836>>06675000
            PUTDRT(*,DRT3,0);                                  <<04836>>06680000
            END;                                               <<04836>>06685000
  END;                                                                  06690000
END;                                                                    06695000
$PAGE "IDLEWAIT"                                                        06700000
PROCEDURE IDLEWAIT (DITP);                                              06705000
INTEGER ARRAY DITP;                                                     06710000
OPTION PRIVILEGED, UNCALLABLE;                                          06715000
BEGIN                                                                   06720000
   INTEGER SIOADDR, SIOPC ;                                             06725000
   LOGICAL POINTER DITPL=DITP;                                          06730000
   SIOADDR:=WA0(DITP(DILTP)+ISIOP);                                     06735000
                  WA0(SIOADDR+4):=%14400;<<UART CNTRL:8 BITS,NO PTY>>   06740000
                  WA0(X:=X+1):=%6014;  <<NO ECHO,CA ON,CD ON>>          06745000
                  WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0];                  06750000
                  WA0(X:=X+1):=1;                                       06755000
                  WA0(X:=X+2):=[1/1,1/1,4/1,10/0];                      06760000
                  WA0(X:=X+1):=SYSDB+SIOADDR+10;                        06765000
                  IF DITP(DLDEV).DLDEVN=CONSLDEV.DLDEVN THEN            06770000
                  BEGIN                                                 06775000
                     IF NOT DITPL.UP THEN                      <<04836>>06780000
                     BEGIN                                     <<04836>>06785000
                        WA0(SIOADDR+RDDATAINSTR+2):=[8/0,8/1]; <<04836>>06790000
                                                               <<04836>>06795000
                     END                                       <<04836>>06800000
                     ELSE WA0(SIOADDR+RDDATAINSTR+2):=[8/%361,8/1];     06805000
                     <<NON-SPECL CHAR,JMP OF -15 TO WAIT SRQ>>          06810000
                     WA0(X:=X+4):=WAITC'A;                              06815000
                                                                        06820000
                  END                                                   06825000
                     ELSE                                               06830000
                  BEGIN                                                 06835000
                                                               <<04836>>06840000
                     WA0(SIOADDR+RDDATAINSTR+2):=IF NOT DITPL.UP THEN   06845000
                        [8/0 ,8/1]   <<JMP TO INTERRUPT/CODE=8>>        06850000
                        ELSE [8/%361,8/1];  <<-15 BACK TO WAIT SRQ>>    06855000
                     <<JMP OF 51 TO INTERRUPT/CODE=8>>                  06860000
                     WA0(X:=X+4):=WAITSPDS;                             06865000
                                                                        06870000
                  END;                                                  06875000
     WA0(SIOADDR+8).(8:8):=%27; <<DEFAULT SPEED AT 240 CPS>>   <<04836>>06880000
     X:=DITP(DMODEM).MTYPE;                                    <<04836>>06885000
     IF X=4 OR X=5 THEN WA0(SIOADDR+8).(12:4):=                <<04836>>06890000
                      DITP(DLAST).TERMSPEED; <<DEFAULT SPD>>   <<04836>>06895000
     SIOPC:=SPSENBAUD;                                                  06900000
     IF DITPL(DMODEM)&CSL(M202) THEN                                    06905000
     BEGIN                                                              06910000
        IF DITPL.UP THEN SIOPC:=XMITOFF                                 06915000
           ELSE WA0(SIOADDR+SPSENBAUD+11):=-119; <<190 TO 71:XMITOFF>>  06920000
     END                                                                06925000
        ELSE                                                            06930000
        IF DITPL.UP THEN SIOPC:=WRT'RD                                  06935000
           ELSE WA0(SIOADDR+SPSENBAUD+11):=-124; <<190 TO 66:WRT'RD>>   06940000
     DITP(DCNTRL).SPDSIO:=1;                                            06945000
     TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                            06950000
     TOS:=SYSDB+SIOADDR+SIOPC;                                          06955000
     STARTSIO;    <<START SPEED SENSE OR IDLE WAIT PROG>>               06960000
     IF < THEN BEGIN                                           <<04836>>06965000
               TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;         <<04836>>06970000
               PUTDRT(*,DRT3,0);  <<ZERO WORD 3 OF DRT>>       <<04836>>06975000
               END;                                                     06980000
END;              <<----------------END OF IDLEWAIT------------->>      06985000
$PAGE "STATREQUEST"                                                     06990000
PROCEDURE STATREQUEST(DITP);                                   <<04836>>06995000
INTEGER ARRAY DITP;                                            <<04836>>07000000
OPTION PRIVILEGED, UNCALLABLE;                                 <<04836>>07005000
                                                               <<04836>>07010000
<< PROCEDURE WILL SET UP ADCC TO FIRST WRITE OUT 3 BYTE ESC >> <<04836>>07015000
<< SEQ TO REQUEST STATUS FROM 2631B.  IT WILL THEN JUMP TO  >> <<04836>>07020000
<< IDLE WAIT CHANEL PROGRAM TO WAIT FOR STATUS REPLY.  ADCC >> <<04836>>07025000
<< MUST BE ABLE TO HANDLE DC1'S OR DC3'S FROM THE PRINTER   >> <<04836>>07030000
<< WHILE REQUESTING STATUS.    >>                              <<04836>>07035000
  BEGIN                                                        <<04836>>07040000
                                                               <<04836>>07045000
  ARRAY ESCQMDC1(0:1)=PB := %15477, %10400; <<ESC, ?, DC1, 0>> <<04836>>07050000
  LOGICAL SIOADDR, CSP, BANKNUM, BANKOFFSET;                   <<04836>>07055000
  ARRAY DITPL(*)=DITP;                                         <<04836>>07060000
                                                               <<04836>>07065000
                                                               <<04836>>07070000
  << STOP IDLE WAIT OR SPEED SENSE PROG >>                     <<04836>>07075000
   DISABLE;                                                    <<04836>>07080000
   DITP(DLDEV).DOSTATREQ := 0;                                 <<04836>>07085000
   IF DITPL(DCNTRL).SPDSIO THEN                                <<04836>>07090000
   BEGIN         <<SPEED SENSE OR IDLE WAIT SIO PROG ACTIVE>>  <<04836>>07095000
                                                               <<04836>>07100000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  <<04836>>07105000
      STOPSIO;                                                 <<04836>>07110000
      WHILE <> DO                                              <<04836>>07115000
        BEGIN      <<SIO PROG CAN'T BE HALTED IMMEDIATELY>>    <<04836>>07120000
        IF < THEN ASMB(HALT);                                  <<04836>>07125000
        DITPL(DCNTRL).HIOPWAIT:=1;                             <<04836>>07130000
        STOPSIO;                                               <<04836>>07135000
        END;                                                   <<04836>>07140000
      MOVE WA0(DITP(DILTP)) := 4(0);                           <<04836>>07145000
   END;                                                        <<04836>>07150000
   ENABLE;                                                     <<04836>>07155000
                                                               <<04836>>07160000
                                                               <<04836>>07165000
  STATREQ := 1;                                                <<04836>>07170000
  DITPL(DCNTRL).SPDSIO := 0; << DON'T LET IOTERM STOP C.P. >>  <<04836>>07175000
                                                               <<04836>>07180000
  << SET UP IDLE WAIT FOR STATUS. ALSO MUST HANDLE DCX'S >>    <<04836>>07185000
  SIOADDR := WA0(DITP(DILTP)+ISIOP); <<SIO STARTING ADDRESS >> <<04836>>07190000
  WA0(X:=X+5) := %6014;              <<UART CONTROL         >> <<04836>>07195000
  WA0(SIOADDR + RDDATAINSTR) := [8/3,8/0];                     <<04836>>07200000
  WA0(X:=X+1) := 1;                                            <<04836>>07205000
  WA0(X:=X+1) := [8/0,8/1];  << INTERUPT ON ANY INPUT >>       <<04836>>07210000
  WA0(X:=X+1) := [1/1,1/1,4/1,10/0];                           <<04836>>07215000
  WA0(X:=X+1) := SYSDB+SIOADDR+10;                             <<04836>>07220000
  WA0(X:=X+2) := 8; << INTERUPT CODE IN CPVA 2 = SERVSPSENSE>> <<04836>>07225000
                                                               <<04836>>07230000
  PUSH(STATUS);                                                <<04836>>07235000
  CSP := TOS.(8:8)*4+ABS(CSTPADDR);                            <<04836>>07240000
  BANKNUM:=ABS(CSP+2);                                                  07245000
  BANKOFFSET := ABS(CSP+3);                                    <<04836>>07250000
                                                               <<04836>>07255000
  X:=SIOADDR+WRTDATAINSTR;                                     <<04836>>07260000
  WA0(X):=[8/4,8/0];     <<WRT DATA CHANNEL INSTR>>            <<04836>>07265000
  WA0(X:=X+1):=3;                                              <<04836>>07270000
  WA0(X:=X+1):=1;                                              <<04836>>07275000
  WA0(X:=X+1) := %120000 LOR BANKNUM;                          <<04836>>07280000
  WA0(X:=X+1):= BANKOFFSET + LOGICAL(@ ESCQMDC1);<< PB REL >>  <<04836>>07285000
  WA0(X:=X+1):=[8/0,8/0];                                      <<04836>>07290000
  WA0(X:=X+1):=WRT'RD-(WRTDATAINSTR+7);   <<JUMP TO IDLEWAIT>> <<04836>>07295000
                                                               <<04836>>07300000
  TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                      <<04836>>07305000
  X:=ABS(S0*4+3).IDLESIO;                                      <<04836>>07310000
  IF <> THEN SUDDENDEATH(209);                                 <<04836>>07315000
                                                               <<04836>>07320000
  STARTTIMEOUT(HP2640TO,DITP);  << SET 10 SEC T.O. >>          <<04836>>07325000
                                                               <<04836>>07330000
  TOS:=SYSDB+SIOADDR+WRTBASE;                                  <<04836>>07335000
  STARTSIO;                                                    <<04836>>07340000
END;     <<-------------END OF STATUS REQUEST----------->>     <<04836>>07345000
$PAGE "TERMINAL INTERRUPT PROCESSOR"                                    07350000
PROCEDURE TIP;          <<---------TERMINAL INTERRUPT PROCESSOR------->>07355000
OPTION PRIVILEGED, UNCALLABLE;                                          07360000
BEGIN                                                                   07365000
   ARRAY DUMMY (0:2) = Q;                                               07370000
   LOGICAL POINTER DITPL;                                               07375000
   INTEGER ARRAY DITP(*) = DITPL;                                       07380000
   LOGICAL POINTER IOQPL;                                               07385000
   INTEGER ARRAY IOQP(*) =IOQPL;                                        07390000
   INTEGER POINTER                                                      07395000
      DBCNTP,                                                           07400000
      DCNTP;                                                            07405000
                                                                        07410000
   INTEGER                                                              07415000
      I,                                                                07420000
      J,                                                                07425000
      K,                                                                07430000
      TEMP,          << 4 GENERAL WORK VARIABLES >>                     07435000
      SIOADDR,                                                          07440000
      RDDATA;                                                           07445000
   LOGICAL POINTER CPVAPL;                                              07450000
   INTEGER ARRAY CPVAP(*) = CPVAPL;                                     07455000
   LOGICAL FLAG;                                                        07460000
   LOGICAL RIGHT;                                                       07465000
                                                                        07470000
   LOGICAL READTIMED = TEMP;                                            07475000
   DOUBLE POINTER DITPD = DITPL;                                        07480000
   INTEGER POINTER SAVEP = I;                                           07485000
                                                                        07490000
   ARRAY DISABLE'HOME(0:2)=PB := %15543,%15510,%10403;         <<04836>>07495000
   INTEGER ARRAY CPS(0:8) = PB := 240, 960, 480, 0, 120, 0, 30,<<04836>>07500000
                                  15, 10;                      <<04836>>07505000
                                                                        07510000
SUBROUTINE SIOSYNC;                                                     07515000
BEGIN                                                                   07520000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              07525000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>07530000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>07535000
   TOS := SYSDB+SIOADDR+XMITON;                                <<04836>>07540000
   STARTSIO;                                                            07545000
   ASMB(IXIT);                                                          07550000
END;                                                                    07555000
                                                                        07560000
                                                                        07565000
                                                                        07570000
SUBROUTINE SERVSENDLF;                                                  07575000
BEGIN                                                                   07580000
   WA0(SIOADDR+11).(8:8):=%12; <<PUT LF INTO BUFFER AREA>>     <<04836>>07585000
   TOS:=DITP(DSYNC).LFSYNC;    <<GET NO.OF PAD CHARS REQUIRED>><<04836>>07590000
   IF S0>7 THEN TOS:=(TOS-6)*5;                                <<04836>>07595000
   IF S0>6 THEN      <<HAVE TO SEND MORE THAN 6 PAD CHARS>>    <<04836>>07600000
   BEGIN                                                       <<04836>>07605000
      TOS:=TOS-6;                                                       07610000
      DITP(DSYNC).SCOUNT:=TOS; <<REMAINING PAD CHARS TO SEND>> <<04836>>07615000
      K:=6;                                                    <<04836>>07620000
      WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;                    <<04836>>07625000
   END                                                         <<04836>>07630000
      ELSE                                                     <<04836>>07635000
   BEGIN                                                       <<04836>>07640000
      K:=TOS;                                                  <<04836>>07645000
      DITP(DSYNC).SCOUNT:=0;                                   <<04836>>07650000
      WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;      <<04836>>07655000
      <<RESTORE ORIGINAL INTERRUPT CODE>>                               07660000
   END;                                                        <<04836>>07665000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>07670000
   WA0(X:=X+3):=SYSDB+SIOADDR+12; <<PAD CHAR BUFFER ADDRESS>>  <<04836>>07675000
   SIOSYNC;  <<START SIO PROG BY ENABLING XMIT SRQ>>           <<04836>>07680000
END;         <<------------END OF SERVSENDLF-------------->>   <<04836>>07685000
                                                                        07690000
                                                                        07695000
SUBROUTINE RESTARTREAD;                                        <<04836>>07700000
BEGIN                                                          <<04836>>07705000
   DITP.DSTATE := READING;                                     <<04836>>07710000
   TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>07715000
   X := ABS(S0*4+3).IDLESIO;                                   <<04836>>07720000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>07725000
   IF DITPL(DSAVE).BLOCKRD THEN                                <<04836>>07730000
   BEGIN                                                       <<04836>>07735000
     WA0(SIOADDR+FINISEND+5) :=[8/0,8/0];                      <<04836>>07740000
     WA0(X:=X+1) :=118;   <<128 TO 246>>                       <<04836>>07745000
     TOS := SYSDB+SIOADDR+FINISEND;                            <<04836>>07750000
   END                                                         <<04836>>07755000
   ELSE TOS := SYSDB+SIOADDR+WRT'RD;                           <<04836>>07760000
   STARTSIO;                                                   <<04836>>07765000
END;                                                           <<04836>>07770000
                                                                        07775000
                                                                        07780000
                                                                        07785000
SUBROUTINE SERVSYNC'CR;                                                 07790000
BEGIN                                                                   07795000
   X:=SIOADDR+12;                                                       07800000
   WA0(X):=0;       <<REGENERATE SYNC BYTES AGAIN>>                     07805000
   WA0(X:=X+1):=0;                                                      07810000
   WA0(X:=X+1):=0;                                                      07815000
                                                               <<04836>>07820000
                                                               <<04836>>07825000
   TOS:=DITP(DSYNC).SCOUNT;  <<REMAINING SYNCS TO WRITE>>               07830000
   IF S0 >= 6 THEN                                             <<04836>>07835000
   BEGIN                                                                07840000
      TOS:=TOS-6;  <<REMAINING PAD CHARS TO SEND>>             <<04836>>07845000
      DITP(DSYNC).SCOUNT:=TOS;                                          07850000
      K:=6;                                                    <<04836>>07855000
   END                                                                  07860000
      ELSE                                                              07865000
   BEGIN                                                                07870000
      K:=TOS;                                                           07875000
      DITP(DSYNC).SCOUNT:=0;                                            07880000
      WA0(SIOADDR+WRTDATAINSTR+6):=SYNC'LF;                    <<04836>>07885000
      IF LOGICAL(K) THEN                                                07890000
         WA0(SIOADDR+12+K&LSR(1)).(8:8):=%12   <<PUT IN LF>>            07895000
         ELSE                                                           07900000
         WA0(SIOADDR+12+K&LSR(1)).(0:8):=%12;                           07905000
      K:=K+1;                                                           07910000
      TOS:=DITP(DSYNC).LFSYNC;                                          07915000
      IF S0>7 THEN TOS:=(TOS-6)*5;                                      07920000
      IF(S0+K)>6 THEN <<NOT ENOUGH BUFFER SPACE>>              <<04836>>07925000
      BEGIN                                                             07930000
         TOS:=TOS-(6-K);  <<REMAINING PAD CHARS TO SEND>>      <<04836>>07935000
         DITP(DSYNC).SCOUNT:=TOS;   <<STORE COUNT OF REMAINING SYNCS>>  07940000
         K:=6;     <<NO.OF BYTES TO OUTPUT>>                   <<04836>>07945000
      END                                                               07950000
         ELSE                                                           07955000
      BEGIN                                                             07960000
         K:=K+TOS;         <<TOTAL BYTES TO OUTPUT>>                    07965000
         WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;   <<04836>>07970000
         <<RESTORE ORIGINAL INTERRUPT CODE>>                            07975000
      END;                                                              07980000
   END;                                                                 07985000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>07990000
   WA0(X:=X+3):=SYSDB+SIOADDR+12;  <<SYNCS BUFFER ADDRESS>>             07995000
   SIOSYNC;    <<START SIO PROG TO WRITE CR/LF/SYNCS>>                  08000000
END;           <<--------------END OF SERVSYNC'CR--------------->>      08005000
                                                                        08010000
                                                                        08015000
SUBROUTINE SERVSYNC'LF;                                                 08020000
BEGIN                                                                   08025000
   WA0(SIOADDR+12):=0;   <<REGENERATE SYNC BYTES AGAIN>>                08030000
   WA0(X:=X+1):=0;                                                      08035000
   WA0(X:=X+1):=0;                                                      08040000
                                                               <<04836>>08045000
                                                               <<04836>>08050000
   TOS:=DITP(DSYNC).SCOUNT;    <<REMAINING COUNT OF SYNCS TO WRITE>>    08055000
   IF S0 > 6 THEN   <<TOO MANY PAD CHARS FOR THE BUFFER>>      <<04836>>08060000
   BEGIN                                                                08065000
      TOS:=TOS-6;   <<REMAINING PAD CHARS TO SEND>>            <<04836>>08070000
      DITP(DSYNC).SCOUNT:=TOS; <<NEW COUNT OF SYNCS TO WRITE>>          08075000
      K:=6;                                                    <<04836>>08080000
   END                                                                  08085000
      ELSE                                                              08090000
   BEGIN                                                                08095000
      DITP(DSYNC).SCOUNT:=0;                                            08100000
      K:=TOS;                                                           08105000
      WA0(SIOADDR+WRTDATAINSTR+6):=DITP(DLDEV).SYNCSTATE;      <<04836>>08110000
      <<RESTORE ORIGINAL INTERRUPT CODE>>                               08115000
   END;                                                                 08120000
   WA0(SIOADDR+WRTDATAINSTR+1) := K; << COUNT >>               <<04836>>08125000
   WA0(X:=X+3):=SYSDB+SIOADDR+12;  <<SYNC BUFFER ADDRESS>>              08130000
   SIOSYNC;   <<START SIO PROG TO OUTPUT CR/LF/SYNC>>                   08135000
END;                                                                    08140000
                                                                        08145000
                                                                        08150000
                                                                        08155000
SUBROUTINE LOOKFORCR;                                                   08160000
BEGIN                                                                   08165000
            DITP.PAIR:=1;                                               08170000
            X:=SIOADDR+RDDATAINSTR;   <<ADDR OF RD DATA CHANNEL INSTR>> 08175000
            WA0(X):=[8/3,8/0];    <<GENERATE RD DATA CHANNEL INSTR>>    08180000
            WA0(X:=X+1):=1;       <<READ 1 BYTE>>                       08185000
            WA0(X:=X+1):=[8/%361,8/1];                                  08190000
                         <<TERMINATION JMP OF -15 BACK TO WAIT SRQ>>    08195000
            WA0(X:=X+1):=[1/1,1/1,4/1,10/0]; <<RIGHT BYTE,NO UPDATE>>   08200000
            WA0(X:=X+1):=SYSDB+SIOADDR+10; <<BOTTOMLESS DATA DUMP>>     08205000
            WA0(X:=X+2):=49;       <<JMP FROM 98 TO 147:RDINTRPT>>      08210000
        WA0(SIOADDR+RDINTRPT+6):=WAITCR;                                08215000
            TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     08220000
            X:=GETDRT(S0,DRT3).IDLESIO;                        <<04836>>08225000
            IF <> THEN SUDDENDEATH(209);                       <<04836>>08230000
            TOS:=SYSDB+SIOADDR+RDWAIT;  <<START SIO AT WAIT SRQ>>       08235000
            DISABLE;                                           <<04836>>08240000
            STARTSIO;                                                   08245000
            ASMB(IXIT);                                                 08250000
END;                                                                    08255000
                                                                        08260000
                                                                        08265000
                                                                        08270000
                                                                        08275000
SUBROUTINE SPEEDFOUND;                                                  08280000
BEGIN                                                                   08285000
   DITP(DSPEED).SPDSENSING:=0;                                          08290000
   DITP(DRQST).SPDFOUND:=1; <<SET FLAG FOR IOTERM SERVICE>>             08295000
   DITP(DCNTRL).SPDSIO:=0;                                              08300000
   DITP.PTYCHK := DITP(DCNTRL).PTYON;                          <<04836>>08305000
   AWAKETERMINAL(DITP);                                                 08310000
   ASMB(IXIT);  <<LEAVING ON A JET PLANE>>                              08315000
END;                                                                    08320000
                                                                        08325000
                                                                        08330000
                                                                        08335000
                                                                        08340000
                                                                        08345000
SUBROUTINE RESTRTWAIT;                                                  08350000
BEGIN                                                                   08355000
   X:=DITP.DSTATE;                                                      08360000
   IF = AND NOT DITPL(DCNTRL).SPDSIO THEN ASMB(IXIT);                   08365000
   <<IDLE WAIT PROG WAS ALREADY STOPPED,DO NOT RESTART>>                08370000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              08375000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>08380000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>08385000
   TOS:=SYSDB+SIOADDR+RDWAIT;  <<START AT WAIT SRQ CHANNEL INSTR>>      08390000
   DISABLE;                                                    <<04836>>08395000
   STARTSIO;                                                            08400000
   ASMB(IXIT);                                                          08405000
END;                                                                    08410000
                                                                        08415000
                                                                        08420000
                                                                        08425000
                                                                        08430000
SUBROUTINE CLEANUPRD;                                                   08435000
BEGIN                                                                   08440000
   READTIMED:= IF DITP(DTRLX).READTRLX<>0 AND                           08445000
               DITP(DSAVE).HSTATE=ONLINE THEN TRUE ELSE FALSE;          08450000
   IOQP(QMISC).RSTATE:=READCMPLTD;   <<INFORM IOTERM0 THAT READ         08455000
                                       OPERATION IS COMPLETED>>         08460000
   X:=IOQP(QMISC).READSTOP;                                             08465000
   IF <> THEN          <<READ HAS BEEN STOPPED>>                        08470000
   BEGIN                                                                08475000
      IF X=PREMPTSTOP THEN                                              08480000
      BEGIN     <<READ WAS PREMPTED,RESTORE TIMING FLAGS>>              08485000
         DITP(DTYPE).TIMING:=0;                                         08490000
         IF <> THEN DITP(DTYPE).TIMEREAD:=1;                            08495000
      END                                                               08500000
         ELSE                                                           08505000
      IF X=BREAKSTOP AND READTIMED THEN                                 08510000
         SETREADERROR(IOQP,READTO);                                     08515000
                                                                        08520000
      IOQP(QMISC).RSTATE:=STOPPED;                                      08525000
   END;                                                                 08530000
                                                                        08535000
   DITP(DTYPE).TIMING:=0;                                               08540000
   IF <> THEN       <<COMPUTE DURATION OF READ OPERATION>>              08545000
   BEGIN                                                                08550000
      TOS:=TIMER-DITPD(DRTIMED);                                        08555000
      IF < THEN << NEGATIVE TIME INTERVAL MEANS >>             <<04836>>08560000
                << THAT TIMER HAS OVERFLOWED    >>             <<04836>>08565000
         TOS:= TOS+MSECS'24'DAYS;                              <<04836>>08570000
      TOS:=10;      <<DIVIDE MSEC BY 10 TO GET 100THS OF SECONDS>>      08575000
      ASMB(LDIV, DEL);                                                  08580000
      IF OVERFLOW THEN                                                  08585000
      BEGIN       DEL;     TOS:=-1;      END;                           08590000
      DITP(DRTIME):=TOS;                                                08595000
   END;                                                                 08600000
                                                                        08605000
   IF READTIMED THEN                                                    08610000
   BEGIN                                                                08615000
      IF IOQP(QMISC).READSTOP<>PREMPTSTOP THEN                          08620000
         DITP(DRTMAX):=0;     <<CLR USER REQUESTED READ TIME LIMIT>>    08625000
      STOPTIMEOUT(READTIMEOUT,DITP);                                    08630000
   END;                                                                 08635000
                                                                        08640000
   DITP.PAIR:=0;       <<NOT READING ANY MORE>>                         08645000
                                                                        08650000
    DITP(DTYPE).PAIRCODE:=NOTREADING;                                   08655000
   DITP(DMODEM).PRIMED:=0;                                              08660000
   IF <> THEN                                                  <<04836>>08665000
      BEGIN                                                    <<04836>>08670000
      WA0(SIOADDR+12) := %15412;  << ESCAPE AND LINE FEED >>   <<04836>>08675000
      WA0(X:=X+1) := ";:";                                     <<04836>>08680000
      WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/5];<<RESET CHAR >>   <<04836>>08685000
      WA0(X:=X+1) := 4;                                        <<04836>>08690000
      WA0(X:=X+1) := 1;                                        <<04836>>08695000
      WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>> <<04836>>08700000
      WA0(X:=X+1) := SYSDB+SIOADDR+12;                         <<04836>>08705000
      WA0(X:=X+1) := [8/1,1/1,7/2];<<INTERRUPT HALT TO CPVA2>> <<04836>>08710000
      WA0(X:=X+1) := 10;                                       <<04836>>08715000
      TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                <<04836>>08720000
      X := ABS(S0*4 + 3).IDLESIO;                              <<04836>>08725000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>08730000
      TOS := SYSDB + SIOADDR + NEWSPECCHAR;                    <<04836>>08735000
      STARTSIO;                                                <<04836>>08740000
      STOPTIMEOUT(BLOCKTIMEOUT, DITP);                         <<04836>>08745000
      DITP(DBTIME) := 0;                                       <<04836>>08750000
      END;                                                     <<04836>>08755000
   <<*******CHECKTQUEUE*************>>                                  08760000
END;      <<----------------END OF CLEANUPRD----------------->>         08765000
                                                                        08770000
                                                                        08775000
SUBROUTINE NOTBUF;                                                      08780000
BEGIN                                                                   08785000
   ASMB(IXIT);                                                 <<04836>>08790000
END;                                                                    08795000
                                                                        08800000
                                                                        08805000
                                                                        08810000
                                                                        08815000
SUBROUTINE RDCOMPLETE;                                                  08820000
      BEGIN        <<TERMCHAR=0, BINREAD=1>>                            08825000
         CLEANUPRD;                                                     08830000
         DITP.DSTATE:=NULL;                                             08835000
         IDLEWAIT(DITP);  <<START IDLE WAIT SIO PROG>>                  08840000
         X:=@IOQP;                                                      08845000
         IF <> THEN AWAKETERMINAL(DITP);                                08850000
      END;                                                              08855000
                                                                        08860000
                                                                        08865000
                                                                        08870000
                                                                        08875000
                                                                        08880000
                                                                        08885000
                                                                        08890000
INTEGER SUBROUTINE LASTBYTE;                                            08895000
BEGIN                                                                   08900000
   X:=SIOADDR+3+    <<ADDR OF RD DATA CHANNEL INSTR 4TH WORD>>          08905000
      ( IF DITPL(DSAVE).BLOCKRD THEN                                    08910000
           BLOCKMODRD ELSE RDDATAINSTR );                               08915000
   RIGHT:=IF LOGICAL(WA0(X).(1:1))  THEN TRUE ELSE FALSE;               08920000
          <<SET FLAG IF NEXT BYTE GOES INTO RIGHT HALF>>                08925000
   FLAG:=IF LOGICAL(WA0(X).(5:1)) THEN TRUE                             08930000
                                  ELSE FALSE;                           08935000
         <<SET NO UPDATE FLAG ACCORDING TO INSTR CONTENTS>>             08940000
   I:=IF RIGHT THEN WA0(X:=X+1) ELSE WA0(X:=X+1) - 1;                   08945000
          <<GET ADDRESS OF THE LAST BYTE READ>>                         08950000
   X:=I - SYSDB;                                                        08955000
   LASTBYTE.(9:7):=IF RIGHT AND NOT FLAG THEN WA0(X).(1:7)              08960000
                            ELSE WA0(X).(9:7);                          08965000
END;       <<--------------END OF LASTBYTE-------------------->>        08970000
                                                                        08975000
SUBROUTINE READDONE(NOCRLF);                                            08980000
VALUE NOCRLF;      LOGICAL NOCRLF;                                      08985000
BEGIN                                                                   08990000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>08995000
      DITPL(DLDEV).RDFLUSH := 0;                               <<04836>>09000000
      RDCOMPLETE;                                              <<04836>>09005000
      ASMB(IXIT)  END;                                         <<04836>>09010000
   CLEANUPRD;                                                           09015000
   X:=IOQP(QPAR1);        <<TEST NO CR/LF FLAG>>                        09020000
   IF < OR DITPL(DSPEED).TAPEMODE OR NOCRLF THEN                        09025000
   BEGIN        <<DO NOT SEND CARRIAGE CNTRL BYTES>>                    09030000
      DITP.DSTATE:=NULL;     <<BACK TO NATURE>>                         09035000
      IDLEWAIT(DITP);        <<START IDLE WAIT SIO PROG>>               09040000
      X:=@IOQP;                                                         09045000
      IF <> THEN AWAKETERMINAL(DITP);                                   09050000
   END                                                                  09055000
      ELSE                                                              09060000
   BEGIN                                                                09065000
      IOQP(QMISC).RSTATE := READING;<< WE'RE NOT DONE YET>>    <<04836>>09070000
      TOS:=DITP;                                                        09075000
      TOS.NEWLINE:=1;                                                   09080000
      TOS.DSTATE:=EORSYNC;   <<SENDING CARRIAGE CNTRL BYTES>>           09085000
      DITP:=TOS;                                                        09090000
      FLAG:=IF LASTBYTE=CR THEN TRUE ELSE FALSE;                        09095000
            <<SET FLAG IF ONLY LF IS SENT>>                             09100000
      J := WRTBASE;                                            <<04836>>09105000
      IF NOT DITPL(DMODEM).NOSYNC THEN  <<TERM NEEDS DELAYS>>  <<04836>>09110000
     BEGIN   <<SEND LF/SYNCS, THEN CR/SYNCS>>                  <<04836>>09115000
         IF FLAG THEN DOCRLFSYNC(1,NXTNULL,DITP) <<LF ONLY>>   <<04836>>09120000
                 ELSE DOCRLFSYNC(0,NXTNULL,DITP);              <<04836>>09125000
     END                                                       <<04836>>09130000
        ELSE                                                   <<04836>>09135000
     BEGIN                                                     <<04836>>09140000
                                                               <<04836>>09145000
      X:=SIOADDR+WRTDATAINSTR;                                 <<04836>>09150000
      WA0(X):=[8/4,8/0];     <<GENERATE WRITE DATA CHANNEL INSTR>>      09155000
      WA0(X:=X+1):=IF FLAG THEN 1 ELSE 2;    <<LF OR CR/LF>>            09160000
      WA0(X:=X+1):=1;                                                   09165000
      WA0(X:=X+1):=[1/1,1/1,1/1,13/0];    <<FROM RIGHT BYTE>>           09170000
      WA0(X:=X+1):=IF FLAG THEN SYSDB+SIOADDR+1  <<ADDR OF LF>>         09175000
                           ELSE SYSDB+SIOADDR;   <<ADDR OF CR/LF>>      09180000
      WA0(X:=X+1):=[8/1,1/1,7/1];  <<INTERRUPT/HALT,CODE TO CPVA1>>     09185000
      WA0(X:=X+1):=NXTNULL;   <<INTERRUPT CODE FOR SENDING CR,LF>>      09190000
     END;                                                      <<04836>>09195000
     TOS:=DITP(DMODEM)&CSL(M202);                                       09200000
     IF TOS AND DITP(DMODEM).CBSB <> 3 THEN                             09205000
     BEGIN      <<202 NOT IN WRITE STATE>>                              09210000
        STARTTIMEOUT(TURNTO,DITP);                                      09215000
                                                               <<04836>>09220000
        DITP(DSAVE).TURNTOWRITE:=1;                                     09225000
        DITP(DCNTRL).NXTDSTATE:=DITP;                                   09230000
        DITP.DSTATE:=TURN202;                                           09235000
        DITP(DSIOPC) := SYSDB + SIOADDR + J;                   <<04836>>09240000
        MODCONTROL(WRITING,DITP);                              <<04836>>09245000
     END                                                                09250000
        ELSE                                                            09255000
     BEGIN                                                              09260000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           09265000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>09270000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>09275000
      TOS:=SYSDB+SIOADDR+J;                                    <<04836>>09280000
           <<START SIO PROG AT WRITE INTERFACE CONTROL>>                09285000
      STARTSIO;                                                         09290000
     END;                                                               09295000
   END;                                                                 09300000
   ASMB(IXIT);                                                          09305000
END;       <<---------------END OF READDONE----------------->>          09310000
                                                                        09315000
                                                               <<04836>>09320000
                                                               <<04836>>09325000
                                                               <<04836>>09330000
SUBROUTINE NEWSPDRD;                                           <<04836>>09335000
BEGIN                                                          <<04836>>09340000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     <<04836>>09345000
   TOS:=SYSDB+SIOADDR+SPSENBAUD+5;                             <<04836>>09350000
   STARTSIO;        ASMB(IXIT);                                <<04836>>09355000
END;                                                           <<04836>>09360000
                                                                        09365000
                                                                        09370000
SUBROUTINE SPEEDSENSE;                                                  09375000
BEGIN                                                                   09380000
   RDDATA:=WA0(SIOADDR+10).(8:8);    <<GET CHAR JUST READ>>             09385000
   IF NOT DITPL(DSPEED).SPDSENSING THEN                                 09390000
   BEGIN                                                                09395000
      IF SYSUP THEN                                                     09400000
    BEGIN                                                               09405000
      TEMP:=DITP(DMODEM).MTYPE; <<GET SUBTYPE>>                <<04836>>09410000
      <<FIRST CHAR JUST RECVD,GO INTO SPEEDSENSING MODE>>               09415000
      IF RDDATA=%15 OR RDDATA=%215 THEN                        <<04836>>09420000
      BEGIN                                                             09425000
         IF TEMP=4 OR TEMP=5 THEN DCNTP:=DITP(DLAST).TERMSPEED <<04836>>09430000
            ELSE   <<USE CONFIGURED SPEED FOR NON-SPDSEN DEV>> <<04836>>09435000
         DCNTP:=%7;   <<ADCC CODE FOR 240CPS>>                 <<04836>>09440000
         IF RDDATA=%215 THEN DITP(DCNTRL).PTYONODD:=%2;        <<04836>>09445000
         <<PTY BIT WAS ON,SO SET PTY FLAG AND ODD PTY=0>>      <<04836>>09450000
         SPEEDFOUND;                                           <<04836>>09455000
      END                                                               09460000
         ELSE                                                           09465000
      IF TEMP=4 OR TEMP=5 THEN RESTRTWAIT <<NON-SPDSEN DEV>>   <<04836>>09470000
         ELSE                 <<CHECK FOR OTHER BAUDRATES>>    <<04836>>09475000
      BEGIN                                                             09480000
         DITP(DSPEED).SPDSENSING:=1;                                    09485000
         DITPD(DRTIMED):=TIMER;       <<RECORD WHEN 1ST CHAR IS RECVD>> 09490000
         IF RDDATA=%346 THEN                                   <<04836>>09495000
         BEGIN    <<POSSIBLE CR AT 1200 BAUDS>>                <<04836>>09500000
            DCNTP:=0;                                          <<04836>>09505000
            RESTRTWAIT;   <<WAIT FOR 2ND CHAR>>                <<04836>>09510000
         END                                                   <<04836>>09515000
            ELSE                                               <<04836>>09520000
         IF RDDATA=%170 THEN                                   <<04836>>09525000
         BEGIN     <<POSSIBLE CR AT 60CPS>>                    <<04836>>09530000
            DCNTP.(13:3):=3;  <<60CPS STATE ASSIGNMENT>>       <<04836>>09535000
            WA0(SIOADDR+8).(12:4):=%6;   <<ADCC CODE, 60CPS>>  <<04836>>09540000
            NEWSPDRD;  <<CHANGE SPEED TO 120CPS FOR NEXT BYTE>><<04836>>09545000
         END                                                   <<04836>>09550000
            ELSE                                               <<04836>>09555000
         IF RDDATA=%200 THEN                                   <<04836>>09560000
         BEGIN      <<POSSIBLE CR AT 60 OR 30 CPS>>                     09565000
            DCNTP.(13:3):=IF RDDATA=%170 THEN 3  <<60 CPS STATE ASSIGN  09570000
                                                   MENT TO DETECT CR>>  09575000
                                         ELSE 2; <<30CPS ASSIGNMENT>>   09580000
            WA0(SIOADDR+8).(12:4):=%15; <<ADCC CODE,30CPS>>    <<04836>>09585000
            NEWSPDRD; <<CHANGE TO 30CPS TO WAIT FOR NEXT BYTE>><<04836>>09590000
         END                                                            09595000
            ELSE                                                        09600000
         IF RDDATA=0 THEN    <<BREAK WAS RECVD,POSSIBLE CR AT 150 OR 11 09605000
                               0 CPS>>                                  09610000
         BEGIN       <<CHANGE ADCC RECV BAUDRATE TO 15CPS>>             09615000
            WA0(SIOADDR+8).(12:4):=%16;   <<ADCC CODE FOR 15 CPS>>      09620000
            DCNTP.(13:3):=1;       <<11 & 15 CPS STATE ASSIGNMENT>>     09625000
            NEWSPDRD; <<CHANGE TO 15CPS TO READ NEXT CHAR>>    <<04836>>09630000
                                                               <<04836>>09635000
                                                               <<04836>>09640000
                                                               <<04836>>09645000
         END                                                            09650000
      END;                                                              09655000
    END;                                                                09660000
      DITP(DSPEED).SPDSENSING:=0;                                       09665000
                                                               <<04836>>09670000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           09675000
      TOS:=SYSDB+SIOADDR+XMITOFF;                              <<04836>>09680000
      STARTSIO;                                                         09685000
                                                                        09690000
   END                                                                  09695000
      ELSE                                                              09700000
   BEGIN                                                                09705000
      <<ALREADY IN SPEEDSENSE MODE>>                                    09710000
      TEMP:=DCNTP.(13:3);     <<GET BAUDRATE STATE ASSIGNMENT>>         09715000
      TOS:=TIMER-DITPD(DRTIMED);    <<COMPUTE TIME BETWEEN CHARS>>      09720000
      IF < THEN << NEGATIVE TIME INTERVAL MEANS >>             <<04836>>09725000
                << THAT TIMER HAS OVERFLOWED    >>             <<04836>>09730000
         TOS:= TOS+MSECS'24'DAYS;                              <<04836>>09735000
      I:=TOS;                                                           09740000
      IF TOS=0 THEN    <<MOST SIGNIF WORD=0,TIME SMALL ENOUGH>>         09745000
      BEGIN                                                             09750000
         IF TEMP=3 THEN                                                 09755000
         BEGIN         <<POSSIBLE CR AT 60CPS,1ST CHAR WAS %170>>       09760000
            IF RDDATA=%370 OR RDDATA=%374 THEN                 <<04836>>09765000
            BEGIN                                                       09770000
               IF I<=17 AND SYSUP THEN                         <<04836>>09775000
               BEGIN                                                    09780000
                  <<CR DETECTED AT 60CPS>>                              09785000
                  DCNTP:=6;     <<ADCC CODE FOR 60CPS>>                 09790000
                   IF RDDATA=%374 THEN DITP(DCNTRL).PTYONODD   <<04836>>09795000
                      :=%2;  <<PTY ON,ODD PTY=0>>              <<04836>>09800000
                  SPEEDFOUND;                                           09805000
               END;                                                     09810000
            END;                                                        09815000
            <<DON'T JIVE, RESTART SPEEDSENSE ALL OVER AGAIN>>           09820000
            DCNTP:=0;                                                   09825000
            DITP(DSPEED).SPDSENSING:=0;                                 09830000
         WA0(SIOADDR+8).(12:4):=%7; <<ADCC CODE FOR 240CPS>>   <<04836>>09835000
         NEWSPDRD; <<CHANGE TO 240CPS TO RESTART SPEEDSENSE>>  <<04836>>09840000
         END                                                            09845000
            ELSE                                                        09850000
         IF TEMP=2 THEN                                                 09855000
         BEGIN         <<POSSIBLE 30CPS,PREVIOUS CHAR WAS %200>>        09860000
            IF RDDATA=%303 OR RDDATA=%343 THEN                 <<04836>>09865000
            BEGIN                                              <<04836>>09870000
               IF I<=40 AND SYSUP THEN                         <<04836>>09875000
               BEGIN    <<BYTE RECEIVED WITHIN TIME LIMITS>>   <<04836>>09880000
                  DCNTP:=%15;  <<ADCC CODE FOR 30CPS>>         <<04836>>09885000
                  IF RDDATA=%343 THEN DITP(DCNTRL).PTYONODD    <<04836>>09890000
                     :=%2;   <<PTY ON,ODD PTY=0>>              <<04836>>09895000
                  SPEEDFOUND;                                  <<04836>>09900000
               END;                                            <<04836>>09905000
            END;                                               <<04836>>09910000
                                                               <<04836>>09915000
                                                               <<04836>>09920000
                                                               <<04836>>09925000
                                                               <<04836>>09930000
                                                               <<04836>>09935000
                                                               <<04836>>09940000
                                                               <<04836>>09945000
                                                               <<04836>>09950000
                                                               <<04836>>09955000
                                                               <<04836>>09960000
                                                               <<04836>>09965000
                                                               <<04836>>09970000
                                                               <<04836>>09975000
            DCNTP:=0;                                                   09980000
            DITP(DSPEED).SPDSENSING:=0;                                 09985000
            WA0(SIOADDR+8).(12:4):=%7; <<ADCC CODE,240CPS>>    <<04836>>09990000
            NEWSPDRD;                                          <<04836>>09995000
         END                                                            10000000
            ELSE                                                        10005000
         IF TEMP=1 THEN                                                 10010000
         BEGIN        <<POSSIBLE CR AT 15CPS OR 11CPS>>                 10015000
               IF RDDATA=%303 OR RDDATA=%343 THEN  <<PTY ON:%343>>      10020000
               BEGIN                                                    10025000
                  TEMP:=%16;  <<ADCC CODE FOR 15CPS>>                   10030000
                  J:=80;      <<TIME LIMIT BETWN CHARS>>                10035000
                  IF RDDATA=%343 THEN DITP(DCNTRL).PTYONODD    <<04836>>10040000
                     :=%2;  <<PTY ON,ODD PTY=0>>               <<04836>>10045000
               END                                                      10050000
                  ELSE                                                  10055000
               IF RDDATA=%7 OR RDDATA=%6 OR RDDATA=%206 OR              10060000
                  RDDATA=%207 THEN  <<PTY ON: %206,%207>>               10065000
               BEGIN                                                    10070000
                  TEMP:=%17;  <<ADCC CODE FOR 11CPS>>                   10075000
                  J:=85;                                                10080000
                  IF LOGICAL(RDDATA.(8:1)) THEN DITP(DCNTRL).  <<04836>>10085000
                     PTYONODD:=%2;  <<PTY ON,ODD PTY=0>>       <<04836>>10090000
               END;                                                     10095000
               X:=TEMP-%16;                                             10100000
               IF >= AND I<=J AND SYSUP THEN                            10105000
               BEGIN    <<CHAR RECVD WITHIN TIME LIMITS>>               10110000
                  DCNTP:=TEMP;                                          10115000
                  SPEEDFOUND;                                           10120000
               END;                                                     10125000
         END                                                            10130000
            ELSE                                               <<04836>>10135000
         BEGIN   <<STATE=0,POSSIBLE 2ND BYTE OF CR AT 120CPS>> <<04836>>10140000
            IF RDDATA=%200 OR RDDATA=%340 THEN                 <<04836>>10145000
            BEGIN                                              <<04836>>10150000
               IF I<=10 AND SYSUP THEN                         <<04836>>10155000
               BEGIN                                           <<04836>>10160000
                  DCNTP:=%13;  <<ADCC CODE FOR 120CPS>>        <<04836>>10165000
                  IF RDDATA=%340 THEN DITP(DCNTRL).PTYONODD:=  <<04836>>10170000
                     %2;                                       <<04836>>10175000
                  SPEEDFOUND;                                  <<04836>>10180000
               END;                                            <<04836>>10185000
            END;                                               <<04836>>10190000
         END;                                                  <<04836>>10195000
      END;                                                              10200000
      DCNTP:=0;     <<SPEEDSENSE FAILED, RETRY AGAIN>>                  10205000
      DITP(DSPEED).SPDSENSING:=0;                                       10210000
      WA0(SIOADDR+8).(12:4):=%7;   <<ADCC CODE FOR 240CPS>>             10215000
                                                                        10220000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           10225000
      TOS:=SYSDB+SIOADDR+SPSENBAUD;                                     10230000
      STARTSIO;                                                         10235000
   END;                                                                 10240000
                                                                        10245000
END;          <<--------------END OF SPEEDSENSE---------------->>       10250000
                                                                        10255000
                                                                        10260000
                                                                        10265000
                                                                        10270000
                                                                        10275000
                                                                        10280000
                                                                        10285000
                                                                        10290000
                                                                        10295000
SUBROUTINE PREFETCH;                                                    10300000
BEGIN                                                                   10305000
   WA0(I):=[8/125,8/1];  <<96 TO 221:NXTBLKRD-INTERRUPT/NO HALT>>       10310000
   TOS:=GETTBUF(SECONDARY);                                             10315000
   TOS:=S0;                                                             10320000
   IF = THEN                                                            10325000
   BEGIN                                                                10330000
      DDEL;                                                             10335000
      SETREADERROR(IOQP,LOSTDATA);                                      10340000
      ASMB(IXIT);                                                       10345000
   END                                                                  10350000
      ELSE                                                              10355000
   BEGIN                                                                10360000
      DITP(DBLKTAIL):=TOS;                                              10365000
      X:=SIOADDR+BLOCKMODRD+4;                                          10370000
      WA0(X):=TOS+SYSDB+2;                                              10375000
      K:=K-DCNTP;  <<BYTES REMAINING FOR 2ND TBUF TO FILL>>             10380000
      IF K > TBMAXB THEN                                                10385000
      BEGIN        <<2ND TBUF STILL NOT ENOUGH>>                        10390000
         WA0(SIOADDR+BLOCKMODRD+1):=TBMAXB;                             10395000
         WA0(X:=X+1):=[8/4,8/1]; <<238 TO 242:INTERRUPT/NO HALT>>       10400000
      END                                                               10405000
         ELSE                                                           10410000
      BEGIN                                                             10415000
         WA0(SIOADDR+BLOCKMODRD+1):=K;                                  10420000
         WA0(X:=X+1):=[8/%222,8/1]; <<238 TO 128:RDEXIT>>               10425000
      END;                                                              10430000
      WA0(X:=X+1):=[1/1,1/0,14/0];  <<INTO LEFT BYTE>>                  10435000
   END;                                                                 10440000
END;    <<--------------END OF PREFETCH--------------------->>          10445000
                                                                        10450000
SUBROUTINE RDTOWRT; BEGIN                                      <<04836>>10455000
   STARTTIMEOUT(TURNTO, DITP);                                 <<04836>>10460000
   MODCONTROL(WRITING, DITP);                                  <<04836>>10465000
   DITP(DSAVE).TURNTOWRITE := 1;                               <<04836>>10470000
   DITP(DCNTRL).NXTDSTATE := DITP;                             <<04836>>10475000
   DITP.DSTATE := TURN202;                                     <<04836>>10480000
   DITP(DSIOPC) := SYSDB + SIOADDR + RECVOFF;                  <<04836>>10485000
   ASMB(IXIT);  END;                                           <<04836>>10490000
                                                                        10495000
LOGICAL SUBROUTINE WAITFORCR;                                           10500000
BEGIN                                                                   10505000
   X:=DITP(DSPEED);       <<GET TAPEMODE FLAG>>                         10510000
   IF < AND NOT DITPL(DMODEM).NOSYNC   <<TAPEMODE AND NOT A 2640X>>     10515000
      OR                                                                10520000
   DITPL(DMODEM).PRIMED AND DITP(DTYPE).TTYPE=HP2640X                   10525000
      THEN       <<OR TERMTYPE=11 AND BLOCK MODE READ IN PROGRESS>>     10530000
      IF LASTBYTE<>CR THEN WAITFORCR:=TRUE;                             10535000
END;                                                                    10540000
                                                                        10545000
                                                                        10550000
SUBROUTINE KILLREAD;  BEGIN                                    <<04836>>10555000
   DISABLE;                                                    <<04836>>10560000
   J := DITP(DRBCT) - DBCNTP - (IF CPVAP(3) <> 0 THEN TBMAXB   <<04836>>10565000
                                                 ELSE 0);      <<04836>>10570000
                                                               <<04836>>10575000
                                                               <<04836>>10580000
                                                               <<04836>>10585000
   IOQP(QMISC).READSTOP := ABORTED;                            <<04836>>10590000
   CPVAP(3) := 0;                                              <<04836>>10595000
   DCNTP := DBCNTP:= DITP(DPNTR) := DITP(DTANKB) := 0;         <<04836>>10600000
   DITP(DSAVE).BLOCKRD := 0;                                   <<04836>>10605000
   DITP(DMODEM).PRIMED := 0;                                   <<04836>>10610000
   DITPL(DLDEV).RDFLUSH := 1;                                  <<04836>>10615000
   ENABLE;                                                     <<04836>>10620000
   X := DITP(DHEAD);                                           <<04836>>10625000
   WHILE <> DO BEGIN                                           <<04836>>10630000
      TOS := X;                                                <<04836>>10635000
      X := WA0(X);                                             <<04836>>10640000
      RETURNTBUF( * );                                         <<04836>>10645000
      ENABLE  END;                                             <<04836>>10650000
   DITP(DHEAD) := DITP(DTAIL) := 0;                            <<04836>>10655000
   TOS := DITP(DBLKTAIL);                                      <<04836>>10660000
   DITP(X) := 0;                                               <<04836>>10665000
   IF <> THEN RETURNTBUF( * );                                 <<04836>>10670000
   WA0(SIOADDR + RDDATAINSTR) := [8/3, 8/0];                   <<04836>>10675000
   WA0(X := X+1) := J;                                         <<04836>>10680000
   WA0(X := X+1) := [8/32, 8/1];                               <<04836>>10685000
   WA0(X := X+1) := [1/1, 1/1, 1/0, 3/1, 10/0];                <<04836>>10690000
   WA0(X := X+1) := SYSDB + SIOADDR + 10;                      <<04836>>10695000
   WA0(X := X+2) := RDSPECL;                                   <<04836>>10700000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>10705000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>10710000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>10715000
   TOS := SYSDB + SIOADDR + RDWAIT;                            <<04836>>10720000
   STARTSIO;                                                   <<04836>>10725000
   ASMB(IXIT)  END;                                            <<04836>>10730000
                                                                        10735000
                                                                        10740000
SUBROUTINE BUILD2SIO;                                                   10745000
BEGIN                                                                   10750000
   TOS:=GETTBUF(SECONDARY);                                             10755000
   ASMB(TEST);                                                 <<04836>>10760000
   IF = THEN                                                            10765000
      DEL                                                      <<04836>>10770000
                                                               <<04836>>10775000
                                                               <<04836>>10780000
                                                               <<04836>>10785000
                                                               <<04836>>10790000
      ELSE                                                              10795000
   BEGIN                                                                10800000
      DITP(DBLKTAIL):=TOS;                                              10805000
      WA0(SIOADDR+BLOCKMODRD+4):=SYSDB+DITP(DBLKTAIL)+2;                10810000
      J:=DITP(DRBCT)-DBCNTP-DCNTP; <<BYTES REMAINING TO READ>>          10815000
      IF J > TBMAXB THEN                                                10820000
      BEGIN    <<EVEN 2ND TBUF IS NOT ENOUGH>>                          10825000
         WA0(SIOADDR+BLOCKMODRD+1):=TBMAXB;                             10830000
         WA0(X:=X+1):=[8/4,8/1]; <<238 TO 242:INTERRUPT/NO HALT>>       10835000
      END                                                               10840000
         ELSE                                                           10845000
      BEGIN                                                             10850000
         WA0(SIOADDR+BLOCKMODRD+1):=J;                                  10855000
         WA0(X:=X+1):=[8/%222,8/1]; <<238 TO 128:RDEXIT>>               10860000
      END;                                                              10865000
      WA0(X:=X+1):=[1/1,1/0,14/0];  <<FROM LEFT BYTE>>                  10870000
      WA0(X:=X+3) := RDSPECL;                                  <<04836>>10875000
   END;                                                                 10880000
END;   <<-------------------END OF BUILD2SIO------------------->>       10885000
                                                                        10890000
INTEGER SUBROUTINE BLOCKTIME;                                  <<04836>>10895000
   BLOCKTIME := (DITP(DRBCT)/CPS(DITP(DSPEED).INSPEED-7))      <<04836>>10900000
                &ASL(1) + 30;                                  <<04836>>10905000
                                                                        10910000
SUBROUTINE READBLOCK;                                                   10915000
BEGIN                                                                   10920000
   DITP(DBTIME) := BLOCKTIME;                                  <<04836>>10925000
   STARTTIMEOUT(BLOCKTIMEOUT,DITP);                            <<04836>>10930000
   STOPTIMEOUT(READTIMEOUT, DITP);<<STOP USER TIMER AT ENTER>> <<04836>>10935000
   DITP(DRTMAX) := 0; << CLEAR REQUEST FOR A TIMER >>          <<04836>>10940000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; << WRITE DATA INSTR>> <<04836>>10945000
   WA0(X:=X+1):=1;                                                      10950000
   WA0(X:=X+1):=1;                                                      10955000
   WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; <<FROM LEFT BYTE>>         <<04836>>10960000
   WA0(X:=X+1):=SYSDB+SIOADDR+4;    <<ADDR FOR DC1,ETX>>       <<04836>>10965000
   WA0(X:=X+1):=[8/1,1/1,7/1];                                 <<04836>>10970000
   WA0(X:=X+1):=9;                                             <<04836>>10975000
   WA0(SIOADDR+4) := DC1'ETX;                                  <<04836>>10980000
   WA0(SIOADDR+12) := %15412; << ESCAPE AND LINE FEED >>       <<04836>>10985000
   WA0(X:=X+1) := ";:";                                        <<04836>>10990000
   WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/4];<<CLEAR SPEC CHAR>>  <<04836>>10995000
   WA0(X:=X+1) := 4;                                           <<04836>>11000000
   WA0(X:=X+1) := 1;                                           <<04836>>11005000
   WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>>    <<04836>>11010000
   WA0(X:=X+1) := SYSDB + SIOADDR + 12;                        <<04836>>11015000
   WA0(X:=X+1) := [8/0, 8/0]; << JUMP TO OUTPUT DC1 >>         <<04836>>11020000
   WA0(X:=X+1) := RECVOFF - NEWSPECCHAR - 7;                   <<04836>>11025000
   IF AUTOHANDSH AND NOT DITPL.SPOOLING THEN                   <<04836>>11030000
     BEGIN                                                     <<04836>>11035000
     PUSH(STATUS);                                             <<04836>>11040000
     J := TOS.(8:8)*4+ABS(0);      <<ABSOLUTE CST ADDRESS>>    <<04836>>11045000
     I := ABSOLUTE (J+2) ;                                              11050000
     J := ABS(J+3);         << CODE SEG BANK ADDRESS >>        <<04836>>11055000
     WA0(SIOADDR+WRTDATAINSTR+1) := 5;                         <<04836>>11060000
     WA0(X:=X+2) := %120000 LOR LOGICAL(I);  <<L BYTE & BANK>> <<04836>>11065000
     WA0(X:=X+1) := J + @DISABLE'HOME;     <<PB BANK ADDR>>    <<04836>>11070000
     END;                                                      <<04836>>11075000
   J:=TBMAXB-(DBCNTP MOD TBMAXB); <<REMAINING ROOM IN TBUF>>            11080000
   K:=DITP(DRBCT)-DBCNTP; <<BYTES REMAINING TO READ>>                   11085000
   IF K > J THEN                                                        11090000
   BEGIN        DCNTP:=J;                                               11095000
      WA0(SIOADDR+RDDATAINSTR+1):=J;                                    11100000
      WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>                  11105000
   END                                                                  11110000
      ELSE                                                              11115000
   BEGIN        DCNTP:=K;                                               11120000
      WA0(SIOADDR+RDDATAINSTR+1):=K;                                    11125000
      WA0(X:=X+1):=[8/32,8/1]; <<96 TO 128:RDEXIT>>                     11130000
   END;                                                                 11135000
   WA0(X:=X+1):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                       11140000
                              ELSE [1/1,1/0,14/0];                      11145000
   WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTAIL)+2+(DBCNTP MOD          11150000
                               TBMAXB)&LSR(1);                          11155000
   DITP.DSTATE :=WRTSPECL;                                     <<04836>>11160000
   IF DITPL(DMODEM)&CSL(M202) THEN BEGIN                       <<04836>>11165000
      X := SIOADDR + WRTDATAINSTR + 1;                         <<04836>>11170000
      WA0(X) := WA0(X) + 1;               << OUTPUT ETX TOO >> <<04836>>11175000
                                                               <<04836>>11180000
      WA0(X:=X+4) := [8/1, 1/1, 7/2];                          <<04836>>11185000
      WA0(X:=X+1) := 22;                                       <<04836>>11190000
      RDTOWRT;                                                 <<04836>>11195000
   END;                                                        <<04836>>11200000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              11205000
   TOS := SYSDB + SIOADDR + NEWSPECCHAR;                       <<04836>>11210000
   STARTSIO;                                                            11215000
   ASMB(IXIT);                                                          11220000
END;    <<----------------END OF READBLOCK-------------------->>        11225000
                                                                        11230000
                                                                        11235000
                                                                        11240000
                                                                        11245000
                                                                        11250000
SUBROUTINE SERV1FULL;                                                   11255000
BEGIN                                                                   11260000
   DITP(DSAVE).BLOCKRD:=1; <<DATA IS BEING READ BY 2ND SIO PROG>>       11265000
   DBCNTP:=DBCNTP+DCNTP;   <<INCLUDE COUNT OF DATA IN 1ST TBUF>>        11270000
   J:=DITP(DRBCT)-DBCNTP;  <<BYTES REMAINING TO READ>>                  11275000
   TOS:=DITP(DBLKTAIL);                                                 11280000
   DITP(X):=0;                                                          11285000
   WA0(DITP(DTAIL)):=S0;   <<LINK CURRENT TBUF>>                        11290000
   DITP(DTAIL):=TOS;                                                    11295000
   IF J < TBMAXB THEN DCNTP:=J                                          11300000
      ELSE                                                              11305000
   BEGIN  <<CURRENT TBUF NOT ENOUGH TO HANDLE READ>>                    11310000
      DCNTP:=TBMAXB;                                                    11315000
      TOS:=GETTBUF(SECONDARY);                                          11320000
   ASMB(TEST);                                                 <<04836>>11325000
      IF = THEN                                                         11330000
      DEL                                                      <<04836>>11335000
                                                               <<04836>>11340000
                                                               <<04836>>11345000
                                                               <<04836>>11350000
                                                               <<04836>>11355000
         ELSE                                                           11360000
      BEGIN                                                             11365000
         DITP(DBLKTAIL):=TOS;                                           11370000
         WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DBLKTAIL)+2;            11375000
         J:=DITP(DRBCT)-DBCNTP-DCNTP;                                   11380000
         IF J > TBMAXB THEN                                             11385000
         BEGIN                                                          11390000
            WA0(SIOADDR+RDDATAINSTR+1):=TBMAXB;                         11395000
            WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>            11400000
         END                                                            11405000
            ELSE                                                        11410000
         BEGIN                                                          11415000
            WA0(SIOADDR+RDDATAINSTR+1):=J;                              11420000
            WA0(X:=X+1):=[8/32,8/1]; <<96 TO 128:RDEXIT>>               11425000
         END;                                                           11430000
         WA0(X:=X+1):=[1/1,1/0,14/0]; <<FROM LEFT BYTE>>                11435000
         WA0(X:=X+3) := RDSPECL;                               <<04836>>11440000
      END;                                                              11445000
   END;                                                                 11450000
END;     <<--------------END OF SERV1FULL------------------->>          11455000
                                                                        11460000
SUBROUTINE SERV2FULL;                                                   11465000
BEGIN                                                                   11470000
   DITP(DSAVE).BLOCKRD:=0;                                              11475000
   DBCNTP:=DBCNTP+DCNTP;  <<DATA IS BEING READ BY 1ST SIO PROG>>        11480000
   TOS:=DITP(DBLKTAIL);                                                 11485000
   DITP(X):=0;                                                          11490000
   WA0(DITP(DTAIL)):=S0;                                                11495000
   DITP(DTAIL):=TOS;                                                    11500000
   J:=DITP(DRBCT)-DBCNTP;                                               11505000
   IF J < TBMAXB THEN DCNTP:=J    <<BYTE COUNT FOR CURRENT SIO PROG>>   11510000
      ELSE                                                              11515000
   BEGIN                                                                11520000
      DCNTP:=TBMAXB;                                                    11525000
      BUILD2SIO;                                                        11530000
   END;                                                                 11535000
END;   <<-------------------END OF SERV2FULL------------------->>       11540000
                                                                        11545000
                                                                        11550000
                                                                        11555000
SUBROUTINE ALLREAD;                                                     11560000
BEGIN                                                                   11565000
   DBCNTP:=DBCNTP+DCNTP;                                                11570000
   IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                     11575000
      ELSE                                                              11580000
   BEGIN                                                                11585000
      IF NOT WAITFORCR THEN READDONE(0) <<CLEANUPRD,DO CR/LF>>          11590000
         ELSE                                                           11595000
      BEGIN                                                             11600000
         X:=DITP(DSTOP);                                                11605000
         TOS:= IF = THEN CRWAITLF                                       11610000
                    ELSE CRWAIT;                                        11615000
         DITP(DTYPE).PAIRCODE:=TOS;                                     11620000
         LOOKFORCR;                                                     11625000
      END;                                                              11630000
   END;                                                                 11635000
   ASMB(IXIT);                                                          11640000
END;    <<------------------END OF ALLREAD------------------->>         11645000
                                                                        11650000
                                                                        11655000
                                                                        11660000
                                                                        11665000
                                                                        11670000
                                                                        11675000
SUBROUTINE CONTINUERD;                                                  11680000
BEGIN                                                                   11685000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>11690000
      IF WA0(SIOADDR+RDDATAINSTR+1) = 0 THEN ALLREAD           <<04836>>11695000
      ELSE I := RDWAIT  END                                    <<04836>>11700000
   ELSE BEGIN                                                  <<04836>>11705000
      IF NOT DITPL(DSAVE).BLOCKRD THEN                                  11710000
      BEGIN       <<1ST SIO PROG ACTIVE READING>>                       11715000
         IF WA0(SIOADDR+RDDATAINSTR+1)=0 THEN                           11720000
         BEGIN    <<FINISHED FILLING 1ST TBUF>>                         11725000
            IF DITP(DRBCT)<=DBCNTP+DCNTP THEN ALLREAD;                  11730000
            SERV1FULL;    <<SET UP 2ND SIO PROG TO CONTINUE RD>>        11735000
            I:=WAIT2SIO;  <<ENABLE RECV SRQ,THEN TO BLOCKWAIT>>         11740000
         END                                                            11745000
            ELSE                                                        11750000
            I:=RDWAIT;                                                  11755000
      END                                                               11760000
         ELSE                                                           11765000
      BEGIN     <<2ND SIO PROG ACTIVE READING>>                         11770000
         IF WA0(SIOADDR+BLOCKMODRD+1)=0 THEN                            11775000
         BEGIN                                                          11780000
            IF DITP(DRBCT)<=DBCNTP+DCNTP THEN ALLREAD;                  11785000
            SERV2FULL;    <<SET UP 1ST SIO PROG TO CONTINUE RD>>        11790000
            I:=RDWAIT;    <<ENABLE SRQ,THEN WAIT SRQ>>                  11795000
         END                                                            11800000
            ELSE                                                        11805000
            I:=WAIT2SIO;                                                11810000
      END;                                                              11815000
   END;                                                        <<04836>>11820000
END;   <<------------------END OF CONTINUERD----------------->>         11825000
                                                                        11830000
                                                                        11835000
                                                                        11840000
                                                                        11845000
                                                                        11850000
                                                                        11855000
SUBROUTINE RESTARTSPDS;                                                 11860000
BEGIN                                                                   11865000
   X:=DITP.DSTATE;                                                      11870000
   IF = AND NOT DITPL(DCNTRL).SPDSIO THEN ASMB(IXIT);                   11875000
   <<IDLE WAIT PROG WAS ALREADY STOPPED,DO NOTHING>>                    11880000
   IF DITP.DSTATE=READING THEN CONTINUERD ELSE I:=RDWAIT;               11885000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              11890000
   DITP(DSPEED).ECHOON:=0;                                              11895000
   IF <> THEN TOS:=SYSDB+SIOADDR+( IF DITPL(DSAVE).BLOCKRD THEN WRT'RD2 11900000
                                      ELSE WRT'RD )                     11905000
      ELSE                                                              11910000
      TOS:=SYSDB+SIOADDR+I;                                             11915000
      DISABLE;                                                 <<04836>>11920000
   STARTSIO;                                                            11925000
   ASMB(IXIT);                                                 <<04836>>11930000
END;                                                                    11935000
                                                                        11940000
                                                                        11945000
                                                                        11950000
                                                                        11955000
                                                                        11960000
                                                                        11965000
                                                                        11970000
                                                                        11975000
                                                                        11980000
                                                                        11985000
SUBROUTINE STRTSIORD (STARTLOC);                                        11990000
VALUE STARTLOC;    INTEGER STARTLOC;                                    11995000
BEGIN                                                                   12000000
   TOS:=DITP;                                                           12005000
   TOS.NEWLINE:=0;                                                      12010000
   TOS.PAIR:=0;                                                         12015000
   IF <> AND DITP(DTYPE).PAIRCODE=DC2PAIR THEN                          12020000
      TOS.PAIR:=1;      <<XOFF,DELETE,CRWAIT OR CRWAITLF>>              12025000
   DITP:=TOS;                                                           12030000
   WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0]; <<READ DATA CHANNEL INSTR>>     12035000
   I:=X+1;                                                              12040000
   IF DITP(DRBCT)=0 THEN                                                12045000
   BEGIN            <<NO READ BYTE COUNT SPECIFIED>>                    12050000
      IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                  12055000
         ELSE                                                           12060000
         READDONE(0);                                                   12065000
      ASMB(IXIT);                                                       12070000
   END                                                                  12075000
      ELSE                                                              12080000
   BEGIN                                                                12085000
      TEMP:=IF DITPL.SPOOLING THEN SBUFMAXB ELSE TBMAXB;                12090000
      J:=TEMP - (DBCNTP MOD TEMP);  <<REMAINING ROOM IN TBUF>>          12095000
      K:=DITP(DRBCT) - DBCNTP;    <<BYTES REMAINING TO BE READ>>        12100000
      TOS:=IF K <= J THEN K ELSE J;                                     12105000
      IF NOT DITPL.SPOOLING THEN DCNTP:=S0;                             12110000
      WA0(I):=TOS;     <<CHANNEL INSTR BYTE COUNT>>                     12115000
      I:=X+1;                                                           12120000
      IF NOT DITPL.SPOOLING AND K>J THEN PREFETCH                       12125000
         ELSE                                                           12130000
      WA0(I):=[8/32,8/1];  <<FROM 96 TO 128 TO INTERRUPT>>              12135000
      WA0(I+1):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                       12140000
                                 ELSE [1/1,1/0,14/0];                   12145000
      <<IF ODD BYTES REMAINING,NEXT BYTE GOES TO RIGHT HALF>>           12150000
                                                                        12155000
      IF DITPL.SPOOLING THEN                                            12160000
         WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTBUF)                  12165000
         ELSE                                                           12170000
     BEGIN                                                              12175000
      IF DBCNTP MOD TBMAXB = 0 THEN                                     12180000
      BEGIN                                                             12185000
         TOS:=GETTBUF(SECONDARY);                                       12190000
         TOS:=S0;        TOS:=S0;                                       12195000
         IF = THEN                                                      12200000
         BEGIN           <<BANKRUPT>>                                   12205000
            DDEL;        DEL;                                           12210000
            SETREADERROR(IOQP,LOSTDATA);                                12215000
            ASMB(IXIT);                                                 12220000
                                                                        12225000
         END                                                            12230000
            ELSE                                                        12235000
         BEGIN                                                          12240000
            IF DBCNTP=0 THEN DITP(DHEAD):=TOS                           12245000
                        ELSE WA0(DITP(DTAIL)):=TOS;                     12250000
            DITP(DTAIL):=TOS;    <<LINK TO HEAD OF LIST>>               12255000
            X:=SIOADDR+RDDATAINSTR+4;                                   12260000
            WA0(X):=TOS+SYSDB+2;                                        12265000
                        <<TBUF STARTING ADDRESS>>                       12270000
         END;                                                           12275000
      END                                                               12280000
         ELSE                                                           12285000
      WA0(SIOADDR+RDDATAINSTR+4):=SYSDB+DITP(DTAIL)+2+                  12290000
                                  (DBCNTP MOD TBMAXB)&LSR(1);           12295000
     END;                                                               12300000
      WA0(SIOADDR+RDDATAINSTR+6):=RDSPECL; <<SPECL CHAR DETECTED >>     12305000
      WA0(SIOADDR+BLOCKMODRD+6):=RDSPECL;                               12310000
                                                                        12315000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   12320000
      BEGIN                                                             12325000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>12330000
         WA0(X:=X+1):=2;                                       <<04836>>12335000
         WA0(X:=X+1):=1;                                                12340000
         WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; << LEFT BYTE>>       <<04836>>12345000
         WA0(X:=X+1):=SYSDB+SIOADDR+4;  <<ETX BUFFER ADDRESS>>          12350000
         WA0(X:=X+1):=[8/1, 1/1, 7/2];                         <<04836>>12355000
         WA0(X:=X+1):=22;                                      <<04836>>12360000
         WA0(SIOADDR+4):=DC1'ETX;                              <<04836>>12365000
                                                               <<04836>>12370000
                                                               <<04836>>12375000
         IF DITP(DTYPE).TTYPE = NOPROTOCOL THEN BEGIN          <<04836>>12380000
             WA0(SIOADDR+WRTDATAINSTR+1) := 1;                 <<04836>>12385000
            WA0(X:=X+2) := [1/1,1/1,1/1,13/0];                 <<04836>>12390000
         END;                                                  <<04836>>12395000
      END;                                                     <<04836>>12400000
                                                               <<04836>>12405000
     BEGIN                                                              12410000
      X:=DBCNTP;                                                        12415000
      IF = THEN                                                         12420000
     BEGIN                                                              12425000
      IF DITPL(DMODEM).NOSYNC AND NOT DITPL(DMODEM).PRIMED THEN         12430000
      BEGIN                                                             12435000
         IF DITPL(DSPEED).TAPEMODE OR DITPL(DMODEM)&CSL(M202) OR        12440000
         IOQPL(QPAR2).OWNREAD OR DITP(DTYPE).TTYPE<>HP2640X OR          12445000
         DITP.(TERMCHAR':2)=READBINARY OR NOT DITPL(DSPEED).ECHO        12450000
         THEN                                                           12455000
         BEGIN                                                          12460000
            IF DITPL(DMODEM)&CSL(M202) THEN WA0(SIOADDR+5).(11:1):=0    12465000
               ELSE                                                     12470000
               WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                12475000
            DITP.PAIR:=1;                                               12480000
            DITP(DTYPE).PAIRCODE:=NODATAYET;                            12485000
         END                                                            12490000
            ELSE                                                        12495000
         BEGIN                                                          12500000
            WA0(SIOADDR+5).(11:1):=0;  <<TURN OFF INTERF CNTRL ECHO>>   12505000
            DITP.PAIR:=1;                                               12510000
            DITP(DTYPE).PAIRCODE:=NOECHO;                               12515000
            DCNTP:=1;       <<READ ONLY 1 BYTE>>                        12520000
            WA0(SIOADDR+RDDATAINSTR+1):=1;                              12525000
            WA0(X:=X+1):=[8/32,8/1];<<JMP FROM 96 TO 128:RDEXIT>>       12530000
         END;                                                           12535000
      END                                                               12540000
         ELSE                                                           12545000
      WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                         12550000
     END                                                                12555000
         ELSE                                                           12560000
      WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                         12565000
     END;                                                               12570000
   END;                                                                 12575000
   I:=SYSDB+SIOADDR+STARTLOC;                                           12580000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              12585000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>12590000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>12595000
   TOS:=I;                                                              12600000
   STARTSIO;                                                            12605000
   ASMB(IXIT);                                                          12610000
END;       <<------------------END OF STRTSIORD------------------->>    12615000
                                                                        12620000
                                                                        12625000
                                                                        12630000
                                                                        12635000
                                                                        12640000
                                                                        12645000
SUBROUTINE SENDDC1;                                                     12650000
BEGIN                                                                   12655000
   IF DITPL(DMODEM).PRIMED THEN BEGIN                          <<04836>>12660000
      STOPTIMEOUT(READTIMEOUT, DITP);<<STOP TIMER AT ENTER>>   <<04836>>12665000
      DITP(DRTMAX) := 0; << CLEAR REQUEST FOR A TIMER >>       <<04836>>12670000
      DITP(DBTIME) := BLOCKTIME;                               <<04836>>12675000
      STARTTIMEOUT(BLOCKTIMEOUT,DITP)  END;                    <<04836>>12680000
                                                                        12685000
   IF IOQP.RPLEVEL=NULL THEN                                            12690000
   BEGIN       <<OK TO DO TIMING OPERATIONS>>                           12695000
      STARTTIMEOUT(READTIMEOUT,DITP);                                   12700000
      <<TIMEOUT IF CALLER REQUESTED A READ TIME LIMIT>>                 12705000
      DITP(DTYPE).TIMEREAD:=0;                                          12710000
      IF <> THEN          <<TIME THE DURATION OF READ OPERATION>>       12715000
      BEGIN                                                             12720000
         DITP(DTYPE).TIMING:=1;                                         12725000
         DITPD(DRTIMED):=TIMER;                                         12730000
      END;                                                              12735000
   END;                                                                 12740000
                                                                        12745000
   DITP(DSPEED).RESTART:=0;                                             12750000
   DITP(DPNTR):=0;                                                      12755000
   IF NOT DITPL(DMODEM).PRIMED AND IOQP(QPAR2)&LSR(8)<>NULL AND NOT     12760000
   DITPL.SPOOLING THEN BEGIN                                            12765000
      WA0(SIOADDR+RDSTRT+6):=0;  <<DO NOT SKIP SEND DC1>>               12770000
      I:=RDSTRT;                                                        12775000
   END                                                                  12780000
      ELSE                                                              12785000
      I:=RECVOFF;                                                       12790000
   IF NOT DITPL(DMODEM)&CSL(M202) THEN                                  12795000
  BEGIN                                                                 12800000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; <<WRITE DATA INSTR >> <<04836>>12805000
   WA0(X:=X+1):=1;            <<WRITE 1 BYTE>>                          12810000
   WA0(X:=X+1):=1;                                                      12815000
   WA0(X:=X+1):=[1/1,1/1,1/1,13/0];    <<FROM RIGHT BYTE>>              12820000
   WA0(X:=X+1):=SYSDB+SIOADDR+9;    <<ADDR FOR SYNC,DC1>>               12825000
   WA0(X:=X+1):=[8/1,1/1,7/1];                                 <<04836>>12830000
                                                                        12835000
   WA0(X:=X+1):=9;                                             <<04836>>12840000
   IF DITPL(DMODEM).PRIMED THEN <<BLOCK MODE, CLEAR SPEC>>     <<04836>>12845000
      BEGIN                                                    <<04836>>12850000
      WA0(SIOADDR+12) := %15412; << ESCAPE AND LINE FEED >>    <<04836>>12855000
      WA0(X:=X+1) := ";:";                                     <<04836>>12860000
      WA0(SIOADDR+NEWSPECCHAR) := [8/4, 8/4];<<CLR SPEC CHAR>> <<04836>>12865000
      WA0(X:=X+1) := 4;                                        <<04836>>12870000
      WA0(X:=X+1) := 1;                                        <<04836>>12875000
      WA0(X:=X+1) := [1/1,1/0,1/1,3/0,10/0];<<LEFT BYTE, UPD>> <<04836>>12880000
      WA0(X:=X+1) := SYSDB + SIOADDR + 12;                     <<04836>>12885000
      WA0(X:=X+1) := [8/0, 8/0]; << JUMP TO OUTPUT DC1 >>      <<04836>>12890000
      WA0(X:=X+1) := RECVOFF - NEWSPECCHAR - 7;                <<04836>>12895000
      I := NEWSPECCHAR;                                        <<04836>>12900000
      END;                                                     <<04836>>12905000
   IF DITP(DTYPE).TTYPE=NOPROTOCOL THEN                        <<04836>>12910000
     BEGIN                                                     <<04836>>12915000
     DITP.DSTATE := READING;                                   <<04836>>12920000
     WA0(SIOADDR+WRTDATAINSTR) := [8/0,8/0]; <<JUMP DC1 >>     <<04836>>12925000
     WA0(X:=X+1) := 30;                                        <<04836>>12930000
     END                                                       <<04836>>12935000
     ELSE DITP.DSTATE := WRTSPECL;                             <<04836>>12940000
  END;                                                                  12945000
   STRTSIORD(I);              <<----SETREADING---->>                    12950000
END;      <<-----------------------END OF SENDDC1------------------->>  12955000
                                                                        12960000
                                                                        12965000
                                                                        12970000
                                                                        12975000
                                                                        12980000
SUBROUTINE SERVWAITCR;                                                  12985000
BEGIN                                                                   12990000
   IF LASTBYTE=CR THEN                                                  12995000
  BEGIN                                                                 13000000
   DITP(DSPEED).RESTART:=0;                                             13005000
   IF <> THEN                                                           13010000
   BEGIN                                                                13015000
      DITP.PAIR:=0;                                                     13020000
      SENDDC1;     <<SEND DC1 TO RESTART READ>>                         13025000
   END                                                                  13030000
      ELSE                                                              13035000
   IF DITP(DTYPE).PAIRCODE=CRWAIT THEN READDONE(1)  <<NO CR/LF>>        13040000
                                  ELSE READDONE(0); <<SEND LF>>         13045000
  END                                                                   13050000
      ELSE                                                              13055000
   RESTARTSPDS;                                                         13060000
END;                                                                    13065000
                                                                        13070000
                                                                        13075000
                                                                        13080000
                                                                        13085000
                                                               <<04836>>13090000
                                                               <<04836>>13095000
                                                               <<04836>>13100000
                                                               <<04836>>13105000
                                                               <<04836>>13110000
                                                               <<04836>>13115000
                                                               <<04836>>13120000
                                                               <<04836>>13125000
                                                               <<04836>>13130000
                                                               <<04836>>13135000
                                                                        13140000
                                                                        13145000
                                                                        13150000
                                                                        13155000
                                                                        13160000
SUBROUTINE DELETBUF;                                                    13165000
BEGIN                                                                   13170000
   TOS:=DITP(DBLKTAIL);                                                 13175000
   DITP(X):=0;                                                          13180000
   IF <> THEN RETURNTBUF (*)                                            13185000
         ELSE DEL;                                                      13190000
   IF DITPL(DSAVE).BLOCKRD THEN DITP(X).BLOCKRD:=0                      13195000
                           ELSE DITP(X).BLOCKRD:=1;                     13200000
         TOS:=DITP(DTAIL);                                              13205000
         X:=@DITP(DHEAD);                                               13210000
         WHILE S0 <> WA0(X) DO X:=WA0(X);                               13215000
               <<STEP DOWN TO THE LAST TBUF>>                           13220000
         TOS:=X;          <<POINTER TO LAST TBUF>>                      13225000
         WA0(X):=0;       <<CLEAR LINK TO CURRENT TBUF>>                13230000
         DITP(DTAIL):=TOS;                                              13235000
         DITP(DBLKTAIL):=TOS;                                           13240000
         DCNTP:=1;                                                      13245000
   IF DITPL(DSAVE).BLOCKRD THEN                                         13250000
   BEGIN                                                                13255000
      J:=SIOADDR+RDDATAINSTR+1;                                         13260000
      WA0(J):=WA0(J)+1;   <<RESTORE ORIGINAL BYTE COUNT>>               13265000
      WA0(X:=X+2):=[1/1,1/0,14/0]; <<1ST BYTE GOES TO LEFT>>            13270000
      WA0(SIOADDR+BLOCKMODRD+1):=1; <<RESET BYTE COUNT>>                13275000
      WA0(X:=X+1):=[8/4,8/1];  <<238 TO 242:INTERRUPT/NO HALT>>         13280000
   END                                                                  13285000
      ELSE                                                              13290000
   BEGIN                                                                13295000
      J:=SIOADDR+BLOCKMODRD+1;                                          13300000
      WA0(J):=WA0(J)+1;                                                 13305000
      WA0(X:=X+2):=[1/1,1/0,14/0];                                      13310000
      WA0(SIOADDR+RDDATAINSTR+1):=1;                                    13315000
      WA0(X:=X+1):=[8/125,8/1]; <<96 TO 221:NXTBLKRD>>                  13320000
   END;                                                                 13325000
   WA0(X:=X+1):=[1/1,1/1,14/0]; <<INTO RIGHT BYTE>>                     13330000
   J:=X+1;                                                              13335000
   WA0(J):=SYSDB+DITP(DTAIL)+1+TBMAXB/2;                                13340000
END;                                                                    13345000
                                                                        13350000
                                                                        13355000
                                                                        13360000
                                                                        13365000
                                                                        13370000
SUBROUTINE STARTREAD;                                                   13375000
BEGIN                                                                   13380000
   IF DITP.DSTATE=NULL THEN                                             13385000
   BEGIN                                                                13390000
      TOS:=DITPL LAND %174700;                                          13395000
      IF IOQP(QFUNC).FUNC=PTAPEFUNC THEN TOS.SPOOLING:=1                13400000
         ELSE                                                           13405000
      IF IOQP(QPAR2).BINARY <> 0 THEN TOS.BINARYREAD:=1                 13410000
         ELSE                                                           13415000
      BEGIN                                                             13420000
         IF IOQP(QPAR2)&LSR(8) <> NULL THEN                             13425000
         BEGIN                                                          13430000
            TOS.TERMCHAR:=1;                                            13435000
            WA0(SIOADDR+13).(8:8):=IOQP(QPAR2).(0:8);                   13440000
         END;                                                           13445000
         X:=DITP(DSTOP);                                                13450000
         IF <> AND DITP(DMODEM).TMODE=NULL THEN                         13455000
         BEGIN                                                          13460000
            TOS.TERMCHAR:=1;                                            13465000
            TOS.BINARYREAD:=1;                                          13470000
         END;                                                           13475000
      END;                                                              13480000
      DITP:=TOS;                                                        13485000
      @SAVEP:=DITP(DBREAK);                                             13490000
      IF <> AND DITP(DMODEM).TMODE=0 THEN                               13495000
      BEGIN         <<BEGIN WITH PREVIOUSLY SAVED DATA ALREADY READ>>   13500000
         DITP(DBREAK):=0;                                               13505000
         DBCNTP:=SAVEP;     <<RESTORE COUNT OF TOTAL BYTES READ>>       13510000
         MOVE DCNTP:=SAVEP(6),(4);  <<RESTORE DCNT,DHEAD,DTAIL,PNTR>>   13515000
         RETURNIOQ(SAVEP);                                              13520000
         IF DITP(DRBCT) <= DBCNTP THEN                                  13525000
         BEGIN             <<ENOUGH ALREADY READ>>                      13530000
            CLEANUPRD;                                                  13535000
            IOQP(QMISC).RSTATE := READING;<< NOT DONE YET>>    <<04836>>13540000
            DITP.DSTATE:=EORSYNC;                                       13545000
            SENDCRLF(NXTNULL,DITP);                                     13550000
            ASMB(IXIT);                                                 13555000
         END;                                                           13560000
      END;                                                              13565000
      IOQP(QMISC).RSTATE:=READING;                                      13570000
      SENDDC1;                                                          13575000
   END;                                                                 13580000
END;      <<-----------------END OF STARTREAD-------------------->>     13585000
                                                                        13590000
                                                                        13595000
                                                                        13600000
                                                                        13605000
                                                                        13610000
                                                                        13615000
                                                                        13620000
                                                                        13625000
SUBROUTINE SERVC'H;                                                     13630000
BEGIN                                                                   13635000
   DITP.PAIR:=0;                                                        13640000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  13645000
   X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD    <<GET SIO BYTE COUNT>>     13650000
                  THEN BLOCKMODRD ELSE RDDATAINSTR );                   13655000
   I:=DCNTP-WA0(X)-1;  <<COUNT OF DATA BYTES READ,EXCLUDING CH>>        13660000
   DBCNTP:=DBCNTP+I;   <<UPDATE NUMBER OF BYTES READ>>                  13665000
   IF DBCNTP <> 0 THEN                                                  13670000
   BEGIN              <<DATA HAS BEEN INPUT,OK TO DELETE>>              13675000
      X:=DBCNTP MOD TBMAXB;                                             13680000
      IF = THEN DELETBUF                                                13685000
         ELSE                                                           13690000
      DCNTP:=DCNTP-(I-1); <<NEW BYTE CNT=OLD CNT-BYTES INPUT>>          13695000
                                                                        13700000
      DBCNTP:=DBCNTP-1;   <<DECREMENT TOTAL BYTES READ>>                13705000
      J:=DBCNTP MOD TBMAXB;                                             13710000
      X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD            13715000
                                   ELSE RDDATAINSTR );                  13720000
      WA0(X):=DCNTP;                                                    13725000
      WA0(X:=X+2):=IF LOGICAL(J) THEN [1/1,1/1,14/0] <<RIGHT BYTE>>     13730000
                                 ELSE [1/1,1/0,14/0];<<LEFT BYTE>>      13735000
      K:=X+1;                                                           13740000
      WA0(K):=SYSDB+DITP(DTAIL)+2+J&LSR(1);                             13745000
      K:=DITP(DTYPE).DELECHO;                                  <<04836>>13750000
      X:=I;                                                             13755000
      IF <> AND K=2 OR K=3  THEN  <<SEND LF OR C'Y TO BACKSP>> <<04836>>13760000
      BEGIN                                                             13765000
         X := SIOADDR + 4;                                     <<04836>>13770000
         IF K = 3 THEN WA0(X) := CY'ETX                        <<04836>>13775000
                  ELSE WA0(X) := LF'ETX;                       <<04836>>13780000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>13785000
         WA0(X:=X+1):=1;                                                13790000
         WA0(X:=X+1):=1;                                                13795000
         WA0(X:=X+1):=[1/1, 1/0, 1/1, 13/0];                   <<04836>>13800000
         WA0(X:=X+1):=SYSDB+SIOADDR+4;                         <<04836>>13805000
         K:=X+1;                                                        13810000
         DITP.DSTATE := WRTSPECL;                              <<04836>>13815000
         IF DITPL(DMODEM)&CSL(M202) THEN                                13820000
         BEGIN                                                          13825000
            WA0(K):=[8/1,1/1,7/2];                                      13830000
            WA0(X:=X+1):=22; <<FINISHED WRT,STRT RD TURNAROUND>>        13835000
            WA0(X:=X-5) := 2;                                  <<04836>>13840000
            RDTOWRT;                                                    13845000
         END                                                            13850000
            ELSE                                                        13855000
        BEGIN                                                           13860000
         WA0(K) := [8/1,1/1,7/1];                              <<04836>>13865000
         WA0(X+1) := 9;                                        <<04836>>13870000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        13875000
         TOS:=SYSDB+SIOADDR+XMITON;                            <<04836>>13880000
         STARTSIO;                                                      13885000
        END;                                                            13890000
         ASMB(IXIT);                                                    13895000
      END                                                               13900000
         ELSE                                                           13905000
      RESTARTSPDS;      <<RESTART RD SIO PROG AT WAIT SRQ>>             13910000
      ASMB(IXIT);                                                       13915000
   END                                                                  13920000
      ELSE                                                              13925000
   BEGIN                <<NO DATA TO DELETE>>                           13930000
      J:=DBCNTP MOD TBMAXB;                                             13935000
      X:=SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD            13940000
                                             ELSE RDDATAINSTR);         13945000
      WA0(X):=DCNTP;                                                    13950000
      WA0(X:=X+2):=IF LOGICAL(J) THEN [1/1,1/1,14/0]                    13955000
                                 ELSE [1/1,1/0,14/0];                   13960000
      I:=X+1;                                                           13965000
      WA0(I):=SYSDB+DITP(DTAIL)+2+J&LSR(1);                             13970000
      IF DITP(DTYPE).DELECHO=3 THEN BEGIN                      <<04836>>13975000
                                    RESTARTSPDS;               <<04836>>13980000
                                    ASMB(IXIT);                <<04836>>13985000
                                    END;                       <<04836>>13990000
      WA0(SIOADDR+11) := SP'ETX;                               <<04836>>13995000
      WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRITE DATA INSTR>><<04836>>14000000
      WA0(X:=X+1):=1;                                                   14005000
      WA0(X:=X+1):=1;                                                   14010000
      WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<FROM LEFT BYTE>>             14015000
      WA0(X:=X+1):=SYSDB+SIOADDR+11;  <<ADDR FOR "SP">>                 14020000
      K:=X+1;                                                           14025000
      DITP.DSTATE := WRTSPECL;                                 <<04836>>14030000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   14035000
      BEGIN                                                             14040000
         WA0(K):=[8/1,1/1,7/2];                                         14045000
         WA0(X:=X+1):=22;   <<FINISHED WRT,STRT RD TURNAROUND>>         14050000
         WA0(X:=X-5) := 2;                                     <<04836>>14055000
         RDTOWRT;                                                       14060000
      END                                                               14065000
         ELSE                                                           14070000
     BEGIN                                                              14075000
      WA0(K) := [8/1,1/1,7/1];                                 <<04836>>14080000
      WA0(X+1) := 9;                                           <<04836>>14085000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           14090000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>14095000
      STARTSIO;                                                         14100000
     END;                                                               14105000
      ASMB(IXIT);                                                       14110000
   END;                                                                 14115000
END;       <<------------END OF SERVCH------------------>>              14120000
                                                                        14125000
                                                                        14130000
                                                                        14135000
                                                                        14140000
                                                                        14145000
                                                                        14150000
SUBROUTINE SPOOLBFULL;                                                  14155000
   BEGIN                                                                14160000
      DITP(DRQST).SPOOLSW:=1;                                           14165000
      IF <> THEN SETREADERROR(IOQP,LOSTDATA);                           14170000
      TOS:=DITPD(DTBUFD);                                               14175000
      ASMB(XCH);                                                        14180000
      DITPD(X):=TOS;                                                    14185000
      AWAKEIO(DITP,NOIMPEDE);                                           14190000
      DBCNTP:=DBCNTP+SBUFMAXB;                                          14195000
      IF < THEN BEGIN    DBCNTP:=%77777;                                14200000
                         SETREADERROR(IOQP,LOSTDATA);                   14205000
                END;                                                    14210000
      WA0(SIOADDR+RDDATAINSTR):=[8/3,8/0];                              14215000
      WA0(X:=X+1):=SBUFMAXB;                                            14220000
      WA0(X:=X+1):=[8/32,8/1];                                          14225000
                   <<JUMP FROM 96 TO 128:RDEXIT>>                       14230000
      WA0(X:=X+1):=[1/1,1/0,14/0];                                      14235000
      J:=X+1;                                                           14240000
      WA0(J):=SYSDB+DITP(DTBUF);                                        14245000
      RESTRTWAIT;                                                       14250000
   END;                                                                 14255000
                                                                        14260000
                                                                        14265000
                                                                        14270000
                                                                        14275000
SUBROUTINE NEWTBUFRD;                                                   14280000
BEGIN                                                                   14285000
   DITP.PAIR:=0;                                                        14290000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  14295000
   TOS:=GETTBUF(SECONDARY);                                             14300000
   TOS:=S0;                                                             14305000
   IF = THEN NOTBUF;                                                    14310000
   IF DBCNTP=0 THEN DITP(DHEAD):=TOS                                    14315000
               ELSE WA0(DITP(DTAIL)):=TOS;                              14320000
   DITP(DTAIL):=TOS;      <<LINK NEW TBUF TO LAST,UPDATE NEW TAIL>>     14325000
                                                                        14330000
   TEMP:=DITP(DRBCT)-DBCNTP;    <<REMAINING BYTES TO READ>>             14335000
   DCNTP:=IF TEMP<TBMAXB THEN TEMP ELSE TBMAXB;                         14340000
   X:=SIOADDR+RDDATAINSTR;                                              14345000
   WA0(X):=[8/3,8/0];      <<REGENERATE READ DATA CHANNEL INSTR>>       14350000
   WA0(X:=X+1):=DCNTP;      <<READ BYTE COUNT>>                         14355000
   I:=X+1;                                                              14360000
   IF TEMP > TBMAXB THEN PREFETCH                                       14365000
      ELSE                                                              14370000
   WA0(I):=[8/32,8/1];  <<JMP OF 32 TO 128 RDEXIT:INTRPT/CODE2>>        14375000
   WA0(I+1):=[1/1,1/0,14/0];   <<READ INTO LEFT HALF>>                  14380000
   I:=X+1;                                                              14385000
   WA0(I):=SYSDB+DITP(DTAIL)+2;                                         14390000
   WA0(SIOADDR+RDDATAINSTR+6):=RDSPECL;  <<PUT IN INTERRUPT CODE>>      14395000
   WA0(SIOADDR+BLOCKMODRD+6):=RDSPECL;                                  14400000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              14405000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>14410000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>14415000
   TOS:=SYSDB+SIOADDR+RDWAIT;                                           14420000
   STARTSIO;                                                            14425000
END;          <<--------------END OF NEWTBUFRD---------------->>        14430000
                                                                        14435000
                                                                        14440000
                                                                        14445000
                                                                        14450000
SUBROUTINE SIORESTART;                                                  14455000
BEGIN                                                                   14460000
   IF DITP.DSTATE=READING THEN CONTINUERD                               14465000
      ELSE                                                              14470000
   IF DITP.DSTATE=WRITING THEN                                          14475000
   BEGIN                                                                14480000
      IF DITPL.ENQACKWAIT OR DITPL(DTYPE).WAITXON OR STATREQ   <<04836>>14485000
         THEN                                                  <<04836>>14490000
      BEGIN                                                             14495000
         X:=WA0(SIOADDR+WRTDATAINSTR+1);  <<GET BYTE COUNT>>            14500000
      IF = OR DITPL(DTYPE).WAITXON AND NOT STATREQ             <<04836>>14505000
              THEN I:=RDWAIT                                   <<04836>>14510000
              ELSE I:=XMITON;                                  <<04836>>14515000
      END                                                               14520000
         ELSE                                                           14525000
         I:=XMITON;                                            <<04836>>14530000
   END                                                                  14535000
      ELSE                                                              14540000
   IF DITP.DSTATE=EORSYNC THEN I:=XMITON                       <<04836>>14545000
      ELSE                                                     <<04836>>14550000
   IF DITP.DSTATE=TURN202 THEN                                          14555000
      I:=RDWAIT+5    <<DO NOT ENABLE RECV SRQ>>                         14560000
      ELSE                                                              14565000
   IF DITP.DSTATE = NULL THEN                                  <<04836>>14570000
      BEGIN                                                    <<04836>>14575000
      IF STATREQ THEN                                          <<04836>>14580000
         BEGIN                                                 <<04836>>14585000
         IF WA0(SIOADDR+WRTDATAINSTR+1) > 0 THEN               <<04836>>14590000
            I := XMITON                                        <<04836>>14595000
         ELSE                                                  <<04836>>14600000
            I := RDWAIT;                                       <<04836>>14605000
         END                                                   <<04836>>14610000
      ELSE                                                     <<04836>>14615000
         BEGIN                                                 <<04836>>14620000
         IF NOT DITPL(DCNTRL).SPDSIO THEN                      <<04836>>14625000
            ASMB(IXIT)                                         <<04836>>14630000
         ELSE                                                  <<04836>>14635000
            I := RDWAIT;                                       <<04836>>14640000
         END;                                                  <<04836>>14645000
      END                                                      <<04836>>14650000
      ELSE                                                     <<04836>>14655000
   IF DITP.DSTATE = WRTSPECL THEN I:=XMITON                    <<04836>>14660000
      ELSE                                                     <<04836>>14665000
   IF DITP.DSTATE=REPEATING THEN I:=XMITON                     <<04836>>14670000
      ELSE                                                     <<04836>>14675000
      I:=RDWAIT;   <<RESUME READ OR IDLE WAIT>>                         14680000
   TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                              14685000
   X:=GETDRT(S0,DRT3).IDLESIO;                                 <<04836>>14690000
   IF <> THEN SUDDENDEATH(209);                                <<04836>>14695000
   TOS:=SYSDB+SIOADDR+I;                                                14700000
   DISABLE;                                                    <<04836>>14705000
   STARTSIO;                                                            14710000
   ASMB(IXIT);                                                          14715000
END;       <<----------------END OF SIORESTART----------------->>       14720000
                                                                        14725000
                                                                        14730000
                                                                        14735000
                                                                        14740000
                                                                        14745000
                                                                        14750000
                                                                        14755000
                                                                        14760000
SUBROUTINE SERVHIOP;                                                    14765000
BEGIN                                                                   14770000
   DITP(DLDEV).SIOHIOP:=0;                                              14775000
   IF = THEN        <<NOT HALTED BY THE BAD GUY>>                       14780000
   BEGIN                                                                14785000
                                                                        14790000
   TOS:=DITP(DCNTRL);                                                   14795000
   TOS.HIOPWAIT:=0;                                                     14800000
   TOS.SPDSIO:=0;                                                       14805000
   DITP(DCNTRL):=S0;                                                    14810000
   IF LS0.SPDSIO THEN                                                   14815000
   BEGIN         <<SPEED SENSE OR IDLE WAIT PROG WAS HALTED>>           14820000
      IF S0.NXTDSTATE=READING THEN STARTREAD                            14825000
         ELSE                                                           14830000
      IF S0.NXTDSTATE=WRITING THEN                                      14835000
         BEGIN                                                          14840000
            DITP(DRQST).STRTWRT:=1;                                     14845000
            AWAKETERMINAL(DITP);                                        14850000
         END                                                            14855000
         ELSE                                                           14860000
      IF S0.NXTDSTATE=EORSYNC THEN                                      14865000
      BEGIN                                                             14870000
         DITP.DSTATE:=EORSYNC;                                          14875000
         SENDCRLF(NXTNULL,DITP);                                        14880000
      END                                                               14885000
         ELSE                                                           14890000
      ASMB(HALT);                                                       14895000
                                                                        14900000
      ASMB(IXIT);                                                       14905000
   END;                                                                 14910000
   DEL;                                                                 14915000
   IF DITP.DSTATE=FINREAD THEN                                          14920000
   BEGIN             <<CLEAN UP READ OPERATION>>                        14925000
      <<READ ABORTED OR PREEMPTED>>                                     14930000
      I:=DITP(DCNTRL).NXTDSTATE;                                        14935000
      DITP(X).NXTDSTATE:=0;                                             14940000
      IF I=EORLF THEN                                                   14945000
      BEGIN      <<READ WAS ABORTED,IOTERM0 COULDN'T HALT SIO PROG>>    14950000
         CLEANUPRD;                                                     14955000
         DITP.DSTATE:=NULL;                                             14960000
         X:=@IOQP;                                                      14965000
         IF <> THEN AWAKETERMINAL(DITP);                                14970000
      END                                                               14975000
         ELSE                                                           14980000
      IF I=EORSYNC THEN                                                 14985000
      BEGIN    <<READ PREEMPTED,SIO PROG WAS NOT HALTED IMMEDIATELY>>   14990000
         CLEANUPRD;                                                     14995000
         DBCNTP:=1;      <<FAKE DBCNT TO RETURN TBUFS IN CASE 1ST TBUF>>15000000
         DITP.DSTATE:=EORSYNC;                                          15005000
         SENDCRLF(NXTNULL,DITP);     <<SEND CR/LF W/INTRPT CODE=3>>     15010000
      END                                                               15015000
         ELSE ASMB(HALT);                                               15020000
   END                                                                  15025000
      ELSE                                                              15030000
   IF DITP.DSTATE=WRITING THEN                                          15035000
   BEGIN          <<WRITE WAS ABORTED,IOTERM0 COULDN'T HALT SIO PROG>>  15040000
      DITP(DRQST).ABORTWRT:=1;    <<FLAG FOR IOTERM0 SERVICE>>          15045000
      DITP.DSTATE:=NULL;                                                15050000
      AWAKETERMINAL(DITP);                                              15055000
   END                                                                  15060000
      ELSE                                                              15065000
   IF DITP.DSTATE=SPDSENSIO THEN                                        15070000
   BEGIN                                                                15075000
      DITP.DSTATE:=NULL;                                                15080000
      X:=@IOQP;                                                         15085000
      IF <> THEN AWAKETERMINAL(DITP);                                   15090000
   END                                                                  15095000
      ELSE                                                              15100000
   ASMB(HALT);                                                          15105000
                                                                        15110000
   ASMB(IXIT);                                                          15115000
                                                                        15120000
   END;                                                                 15125000
END;         <<------------------END OF SERVHIOP----------------->>     15130000
                                                                        15135000
                                                                        15140000
SUBROUTINE WAIT'ON'MODEM;                                      <<04836>>15145000
   BEGIN                                                       <<04836>>15150000
   TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>15155000
   TOS := SYSDB + SIOADDR + SRQOFF;                            <<04836>>15160000
   STARTSIO;                                                   <<04836>>15165000
   END;                                                        <<04836>>15170000
                                                                        15175000
                                                                        15180000
SUBROUTINE STATUSRD;                                                    15185000
BEGIN                                                                   15190000
   K:=WA0(SIOADDR+10).OEPE;   <<GET DEVICE STATUS JUST READ>>           15195000
   IF <> AND (DITP.DSTATE <= WRTSPECL OR                       <<04836>>15200000
              DITP.DSTATE = REPEATING) THEN                    <<04836>>15205000
   BEGIN                                                                15210000
      IF LOGICAL( WA0(SIOADDR+10).OE ) THEN                             15215000
         SETREADERROR(IOQP,LOSTCHAR)                                    15220000
         ELSE                                                           15225000
      IF LOGICAL(WA0(X).PE) AND DITPL.PTYCHK THEN                       15230000
         SETREADERROR(IOQP,PTYERROR);                                   15235000
      SIORESTART;                                                       15240000
   END                                                                  15245000
      ELSE                                                              15250000
   BEGIN                                                                15255000
      DISABLE;                                                 <<04836>>15260000
      K:=WA0(SIOADDR+15);     <<GET MODEM STATUS JUST READ>>            15265000
      WA0(SIOADDR+15).(0:3):=0; <<SET MODEM REF BIT IN BYTE>>           15270000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           15275000
      TOS:=SYSDB+SIOADDR+MODSIOCNTRL+10;                                15280000
      STARTSIO;  <<UPDATE MODEM LINE REFERENCES>>                       15285000
      WA0(DITP(DILTP)) := 0; << CLEAR CPVA 0 TO IGNORE INT.>>  <<04836>>15290000
      J:=DITP(DMODEM);        <<SAVE OLD MODEM STATUS>>                 15295000
      DITP(DMODEM).CF:=K.MODCFREF;                                      15300000
      DITP(DMODEM).CB:=K.MODCBREF;                                      15305000
      DITP(DMODEM).SB:=K.MODSBREF;  <<UPDATE MODEM STATUS>>             15310000
      FLAG:=DITPL(DSAVE).CCVALUE XOR LOGICAL(K.MODCCREF);               15315000
      IF FLAG THEN                                                      15320000
      BEGIN      <<CC HAS CHANGED>>                                     15325000
         DITP(DCNTRL).SPDSIO:=0;                                        15330000
         DITP(DSAVE).CCVALUE:=K.MODCCREF;                               15335000
         TOS:=DITP(DRQST);                                              15340000
         IF DITPL(DSAVE).CCVALUE THEN TOS.DSETREADY:=1                  15345000
                            ELSE TOS.DISCONNECT:=1;                     15350000
         DITP(DRQST):=TOS;                                              15355000
         AWAKETERMINAL(DITP);                                           15360000
         ASMB(IXIT);                                                    15365000
      END;                                                              15370000
      TOS:=DITP(DSAVE).HSTATE;                                          15375000
      IF TOS<=LOGGINGON THEN                                            15380000
      BEGIN     <<ON LINE, OR LOGON IN PROGRESS>>                       15385000
         IF NOT DITPL(DMODEM)&CSL(M202) THEN BEGIN             <<04836>>15390000
         << FULL DUPLEX MODEM, CHECK ONLY CF (DCD) >>          <<04836>>15395000
            FLAG := LOGICAL(J.CF) XOR DITPL(DMODEM).CF;        <<04836>>15400000
            IF FLAG THEN   << CARRIER HAS ACTUALLY CHANGED >>  <<04836>>15405000
               BEGIN                                           <<04836>>15410000
               IF DITPL(DMODEM).CF THEN << CARRIER NOW THERE>> <<04836>>15415000
                  BEGIN                                        <<04836>>15420000
                  STOPTIMEOUT(CFAILTO, DITP);                  <<04836>>15425000
                  SIORESTART;                                  <<04836>>15430000
                  END                                          <<04836>>15435000
               ELSE     << CARRIER HAS FAILED >>               <<04836>>15440000
                  BEGIN                                        <<04836>>15445000
                  IF DITP.DSTATE = READING OR                  <<04836>>15450000
                     DITP.DSTATE = WRTSPECL OR                 <<04836>>15455000
                     DITP.DSTATE = REPEATING THEN              <<04836>>15460000
                     BEGIN                                     <<04836>>15465000
                     TOS := DITP(DIOQP);                       <<04836>>15470000
                     SETREADERROR(*, LOSTDATA);                <<04836>>15475000
                     IF DITP(DMONTR).CFAILCNT > 50 THEN        <<04836>>15480000
                        BEGIN                                  <<04836>>15485000
                        DITP(DRQST).DISCONNECT := 1;           <<04836>>15490000
                        AWAKETERMINAL(DITP);                   <<04836>>15495000
                        ASMB(IXIT);                            <<04836>>15500000
                        END;                                   <<04836>>15505000
                     DMONTRP.CFAILCNT := DMONTRP.CFAILCNT + 1; <<04836>>15510000
                     END;                                      <<04836>>15515000
                  STARTTIMEOUT(CFAILTO, DITP);                 <<04836>>15520000
                  WAIT'ON'MODEM;                               <<04836>>15525000
                  END;                                         <<04836>>15530000
               END                                             <<04836>>15535000
            ELSE   << MUST HAVE JUST BEEN A GLITCH >>          <<04836>>15540000
               SIORESTART;                                     <<04836>>15545000
            END                                                <<04836>>15550000
         ELSE << WE HAVE A HALF DUPLEX MODEM >>                <<04836>>15555000
            BEGIN                                              <<04836>>15560000
            CASE DITP(DMODEM).CF'CB'SB OF                      <<04836>>15565000
<<CF CB SB>>BEGIN                                              <<04836>>15570000
                                                               <<04836>>15575000
<< F  F  F >>  BEGIN << PHONE DISCONNECT; TRANSITION >>        <<04836>>15580000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>15585000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>15590000
                  THEN MODCONTROL(TRANSMIT, DITP)              <<04836>>15595000
               ELSE                                            <<04836>>15600000
                  WAIT'ON'MODEM;                               <<04836>>15605000
               END;                                            <<04836>>15610000
                                                               <<04836>>15615000
<< F  F  T >>  BEGIN <<TRANSITION FROM READ TO WRITE >>        <<04836>>15620000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>15625000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>15630000
                  THEN MODCONTROL(TRANSMIT', DITP)             <<04836>>15635000
               ELSE                                            <<04836>>15640000
                  WAIT'ON'MODEM;                               <<04836>>15645000
               END;                                            <<04836>>15650000
                                                               <<04836>>15655000
<< F  T  F >>  BEGIN << PHONE DISCONNECT; NOISE; BREAK >>      <<04836>>15660000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>15665000
               IF DITP.DSTATE = WRITING OR                     <<04836>>15670000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>15675000
                  DITP.DSTATE = REPEATING OR                   <<04836>>15680000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>15685000
                  DITPD(DRTIMED) := TIMER;                     <<04836>>15690000
               WAIT'ON'MODEM;                                  <<04836>>15695000
               END;                                            <<04836>>15700000
                                                               <<04836>>15705000
<< F  T  T >>  BEGIN << READY TO TRANSMIT DATA >>              <<04836>>15710000
               STOPTIMEOUT(CFAILTO, DITP);                     <<04836>>15715000
               IF DITP.DSTATE=TURN202 AND DSAVEPL.TURNTOWRITE  <<04836>>15720000
                  THEN BEGIN                                   <<04836>>15725000
                  STOPTIMEOUT(TURNTO, DITP);                   <<04836>>15730000
                  DITP.DSTATE := DITP(DCNTRL).NXTDSTATE;       <<04836>>15735000
                  DITPD(DRTIMED) := 0D;                        <<04836>>15740000
                  END;                                         <<04836>>15745000
               IF DITP.DSTATE = WRITING OR                     <<04836>>15750000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>15755000
                  DITP.DSTATE = REPEATING OR                   <<04836>>15760000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>15765000
                  BEGIN                                        <<04836>>15770000
                  IF BREAKOK(DITP) AND                         <<04836>>15775000
                     DITPD(DRTIMED) > 0D AND                   <<04836>>15780000
                     TIMER - DITPD(DRTIMED) > 50D THEN         <<04836>>15785000
                     BEGIN                                     <<04836>>15790000
                     DITPD(DRTIMED) := 0D;                     <<04836>>15795000
                     DITP(DSAVE).WAITEDSTATE := DITP;          <<04836>>15800000
                     DITP.DSTATE := WAITED;                    <<04836>>15805000
                     DITP(DRQST).BRKRQST := 1;                 <<04836>>15810000
                     AWAKETERMINAL(DITP);                      <<04836>>15815000
                     END                                       <<04836>>15820000
                  ELSE                                         <<04836>>15825000
                     BEGIN                                     <<04836>>15830000
                     DITPD(DRTIMED) := 0D;                     <<04836>>15835000
                     SIORESTART;                               <<04836>>15840000
                     END;                                      <<04836>>15845000
                  END                                          <<04836>>15850000
               ELSE IF DITP.DSTATE = READING THEN              <<04836>>15855000
                  BEGIN                                        <<04836>>15860000
                  DITPD(DRTIMED) := 0D;                        <<04836>>15865000
                  DSAVEPL.TURNTOWRITE := 0;                    <<04836>>15870000
                  DITP.DSTATE := TURN202;                      <<04836>>15875000
                  STARTTIMEOUT(TURNTO, DITP);                  <<04836>>15880000
                  MODCONTROL(READING, DITP);                   <<04836>>15885000
                  END                                          <<04836>>15890000
               ELSE                                            <<04836>>15895000
                  BEGIN                                        <<04836>>15900000
                  DITPD(DRTIMED) := 0D;                        <<04836>>15905000
                  SIORESTART;                                  <<04836>>15910000
                  END;                                         <<04836>>15915000
               END;                                            <<04836>>15920000
                                                               <<04836>>15925000
<< T  F  F >>  BEGIN << READY TO RECEIVE DATA >>               <<04836>>15930000
               IF DITP.DSTATE = READING AND CFAILTRLX <> 0 THEN<<04836>>15935000
                  BEGIN                                        <<04836>>15940000
                  TOS := DITP(DIOQP);                          <<04836>>15945000
                  SETREADERROR(*, LOSTDATA);                   <<04836>>15950000
                  IF DMONTRP.CFAILCNT > 50 THEN                <<04836>>15955000
                     BEGIN                                     <<04836>>15960000
                     STOPTIMEOUT(CFAILTO, DITP);               <<04836>>15965000
                     DITP(DRQST).DISCONNECT := 1;              <<04836>>15970000
                     AWAKETERMINAL(DITP);                      <<04836>>15975000
                     ASMB(IXIT);                               <<04836>>15980000
                     END;                                      <<04836>>15985000
                  DMONTRP.CFAILCNT := DMONTRP.CFAILCNT + 1;    <<04836>>15990000
                  END;                                         <<04836>>15995000
               STOPTIMEOUT(CFAILTO, DITP);                     <<04836>>16000000
               IF DITP.DSTATE = TURN202 AND                    <<04836>>16005000
                  NOT DSAVEPL.TURNTOWRITE THEN                 <<04836>>16010000
                  BEGIN                                        <<04836>>16015000
                  STOPTIMEOUT(TURNTO, DITP);                   <<04836>>16020000
                  DITP.DSTATE := DITP(DCNTRL).NXTDSTATE;       <<04836>>16025000
                  END;                                         <<04836>>16030000
               IF DITP.DSTATE = WRITING OR                     <<04836>>16035000
                  DITP.DSTATE = EORSYNC OR                     <<04836>>16040000
                  DITP.DSTATE = REPEATING OR                   <<04836>>16045000
                  DITP.DSTATE = WRTSPECL THEN                  <<04836>>16050000
                  BEGIN                                        <<04836>>16055000
                  DSAVEPL.TURNTOWRITE := 1;                    <<04836>>16060000
                  DITP.DSTATE := TURN202;                      <<04836>>16065000
                  STARTTIMEOUT(TURNTO, DITP);                  <<04836>>16070000
                  MODCONTROL(WRITING, DITP);                   <<04836>>16075000
                  END                                          <<04836>>16080000
               ELSE                                            <<04836>>16085000
                  SIORESTART;                                  <<04836>>16090000
               END;                                            <<04836>>16095000
                                                               <<04836>>16100000
<< T  F  T >>  BEGIN << TRANSITION; BAD MODEM; BAD TERMINAL >> <<04836>>16105000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>16110000
               WAIT'ON'MODEM;                                  <<04836>>16115000
               END;                                            <<04836>>16120000
                                                               <<04836>>16125000
<< T  T  F >>  BEGIN << BAD MODEM; RESET ON TERMINAL >>        <<04836>>16130000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>16135000
               DITP(DCNTRL).NXTDSTATE := DITP;                 <<04836>>16140000
               DSAVEPL.TURNTOWRITE := 1;                       <<04836>>16145000
               DITP.DSTATE := TURN202;                         <<04836>>16150000
               MODCONTROL(WRITING, DITP);                      <<04836>>16155000
               END;                                            <<04836>>16160000
                                                               <<04836>>16165000
<< T  T  T >>  BEGIN << TRANSITION FROM READ TO WRITE >>       <<04836>>16170000
               STARTTIMEOUT(CFAILTO, DITP);                    <<04836>>16175000
               WAIT'ON'MODEM;                                  <<04836>>16180000
               END;                                            <<04836>>16185000
                                                               <<04836>>16190000
            END;                                               <<04836>>16195000
         END;                                                  <<04836>>16200000
      END;                                                     <<04836>>16205000
   END;                                                                 16210000
END;          <<---------------END OF STATUSRD--------------------->>   16215000
                                                                        16220000
                                                                        16225000
                                                                        16230000
SUBROUTINE TBFULL;                                                      16235000
BEGIN                                                                   16240000
   IF DITPL(DLDEV).RDFLUSH THEN BEGIN                          <<04836>>16245000
      DITPL(DLDEV).RDFLUSH := 0;                               <<04836>>16250000
      RDCOMPLETE;                                              <<04836>>16255000
      ASMB(IXIT)  END;                                         <<04836>>16260000
   IF NOT DITPL.SPOOLING THEN                                           16265000
  BEGIN                                                                 16270000
   DBCNTP:=DBCNTP+DCNTP;   <<INCREMENT COUNT OF BYTES READ SO FAR>>     16275000
   IF DBCNTP>=DITP(DRBCT) THEN                                          16280000
   BEGIN           <<REQUESTED RD COUNT HAS BEEN SATISFIED>>            16285000
      IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                  16290000
         ELSE                                                           16295000
      BEGIN                                                             16300000
         IF NOT WAITFORCR THEN READDONE(0) <<CLEANUPRD,DO CR/LF         16305000
                                             OR LF IF NECESSARY>>       16310000
            ELSE                                                        16315000
         BEGIN                                                          16320000
            X:=DITP(DSTOP);  <<TEST FOR TRANSPARENT READ MODE>>         16325000
            TOS:= IF= THEN CRWAITLF  <<ECHO LF AFTER CR DETECTED>>      16330000
                      ELSE CRWAIT;   <<JUST WAIT FOR CR>>               16335000
            DITP(DTYPE).PAIRCODE:=TOS;                                  16340000
            LOOKFORCR;    <<START SIO PROG TO WAIT FOR CR>>             16345000
         END;                                                           16350000
      END;                                                              16355000
   END                                                                  16360000
      ELSE                                                              16365000
                                                                        16370000
   BEGIN                                                                16375000
      IF DITP(DTYPE).PAIRCODE=NOECHO AND DBCNTP=1 THEN                  16380000
      BEGIN    <<1ST BYTE RECVD WHEN ECHO WAS OFF>>                     16385000
         DITP(X).PAIRCODE:=0;   DITP.PAIR:=0;                           16390000
         WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];                 <<04836>>16395000
         WA0(X:=X+1):=1;   <<ECHO BACK CHAR JUST READ>>                 16400000
         WA0(X:=X+1):=1;                                                16405000
         WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<LEFT BYTE>>               16410000
         J:=X+1;                                                        16415000
         WA0(J):=SYSDB+DITP(DTAIL)+2;                                   16420000
         WA0(X:=X+1):=[8/0,8/0];                                        16425000
         WA0(X:=X+1):=25;                                      <<04836>>16430000
         TEMP:=DITP(DRBCT)-DBCNTP;                                      16435000
         DCNTP:=IF TEMP<TBMAXB THEN TEMP ELSE (TBMAXB-1);               16440000
         WA0(SIOADDR+RDDATAINSTR+1):=DCNTP;  <<RESTORE BYTE COUNT>>     16445000
         J:=X+1;  IF TEMP+1>TBMAXB THEN WA0(J):=[8/125,8/1]<<96 TO 221>>16450000
                                 ELSE WA0(J):=[8/32,8/1];<<96 TO 128>>  16455000
         WA0(X:=X+1):=[1/1,1/1,14/0]; <<NEXT BYTE GOES TO RIGHT>>       16460000
         J:=X+1;                                                        16465000
         WA0(J):=SYSDB+DITP(DTAIL)+2;                                   16470000
         WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                      16475000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        16480000
         TOS:=SYSDB+SIOADDR+RECVOFF; <<START AT XMIT SRQ ENABLE>>       16485000
         STARTSIO;                                                      16490000
         ASMB(IXIT);                                                    16495000
      END                                                               16500000
         ELSE                                                           16505000
      NEWTBUFRD;   <<GET A NEW TBUF TO CONTINUE READ OPERATION>>        16510000
   END;                                                                 16515000
  END                                                                   16520000
      ELSE                                                              16525000
   SPOOLBFULL;                                                          16530000
END;           <<-----------------END OF TBFULL----------------->>      16535000
                                                                        16540000
                                                                        16545000
                                                                        16550000
                                                                        16555000
                                                                        16560000
                                                                        16565000
SUBROUTINE FINCRLF;                                                     16570000
BEGIN                                                                   16575000
   IF DITP.DSTATE=EORSYNC THEN                                          16580000
   <<CR/LF WAS SENT TO CLEAN UP PREVIOUS OPERATION>>                    16585000
   BEGIN                                                                16590000
      DITP.DSTATE:=NULL;                                                16595000
      IDLEWAIT(DITP);   <<START IDLE WAIT SIO PROG>>                    16600000
      X:=@IOQP;                                                         16605000
      IF <> THEN BEGIN                                         <<04836>>16610000
         IF IOQP(QFUNC).FUNC = 0 << READ >> THEN BEGIN         <<04836>>16615000
            IF IOQP(QMISC).READSTOP <> 0 THEN                  <<04836>>16620000
               IOQP(QMISC).RSTATE := STOPPED                   <<04836>>16625000
            ELSE                                               <<04836>>16630000
               IOQP(QMISC).RSTATE := READCMPLTD;               <<04836>>16635000
            END;                                               <<04836>>16640000
         AWAKETERMINAL(DITP);                                  <<04836>>16645000
         END;                                                  <<04836>>16650000
   END                                                                  16655000
      ELSE                                                              16660000
   ASMB(HALT);                                                          16665000
END;                                                                    16670000
                                                                        16675000
                                                                        16680000
                                                                        16685000
SUBROUTINE TBEMPTY;                                                     16690000
BEGIN                                                                   16695000
   DBCNTP:=DBCNTP-DCNTP;   <<UPDATE COUNT OF REMAINING WRITE BYTES>>    16700000
   IF <= THEN                                                           16705000
   BEGIN                   <<NO MORE WRITE BYTES REMAINING>>            16710000
      DBCNTP:=0;                                                        16715000
                                                               <<04836>>16720000
      IF DITPL(DCNTRL).FILLING THEN                                     16725000
      BEGIN                <<IOTERM0 IS FILLING CURRENT TBUF>>          16730000
         DITP(DPNTR):=DITP(DPNTR)+DCNTP;                                16735000
                      <<UPDATE BYTE PNTR FOR IOTERM0 TO RESTART>>       16740000
         IF DITP(DPNTR) >= TBMAXB THEN BEGIN                   <<04836>>16745000
            DITP(DTANKB) := DITP(DTANKB) - TBMAXB;             <<04836>>16750000
            DITP(DPNTR) := 0;                                  <<04836>>16755000
            TOS := DITP(DHEAD);                                <<04836>>16760000
            DITP(DHEAD) := WA0(S0);                            <<04836>>16765000
            RETURNTBUF( * );                                   <<04836>>16770000
         END;                                                  <<04836>>16775000
         DCNTP:=-2;   <<SET FLAG TO INFORM IOTERM0 OF PAUSED WRT>>      16780000
      END                                                               16785000
         ELSE                                                           16790000
      BEGIN           <<WRITE OPERATION IS COMPLETED>>                  16795000
         DITP(DCNTRL).LFLAST:=0;                                        16800000
         IF <> THEN DITP.NEWLINE:=1;<<POSTSPACE LF HAS BEEN OUTPUT>>    16805000
         TOS:=DITP(DHEAD);    DITP(X):=0;                               16810000
         IF S0 <> 0 THEN                                       <<04836>>16815000
            RETURNTBUF( * )                                    <<04836>>16820000
         ELSE DEL;                                             <<04836>>16825000
         DITP(DTANKB):=0;                                               16830000
         DITP(DPNTR):=0;                                                16835000
         DITP.DSTATE:=NULL;                                             16840000
         <<**************CHECKTQUEUE******************>>                16845000
         DITP(DMODEM).WRTCOUNTED:=0;                                    16850000
         IF <> THEN WRTCOUNTER:=WRTCOUNTER-1;                           16855000
         <<DECREMENT NUMBER OF TERMINALS DOING FAST WRITE>>             16860000
         IF HP2631B AND DITPL(DLDEV).DOSTATREQ THEN            <<04836>>16865000
             BEGIN                                             <<04836>>16870000
             DCNTP := 0;                                       <<04836>>16875000
             STATREQUEST(DITP);                                <<04836>>16880000
             RETURN;                                           <<04836>>16885000
             END;                                              <<04836>>16890000
         X:=DITP(DRQST);                                                16895000
         IF = THEN                                                      16900000
         BEGIN                                                          16905000
            IF DITPL.ACTIVE THEN BEGIN                         <<04836>>16910000
               DITP.REQUEST := 1;                              <<04836>>16915000
               IDLEWAIT(DITP);                                 <<04836>>16920000
            END                                                <<04836>>16925000
            <<IOTERM0 CURRENTLY ACTIVE,SET FLAG TO REQUEST SERVICE>>    16930000
               ELSE                                                     16935000
            BEGIN                                                       16940000
               X:=@IOQP;                                                16945000
               IF <> AND IOQP(QMISC).RSTATE=READWAITING THEN            16950000
                  STARTREAD                                             16955000
                  ELSE                                                  16960000
               BEGIN                                                    16965000
                  X:=@IOQP;                                             16970000
                  IF = OR @IOQP<>0 AND NOT IOQPL(QMISC).(11:1)          16975000
                     THEN      <<NO REQUEST,OR NOT WAITING TO TANK>>    16980000
                  IDLEWAIT (DITP);                                      16985000
                  IF @IOQP <> 0 THEN AWAKETERMINAL(DITP);               16990000
               END;                                                     16995000
            END;                                                        17000000
         END;                                                           17005000
      END;                                                              17010000
   END                                                                  17015000
         ELSE                                                           17020000
      BEGIN       <<CURRENT TBUF HAS BEEN EMPTIED>>                     17025000
      IF DITP(DPNTR)+DCNTP >= TBMAXB THEN                               17030000
         BEGIN                                                          17035000
            DITP(DTANKB):=DITP(DTANKB)-TBMAXB;                          17040000
            <<UPDATE COUNT OF BYTES IN OUTSTANDING TBUFS>>              17045000
            DITP(DPNTR):=0;                                             17050000
            TOS:=DITP(DHEAD);          <<GET PNTR TO CURRENT TBUF>>     17055000
            DITP(DHEAD):=WA0(S0);    <<GET NEXT LINKED TBUF>>           17060000
            RETURNTBUF(*);                                              17065000
         END                                                            17070000
         ELSE                                                           17075000
            DITP(DPNTR):=DITP(DPNTR)+DCNTP; <<MORE IN CURRENT TBUF>>    17080000
                                                                        17085000
         X:=SIOADDR+WRTDATAINSTR;                                       17090000
         K:=X+1;                                                        17095000
         WA0(X):=[8/4,8/0];   <<REGENERATE WRITE DATA CHANNEL INSTR>>   17100000
         WA0(X:=X+2):=1;      <<BURST LENGTH=1>>                        17105000
         J:=X+1;                                                        17110000
         IF DITPL(DPNTR) THEN WA0(J):=[1/1,1/1,1/1,13/0]                17115000
                         ELSE WA0(J):=[1/1,1/0,1/1,13/0];               17120000
         WA0(J+1):=SYSDB+DITP(DHEAD)+2+DITP(DPNTR)&LSR(1);              17125000
         IF LOGICAL(WA0(DITP(DHEAD)+1).WRTENQ)  THEN                    17130000
         BEGIN        <<ENQ WAS IMBEDDED IN CURRENT TBUF>>              17135000
            WA0(X).WRTENQ:=0;                                           17140000
            J:=WA0(X).ENQOFFSET;  <<OFFSET OF ENQ IN TBUF>>             17145000
            DCNTP:=J+1-DITP(DPNTR);                                     17150000
            IF DCNTP<=0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);          17155000
            WA0(K):=DCNTP;                                              17160000
            WA0(X:=X+4):=[8/0,8/0];                                     17165000
            <<AFTER ENQ,JMP FROM 41 TO 71:DISABLE XMIT SRQ;RD ACK>>     17170000
            WA0(X:=X+1):=30;                                            17175000
            X:=SIOADDR+RDDATAINSTR;                                     17180000
            WA0(X):=[8/3,8/0];    <<GENERATE READ DATA CHENNEL INSTR>>  17185000
            WA0(X:=X+1):=1;       <<READ 1 BYTE>>                       17190000
            WA0(X:=X+1):=[8/%361,8/1];                                  17195000
                         <<TERMINATION JMP OF -15 BACK TO WAIT SRQ>>    17200000
            WA0(X:=X+1):=[1/1,1/1,4/1,10/0];  <<RIGHT BYTE,NO UPDATE>>  17205000
            WA0(X:=X+1):=SYSDB+SIOADDR+10;  <<BOTTOMLESS DATA DUMP>>    17210000
            DITP.ENQACKWAIT:=1;                                         17215000
            STARTTIMEOUT(HP2640TO,DITP);   <<SET TIMEOUT LIMIT=10SEC>>  17220000
                                                                        17225000
         END                                                            17230000
            ELSE                                                        17235000
         BEGIN                                                          17240000
            J:=TBMAXB-DITP(DPNTR);                                      17245000
            DCNTP:=IF J < DBCNTP THEN J                                 17250000
                                 ELSE DBCNTP;                           17255000
            IF DCNTP<=0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);          17260000
            WA0(K):=DCNTP;                                              17265000
            WA0(X:=X+4):=[8/1,1/1,7/1];                                 17270000
            <<INTERRUPT/HALT WITH CODE=1:TBUF EMPTY>>                   17275000
            WA0(X:=X+1):=1;                                             17280000
                                                                        17285000
         END;                                                           17290000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                        17295000
         X:=GETDRT(S0,DRT3).IDLESIO;                           <<04836>>17300000
         IF <> THEN SUDDENDEATH(209);                          <<04836>>17305000
          TOS := SYSDB + SIOADDR + WRTBASE;                    <<04836>>17310000
         STARTSIO;     <<START SIO AT WAIT SRQ>>                        17315000
      END;                                                              17320000
END;              <<------------END OF TBEMPTY------------->>           17325000
                                                                        17330000
                                                                        17335000
                                                                        17340000
                                                                        17345000
                                                                        17350000
                                                                        17355000
                                                                        17360000
                                                                        17365000
                                                                        17370000
                                                                        17375000
                                                                        17380000
                                                                        17385000
SUBROUTINE DELETEBYTE;                                                  17390000
BEGIN                                                                   17395000
   IF DITPL(DSAVE).BLOCKRD                                              17400000
      THEN J:=BLOCKMODRD                                                17405000
      ELSE J:=RDDATAINSTR;                                              17410000
   X:=SIOADDR+J+3;                                                      17415000
   RIGHT:=IF LOGICAL(WA0(X).(1:1)) THEN TRUE <<NXT BYTE GOES TO RIGHT>> 17420000
                                   ELSE FALSE;                          17425000
   IF RIGHT THEN                                                        17430000
      WA0(X).(1:1):=0   <<DELETE C'Y SO NEXT BYTE GOES TO LEFT>>        17435000
      ELSE                                                              17440000
   BEGIN                                                                17445000
      WA0(X).(1:1):=1;  <<C'Y NOW IN RIGHT,WHERE NEXT WILL GO>>         17450000
      I:=X+1;                                                           17455000
      WA0(I):=WA0(I)-1; <<DECREMENT TBUF ADDRESS>>                      17460000
   END;                                                                 17465000
   I:=SIOADDR+J+1;                                                      17470000
   WA0(I):=WA0(I)+1;    <<INCREMENT RD BYTE COUNT TO DELETE C'Y>>       17475000
END;                                                                    17480000
                                                                        17485000
                                                                        17490000
                                                                        17495000
SUBROUTINE SERVC'Y;                                                     17500000
BEGIN                                                                   17505000
   IF @IOQP<>0 AND DITP.DSTATE=READING THEN                             17510000
  BEGIN                                                                 17515000
   IF DITPL(DSAVE).BLOCKRD THEN                                         17520000
            J:=BLOCKMODRD                                               17525000
      ELSE  J:=RDDATAINSTR;                                             17530000
   K:=DCNTP-WA0(SIOADDR+J+1)-1;                                         17535000
   <<TOTAL NUMBER OF BYTES READ,EXCLUDING C'Y>>                         17540000
   DBCNTP:=DBCNTP+K;   <<UPDATE TOTAL BYTES READ>>                      17545000
   DCNTP:=DCNTP-K;     <<UPDATE REMAINING BYTES TO BE READ>>            17550000
  END;                                                                  17555000
   DITP(DSPEED).TAPEMODE:=0;                                            17560000
   IF <> OR NOT SSBREAKOK(DITP) THEN                                    17565000
   BEGIN                                                                17570000
      IF DITP.DSTATE=READING AND @IOQP<>0 THEN                          17575000
     BEGIN                                                              17580000
      IF DBCNTP=0 THEN                                                  17585000
      BEGIN                                                             17590000
         TOS:=DITP(DHEAD);   DITP(X):=0;                                17595000
         RETURNTBUF(*);                                                 17600000
         TOS:=DITP(DBLKTAIL);                                           17605000
         DITP(X):=0;                                                    17610000
         IF <> THEN RETURNTBUF (*)                                      17615000
               ELSE DEL;                                                17620000
         STRTSIORD(RDWAIT);   <<CONTINUE READ OPERATION>>               17625000
      END                                                               17630000
         ELSE                                                           17635000
                                                                        17640000
         DELETEBYTE;     <<DELETE C'Y FROM TBUF>>                       17645000
     END;                                                               17650000
         SIORESTART;     <<RESTART SIO PROG AT WAIT SRQ>>               17655000
                                                                        17660000
   END                                                                  17665000
      ELSE                                                              17670000
   BEGIN       <<OK TO ACCEPT C'Y>>                                     17675000
      DITP(DSAVE).WAITEDSTATE:=DITP;                                    17680000
      DITP.DSTATE:=WAITED;                                              17685000
      DITP(DRQST).SSBRQST:=1; <<SET BIT TO REQUEST IOTERM SERVICE>>     17690000
      AWAKETERMINAL(DITP);                                              17695000
      ASMB(IXIT);                                                       17700000
   END;                                                                 17705000
END;                                                                    17710000
                                                                        17715000
                                                                        17720000
                                                                        17725000
                                                                        17730000
                                                                        17735000
SUBROUTINE SERVWAITACK;                                                 17740000
BEGIN                                                                   17745000
   I:=WA0(SIOADDR+10).(9:7);                                            17750000
   WA0(X):=0;                                                           17755000
   IF I = ACK AND DITPL.ENQACKWAIT THEN                        <<04836>>17760000
   BEGIN                                                                17765000
                                                                        17770000
      DITP.ENQACKWAIT:=0;                                               17775000
      STOPTIMEOUT(HP2640TO,DITP);                                       17780000
      IF DITPL(DTYPE).WAITXON THEN RESTRTWAIT                  <<04836>>17785000
                              ELSE TBEMPTY;                    <<04836>>17790000
   END                                                                  17795000
      ELSE                                                              17800000
   IF I=XOFF THEN                                                       17805000
   BEGIN                                                                17810000
      STOPTIMEOUT(HP2640TO,DITP);                                       17815000
      DITP(DTYPE).WAITXON := 1;                                <<04836>>17820000
      RESTRTWAIT;                                                       17825000
   END                                                                  17830000
      ELSE                                                              17835000
   IF I=XON AND DITP(DTRLX).(0:8)=0 THEN                                17840000
   BEGIN                                                                17845000
      STOPTIMEOUT(XOFFTIMEOUT, DITP);                          <<04836>>17850000
      DITP(DTYPE).WAITXON := 0;                                <<04836>>17855000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>17860000
         BEGIN                                                 <<04836>>17865000
         STARTTIMEOUT(HP2640TO, DITP);                         <<04836>>17870000
         RESTRTWAIT;                                           <<04836>>17875000
         END                                                   <<04836>>17880000
      ELSE                                                     <<04836>>17885000
         TBEMPTY;                                              <<04836>>17890000
   END                                                                  17895000
      ELSE                                                     <<04836>>17900000
   IF I=CNTRLY THEN SERVC'Y                                    <<04836>>17905000
      ELSE                                                              17910000
   RESTRTWAIT;                                                          17915000
END;                                                                    17920000
                                                                        17925000
                                                                        17930000
                                                                        17935000
                                                                        17940000
                                                                        17945000
                                                                        17950000
                                                                        17955000
                                                                        17960000
SUBROUTINE SERVWAITC'A;                                                 17965000
BEGIN                                                                   17970000
   I:=LASTBYTE;                                                         17975000
   IF I=CNTRLA THEN                                                     17980000
   BEGIN                                                                17985000
                                                                        17990000
      IF DITPL(DTYPE).CONSINTRPT AND DITP(DLDEV).DLDEVN=CONSLDEV        17995000
         THEN AWAKE (PROGENPCBP, JUNKWAIT, NOWAIT);                     18000000
      RESTRTWAIT;                                                       18005000
   END                                                                  18010000
      ELSE IF NOT DITPL.UP THEN SPEEDSENSE ELSE                <<04836>>18015000
   IF I=CNTRLY THEN SERVC'Y                                             18020000
      ELSE IF I = XON AND DITPL(DTYPE).WAITXON THEN            <<04836>>18025000
   BEGIN                                                                18030000
      DITP(DTYPE).WAITXON:=0;                                  <<04836>>18035000
      STOPTIMEOUT(XOFFTIMEOUT, DITP);                          <<04836>>18040000
      WA0(SIOADDR+RDDATAINSTR+6) := WAITACK;                   <<04836>>18045000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>18050000
         BEGIN                                                 <<04836>>18055000
         STARTTIMEOUT(HP2640TO, DITP);                         <<04836>>18060000
         IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN              <<04836>>18065000
            TBEMPTY                                            <<04836>>18070000
         ELSE                                                  <<04836>>18075000
            RESTRTWAIT;                                        <<04836>>18080000
         END                                                   <<04836>>18085000
      ELSE                                                     <<04836>>18090000
         TBEMPTY;                                              <<04836>>18095000
   END                                                                  18100000
      ELSE                                                              18105000
   RESTRTWAIT;                                                          18110000
END;                                                                    18115000
                                                                        18120000
                                                                        18125000
                                                                        18130000
                                                                        18135000
                                                                        18140000
SUBROUTINE SERVNXTCRLF;                                                 18145000
BEGIN                                                                   18150000
   SENDCRLF(NXTRD,DITP);                                                18155000
   <<SEND CR/LF; WHEN COMPLETED, RESTART READ>>                         18160000
END;                                                                    18165000
                                                                        18170000
                                                                        18175000
                                                                        18180000
                                                                        18185000
                                                                        18190000
SUBROUTINE SERVNXTRD;                                                   18195000
BEGIN                                                                   18200000
   IF DITPL(DMODEM)&CSL(M202) THEN                                      18205000
   BEGIN                                                       <<04836>>18210000
     DITP.DSTATE := WRTSPECL;                                  <<04836>>18215000
     STRTSIORD(XMITON);                                        <<04836>>18220000
   END                                                         <<04836>>18225000
   ELSE                                                        <<04836>>18230000
   BEGIN                                                       <<04836>>18235000
     DITP.DSTATE := READING;                                   <<04836>>18240000
     STRTSIORD(WRT'RD);                                        <<04836>>18245000
   END;                                                        <<04836>>18250000
                                                               <<04836>>18255000
END;                                                                    18260000
                                                                        18265000
                                                                        18270000
                                                               <<04836>>18275000
                                                               <<04836>>18280000
SUBROUTINE DELETEINPUT;                                        <<04836>>18285000
BEGIN                                                          <<04836>>18290000
   DBCNTP:=DCNTP:=0;                                           <<04836>>18295000
   DITP.PAIR:=0;                                               <<04836>>18300000
   DITPL(DSAVE).BLOCKRD:=0;                                    <<04836>>18305000
   X:=DITP(DHEAD);                                             <<04836>>18310000
   WHILE <> DO                                                 <<04836>>18315000
   BEGIN         <<RETURN ALL OUTSTANDING TBUFS>>              <<04836>>18320000
      TOS:=X;    <<GET POINTER TO HEAD OF LIST>>               <<04836>>18325000
      X:=WA0(X); <<GET POINTER TO NEXT>>                       <<04836>>18330000
      RETURNTBUF(*);                                           <<04836>>18335000
   END;                                                        <<04836>>18340000
   DITP(DHEAD) := 0;                                           <<04836>>18345000
   TOS:=DITP(DBLKTAIL);                                        <<04836>>18350000
   DITP(X):=0;                                                 <<04836>>18355000
   IF <> THEN RETURNTBUF (*)                                   <<04836>>18360000
         ELSE DEL;                                             <<04836>>18365000
END;                                                           <<04836>>18370000
                                                               <<04836>>18375000
                                                               <<04836>>18380000
                                                                        18385000
                                                                        18390000
SUBROUTINE SERVC'X;                                                     18395000
BEGIN                                                                   18400000
   DELETEINPUT;                                                <<04836>>18405000
   X:=DITP(DSPEED);                                                     18410000
   IF < OR DITPL(DMODEM).PRIMED THEN                                    18415000
   BEGIN         <<TAPEMODE OR BLOCK MODE READ>>                        18420000
      IF NOT DITPL(DMODEM).NOSYNC OR DITPL(DMODEM).PRIMED AND           18425000
      DITP(DTYPE).TTYPE=HP2640X THEN                                    18430000
      BEGIN      <<WAIT FOR CR TO RESTART READ>>                        18435000
         DITP(DSPEED).RESTART:=1;                                       18440000
         DITP(DTYPE).PAIRCODE:=CRWAIT;                                  18445000
         LOOKFORCR;                                                     18450000
         ASMB(IXIT);                                                    18455000
      END                                                               18460000
         ELSE                                                           18465000
      NEWTBUFRD;  <<GET A NEW TBUF TO CONTINUE READ>>                   18470000
   END                                                                  18475000
      ELSE                                                              18480000
   IF DITPL(DLDEV).NO'CX'ECHO THEN                                      18485000
      STRTSIORD(RDWAIT)  <<SUPPRESS ECHO,GO RESTART READ AGAIN>>        18490000
      ELSE                                                              18495000
   BEGIN                                                                18500000
      DITP.DSTATE:=REPEATING;  <<ECHO !!!,CR/LF THEN RESTART RD>>       18505000
      WA0(SIOADDR+12):="!!";                                            18510000
      WA0(X:=X+1).(0:8):="!";                                           18515000
      WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];<<WRITE DATA INSTR>><<04836>>18520000
      WA0(X:=X+1):=3;       <<WRITE BYTE COUNT>>                        18525000
      WA0(X:=X+1):=1;                                                   18530000
      WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<START FROM LEFT>>            18535000
      WA0(X:=X+1):=SYSDB+SIOADDR+12;                                    18540000
      WA0(X:=X+1):=[8/1,1/1,7/1];  <<INTRPT/HALT,CODE TO CPVA1>>        18545000
      WA0(X:=X+1):=NXTCRLF; <<INTRPT CODE: SEND CR/LF NEXT>>            18550000
      IF DITPL(DMODEM)&CSL(M202) THEN                                   18555000
         RDTOWRT    <<START WRITE TURNAROUND>>                          18560000
         ELSE                                                           18565000
     BEGIN                                                              18570000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                           18575000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>18580000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>18585000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>18590000
                                                               <<04836>>18595000
      STARTSIO;                                                         18600000
     END;                                                               18605000
   END;                                                                 18610000
   ASMB(IXIT);                                                          18615000
END;                                                                    18620000
                                                                        18625000
                                                                        18630000
                                                                        18635000
                                                                        18640000
                                                                        18645000
SUBROUTINE EORFOUND;                                                    18650000
BEGIN                                                                   18655000
   IF DITPL(DSAVE).BLOCKRD                                              18660000
      THEN K:=BLOCKMODRD                                                18665000
      ELSE K:=RDDATAINSTR;                                              18670000
   DBCNTP:=DBCNTP+DCNTP-WA0(SIOADDR+K+1);<<INCLUDE EOR>>                18675000
   SETREADERROR(IOQP,SPECIALSTOP);                                      18680000
   IF NOT WAITFORCR THEN READDONE(1); <<DO NOT SEND CR/LF>>             18685000
   DITP.PAIR:=1;                                                        18690000
   DITP(DTYPE).PAIRCODE:=CRWAIT;                                        18695000
   LOOKFORCR;                                                           18700000
END;                                                                    18705000
                                                                        18710000
                                                                        18715000
                                                                        18720000
                                                                        18725000
SUBROUTINE CHECKEOR;                                                    18730000
BEGIN                                                                   18735000
   DITP.PAIR:=0;                                                        18740000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  18745000
   IF DITPL.(TERMCHAR':1) AND IOQP(QPAR2)&LSR(8)=I AND I<>0             18750000
      THEN EORFOUND                                                     18755000
      ELSE                                                              18760000
   RESTARTSPDS;                                                         18765000
END;                                                                    18770000
                                                                        18775000
                                                                        18780000
                                                                        18785000
                                                                        18790000
SUBROUTINE SERVDC2;                                                     18795000
BEGIN                                                                   18800000
   I:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD                     18805000
                            THEN BLOCKMODRD ELSE RDDATAINSTR ));        18810000
   IF DITP(DTYPE).PAIRCODE=NODATAYET OR                        <<04836>>18815000
      AUTOHANDSH AND NOT DITPL(DMODEM).PRIMED THEN             <<04836>>18820000
   BEGIN                                                                18825000
      DITP(DTYPE).PAIRCODE := DC2PAIR;                         <<04836>>18830000
                                                                        18835000
      X:=I-1;                                                           18840000
      IF = AND NOT IOQPL(QPAR2).OWNREAD OR AUTOHANDSH THEN     <<04836>>18845000
      BEGIN    <<DC2 WAS IST BYTE READ AND NOT OWN HANDSHAKE>>          18850000
         IF I>1 THEN               <<GARBAGE BEFORE DC2>>      <<04836>>18855000
            BEGIN                                              <<04836>>18860000
              DELETEINPUT;  <<RETURN ALL TBUFS>>               <<04836>>18865000
              TOS:=GETTBUF(SECONDARY);                         <<04836>>18870000
              TOS:=S0;                                         <<04836>>18875000
              IF = THEN                                        <<04836>>18880000
                 BEGIN  <<NONE AVAILABLE>>                     <<04836>>18885000
                   DDEL;  <<CLEAN UP STACK>>                   <<04836>>18890000
                   SETREADERROR(IOQP,LOSTDATA);                <<04836>>18895000
                   ASMB(IXIT);                                 <<04836>>18900000
                 END                                           <<04836>>18905000
               ELSE                                            <<04836>>18910000
                 BEGIN                                         <<04836>>18915000
                   DITP(DHEAD):=TOS;   <<DBCNT=0, 1ST TBUF>>   <<04836>>18920000
                   DITP(DTAIL):=TOS;                           <<04836>>18925000
                 END;                                          <<04836>>18930000
            END;                                               <<04836>>18935000
         DITP(DMODEM).PRIMED:=1;                                        18940000
         READBLOCK;                                                     18945000
      END;                                                              18950000
   END;                                                                 18955000
   DBCNTP:=DBCNTP+I;                                                    18960000
   DCNTP:=DCNTP-I;                                                      18965000
   DITP.PAIR:=1;                                                        18970000
   DITP(DTYPE).PAIRCODE:=DC2PAIR;                                       18975000
   RESTARTSPDS;                                                         18980000
END;                                                                    18985000
                                                                        18990000
                                                                        18995000
                                                                        19000000
                                                                        19005000
SUBROUTINE SERVESC;                                                     19010000
BEGIN                                                                   19015000
   DITP.PAIR:=0;                                                        19020000
   IF <> THEN DITP(DTYPE).PAIRCODE:=0;                                  19025000
   TESTBIT TERMCHAR');                                                  19030000
   IF <> AND IOQP(QPAR2)&LSR(8)=I THEN EORFOUND                         19035000
      ELSE                                                              19040000
   BEGIN                                                                19045000
      CONTINUERD;                                                       19050000
      I:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN             19055000
                     BLOCKMODRD ELSE RDDATAINSTR ));                    19060000
      DBCNTP:=DBCNTP+I;                                                 19065000
      DCNTP:=DCNTP-I;                                                   19070000
      WA0(X:=X+5) := ESCSEQ;                                   <<04836>>19075000
      TOS := X - 16 + SYSDB; << READ WAIT INSTRUCTION >>       <<04836>>19080000
      TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                <<04836>>19085000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>19090000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>19095000
      ASMB(XCH); << PUT THE VALUES IN THE RIGHT ORDER >>       <<04836>>19100000
      STARTSIO;                                                <<04836>>19105000
   END;                                                                 19110000
END;                                                                    19115000
                                                                        19120000
                                                                        19125000
                                                                        19130000
                                                                        19135000
SUBROUTINE SERVCR;                                                      19140000
BEGIN                                                                   19145000
   I:=DITP(DTYPE).PAIRCODE;                                             19150000
   DITP(X).PAIRCODE:=0;    DITP.PAIR:=0;                                19155000
      K:=IF DITPL(DSAVE).BLOCKRD                                        19160000
         THEN BLOCKMODRD                                                19165000
         ELSE RDDATAINSTR;                                              19170000
      J:=DCNTP-WA0(SIOADDR+K+1)-1;                                      19175000
         <<BYTE COUNT EXCLUDING CR>>                                    19180000
      IF I=DC2PAIR THEN                                                 19185000
      BEGIN                                                             19190000
         IF J=0 THEN   <<CR FOLLOWING DC2>>                             19195000
            IF IOQPL(QPAR2).OWNREAD THEN READDONE(0)                    19200000
            ELSE                                                        19205000
         BEGIN      <<DELETE EVERYTHING READ SO FAR>>                   19210000
            X:=DITP(DHEAD);                                             19215000
            WHILE <> DO                                                 19220000
            BEGIN                                                       19225000
               TOS:=X;                                                  19230000
               X:=WA0(X);                                               19235000
               RETURNTBUF(*);                                           19240000
            END;                                                        19245000
            DITP(DHEAD) := 0;                                  <<04836>>19250000
            DBCNTP:=DCNTP:=0;                                           19255000
            DITP(DMODEM).PRIMED:=1;                                     19260000
            SENDDC1;    <<RESTART READ>>                                19265000
         END;                                                           19270000
      END;              <<CR NOT FOLLOWING A DC2>>                      19275000
      DBCNTP:=DBCNTP+J;                                                 19280000
      READDONE(0);                                                      19285000
END;                                                                    19290000
                                                                        19295000
                                                                        19300000
                                                                        19305000
                                                                        19310000
SUBROUTINE PAIRWAITCR;                                                  19315000
BEGIN                                                                   19320000
   IF I=CR THEN                                                         19325000
   BEGIN                                                                19330000
      IF J=CRWAIT THEN READDONE(1) <<SET NO CR/LF FLAG>>                19335000
         ELSE                                                           19340000
      IF J=CRWAITLF THEN READDONE(0); <<SEND CR/LF>>                    19345000
   END;                                                                 19350000
END;                                                                    19355000
                                                                        19360000
                                                                        19365000
                                                                        19370000
                                                                        19375000
                                                                        19380000
SUBROUTINE PAIRNOECHO;                                                  19385000
BEGIN                                                                   19390000
   IF I=DC2 THEN                                                        19395000
            BEGIN                                                       19400000
               DITP.PAIR:=1;                                            19405000
               DITP(DTYPE).PAIRCODE:=DC2PAIR;                           19410000
               DITP(DMODEM).PRIMED:=1;                                  19415000
               IF NOT IOQPL(QPAR2).OWNREAD THEN READBLOCK               19420000
                  ELSE                                                  19425000
               BEGIN                                                    19430000
                  DBCNTP:=DBCNTP+1;                                     19435000
                  DCNTP:=DCNTP-1;                                       19440000
                  RESTARTSPDS;                                          19445000
               END;                                                     19450000
            END                                                         19455000
               ELSE                                                     19460000
            BEGIN   <<PROCESS AS REGULAR SPECIAL CHAR>>                 19465000
               K:=DITP(DRBCT)-DBCNTP;                                   19470000
               DITP.DSTATE:=WRTSPECL;                          <<04836>>19475000
               DCNTP:=IF K<=TBMAXB THEN K ELSE TBMAXB;                  19480000
               WA0(SIOADDR+RDDATAINSTR+1):=DCNTP-1;                     19485000
               WA0(SIOADDR+5).(11:1):=DITP(DSPEED).ECHO;                19490000
               DITP(DSPEED).ECHOON:=1;                                  19495000
               WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0];           <<04836>>19500000
               WA0(X:=X+1):=1;                                          19505000
               WA0(X:=X+1):=1;                                          19510000
               WA0(X:=X+1):=[1/1,1/0,1/1,13/0]; <<FROM LEFT BYTE>>      19515000
               J:=X+1;                                                  19520000
               WA0(J):=SYSDB+DITP(DTAIL)+2;                             19525000
               WA0(X:=X+1):=[8/0,8/0]; << 41 TO 121 >>         <<04836>>19530000
               WA0(X:=X+1):=80;                                <<04836>>19535000
               WA0(SIOADDR+FINISEND+5):=[8/1,1/1,7/2];                  19540000
               WA0(X:=X+1):=RDSPECL;                                    19545000
               TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  19550000
               TOS:=SYSDB+SIOADDR+XMITON;                      <<04836>>19555000
               STARTSIO;                                                19560000
               ASMB(IXIT);                                              19565000
            END;                                                        19570000
END;     <<------------------END OF PAIRNOECHO------------------>>      19575000
                                                                        19580000
                                                                        19585000
                                                                        19590000
                                                                        19595000
                                                                        19600000
SUBROUTINE PAIRDC2P;                                                    19605000
BEGIN                                                                   19610000
   IF I=CR THEN                                                         19615000
   BEGIN                                                                19620000
      K:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN             19625000
                               BLOCKMODRD ELSE RDDATAINSTR ))-1;        19630000
      IF K=0 THEN                                                       19635000
                                                               <<04836>>19640000
         IF IOQPL(QPAR2).OWNREAD THEN READDONE(0)                       19645000
            ELSE                                                        19650000
                                                               <<04836>>19655000
                                                               <<04836>>19660000
                                                               <<04836>>19665000
      BEGIN                                                             19670000
         X:=DITP(DHEAD);                                                19675000
         WHILE <> DO                                                    19680000
         BEGIN                                                          19685000
            TOS:=X;                                                     19690000
            X:=WA0(X);                                                  19695000
            RETURNTBUF (*);                                             19700000
         END;                                                           19705000
         DITP(DHEAD) := 0;                                     <<04836>>19710000
         TOS:=DITP(DBLKTAIL);                                           19715000
         DITP(X):=0;                                                    19720000
         IF <> THEN RETURNTBUF (*)                                      19725000
               ELSE DEL;                                                19730000
         DBCNTP:=DCNTP:=0;                                              19735000
         DITP(DMODEM).PRIMED:=1;                                        19740000
         SENDDC1;                                                       19745000
      END;                                                              19750000
   END;                                                                 19755000
END;                                                                    19760000
                                                                        19765000
                                                                        19770000
                                                                        19775000
                                                                        19780000
                                                                        19785000
                                                                        19790000
SUBROUTINE SERVLF;                                             <<04836>>19795000
BEGIN                                                          <<04836>>19800000
   J:=IF DITPL(DSAVE).BLOCKRD THEN BLOCKMODRD ELSE RDDATAINSTR;<<04836>>19805000
   I:=SIOADDR + J + 1;                                         <<04836>>19810000
   WA0(I):=WA0(I)+1;  <<LF DELETED,MODIFY BYTE COUNT FOR 1 MORE BYTE>>  19815000
   I:=X+2;                                                     <<04836>>19820000
   RIGHT:=IF LOGICAL(WA0(I).(1:1)) THEN TRUE ELSE FALSE;       <<04836>>19825000
   WA0(I).(1:1):=IF RIGHT THEN 0 ELSE 1;                       <<04836>>19830000
   IF NOT RIGHT THEN WA0(I+1):=WA0(I+1)-1; <<BACK UP BUFFER ADDRESS>>   19835000
   IF DITPL(DMODEM).PRIMED THEN RESTRTWAIT;  <<RESTART READ>>  <<04836>>19840000
   WA0(SIOADDR+12):=%6403;    <<CR; ETX>>                      <<04836>>19845000
   WA0(SIOADDR+WRTDATAINSTR):=[8/4,8/0]; <<WRITE DATA INSTR >> <<04836>>19850000
   WA0(X:=X+1):=1;                                             <<04836>>19855000
   WA0(X:=X+1):=1;                                             <<04836>>19860000
   WA0(X:=X+1):=[1/1,1/0,1/1,13/0];   <<START FROM LEFT>>      <<04836>>19865000
   WA0(X:=X+1):=SYSDB+SIOADDR+12;                              <<04836>>19870000
   I:=X+1;                                                     <<04836>>19875000
   DITP.DSTATE := WRTSPECL;                                    <<04836>>19880000
   IF DITPL(DMODEM)&CSL(M202) THEN                             <<04836>>19885000
   BEGIN                                                       <<04836>>19890000
      WA0(I):=[8/1,1/1,7/2];          <<INTERRUPT/HALT>>       <<04836>>19895000
      WA0(X:=X+1):=22;                <<ETX SENT,START READ TURNAROUND>>19900000
      WA0(X:=X-5) := 2;                                        <<04836>>19905000
      RDTOWRT;                        <<START LINE TURNAROUND TO WRITE>>19910000
   END                                                         <<04836>>19915000
      ELSE                                                     <<04836>>19920000
   BEGIN                                                       <<04836>>19925000
      WA0(I) := [8/1,1/1,7/1];                                 <<04836>>19930000
      WA0(X+1) := 9;                                           <<04836>>19935000
      TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                  <<04836>>19940000
      X:=GETDRT(S0,DRT3).IDLESIO;                              <<04836>>19945000
      IF <> THEN SUDDENDEATH(209);                             <<04836>>19950000
      TOS:=SYSDB+SIOADDR+XMITON;                               <<04836>>19955000
      STARTSIO;                                                <<04836>>19960000
      ASMB(IXIT);                                              <<04836>>19965000
   END;                                                        <<04836>>19970000
END;             <<---------------END OF SERVLF---------------->>       19975000
                                                               <<04836>>19980000
                                                               <<04836>>19985000
                                                               <<04836>>19990000
                                                               <<04836>>19995000
                                                               <<04836>>20000000
                                                               <<04836>>20005000
SUBROUTINE SERVC'A;                                                     20010000
BEGIN                                                                   20015000
   IF DITP(DLDEV).DLDEVN<>CONSLDEV THEN SIORESTART                      20020000
      ELSE                                                              20025000
   BEGIN                                                                20030000
      IF DITPL(DTYPE).CONSINTRPT THEN                                   20035000
         AWAKE(PROGENPCBP,JUNKWAIT,NOWAIT);                             20040000
      DELETEBYTE;                                                       20045000
      RESTARTSPDS;                                                      20050000
   END;                                                                 20055000
END;                                                                    20060000
                                                                        20065000
                                                                        20070000
                                                                        20075000
                                                                        20080000
SUBROUTINE RSPECLCHAR;                                                  20085000
BEGIN                                                                   20090000
   IF NOT DITPL.UP THEN SPEEDSENSE                                      20095000
      ELSE                                                              20100000
  BEGIN                                                                 20105000
    IF DITP.DSTATE = WRTSPECL THEN                             <<04836>>20110000
       DITP.DSTATE := READING;                                 <<04836>>20115000
   I:=LASTBYTE;                                                         20120000
   IF DITP.(TERMCHAR':2)<>READBINARY AND                       <<04836>>20125000
     (NOT AUTOHANDSH OR DITPL.SPOOLING) THEN                   <<04836>>20130000
   BEGIN    <<NOT IN BINARY READ MODE>>                                 20135000
      IF DITPL.SPOOLING THEN                                            20140000
      BEGIN                                                             20145000
         IF I=CNTRLY THEN    <<END OF SPOOLING>>                        20150000
         BEGIN                                                          20155000
            DITP(DRQST).SPOOLEND:=1;                                    20160000
            READDONE(1);  <<DO NOT SEND CR/LF>>                         20165000
         END                                                            20170000
            ELSE                                                        20175000
         BEGIN                                                          20180000
            IF WA0(SIOADDR+RDDATAINSTR+1)=0 THEN                        20185000
               SPOOLBFULL                                               20190000
               ELSE                                                     20195000
               RESTRTWAIT;                                              20200000
         END;                                                           20205000
      END;                                                              20210000
      IF DITPL.PAIR AND %170000&CSL(DITP(DTYPE).PAIRCODE) THEN          20215000
      BEGIN  <<PAIRCODE=CRWAIT,CRWAITLF,NOECHO,DC2PAIR>>                20220000
         DITP.PAIR:=0;                                                  20225000
         J:=DITP(DTYPE).PAIRCODE;                                       20230000
         DITP(X).PAIRCODE:=0;                                           20235000
         X:=J-1;                                                        20240000
         CASE X OF                                                      20245000
         BEGIN                                                          20250000
            PAIRWAITCR;                                                 20255000
            PAIRWAITCR;                                                 20260000
            PAIRNOECHO;                                                 20265000
            PAIRDC2P;                                                   20270000
         END;                                                           20275000
      END;                                                              20280000
                                                                        20285000
      X:=DITP(DSTOP);                                                   20290000
      IF <> THEN                                                        20295000
      BEGIN     <<TRANSPARENT READ>>                                    20300000
         IF I=DITP(DSTOP).EORCHAR THEN                                  20305000
         BEGIN                                                          20310000
            IF DITPL(DSAVE).BLOCKRD                                     20315000
               THEN J:=DCNTP-WA0(SIOADDR+BLOCKMODRD+1)-1                20320000
               ELSE J:=DCNTP-WA0(SIOADDR+RDDATAINSTR+1)-1;              20325000
            DBCNTP:=DBCNTP+J;                                           20330000
            IF NOT WAITFORCR THEN READDONE(1);<<NO CR/LF>>              20335000
            DITP.PAIR:=1;                                               20340000
            DITP(DTYPE).PAIRCODE:=CRWAIT;                               20345000
            LOOKFORCR;                                                  20350000
         END                                                            20355000
            ELSE                                                        20360000
         IF I=CNTRLA THEN SERVC'A                                       20365000
            ELSE                                                        20370000
         IF I=DITP(DSTOP).SSBRKCHAR THEN SERVC'Y                        20375000
            ELSE                                                        20380000
         IF I=IOQP(QPAR2)&LSR(8) THEN EORFOUND                          20385000
            ELSE                                                        20390000
         RESTARTSPDS;  <<RESTART RD PROG AT RDWAIT>>                    20395000
      END                                                               20400000
         ELSE                                                           20405000
      BEGIN                                                             20410000
         X:=I-ESC;                                                      20415000
         IF <= AND NOT DITPL(DLDEV).RDFLUSH THEN               <<04836>>20420000
            CASE I OF                                                   20425000
            BEGIN                                                       20430000
               CHECKEOR;                                                20435000
               SERVC'A;                                                 20440000
               CHECKEOR;                                                20445000
               CHECKEOR;                                                20450000
               CHECKEOR;                                                20455000
               CHECKEOR;                                                20460000
               CHECKEOR;                                                20465000
               CHECKEOR;    <<%7>>                                      20470000
               SERVC'H;     <<%10>>                                     20475000
               CHECKEOR;                                                20480000
               SERVLF;      <<%12--LF>>                        <<04836>>20485000
               CHECKEOR;                                                20490000
               CHECKEOR;                                                20495000
               SERVCR;                                                  20500000
               CHECKEOR;                                                20505000
               CHECKEOR;                                                20510000
               CHECKEOR;                                                20515000
               CHECKEOR;    <<%21--XON>>                                20520000
               SERVDC2;                                                 20525000
               CHECKEOR;    <<%23--XOFF>>                               20530000
               CHECKEOR;                                                20535000
               CHECKEOR;                                                20540000
               CHECKEOR;                                                20545000
               CHECKEOR;    <<%27>>                                     20550000
               SERVC'X;     <<%30>>                                     20555000
               SERVC'Y;     <<%31>>                                     20560000
               CHECKEOR;                                                20565000
               SERVESC;     <<%33>>                                     20570000
            END                                                         20575000
               ELSE IF I=CR THEN SERVCR                        <<04836>>20580000
               ELSE                                                     20585000
            CHECKEOR;                                                   20590000
         END;                                                           20595000
      END                                                               20600000
         ELSE                                                           20605000
         BEGIN                                                 <<04836>>20610000
         IF AUTOHANDSH THEN                                    <<04836>>20615000
           BEGIN                                               <<04836>>20620000
           IF I = DC2 THEN SERVDC2 ELSE                        <<04836>>20625000
           IF I=CR AND NOT DITPL(DMODEM).PRIMED THEN SERVCR;   <<04836>>20630000
           END;                                                <<04836>>20635000
         CHECKEOR;   << BINARY READ IN PROGRESS >>             <<04836>>20640000
         END;                                                  <<04836>>20645000
   END;                                                                 20650000
END;                                                                    20655000
                                                                        20660000
                                                                        20665000
                                                                        20670000
                                                                        20675000
                                                                        20680000
SUBROUTINE SERVESCSEQ;                                                  20685000
BEGIN                                                                   20690000
   J:=DCNTP-WA0(SIOADDR+1+(IF DITPL(DSAVE).BLOCKRD THEN        <<04836>>20695000
                BLOCKMODRD ELSE RDDATAINSTR));                 <<04836>>20700000
   WA0(X:=X+5):=RDSPECL;                                       <<04836>>20705000
   I:=LASTBYTE;                                                         20710000
   TEMP:=";" - I;                                                       20715000
   IF ( = OR TEMP=1) AND J = 1 THEN                            <<04836>>20720000
   BEGIN         <<COLON OR SEMICOLON>>                                 20725000
      DITP(DSPEED).ECHO:=TEMP;                                          20730000
      X:=DBCNTP MOD TBMAXB;                                             20735000
      IF = THEN                                                         20740000
         DELETBUF                                                       20745000
         ELSE                                                           20750000
     BEGIN                                                              20755000
      DELETEBYTE;  <<DELETE COLON/SEMICOLON>>                           20760000
      DELETEBYTE;  <<DELETE ESC>>                                       20765000
                                                                        20770000
      DCNTP:=DCNTP+1;                                                   20775000
     END;                                                               20780000
      DBCNTP:=DBCNTP-1;   <<EXCLUDE ESC>>                               20785000
      WA0(SIOADDR+5).(11:1):=TEMP;                                      20790000
      DITP(DSPEED).ECHOON:=1;                                           20795000
      RESTARTSPDS;                                                      20800000
   END                                                                  20805000
      ELSE                                                              20810000
   RSPECLCHAR;                                                          20815000
END;                                                                    20820000
                                                                        20825000
                                                                        20830000
                                                                        20835000
                                                                        20840000
                                                                        20845000
SUBROUTINE SERVMODEM;                                                   20850000
BEGIN                                                                   20855000
   DITP.MODACTIVE:=0;                                                   20860000
   IF = THEN RETURN; << FROM STATUSRD, DON'T START IDLEREAD >> <<04836>>20865000
   DITP(DSAVE).ININ:=0;                                        <<04836>>20870000
   IF <> AND DITP(DLDEV).DLDEVN<>CONSLDEV.DLDEVN THEN          <<04836>>20875000
   BEGIN                                                       <<04836>>20880000
      IF DITP.DSTATE=WRITING THEN <<INTERRUPT CAUSED BY INIT>> <<04836>>20885000
      BEGIN                                                    <<04836>>20890000
         IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN              <<04836>>20895000
            I:=XMITON                                          <<04836>>20900000
            ELSE                                               <<04836>>20905000
         BEGIN                                                 <<04836>>20910000
            DITP.ENQACKWAIT:=0;  <<PFAIL RECOVERY>>            <<04836>>20915000
            STOPTIMEOUT(HP2640TO,DITP);                        <<04836>>20920000
            WA0(SIOADDR+WRTDATAINSTR+5):=[8/1,1/1,7/1];        <<04836>>20925000
            WA0(X:=X+1):=1;  <<TBUF EMPTY INTERRUPT>>          <<04836>>20930000
            I:=WRTDATAINSTR+5;  <<START SIO PROG TO INTERRUPT>><<04836>>20935000
         END;                                                  <<04836>>20940000
         TOS:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;               <<04836>>20945000
         TOS:=SYSDB+SIOADDR+I;                                 <<04836>>20950000
         STARTSIO;                                             <<04836>>20955000
         ASMB(IXIT);                                           <<04836>>20960000
      END;                                                              20965000
   END;                                                                 20970000
                                                                        20975000
   DITP(DCNTRL).DOMOD:=0;                                               20980000
   IF <> THEN                                                           20985000
   BEGIN     <<MODEM CONTROL WAS REQUESTED>>                            20990000
      TOS:=DITP(X).DONXTMOD;                                            20995000
      MODCONTROL(*,DITP);                                               21000000
      ASMB(IXIT);                                                       21005000
   END;                                                                 21010000
   IF NOT DITPL(DMODEM)&CSL(M202) THEN BEGIN                   <<04836>>21015000
                             K:=DITP(DSAVE).HSTATE;            <<04836>>21020000
                             IF K<>HANGUPTURN AND K<>HANGINGUP <<04836>>21025000
                                THEN IDLEWAIT(DITP);           <<04836>>21030000
                                END                            <<04836>>21035000
ELSE                                                           <<04836>>21040000
   BEGIN                                                       <<04836>>21045000
                                                               <<04836>>21050000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>21055000
   TOS := SYSDB + SIOADDR + SRQOFF;                            <<04836>>21060000
   STARTSIO;                                                   <<04836>>21065000
   END;                                                        <<04836>>21070000
   ASMB(IXIT);                                                          21075000
END;                                                                    21080000
                                                                        21085000
                                                                        21090000
SUBROUTINE SERVETXSENT;                                        <<04836>>21095000
   BEGIN                                                       <<04836>>21100000
   WA0(SIOADDR+SYNSTRT) := [8/2, 8/0];                         <<04836>>21105000
   WA0(X:=X+1) := 0;                                           <<04836>>21110000
   WA0(X:=X+1) := [8/1, 1/1, 7/2];                             <<04836>>21115000
   WA0(X:=X+1) := 30;                                          <<04836>>21120000
   TOS := WA0(DITP(DILTP) + ICNTRL).DRTNUMBER;                 <<04836>>21125000
   TOS := SYSDB + SIOADDR + SYNSTRT;                           <<04836>>21130000
   STARTSIO;                                                   <<04836>>21135000
   ASMB(IXIT);                                                 <<04836>>21140000
   END;                                                        <<04836>>21145000
                                                                        21150000
                                                                        21155000
SUBROUTINE SERVTURNTORD;                                                21160000
BEGIN                                                                   21165000
   STARTTIMEOUT(TURNTO, DITP);                                 <<04836>>21170000
   DITP(DSAVE).TURNTOWRITE:=0;                                          21175000
   DITP(DCNTRL).NXTDSTATE:=READING;                            <<04836>>21180000
   DITP.DSTATE:=TURN202;                                                21185000
   MODCONTROL(READING,DITP);                                   <<04836>>21190000
   ASMB(IXIT);                                                          21195000
END;                                                                    21200000
                                                                        21205000
                                                                        21210000
                                                                        21215000
                                                                        21220000
                                                                        21225000
SUBROUTINE SERVRDNULL;                                                  21230000
BEGIN                                                                   21235000
   IF DITP.(TERMCHAR':2)=READBINARY THEN RDCOMPLETE                     21240000
      ELSE                                                              21245000
   READDONE(0);                                                         21250000
END;                                                                    21255000
                                                                        21260000
                                                                        21265000
                                                                        21270000
                                                                        21275000
                                                                        21280000
                                                                        21285000
SUBROUTINE BREAK;                                                       21290000
BEGIN                                                                   21295000
   IF NOT DITPL.UP THEN SPEEDSENSE                                      21300000
      ELSE                                                              21305000
   BEGIN        <<BREAK WAS RECEIVED AND NOT IN SPEEDSENSE MODE>>       21310000
      J:=WA0(SIOADDR+10).(8:8);     <<GET CHAR FOR SCRUTINY>>           21315000
      IF J=NULL THEN                                                    21320000
      BEGIN                         <<FOR REAL!>>                       21325000
         IF NOT DITPL.SPOOLING AND BREAKOK(DITP) THEN                   21330000
         BEGIN                                                          21335000
            IF @IOQP<>0 AND DITP.DSTATE=READING THEN                    21340000
           BEGIN                                                        21345000
            K:=DCNTP-WA0(SIOADDR+1+( IF DITPL(DSAVE).BLOCKRD THEN       21350000
                         BLOCKMODRD ELSE RDDATAINSTR ));                21355000
            <<TOTAL NUMBER OF BYTES READ>>                              21360000
            DBCNTP:=DBCNTP+K;   <<UPDATE TOTAL BYTES READ>>             21365000
            DCNTP:=DCNTP-K;     <<UPDATE REMAINING BYTES TO READ>>      21370000
           END                                                          21375000
              ELSE                                                      21380000
            IF DITP.DSTATE=WRITING AND DITPL.ENQACKWAIT AND             21385000
               WA0(SIOADDR+WRTDATAINSTR+1)=0 THEN                       21390000
                  DITP(DSAVE).DELACK:=1;                                21395000
            DITP(DSAVE).WAITEDSTATE:=DITP;                              21400000
            DITP.DSTATE:=WAITED;                                        21405000
            DITP(DRQST).BRKRQST:=1;  <<SET FLAG TO REQUEST IOTERM0>>    21410000
            DITP(DCNTRL).SPDSIO:=0;  <<CLR IDLE WAIT PROG ACTIVE FLAG>> 21415000
            AWAKETERMINAL(DITP);     <<SERVICE AND AWAKE>>              21420000
         END                                                            21425000
            ELSE                                                        21430000
         SIORESTART;   <<IGNORE BREAK,RESTART SIO PROG>>                21435000
      END                                                               21440000
         ELSE                                                           21445000
      SIORESTART;                                                       21450000
   END;                                                                 21455000
END;        <<----------------------END OF BREAK------------------->>   21460000
                                                                        21465000
                                                                        21470000
                                                                        21475000
                                                                        21480000
                                                                        21485000
SUBROUTINE WSPECLCHAR;                                                  21490000
BEGIN                                                                   21495000
   IF WA0(SIOADDR+10).(9:7)=XON AND STATREQ THEN               <<04836>>21500000
     BEGIN                                                     <<04836>>21505000
                                                               <<04836>>21510000
     DITP(DTYPE).WAITXON := 0;                                 <<04836>>21515000
     STOPTIMEOUT(XOFFTIMEOUT, DITP);                           <<04836>>21520000
     TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                 <<04836>>21525000
     TOS := SYSDB + SIOADDR + XMITON ;                         <<04836>>21530000
     STARTSIO;  << RESTART STATUS REQUEST >>                   <<04836>>21535000
     RETURN;                                                   <<04836>>21540000
     END;                                                      <<04836>>21545000
   IF WA0(SIOADDR+10).(9:7)=CNTRLY                                      21550000
      THEN  SERVC'Y                                                     21555000
      ELSE                                                              21560000
   IF WA0(SIOADDR+10).(9:7)=XOFF THEN                                   21565000
   BEGIN                                                                21570000
       IF STATREQ THEN                                         <<04836>>21575000
         BEGIN                                                 <<04836>>21580000
                                                               <<04836>>21585000
         DITP(DTYPE).WAITXON := 1;                             <<04836>>21590000
         IF HP2631BFX THEN                                     <<04836>>21595000
            STARTTIMEOUT(XOFFTIMEOUT, DITP);                   <<04836>>21600000
         TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;             <<04836>>21605000
         TOS := SYSDB + SIOADDR + XMITON ;                     <<04836>>21610000
         STARTSIO;  << RESTART STATUS REQUEST >>               <<04836>>21615000
         RETURN;                                               <<04836>>21620000
         END;                                                  <<04836>>21625000
      IF DITP.DSTATE <> WRITING THEN SIORESTART;               <<04836>>21630000
      DCNTP:=DCNTP-WA0(SIOADDR+WRTDATAINSTR+1);<<BYTES WRITTEN>>        21635000
      IF DCNTP<0 OR DCNTP>TBMAXB THEN SUDDENDEATH(208);                 21640000
      WA0(SIOADDR+10) := 0;                                    <<04836>>21645000
      IF DITPL.ENQACKWAIT THEN                                 <<04836>>21650000
      BEGIN                                                             21655000
         STOPTIMEOUT(HP2640TO,DITP);                                    21660000
         X:=WA0(SIOADDR+WRTDATAINSTR+1);   IF <> THEN          <<04836>>21665000
         WA0(DITP(DHEAD)+1).WRTENQ:=1;                                  21670000
      END;                                                              21675000
      DITP(DTYPE).WAITXON:=1;                                  <<04836>>21680000
      IF HP2631B THEN                                          <<04836>>21685000
         BEGIN                                                 <<04836>>21690000
         IF HP2631BFX THEN                                     <<04836>>21695000
            BEGIN                                              <<04836>>21700000
            STARTTIMEOUT(XOFFTIMEOUT, DITP);                   <<04836>>21705000
            IDLEWAIT(DITP);                                    <<04836>>21710000
            DITP(DCNTRL).SPDSIO := 0;                          <<04836>>21715000
            END                                                <<04836>>21720000
         ELSE                                                  <<04836>>21725000
            STATREQUEST(DITP);                                 <<04836>>21730000
         END                                                   <<04836>>21735000
      ELSE   BEGIN                                             <<04836>>21740000
      IDLEWAIT(DITP);                                                   21745000
      DITP(DCNTRL).SPDSIO:=0;   <<ZAP THEM LITTLE BUGS>>                21750000
      END;                                                     <<04836>>21755000
   END                                                                  21760000
      ELSE                                                              21765000
   SIORESTART;                                                          21770000
END;                                                                    21775000
                                                                        21780000
                                                                        21785000
                                                                        21790000
                                                                        21795000
SUBROUTINE SERVCNTRL;                                                   21800000
BEGIN                                                                   21805000
   DITP.DSTATE:=NULL;                                                   21810000
   DITP(DSPEED).RESTSPD:=0;                                             21815000
   IF <> THEN IDLEWAIT (DITP);                                          21820000
   X:=@IOQP;                                                            21825000
   IF <> THEN AWAKETERMINAL (DITP);                                     21830000
   ASMB(IXIT);                                                          21835000
END;                                                                    21840000
                                                                        21845000
                                                                        21850000
                                                                        21855000
                                                                        21860000
SUBROUTINE SERVSPSENSE;                                        <<04836>>21865000
<< HANDLES INTERRUPTS FROM SPEEDSENSE, IDLE WAIT, AND STATUS >><<04836>>21870000
<< REQUEST CHANEL PROGRAMS >>                                  <<04836>>21875000
                                                               <<04836>>21880000
  BEGIN                                                        <<04836>>21885000
  IF DITPL.UP THEN                                             <<04836>>21890000
    BEGIN                                                      <<04836>>21895000
    TEMP := WA0(SIOADDR + 10).(9:7); << CHAR JUST READ >>      <<04836>>21900000
                                                               <<04836>>21905000
    IF TEMP = CNTRLY THEN                                      <<04836>>21910000
      BEGIN                                                    <<04836>>21915000
      SERVC'Y;                                                 <<04836>>21920000
      RETURN;                                                  <<04836>>21925000
      END;                                                     <<04836>>21930000
                                                               <<04836>>21935000
    IF TEMP = XON THEN                                         <<04836>>21940000
      BEGIN                                                    <<04836>>21945000
                                                               <<04836>>21950000
      DITPL(DTYPE).WAITXON := 0;                               <<04836>>21955000
      IF <> AND NOT STATREQ AND DITP.DSTATE=WRITING THEN       <<04836>>21960000
        BEGIN << RESTART WRITE >>                              <<04836>>21965000
        STOPTIMEOUT(XOFFTIMEOUT, DITP);                        <<04836>>21970000
        WA0(SIOADDR + RDDATAINSTR + 6) := WAITACK;             <<04836>>21975000
        IF DITPL.ENQACKWAIT THEN                               <<04836>>21980000
           BEGIN                                               <<04836>>21985000
           STARTTIMEOUT(HP2640TO, DITP);                       <<04836>>21990000
           IF WA0(SIOADDR+WRTDATAINSTR+1) <> 0 THEN            <<04836>>21995000
              TBEMPTY                                          <<04836>>22000000
           ELSE                                                <<04836>>22005000
              RESTRTWAIT;                                      <<04836>>22010000
           END                                                 <<04836>>22015000
        ELSE                                                   <<04836>>22020000
           TBEMPTY;                                            <<04836>>22025000
        END                                                    <<04836>>22030000
      ELSE                                                     <<04836>>22035000
        BEGIN                                                  <<04836>>22040000
        IF NOT STATREQ THEN IDLEWAIT(DITP) ELSE                <<04836>>22045000
          BEGIN << RESTART REQUEST STATUS WAIT >>              <<04836>>22050000
          STOPTIMEOUT(XOFFTIMEOUT, DITP);                      <<04836>>22055000
          TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;            <<04836>>22060000
          TOS := SYSDB + SIOADDR + RDWAIT ;                    <<04836>>22065000
          STARTSIO;  << RESTART STATUS READ >>                 <<04836>>22070000
          END;                                                 <<04836>>22075000
        END;                                                   <<04836>>22080000
      RETURN;                                                  <<04836>>22085000
      END; << XON >>                                           <<04836>>22090000
                                                               <<04836>>22095000
   IF TEMP = XOFF AND HP2631B THEN                             <<04836>>22100000
     BEGIN                                                     <<04836>>22105000
     DITPL(DTYPE).WAITXON := 1;                                <<04836>>22110000
                                                               <<04836>>22115000
     IF NOT STATREQ THEN BEGIN                                 <<04836>>22120000
        IF HP2631BFX THEN                                      <<04836>>22125000
           BEGIN                                               <<04836>>22130000
           STARTTIMEOUT(XOFFTIMEOUT, DITP);                    <<04836>>22135000
           IDLEWAIT(DITP);                                     <<04836>>22140000
           DITP(DCNTRL).SPDSIO := 0;                           <<04836>>22145000
           END                                                 <<04836>>22150000
        ELSE                                                   <<04836>>22155000
           STATREQUEST(DITP);                                  <<04836>>22160000
        END                                                    <<04836>>22165000
     ELSE                                                      <<04836>>22170000
       BEGIN << RESTART REQUEST STATUS WAIT >>                 <<04836>>22175000
       STARTTIMEOUT(XOFFTIMEOUT, DITP);                        <<04836>>22180000
       TOS := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;               <<04836>>22185000
       TOS := SYSDB + SIOADDR + RDWAIT ;                       <<04836>>22190000
       STARTSIO;  << RESTART STATUS READ >>                    <<04836>>22195000
       END;                                                    <<04836>>22200000
     RETURN;                                                   <<04836>>22205000
     END; << XOFF >>                                           <<04836>>22210000
                                                               <<04836>>22215000
  IF STATREQ THEN                                              <<04836>>22220000
    BEGIN << MUST BE RETURNED STATUS FROM DEVICE >>            <<04836>>22225000
    STATREQ := FALSE;                                          <<04836>>22230000
    STOPTIMEOUT(HP2640TO,DITP);                                <<04836>>22235000
    IF LOGICAL(TEMP).OFFLINE OR LOGICAL(TEMP).PAPEROUT THEN    <<04836>>22240000
      BEGIN                                                    <<04836>>22245000
      DITP(DTYPE).WAITXON := 1;                                <<04836>>22250000
                                                               <<04836>>22255000
      IF NOT IOMESSAGE (1,IF LOGICAL(TEMP).PAPEROUT THEN       <<04836>>22260000
      PAPOUTMSG ELSE NOTRDYMSG, %10000, DITP(DLDEV).DLDEVN,    <<04836>>22265000
      ,,,,OPCONSOLE) THEN                                      <<04836>>22270000
        BEGIN  << NO SYSTEM MESSAGE BUFFER  >>                 <<04836>>22275000
        END;                                                   <<04836>>22280000
      END;                                                     <<04836>>22285000
    IF LOGICAL(TEMP).TRANSERR AND @IOQP <> 0 THEN              <<04836>>22290000
      IOQP(QSTAT).IOSTAT := TRANSERR';                         <<04836>>22295000
    X := DITP(DBCNT);                                          <<04836>>22300000
    IF = AND @IOQP<>0 AND IOQP(QMISC).(12:4)=WAITING THEN      <<04836>>22305000
      BEGIN                                                    <<04836>>22310000
      DITP.DSTATE := NULL;                                     <<04836>>22315000
      DITP(DRQST).STATDONE := TRUE;                            <<04836>>22320000
      AWAKETERMINAL(DITP);                                     <<04836>>22325000
      END;                                                     <<04836>>22330000
    IF NOT DITPL(DTYPE).WAITXON THEN                           <<04836>>22335000
      BEGIN  << RESTART WRITE >>                               <<04836>>22340000
      TBEMPTY;                                                 <<04836>>22345000
      RETURN;                                                  <<04836>>22350000
      END;                                                     <<04836>>22355000
                                                               <<04836>>22360000
    IDLEWAIT(DITP);                                            <<04836>>22365000
    IF DITPL(DTYPE).WAITXON THEN DITP(DCNTRL).SPDSIO := 0;     <<04836>>22370000
    RETURN;                                                    <<04836>>22375000
    END;   << STATUS REQUEST REPLY >>                          <<04836>>22380000
                                                               <<04836>>22385000
    RESTARTSPDS;                                               <<04836>>22390000
    END                                                        <<04836>>22395000
                                                               <<04836>>22400000
  ELSE IF DITP(DMODEM).MODEM > 0 AND NOT DITPL(DSAVE).CCVALUE  <<04836>>22405000
     THEN RESTRTWAIT                                           <<04836>>22410000
                                                               <<04836>>22415000
  ELSE   SPEEDSENSE;  << DIT NOT UP >>                         <<04836>>22420000
                                                               <<04836>>22425000
  END;                                                         <<04836>>22430000
                                                                        22435000
                                                                        22440000
                                                                        22445000
<<*******************>>                                        <<04836>>22450000
<<  MAIN LINE        >>                                        <<04836>>22455000
<<*******************>>                                        <<04836>>22460000
                                                                        22465000
                                                                        22470000
@DITPL:=ILT(IDITP);       <<FORM DIT POINTER>>                          22475000
SIOADDR:=ILT(ISIOP);                                                    22480000
TOS:=%1000D;                                                            22485000
ASMB(XCHD);          <<SET DB TO SYSDB,SAME BANK>>                      22490000
@IOQPL:=DITP(DIOQP);                                                    22495000
@DBCNTP:=@DITPL+DBCNT;                                                  22500000
@DCNTP:=@DITPL+DCNT;                                                    22505000
@CPVAPL:=DITP(DILTP);                                                   22510000
                                                                        22515000
                                                                        22520000
DITP(DCNTRL).HIOPWAIT:=0;                                               22525000
IF <> THEN                                                              22530000
BEGIN     <<HIOP WAS ISSUED TO HALT SIO PROG>>                          22535000
   CPVAP(0):=0;                                                         22540000
   CPVAP(X:=X+1):=0;                                                    22545000
   CPVAP(X:=X+1):=0;                                                    22550000
   CPVAP(X:=X+1):=0;                                                    22555000
   ASMB(IXIT);                                                          22560000
END;                                                                    22565000
                                                                        22570000
IF CPVAP(0).(1:15) <> 0 THEN BEGIN                             <<04836>>22575000
   I := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER*4;                   <<04836>>22580000
   IF DITP.DSTATE = READING AND ABS(ABS(I)) = %1400 AND        <<04836>>22585000
      ABS(ABS(I) + 1) = 0 THEN BEGIN                           <<04836>>22590000
                                                               <<04836>>22595000
      SETREADERROR(IOQP, LOSTDATA);                            <<04836>>22600000
      CPVAP(0) := 0;                                           <<04836>>22605000
      KILLREAD  END                                            <<04836>>22610000
   ELSE IF CPVAP(0) = %160040 AND I.(11:3) = 3 THEN BEGIN      <<04836>>22615000
      CPVAP(0) := 0;                                           <<04836>>22620000
      @IOQPL := GETIOQ(2);    << GET DUMMY IOQ FOR LOGERROR >> <<04836>>22625000
      ASMB(TEST); << SEE IF WE GOT ONE >>                      <<04836>>22630000
      IF = THEN ASMB(IXIT); << IF NOT, JUST FORGET IT >>       <<04836>>22635000
      MOVE IOQP := 11(0);                                      <<04836>>22640000
      IOQP(QLDEV) := DITP(DLDEV).LDEVN; << BUILD DUMMY IOQ >>  <<04836>>22645000
      IOQP(QFUNC) := IOQP(QPAR1) := IOQP(QPAR2) := %160040;    <<04836>>22650000
      IOQP(QSTAT) := %124;    << FATAL SYSTEM ERROR >>         <<04836>>22655000
      LOGERROR(DITP, IOQP, 0);                                 <<04836>>22660000
      RETURNIOQ(IOQP);        << IT'S SERVED ITS PURPOSE >>    <<04836>>22665000
      DITP(DRQST).DISCONNECT := 1; << DISCONNECT THE TERMINAL>><<04836>>22670000
      IF DITPL.ACTIVE THEN                                     <<04836>>22675000
         DITP.REQUEST := 1                                     <<04836>>22680000
      ELSE                                                     <<04836>>22685000
         AWAKETERMINAL(DITP);                                  <<04836>>22690000
      ASMB(IXIT);                                              <<04836>>22695000
      END                                                      <<04836>>22700000
   ELSE                                                        <<04836>>22705000
      SUDDENDEATH(208)                                         <<04836>>22710000
   END;                                                        <<04836>>22715000
                                                                        22720000
IF CPVAP(3)<>0 THEN                                                     22725000
BEGIN                                                                   22730000
   I:=CPVAP(3).(8:8);                                                   22735000
   CPVAP(X):=0;                                                         22740000
   DITP.PAIR:=0;                                                        22745000
   DITP(DTYPE).PAIRCODE:=0;                                             22750000
   X:=I-1;                                                              22755000
   CASE X OF                                                            22760000
   BEGIN                                                                22765000
      SERV1FULL;                                                        22770000
      SERV2FULL;                                                        22775000
   END;                                                                 22780000
END;                                                                    22785000
                                                                        22790000
IF CPVAP(1)<>0 THEN                                                     22795000
BEGIN                                                                   22800000
   I:=CPVAP(1);                                                         22805000
   CPVAP(X):=0;                                                         22810000
   X:=DITP(DCNTRL);                                                     22815000
   IF < THEN SERVHIOP                                                   22820000
      ELSE                                                              22825000
   BEGIN                                                                22830000
      X:=I.(8:8)-1;                                                     22835000
      CASE X OF                                                         22840000
      BEGIN                                                             22845000
         TBEMPTY;     <<INTERRUPT DUE TO TBUF BEING EMPTIED>>           22850000
         TBFULL;      <<CAUSED BY TBUF BEING FILLED>>                   22855000
         FINCRLF;     <<CAUSED BY FINISH WRITING CR/LF>>                22860000
         SERVNXTCRLF; <<ECHOED !!! AFTER C'X>>                          22865000
         SERVNXTRD;   <<CR/LF SENT AFTER !!!>>                          22870000
         SERVSYNC'CR; <<SYNCS WERE SENT AFTER CR>>                      22875000
         SERVSYNC'LF; <<SYNCS WERE SENT AFTER LF>>                      22880000
         SERVSENDLF;  <<CR/SYNCS WERE SENT,LF/SYNCS NEXT>>     <<04836>>22885000
         RESTARTREAD; <<SPECIAL CHARS WRITTEN, RESTART READ>>  <<04836>>22890000
      END;                                                              22895000
   END;                                                                 22900000
END                                                                     22905000
   ELSE                                                                 22910000
IF CPVAP(2)<>0 THEN                                                     22915000
BEGIN                                                                   22920000
   I:=CPVAP(2).(8:8);                                                   22925000
   CPVAP(X):=0;                                                         22930000
   X:=DITP(DCNTRL);                                                     22935000
   IF < THEN SERVHIOP                                                   22940000
   ELSE                                                                 22945000
   BEGIN                                                                22950000
                                                                        22955000
      IF LOGICAL(I) THEN                                                22960000
      BEGIN           <<INTERRUPT CAUSED BY WRITE SIO PROG>>            22965000
         X:=I&LSR(1)-1;                                                 22970000
         CASE X OF                                                      22975000
         BEGIN                                                          22980000
            WSPECLCHAR;    <<SPECIAL CHAR DETECTED DURING WRITE>>       22985000
            BREAK;         <<POSSIBLE BREAK WAS RECEICED>>              22990000
            SUDDENDEATH(207);                                  <<04836>>22995000
         END;                                                           23000000
      END                                                               23005000
         ELSE                                                           23010000
      BEGIN                                                             23015000
         <<INTERRUPT CAUSED BY READ SIO PROG>>                          23020000
         X:=I&LSR(1)-1;                                                 23025000
         CASE X OF                                                      23030000
         BEGIN                                                          23035000
            RSPECLCHAR;    <<SPECL CHAR DETECTED DURING READING>>       23040000
            BREAK;                                                      23045000
            STATUSRD;        <<RSTATUS>>                                23050000
            SERVSPSENSE;    <<NON-SPECL CHAR RECVD DURING SPEEDSENSE>>  23055000
            ASMB(IXIT);  << DONE RESETTING SPEC CHARS >>       <<04836>>23060000
            SUDDENDEATH(207);                                  <<04836>>23065000
            SERVWAITCR;    <<WAITING FOR CR TO TERMINATE READ>>         23070000
            SERVWAITACK;   <<WAITING FOR ACK AFTER ENQ TO RESTART WRT>> 23075000
            SERVWAITC'A;   <<WAITING FOR C'A FROM SYS CONSOLE>>         23080000
            SERVCNTRL;     <<FINISHED SETTING BAUDRATE/MODEM CNTRL>>    23085000
            SERVETXSENT;                                       <<04836>>23090000
            SERVESCSEQ;                                                 23095000
            SERVMODEM;                                                  23100000
            SERVRDNULL;                                                 23105000
            SERVTURNTORD;                                      <<04836>>23110000
         END;                                                           23115000
      END;                                                              23120000
   END;                                                                 23125000
END;                                                                    23130000
                                                                        23135000
                                                                        23140000
                                                                        23145000
ASMB(IXIT);     <<FLY AWAY,JONATHAN>>                                   23150000
END;  <<--------------------END OF TIP----------------------->>         23155000
$PAGE "READ'DEVICE'REG"                                        <<04836>>23160000
LOGICAL PROCEDURE READ'DEVICE'REG(DRT, REG'NUM);               <<04836>>23165000
   VALUE DRT, REG'NUM;                                         <<04836>>23170000
   LOGICAL DRT, REG'NUM;                                       <<04836>>23175000
BEGIN                                                          <<04836>>23180000
   EQUATE                                                      <<04836>>23185000
      READ'COMMAND = 0;                                        <<04836>>23190000
                                                               <<04836>>23195000
TOS := DRT;                                                    <<04836>>23200000
TOS := READ'COMMAND CAT REG'NUM(4:12:4);                       <<04836>>23205000
ASSEMBLE(PCN);                                                 <<04836>>23210000
IF TOS = ICF'55                                                <<04836>>23215000
   THEN BEGIN                                                  <<04836>>23220000
   ASSEMBLE(RIOA);                                             <<04836>>23225000
   END                                                         <<04836>>23230000
  <<>>                                                         <<04836>>23235000
   ELSE BEGIN  <<NOT ICF55>>                                   <<04836>>23240000
   ASSEMBLE(OR; RIOC);                                         <<04836>>23245000
   END;                                                        <<04836>>23250000
IF = THEN READ'DEVICE'REG := TOS;   <<CAN DO MUCH ON FAILURE>> <<04836>>23255000
END;                                                           <<04836>>23260000
$PAGE "WRITE'DEVICE'REG"                                       <<04836>>23265000
PROCEDURE WRITE'DEVICE'REG(DRT, REG'NUM, DATA'OUT);            <<04836>>23270000
   VALUE DRT, REG'NUM, DATA'OUT;                               <<04836>>23275000
   LOGICAL DRT, REG'NUM, DATA'OUT;                             <<04836>>23280000
BEGIN                                                          <<04836>>23285000
   EQUATE                                                      <<04836>>23290000
      WRITE'COMMAND = 0;                                       <<04836>>23295000
ASSEMBLE(PCN);                                                 <<04836>>23300000
IF TOS = ICF'55                                                <<04836>>23305000
   THEN BEGIN                                                  <<04836>>23310000
   TOS := DRT;                                                 <<04836>>23315000
   TOS := WRITE'COMMAND CAT REG'NUM(4:12:4);                   <<04836>>23320000
   TOS := DATA'OUT;                                            <<04836>>23325000
   ASSEMBLE(WIOA);                                             <<04836>>23330000
   END                                                         <<04836>>23335000
  <<>>                                                         <<04836>>23340000
   ELSE BEGIN                                                  <<04836>>23345000
   TOS := WRITE'COMMAND CAT REG'NUM(4:12:4) LOR DRT;           <<04836>>23350000
   TOS := DATA'OUT;                                            <<04836>>23355000
   ASSEMBLE(WIOC);                                             <<04836>>23360000
   END;                                                        <<04836>>23365000
<<NO CHECK IF IT DOESN'T WORK>>                                <<04836>>23370000
END;                                                           <<04836>>23375000
$PAGE "CHANNEL'ID"                                             <<04836>>23380000
LOGICAL PROCEDURE CHANNEL'ID(LDEV);                            <<04836>>23385000
   VALUE LDEV; INTEGER LDEV;                                   <<04836>>23390000
BEGIN                                                          <<04836>>23395000
   EQUATE                                                      <<04836>>23400000
      CHANNEL'CONFIG = %(16)E,                                 <<04836>>23405000
      DIT'DILTP = 5,   <<OFFSET IN DIT TO ILT POINTER>>        <<04836>>23410000
      ILT'ICNTRL = 7;   <<OFFEST IN ILT OF DRT NUMBER>>        <<04836>>23415000
   DEFINE                                                      <<04836>>23420000
      DRT = (7:9)#;                                            <<04836>>23425000
   POINTER LPDT'INDEX = %10,                                   <<04836>>23430000
           SYSDB'INDEX = 0;                                    <<04836>>23435000
                                                               <<04836>>23440000
CHANNEL'ID:=READ'DEVICE'REG(SYSDB'INDEX(SYSDB'INDEX(LPDT'INDEX <<04836>>23445000
          (2*LDEV)+DIT'DILTP)+ILT'ICNTRL).DRT, CHANNEL'CONFIG);<<04836>>23450000
END;                                                           <<04836>>23455000
$PAGE "PRINTCHAR"                                              <<04836>>23460000
LOGICAL PROCEDURE PRINTCHAR(CHAR);                             <<04836>>23465000
VALUE CHAR;  INTEGER CHAR;                                              23470000
OPTION UNCALLABLE, PRIVILEGED;                                          23475000
<< THIS PROCEDURE OUTPUTS THE BYTE "CHAR" DIRECTLY TO THE               23480000
   SYSTEM CONSOLE, WHICH IS SPECIFIED IN SYSDB + %74  >>                23485000
                                                                        23490000
BEGIN   << START OF PRINT CHAR >>                              <<04836>>23495000
EQUATE                                                         <<04836>>23500000
   R0    = 0,                                                  <<04836>>23505000
   R1    = 1,                                                  <<04836>>23510000
   R2    = 2,                                                  <<04836>>23515000
   R3    = 3,                                                  <<04836>>23520000
   R4    = 4,                                                  <<04836>>23525000
   R5    = 5,                                                  <<04836>>23530000
   R6    = 6,                                                  <<04836>>23535000
   R7    = 7,                                                  <<04836>>23540000
   R8    = 8,                                                  <<04836>>23545000
   R9    = 9,                                                  <<04836>>23550000
   RA    = %(16)A,                                             <<04836>>23555000
   RB    = %(16)B,                                             <<04836>>23560000
   RC    = %(16)C,                                             <<04836>>23565000
   RD    = %(16)D,                                             <<04836>>23570000
   RE    = %(16)E,                                             <<04836>>23575000
   RF    = %(16)F;                                             <<04836>>23580000
EQUATE                                                         <<04836>>23585000
   BIT0 = %100000,                                             <<04836>>23590000
   BIT2 = %20000,                                              <<04836>>23595000
   B14'SET = 2,                                                <<04836>>23600000
   B14'CLEAR = 0,                                              <<04836>>23605000
   DMA'CONTROL = %100000,                                      <<04836>>23610000
   DMA'RIGHT = %40000,                                         <<04836>>23615000
   ENABLE'MASK = %177577,                                      <<04836>>23620000
   GO'LYNX = %(16)BF8D,                                        <<04836>>23625000
   PORT'HCP = 8,                                               <<04836>>23630000
   READ'DONE = 6,                                              <<04836>>23635000
   SIO'PORT = 4,                                               <<04836>>23640000
   WRITE'DONE = %16;                                           <<04836>>23645000
DEFINE   << DEFINES FOR LYNX REGISTERS >>                      <<04836>>23650000
   WRITE'DMA'ADDR      = R0#,                                  <<04836>>23655000
   WRITE'DMA'BANK       = R1#,                                 <<04836>>23660000
   CONTROL'DMA'ADDR     = R2#,                                 <<04836>>23665000
   CONTROL'DMA'BANK     = R3#,                                 <<04836>>23670000
   READ'DMA'ADDR        = R4#,                                 <<04836>>23675000
   READ'DMA'BANK        = R5#,                                 <<04836>>23680000
   TERM'INTRPT'REASON   = R6#,                                 <<04836>>23685000
   INTRPTS'NO'FLUSH     = R8#,                                 <<04836>>23690000
   PORT'POINTER         = R8#,                                 <<04836>>23695000
   INTRPTS'FLUSH        = R9#,                                 <<04836>>23700000
   BOARD'ENABLE         = R9#,                                 <<04836>>23705000
   DIAG'REGA            = RA#,                                 <<04836>>23710000
   DIAG'WRITE           = RA#,                                 <<04836>>23715000
   DIAG'REGB            = RB#,                                 <<04836>>23720000
   DIRECT'COMMAND       = RB#,                                 <<04836>>23725000
   DISABLE'INTRPTS = ASSEMBLE( SED 0 )#,                       <<04836>>23730000
   CHANNEL'CONFIG       = RE#,                                 <<04836>>23735000
   CHANNEL'CONFIG'2     = RF#;                                 <<04836>>23740000
LOGICAL   << NOTE !!! -DON'T MOVE Q+1 THROUGH Q+7 >>           <<04836>>23745000
   CHARACTER,                                                  <<04836>>23750000
   READ'BRK,                                                   <<04836>>23755000
   CP'PRINTCHAR := %(16)8409,                                  <<04836>>23760000
                               << 0:1 ENABLE TTY DELAYS   >>   <<04836>>23765000
                               << 1:1 DO FORM FEEDS       >>   <<04836>>23770000
                               << 2:1 DO XON/XOFF HANDSHAK>>   <<04836>>23775000
                               << 3:1 NOT USED            >>   <<04836>>23780000
                               << 4:4 OP CODE - SET PORTPC>>   <<04836>>23785000
                               << 8:1 USE 8 BIT CHARACTERS>>   <<04836>>23790000
                               << 9:1 GENERATE OUT PARITY >>   <<04836>>23795000
                               <<10:1 PARITY BIT CONTROL  >>   <<04836>>23800000
                               << ODD OR FORCED ONE       >>   <<04836>>23805000
                               <<11:1 DO PARITY CHECKING  >>   <<04836>>23810000
                               <<12:4 LINESPEED CODE      >>   <<04836>>23815000
   CP'PRINTCHAR1 := %(16)0101, <<                        >>    <<04836>>23820000
                               <<0:8 # CR DELAYS          >>   <<04836>>23825000
                               << 8:8 # LF DELAYS        >>    <<04836>>23830000
   CP'PRINTCHAR2 := %(16)0101, <<                         >>   <<04836>>23835000
                               << 0:8 # FF DELAYS         >>   <<04836>>23840000
                               << BEGIN WRITE             >>   <<04836>>23845000
                               << 8:4 NOT USED            >>   <<04836>>23850000
                               <<12:4 OPCODE - PERFORMIO  >>   <<04836>>23855000
   CP'PRINTCHAR3 := %(16)0200, <<                         >>   <<04836>>23860000
                               << 0:1 PRIMARY READ CHARS  >>   <<04836>>23865000
                               << 1:1 DO ECHO             >>   <<04836>>23870000
                               << 2:1 HANDSHAKE IF READ   >>   <<04836>>23875000
                               << 3:1 NOT USED            >>   <<04836>>23880000
                               << 4:2 TYPE (0=WRITE ONLY) >>   <<04836>>23885000
                               << 6:1 ABORT HANDSHAKE WAIT>>   <<04836>>23890000
                               << 7:1 SAVE PRIOR 'IN' DATA>>   <<04836>>23895000
                               << 8:8 HIGHBYTE WRITE COUNT>>   <<04836>>23900000
   CP'PRINTCHAR4 := %(16)0100,  <<                       >>    <<04836>>23905000
                               << 0:8 LOW BYTE WRITE COUNT>>   <<04836>>23910000
                               << 8:8 HIGH BYTE READ COUNT>>   <<04836>>23915000
   CP'PRINTCHAR5 := %(16)00FF, <<                         >>   <<04836>>23920000
                               << 0:8 LOW BYTE READ COUNT >>   <<04836>>23925000
                               << 8:8 'END' CONTROL ORDER >>   <<04836>>23930000
   AIB'ENABLE,                                                 <<04836>>23935000
   BOARD'TYPE,                                                 <<04836>>23940000
   CONS'AIB,                                                   <<04836>>23945000
   CONS'PORT,                                                  <<04836>>23950000
   CONS'DRT := 0,                                              <<04836>>23955000
   CPUNUM,                                                     <<04836>>23960000
   DB'REG,      << CURRENT DB FOR PRINT >>                     <<04836>>23965000
   DMA'BANK,    << DMA BANK FOR PRINT   >>                     <<04836>>23970000
   DIT'INDEX,                                                  <<04836>>23975000
   ILT'INDEX,                                                  <<04836>>23980000
   INIT'COMMAND := %20000,                                     <<04836>>23985000
   INTRPT'ERROR,                                               <<04836>>23990000
   INTRPT'REASON,                                              <<04836>>23995000
   LDEV'NUMB,                                                  <<04836>>24000000
   TEMP,                                                       <<04836>>24005000
   TEMP1,                                                      <<04836>>24010000
   TEMP2,                                                      <<04836>>24015000
   LYNX'INTRPT,                                                <<04836>>24020000
   PRINT'ADDR,                                                 <<04836>>24025000
   READ'COMMAND := 0,                                          <<04836>>24030000
   STARTIME,                                                   <<04836>>24035000
   SYS'UP := FALSE,                                            <<04836>>24040000
   TERM'INTRPT  := 0,                                          <<04836>>24045000
   WRITE'COMMAND := 0,                                         <<04836>>24050000
   WAIT'LIMIT := 4;    << 4 MILLISECOND DELAY >>               <<04836>>24055000
INTEGER                                                        <<04836>>24060000
   S2 = S-2,                                                   <<04836>>24065000
   S3 = S-3,                                                   <<04836>>24070000
   I,                                                          <<04836>>24075000
   J;                                                          <<04836>>24080000
POINTER                                                        <<04836>>24085000
   LPDT'INDEX = %10,                                           <<04836>>24090000
   SYS'BASE'INDEX = 0;                                         <<04836>>24095000
INTEGER ARRAY LYNX'CONVERT(6:18) = PB :=  <<ADCC TO LYNX    >> <<04836>>24100000
 2,4,9,5,99,10,99,11,1,0,6,7,3;     <<BAUDRATE CONVERSIONS  >> <<04836>>24105000
  INTEGER SIOLOC, DRTN, LIMIT;                                          24110000
                                                               <<04836>>24115000
  INTEGER POINTER DITP;        <<POINTER TO ACCESS DIT>>                24120000
  INTEGER OLDDB, OLDBK;   << DB SAVE AREA >>                   <<04836>>24125000
  DOUBLE STARTTIME;                                                     24130000
  INTEGER ARRAY SIOPROG (0:22) = PB :=                         <<04836>>24135000
                                                                        24140000
    [8/4,8/3],       << 0--WRITE TO ENABLE CSRQ          >>    <<04836>>24145000
    1,               << 1--                              >>    <<04836>>24150000
    1,               << 2--                              >>    <<04836>>24155000
    [1/1,1/0,1/1,3/1,10/0],  << 3--LEFT BYTE, NO UPDATE  >>    <<04836>>24160000
    0,               << 4--BUFFER ADDRESS                >>    <<04836>>24165000
    [8/4,8/0],       << 5--WRITE DATA CHANNEL INSTRUCTION>>    <<04836>>24170000
    1,               << 6--                              >>    <<04836>>24175000
    1,               << 7--                              >>    <<04836>>24180000
    [1/1,1/1,1/1,3/1,10/0],  << 8--RIGHT BYTE, NO UPDATE >>    <<04836>>24185000
    0,               << 9--BUFFER ADDRESS                >>    <<04836>>24190000
    [8/2,8/0],       << 10--IDLE WAIT                    >>    <<04836>>24195000
    0,               << 11--                             >>    <<04836>>24200000
    [8/4,8/3],       << 12--WRITE TO DISABLE CSRQ        >>    <<04836>>24205000
    1,               << 13--                             >>    <<04836>>24210000
    1,               << 14--                             >>    <<04836>>24215000
    [1/1,1/1,1/1,3/1,10/0],  << 15--RIGHT BYTE, NO UPDATE>>    <<04836>>24220000
    0,               << 16--BUFFER ADDRESS               >>    <<04836>>24225000
    [8/2,8/0],       << 17--IDLE WAIT                    >>    <<04836>>24230000
    0,               << 18--                             >>    <<04836>>24235000
    0,               << 19--JUMP BACK TO IDLE WAIT       >>    <<04836>>24240000
    -4,              << 20--                             >>    <<04836>>24245000
    0,               << 21--BUFFER FOR WRITE DATA        >>    <<04836>>24250000
    [8/5,8/1];       << 22--BUFFER FOR WRITE, CSRQ       >>    <<04836>>24255000
                                                                        24260000
   ARRAY LYNX'SPEEDS(0:9) = PB := 10,15,30,60,120,180,         <<04836>>24265000
                                     240,480,960,-1;           <<04836>>24270000
   ARRAY LYNX'SPEEDCODES(0:9) = PB := 0,1,11,2,10,3,4,5,9,9;   <<04836>>24275000
$PAGE                                                          <<04836>>24280000
<< START OF PRINTCHAR PROCEDURE >>                             <<04836>>24285000
ASSEMBLE( PCN );   << WHAT PROCESSOR TYPE >>                   <<04836>>24290000
CPUNUM := TOS;                                                 <<04836>>24295000
X := %74;   << SYS BASE INDEX TO CONSOLE LDEV NUMB >>          <<04836>>24300000
LDEV'NUMB := SYS'BASE'INDEX(X);   << READ CONS LDEV NUMBER>>   <<04836>>24305000
DIT'INDEX := LPDT'INDEX(2 * LDEV'NUMB);                        <<04836>>24310000
ILT'INDEX := SYS'BASE'INDEX(DIT'INDEX + 5);                    <<04836>>24315000
CONS'PORT := SYS'BASE'INDEX(DIT'INDEX).(8:8);                  <<04836>>24320000
CONS'DRT.(7:6) := SYS'BASE'INDEX(ILT'INDEX + 7).(7:6);         <<04836>>24325000
CONS'AIB := CONS'PORT.(9:3);   << GET LYNX AIB BOARD NUMB >>   <<04836>>24330000
BOARD'TYPE := CHANNEL'ID(LDEV'NUMB);                           <<04836>>24335000
IF BOARD'TYPE = LYNX'TYPE THEN                                 <<04836>>24340000
   BEGIN   << SIB IS A LYNX >>                                 <<04836>>24345000
   DISABLE'INTRPTS;                                            <<04836>>24350000
   AIB'ENABLE := ENABLE'MASK&LSR(CONS'AIB);                    <<04836>>24355000
   << THAW LYNX >>                                             <<04836>>24360000
   WRITE'DEVICE'REG(CONS'DRT, DIAG'WRITE, GO'LYNX);            <<04836>>24365000
   << ENABLE ONLY CONSOLE AIB >>                               <<04836>>24370000
   WRITE'DEVICE'REG(CONS'DRT, BOARD'ENABLE, AIB'ENABLE);       <<04836>>24375000
   TEMP := SYS'BASE'INDEX(ILT'INDEX+13).(9:7)+ILT'INDEX+16;    <<04836>>24380000
   TEMP1 := SYS'BASE'INDEX(DIT'INDEX+9);  <<OFFSET TO DSEG>>   <<04836>>24385000
   TOS := SYS'BASE'INDEX(TEMP);                                <<04836>>24390000
   TOS := SYS'BASE'INDEX(TEMP+1);                              <<04836>>24395000
   ASSEMBLE(XCHD);  <<DB SET TO TERMINAL DATA SEGMENT NOW>>    <<04836>>24400000
   TEMP := TDS'DB(TEMP1+5);  <<GETS SPEED>>                    <<04836>>24405000
   TEMP2 := TDS'DB(TEMP1+7);  <<GETS PARITY>>                  <<04836>>24410000
   ASSEMBLE(XCHD; DDEL);                                       <<04836>>24415000
   TEMP1 := 0;                                                 <<04836>>24420000
   WHILE LYNX'SPEEDS(TEMP1) <> TEMP AND LYNX'SPEEDS(TEMP1)<> -1<<04836>>24425000
      DO TEMP1 := TEMP1+1;                                     <<04836>>24430000
   CP'PRINTCHAR.(12:4) := LYNX'SPEEDCODES(TEMP1);              <<04836>>24435000
   CP'PRINTCHAR.(9:2) := TEMP2.(2:2);   <<SET PARITY>>         <<04836>>24440000
   << SET UP PORT POINTER TO CONSOLE >>                        <<04836>>24445000
   WRITE'DEVICE'REG(CONS'DRT, PORT'POINTER, CONS'PORT);        <<04836>>24450000
   PUSH(SBANK);                                                <<04836>>24455000
   DMA'BANK := TOS LOR DMA'CONTROL;                            <<04836>>24460000
   PUSH(DB);                                                   <<04836>>24465000
   PUSH(Q);                                                    <<04836>>24470000
   DB'REG := LOGICAL(TOS) + LOGICAL(TOS);                      <<04836>>24475000
   << SET UP CONTROL BANK >>                                   <<04836>>24480000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'BANK, DMA'BANK);     <<04836>>24485000
   << SET UP CONTROL ADDR >>                                   <<04836>>24490000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(3);                 <<04836>>24495000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'ADDR, PRINT'ADDR);   <<04836>>24500000
   << SET UP WRITE DMA BANK >>                                 <<04836>>24505000
   WRITE'DEVICE'REG(CONS'DRT, WRITE'DMA'BANK, DMA'RIGHT LOR    <<04836>>24510000
                                              DMA'BANK);       <<04836>>24515000
   << SET UP WRITE DMA ADDR >>                                 <<04836>>24520000
   CHARACTER := CHAR;                                          <<04836>>24525000
   WRITE'DEVICE'REG(CONS'DRT, WRITE'DMA'ADDR, LOGICAL(1) +     <<04836>>24530000
                                 LOGICAL(DB'REG));             <<04836>>24535000
   << SET UP READ DMA BANK >>                                  <<04836>>24540000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'BANK, DMA'BANK);        <<04836>>24545000
   << SET UP READ DMA ADDR >>                                  <<04836>>24550000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(2);                 <<04836>>24555000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'ADDR, PRINT'ADDR);      <<04836>>24560000
   << START WRITE CONTROL PROGRAM >>                           <<04836>>24565000
   WRITE'DEVICE'REG(CONS'DRT, DIRECT'COMMAND, SIO'PORT);       <<04836>>24570000
   LYNX'INTRPT := FALSE;                                       <<04836>>24575000
   << LOOP UNTIL WRITE IS COMPLETE >>                          <<04836>>24580000
   PRINTCHAR := 0;                                             <<04836>>24585000
   DO                                                          <<04836>>24590000
      BEGIN   << WAIT FOR INTERRUPT >>                         <<04836>>24595000
      TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'NO'FLUSH); <<04836>>24600000
      IF TERM'INTRPT.(0:1) THEN                                <<04836>>24605000
         BEGIN   << INTERRUPT HAS OCCURED >>                   <<04836>>24610000
         TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'FLUSH); <<04836>>24615000
         IF TERM'INTRPT.(9:7) = CONS'PORT.(9:7) THEN           <<04836>>24620000
            BEGIN   << CORRECT PORT INTERRUPTED >>             <<04836>>24625000
            LYNX'INTRPT := TRUE;                               <<04836>>24630000
            INTRPT'REASON:=READ'DEVICE'REG(CONS'DRT,           <<04836>>24635000
                                           TERM'INTRPT'REASON);<<04836>>24640000
            IF INTRPT'REASON&LSR(8) <> WRITE'DONE THEN         <<04836>>24645000
               BEGIN   << NOT CORRECT REASON - ERROR >>        <<04836>>24650000
               PRINTCHAR := INTRPT'REASON.(0:8) LOR            <<04836>>24655000
                            BIT0;                              <<04836>>24660000
               END;    << NOT CORRECT REASON - ERROR >>        <<04836>>24665000
            END      << CORRECT PORT INTERRUPTED >>            <<04836>>24670000
         END     << INTERRUPT HAS OCCURED >>                   <<04836>>24675000
      ELSE                                                     <<04836>>24680000
         BEGIN   << CHECK HARDWARE ERROR >>                    <<04836>>24685000
         IF TERM'INTRPT.(2:1) THEN                             <<04836>>24690000
            BEGIN                                              <<04836>>24695000
            LYNX'INTRPT := TRUE;                               <<04836>>24700000
            INTRPT'ERROR:=READ'DEVICE'REG(CONS'DRT, DIAG'REGA);<<04836>>24705000
            PRINTCHAR := INTRPT'ERROR.(8:8) LOR BIT2;          <<04836>>24710000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137613);    <<04836>>24715000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137611);    <<04836>>24720000
            END;                                               <<04836>>24725000
         END;    << CHECK HARDWARE ERROR >>                    <<04836>>24730000
      END     << WAIT FOR INTERRUPT >>                         <<04836>>24735000
   UNTIL LYNX'INTRPT = TRUE;                                   <<04836>>24740000
   END     << SIB IS A LYNX >>                                 <<04836>>24745000
ELSE                                                           <<04836>>24750000
   BEGIN   << SIB IS A ADCC >>                                 <<04836>>24755000
    << SET DB TO SYSTEM DB.                    >>              <<04836>>24760000
                                                               <<04836>>24765000
    TOS:=DOUBLE(SYSDB);                                        <<04836>>24770000
    ASMB(XCHD);                                                <<04836>>24775000
    OLDDB:=TOS;  OLDBK:=TOS;                                   <<04836>>24780000
                                                               <<04836>>24785000
                                                                        24790000
    @DITP:=LPDT((CONSLDEV)&LSL(1));                                     24795000
    DRTN:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                   <<04836>>24800000
    TOS := DRTN;                                               <<04836>>24805000
    ASMB(HIOP);                                                <<04836>>24810000
    WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                   <<04836>>24815000
                               <<WAIT FOR PROG HALT>>          <<04836>>24820000
                                                                        24825000
    MOVE SIOP(SIOBASE) := SIOPROG, (23);                       <<04836>>24830000
    << MOVE SIO PROGRAM TO BANK 0 >>                           <<04836>>24835000
                                                               <<04836>>24840000
                                                               <<04836>>24845000
                                                               <<04836>>24850000
    SIOLOC := @SIOP(SIOBASE)+%1000; <<ABSOLUTE BUFFER ADDRESS>><<04836>>24855000
    SIOP(SIOBASE + 4 ) := SIOLOC + 22;                         <<04836>>24860000
    SIOP(SIOBASE + 9 ) := SIOLOC + 21;                         <<04836>>24865000
    SIOP(SIOBASE + 16) := SIOLOC + 22;                         <<04836>>24870000
    SIOP(SIOBASE + 21) := CHAR;                                <<04836>>24875000
AGAIN:                                                                  24880000
    TOS:=DRTN;        <<SYS CONSOLE DRT NUMBER>>                        24885000
    TOS:=SIOLOC;                                                        24890000
    STARTSIO;        <<START SIO PROG>>                                 24895000
    IF <> THEN GOTO AGAIN;                                              24900000
    WHILE F(DRTN*4) - SIOLOC < 17 DO;                          <<04836>>24905000
    TOS:=DRTN;                                                          24910000
    ASMB(HIOP);            <<STOP SIO PROG>>                            24915000
    WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                   <<04836>>24920000
                      <<WAIT FOR SIOPROG HALT>>                         24925000
                                                               <<04836>>24930000
    << NOW WE MUST RESET THE DB REGISTER >>                    <<04836>>24935000
                                                               <<04836>>24940000
    TOS:=OLDBK;  TOS:=OLDDB;                                   <<04836>>24945000
    ASMB(XCHD; DDEL);                                          <<04836>>24950000
                                                               <<04836>>24955000
   END     << SIB IS A ADCC >>                                 <<04836>>24960000
END;   <<------------------END OF PRINTCHAR------------------->>        24965000
$PAGE  "READCHAR"                                              <<04836>>24970000
  INTEGER PROCEDURE READCHAR( WAITMS);                         <<04836>>24975000
  VALUE WAITMS;                                                <<04836>>24980000
  LOGICAL WAITMS;    << TIME-OUT FOR READ >>                   <<04836>>24985000
  OPTION VARIABLE;                                             <<04836>>24990000
      COMMENT                                                  <<04836>>24995000
        THIS PROCEDURE READS A BYTE DIRECTLY FROM THE          <<04836>>25000000
        SYSTEM CONSOLE.  THE OPTIONAL PARAMETER IS USED        <<04836>>25005000
        FOR AUTOMATIC SPEED SENSING.  IF AN ACK DOES NOT       <<04836>>25010000
        COME BACK IN WAITMS MILLISECONDS AFTER AN ENQ          <<04836>>25015000
        WAS SENT, THE CHANNEL PROGRAM IS HALTED.               <<04836>>25020000
      ;                                                        <<04836>>25025000
BEGIN   << START OF READCHAR >>                                <<04836>>25030000
EQUATE                                                         <<04836>>25035000
   R0    = 0,                                                  <<04836>>25040000
   R1    = 1,                                                  <<04836>>25045000
   R2    = 2,                                                  <<04836>>25050000
   R3    = 3,                                                  <<04836>>25055000
   R4    = 4,                                                  <<04836>>25060000
   R5    = 5,                                                  <<04836>>25065000
   R6    = 6,                                                  <<04836>>25070000
   R7    = 7,                                                  <<04836>>25075000
   R8    = 8,                                                  <<04836>>25080000
   R9    = 9,                                                  <<04836>>25085000
   RA    = %(16)A,                                             <<04836>>25090000
   RB    = %(16)B,                                             <<04836>>25095000
   RC    = %(16)C,                                             <<04836>>25100000
   RD    = %(16)D,                                             <<04836>>25105000
   RE    = %(16)E,                                             <<04836>>25110000
   RF    = %(16)F;                                             <<04836>>25115000
EQUATE                                                         <<04836>>25120000
   BIT0 = %100000,                                             <<04836>>25125000
   BIT2 = %20000,                                              <<04836>>25130000
   B14'SET = 2,                                                <<04836>>25135000
   B14'CLEAR = 0,                                              <<04836>>25140000
   DMA'CONTROL = %100000,                                      <<04836>>25145000
   DMA'RIGHT = %40000,                                         <<04836>>25150000
   ENABLE'MASK = %177577,                                      <<04836>>25155000
   GO'LYNX = %(16)BF8D,                                        <<04836>>25160000
   HIO'PORT = 8,                                               <<04836>>25165000
   NULL = 0,                                                   <<04836>>25170000
   PORT'HCP = 8,                                               <<04836>>25175000
   READ'DONE = 6,                                              <<04836>>25180000
   SIO'PORT = 4,                                               <<04836>>25185000
   WRITE'DONE = %16;                                           <<04836>>25190000
DEFINE   << DEFINES FOR LYNX REGISTERS >>                      <<04836>>25195000
   WRITE'DMA'ADDR      = R0#,                                  <<04836>>25200000
   WRITE'DMA'BANK       = R1#,                                 <<04836>>25205000
   CONTROL'DMA'ADDR     = R2#,                                 <<04836>>25210000
   CONTROL'DMA'BANK     = R3#,                                 <<04836>>25215000
   READ'DMA'ADDR        = R4#,                                 <<04836>>25220000
   READ'DMA'BANK        = R5#,                                 <<04836>>25225000
   TERM'INTRPT'REASON   = R6#,                                 <<04836>>25230000
   INTRPTS'NO'FLUSH     = R8#,                                 <<04836>>25235000
   PORT'POINTER         = R8#,                                 <<04836>>25240000
   INTRPTS'FLUSH        = R9#,                                 <<04836>>25245000
   BOARD'ENABLE         = R9#,                                 <<04836>>25250000
   DIAG'REGA            = RA#,                                 <<04836>>25255000
   DIAG'WRITE           = RA#,                                 <<04836>>25260000
   DIAG'REGB            = RB#,                                 <<04836>>25265000
   DIRECT'COMMAND       = RB#,                                 <<04836>>25270000
   DISABLE'INTRPTS = ASSEMBLE( SED 0 )#,                       <<04836>>25275000
   CHANNEL'CONFIG       = RE#,                                 <<04836>>25280000
   CHANNEL'CONFIG'2     = RF#;                                 <<04836>>25285000
LOGICAL   << NOTE !!! - DONT MOVE Q+1 THROUGH Q+4 >>           <<04836>>25290000
   CHARACTER,                                                  <<04836>>25295000
   READ'BRK,                                                   <<04836>>25300000
   CP'READCHAR  := %(16)0142,   <<SET PRINTCHAR FOR DESCRIPT>> <<04836>>25305000
   CP'READCHAR1 := %(16)0000,   <<                         >>  <<04836>>25310000
                                                               <<04836>>25315000
   CP'READCHAR2 := %(16)0001,   <<                         >>  <<04836>>25320000
   CP'READCHAR3 := %(16)FFFF,   <<                         >>  <<04836>>25325000
   AIB'ENABLE,                                                 <<04836>>25330000
   BOARD'TYPE,                                                 <<04836>>25335000
   CONS'AIB,                                                   <<04836>>25340000
   CONS'DRT := 0,                                              <<04836>>25345000
   CONS'PORT,                                                  <<04836>>25350000
   CPUNUM,                                                     <<04836>>25355000
   DB'REG,      << CURRENT DB FOR PRINT >>                     <<04836>>25360000
   DMA'BANK,    << DMA BANK FOR PRINT   >>                     <<04836>>25365000
   DIT'INDEX,                                                  <<04836>>25370000
   ILT'INDEX,                                                  <<04836>>25375000
   INIT'COMMAND := %20000,                                     <<04836>>25380000
   INTRPT'ERROR,                                               <<04836>>25385000
   INTRPT'REASON,                                              <<04836>>25390000
   LDEV'NUMB,                                                  <<04836>>25395000
   LYNX'INTRPT,                                                <<04836>>25400000
   PRINT'ADDR,                                                 <<04836>>25405000
   READ'COMMAND := 0,                                          <<04836>>25410000
   SYS'UP := FALSE,                                            <<04836>>25415000
   TERM'INTRPT  := 0,                                          <<04836>>25420000
   WRITE'COMMAND := 0,                                         <<04836>>25425000
   WAIT'LIMIT := 4,                                            <<04836>>25430000
   CURTIME,                                                    <<04836>>25435000
   STARTIME,                                                   <<04836>>25440000
   TEMP,                                                       <<04836>>25445000
   TIMEOUT;                                                    <<04836>>25450000
INTEGER                                                        <<04836>>25455000
   S2 = S-2,                                                   <<04836>>25460000
   S3 = S-3,                                                   <<04836>>25465000
   PARMS = Q-4,                                                <<04836>>25470000
   I,                                                          <<04836>>25475000
   J;                                                          <<04836>>25480000
POINTER                                                        <<04836>>25485000
   LPDT'INDEX = %10,                                           <<04836>>25490000
   SYS'BASE'INDEX = 0;                                         <<04836>>25495000
INTEGER ARRAY LYNX'CONVERT(6:18) = PB :=  <<ADCC TO LYNX    >> <<04836>>25500000
 2,4,9,5,99,10,99,11,1,0,6,7,3;    << BAUDRATE CONVERSIONS  >> <<04836>>25505000
                                                               <<04836>>25510000
  INTEGER                                                               25515000
    DRTN,                                                               25520000
    SIOLOC;                                                             25525000
  INTEGER OLDDB, OLDBK;    << DB SAVE AREA >>                  <<04836>>25530000
                                                                        25535000
  INTEGER POINTER DITP;                                        <<04836>>25540000
                                                               <<04836>>25545000
                                                               <<04836>>25550000
                                                                        25555000
  INTEGER ARRAY SIOPROG(0:45)= PB :=                           <<04836>>25560000
                                                                        25565000
  [8/4,8/1],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               25570000
          <<WRITE MOD1 :RESET,8BITS,NO PTY,2 STOPBITS>>        <<04836>>25575000
  [8/4,8/2],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               25580000
          <<WRITE MOD2,SET ECHO & CD,CLEAR CA>>                         25585000
  [8/4,8/3],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               25590000
          <<WRITE MOD3,ENABLE SRQ ON INPUT>>                            25595000
  [8/4,8/6],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               25600000
          <<WRITE MOD6,SET BAUD RATE>>                         <<04836>>25605000
  [8/2,8/0],0,       <<WAIT FOR INPUT SRQ>>                             25610000
  [8/3,8/0],1,1,[1/1,1/1,4/1,10/0],0,                                   25615000
          <<READ MOD0,INPUT CHAR FROM TERMINAL>>                        25620000
  [8/4,8/3],1,1,[1/1,1/0,1/0,3/1,10/0],0,                               25625000
          <<WRITE MOD3,DISABLE SRQ ON INPUT>>                           25630000
  [8/4,8/2],1,1,[1/1,1/1,1/0,3/1,10/0],0,                               25635000
          <<WRITE MOD2,DISABLE ECHO>>                                   25640000
  [8/2,8/0],0,     <<WAIT FOR WRITE COMPLETE,THEN IDLE>>                25645000
  0,-4,            <<BACK TO IDLE WAIT>>                                25650000
  -1,              <<SIO PROG END>>                                     25655000
  [8/%235,8/%024], <<DATA BYTES FOR WRITES>>                   <<04836>>25660000
  [8/%006,8/%027],                                                      25665000
  0,               <<DATA BUFFER FOR CHAR>>                             25670000
  [8/%002,8/%004];                                                      25675000
<< START AND OUTER BLOCK OF READCHAR PROCEDURE >>              <<04836>>25680000
ASSEMBLE( PCN );   << WHAT PROCESSOR TYPE >>                   <<04836>>25685000
CPUNUM := TOS;                                                 <<04836>>25690000
X := %74;   << SYS BASE INDEX TO CONS LDEV NUMB >>             <<04836>>25695000
LDEV'NUMB := SYS'BASE'INDEX(X);   << READ CONS LDEV NUMBER >>  <<04836>>25700000
DIT'INDEX := LPDT'INDEX(2 * LDEV'NUMB);                        <<04836>>25705000
ILT'INDEX := SYS'BASE'INDEX(DIT'INDEX + 5);                    <<04836>>25710000
CONS'PORT := SYS'BASE'INDEX(DIT'INDEX).(8:8);                  <<04836>>25715000
CONS'DRT.(7:6) := SYS'BASE'INDEX(ILT'INDEX + 7).(7:6);         <<04836>>25720000
CONS'AIB := CONS'PORT.(9:3);                                   <<04836>>25725000
BOARD'TYPE := CHANNEL'ID(LDEV'NUMB);                           <<04836>>25730000
IF BOARD'TYPE = LYNX'TYPE THEN                                 <<04836>>25735000
   BEGIN   << SIB IS A LYNX >>                                 <<04836>>25740000
   DISABLE'INTRPTS;                                            <<04836>>25745000
   << SET UP PORT POINTER TO CONSOLE >>                        <<04836>>25750000
   WRITE'DEVICE'REG(CONS'DRT, PORT'POINTER, CONS'PORT);        <<04836>>25755000
   PUSH(SBANK);                                                <<04836>>25760000
   DMA'BANK := TOS LOR DMA'CONTROL;                            <<04836>>25765000
   PUSH(DB);                                                   <<04836>>25770000
   PUSH(Q);                                                    <<04836>>25775000
   DB'REG := LOGICAL(TOS) + LOGICAL(TOS);                      <<04836>>25780000
   << SET UP CONTROL BANK >>                                   <<04836>>25785000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'BANK, DMA'BANK);     <<04836>>25790000
   << SET UP CONTROL ADDR >>                                   <<04836>>25795000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(3);                 <<04836>>25800000
   WRITE'DEVICE'REG(CONS'DRT, CONTROL'DMA'ADDR, PRINT'ADDR);   <<04836>>25805000
   << SET UP READ DMA BANK >>                                  <<04836>>25810000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'BANK, DMA'BANK LOR      <<04836>>25815000
                                             DMA'RIGHT);       <<04836>>25820000
   << SET UP READ DMA ADDR >>                                  <<04836>>25825000
   PRINT'ADDR := LOGICAL(DB'REG) + LOGICAL(1);                 <<04836>>25830000
   WRITE'DEVICE'REG(CONS'DRT, READ'DMA'ADDR, PRINT'ADDR);      <<04836>>25835000
   READCHAR := NULL;                                           <<04836>>25840000
   << START READ CONTROL PROGRAM >>                            <<04836>>25845000
   WRITE'DEVICE'REG(CONS'DRT, DIRECT'COMMAND, SIO'PORT);       <<04836>>25850000
   LYNX'INTRPT := FALSE;                                       <<04836>>25855000
   << LOOP UNTIL READ IS COMPLETE >>                           <<04836>>25860000
   IF PARMS.(15:1) = 1 THEN                                    <<04836>>25865000
      BEGIN   << TIME READ >>                                  <<04836>>25870000
      TEMP := %(16)A200;                                       <<04836>>25875000
      TIMEOUT := WAITMS;                                       <<04836>>25880000
      END     << TIME READ >>                                  <<04836>>25885000
   ELSE                                                        <<04836>>25890000
      BEGIN                                                    <<04836>>25895000
      TEMP := %(16)2200;                                       <<04836>>25900000
      TIMEOUT := 0;                                            <<04836>>25905000
      END;                                                     <<04836>>25910000
   ASSEMBLE(RCLK);  << SAVE CURRENT CLOCK FOR TIMEOUT >>       <<04836>>25915000
   STARTIME := TOS;                                            <<04836>>25920000
   DO                                                          <<04836>>25925000
      BEGIN   << WAIT FOR INTERRUPT >>                         <<04836>>25930000
      TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT, INTRPTS'NO'FLUSH);<<04836>>25935000
      IF TERM'INTRPT.(0:1) THEN                                <<04836>>25940000
         BEGIN   << INTERRUPT HAS OCCURED >>                   <<04836>>25945000
         TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,INTRPTS'FLUSH); <<04836>>25950000
         IF TERM'INTRPT.(9:7) = CONS'PORT.(9:7) THEN           <<04836>>25955000
            BEGIN   << CORRECT PORT INTERRUPTED >>             <<04836>>25960000
            LYNX'INTRPT := TRUE;                               <<04836>>25965000
           INTRPT'REASON:=READ'DEVICE'REG(CONS'DRT,            <<04836>>25970000
                                          TERM'INTRPT'REASON); <<04836>>25975000
            IF INTRPT'REASON&LSR(8) <> READ'DONE THEN          <<04836>>25980000
               BEGIN   << NOT CORRECT REASON - ERROR >>        <<04836>>25985000
               READCHAR := INTRPT'REASON.(0:8) LOR             <<04836>>25990000
                           BIT0;                               <<04836>>25995000
               END     << NOT CORRECT REASON - ERROR >>        <<04836>>26000000
            ELSE                                               <<04836>>26005000
               READCHAR := CHARACTER.(8:8);                    <<04836>>26010000
            END      << CORRECT PORT INTERRUPTED >>            <<04836>>26015000
         END     << INTERRUPT HAS OCCURED >>                   <<04836>>26020000
      ELSE                                                     <<04836>>26025000
         BEGIN   << CHECK HARDWARE ERROR >>                    <<04836>>26030000
         IF TERM'INTRPT.(2:1) THEN                             <<04836>>26035000
            BEGIN                                              <<04836>>26040000
            LYNX'INTRPT := TRUE;                               <<04836>>26045000
            INTRPT'ERROR:=READ'DEVICE'REG(CONS'DRT, DIAG'REGA);<<04836>>26050000
            READCHAR := INTRPT'ERROR.(8:8) LOR BIT2;           <<04836>>26055000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137613);    <<04836>>26060000
            WRITE'DEVICE'REG(CONS'DRT, DIAG'REGA, %137611);    <<04836>>26065000
            END;                                               <<04836>>26070000
         END;    << CHECK HARDWARE ERROR >>                    <<04836>>26075000
      IF LYNX'INTRPT = FALSE AND TIMEOUT <> 0 THEN             <<04836>>26080000
         BEGIN                                                 <<04836>>26085000
         ASSEMBLE( RCLK );                                     <<04836>>26090000
         CURTIME := TOS;                                       <<04836>>26095000
         IF CURTIME-STARTIME > TIMEOUT THEN                    <<04836>>26100000
            BEGIN                                              <<04836>>26105000
            READCHAR := NULL;                                  <<04836>>26110000
            WRITE'DEVICE'REG(CONS'DRT,DIRECT'COMMAND,HIO'PORT);<<04836>>26115000
            DO                                                 <<04836>>26120000
               BEGIN   << WAIT FOR HALT >>                     <<04836>>26125000
              TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,           <<04836>>26130000
                                           INTRPTS'NO'FLUSH);  <<04836>>26135000
               IF TERM'INTRPT.(0:1) THEN                       <<04836>>26140000
                  BEGIN   << HALT OCCURED >>                   <<04836>>26145000
                  TERM'INTRPT:=READ'DEVICE'REG(CONS'DRT,       <<04836>>26150000
                                               INTRPTS'FLUSH); <<04836>>26155000
                  LYNX'INTRPT := TRUE;                         <<04836>>26160000
                  END;    << HALT OCCURED >>                   <<04836>>26165000
               END     << WAIT FOR HALT >>                     <<04836>>26170000
            UNTIL LYNX'INTRPT = TRUE;                          <<04836>>26175000
            END;                                               <<04836>>26180000
         END;                                                  <<04836>>26185000
      END     << WAIT FOR INTERRUPT >>                         <<04836>>26190000
   UNTIL LYNX'INTRPT = TRUE;                                   <<04836>>26195000
   END     << SIB IS A LYNX >>                                 <<04836>>26200000
ELSE                                                           <<04836>>26205000
   BEGIN   << SIB IS A ADCC >>                                 <<04836>>26210000
  << SET DB TO SYSTEM DB.                    >>                <<04836>>26215000
                                                               <<04836>>26220000
    TOS:=DOUBLE(SYSDB);                                        <<04836>>26225000
    ASMB(XCHD);                                                <<04836>>26230000
    OLDDB:=TOS; OLDBK:=TOS;                                    <<04836>>26235000
                                                               <<04836>>26240000
                                                                        26245000
  @DITP:=LPDT(CONSLDEV&LSL(1));                                         26250000
  DRTN:=WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;                     <<04836>>26255000
  IF GETDRT(DRTN,DRT3).IDLESIO<> 0 THEN ASMB(HALT %15;BR *-1); <<04836>>26260000
                   <<STOP IF SIO PROG ALREADY ACTIVE>>                  26265000
                                                               <<04836>>26270000
                                                               <<04836>>26275000
                                                               <<04836>>26280000
  MOVE SIOP(SIOBASE) := SIOPROG, (46);                         <<04836>>26285000
  << MOVE SIO PROGRAM TO BANK 0 >>                             <<04836>>26290000
  SIOLOC := @SIOP(SIOBASE) + %1000;<<ABSOLUTE BUFFER ADDRESS>><<<04836>>26295000
                                                                        26300000
  SIOP(SIOBASE+4):=SIOP(SIOBASE+9):=SIOLOC + 42;               <<04836>>26305000
  SIOP(SIOBASE+14):=SIOP(SIOBASE+19):=SIOLOC + 43;             <<04836>>26310000
  SIOP(SIOBASE+26):=SIOLOC + 44;                               <<04836>>26315000
  SIOP(SIOBASE+31):=SIOP(SIOBASE+36):=SIOLOC + 45;             <<04836>>26320000
  SIOP(SIOBASE+43).(8:8):=DITP(DSPEED).INSPEED+%20;<<SET BAUD>><<04836>>26325000
                                                                        26330000
                                                               <<04836>>26335000
TRYAGAIN:                                                      <<04836>>26340000
                                                               <<04836>>26345000
  TOS:=DRTN;                                                            26350000
  TOS:= SIOLOC;  <<SPECIFY SIOPROG STARTING LOCATION>>                  26355000
  STARTSIO;             <<START SIO PROGRAM>>                           26360000
  IF <> THEN GO TO TRYAGAIN;                                   <<04836>>26365000
  WHILE GETDRT(DRTN,0)-SIOLOC < 37 DO;                         <<04836>>26370000
                   <<WAIT FOR PROGRAM TO GO TO IDLE WAIT>>              26375000
  TOS:=DRTN;                                                            26380000
  ASMB(HIOP);               <<HALT SIO PROGRAM>>                        26385000
  WHILE GETDRT(DRTN,DRT3).IDLESIO <> 0 DO;                     <<04836>>26390000
                   <<WAIT FOR DRT STATUS TO SHOW HALTED PROG>>          26395000
  READCHAR:=SIOP(SIOBASE+44); <<GET BYTE READ FROM TERMINAL>>  <<04836>>26400000
                                                               <<04836>>26405000
  << NOW WE MUST RESET THE DB REGISTER >>                      <<04836>>26410000
                                                               <<04836>>26415000
    TOS:=OLDBK; TOS:=OLDDB;                                    <<04836>>26420000
    ASMB(XCHD; DDEL);                                          <<04836>>26425000
                                                               <<04836>>26430000
   END     << SIB IS A ADCC >>                                 <<04836>>26435000
END;                                                           <<04836>>26440000
                                                                        26445000
$CONTROL SEGMENT=MAIN                                                   26450000
END.    << TERMRES >>                                                   26455000
