@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            SYS075
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YSYS075
~M~OSYS IMPLEMENTATION DESCRIPTION
~
~M~OSection 7 Version 5
~S1~OSection 7.5 Talk input/output
~S1~O1. General Introduction
~BSee SYS072.~
~S1~O2.1 Hardware Interface
~BSee SYS072.~
~S1~O2.2 Software Interface
~S1See SYS072.~
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BThe procedures used by SYS072 from this submodule are:
~S11) TALK.INPUT.TASK (DEVICE NO) STATUS~
~BThe function of this procedure is obvious from the flowchart.~
~S12) TALK.INPUT.TR.TASK (DEVICE NO) STATUS~
~BThe function of this procedure is obvious from the flowchart.~
~S1~O3.2 Data Structures
~BSee SYS072.~
~S1~O3.3 Special Notes
~BNone.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                SYS075
~V9 -1
~F
@TITLE SYS07(5,10)

@COL 1S-2R-3R-4R-5R-6F

@FLOW 1-2-3-4-5-6

@BOX 1.0
TALK INPUT/OUTPUT MANAGEMENT
@BOX 4.0
PROCEDURES IN SUB-MODULE
   TSK1 TALK INPUT TASK
   TSK2 TALK OUTPUT TASK
@BOX 5.0
INITIALISATION
@BOX 6.0
END OF SECTION
@BOX 1.1
::TALK INPUT/OUTPUT MANAGEMENT
@BOX 4.1
::PROCEDURES IN SUB-MODULE
::*INIT %7000;
*CODE 4;
::PSPEC TALK.INPUT.TASK (INTEGER) / INTEGER;
::PSPEC TALK.OUTPUT.TASK (INTEGER) / INTEGER;
   #SYSTSK07.1
   #SYSTSK07.2
@BOX 5.1
@BOX 6.1
**IN -1
::END OF SECTION
@END
@TITLE SYSTSK07.1(5,11)
@COL 1S-5T-7T-10R-21R-25T-12R-13R-14R-15F
@FLOW 1-5TR COMP-7OK-10-21-25FAULTY-12-13-14-15
@FLOW 7CLASS CHANGE-15
@FLOW 5OTHER-13
@FLOW 25OK-13
@BOX 1.0
TALK INPUT TASK (DEVICE NO)
@BOX 5.0
TRANSFER COMPLETE INTERRUPT?
@BOX 7.0
CHECK FOR COMMAND LINE?
[SYSTSK07.9]
@BOX 10.0
ADD SOURCE USER NAME TO THE MESSAGE
@BOX 12.0
OUTPUT TALK ERROR MESSAGE
[SYSTSK07.4]
@BOX 13.0
SET COMMAND TO
READ NEXT LINE
@BOX 14.0
SET SOFTWARE INTERRUPT
@BOX 15.0
END
@BOX 21.0
SEND THE MESSAGE TO THE
DESTINATION TALK CHANNEL
@BOX 25.0
WAS MESSAGE ACCEPTED?
@BOX 1.1
PROC TALK.INPUT.TASK (DEV.NO);
INTEGER I;
INTEGER32 SPN.PID;
INTEGER [4] T.DEST;
PSPEC COPY.UNAME (LOGICAL64, INTEGER);
PROC COPY.UNAME (UNAME, TO);
   FOR 8 DO
      UNAME & %FF => HEADER^ [TO] OF IO.VARS [DEV.NO];
      1 -> TO;
      UNAME ->> 8 => UNAME;
   OD
END
DATAVEC TEMPLATE (LOGICAL8)
   0 [11]
   "<-"
   0 [8]
   ":"
END
SELECT IO.VARS [DEV.NO];
0 => TALK.INPUT.TASK;
@BOX 5.1
IF INT.STATUS & TR.COMP = 0
@BOX 7.1
COUNT -> HEADER^ [0];
IF TALK.COMMAND.LINE (DEV.NO, HEADER)
   => TALK.INPUT.TASK < 0
@BOX 10.1
58 => I;
WHILE 1 -> I >= 4 DO
   HEADER^ [I] => HEADER^ [I + 19];
OD
0 => I;
WHILE I < 22 DO
   TEMPLATE [I] => HEADER^ [1 +> I];
