         TITLE    'SKD HANDLER - CP-V'
*CREATED 2/23/71 HLS
*UPDATED 3/12/71 DSE #4366
*UPDATED 5/04/71 RIH #4966
*UPDATED 3/01/72 DSE
*UPDATED 11/11/73 DGT
         SYSTEM   UTS
UTS       SET      1
*
*
*        REFS
*
*
         REF      IOSST,IOSCU       HANDLER RETURNS
         REF      M7,M11
         REF      DCT1,DCT2,DCT3,DCT4,DCT5
         REF      DCT6,DCT7,DCT8,DCT9
         REF      MSG3,MSG4         ERROR MESSAGES
         REF       IOQ5,IOQ6,IOQ7,IOQ8,IOQ9
         REF      IOQ11,IOQ15
         REF      XN2,M4,MSG2
          DO       UTS
          REF      SKDH:ID,SKDH:ADR,SKDH:STS,SKDH:CUR
          REF      TERMS
          FIN
*
*         REFS FOR TERMINAL CONTROL TABLES (TCT)
*
         PAGE
*
*
*        DEFS
*
*
         DEF      SKDIO
         DEF      SKDCU             HANDLER ENTRIES
         DEF      ASCII
         DEF      POSTPOL1
         DEF      POSTPOL2
         PAGE
R0       EQU      0
R1       EQU      1
R2       EQU      2
R3       EQU      3
R4       EQU      4
R5       EQU      5
R6       EQU      6
R7       EQU      7
R8,SR1   EQU      8
R9,SR2   EQU      9
R10,SR3  EQU      10
R11,SR4  EQU      11
R12      EQU      12
R13      EQU      13
R14      EQU      14
R15      EQU      15
         PAGE
SOH      EQU      X'81'
STX      EQU      X'82'
ETX      EQU      X'03'
EOT      EQU      X'84'
ENQ      EQU      5
ACK      EQU      6
BEL      EQU      X'87'
BS       EQU      X'88'
HT       EQU      9
LF       EQU      10
VT       EQU      X'8B'
FF       EQU      12
CR       EQU      X'8D'
SO       EQU      X'8E'
SI       EQU      15
DLE      EQU      X'90'
DC1      EQU      X'11'
DC2      EQU      X'12'
DC3      EQU      X'93'
DC4      EQU      X'14'
NAK      EQU      X'95'
SYN      EQU      X'96'
ETB      EQU      X'17'
CAN      EQU      X'18'
EM       EQU      X'99'
SUB      EQU      X'9A'
ESC      EQU      X'1B'
FS       EQU      X'9C'
GS       EQU      X'1D'
RS       EQU      X'1E'
US       EQU      X'9F'
SP       EQU      X'A0'
BANG     EQU      X'21'
A        EQU      X'41'
B        EQU      X'42'
C        EQU      X'C3'
D        EQU      X'44'
E        EQU      X'C5'
F        EQU      X'C6'
G        EQU      X'47'
H        EQU      X'48'
I        EQU      X'C9'
J        EQU      X'CA'
K        EQU      X'4B'
L        EQU      X'CC'
M        EQU      X'4D'
N        EQU      X'4E'
O        EQU      X'CF'
P        EQU      X'50'
Q        EQU      X'D1'
R        EQU      X'D2'
S        EQU      X'53'
T        EQU      X'D4'
U        EQU      X'55'
V        EQU      X'56'
W        EQU      X'D7'
X        EQU      X'D8'
Y        EQU      X'59'
Z        EQU      X'5A'
DEL      EQU      X'FF'
XFFFE    EQU      NB31TO0+1
XFFFD    EQU      NB31TO0+2
XFFFB    EQU      NB31TO0+3
XFFF7    EQU      NB31TO0+4
XFFEF    EQU      NB31TO0+5
XFFDF    EQU      NB31TO0+6
XFFBF    EQU      NB31TO0+7
XFF7F    EQU      NB31TO0+8
XFEFF    EQU      NB31TO0+9
XFDFF    EQU      NB31TO0+10
XFBFF    EQU      NB31TO0+11
XF7FF    EQU      NB31TO0+12
XEFFF    EQU      NB31TO0+13
XDFFF    EQU      NB31TO0+14
XBFFF    EQU      NB31TO0+15
X7FFF    EQU      NB31TO0+16
X200     EQU      BT31TO0+10
X800     EQU      BT31TO0+12
X1000    EQU      BT31TO0+13
X2000    EQU      BT31TO0+14
X8000    EQU      BT31TO0+16
         PAGE
*************************************
*                                   *
*  EBCDIC TO ASCII TRANSLATE TABLE  *
*                                   *
*************************************
*
*
ASCII    EQU      %
         BOUND    4
         DATA,1   0,SOH,STX,ETX,EOT,HT,ACK,BEL
         DATA,1   BS,ENQ,NAK,VT,FF,CR,SO,SI
         DATA,1   DLE,DC1,DC2,DC3,DC4,LF,SYN,ETB
         DATA,1   CAN,EM,SUB,ESC,FS,GS,RS,US
         DO1      4
         DATA,8   0                 X'20'-X'3F' ARE INVALID
         DATA,1   SP,0,0,0,0,0,0,0,0,0,X'60',X'2E'
         DATA,1   X'3C',X'28',X'2B'
         DATA,1   X'FC'
         DATA,1   X'A6',0,0,0,0,0,0,0,0,0,BANG
         DATA,1   X'24',X'AA',X'A9',X'BB',X'7E'
         DATA,1   X'2D',X'AF',0,0,0,0
         DATA,1   0,0,0,0,X'DE',X'AC',X'A5'
         DATA,1   X'5F',X'BE',X'3F'
         DATA,1   0,0,0,0,0,0,0,0,0,0
         DATA,1   X'3A',X'A3',X'C0',X'27'
         DATA,1   X'BD',X'22',X'00'
         DATA,1   X'E1',X'E2',X'63',X'E4'
         DATA,1   X'65',X'66',X'E7',X'E8'
         DATA,1   X'69',0,0,0,0,0,0,0
         DATA,1   X'6A',X'EB',X'6C',X'ED'
         DATA,1   X'EE',X'6F',X'F0',X'71',X'72'
         DATA,1   0,0,0,0,0,0,0,0
         DATA,1   X'F3',X'74',X'F5',X'F6',X'77'
         DATA,1   X'78',X'F9',X'FA'
         DATA,1   0,0,0,0,0,0
         DATA,1   0,X'5C',X'7B',X'7D',X'DB',X'DD'
         DATA,1   0,0,0,0,0,0,0,0,0,0
         DATA,1   0,A,B,C,D,E,F,G,H,I
         DATA,1   0,0,0,0,0,0
         DATA,1   0,J,K,L,M,N,O,P,Q,R
         DATA,1   0,0,0,0,0,0
         DATA,1   0,0,S,T,U,V,W,X,Y,Z
         DATA,1   0,0,0,0,0,0
         DATA,1   X'30',X'B1',X'B2',X'33'
         DATA,1   X'B4',X'35',X'36',X'B7'
         DATA,1   X'B8',X'39',0,0,0,0,0,DEL
         PAGE
