<< LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION>>               00000001
                                                                        45000000
$PAGE "DODSDIT(LDEV, TYPECHECK): Format DS DIT"                         45002000
$CONTROL SEGMENT=TABLESDS                                               45004000
COMMENT                                                                 45006000
                                                                        45008000
Purpose:                                                                45010000
<< IN ORDER TO PROCESS THE DS DITS ASSOCIATED WITH THE     >>  <<01199>>45012000
<< LOGICAL DEVICE "LDEV", ALL DEVICES MUST BE EXAMINED IN  >>  <<01199>>45014000
<< ORDER TO DETERMINE THAT THAT PARTICULAR DEVICE IS       >>  <<01199>>45016000
<< CONTROLLED BY LDEV.  EVERY ENTRY IN THE LPDT IS SCANNED >>  <<01199>>45018000
<< AND IF A DEVICE IS A DS DEVICE AND IT BACKREFERENCES    >>  <<01199>>45020000
<< LDEV, ITS DS DIT IS FORMATTED.                          >>  <<01199>>45022000
                                                                        45024000
Input parameters:                                                       45026000
                                                                        45028000
Output parameters:                                                      45030000
                                                                        45032000
Globals Referenced:                                                     45034000
                                                                        45036000
Globals Altered:                                                        45038000
                                                                        45040000
Data Structures:                                                        45042000
                                                                        45044000
Algorithm:                                                              45046000
                                                                        45048000
;                                                                       45050000
PROCEDURE DODSDIT( LDEV, TYPECHECK );                          <<01199>>45052000
VALUE LDEV, TYPECHECK;                                         <<01199>>45054000
INTEGER LDEV, TYPECHECK;                                       <<01199>>45056000
BEGIN                                                         <<<01.02>>45058000
                                                              <<<01.02>>45060000
DOUBLE SCRATCH,DITPTR,LPDTBASE:=%1010D;                       <<<01.02>>45062000
                                                               <<01199>>45064000
LOGICAL                                                        <<01199>>45066000
   LPDT, DLT,               << TABLE ADDRESSES.            >>  <<01199>>45068000
   DIT;                     << DIT ADDRESS.                >>  <<01199>>45070000
                                                               <<01199>>45072000
INTEGER                                                        <<01199>>45074000
   LDINDX,                  << LOGICAL DEVICE LOOP INDEX.  >>  <<01199>>45076000
   NUMENTRIES,              << NUMBER OF ENTRIES IN LPDT.  >>  <<01199>>45078000
   SUBTYPE,                 << DEVICE SUBTYPE.             >>  <<01199>>45080000
   BACKREF;                 << BACK REFERENCE LDEV NUMBER. >>  <<01199>>45082000
                                                               <<01199>>45084000
LOGICAL ARRAY SCR0(*)=SCRATCH;                                 <<01.02>>45086000
LOGICAL ARRAY SCR1(*)=SCR0(1);                                 <<01.02>>45088000
LOGICAL WORK1,SIZE,DTYPE,LD;                                  <<<01.02>>45090000
LOGICAL MULTIPT := FALSE;                                      <<01199>>45092000
INTEGER INDX;                                                 <<<01.02>>45094000
                                                              <<<01.02>>45096000
                                                              <<<01.02>>45098000
SUBROUTINE PRINTDSDIT;                                         <<01199>>45100000
                                                               <<01199>>45102000
<< PRINTS THE DIT OF DS DEVICE WITH LOGICAL DEVICE NUMBER, >>  <<01199>>45104000
<< "LD".  THIS SUBROUTINE ASSUMES THAT MOST ERROR CHECKS   >>  <<01199>>45106000
<< WERE ALREADY DONE.                                      >>  <<01199>>45108000
                                                               <<01199>>45110000
                                                               <<01199>>45112000
                                                               <<01199>>45114000
BEGIN                                                          <<01199>>45116000
   DITPTR:=SCRATCH;                                           <<<01.02>>45118000
   SCR1:=CORE(DITPTR+4D);<<GET DLT PTR>>                      <<<01.02>>45120000
   SCR1:=SCR1+%1000;<<MAKE IT ABSOLUTE>>                      <<<01.02>>45122000
   WORK1:=CORE(SCRATCH+5D);<<DLT WORD 5/DITSIZE/DEVTYPE>>     <<<01.02>>45124000
   SIZE:=WORK1.(0:8);                                         <<<01.02>>45126000
   DTYPE:=WORK1.(8:8);                                        <<<01.02>>45128000
   IF MULTIPT THEN GO HEADONE;                                 <<01199>>45130000
   IF DTYPE=41 THEN                                           <<<01.02>>45132000
      MOVE BBUF(12) := "(IODS0 CONTROLLER)";                   <<01199>>45134000
   IF DTYPE=16 THEN                                            <<01.02>>45136000
      MOVE BBUF(12) := "(IODS0 TERMINAL DEVICE)";              <<01199>>45138000
   IF BBUF(12)="  " THEN GO GETOUT;<<NOT DS DEV..ALL OVER>>   <<<01.02>>45140000
                                                               <<01199>>45142000
