DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Wang WCS documentation floppies

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Wang WCS documentation floppies

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦91ebd4497⟧ Wang Wps File

    Length: 40059 (0x9c7b)
    Types: Wang Wps File
    Notes: CPS/SDS/028               
    Names: »1690A «

Derivation

└─⟦6ff65156a⟧ Bits:30006101 8" Wang WCS floppy, CR 0160A
    └─ ⟦this⟧ »1690A « 

WangText



…0c……05……0c……07……0b……0a……0b……0c……0b……0f……0b……06……0a……0c……0a……00……0a…              …09……08……09……0a……09……86…1
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
              …02… 
               
               
               
               
               …02…
               
              …02… 
               
               
               
              

…02…CPS/SDS/028

…02…820514…02……02…
I/O CONTROL
DETAILED DESIGN
 SPECIFICATION…02……02…CAMPS









   SEND ̲OUTPUT ̲BUFFER (TYPE:BUFFER ̲TYPES,BYTE ̲COUNT:INTEGER)()

   B ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY

   B ̲REF.BUFFER ̲SIZE=BYTE ̲COUNT

   OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=NO ̲BUF

   BUFFER=B ̲REF.PAGE ̲START

   START =B ̲REF.BUFFER ̲ADDR

   BUFFER(START+BUFFER ̲TYPE ̲OFFSET)=TYPE,DATA

   TYPE INDICATE START 
   OR ENTIRE LDU
                                          P̲R̲O̲C̲ ̲F̲O̲R̲ ̲F̲I̲R̲S̲T̲
                                          ̲B̲U̲F̲F̲E̲R̲ ̲5̲

   OWN ̲SDID.OUTPUTTER.SPI.PRIORITY=DATA ̲PRIORITY

   OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.BUFFER
   ̲ENTRY

   OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=NO ̲BUF

   ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID,PARENT ̲SDID,

       TRANSMIT ̲OUTPUT ̲BUFFER,

       OWN ̲SIDI.OUTPUTTER.SPI (CCP)

   TYPE INDICATE
   END OR ENTIRE LDU
                                          PROC ̲FOR ̲END
                                          ̲OF ̲OUTPUT()()

   RETURN










                Figure 4.1.5.4.5.2-4


P̲R̲O̲C̲ ̲F̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲5̲

   GET NEXT LDU

OWN ̲SDID,OUTPUTTER,LDU?
GE MAX ̲LDU

OWN ̲SDID.OUTPUTTER.LDU+1                  OWN ̲SDID.OUTPUTTER.LDU=0

BUFFER(START+LDU ̲OFFSET) = OWN ̲SDID.OUTPUTTER.LDU

OWN ̲SDID.OUTPUTTER. STATE= SUBSEQUENT ̲BUFFER

   SAVE LDU IN QUEUE ELEMENT

OWN ̲SDID.OUTPUTTER.ONGOING.EP.LDU=

   OWN ̲SDID.OUTPUTTER.LDU




























                Figure 4.1.5.4.5.2-5


4.1.5.4.5.3    PARENT PROCEDURES

           These are: NOTIFY ̲OUTPUTTER ̲OF ̲STATUS

                      NOTIFY ̲OUTPUTTER ̲OUTPUT ̲BUFFER




   NOTIFY ̲OUTPUTTER ̲OF ̲STATUS (BUFFER ̲ENTRY:POINTER)()

   BUFFER=BUFFER ̲ENTRY.PAGE ̲START

   START=BUFFER(START+TRANSMISSION ̲STATUS ̲LDU ̲OFFSET)

       LOOK FOR CORRESPONDING QEL IN WAIT ̲COMPLETION QUEUE

   CASE SEARCH ̲RECORD (OWN ̲SDID.OUTPUTTER.WAIT ̲COMPLETION,
                       OFFSET ̲OF ̲LDU ̲IN ̲IO ̲QEL,LDU)(QEL)OF

       FAIL ?          R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲ ̲2̲

       PASS?           P̲R̲O̲C̲ ̲F̲O̲R̲ ̲C̲O̲M̲P̲L̲E̲T̲E̲D̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲

   END CASE

   RETURN





























                Figure 4.1.5.4.5.3-1


   R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲2̲

   OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=BUFFER ̲ENTRY

   ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID,

           RELEASE ̲INPUT BUFFER,

           OWN ̲SDID.OUTPUTTER.SPI) (CCP)









































                Figure 4.1.5.4.5.3-2


   P̲R̲O̲C̲ ̲F̲O̲R̲ ̲C̲O̲M̲P̲L̲E̲T̲E̲D̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲



   CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER.WAIT
   ̲COMPLETION)() OF

       FAIL ?      PROTOCOL ̲ERROR(OUTPUTTER ̲3 ̲3 ̲A)

       PASS ?

   END CASE

   CASE QEL.REQUESTOR OF

       PROTOCOL ? - PROTOCOL ̲OUTPUT ̲RESULT(QEL,BUFFER
       ̲ENTRY)()

       USER ?       USER ̲OUTPUT ̲RESULT(QEL,BUFFER ̲ENTRY)()

       CONTROLLER ? CONTROLLER ̲OUTPUT ̲RESULT(QEL,BUFFER
       ̲ENTRY)()

       SUBDEVICE ?  SUBDEVICE ̲OUTPUT ̲RESULT(QEL,BUFFER
       ̲ENTRY)()

       OTHER ?      PROTOCOL ̲ERROR (OUTPUTTER ̲3 ̲3 ̲B) 
        

   END CASE





















                Figure 4.1.5.4.5.3-3


   NOTIFY ̲OUTPUTTER ̲OUTPUT ̲BUFFER(BUFFER ̲ENTRY:POINTER)()

   OWN.SDID.OUTPUTTER.BUFFER ̲ENTRY=BUFFER ̲ENTRY

   OWN ̲SDID.OUTPUTTER.STATE ?
       EQ CANCELLED

   RETURN ̲OUTPUT ̲BUFFER ()()     SHIP ̲CANCEL ̲OUTPUT()()

                                 OWN ̲SDID.OUTPUTTER.STATE=IDLE

                                 PROCESS ̲FOR ̲NEXT ̲OUTPUT()()

   RETURN





























                Figure 4.1.5.4.5.3-4


4.1.5.4.5.4    O̲U̲T̲P̲U̲T̲ ̲C̲O̲M̲P̲L̲E̲T̲I̲O̲N̲

           These are: PROC ̲FOR ̲END ̲OF ̲OUTPUT

                      NEXT ̲OUTPUT

                      PROC ̲FOR ̲NEXT ̲OUTPUT




   PROC ̲FOR ̲END ̲OF ̲OUTPUT ()()

       MOVE QEL TO QUEUE OF OUTPUTS AWAITING RESPONSE

   CASE EXTRACT ̲FIRST(OWN ̲SDID.OUTPUTTER.ONGOING)(QEL)OF

       FAIL ?      PROTOCOL ̲ERROR (OUTPUTTER ̲4 ̲1)

       PASS ?

   END CASE

   QUEUE (OWN ̲SDID.OUTPUTTER.WAIT ̲COMPLETION,QEL)

   OWN ̲SDID.OUTPUTTER.STATUS=IDLE

   RETURN






























                Figure 4.1.5.4.5.4-1


   NEXT ̲OUTPUT() (CC:COMPLETION ̲CODE)

   CASE EXTRACT ̲FIRST(OWN ̲SDID.OUTPUTTER.PENDING)(QEL)OF

       FAIL ?

       PASS ?

   END CASE

   QUEUE(OWN ̲SDID.OUTPUTTER.ONGOING,QEL)()

   OWN ̲SDID.OUTPUTTER.STATE=FIRST ̲BUFFER

   OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=PENDING ̲RESERVE

   OWN ̲SDID.OUTPUTTER.SPI.PRIORITY=DATA ̲PRIORITY

   ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID,

       RESERVE ̲OUTPUT ̲BUFFER,

       OWN ̲SDID.OUTPUTTER.SPI)(CCP)

   CCP EQ REQUEST ̲QUEUED ?   CC=REQUEST ̲QUEUED

   OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY=

       OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY

   CC=OK

   RETURN














                Figure 4.1.5.4.5.4-2


   PROC ̲FOR ̲NEXT ̲OUTPUT ()()

   NEXT ̲OUTPUT () (CCP)

   CCP NE OK ?

       BUFFER IS AVAILABLE



   RETURN ̲OUTPUT ̲BUFFER ()()

   RETURN


































                Figure 4.1.5.4.5.4-3


