! FILE 'FEP_DQS12E'
!**************
!*  DQS11E    *
!*DA:01.APR.80*
!**************

CONTROL  K'100001';                    ! 'SYSTEM' PROGRAM AND
                                       ! TRUSTED PROG


RECORDFORMAT  PARF(INTEGER  TYPE, ADDRESS, LEN)

EXTERNALROUTINE  DQS11E(RECORD  (PARF) NAME  P)

     SYSTEMROUTINESPEC  MAPHWR(INTEGER  SEG)
     SYSTEMINTEGERFNSPEC  GETID
     SYSTEMROUTINESPEC  LINKIN(INTEGER  SER)
     SYSTEMINTEGERFNSPEC  MAP ABS(INTEGER  ADR, LEN, REQ ID)

     RECORDFORMAT  PF(BYTEINTEGER  SER, REPLY, INTEGER  A1, A2, A3)

     RECORDFORMAT  DQS11F(INTEGER  MCSR, TCSR, RSR, RCR, TWCR, TCAR, C 
       RWCR, RCAR)

     OWNRECORD  (DQS11F) NAME  DQS = 1;    ! SET UP BY PROT ON INITIALISE

      RECORDFORMAT  PAR2F(INTEGER  TYPE, RECORD  (DQS11F) NAME  ADDRESS,LEN)

      RECORD  (PAR2F) NAME  P2

      CONSTINTEGER  INITIALISE = 0
     CONSTINTEGER  LINE INPUT = 1
     CONSTINTEGER  LINE OUTPUT = 2
      CONSTINTEGER  INPUT HERE = 3
      CONSTINTEGER  OUTPUT DONE = 4
      CONSTINTEGER  MODEM STATUS = 5


     CONSTINTEGER  TXGO = K'111'
     CONSTINTEGER  RXGO = K'111'

     OWNINTEGER  TX REPLY, RX REPLY

     ROUTINESPEC  OCTAL(INTEGER  N)

      SWITCH  TYPESW(INITIALISE:MODEM STATUS)


     OWNINTEGER  TYPE, F, CAD, OSEG, I, EXT BITS
     OWNINTEGER  PAR, MID, PAD

      OWNINTEGERARRAY  RADDR(0:7)

      -> TYPE SW(P_TYPE)

TYPE SW(INITIALISE):
     MID = GET ID
     MAPHWR(3)
     P2 == P
     DQS == P2_ADDRESS
     DQS_MCSR = K'40003';              ! DON'T TRANSFER THE CRC
     DQS_RCR = K'10';                  ! ENABLE RECEIVER
     DQS_TCSR = K'10';                 ! ENABLE TRANSMITTER
     CYCLE  I = 1, 1, 7;              ! FIND ABSOLUTE ADDRESSES
        RADDR(I) = MAP ABS(I<<13, 256, MID); ! MY ADDRESSES
        F = MAP ABS(I<<13, 0, MID);      ! AND OFF AGAIN
      REPEAT 
      RX REPLY = 0; TX REPLY = 0
      RETURN 

TYPE SW(OUTPUT DONE):
                                       ! TRANSMITTER
              TYPE = LINE OUTPUT
              IF  DQS_TCSR < 0 OR  TXREPLY = 0 START 
                 !! TRANSMITTER ERROR
                 PRINTSTRING('TX ERROR
')
                 P_LEN = 1
              ELSE 
                 P_LEN = 0
              FINISH 
            P_TYPE = LINE OUTPUT
              TXREPLY = 0
              RETURN 

TYPE SW(INPUT HERE):
              !! RECEIVER INTERRUPT
              IF  DQS_RSR&K'34067' # 0 OR  RX REPLY = 0 START 
                 F = -2;          ! FRAME ERROR
                 IF  DQS_RSR&K'20' # 0 THEN  F = -3;  ! SILO FULL
FLT:             DQS_RCR = 0;          ! CLEAR DOWN
                 DQS_RCR = K'10';      ! AND UP AGAIN
              ELSE 
                 IF  DQS_RSR&K'1000' # 0 THEN  F = -1 AND  -> FLT
                                       ! WC OVERFLOW
                 F = DQS_RCAR-CAD-2 
                                       ! NUMBER OF BYTES TRANS
                 IF  DQS_RSR&K'074000' # 0 THEN  F = F-1
                  IF  F> 252 START 
                      PRINTSTRING("DQS NASTY:")
                      OCTAL(DQS_RCAR); SPACE; OCTAL(CAD); SPACE; OCTAL(F);NEWLINE

                  FINISH 
               FINISH 
               P_TYPE = LINE INPUT
              P_ADDRESS = PAD;         ! PASS BLOCK ADDRESS BACK
               P_LEN = F
              RX REPLY = 0
            RETURN 

TYPE SW(LINE INPUT):
           !! USER CALL
              !! READ REQUEST
              IF  RX REPLY # 0 THEN  -> ABORT
              RXREPLY = MID
              PAD = P_ADDRESS
!              PAR = MAP ABS(PAD, P_LEN, RXREPLY)
              PAR = RADDR(PAD>>13)
              IF  PAR = 0 THEN  -> ABORT
              PAR = PAR+(PAD&K'17700')>>6; ! ENSURE ACTUAL BLOCK
              EXT BITS = (PAR&K'176000')>>6
              CAD = PAR << 6+PAD&K'77'
              DQS_RCAR = CAD
              DQS_RWCR =- (P_LEN >> 1)
              DQS_RCR = RXGO!EXT BITS
         RETURN 

TYPE SW(LINE OUTPUT):
              !! OUTPUT REQUEST
              IF  TX REPLY # 0 THEN  -> ABORT
              TX REPLY = MID
              OSEG = P_ADDRESS
!              PAR = MAP ABS(OSEG, P_LEN, TX REPLY)
              PAR = RADDR(OSEG>>13)
              IF  PAR = 0 THEN  -> ABORT
              PAR = PAR+(OSEG&K'17700')>>6;  ! ENSURE ACTUAL BLOCK
              EXT BITS = (PAR&K'176000')>>6
              DQS_TCAR = PAR << 6+P_ADDRESS&K'77'
              F = 0
              DQS_TWCR =- ((P_LEN+1) >> 1)
              IF  P_LEN&1 # 0 START 
                 F = K'040000';        ! 8 IN REMAINING BIT FIELD
              FINISH 
              DQS_TCSR = TX GO!F!EXT BITS
         RETURN 

TYPE SW(MODEM STATUS):
      P_TYPE = 0;         ! FOR NOW
      RETURN 

ABORT:
     PRINTSTRING('DQS FAIL
')
     CYCLE ;  REPEAT 


     ROUTINE  OCTAL(INTEGER  N)
        INTEGER  I
        PRINTSYMBOL((N >> I)&7+'0') FOR  I = 15, -3, 0
     END 
END 
ENDOFFILE