OD
19 +> HEADER^ [0];
COPY.UNAME (TALK.DEST.UNAME, 11);
SYS17.FIND.NAMES (UID);
COPY.UNAME (PWW1, 21);
@BOX 12.1
MONITOR (DEV.NO, 3);
@BOX 13.1
START.TR.CMD => CONTROL;
BUF.RA + 4 => ADDRESS;
57 => COUNT => HEADER^ [0];
@BOX 14.1
1 => TALK.INPUT.TASK;
@BOX 15.1
END
@BOX 21.1
CH.NO <<- 9 ! %100 ! V.MC.NO => SPN.PID;
SYS15.SET.ID (SPN.PID, SPN.PID, 0);
TALK.DEST.SPN.PID => T.DEST [0] => T.DEST [1];
8 => T.DEST [2];
0 => T.DEST [3];
SEND.MESSAGE (HEADER, ^T.DEST, 8, 0, 0, 0);
@BOX 25.1
IF PW0 = 0
@END
@TITLE SYSTSK07.2(5,11)
@COL 1S-2T-3R-4R-5R-6R-8F
@COL 7R
@ROW 3-7
@FLOW 1-2OK-3-4-5-6-2
@FLOW 2NONE-7-8
@BOX 1.0
TALK OUTPUT TASK (DEVICE NO)
@BOX 2.0
READ MESSAGE FROM
PERIPHERAL CHANNEL
@BOX 3.0
NOTE THAT THE DEVICE IS
NOT WAITING FOR A DOCUMENT
@BOX 4.0
REPLY IF NECESSARY
@BOX 5.0
FIND UID OF THE RECIPIENT
@BOX 6.0
SEND MESSAGE TO THE RECIPIENT(S)
[SYSTSK07.7]
@BOX 7.0
NOTE DEVICE IS WAITING
FOR AN OUTPUT DOCUMENT
@BOX 8.0
END
@BOX 1.1
PROC TALK.OUTPUT.TASK (DEV.NO);
INTEGER I, TALK.DEST.UID, HEADER0;
INTEGER32 SPN.PID;
LOGICAL64 UNAME, C.MC.NAME;
ADDR [LOGICAL8] HDR;
DATAVEC TALK.REPLY.MESS (LOGICAL8)
   28 0 [3]
   "        :USER NOT LOGGED IN$L"
END
SELECT IO.VARS [DEV.NO];
0 => TALK.OUTPUT.TASK;
@BOX 2.1
SYS15.READ.PERI.MESSAGE (HEADER, ^DEST, CH.NO, -1);
IF PW0 /= 0
@BOX 3.1
PW1 => SEG;
WAITING -=> IO.STATUS;
@BOX 4.1
IF DEST [2] = %10 THEN
   CH.NO <<- 9 ! %100 ! V.MC.NO => SPN.PID;
   SYS15.SET.ID (SPN.PID, SPN.PID, 0);
   SEND.MESSAGE (^NUL.MESS, ^DEST, 0, 0, 0, 0);
FI
@BOX 5.1
HEADER^ [0] => HEADER0;
PART (HEADER, HEADER0, HEADER0 + HEADER^ [1]) => HDR;
3 => I;
FOR 8 DO
   UNAME <<- 8 ! HDR^ [1 +> I] => UNAME;
OD
0 => PW0;
IF UNAME = "ALL" THEN
   -1 => TALK.DEST.UID;
ELSE
   SYS17.FIND.UID (UNAME);
   PW1 => TALK.DEST.UID;
FI
@BOX 6.1
IF PW0 /= 0 OR
   TALK (TALK.DEST.UID, HDR, SEG) < 0 THEN
   SYS18.MACHINE.NAME => C.MC.NAME;
   FOR I < 32 DO
      TALK.REPLY.MESS [I] => HEADER^ [I];
   OD
   12 => I;
   FOR 8 DO
      C.MC.NAME => HEADER^  [1 -> I];
      C.MC.NAME ->> 8 => C.MC.NAME;
   OD
   8 => DEST [2];
   SEND.MESSAGE (HEADER, ^DEST, 8, 0, 0, 0);
FI
@BOX 7.1
WAITING !> IO.STATUS;
@BOX 8.1
END
@END