4.1.5.4.5.5    R̲E̲Q̲U̲E̲S̲T̲O̲R̲ ̲N̲O̲T̲I̲F̲I̲C̲A̲T̲I̲O̲N̲

           This is: RETURN ̲OUTPUT ̲BUFFER




   RETURN ̲OUTPUT ̲BUFFER ()()

   OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=DELIVERED

   EQUIVALENCE(OWN ̲SDID.OUTPUTTER.ONGOING.EP,QEL:IO ̲QEL)

   BUFFER ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY

   OWN ̲SDID.OUTPUTTER.STATE ?
   EQ FIRST ̲BUFFER

   N̲O̲T̲I̲F̲Y̲ ̲N̲E̲X̲T̲                            N̲O̲T̲I̲F̲Y̲ ̲F̲I̲R̲S̲T̲
   B̲U̲F̲F̲E̲R̲ ̲2̲ ̲                              B̲U̲F̲F̲E̲R̲ ̲3̲  

   RETURN






























                Figure 4.1.5.4.5.5-1


   N̲O̲T̲I̲F̲Y̲ ̲N̲E̲X̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲2̲ ̲

   CASE QEL.REQUESTOR OF

       PROTOCOL ?  NOTIFY ̲PROTOCOL ̲SUBSEQUENT ̲OUTPUT ̲

                   BUFFER (QEL,BUFFER ̲REF) ()

       USER ?      NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲

                   BUFFER (QEL,BUFFER ̲REF) ()

       SUBDEVICE ? NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT
       ̲

                   BUFFER (QEL,BUFFER ̲REF) ()

       CONTROLLER ?NOTIFY ̲CONTROLLER ̲SUBSEQUENT ̲OUTPUT
       ̲

                   BUFFER (QEL,BUFFER ̲REF) ()

       OTHER ?     PROTOCOL ̲ERROR (OUTPUTTER ̲5 ̲2)

   END CASE
























                Figure 4.1.5.4.5.5-2



   N̲O̲T̲I̲F̲Y̲ ̲F̲I̲R̲S̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲ ̲

   CASE QEL.REQUESTOR OF

       PROTOCOL ?  NOTIFY ̲PROTOCOL ̲FIRST ̲OUTPUT
                   BUFFER (QEL,BUFFER ̲REF)()

       USER ?      NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER
                   (QEL,BUFFER ̲REF) ()

       SUBDEVICE ? NOTIFY ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲
                   BUFFER (QEL,BUFFER ̲REF) ()

       CONTROLLER ?NOTIFY ̲CONTROLLER ̲FIRST ̲OUTPUT ̲
                   BUFFER (QEL,BUFFER ̲REF) ()

       OTHER ?     PROTOCOL ̲ERROR (OUTPUTTER ̲5 ̲3)

   END CASE




























                Figure 4.1.5.4.5.5-3


4.1.5.4.5.6    C̲A̲N̲C̲E̲L̲ ̲S̲U̲P̲P̲O̲R̲T̲ 

           These are: CANCEL ̲PENDING ̲OUTPUT

                      CANCEL ̲ONGOING ̲OUTPUT

                      CANCEL ̲WAIT ̲COMPLETION ̲OUTPUT

                      SHIP ̲CANCEL ̲OUTPUT





   CANCEL ̲PENDING ̲OUTPUT (QEL:IO ̲QEL) ()

   CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER.PENDING)
   ()OF

       FAIL ?  PROTOCOL ̲ERROR (OUTPUTTER ̲6 ̲1)

       PASS ?

   END CASE

   RETURN




































                Figure 4.1.5.4.5.6-1


   CANCEL ̲ONGOING ̲OUTPUT  (QEL) ()

       RELEASE FOR BUFFER

   CASE OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE OF

       NO ̲BUF ?

       PENDING ̲RESERVE? C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲3̲

       DELIVERED ?  R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲4̲

   END CASE

       SEND CANCEL IF FIRST BUFFER HAS ALREADY BEEN OUTPUT

   OWN ̲SDID.OUTPUTTER.STATE 
   EQ SUBSEQUENT ̲BUFFER?
                                          S̲E̲T̲U̲P̲ ̲C̲A̲N̲C̲E̲L̲
                                          ̲5̲

                                          COMPLETE EQ
                                          FALSE ?

   PROC ̲FOR ̲END ̲OF ̲OUTPUT () ()

   RETURN





















                Figure 4.1.5.4.5.6-2



   C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲3̲

   ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID, CANCEL
   ̲RESERVE ̲OUTPUT ̲BUFFER, OWN ̲SDID.OUTPUTTER.SPI) (CCP)











































                Figure 4.1.5.4.5.6-3


   R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲4̲ ̲

   OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.BUFFER
   ̲ENTRY

   ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID,RELEASE
   ̲OUTPUT ̲BUFFER,OWN ̲SDID.OUTPUTTER.SPI) (CCP)






































                Figure 4.1.5.4.5.6-4



   S̲E̲T̲U̲P̲ ̲C̲A̲N̲C̲E̲L̲ ̲5̲ ̲

       GET A CANCEL BUFFER

   OWN ̲SDID.OUTPUTTER.STATE=CANCELLED

   OWN ̲SDID.OUTPUTTER.SPI.PRIORITY= CONTROL ̲PRIOTITY

   OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=PENDING ̲RESERVE

   ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID,RESERVE
   ̲OUTPUT ̲BUFFER,OWN ̲SDID.OUTPUTTER.SPI) (CCP)

   CCP EQ REQUEST ̲QUEUED  COMPLETE=FALSE

   COMPLETE=TRUE

   OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.SPI.BUFFER
   ̲ENTRY

   SHIP ̲CANCEL ̲OUTPUT () ()


























                Figure 4.1.5.4.5.6-5


   CANCEL ̲WAIT ̲COMPLETION ̲OUTPUT (QEL) ()

   CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER. WAIT
   ̲COMPLETION) () OF

       FAIL ?   PROTOCOL ̲ERROR (OUTPUTTER ̲6 ̲6)

       PASS ?


   END CASE


   RETURN

































                Figure 4.1.5.4.5.6-6


   SHIP ̲CANCEL ̲OUTPUT () ()


   BUFFER ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY

   BUFFER ̲REF.BUFFER ̲SIZE=SIZE ̲OF ̲CANCEL ̲OUTPUT

   BUFFER=BUFFER ̲REF.PAGE ̲START

   START=BUFFER ̲REF.BUFFER ̲ADDR

   BUFFER(START+BUFFER ̲TYPE ̲OFFSET)=CONTROL,ENTIRE ̲LDU

   BUFFER (START+CONTROL ̲REQUEST ̲OFFSET)=CANCEL ̲OUTPUT
   ̲REQUEST

   BUFFER (START+CANCEL ̲OUTPUT ̲LDU ̲OFFSET)=OWN ̲SDID.OUTPUTTER.LDU


   OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=BUFFER ̲REF

   ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID, TRANSMIT
   ̲OUTPUT ̲BUFFER, OWN ̲SDID.OUTPUTTER.SPI) (CCP)


   RETURN





















                Figure 4.1.5.4.5.6-7