*************************************
*                                   *
*  ASCII TO EBCDIC TRANSLATE TABLE  *
*                                   *
*************************************
*
*
*        ZERO IMPLIES PARITY ERROR, SO A SPECIAL
*        CHECK FOR A NULL IS NECESSARY.
*
EBCDIC   EQU      %
         BOUND    4
         DATA,1   0,0,0,ETX
         DATA,1   0,9,ACK,0
         DATA,1   0,5,X'15',0
         DATA,1   FF,0,0,SI
*
         DATA,1   0,DC1,DC2,0
         DATA,1   DC4,0,0,ETB
         DATA,1   CAN,0,0,ESC
         DATA,1   0,GS,RS,0
*
         DATA,1   0,X'5A',X'7F',0
         DATA,1   X'5B',0,0,X'7D'
         DATA,1   '(',0,0,'+'
         DATA,1   0,'-','.',0
*
         DATA,1   '0',0,0,'3'
         DATA,1   0,'5','6',0
         DATA,1   0,'9',':',0
         DATA,1   '<',0,0,'?'
*
         DATA,1   0,'A','B',0
         DATA,1   'D',0,0,'G'
         DATA,1   'H',0,0,'K'
         DATA,1   0,'M','N',0
*
         DATA,1   'P',0,0,'S'
         DATA,1   0,'U','V',0
         DATA,1   0,'Y','Z',0
         DATA,1   X'B1',0,0,X'6D'
*
         DATA,1   X'4A',0,0,X'83'
         DATA,1   0,X'85',X'86',0
         DATA,1   0,X'89',X'91',0
         DATA,1   X'93',0,0,X'96'
*
         DATA,1   0,X'98',X'99',0
         DATA,1   X'A3',0,0,X'A6'
         DATA,1   X'A7',0,0,X'B2'
         DATA,1   0,X'B3',X'5F',0
*
         DATA,1   0,1,2,0
         DATA,1   4,0,0,7
         DATA,1   8,0,0,11
         DATA,1   0,13,14,0
*
         DATA,1   16,0,0,19
         DATA,1   0,10,X'16',0
         DATA,1   0,X'19',X'1A',0
         DATA,1   X'1C',0,0,X'1F'
*
         DATA,1   ' ',0,0,'#'
         DATA,1   0,'%','&',0
         DATA,1   0,')','*',0
         DATA,1   ',',0,0,'/'
*
         DATA,1   0,'1','2',0
         DATA,1   '4',0,0,'7'
         DATA,1   '8',0,0,';'
         DATA,1   0,'=','>',0
*
         DATA,1   '@',0,0,'C'
         DATA,1   0,'E','F',0
         DATA,1   0,'I','J',0
         DATA,1   'L',0,0,'O'
*
         DATA,1   0,'Q','R',0
         DATA,1   'T',0,0,'W'
         DATA,1   'X',0,0,X'B4'
         DATA,1   0,X'B5',X'6A',0
*
         DATA,1   0,X'81',X'82',0
         DATA,1   X'84',0,0,X'87'
         DATA,1   X'88',0,0,X'92'
         DATA,1   0,X'94',X'95',0
*
         DATA,1   X'97',0,0,X'A2'
         DATA,1   0,X'A4',X'A5',0
         DATA,1   0,X'A8',X'A9',0
         DATA,1   X'4F',0,0,X'FF'
*
         PAGE
*
*
*        SEARCH FOR MATCH WITH R9.  ENTRY POINT
*        DETERMINES TCT SEARCHED.
*
*        I        R9 = VALUE
*        I        SR4 = LINK
*        V        R0 = TABLE BASE ADDRESS
*        0        R7 = TCT INDEX OF MATCH
*
*
SRCH:ADR LI,R0    SKDH:ADR          SET BASE ADDRESS FOR SEARCH
         B        SEARCH1
SRCH:FRE LI,R9    0                 SET ID=0 TO FIND FREE ENTRY
SRCH:ID  LI,R0    SKDH:ID           SET BASE ADDRESS FOR ID SEARCH
SEARCH1  LI,R7    TERMS             INITIALIZE TCT INDEX
SEARCH2  CH,R9    *R0,R7            COMPARE
         BE       SEARCHX           FOUND IT
         BDR,R7   SEARCH2           TRY ANOTHER
         B        *SR4              RETURN BAL+1, NONE FOUND
SEARCHX  AI,SR4   1                 BUMP RETURN ADDRESS
         B        *SR4              RETURN  BAL+2, TCTX IN R7
         PAGE