HEADONE:                                                       <<01199>>45144000
                                                               <<01199>>45146000
   PRINTLINE;                                                 <<<01.02>>45148000
   SKIPLINES(1);                                              <<<01.02>>45150000
   IF TYPECHECK <> 17 THEN                                     <<01199>>45152000
   BEGIN                                                       <<01199>>45154000
      MOVE BBUF(12) := "UNIT";                                 <<01199>>45156000
      @PBUF := @BBUF + 17;                                     <<01199>>45158000
      WORK1 := CORE( DITPTR+3D );                              <<01199>>45160000
      WORK1 := WORK1.(0:8);                                    <<01199>>45162000
      ASCII( WORK1, 10, PBUF );                                <<01199>>45164000
   END;                                                        <<01199>>45166000
   @PBUF:=@BBUF+32;                                           <<<01.02>>45168000
                                                               <<01199>>45170000
   MOVE BBUF(20):="LOGICAL DEV";                              <<<01.02>>45172000
   ASCII(LD,10,PBUF);                                         <<<01.02>>45174000
   MOVE BBUF(37):="FLAGS =";                                  <<<01.02>>45176000
   @PBUF:=@BBUF+45;                                           <<<01.02>>45178000
   WORK1:=CORE(DITPTR);                                       <<<01.02>>45180000
   PUTNUM(WORK1);<<FLAGS>>                                    <<<01.02>>45182000
   MOVE BBUF(55):="NEXT DIT =";                               <<<01.02>>45184000
   WORK1:=CORE(DITPTR+1D);                                    <<<01.02>>45186000
   @PBUF:=@BBUF+66;                                           <<<01.02>>45188000
   PUTNUM(WORK1);<<NEXT DIT>>                                 <<<01.02>>45190000
   MOVE BBUF(74):="DLTP =";                                   <<<01.02>>45192000
   WORK1:=CORE(DITPTR+4D);                                    <<<01.02>>45194000
   @PBUF:=@BBUF+81;                                           <<<01.02>>45196000
   PUTNUM(WORK1);<<DLTP>>                                     <<<01.02>>45198000
   MOVE BBUF(104):="IOQP =";                                  <<<01.02>>45200000
   WORK1:=CORE(DITPTR+2D);                                    <<<01.02>>45202000
   @PBUF:=@BBUF+111;                                          <<<01.02>>45204000
   PUTNUM(WORK1);<<IOQP>>                                     <<<01.02>>45206000
   PRINTLINE;                                                 <<<01.02>>45208000
   SKIPLINES(1);                                              <<<01.02>>45210000
   IF SIZE=0 THEN RETURN;                                     <<<01.02>>45212000
   SCRATCH:=DITPTR-%1000D;                                    <<<01.02>>45214000
                                                               <<03752>>45216000
<< NOW PRINT THE ACTUAL DIT >>                                 <<03752>>45218000
   PRINT'OCTAL'DIT( DITPTR, SCR1, INTEGER( SIZE ));            <<03752>>45220000
                                                               <<03752>>45222000
   SKIPLINES(2);                                              <<<01.02>>45224000
   GETOUT:                                                     <<01199>>45226000
                                                               <<01199>>45228000
END;  << PRINTDSDIT >>                                         <<01199>>45230000
                                                               <<01199>>45232000
<< M A I N   B O D Y                                       >>  <<01199>>45234000
                                                               <<01199>>45236000
                                                               <<01199>>45238000
<< CHECK THE PARAMETER.                                    >>  <<01199>>45240000
   IF LDEV = 0 THEN RETURN;                                    <<01199>>45242000
                                                               <<01199>>45244000
<< DETERMINE THE NUMBER OF ENTRIES IN THE LPDT.            >>  <<01199>>45246000
   LPDT := CORE( LPDTBASE ) + %1000;                           <<01199>>45248000
   SCR0 := 0;                                                  <<01199>>45250000
   SCR1 := LPDT;                                               <<01199>>45252000
   SCR1 := CORE( SCRATCH );                                    <<01199>>45254000
   NUMENTRIES := SCR1.(0:8);                                   <<01199>>45256000
                                                               <<01199>>45258000
<< PROCESS EVERY ENTRY IN THE LPDT.                        >>  <<01199>>45260000
                                                               <<01199>>45262000
FOR LDINDX := 1 UNTIL NUMENTRIES DO                            <<01199>>45264000
BEGIN                                                          <<01199>>45266000
                                                               <<01199>>45268000