4.1.5.5  U̲S̲E̲R̲ ̲I̲N̲T̲E̲R̲F̲A̲C̲E̲ ̲M̲o̲d̲u̲l̲e̲



4.1.5.5.1    F̲u̲n̲c̲t̲i̲o̲n̲a̲l̲ ̲S̲p̲e̲c̲i̲f̲i̲c̲a̲t̲i̲o̲n̲

         The USER ̲INTERFACE handles the TMS requests for input
         and output. INPUT to TMS is performed by TMS calling
         the protocol handler through the entry ENABLE ̲INPUT.
         On the first call of ENABLE ̲INPUT the USER ̲INTERFACE
         Module calls the INPUTTER to obtain  an input request
         buffer. The INPUTTER may queue the request or may deliver
         the buffer immediately. When the buffer for input request
         is available the USER ̲INTERFACE loads it with information
         specifying the request and sends it to the INPUTTER.
         From now on the USER ̲INTERFACE simply awaits input.

         Whenever input data for this requested LDU arrives
         it is handed to TMS if TMS has a pending request or
         the data is queued on the DATA ̲Q. TMS issues series
         of ENABLE-INPUT request each indicating the amount
         of data requested. The USER ̲INTERFACE either hands
         full input buffer to TMS or if the request calls for
         less data than a full buffer, part of a buffer. When
         part of a buffer has been returned the next request
         get either a new part of the buffer or the rest of
         the buffer.

         Whenever type END ̲OF ̲LDU or ENTIRE ̲LDU has been returned
         to TMS, or the input has been abnormally terminated
         (result) the next ENABLE ̲INPUT is considered as the
         socalled first (see above).

         Whenever TMS has cancelled an input request the USER-INTERFACE
         calls the INPUTTER with cancel and releases any data
         in the DATA ̲Q. A possible input request buffer is released
         by the INPUTTER. Upon a cancel TMS shall be notified
         asynchronously if the last TMS request was answered
         request queued.



         OUTPUT from TMS is performed by TMS calling GET ̲OUTPUT
         ̲BUFFER. Upon the first call of GET ̲OUTPUT ̲BUFFER (i.e.
         initialization, a completed output or a cancelled output)
         the USER ̲INTERFACE calls the OUTPUTTER by REQUEST ̲DATA
         ̲OUTPUT. The OUTPUTTER may queue the request or hand
         an output buffer immediately. In the first buffer obtained
         the USER ̲INTERFACE must have room for LDU header and
         therefore modify buffer address and size before returning
         it to TMS. Buffers are immediately returned to TMS
         in the call of GET ̲OUTPUT ̲BUFFER if they are available.
         If the USER ̲INTERFACE is asynchronously notified of
         the buffer, it is handled to TMS by asynchronous response.

         Whenever the USER ̲INTERFACE has obtained the first
         output buffer and until the last part of a LDU is sent
         the OUTPUTTER only outputs data for the USER ̲INTERFACE.
         Subsequent buffers are reserved by calling REQUEST
         ̲NEXT ̲BUFFER.

         When the output of one LDU is completed, the USER ̲INTERFACE
         may immediately start the next output. There may be
         as many outstanding outputs as there are queue elements
         in the EMPTY queue.

         Whenever later on LTU/LTUX has successfully transmitted
         the LDU the transmission status buffer completing the
         LDU is handed by the OUTPUTTER and TMS is informed
         of the result.

         The functions performed are identified by the entry
         points (Refer section 4.1.5.5.2).


4.1.5.5.2    M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲

         The USER ̲INTERFACE is called via one of the following:

          ENABLE ̲INPUT(PARS:ENABLE ̲PARAM)(CC:COMPLETION ̲CODE)

         ACK ̲DATA ̲INPUT () ()

         NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER(QEL:IO ̲QEL,BUFFER
         ̲REF:POINTER) ()

         USER ̲INPUT ̲RESULT(QEL:IO ̲QEL,BUFFER ̲REF:POINTER) ()

         GET ̲OUTPUT ̲BUFFER(PARS:GET ̲BUFFER ̲PARAM) (CC:COMPLETION
         ̲CODE)

         NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER(QEL:IO ̲QEL,BUFFER ̲REF:POINTER)
         ()

         NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER(QEL:IO ̲QEL,BUFFER
         ̲REF:POINTER) ()

         USER ̲OUTPUT(PARAMS:INIT ̲OUTPUT ̲PARAM)(CC:COMPLETION
         ̲CODE)

         USER ̲OUTPUT ̲RESULT(QEL:IO ̲QEL,RESULT:COMPLETION ̲CODE)
         ()

         NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA(QEL:IO ̲QEL,BUFFER ̲ENTRY:POINTER)
         ()

         NOTIFY ̲USER ̲INPUT ̲DATA(QEL:IO ̲QEL,BUFFER ̲ENTRY:POINTER)()

         CANCEL ̲USER ̲OPERATION(QEL) ()

         INITIALIZE ̲USER ̲DATA(PARAMS:OPEN ̲SUBDEVICE ̲PARAM)()

         CLEAN ̲USER ̲DATA ()()



         The USER ̲INTERFACE calls following functional entries
         to other modules:

         REQUEST ̲DATA ̲INPUT(QEL:IO ̲QEL,PRIORITY:PRIORITY ̲TYPE)
         (CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)

         SEND ̲INPUT ̲REQUEST(SIZE:INTEGER) ()

         RELEASE ̲INPUT ̲BUFFER(BUFFER ̲REF:POINTER) ()

         LOAD ̲BUFFER ̲RETURN(PARS:GET ̲BUFFER ̲PARAM) ()

         REQUEST ̲DATA ̲OUTPUT(QEL:IO ̲QEL,PRIORITY:PRIORITY ̲TYPE)
         (CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)

         REQUEST ̲NEXT ̲BUFFER () (CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)

         SEND ̲OUTPUT ̲BUFFER(TYPE:BUFFER ̲TYPES,BYTE ̲COUNT:INTEGER)()

         Furthermore:

         PROTOCOL ̲ERROR

         SEND ̲OPERATIONS ̲REPLY

         QUEUE

         INIT ̲QD

         EXTRACT ̲FIRST

         RETURN ̲FIRST ̲DATABUFFER

         RETURN ̲NEXT ̲DATABUFFER

         LOAD ̲CANCEL ̲REPLY