*
*
*        CHECK FOR DEAD USER
**
*
*         I        R7 - TCT INDEX
*        I        R0 - LINK REGISTER
         DO      UTS
         REF      UH:JIT
         REF     SMUIS
         FIN
DEADCHK  EQU     %
         DO      UTS
         PUSH    2,R7             SAVE R7,R8
         LH,R8   SKDH:ID,R7       GET SYSTEM ID
         LI,R7    SMUIS             MAX. NO. OF USERS
         AND,R8   =X'FFFF'
         CH,R8    UH:JIT,R7
         BE       %+3               YES ALIVE
         BDR,R7   %-2               NO TRY ANOTHER
         AI,R0    1                 DEAD BUMP RETURN
         PULL     2,R7              RESTORE REGISTERS
         FIN
DEADCHK1 EQU     %
         B        *R0               RETURN
         PAGE
          DO        1-UTS
*
*        SKD TERMINAL CONTROL TABLES
*
TERMS    EQU      16                TCT SIZE
         BOUND    4
SKDH:ADR EQU      %
         DO1      TERMS+1
         DATA,2   0
*
         BOUND    4
SKDH:CUR EQU      %
         DO1      TERMS+1
         DATA,2   0
*
         BOUND    4
SKDH:ID  EQU      %
         DO1      TERMS+1
         DATA,2   0
*
         BOUND    4
SKDH:STS EQU      %
         DO1      TERMS+1
         DATA,2   0
         BOUND    4
          FIN
          PAGE
:DOT     CNAME
         PROC
LF       GEN,8,8,8,8  AF(1),AF(2),AF(3),AF(4)
         PEND
*
*
*
DOT      EQU      %
         :DOT     0,1,0,0           FC=0
         :DOT     0,1,0,0           FC=1
         :DOT     0,1,0,0           FC=2
         :DOT     0,1,0,0           FC=3
         :DOT     0,1,DPOLCODE,RSTSCODE   FC=4
         :DOT     0,1,RWRTCODE,0          FC=5
         :DOT     0,1,DPOLCODE,0          FC=6
         :DOT     0,1,MPOLCODE,RDCODE     FC=7
         :DOT     0,1,ERRCODE,0           FC=8
         :DOT     0,1,SELCODE,0           FC=9
         :DOT     0,12,ARQCODE,0    FC=10
         :DOT     0,12,ARQCODE,0    FC=11
         :DOT     0,1,ARQCODE,PREPOLL     FC=12
         :DOT     0,12,RWRTCODE,SACKPOLL FC=13
         :DOT     0,12,RWRTCODE,SACKPOLL FC=14
         :DOT     0,1,BELLCODE,0          FC=15
         :DOT     0,1,PREPOLL,MPOLCODE    FC=16
         :DOT     0,1,PREPOLL,PREREAD    FC=17
         :DOT     0,1,SACKPOLL,RACKCODE  FC=18
          PAGE
SIO%FAIL EQU      8
IOBIT    EQU      X8
BRKBIT   EQU      X2
BRCSTBIT EQU      X1
SKD:MBUF EQU      1
SKD:PBUF EQU      4
SKD:RBUF EQU      6
SKD:XCL  EQU      14
SKD:PCL  EQU      26
SKD:RCL  EQU      36
SKD:FLG  EQU      0
SKD:EBUF EQU      3
TIME%OUT EQU      X'10'
ACKBIT   EQU      X'10'
DC4BIT   EQU      X'20'
         PAGE
*        FUNCTION CODES
*
OUT0CODE EQU      0
OUT1CODE EQU      1
INCODE   EQU      2
OUT2CODE EQU      3
DPOLCODE EQU      4
RACKCODE EQU      5
RSTSCODE EQU      6
MPOLCODE EQU      7
ERRCODE  EQU      8
SELCODE  EQU      9
RDCODE   EQU      10
REREAD   EQU      11
ARQCODE  EQU      12
RWRTCODE EQU      13
XMITCODE EQU      14
BELLCODE EQU      15
PREREAD  EQU      16
PREPOLL  EQU      17
SACKPOLL EQU      18
         PAGE
         BOUND    8
WDCSKEL  GEN,8,24,8,24   1,0,X'8E',0
WSKEL    GEN,8,24,8,24   1,0,X'1E',0
RDPOLCW  GEN,8,24,8,24   2,SKD:RBUF**2,X'1E',32
ARQCW    GEN,8,24,8,24   1,BA(ARQM),X'1E',4
DUMMY    GEN,8,24,8,24   1,BA(NULLS),X'1E',2
         GEN,8,24,8,24 11,0,X'1E',2
NULLS    DATA            0
ARQM     DATA,1   STX,DC1,ETX,X'90'
         PAGE
*
*          PREHANDLER ENTRY FROM STARTIO
*
*           STANDARD I/O ROUTINE REGISTER SETUP
*
*
SKDIO    EQU      %
         BAL,R0   SETUP
         LB,R6    IOQ5,R3
         B        PRETV,R6
*
PRETV    B        OUTPUT            0 (PUNCH)
         B        OUTPUT            1 (PRINT)
         B        INPUT             2 (READ)
         B        OUTPUT            3 (FORMAT)
         B        SENDPOL1          4 SEND DIAGNOSTIC POLL
         B        READPOLL          5 READ FOR ACK
         B        READPOLL          6 READ FOR STATUS
         B        SENDPOL2          7 SEND MESSAGE POLL
         B        ERROR05           8 ERROR (DUMMY CODE)
         B        ERROR05           9 DUMMY
         B        READ              10 READ MESSAGE
         B        READ              11 REREAD
         B        REQXMIT           12 REQUEST RETRANSMIT
         B        REWRITE           13 WRITE RETRY
         B        ERROR05           14 WRITE
         B        BELL              15 SEND BEL
         B        READPOLL          16 PREREAD POLL
         B        SENDPOL1          17 SEND PREREAD DPOLL
         B        SENDPOL1          18 SACK POLL
         PAGE