<< FOR EVERY DEVICE IN THE SYSTEM, GET THE DEVICE TYPE,    >>  <<01199>>45270000
<< SUBTYPE, DIT POINTER, AND BACKREFERENCE.                >>  <<01199>>45272000
   LD := LOGICAL( LDINDX );                                    <<01199>>45274000
   SCR0 := 0;                                                  <<01199>>45276000
   SCR1 := LD * 2 + LPDT;                                      <<01199>>45278000
   SCR1 := CORE( SCRATCH ) + %1000;       << DIT POINTER.  >>  <<01199>>45280000
   IF INTEGER( SCR1 ) <= 0        << VIRTUAL DEVICE CHECK. >>  <<01199>>45282000
      THEN GO NEXTDEV;                                         <<01199>>45284000
   DIT := SCR1;                                                <<01199>>45286000
   SUBTYPE := INTEGER( CORE( SCRATCH + 1D ) ).(12:4);          <<01199>>45288000
                                                               <<01199>>45290000
<< GET DIT SIZE AND DEVICE TYPE FROM DLT ENTRY.            >>  <<01199>>45292000
   DLT := CORE( SCRATCH + 4D ) + %1000;                        <<01199>>45294000
   SCR0 := 0;                                                  <<01199>>45296000
   SCR1 := DLT;                                                <<01199>>45298000
   WORK1 := CORE( SCRATCH + 5D );                              <<01199>>45300000
   DTYPE := WORK1.(8:8);                                       <<01199>>45302000
   SIZE := WORK1.(0:8);                                        <<01199>>45304000
                                                               <<01199>>45306000
<< CHECK FOR DS TYPE DEVICES (DEVICE TYPES 16 AND 41).     >>  <<01199>>45308000
   IF DTYPE <> 41 AND DTYPE <> 16 THEN GO NEXTDEV;             <<01199>>45310000
   SCR0 := 0;                                                  <<01199>>45312000
   SCR1 := DIT;                                                <<01199>>45314000
   IF DTYPE = 16 THEN   << MULTIPOINT DEVICE CHECK.        >>  <<01199>>45316000
   BEGIN                                                       <<01199>>45318000
                                                               <<01199>>45320000
      WORK1 := CORE( SCRATCH );   << CHECK TERMINAL BIT    >>  <<01199>>45322000
      IF WORK1.(0:1) = 1  THEN GO NEXTDEV;                     <<01199>>45324000
      WORK1 := CORE( SCRATCH + 10D );  << BACK REFERENCE   >>  <<01199>>45326000
      IF INTEGER( WORK1.(8:8) ) <> LDEV  THEN GO NEXTDEV;      <<01199>>45328000
      MULTIPT := TRUE;       << GOOD MULTIPOINT DEVICE     >>  <<01199>>45330000
      WORK1 := CORE( SCRATCH + 23D );  << SUPERVISOR CHECK >>  <<01199>>45332000
      IF WORK1.(7:1) = 1                                       <<01199>>45334000
         THEN MOVE BBUF(12) := "(MULTIPOINT SUPERVISOR)"       <<01199>>45336000
         ELSE MOVE BBUF(12) := "(MULTIPOINT TERMINAL)  ";      <<01199>>45338000
                                                               <<01199>>45340000
   END                                                         <<01199>>45342000
                                                               <<01199>>45344000
   ELSE   << POSSIBLE IODS0 CONTROLLER                     >>  <<01199>>45346000
   BEGIN                                                       <<01199>>45348000
      BACKREF := INTEGER( CORE( SCRATCH + 7D ) ).(0:8);        <<01199>>45350000
      IF BACKREF <> LDEV        << WRONG BACKREF           >>  <<01199>>45352000
         THEN GO NEXTDEV;                                      <<01199>>45354000
      MULTIPT := FALSE;                                        <<01199>>45356000
   END;                                                        <<01199>>45358000
                                                               <<01199>>45360000
   SCR0 := 0;                                                  <<01199>>45362000
   SCR1 := DIT;                                                <<01199>>45364000
   PRINTDSDIT;                                                 <<01199>>45366000
   SCR0 := 0;                                                  <<01199>>45368000
   SCR1 := DIT;                                                <<01199>>45370000
   LD := CORE( SCRATCH + 7D ).(8:8);                           <<01199>>45372000
   WHILE LD <> 0 DO                                            <<01199>>45374000
   BEGIN                                                       <<01199>>45376000
      SCR0 := 0;                                               <<01199>>45378000
      SCR1 := LD * 2 + LPDT;                                   <<01199>>45380000
      DIT := SCR1 := CORE( SCRATCH ) + %1000;                  <<01199>>45382000
      PRINTDSDIT;                                              <<01199>>45384000
      SCR0 := 0;                                               <<01199>>45386000
      SCR1 := DIT;                                             <<01199>>45388000
      LD := CORE( SCRATCH + 7D ).(8:8);                        <<01199>>45390000
   END;                                                        <<01199>>45392000
   NEXTDEV:                                                    <<01199>>45394000
                                                               <<01199>>45396000
END;                                                           <<01199>>45398000
                                                               <<01199>>45400000
   BBUF:=" ";                                                 <<<01.02>>45402000
   MOVE BBUF(1):=BBUF,(40);                                   <<<01.02>>45404000
END<<DODSDIT>>;                                               <<<01.02>>45406000