4.1.5.5.3    M̲o̲d̲u̲l̲e̲ ̲C̲o̲m̲p̲o̲n̲e̲n̲t̲s̲

         E̲n̲t̲r̲y̲ ̲P̲o̲i̲n̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲


         B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         INITIALIZE ̲USER ̲DATA                  section 5.1

         CLEAN ̲USER ̲DATA                       section 5.1


         I̲n̲p̲u̲t̲ ̲r̲e̲q̲u̲e̲s̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         ENABLE ̲INPUT                          section 5.2

         ACK ̲DATA ̲INPUT                        section 5.2


         O̲u̲t̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         GET ̲OUTPUT ̲BUFFER                     section 5.3

         USER ̲OUTPUT                           section 5.3


         C̲a̲n̲c̲e̲l̲

         CANCEL ̲USER ̲OPERATION                 section 5.4


         O̲U̲T̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER       section 5.5

         NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER  section 5.5

         USER ̲OUTPUT RESULT                    section 5.5


         I̲N̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER      section 5.6

         NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA          section 5.6

         NOTIFY ̲USER ̲INPUT ̲DATA                section 5.6

         USER ̲INPUT ̲RESULT                     section 5.6


         C̲o̲m̲p̲o̲n̲e̲n̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲


         I̲n̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         SETUP ̲INPUT ̲REQUEST                   section 5.7

         RETURN ̲DATA                           section 5.7

         RETURN ̲RESULT                         section 5.7

         NEXT ̲DATA ̲QEL                         section 5.7


         O̲u̲t̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         RETURN-OUTPUT ̲RESULT                  section 5.8


         C̲a̲n̲c̲e̲l̲ ̲S̲u̲p̲p̲o̲r̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         CANCEL ̲USER ̲INPUT                     section 5.9

         CANCEL ̲USER ̲OUTPUT                    section 5.9

         EMPTY ̲DATA ̲Q                          section 5.9


         O̲p̲t̲i̲o̲n̲a̲l̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲                   section 5.10


4.1.5.5.4    D̲a̲t̲a̲ ̲D̲e̲s̲c̲r̲i̲p̲t̲i̲o̲n̲

         TYPE USER ̲DATA=RECORD

             INPUT  : USER ̲INPUT ̲DATA

             OUTPUT : USER ̲OUTPUT ̲DATA

                      END

         TYPE USER ̲INPUT ̲DATA=RECORD

             STATE  : (IDLE,
                       AWAIT ̲DATA,
                       PENDING ̲RESULT,"ERROR RECEIVED"
                       COMPLETE,  "End of LDU returned
                       RESULT ̲RETURNED)

             BUF ̲SIZE:INTEGER "Requestors buffer size"

             REQUEST ̲STATUS:ACTIVITY

                 QEL: IO ̲QEL

             DATA ̲Q: QD  "Queue of data, not yet returned
                          to requestor

             DATA ̲Q ̲SIZE: INTEGER

             PART ̲BUFFER ̲OFFSET:INTEGER

             PART ̲BUFFER ̲LENGTH:INTEGER

             PART ̲BUFFER ̲RET:BOOLEAN

             RESULT:COMPLETION ̲CODE

                 END

         STATE       Gives the state of current LDU input

         BUF ̲SIZE     The TMS buffer size as specified in last
                      ENABLE-INPUT



         REQUEST     Specifies if there exists an unanswered
                     TMS
         STATUS      request. In such cases a cancel shall lead
                     to asynchronous response.

             QEL     IO ̲QEL holding the one possible pending/ongoing
                     input request

         DATA ̲Q,     Holds databuffers received from lower
         DATA ̲Q ̲SIZE level/LTU/LTUR for the case that subsequent
                     TMS requests do not arrive fast enough.

         PART ̲       Holds information of what is left in an
                                                                 BUFFER  inputbuffer
                                                                         not
                                                                         completely
                                                                         returned
                                                                         to
                                                                         TMS.

         RESULT      Holds the result as of a reception status.
                     The result is returned to TMS after all
                     data has been transferred since TMS will
                     not transfer data and result in the same
                     request.



         TYPE USER ̲OUTPUT ̲DATA=RECORD

                     STATE:ACTIVITY "Indicates if LDU is in
                     
                                     process of being output.

                     EMPTY:QD

                     QELS :ARRAY(1..MAX ̲USER ̲OUTPUTS)
                             OF IO ̲QEL

                     ACTIVE: INTEGER

                     END


         STATE       Indicated status of a LDU actually being
                     output, but may be idle even when transmission
                     status is pending.

         EMPTY,QELS  Queue of nonused output requests (one queue
                     element used per pending/ongoing/nonacknow-
                     ledged LDU)

         ACTIVE      Pointer to active QEL, valid when STATE
                     is ACTIVE
                     The field ADDI of the QEL is used to indicate
                     if TMS has a pending request for this output.



4.1.5.5.5    M̲o̲d̲u̲l̲e̲ ̲D̲e̲s̲i̲g̲n̲



4.1.5.5.5.1 B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲


         These are:  INITIALIZE ̲USER ̲DATA

                     CLEAN ̲USER ̲DATA



         INITIALIZE ̲USER ̲DATA(PARAM:OPEN ̲SUBDEVICE ̲PARAM)()

             input

         OWN ̲SDID.USER.INPUT.STATE=IDLE

         OWN ̲SDID.USER.INPUT.REQ ̲STATE=IDLE

         INIT ̲QD(OWN ̲SDID.USER.INPUT.DATA ̲Q)()

         OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE=0

         OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET=FALSE

             output

         OWN ̲SDID.USER.OUTPUT.STATE=IDLE

         INIT ̲QD (OWN ̲SDID.USER.OUTPUT.EMPTY) ()

         INDEX=1

         LOOP

             INSERT(OWN ̲SDID.USER.OUTPUT.EMPTY,
                        OWN ̲SDID.USER.OUTPUT.QELS(INDEX))()

             INDEX GE  MAX ̲USER ̲OUTPUTS?

             INDEX+1

         END LOOP

         RETURN













                   Figure 4.1.5.5.5.1-1


         CLEAN ̲USER ̲DATA () ()

             Release buffer resources

             Output buffer and input request buffer released
             by OUTPUTTER and INPUTTER.

         EMPTY ̲DATA ̲Q () ()



         RETURN



































                   Figure 4.1.5.5.5.1-2