INPUT    LH,R10   IOQ9,R3           GETBYTE COUNT
         LI,R12   0                 CLEAR FLAGS
         CI,R10   8                 EQUAL 8
         BG       INPUT1            READ
         BL       ERROR06           BUFFER TOO SMALL
         LI,R10   DPOLCODE           STATUS READ
         STB,R10  IOQ5,R3
         B        SENDPOL1          SEND D POLL
INPUT1   LI,R10   PREPOLL           SET UP FOR
         B        %-3                 PRE READ D POLL
         PAGE
*
*
READPOLL LW,R8    R2
         SLS,R8   3                 CONVERT TO BYTE ADDR
         AD,R8    RDPOLCW           BUILD CDW
         STD,R8   SKD:RCL,R2        STORE
         ANLZ,R0  %-1               GET DW
*                                     ADDRESS
         B        PRE%EXIT+1        SKIP FUNCTION CODE
*
         PAGE
READ     LW,R8    IOQ8,R3
         LI,R10   2                 BUILD
         STB,R10  R8                  COMMAND
         LH,R9    IOQ9,R3              PAIR
         LI,R10   X'1E'
         STB,R10  R9
         AI,R8    8
         AI,R9    -8
         STD,R8   SKD:RCL,R2        STORE CDW
         ANLZ,R0  %-1               GET DW ADDRESS
         B        PRE%EXIT+1        GO
         PAGE
SENDPOL1 LI,R13   ENQ               DIAG POLL
         B        SENDPOLL
SENDPOL2 LI,R13   T                 MESSAGE POLL
SENDPOLL EQU     %
         DO       UTS
         LB,R7    IOQ15,R3        USER NUMBER
         LH,R9    UH:JIT,R7         USER IDENTIFIER
         ELSE
         LI,R9    255             DUMMY ID
         FIN
         BAL,SR4  SRCH:ID
         B        ERROR05
         STB,R7   R12               SAVE TCT INDEX IN FLAGWORD
         LW,R4    R2                FORM
         SLS,R4   3                  BYTE ADDRESS
         AI,R4    SKD:PBUF**2         OF POLL BUF
         LW,R8    R4                SAVE IN R4
         LI,R10   ETX               INITIALIZE BCC
         LI,R11   SOH
         STB,R11  0,R4              SOH
         AI,R4    1
         LH,R7    SKDH:ADR,R7
         SLD,R6   24
         EOR,R10  R6
         STB,R6   0,R4              AS
         AI,R4    1
         SLD,R6   8
         EOR,R10  R6
         STB,R6   0,R4              AF
         AI,R4    1
         LI,R6    DLE
         EOR,R10  R6
         STB,R6   0,R4              DLE
         AI,R4    1
         EOR,R10  R13
         STB,R13  0,R4              ENQ/T
         AI,R4    1
         LI,R6    ETX
         STB,R6   0,R4              ETX
         AI,R4    1
         STB,R10  0,R4              BCC
         LI,R9    7                 BYTE COUNT
         AD,R8    WSKEL
         STD,R8   SKD:PCL,R2
         ANLZ,R0  %-1
         OR,R12   IOBIT
         B        PRE%EXIT+1
         PAGE
REQXMIT  LB,R7    R12               GETCTX
         LI,R4    SKD:PBUF**-1
         AW,R4    R2
         SLS,R4   3
         LI,R10   SOH
         STB,R10  0,R4              SOH
         LW,R8    R2
         LI,R10   ETX
         AI,R4    1
         LH,R7    SKDH:ADR,R7
         SLD,R6   24
         STB,R6   0,R4              AS
         EOR,R10  R6
         SLD,R6   8
         AI,R4    1
         EOR,R10  R6
         STB,R6   0,R4              AF
         AI,R4    1
         LI,R6    DC4
         STB,R6   0,R4              DC4
         EOR,R10  R6
         AI,R4    1
         LI,R6    ETX
         STB,R6   0,R4              ETX
         AI,R4    1
         STB,R10  0,R4              BCC
         LI,R9    6
         AD,R8    WDCSKEL
         STD,R8   SKD:PCL,R2
         ANLZ,R0  %-1
         LD,R8    ARQCW
         STD,R8   SKD:PCL+2,R2
         OR,R12   IOBIT
         B        PRE%EXIT+1
         PAGE
REWRITE  LW,R0    R2
         AI,R0    SKD:XCL**-1
         OR,R12   IOBIT
         B        PRE%EXIT+1
         PAGE
*
*      ERROR HANDLER
*
ERROR01  LI,R8    1                 ILLEGAL SUBCODE
         B        ERR0R
ERROR02  LI,R8    2                 ILLEGAL SKD ADDRESS
         B        ERROR
ERROR03  LI,R8    3                 BUSY SKD
         B        ERROR
ERROR04  LI,R8    4                 NO TCT ENTRIES
         B        ERROR
ERROR05  LI,R8    5                 ???
         B        ERROR             ?
ERROR06  LI,R8    6                 BUFFER NOT WITHIN A PAGE
ERROR    LW,R7    IOQ6,R3           GET DCB ADDRESS
         LI,R9    X'7F'             MASK
         SLD,R8   17                STORE ERROR CODE
         STS,R8   7,R7               IN GENERATION FIELD OF DCB
         LI,R9       ERRCODE   (8)  FUNC CODE FOR DUMMY
*                                   PUTAWAY
         LI,R0    DA(DUMMY)         GET DA OF CDW
         B              PRE%EXIT
         PAGE