4.1.5.5.5.2 I̲n̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲


         These are:  ENABLE ̲INPUT

                     ACK ̲DATA ̲INPUT



         ENABLE ̲INPUT(PARS:ENABLE ̲PARAM)(CC:COMPLETION ̲CODE)

             TMS only requests one buffer at a time

         OWN ̲SDID.USER.INPUT.REQ ̲STATE=ACTIVE

         OWN ̲SDID.USER.INPUT.BUF ̲SIZE=
                          PARS.BUF ̲SIZE

         PAR.H ̲OPID=OWN ̲SDID.USER.INPUT.QEL

         OWN ̲SDID.USER.INPUT.STATE 
         NE IDLE?


         S̲E̲T̲U̲P̲ ̲I̲N̲P̲U̲T̲ ̲2̲                G̲E̲T̲ ̲N̲E̲X̲T̲ ̲I̲N̲P̲U̲T̲ ̲B̲U̲F̲F̲E̲R̲
         ̲3̲



         RETURN


























                   Figure 4.1.5.5.5.2-1


         S̲E̲T̲U̲P̲ ̲I̲N̲P̲U̲T̲ ̲2̲ ̲

         EQVIVALENCE (OWN ̲SDID.USER.INPUT.QEL,QEL:IO ̲QEL)

         QEL.REQ ̲REF=PARS.OPID

         QEL.REQUESTOR=USER

         REQUEST ̲DATA ̲INPUT(QEL,USER ̲PRIORITY)(CCP,BUFFER ̲REF)

         CCP NE OK ?          CC=CCP

         SETUP ̲INPUT ̲REQUEST (QEL,BUFFER ̲REF) (SIZE)

         OWN ̲SDID.USER.INPUT.STATUS=AWAIT ̲DATA

         SEND ̲INPUT ̲REQUEST (SIZE) ()

         CC= REQUEST ̲QUEUED




























                   Figure 4.1.5.5.5.2-2


         G̲E̲T̲ ̲N̲E̲X̲T̲ ̲I̲N̲P̲U̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲

             Data ?

         OWN ̲SDID.USER.INPUT. ?
         DATA ̲Q ̲SIZE LE ZERO     Pending Result ?

         Put data references   OWN ̲SDID.USER.INPUT?    CC=REQUEST
         in Reply              STATE NE PENDING ̲RESULT    ̲QUEUED

         RETURN ̲DATA () ()     RETURN ̲RESULT()()

           Load return parameters

         PARS.BYTE ̲COUNT=OWN ̲SDID.
         REPLY.BYTE ̲COUNT

         PARS.PAGE ̲ADDR=
         OWN ̲SDID.REPLY.PAGE ̲ADDR

         PARS.BYTE ̲ADDR=
         OWN ̲SDID.REPLY.BYTE ̲ADDR

         PARS.BUFFER ̲TYPE=
         OWN ̲SDID.REPLY.BUFFER ̲TYPE

         CC=OWN ̲SDID.REPLY.RESULT
















                    Figure 4.1.5.5.5.3


         ACK ̲DATA ̲I̲NPUT() ()

             Was Result returned ?

         OWN ̲SDID.USER.INPUT.STATE ?    OWN ̲SDID.USER.INPUT.
                                        STATE=IDLE

             Was only part buffer returned ?

         OWN ̲SDID.USER.INPUT.PART ̲
         BUFFER ̲RET ?

             Release buffer

         CASE EXTRACT ̲FIRST(OWN ̲SDID.USER.INPUT.DATA ̲Q)(BUF)OF

             FAIL?   PROTOCOL ̲ERROR(USER ̲IF ̲2 ̲4)

             PASS?

         END CASE

         OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE-1

         RELEASE ̲INPUT ̲BUFFER(BUF) ()

         OWN ̲SDID.USER.INPUT.?                 OWN ̲SDID.USER.
         STATE EQ COMPLETE                     INPUT.STATE=IDLE



         RETURN














                   Figure 4.1.5.5.5.2-4



4.1.5.5.5.3 O̲u̲t̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         These are:  GET ̲OUTPUT ̲BUFFER

                     USER ̲OUTPUT



         GET ̲OUTPUT ̲BUFFER(PARS:GET ̲BUFFER ̲PARAM)(CC:COMPLETION
         ̲CODE)

             Only one request at a time, but several completed
             outputs may wait for answers

         OWN ̲SDID.USER.OUTPUT.STATE?
         NE IDLE


         S̲E̲T̲U̲P̲ ̲O̲U̲T̲P̲U̲T̲ ̲2̲                        R̲E̲Q̲U̲E̲S̲T̲ ̲N̲E̲X̲T̲
                                               ̲B̲U̲F̲F̲E̲R̲ ̲3̲ ̲


         RETURN
































                   Figure 4.1.5.5.5.3-1



         S̲E̲T̲U̲P̲ ̲O̲U̲T̲P̲U̲T̲ ̲2̲

         CASE EXTRACT ̲FIRST(OWN ̲SDID.USER.OUTPUT.EMPTY)(QEL)OF

             FAIL?      CC=TOO ̲MANY ̲REQUESTS

             PASS?

         END CASE

         OWN ̲SDID.USER.OUTPUT.STATE=ACTIVE

         QEL.ADDI=ACTIVE

         QEL.REQ ̲REF= PARS.OPID

         QEL.REQESTEOR=USER

         OWN ̲SDID.USER.OUTPUT.ACTIVE=QEL

         REQUEST ̲DATA ̲OUTPUT(QEL,USER ̲PRIORITY)(CCP,BUFFER ̲REF)

         CCP NE  OK ?        CC=CCP

         RETURN ̲FIRST ̲DATABUFFER(QEL,BUFFER ̲REF) ()

         QEL.ADDI=IDLE

         LOAD ̲BUFFER ̲RETURN(PARS) ()

         CC=OK
















                   Figure 4.1.5.5.5.3-2


         R̲E̲Q̲U̲E̲S̲T̲ ̲N̲E̲X̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲

         QEL=OWN ̲SDID.USER.OUTPUT.ACTIVE

         QEL.ADDI=ACTIVE

         REQUEST ̲NEXT ̲BUFFER()(CCP,BUFFER ̲REF)

         CCP NE OK ?      CC=CCP

         RETURN ̲NEXT ̲DATABUFFER(QEL,BUFFER ̲REF)()

         QEL.ADDI=IDLE

         LOAD ̲BUFFER ̲RETURN (PARS) ()

         CC=OK






























                   Figure 4.1.5.5.5.3-3


         USER ̲OUTPUT(PARMS:INIT ̲OUTPUT ̲PARAM)(CC:COMPLETION
         ̲CODE)

         TYPE=PARMS.BUFFER ̲TYPE

         TYPE IS ENTIRE ̲LDU ?
         OR START ̲OF ̲LDU

         ADD=LDU ̲DATA ̲OFFSET                   ADD=START ̲LDU
                                               ̲DATA ̲OFFSET

         BYTE ̲COUNT=PARMS.BYTE ̲COUNT+ADD

         TYPE INDICATES END OF DATA ?
                                               OWN ̲SDID.USER.OUTPUT.
                                               STATE=IDLE


         SEND ̲OUTPUT ̲BUFFER(TYPE,BYTE ̲COUNT) ()

             All responses to outputs are asynchronous

         CC=REQUEST ̲QUEUED

         OWN ̲SDID.USER.OUTPUT.ACTIVE.ADDI=ACTIVE


         RETURN



















                   Figure 4.1.5.5.5.3-4


4.1.5.5.5.4 C̲a̲n̲c̲e̲l̲

         This is:    CANCEL ̲USER ̲OPERATION



         CANCEL ̲USER ̲OPERATION (QEL:IO ̲QEL) ()

         QEL EQ OWN ̲SDID. ?
         USER.INPUT.QEL

         CANCEL ̲USER ̲OUTPUT (QEL) ()           CANCEL ̲USER ̲INPUT(QEL)()


         RETURN





































                   Figure 4.1.5.5.5.4-1


4.1.5.5.5.5 O̲U̲T̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         These Are:  NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER

                     NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER

                     USER ̲OUTPUT ̲RESULT



         NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER

                     (QEL:IO ̲QEL,BUFFER ̲REF:POINTER) ()

         OWN ̲SDID.USER.OUTPUT.STATE=ACTIVE

         RETURN ̲FIRST ̲DATABUFFER(QEL,BUFFER ̲REF) ()

         QEL.ADDI=IDLE

         SEND ̲OPERATIONS ̲REPLY () ()


         RETURN

































                   Figure 4.1.5.5.5.5-1


         NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER  (QEL: IA ̲QEL,
                                               BUFFER ̲REF:
                                               POINTER)()


         RETURN ̲NEXT ̲DATA ̲BUFFER (QEL, BUFFER ̲REF)()

         QEL.ADDI = IDLE

         SEND ̲OPERATIONS ̲REPLY ()()


         RETURN


































                   Figure 4.1.5.5.5.5-2


         USER ̲OUTPUT ̲RESULT(QEL:TO ̲QEL, BUFFER ̲ENTRY(POINTER)()

             Release queue element

         QUEUE (OWN ̲SDID.USER.OUTPUT.EMPTY, QEL)()

         QEL.REQUESTOR = NONE

         QEL.ADDI = IDLE

         RETURN ̲OUTPUT ̲RESULT (QEL, BUFFER ̲ENTRY)

         SEND ̲OPERATIONS ̲REPLY()()

         RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY)()

         RETURN






























                   Figure 4.1.5.5.5.5-3