PRE%EXIT EQU      %
         STB,R9   IOQ5,R3           PUTAWAY FUNCTION CODE
         LI,R10   DOT
         SLS,R2   1                 WA(CLIST)
         STW,R12  SKD:FLG,R2        STORE FLAGS
         PULL     3,R2              RESTORE REGS
         LH,R8    DCT1,R1           GET ADDRESS
         AND,R8   XN2
         TDV,R7   *R8               GET DEVICE STATUS
         SCS,R7   8
         CI,R7    3                 SEE IF ANYONE ON LINE
         BAZ      %+5               YES, BRANCH
         LI,R9    0
         STB,R9   IOQ5,R3           RESET FUNCTION CODE
         LI,R0    DA(DUMMY)
         B        %+3
         CW,R12   IOBIT             OUTPUT
         BAZ      %+2               NO
         AI,R8    1                 SELECT ODD CHANNEL
         STH,R8   DCT1,R1           STORE ADDRESS
         B        IOSST
         PAGE
*
*        POST HANDLER ENTRY
*
SKDCU    EQU      %                 POST HANDLER
         LB,R6    IOQ5,R3           GET FUNCTION CODE
         LB,R8    DCT3,R1           SENSE
         CI,R8    SIO%FAIL            SIO
         BAZ      SKDCU01               FAILURE
         LI,R9    0                 CLEAR
         STB,R9   IOQ11,R3            RETRY COUNT
         LI,R13   0                 NO MESSAGE
         LI,R12   8                 TYC=8
         B        IOSCU
SKDCU01  CI,R8    TIME%OUT          TIMED OUT ?
         BAZ      POSTV,R6          NO
         LI,R13   0                 NO MESSAGE
         LI,R12   X'8008'         SET RETRY AND TYC
         B        IOSCU
         PAGE
POSTV    EQU      %
         B        ERRORP            0  YOU
         B        ERRORP            1   ARE
         B        ERRORP            2    CONFUSED
         B        ERRORP            3     IF YOU GET HERE
         B        POSTWRT           4  SEND D POLL
         B        POSTPOLL          5  READ FOR ACK
         B        POSTPOLL          6  READ FOR STATUS
         B        POSTWRT           7  SEND MESSAGE POLL
         B        ERRORP            8  ERROR (DUMMY WRT)
         B        POSTDUMY          9  DUMMY
         B        POSTREAD          10 READ MESSAGE
         B        POSTREAD          11 REREAD MESSAGE
         B        POSTWRT           12 REQUEST RETRANSMISSION
         B        POSTWRT           13 REWRITE
         B        POSTWRT           14 WRITE
         B        POSTBELL          15 BELL
         B        POSTPOLL          16 PRE READ STATUS POLL
         B        POSTWRT           17 SEND PRE READ D POLLL
         B        POSTWRT           18 SEND ACK POLL
         PAGE
ERRORP   LI,R12   5                 TYC=END OF SKD
          LI,R13    0
         B        IOSCU             BACK TO CLEAN UP
ERR0R03  AI,R5    -2
         LB,R0    0,R5
         CI,R0    SYN
         BNE      ERROR03
         AI,R5    2                 RESET R5
         B        OUTPUT1
POSTREAD EQU      %
         BAL,R0   SETUP
         LW,R13   IOQ8,R3           GET BUFFER ADDRESS
         SLS,R13  -2                WORD ADDRESS
         LI,R5    9                 POINT TO START OF BUFFER
         LB,R8   *R13,R5            GET AS
         SLS,R8   8
         AI,R5    1
         LB,R9   *R13,R5            GET AF
         AW,R9    R8                MERGE
         BAL,SR4  SRCH:ADR          FIND ADDRESS IN TCT
         B        ERRORPOL          NOT FOUND
         AI,R5    -1
         LI,R10    ETX            INITIALIZE CHECKSUM
READCON  LB,R6   *R13,R5            GET A CHARACTER
          BEZ      READCON1          IGNORE NULL
         CI,R6    ETX               ETX?
         BE       DONEREAD          YES
         EOR,R10  R6                ACCUMULATE BCC
         LB,R6    EBCDIC,R6         CONVERT
         BEZ      ERROREAD          PARITY ERROR
         STB,R6  *R13,R5            STORE CONVERTED CHAR IN BUF.
READCON1 AI,R5    1                 NEXT
         CH,R5    IOQ9,R3           END OF DATA
         BL       READCON
         LW,R13   R5                NO ETX,LOST DATA
         AI,R13   -8                SET AMS
         B        POSTPOL1+1        EXIT
DONEREAD  LB,R6   EBCDIC,R6         CONVERT
         BEZ      ERROREAD
         STB,R6  *R13,R5            STORE ETX
         AI,R5    1
         LB,R6   *R13,R5            GET BCC
         EOR,R10  R6
         BNEZ     ERROREAD          LRC ERROR
         LW,R13   R5
         AI,R13   -8                SET ACTUAL MESSAGE SIZE
         BAL,R0   STATUSIN          STORE STATUS
         BAL,R0   ZAPTCT            CLOSE
         B        POSTPOL3+2        EXIT
ERROREAD EQU      POSTPOL4+2        RETRY
         PAGE
POSTPOLL EQU      %
         BAL,R0   SETUP             SETUP REGS,GETS FLAGS,TCTX
         AI,R2    SKD:RBUF**-1      GET BA
         SLS,R2   3                   OF RBUF
         AI,R2    1                 POINT TO AS
         LB,R9    0,R2
         SLS,R9   8
         AI,R2    1                 POINT TO AF
         LB,R8    0,R2
         AW,R9    R8                FORM ADDRESS
         BAL,SR4  SRCH:ADR          FIND IF IN TCT
         B        ERRORPOL          NOT FOUND
         CB,R7    R12               POLLED TERMINAL?
         BNE      ERRORPOL          NO
         LI,R13   11                SCAN COUNT
SCANPOLL AI,R2    1                 GET NEXT
         LB,R8    0,R2                CHAR
         CI,R8    ACK               ACK
         BNE      SCAN01            NO
         AI,R12   ACKBIT            SET ACKBIT