4.1.5.5.5.6 I̲N̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

         These are

         NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER
         NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA
         NOTIFY ̲USER ̲INPUT ̲DATA,
         USER ̲INPUT ̲RESULT



    NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER(QEL,BUFFER ̲REF)(
    )



    SETUP ̲INPUT ̲REQUEST (QEL, BUFFER ̲REF) (SIZE)


    SEND ̲INPUT ̲REQUEST (SIZE) ( )


    RETURN





































                Fig. 4.1.5.5.6-1


    USER ̲INPUT ̲RESULT (QEL:  IO ̲QEL,
                       BUFFER ̲ENTRY:  POINTER) (  )


    QEL.REQUESTOR = NONE

    BUFFER = BUFFER ̲ENTRY.PAGE ̲START

    START = BUFFER ̲ENTRY.BUFFER ̲ADDR

    RESULT = BUFFER (START + RECEPTION ̲START ̲CODE ̲OFFSET)



    OWN ̲SDID.USER.INPUT.RESULT = RESULT

    OWN ̲SDID.USER.INPUT.STATE = PENDING ̲RESULT

         Data awaited ?

    OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE GE 1?

    OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS ?
    EQ IDLE                                                      No
                                                                 data
                                                                 awaited


    RETURN ̲RESULT ( )  ( )

    SEND ̲OPERATIONS ̲REPLY ( )  ( )



    RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY) ( )


    RETURN









               Fig. 4.1.5.5.5.6-2



    NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA (QEL:  IO ̲QEL,
                                                  
                                                  BUFFER
                                               ̲ENTRY:
                                                POINTER)




    NOTIFY ̲USER ̲INPUT ̲DATA (QEL, BUFFER ̲ENTRY)  ( )



    RETURN





































               Fig. 4.1.5.5.5.6-3


    NOTIFY ̲USER ̲INPUT ̲DATA (QEL:  IO ̲QEL, BUFFER ̲ENTRY:
    POINTER)  ( )



    INSERT (BUFFER ̲ENTRY, OWN ̲SDID.USER.INPUT.DATA
    ̲Q)


    OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE+1



    IS DATA ̲Q ̲SIZE GT 1?


    NEXT ̲DATA ̲QEL ( )  ( )

      No request just now


    OWN ̲SDID.USER.INPUT.
    REQUEST ̲STATUS EQ IDLE ?

         Setup reply parameters


    RETURN ̲DATA ( )  ( )


    SEND ̲OPERATIONS ̲REPLY ( )  ( )



    RETURN















               Fig. 4.1.5.5.5.6-4


    USER ̲INPUT ̲RESULT (QEL:  IO ̲QEL, BUFFER ̲ENTRY:
    POINTER)  ( )



    QEL.REQUESTOR = NONE

    BUFFER = BUFFER ̲ENTRY.PAGE ̲START

    START = BUFFER ̲ENTRY.BUFFER ̲ADDR

    RESULT = BUFFER (START + RECEPTION ̲STATUS ̲CODE
    ̲OFFSET)

    OWN ̲SDID.USER.INPUT.RESULT = RESULT

    OWN ̲SDID.USER.INPUT.STATE = PENDING ̲RESULT

         Data awaited?

    OWN ̲SDID.USER.INPUT.DATA-Q ̲SIZE GE 1?

    OWN ̲SDID.USER.INPUT.REQUEST ̲STATE EQ IDLE ?                  No
                                                                 data
                                                                 awaited


    RETURN ̲INPUT ̲RESULT ( )  ( )


    SEND ̲OPERATIONS ̲REPLY ( )  ( )



    RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY) ( )


    RETURN













               Fig. 4.1.5.5.5.6-5


4.1.5.5.5.7 I̲n̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

             These are                         SETUP
                                               ̲INPUT
                                               ̲REQUEST
                                               RETURN
                                               ̲DATA
                                               RETURN
                                               ̲RESULT
                                               NEXT
                                               ̲DATA
                                               ̲QEL



    SETUP ̲INPUT ̲REQUEST (QEL:  IO ̲QEL,BUFFER ̲REF: POINTER)
    (SIZE: INTEGER)


             This routine is used to load additional
             parameters into the input request, some
             protocols do this.  For other protocols
             it is empty.




    SIZE = 0


    RETURN

































               Fig. 4.1.5.5.5.7-1


         RETURN ̲DATA ( )  ( )

             Point to buffer as handed by Parent

         BUFFER = OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE
         ̲START

         START = OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.BUFFER
         ̲ADDR

         LDU ̲TYPE = BUFFER (START + BUFFER ̲TYPE ̲OFFSET)

         LDU ̲TYPE EQ START ̲OF ̲LDU?

         LDU ̲TYPE EQ PART ̲OF ̲LDU?

             The available buffer is last in LDU

             Can one return all of it ?


         OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE
         GT OWN ̲SDID.USER.INPUT.BUF ̲SIZE?


         R̲E̲T̲U̲R̲N̲ ̲L̲A̲S̲T̲ ̲D̲A̲T̲A̲ ̲3̲                     R̲E̲T̲U̲R̲N̲
         ̲M̲I̲D̲ ̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲D̲A̲T̲A̲ ̲4̲

         OWN ̲SDID.USER.INPUT.STATE = COMPLETE

         OWN ̲SDID.REPLY.RESULT = OK

         OWN ̲SDID.REPLY.H ̲OPTO = OWN ̲SDID.USER.INPUT.QEL

         OWN ̲SDID.REPLY.OPID = OWN ̲SDID.USER.INPUT.QEL.REQ
         ̲REF

         OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS = IDLE


    RETURN






               Fig. 4.1.5.5.5.7-2


    R̲E̲T̲U̲R̲N̲ ̲L̲A̲S̲T̲ ̲D̲A̲T̲A̲ ̲3̲



    OWN ̲SDID.REPLY.BUFFER ̲TYPE = LDU ̲TYPE


    OWN ̲SDID.REPLY.PAGE ̲ADDR
    = OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE ̲ADDR


    OWN ̲SDID.REPLY.BYTE ̲ADDR
    = OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET


    OWN ̲SDID.REPLY.BYTE ̲COUNT
    = OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE


    OWN ̲SDID.USER.INPUT PART ̲BUFFER ̲RET = FALSE




























               Fig. 4.1.5.5.5.7-3


    R̲E̲T̲U̲R̲N̲ ̲M̲I̲D̲ ̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲D̲A̲T̲A̲ ̲4̲


    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET ?

    LDU ̲TYPE NE ̲START ̲OF ̲LDU ?

    TYP = START ̲OF ̲LDU                                                 TYP
                                                                       =
                                                                       PART
                                                                       ̲OF
                                                                       ̲LDU


    OWN ̲SDID.REPLY.BUFFER ̲TYPE = TYP

    OWN ̲SDID.REPLY.PAGE ̲ADDR =
         OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE ̲ADDR

    OWN ̲SDID.REPLY.BYTE ̲ADDR =
         OWN ̲SDID.USER.PART ̲BUFFER ̲OFFSET

    OWN ̲SDID.USER.INPUT.BUF ̲SIZE GE
         OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE ?

         Part Buffer Return

    OWN ̲SDID.REPLY.BYTE ̲COUNT =
         OWN ̲SDID.USER.INPUT.BUF ̲SIZE

         Reduce size of left over data

    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE-
         OWN ̲SDID.USER.INPUT.BUF ̲SIZE

    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET +
         OWN ̲SDID.USER.INPUT.BUF ̲SIZE

         Mark part buffer return

    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = TRUE

             Return rest of buffer

            OWN ̲SDID.REPLY.BYTE ̲COUNT =
                 OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE

             Mark that all of buffer returned

            OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = FALSE


               Fig. 4.1.5.5.5.7-4


    RETURN ̲RESULT ( )  ( )

         Result is returned to TMS after last data
         since this will ensure, that the application
         gets all data

    OWN ̲SDID.REPLY.RESULT =
         OWN ̲SDID.USER.INPUT.RESULT


    OWN ̲SDID.REPLY.BYTE ̲COUNT = ZERO



    OWN ̲SDID.USER.INPUT.STATE = RESULT ̲RETURNED

    OWN ̲SDID.REPLY.H ̲OPID = OWN ̲SDID.USER.INPUT.QEL

    OWN ̲SDID.REPLY.OPID = OWN ̲SDID.USER.INPUT.QEL.REQ
    ̲REF

    OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS = IDLE

    RETURN




















               Fig. 4.1.5.5.5.7-5


    NEXT ̲DATA ̲QEL ( )  ( )



    QEL = OWN ̲SDID.USER.INPUT.EP


    BUFFER = QEL.PAGE ̲START

    START = QEL.BUFFER ̲ADDR


    BUFFER(START+BUFFER ̲TYPE ̲OFFSET)
    INDICATE START OF DATA?



    OFFSET =                                                           OFFSET
                                                                       =
    LDU ̲DATA ̲OFFSET                                                    START
                                                                       ̲LDU
                                                                       ̲DATA
                                                                       ̲OFFSET


    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET =
    START + OFFSET


    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲LENGTH =
    QEL.BUFFER ̲SIZE-OFFSET


    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET =
    FALSE


    RETURN














               Fig. 4.1.5.5.5.7-6