SCAN01   CI,R8    ESC               ESC
         BNE      SCAN02            NO
         AI,R2    2                 SKIP =
         LB,R4    0,R2              GET LINE NO
         LB,R8    EBCDIC,R4         CONVERT
         SLS,R8   8
         AI,R2    1                 GET CHAR
         LB,R4    0,R2               POSITION
         LB,R4    EBCDIC,R4         CONVERT
         AW,R8    R4                COMBINE
         STH,R8   SKDH:CUR,R7       STORE IN TCT
         B        SCANEXT
SCAN02   CI,R8    DC4               DC4?
         BNE      SCAN03             NO
         AI,R12   DC4BIT            SET DC4 FLG
         B        SCANEXT
SCAN03   CI,R8    D                 TYPE=D ?
         BNE      SCAN04
         AI,R2    1
         LB,R11   0,R2              GET S1
         LH,R9    SKDH:STS,R7       GET OLD STATUS
         AI,R2    1
         LB,R10   0,R2              GET S2
         AND,R8   M4                GET TERMINAL
         AI,R8    -4                   TYPE
         SLS,R9   -12               SCRUB
         SLS,R9   12                 OLD STATUS
         SLS,R10  4                 MERGE FUNCTION KEYS
         OR,R10   R8                 WITH TERMINAL TYPE
         SLS,R10  8
         OR,R10   R11               MERGE S1
         OR,R10   R9                MERGE OLD STATUS
         STH,R10  SKDH:STS,R7       STORE
         B        SCANEXT
SCAN04   CI,R8    E                 TERMINL TYPE 1
         BE       SCAN03+2
         CI,R8    F                 TERMINAL TYPE 2
         BE       SCAN03+2
         CI,R8    ETX               END?
         BE       POSTPOLT          YES
SCANEXT  BDR,R13  SCANPOLL          CONTINUE SCAN
ERRORPOL PULL     3,R2              ERROR NO ETX
         LI,R12   X'8008'           SET RETRY
         LI,R13   0                 NO MESSAGE
         B        IOSCU
POSTPOLT LB,R6    IOQ5,R3           GET FUNCTION
         CI,R6    PREREAD
         BNE      POSTPOL2          NO
         CI,R10   1                 MESSAGE'WAITING
         BAZ      POSTPOL1          NO
         LI,R12   X'6000'           SET FOLLOW ON AND INTER-OP
POSTPOLX LI,R13   0                 NO MESSAGE
         PULL     3,R2              RESTORE REGS
         B        IOSCU
POSTPOL1  LI,R12    5                 TYC=LOST DATA
         BAL,R0   STATUSIN          STORE STATUS
         BAL,R0   ZAPTCT            CLOSE
          LI,R13    0                 NO MESSAGE
         B        POSTPOLX
POSTPOL2 CI,R6    RSTSCODE          READ STATUS?
         BNE      POSTPOL3          NO
         LI,R12   1                 TYC=NORMAL
         B        POSTPOL1+1
POSTPOL3 CI,R12   ACKBIT            MUST BE READ FOR ACK
         BAZ      POSTPOL4          NAK
         LI,R12   1                 TYC=NORMAL
         B        POSTPOLX
POSTPOL4 CW,R12   BRCSTBIT          CHECK FOR BROADCAST
         BANZ     %-3
         LI,R12   X'A000'           RETRY
         LI,R13   0                 NO MESSAGE
         B        POSTPOLX
         PAGE
POSTWRT  EQU      %
          BAL,R0   SETUP
          CW,R12   BRCSTBIT
          BAZ      POSTWRT1
          LB,R7     R12               GET TCT INDEX
          LI,R12   1                TYC=NORMAL
          B         POSTPOL1+2
POSTWRT1  EQU      %
         LI,R12   X'4000'           SET CONTINUATION
         B        POSTPOLX
POSTBELL EQU      %
         LI,R12   1                 CLR REGS
         LI,R13   0
         B        IOSCU             BACK TO CLEANUP
POSTDUMY EQU      POSTBELL
         PAGE
*
*  SETUP REGISTERS
*
*
SETUP    PUSH     3,R2              SAVE R2-4
         LH,R2    DCT7,R1
         LD,R12   0,R2              GET FLAGS
         AND,R12  FLGMSK            RESETS IOBIT
         LW,R5   IOQ8,R3            ERROR IF
         BLZ      ERROR06            DATA CHAINED
         LH,R8    IOQ9,R3           GET BYTE COUNT
         AI,R8    -1
         AW,R8    R5                FIND END OF BUFFER
         SLS,R8   -11               SCRUB
         SLS,R5   -11               SCRUB
         CW,R8    R5                DOES THE BUFFER CROSS A PAGE BOUNDARY
         BNE      ERROR06           YES, ERROR
         B       *R0
FLGMSK   DATA     X'FFFFFF07'
         PAGE
*
*        STATUS IN  STORES  STATUS
*
*        I        R0                LINK
*        I        R7                TCT INDEX
*        V        R10               VOL.
*        I        R13               AMS
*        V        R5                VOL
STATUSIN LH,R10   SKDH:STS,R7       GET STATUS
         LW,R5    IOQ8,R3           BUFFER ADDRESS
         SLS,R5   -1                HALFWORD ADDRESS
         STH,R10  0,R5
         AI,R5    1
         LH,R10   SKDH:ADR,R7       ADDRESS
         STH,R10  0,R5
         AI,R5    1
         LH,R10   SKDH:CUR,R7       CURSOR POSITION
         STH,R10  0,R5
         AI,R5    1
         STH,R13  0,R5              ACTUAL MESSAGE SIZE
         B       *R0
         PAGE
*
*        ZAP TCT  ENTRIES
*
*        I        R7=TCT INDEX OF ENTRIES TO BE ZAPPED
*        I        R0=LINK
*        V        R10=TEMP
*
ZAPTCT   LI,R10   0
         STH,R10  SKDH:ADR,R7       CLEAR
         STH,R10  SKDH:ID,R7         TCT
         STH,R10  SKDH:STS,R7         ENTRIES
         LI,R10   -1                X'FF' IMPLIES
         STH,R10  SKDH:CUR,R7       NO CURSOR POSITION
         B       *R0
         PAGE