4.1.5.5.5.8 O̲u̲t̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲ 

             This is RETURN ̲OUTPUT ̲RESULT.


    RETURN ̲OUTPUT ̲RESULT (QEL:  IO ̲QEL, BUFFER ̲REF:
    POINTER) (  )



    OWN ̲SDID.REPLY.OPID = QEL.REQ ̲REF



    OWN ̲SDID.REPLY.H ̲OPID = QEL


    BUFFER = BUFFER ̲REF.PAGE ̲START


    START = BUFFER ̲REF.BUFFER ̲ADDR


    RESULT = BUFFER (START + TRANSMISSION ̲STATUS ̲CODE
    ̲OFFSET)

    
    OWN ̲SDID.REPLY.RESULT = RESULT






    RETURN



















               Fig. 4.1.5.5.5.8-1


4.1.5.5.5.9 C̲a̲n̲c̲e̲l̲ ̲S̲u̲p̲p̲o̲r̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

             These are CANCEL ̲USER ̲INPUT
                       CANCEL ̲USER ̲OUTPUT
                       EMPTY ̲DATA ̲Q


    CANCEL ̲USER ̲INPUT (QEL: IO ̲QEL) ( )

    CANCEL ̲INPUT (QEL)  ( )

    EMPTY ̲DATA ̲Q ( )  ( )

    QEL.REQUESTOR = NONE

    OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = FALSE
         
         Pending request, answer TMS

    OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS EQ IDLE?

    OWN ̲SDID.USER.INPUT.RESULT = CANCELLED

    RETURN ̲RESULT ( )  ( )

    SEND ̲OPERATIONS ̲REPLY ( )  ( )

    OWN ̲SDID.USER.INPUT ̲STATE = IDLE



    RETURN























               Fig. 4.1.5.5.5.9-1


    CANCEL ̲USER ̲OUTPUT (QEL:  IO ̲QEL)  ( )



    CANCEL ̲OUTPUT (QEL)  ( )



    QEL.REQUESTOR = NONE


    QEL.ADDI NE ACTIVE ?

         TMS requires response


    LOAD ̲CANCEL ̲REPLY (QEL) ( )


    QEL.ADDI = IDLE


    SEND ̲OPERATIONS ̲REPLY ( )  ( )


    OWN ̲SDID.USER.OUTPUT.STATE = IDLE


    RETURN



















               Fig. 4.1.5.5.5.9-2


    EMPTY ̲DATA ̲Q ( )  ( )


    LOOP

         CASE EXTRACT ̲FIRST (OWN ̲SDID.USER.INPUT.DATA
         ̲Q)(BUF) OF

            FAIL ?

            PASS ?   RELEASE ̲INPUT ̲BUFFER (BUF) ( )


         END CASE


    END LOOP


    OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE = ZERO


    RETURN


























               Fig. 4.1.5.5.5.9-3


4.1.5.5.5.10 O̲p̲t̲i̲o̲n̲a̲l̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲

                 For protocols having the USER ̲INTERFACE module
                 generating protocol commands to the parent
                 protocol/LTU/LTUX, the response interface for
                 the PROT ̲CONT module must be implemented i.e.:

                 NOTIFY ̲USER ̲PROT ̲CONT ̲BUFFER and
                 USER ̲PROT ̲CONT ̲RESULT

                 must be included.

                 Protocols where this interface is missing must
                 omit the calls in the PROT ̲CONT module to avoid
                 software linkage errors.



4.1.5.6  C̲O̲N̲T̲R̲O̲L̲L̲E̲R̲ ̲M̲o̲d̲u̲l̲e̲