*
*        PREHANDLER ENTRY POINT FOR I/O FUNCTION CODES
*        THAT DEAL WITH OUTPUT TO THE SKD.  APPROPRIATE
*        OPERATIONS ARE HANDLED BY THE VECTOR TABLE:
*                 X'00' => SELECT
*                 X'01' => WRITE
*                 X'02' => WRITE WITH MANDATORY SELECTION
*                 X'03' => BELL
*
*        DETERMINATION OF THE OPERATION CODE IS EXTRACTED
*        FROM THE FIRST BYTE OF THE USER'S WRITE BUFFER.
*        EACH BUFFER CONTAINS A 1-WORD HEADER AS THE FIRST
*        ENTRY THAT MUST CONFORM TO THE FOLLOWING:
*                -----------------------------
*                ' CODE ' 0--0 '  AS  '  AF  '
*                -----------------------------
*        WHERE...     CODE = THE OPERATION CODE ABOVE
*                     AS   = THE ADDRESS STARTED CHARACTER
*                     AF   = THE ADDRRSS FOLLOWER CHARACTER
*
*        THE FOLLOWING REGISTERS ARE USED:
*                 R1 = DCT INDEX
*                 R2 = DA(CLIST)
*                 R3 = IOQ INDEX
*                 R7 = TCT INDEX
*                 R12= FLAGWORD
*        OTHER REGISTERS ARE USED FOR SCRATCH COMPUTATION
*        AND STORAGE TRANSFER.
*
         PAGE
OUTPUT   EQU      %
         LI,R12   0                 ZAP FLAGS
         LW,R5    IOQ8,R3           USER BUFFER ADDRESS
         LB,R6    0,R5              OPERATION BYTE
         AND,R6   M4                SCRUB SUBCODE TO FOUR BITS
         CI,R6    MAXOPS            LEGAL OPERATION?
          BE       INPUT
          BG       ERROR01
         AI,R5    2                 POINT TO ADDRESS FIELD
         LI,R9    0                 CLEAR R9
         LB,R7    0,R5              GET ADDR STARTER
         LB,R7    ASCII,R7          CONVERT TO ASCII
         AW,R9    R7                STORE IN R9
         AND,R7   M7                MASK OFF PARITY BIT
         CLM,R7   ASLIMITS          LEGAL STARTER?
         BCS,9    ERROR02           NO, OUTSIDE LIMITS
         BCS,3    %+2               UNIVERSAL IDENTIFIER FALLS THROUGH
         OR,R12   BRCSTBIT          SET BROADCAST BIT
         AI,R5    1                 BUMP ADDRESS
         LB,R7    0,R5              GET ADDR FOLLOWER
         LB,R7    ASCII,R7          CONVERT TO ASCII
         SLS,R9   8                 SHIFT R9
         AW,R9    R7                STORE WITH STARTER
         AND,R7   M7                MASK OFF PARITY BIT
         CLM,R7   AFLIMITS          LEGAL FOLLOWER?
         BCS,9    ERROR02           NO, OUTSIDE LIMITS
         BCS,3    %+2               UNIVERSAL IDENTIFIER FALLS THROUGH
         OR,R12   BRCSTBIT          SET BROADCAST BIT
         BAL,SR4  SRCH:ADR          FIND ADDR IN TCT
         B        OUTPUT2           NOT THERE, BRANCH
         DO       UTS
         PUSH     R7               SAVE TCT INDEX
         LB,R7    IOQ15,R3         GET USER NUMBER
         LH,SR4   UH:JIT,R7         FIND USER IDENTIFIER
         PULL     R7               RESTORE TCT INDEX
         ELSE
         LI,SR4   255              DUMMY ID
         FIN
         CH,SR4   SKDH:ID,R7        SAME USER?
         BE       OUTPUT1           YES, SETUP TCT
         BAL,R0   DEADCHK           DEAD USER?
         B        ERR0R03
OUTPUT1  BAL,R0   ZAPTCT            ZERO TCT ENTRIES
         STH,R9   SKDH:ADR,R7       STORE ADDR CHARACTERS
         STH,SR4  SKDH:ID,R7        STORE USER ID
         STB,R7   R12               STORE TCT INDEX IN FLAGWORD
         B        OUTVT,R6          BRANCH TO APPROPRIATE ROUTINE
OUTPUT2  LW,R13   R9                SAVE R9
         BAL,SR4  SRCH:FRE          LOOK FOR EMPTY SLOT IN TCT
         B        ERROR04           NONE AVAILABLE
         LW,R9    R13               RESTORE R9
         DO       UTS
         PUSH     R7               SAVE TCT INDEX
         LB,R7    IOQ15,R3         GET USER NUMBER
         LH,SR4   UH:JIT,R7         FIND USER IDENTIFIER
         PULL     R7               RESTORE TCT INDEX
         ELSE
         LI,SR4   255              DUMMY ID
         FIN
         B        OUTPUT1           BRANCH BACK
*
         PAGE
OUTVT    EQU      %                 OUTPUT VECTOR TABLE
         B        SELECT            X'00' => SELECT
         B        WRITE             X'01' => WRITE
         B        MANWRITE          X'02' => WRITE WITH MANDATORY SEL.
         B        BELL              X'03' => BELL
MAXOPS   EQU      %-OUTVT           MAX # OF OUTPUT OPERATIONS
         BOUND    8
ASLIMITS DATA     X'20',X'4F'       STARTER LIMITS   SP - O
AFLIMITS DATA     X'50',X'7E'       FOLLOWER LIMITS  P - TILDE
*
         PAGE
SELECT   EQU      %
         LI,R9    SELCODE           SET FUNC CODE TO POST SELECT
         LI,R0    DA(DUMMY)         ADDR OF DUMMY OPERATION CDW
         OR,R12   IOBIT             SET I/O BIT TO OUT
         B        PRE%EXIT
*
ERR0R    EQU      %
         CI,R6    ACK
         BNE      ERROR
         LI,R9    SELCODE
         LI,R0    DA(DUMMY)+1
         B        SELECT+2
         PAGE
MANWRITE EQU      %
         OR,R12   BRKBIT            SET BREAK BIT AND FALL THROUGH
*
*
WRITE    EQU      %
         BAL,SR4  SUBWRITE          BUILD START OF SUPERVISORY MESSAGE
         CW,R12   BRKBIT            BREAK CHAR NECESSARY?
         BAZ      WRITE1            NO, BRANCH
         LI,R10   DC4               GET BREAK CHARACTER
         EOR,R13  R10               CHECKSUM
         STB,R10  0,R4              STORE DC4 IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
WRITE1   LI,R10   ETX               GET ETX CHARACTER
         STB,R10  0,R4              STORE ETX IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         STB,R13  0,R4              STORE BCC IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         LI,R10   STX               GET STX CHARACTER
         STB,R10  0,R4              STORE STX IN MESSAGE BUFFER
         LD,R8    WDCSKEL           PICK UP WRITE SKELETON CDW
         AI,R4    -5                RESET POINTER
         AI,R9    6                 BYTE COUNT TO CDW
         CW,R12   BRKBIT            BREAK CHAR IN MESSAGE?
         BAZ      WRITE2            NO, BRANCH
         AI,R4    -1                RESET POINTER
         AI,R9    1                 BUMP BYTE COUNT
WRITE2   AW,R8    R4                BYTE ADDR TO CDW
         STD,R8   SKD:XCL,R2        STORE CDW IN TRANSMIT MESSAGE CLIST
         LI,R13   ETX               INITIALIZE CHECKSUM TO ETX
         LH,R11   IOQ9,R3           USER BYTE COUNT
         AI,R11   -4                SUBTRACT HEADER COUNT
         LD,R8    WDCSKEL           PICK UP WRITE SKELETON CDW
         AW,R9    R11               BYTE COUNT TO CDW
         AI,R5    1                 BUMP ADDR TO POINT TO MESSAGE
         AW,R8    R5                ADDR TO CDW
WRITE3   LB,R4    0,R5              GET CHARACTER
         LB,R4    ASCII,R4          CONVERT TO ASCII
         EOR,R13  R4                CHECKSUM
         STB,R4   0,R5              STORE BACK IN BUFFER
         AI,R5    1                 BUMP ADDRESS
         BDR,R11  WRITE3            LOOP TILL END OF MESSAGE
         STD,R8   SKD:XCL+2,R2      STORE CDW IN TRANSMIT MESSAGE CLIST
         LI,R10   ETX               GET ETX CHARACTER
         LW,R4    R2                CLIST ADDRESS
         SLS,R4   3                 CONVERT TO BYTE ADDR
         AI,R4    SKD:EBUF**2       POINT TO START OF END-MESSAGE BUFFER
         STB,R10  0,R4              STORE ETX IN MESSAGE BUFFER
         LD,R8    WSKEL             PICK UP WRITE SKELETON CDW
         AW,R8    R4                ADDR TO CDW
         AI,R9    2                 BYTE COUNT TO CDW
         AI,R4    1                 BUMP POINTER
         STB,R13  0,R4              STORE BCC IN MESSAGE BUFFER
         STD,R8   SKD:XCL+4,R2      STORE CDW IN TRANSMIT MESSAGE CLIST
         LI,R9    XMITCODE          SET FUNC CODE TO POST-WRITE
WRITE4   LW,R0    R2                CLIST ADDR
         AI,R0    SKD:XCL**-1       DISP TO TRANSMIT MESSAGE CLIST
         OR,R12   IOBIT             SET I/O BIT TO OUT
         B        PRE%EXIT
*
         PAGE
BELL     EQU      %
         BAL,SR4  SUBWRITE          BUILD START OF SUPERVISORY MESSAGE
         LI,R10   BEL               GET BELL CHARACTER
         EOR,R13  R10               CHECKSUM
         STB,R10  0,R4              STORE BELL IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         LI,R10   ETX               GET ETX CHARACTER
         STB,R10  0,R4              STORE ETX IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         STB,R13  0,R4              STORE BCC IN MESSAGE BUFFER
         LD,R8    WSKEL             PICK UP WRITE SKELETON CDW
         AI,R4    -5                RESET POINTER
         AI,R9    6                 BYTE COUNT TO CDW
         AW,R8    R4                BYTE ADDR TO CDW
         STD,R8   SKD:XCL,R2        STORE CDW IN TRANSMIT MESSAGE CLIST
         LI,R9    BELLCODE          SET FUNC CODE TO BELL
         B        WRITE4            BRANCH
*
         PAGE
SUBWRITE EQU      %                 BUILD START OF SUPERVISORY MESSAGE
         LI,R10   SOH               GET START OF HEADER
         LW,R4    R2                CLIST ADDR
         SLS,R4   3                 CONVERT TO BYTE ADDR
         AI,R4    SKD:MBUF**2       POINT TO START OF MESSAGE BUFFER
         STB,R10  0,R4              STORE SOH
         AI,R4    1                 SUMP POINTER
         LI,R13   ETX               INITIALIZE CHECKSUM TO ETX
         SLD,R8   24                PUT STARTER IN LOW-ORDER BYTE
         EOR,R13  R8                CHECKSUM
         STB,R8   0,R4              STORE STARTER IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         SLD,R8   8                 PUT FOLLOWER IN LOW-ORDER BYTE
         EOR,R13  R8                CHECKSUM
         STB,R8   0,R4              STORE FOLLOWER IN MESSAGE BUFFER
         AI,R4    1                 BUMP POINTER
         B        *SR4              RETURN
*
         END