4.1.5.6.1    F̲u̲n̲c̲t̲i̲o̲n̲a̲l̲ ̲S̲p̲e̲c̲i̲f̲i̲c̲a̲t̲i̲o̲n̲

         The CONTROLLER handles the TMS requests for control
         of the protocol including asynchronous error reporting.
          The CONTROLLER need not be present in all protocols.
          Examples in CAMPS where omitted, are VDU ̲DATA protocol
         and VDU ̲CONTROL protocol.

         Three types of control may be performed.

         -   Subdevice control giving the requestor the possibility
             to interact directly with the running protocol
             for example to let the subdevice protocol execute
             complex series of control commands to lower levels.

         -   Lower protocol control (which may be OUTPUT or
             OUTPUT + INPUT) to let the control interface send
             and receive control buffers of type "Protocol command",
             "Protocol status" to/from LTU/LTUX firmware.

         -   External device.  This gives full data communication
             capability to the external device, like initialization
             of VDU split settings, setting of MSP tabulation.



         The error reporting function of the CONTROLLER schedules
         errors by priority.  It has a queue of one error, any
         error with higher priority will overwrite this error.

         The CONTROLLER interfaces with the SSC package of CAMPS
         through data buffers, where the first word is the control
         type.

         Based on the control type, the CONTROLLER detects the
         action to be taken.  For type SUBDEVICE, it requests
         the PROTOCOL module to take action, for type LOWER
         ̲PROTOCOL, the PROT ̲CONT module is requested to deliver
         a control buffer for type EXTERNAL ̲DEVICE ̲INPUT, the
         INPUTTER is activated, for type EXTERNAL ̲DEVICE ̲OUTPUT,
         the OUTPUTTER is activated.

         Control requests may output only or combined output-input.
          External device input and lower protocol control are
         always combined, others depend on the function.  Wherever
         input is required, the input request must be issued
         by SSC before the output.

         S̲U̲B̲D̲E̲V̲I̲C̲E̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲

         The CONTROLLER requests the PROTOCOL module for a buffer
         where to load the requestors data.  When TMS requests
         transmission, the PROTOCOL module is informed.

         After having processed the data, the PROTOCOL activates
         the CONTROLLER giving completion information.  If the
         completion information is more than just a completion
         code and there is no pending input, the Control output
         is considered failed.
         "Missing input request".
         For further details refer each protocol of the PROTOCOL
         module.

         L̲O̲W̲E̲R̲ ̲P̲R̲O̲T̲O̲C̲O̲L̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲

         Lower protocol control processing.  The controller
         requests a buffer at the PROT ̲CONT module, hands it
         to TMS, which after filling it sends it via CONTROLLER
         and PROT ̲CONT to the Parent subdevice.  If the control
         is of type output only, the CONTROLLER notifies TMS
         of the successful completion, if the control is of
         type output + input, the CONTROLLER waits for response.


         E̲X̲T̲E̲R̲N̲A̲L̲ ̲D̲E̲V̲I̲C̲E̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲

         External device processing is very similar to the USER
         ̲INTERFACE module processing for data transport except
         that an input request is generated after the control
         header has been output and that the control header
         is not handed on to INPUTTER or OUTPUTTER.



4.1.5.6.2    M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲

         The CONTROLLER is called via one of the following:

             INITIALIZE ̲CONTROLLER (PARAM:  OPEN ̲SUBDEVICE
             ̲PARAM) ( )

             GET ̲CONTROL ̲BUFFER (PARS: GET ̲BUFFER ̲PARAM)(CC:
             COMPLETION ̲CODE)

             CONTROLLER ̲OUTPUT (PARAMS: INIT ̲OUTPUT
             ̲PARAM)(CC: COMPLETION ̲CODE)

             ENABLE ̲CONTROL ̲INPUT(PARS: ENABLE ̲PARAM)(CC:
             COMPLETION ̲CODE)

             NOTIFY ̲CONTROLLER ̲FIRST ̲OUTPUT ̲BUFFER
             (QEL:  IO ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲REF:
                                                                       
                                                                       POINTER)
                                                                       (
                                                                       )

             NOTIFY ̲CONTROLLER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       (QEL:
                                                                       IO
                                                                       ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲REF:
                                                                       
                                                                       POINTER)
                                                                       (
                                                                       )

             CONTROLLER ̲INPUT ̲RESULT (QEL:  IO ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲ENTRY:
                                                                       
                                                                       POINTER)
                                                                       (
                                                                       )

             NOTIFY ̲CONTROLLER ̲INPUT ̲REQUEST ̲BUFFER
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       (QEL:
                                                                       IO
                                                                       ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲ENTRY:
                                                                       POINTER)
                                                                       (
                                                                       )

             NOTIFY ̲CONTROLLER ̲FIRST ̲INPUT ̲DATA
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       (QEL:
                                                                       
                                                                       IO
                                                                       ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲ENTRY:
                                                                       POINTER)
                                                                       (
                                                                       )

             NOTIFY ̲CONTROLLER ̲INPUT ̲DATA
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       (QEL:
                                                                       
                                                                       IO
                                                                       ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲ENTRY:
                                                                       POINTER)
                                                                       (
                                                                       )

                 CONTROLLER ̲OUTPUT ̲RESULT
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       (QEL:
                                                                       
                                                                       IO
                                                                       ̲QEL,
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       
                                                                       BUFFER
                                                                       ̲ENTRY:
                                                                       
                                                                       POINTER)
                                                                       (
                                                                       )


         NOTIFY ̲CONTROLLER ̲PROT ̲CONT ̲BUFFER
                      (QEL:  IO ̲QEL,
                       BUFFER ̲ENTRY:  POINTER) ( )


         ACK ̲CONTROL ̲INPUT ( )  ( )


         NOTIFY ̲CONTROLLER ̲PROTOCOL ̲BUFFER
                     (QEL:  IO ̲QEL,
                      BUFFER ̲ENTRY:  POINTER) ( )

         CONTROLLER ̲PROT ̲CONT ̲RESULT (QEL:  IO ̲QEL,
                      BUFFER ̲ENTRY: POINTER) ( )

         CONTROLLER ̲PROTOCOL ̲RESULT (QEL:  IO ̲QEL,
         BUFFER ̲ENTRY:  POINTER)()

         CANCEL ̲CONTROLLER ̲OPERATION (QEL:  IO ̲QEL)
          ( )



         The CONTROLLER calls the following functional
         entries to other protocol modules:

         REQUEST ̲DATA ̲INPUT (QEL: IO ̲QEL, PRIORITY:
         PRIORITY ̲TYPE)
                       (CC:  COMPLETION ̲CODE, BUFFER
                     ̲REF: POINTER)

         SEND ̲INPUT ̲REQUEST (SIZE: INTEGER) ( )
         CANCEL ̲INPUT (QEL: IO ̲QEL) ( )
         RELEASE ̲INPUT ̲BUFFER (BUFFER ̲REF: POINTER)
         ( )

         REQUEST ̲DATA ̲OUTPUT (QEL: IO ̲QEL, PRIORITY:
         PRIORITY ̲TYPE)
                        (CC:  COMPLETION ̲CODE, BUFFER
                     ̲REF: POINTER)

         REQUEST ̲NEXT ̲BUFFER ( ) (CC: COMPLETION ̲CODE,
         BUFFER ̲REF: POINTER)

         SEND ̲OUTPUT ̲BUFFER (TYPE: BUFFER ̲TYPES, BYTE
         ̲COUNT: INTEGER) ( )

         CANCEL ̲OUTPUT (QEL: IO ̲QEL) ( )

         REQUEST ̲PROT ̲CONT (QEL:  IO ̲QEL, PRIORITY:
         PRIORITY ̲TYPE)
                      (CC: COMPLETION ̲CODE, BUFFER
                     ̲REF: POINTER)

         SEND ̲PROT ̲CONT (RESPONSE: BOOLEAN, SIZE: INTEGER)
         ( )

         CANCEL ̲PROT ̲CONT (QEL: IO ̲QEL) ( )

         REQUEST ̲PROTOCOL (QEL: IO ̲QEL, PRIORITY: PRIORITY
         ̲TYPE)
                     (CC:  COMPLETION ̲CODE, BUFFER
                     ̲REF: POINTER)

         SEND ̲PROTOCOL (CC: COMPLETION ̲CODE, BUFFER
         ̲REF: POINTER)()

         CANCEL ̲PROTOCOL (QEL: IO ̲QEL) ( )


         Furthermore

         PROTOCOL ̲ERROR

         SEND ̲OPERATIONS ̲REPLY

         QUEUE

         INIT ̲QD

         EXTRACT ̲FIRST

         RETURN ̲FIRST ̲DATA BUFFER

         RETURN ̲NEXT ̲DATA BUFFER

         LOAD ̲CANCEL ̲REPLY

         RETURN ̲BUFFER