         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
$PAGE "FUNCTION THISCPU"                                       <<*2070>>00095010
INTEGER PROCEDURE THISCPU;                                     <<*2070>>00095020
  OPTION PRIVILEGED;   << THIS PROCEDURE SHOULD BE CALLABLE. >><<*2070>>00095030
COMMENT                                                        <<*2070>>00095040
**BEGIN_IS*****************************************************<<*2070>>00095050
*                                                             *<<*2070>>00095060
* PROCEDURE THISCPU                                           *<<*2070>>00095070
*                                                             *<<*2070>>00095080
* PURPOSE:  THISCPU IS A INTEGER FUNCTION CALLED TO RETURN A  *<<*2070>>00095090
*           VALUE IDENTIFYING THE TYPE OF CPU CURRENTLY       *<<*2070>>00095100
*           RUNNING.                                          *<<*2070>>00095110
*                                                             *<<*2070>>00095120
*           FIRST DETERMINE IF THE CPU IS A SERIES I OR NOT.  *<<*2070>>00095130
*           IF IT IS, THEN RETURN THE TYPE AS A SERIES I AND  *<<*2070>>00095140
*           RETURN.  IF NOT, THEN DO A PCN INSTRUCTION (CON   *<<*2070>>00095150
*           %020362) TO HAVE MICROCODE RETURN THE CPU TYPE    *<<*2070>>00095160
*           AND TRANSLATED TO THE PROPER VALUE TO BE RETURNED *<<*2070>>00095170
*           TO THE CALLER.                                    *<<*2070>>00095180
*                                                             *<<*2070>>00095190
* ENTRY:    NONE                                              *<<*2070>>00095200
*                                                             *<<*2070>>00095210
* EXIT:     THISCPU=CPU NUMBER OF THIS SYSTEM                 *<<*2070>>00095220
*                  =0 IF SERIES I                             *<<*2070>>00095230
*                  =1 IF SERIES II                            *<<*2070>>00095240
*                  =2 IF SERIES 33                            *<<*2070>>00095250
*                  =3 IF SERIES III                           *<<*2070>>00095260
*                  =4 IF SERIES 44                            *<<*2070>>00095270
*                  =5 IF SERIES 64                            *<<*2070>>00095280
*                  =6 IF SERIES 37                            *<<*2070>>00095290
*                                                             *<<*2070>>00095300
*                  =7-15 IF MIGHTY MOUSE FAMILY               *<<*2070>>00095310
*                        =7 IF TIOGA                          *<<*2070>>00095320
*                        =8 IF MICROMOUSE                     *<<*2070>>00095330
*                        (9-15 TO BE ASSIGNED)                *<<*2070>>00095340
*                                                             *<<*2070>>00095350
**END_IS*******************************************************<<*2070>>00095360
;                                                              <<*2070>>00095370
  BEGIN                                                        <<*2070>>00095380
    INTEGER X=X;                                               <<*2070>>00095390
                                                               <<*2070>>00095400
!   DETERMINE IF THE HARDWARE IS A SERIES I                    <<*2070>>00095410
!   ---------------------------------------                    <<*2070>>00095420
    TOS:=0;         <<INITIALIZE RETURN (SERIES I)>>           <<*2070>>00095430
    TOS:=-1;        <<TEST FLAG - ILLEGAL BANK #  >>           <<*2070>>00095440
    PUSH(DB);       <<1 WORD ON SERIES I          >>           <<*2070>>00095450
                    <<2 WORDS ON SERIES II/TOOTHPICK>>         <<*2070>>00095460
    DEL;            <<DON'T NEED DB ADDRESS       >>           <<*2070>>00095470
    IF TOS <> -1 THEN <<WAS BANK # PUSHED?        >>           <<*2070>>00095480
                                                               <<*2070>>00095490
!     IF NOT, DO PCN INSTRUCTION TO GET CPU TYPE               <<*2070>>00095500
!     ------------------------------------------               <<*2070>>00095510
      BEGIN         <<YES - NOT SERIES I          >>           <<*2070>>00095520
        DEL;        <<DELETE TEST FLAG            >>           <<*2070>>00095530
        DEL;        <<DELETE RETURN VALUE         >>           <<*2070>>00095540
                                                               <<*2070>>00095550
!       DO TRANSLATION OF CPU TYPE TO PASS BACK TO CALLER      <<*2070>>00095560
!       -------------------------------------------------      <<*2070>>00095570
        ASSEMBLE(CON %020362); <<GET MICROCODE CPU #>>         <<*2070>>00095580
        X:=TOS;                                                <<*2070>>00095590
                                                               <<*2070>>00095600
        IF X=1 THEN TOS:=1      !SERIES II                     <<*2070>>00095610
         ELSE IF X=8 THEN TOS:=2 !SERIES 33                    <<*2070>>00095620
          ELSE IF X=2 THEN TOS:=3 !SERIES III                  <<*2070>>00095630
           ELSE IF X=3 THEN TOS:=4 !SERIES 44                  <<*2070>>00095640
            ELSE IF X=4 THEN TOS:=5 !SERIES 64                 <<*2070>>00095650
             ELSE IF X=5 THEN TOS:=6 !SERIES 37                <<*2070>>00095660
              ELSE IF X=6 THEN TOS:=7 !TIOGA                   <<*2070>>00095670
               ELSE IF X=7 THEN TOS:=8 !UMOUSE                 <<*2070>>00095680
                ELSE SUDDENDEATH(13); !BAD PCN VALUE           <<*2070>>00095690
                                                               <<*2070>>00095700
      END;                                                     <<*2070>>00095710
                                                               <<*2070>>00095720
!   PASS BACK CPU NUMBER                                       <<*2070>>00095730
!   --------------------                                       <<*2070>>00095740
    THISCPU:=TOS;  <<RETURN VALUE>>                            <<*2070>>00095750
  END;    << END THISCPU >>                                    <<*2070>>00095760
                                                               <<f9326>>05899010
       << the -1 below is so that the header acts as an      >><<f9326>>05899020
       << ioq entry on the first return after all ioq's are  >><<f9326>>05899030
       << in use.  The index points to the free tail and the >><<f9326>>05899040
       << free head is used as the link word by RETURNIOQ.   >><<f9326>>05899050
                                                               <<f9326>>05899060
      THEN IQH'FREETAIL := IQH'FREEHEAD'INDEX - 1              <<f9326>>05900000
                      << ZERO FREELIST BIT AND PCB # >>        <<*9545>>06409100
                      ELSE ARQX'PCB := 0;                      <<*9545>>06410000
                                                               <<f9326>>06429010
       << the -1 below is so that the header acts as an      >><<f9326>>06429020
       << drq entry on the first return after all drq's are  >><<f9326>>06429030
       << in use.  The index points to the free tail and the >><<f9326>>06429040
       << free head is used as the link word by RETURNDRQ.   >><<f9326>>06429050
                                                               <<f9326>>06429060
      THEN  AQH'FREETAIL :=  AQH'FREEHEAD'INDEX - 1            <<f9326>>06430000
<<                                                           >><<*9889>>07179000
<< A call to STORE'IOQ which was used by the Measurement     >><<*9889>>07179010
<< Interface to keep track of all DRQ's was remove from      >><<*9889>>07179020
<< line 7180 and move to line 18934.9 in SIODM and also      >><<*9889>>07179030
<< put in Cachseg for LDR'S. The reason for this is that     >><<*9889>>07179040
<< Caching sometimes multiply uses DRQ's without returning   >><<*9889>>07179050
<< them so some info on DRQ useage was not available to the  >><<*9889>>07179060
<< Measurement Interface. Also Caching sometimes gets LDR's  >><<*9889>>07179070
<< and doesn't use them, which is false info. for the        >><<*9889>>07179080
<< Measurement Interface.                                    >><<*9889>>07179090
<<                                                           >><<*9889>>07179100
$EDIT                                                          <<*9889>>07180000
INTEGER PROCPRI; <<CPU PRIORITY FROM PCB ENTRY>>               <<Q9366>>08512000
                                                               <<Q9366>>08513000
EQUATE ICS'CSCHEDBASECELL = %43;                               <<Q9366>>08514000
                                                               <<*1771>>08655010
   <<                                                       >> <<*1771>>08655020
   << THE FOLLOWING IS A BUG CATCHER FOR ILLEGAL CALLS TO   >> <<*1771>>08655030
   << ATTACHIO/P'ATTACHIO. THE CALLS ARE DOING NO PCB,      >> <<*1771>>08655040
   << NO WAIT I/O AND NOT USING SYSTEM BUFFERS. SYSTEM      >> <<*1771>>08655050
   << BUFFERS MUST BE USED FOR THIS TYPE OF I/O.            >> <<*1771>>08655060
   <<                                                       >> <<*1771>>08655070
                                                               <<*1771>>08655080
   IF ADISC AND FLAGS.RTYPE = 3 AND NOT LFLAGS.SYSBUFRS        <<*1771>>08655090
      THEN SUDDENDEATH(661);                                   <<*1771>>08655100
                                                               <<*1771>>08655110
   PROCPRI := LPCB(CURPRC + QUEUEINGINFOWORDNUM).PRIFIELD;     <<Q9366>>09260000
   IF LPCB(CURPRC + RESABORTINFOWORDNUM).HASSIRFLAG AND        <<Q9366>>09261000
      PROCPRI > ICS(-ICS'CSCHEDBASECELL) THEN                  <<Q9366>>09262000
      PROCPRI := ICS(-ICS'CSCHEDBASECELL); <<IF THE PROCESS>>  <<Q9366>>09263000
      <<IS RUNNING IN NON-LINEAR QUEUE AND HOLDING A SIR >>    <<Q9366>>09264000
      <<THEN ITS PRIORITY WILL BE AT THE PRIORITY OF C BASE>>  <<Q9366>>09264100
   DRQ'URGCLAS := PROCPRI;                                     <<Q9366>>09265000
                                                               <<D1987>>09265010
<<THIS WILL ACCOUNT FOR ALL NON-CACHE DISC IOS. SEE COMMENT >> <<D1987>>09265100
<<IN SIODM AT THE OLD PLACE FOR MORE EXPLAINATION>>            <<D1987>>09265200
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<D1987>>09265300
   BEGIN                                                       <<D1987>>09265400
      IF (DRQ'FUNC <= 1) OR (DRQ'FUNC = 5) OR (DRQ'FUNC = 6)   <<W2191>>09265500
         OR (DRQ'FUNC = 11) THEN                               <<W2191>>09265510
      BEGIN                                                    <<D1987>>09265600
         TOS := MEASPROCXDSBANK;                               <<D1987>>09265700
         TOS := MEASPROCXDSBASE + DRQ'PCB * CLASS15'SUB0SIZE;  <<D1987>>09265800
         IF DRQ'FUNC = 0 THEN                                  <<D1987>>09265900
            TOS := TOS + CP'DISCREAD                           <<D1987>>09266000
         ELSE                                                  <<D1987>>09266100
            TOS := TOS + CP'DISCWRITE;                         <<D1987>>09266200
         ASMB (LSEA);                                          <<D1987>>09266300
         TOS := TOS + 1;                                       <<D1987>>09266400
         ASMB (SSEA);                                          <<D1987>>09266500
         <<NOW BUMP TRANSFER COUNT>>                           <<D1987>>09266600
         IF DRQ'FUNC = 0 THEN                                  <<D1987>>09266700
            TOS := TOS - CP'DISCREAD + CP'WORDSTRANS           <<D1987>>09266800
         ELSE                                                  <<D1987>>09266900
            TOS := TOS - CP'DISCWRITE + CP'WORDSTRANS;         <<D1987>>09267000
         ASMB (LDEA;ZERO);  <<OLD COUNT, ZERO FOR DOUBLE ADD>> <<D1987>>09267100
         IF INTEGER (DRQ'COUNT) < 0 THEN                       <<D1987>>09267200
            TOS := - DRQ'COUNT / 2                             <<D1987>>09267300
         ELSE                                                  <<D1987>>09267400
            TOS := DRQ'COUNT;                                  <<D1987>>09267500
         ASMB (DADD;SDEA;DDEL);                                <<D1987>>09267600
      END;                                                     <<D1987>>09267700
   END;                                                        <<D1987>>09267800
                                                               <<D1987>>09267900
equate MAX'SUPPORTED = 9;                                      <<*1326>>11580000
                           3,  << BUFFALO >>                   <<*1326>>11625000
                           3;  << MERLIN  >>                   <<*1326>>11625100
                           3,  << BUFFALO >>                   <<*1326>>11670000
                           6;  << MERLIN  >>                   <<*1326>>11670100
$PAGE "CHECK'FOR'DEVREC;checks devices that should be AVR'd."  <<s9286>>14497000
logical procedure CHECK'FOR'DEVREC(LDEV, PARM);                <<s9286>>14498000
                                                               <<s9286>>14499000
value   LDEV,        << logical device              >>         <<s9286>>14500000
        PARM;        << DEVREC invocation parameter >>         <<s9286>>14501000
logical LDEV,                                                  <<s9286>>14502000
        PARM;                                                  <<s9286>>14503000
option  PRIVILEGED, UNCALLABLE;                                <<s9286>>14504000
begin                                                          <<s9286>>14505000
                                                               <<s9286>>14506000
COMMENT                                                        <<s9286>>14507000
                                                               <<s9286>>14508000
   CHECK'FOR'DEVREC is called to determine whether a particular<<s9286>>14509000
logical device (LDEV) should be AVR'd or already has been      <<s9286>>14510000
AVR'd.                                                         <<s9286>>14511000
                                                               <<s9286>>14512000
   CHECK'FOR'DEVREC returns TRUE if the device should be AVR'd.<<s9286>>14513000
FALSE is returned if the device cannot be AVR'd or already has <<s9286>>14514000
been AVR'd.                                                    <<s9286>>14515000
                                                               <<s9286>>14516000
   CHECK'FOR'DEVREC will perform an AWAKE on DEVREC if         <<s9286>>14517000
PARM.(15:1) = 1.                                               <<s9286>>14518000
                                                               <<s9286>>14519000
   RECOGNIZE'DEVICE is an entry point used by SIODM calls      <<s9286>>14520000
to CHECK'FOR'DEVREC. Note that DB is not changed for entry     <<s9286>>14521000
point RECOGNIZE'DEVICE.                                        <<s9286>>14521010
                                                               <<s9286>>14522000
   If primary entry point CHECK'FOR'DEVREC is used then DB     <<s9286>>14523000
will be set to SYSDB upon entry then reset back to the         <<s9286>>14524000
Callers' DB and DB Bank before exiting.                        <<s9286>>14524010
                                                               <<s9286>>14525000
   Procedures called are AWAKE, SETSYSDB & RESETDB.            <<s9286>>14526000
                                                               <<s9286>>14527000
                                                               <<s9286>>14528000
   LDEV  -  logical device to check for AVR capability.        <<s9286>>14529000
   PARM  -  notifies CHECK'FOR'DEVREC whether to do an AWAKE   <<s9286>>14530000
            on DEVREC.                                         <<s9286>>14531000
                                                               <<s9286>>14532000
TABLES referenced:                                             <<s9286>>14533000
                                                               <<s9286>>14534000
   LPDT  -  contains device subtype, device recognition state  <<s9286>>14535000
            and the pointer to the Device Information Table.   <<s9286>>14536000
   DIT   -  contains pointer to Driver Linkage Table.          <<s9286>>14537000
   DLT   -  contains device type.                              <<s9286>>14538000
                                                               <<s9286>>14539000
;  << end of comment >>                                        <<s9286>>14540000
                                                               <<s9286>>14541000
                                                               <<s9286>>14542000
                                                               <<s9286>>14543000
                                                               <<s9286>>14544000
                                                               <<s9286>>14545000
define                                                         <<s9286>>14546000
   WAKE'DEVREC = PARM.(15:1)#; << if set and have an AVR   >>  <<s9286>>14547000
                               << device that hasn't been  >>  <<s9286>>14548000
                               << AVR'd then AWAKE DEVREC. >>  <<s9286>>14549000
                                                               <<s9286>>14550000
logical                                                        <<s9286>>14551000
   LPDT'INDEX,                 << used to peg the LPDT     >>  <<s9286>>14552000
   CALL'FROM'SIODM,            << SIODM entry point flag   >>  <<s9286>>14553000
   RET'VALUE;                  << value to return          >>  <<s9286>>14554000
                                                               <<s9286>>14555000
integer                                                        <<s9286>>14556000
   TYPE,                       << device type              >>  <<s9286>>14557000
   SUBTYPE,                    << device subtype           >>  <<s9286>>14558000
   OLDDB;                      << callers' return DB parm  >>  <<s9286>>14559000
                                                               <<s9286>>14560000
logical pointer                                                <<s9286>>14561000
   DITP,                       << Device Information Table >>  <<s9286>>14562000
   DLTP;                       << Driver Linkage Table     >>  <<s9286>>14563000
                                                               <<s9286>>14564000
entry                                                          <<s9286>>14565000
   RECOGNIZE'DEVICE;           << entry for SIODM          >>  <<s9286>>14566000
                                                               <<s9286>>14567000
                                                               <<s9286>>14568000
                                                               <<s9286>>14569000
                                                               <<s9286>>14570000
<<*********************************************************>>  <<s9286>>14570010
<<                                                         >>  <<s9286>>14570020
<< Note that DB only gets changed to SYSDB and reset back  >>  <<s9286>>14570030
<< to the callers' DB and DB Bank if this procedure is     >>  <<s9286>>14570040
<< entered through primary entry point CHECK'FOR'DEVREC.   >>  <<s9286>>14570050
<<                                                         >>  <<s9286>>14570060
<<*********************************************************>>  <<s9286>>14570070
                                                               <<s9286>>14571000
OLDDB := SETSYSDB;             << save callers environment >>  <<s9286>>14572000
CALL'FROM'SIODM := FALSE;      << set SIODM entry flag     >>  <<s9286>>14573000
goto COMMON'START;             << primary entry point      >>  <<s9286>>14574000
                                                               <<s9286>>14575000
RECOGNIZE'DEVICE:              << SIODM's entry point      >>  <<s9286>>14576000
                                                               <<s9286>>14577000
CALL'FROM'SIODM := TRUE;       << set entry point flag     >>  <<s9286>>14578000
                                                               <<s9286>>14579000
COMMON'START:                  << back to common code      >>  <<s9286>>14580000
                                                               <<s9286>>14581000
                                                               <<s9286>>14582000
<< peg the LPDT and set up pointers, variables >>              <<s9286>>14583000
                                                               <<s9286>>14584000
LPDT'INDEX := LDEV * LPDT'ENTRY'SIZE;                          <<s9286>>14585000
@DITP := LPDT'DIT'PTR;             << set DIT from LPDT >>     <<s9286>>14586000
@DLTP := DITP(DDLTP);              << set DLT from DIT  >>     <<s9286>>14587000
TYPE := DLTP(DSIZE).DEVTYPE;       << device type       >>     <<s9286>>14588000
SUBTYPE := LPDT'SUBTYPE;           << device subtype    >>     <<s9286>>14589000
RET'VALUE := FALSE;                << set return value  >>     <<s9286>>14590000
                                                               <<s9286>>14591000
<<                                                      >>     <<s9286>>14592000
<< Don't bother DEVREC if the device is "mounted" or    >>     <<s9286>>14593000
<< the System isn't UP yet or PVPROC is making this     >>     <<s9286>>14594000
<< request. Only if SIODM didn't make this call.        >>     <<s9286>>14595000
<<                                                      >>     <<s9286>>14596000
                                                               <<s9286>>14597000
if not CALL'FROM'SIODM and                                     <<s9286>>14598000
   (LPDT'RDY'SER'FRN'DISC or not SYSUP or (CURPRC=PVPROCPCBP)) <<s9286>>14599000
   then goto FORGET'IT;                                        <<s9286>>14600000
                                                               <<s9286>>14601000
if (LPDT'DATA'ACCEPT or LPDT'JOB'ACCEPT) and                   <<s9286>>14602000
   (LPDT'DEV'OWN'STATE = LPDT'NOT'OWNED) then RET'VALUE:=TRUE  <<s9286>>14603000
                                                               <<s9286>>14604000
else if (LPDT'DEV'OWN'STATE = LPDT'NOT'OWNED) and              <<s9286>>14605000
   AVR and MAGTAPE then RET'VALUE := TRUE                      <<s9286>>14606000
                                                               <<s9286>>14607000
else if 0 <= TYPE <= 3 then                                    <<s9286>>14608000
   case *TYPE of                                               <<s9286>>14609000
      begin << TYPE cases >>                                   <<s9286>>14610000
                                                               <<s9286>>14611000
      <<0>> begin  << 13037 disc family >>                     <<s9286>>14612000
            if LPDT'NON'SYS'DOMAIN = 1 then RET'VALUE := TRUE  <<s9286>>14613000
            else if (SUBTYPE = 5) or (SUBTYPE = 11)            <<s9286>>14614000
               then RET'VALUE := TRUE;                         <<s9286>>14615000
            end;   << 13037 disc family >>                     <<s9286>>14616000
                                                               <<s9286>>14617000
      <<1>> begin  << 2660 disc drive   >>                     <<s9286>>14618000
            end;   << 2660 disc drive   >>                     <<s9286>>14619000
                                                               <<s9286>>14620000
      <<2>> begin  << Floppy disc drive >>                     <<s9286>>14621000
            RET'VALUE := TRUE;                                 <<s9286>>14622000
            end;   << Floppy disc drive >>                     <<s9286>>14623000
                                                               <<s9286>>14624000
      <<3>> begin  << CS 80 devices     >>                     <<s9286>>14625000
            if LPDT'NON'SYS'DOMAIN = 1 then RET'VALUE := TRUE; <<s9286>>14626000
            end;   << CS 80 devices     >>                     <<s9286>>14627000
                                                               <<s9286>>14628000
      end;  << case of *TYPE >>                                <<s9286>>14629000
                                                               <<s9286>>14630000
if RET'VALUE and                                               <<s9286>>14631000
   (  (LPDT'DEV'OWN'STATE = LPDT'NOT'OWNED)                    <<s9286>>14632000
                    or                                         <<s9286>>14633000
   (LPDT'DEV'OWN'STATE = LPDT'OWNED)  ) then                   <<s9286>>14634000
   begin                                                       <<s9286>>14635000
   if WAKE'DEVREC then                                         <<s9286>>14636000
      begin                                                    <<s9286>>14637000
      DISABLE;        << disable interrupts >>                 <<s9286>>14638000
                                                               <<s9286>>14639000
      <<                                               >>      <<s9286>>14640000
      << set service requested & bump serv. req. count >>      <<s9286>>14641000
      << reset interrupt ack. if request from SIODM    >>      <<s9286>>14642000
      <<                                               >>      <<s9286>>14643000
                                                               <<s9286>>14644000
      LPDT'DEV'OWN'STATE := LPDT'SERVICE'REQ;                  <<s9286>>14645000
      LPDT'SERV'REQ'COUNT := LPDT'SERV'REQ'COUNT + 1;          <<s9286>>14646000
      if CALL'FROM'SIODM then DITP.IAK := 0;                   <<s9286>>14647000
                                                               <<s9286>>14648000
      ENABLE;         << enable interrupts >>                  <<s9286>>14649000
      AWAKE(DEVRECPCBP, JUNKWAIT, NOWAIT); << wake DEVREC >>   <<s9286>>14650000
      end;  << if WAKE'DEVREC >>                               <<s9286>>14651000
   end   << if RET'VALUE, etc. >>                              <<s9286>>14652000
else RET'VALUE := FALSE;                                       <<s9286>>14653000
                                                               <<s9286>>14654000
FORGET'IT:                                                     <<s9286>>14655000
                                                               <<s9286>>14656000
CHECK'FOR'DEVREC := RET'VALUE; << give caller return value >>  <<s9286>>14657000
                                                               <<s9286>>14658000
if not CALL'FROM'SIODM then RESETDB(OLDDB);  << restore DB >>  <<s9286>>14659000
end;  << CHECK'FOR'DEVREC >>                                   <<s9286>>14660000
DEFINE                                                         <<09419>>14811000
   DRIVER'CONTROLS'AVR = LOGICAL (DITP(DUNIT).(3:1)) #;        <<09419>>14812000
$EDIT VOID = 15090000                                          <<s9286>>15070000
   LDEV     = DITP(DLDEV)#,                                    <<s9286>>15125100
$EDIT VOID = 15740000                                          <<s9286>>15380000
      IF X <> -1 THEN                                          <<C9352>>15925000
                                                               <<09419>>16330100
COMMENT --                                                     <<09419>>16330200
  Usually an interrupt of an idle CP means a device  has  gone <<09419>>16330300
on  or  off line.  For non-system domain discs, PVPROC manages <<09419>>16330400
the table entries associated with these  events.  Trouble  is, <<09419>>16330500
CS80 devices can interrupt the idle CP for other reasons (such <<09419>>16330600
as a release request for internal maintenance or operator  un- <<09419>>16330700
load).  Until now, these interrupts also caused PVPROC to run, <<09419>>16330800
and it was up to PVPROC and the driver to make sure these  in- <<09419>>16330900
terrupts  were  ignored.  With  this change, drivers which are <<09419>>16331000
smart enough to know the difference between  on/off  line  and <<09419>>16331100
internal  interrupts  can cause SIODM to bypass State 6 (unex- <<09419>>16331200
pected interrupt) and go directly to State 0 (Start  Request). <<09419>>16331300
This  implies  that the driver will return to State 6 when PV- <<09419>>16331400
PROC should be scheduled, and to some other  state  (typically <<09419>>16331500
State 5 (Request Complete)) at other times.                    <<09419>>16331600
;                                                              <<09419>>16331700
IF STATE = 6 AND DRIVER'CONTROLS'AVR THEN                      <<09419>>16331800
   DITP.STATEF := STATE := 0;                                  <<09419>>16331900
                  IF <> THEN << MI CAN RECOGNIZE THE DISC >>   <<N2297>>16976000
                  BEGIN                                        <<N2297>>16977000
                  END                                          <<N2297>>16991000
                  ELSE  << MI CAN'T RECOGNIZE THE DISC >>      <<N2297>>16992000
                     ASMB(DEL,DDEL);                           <<N2297>>16993000
      IF <> THEN << MI CAN RECOGNIZE THE DISC >>               <<N2297>>17501000
      BEGIN                                                    <<N2297>>17502000
      END                                                      <<N2297>>17516000
      ELSE << MI CAN'T RECOGNIZE THE DISC >>                   <<N2297>>17517000
         ASMB(DEL,DDEL);                                       <<N2297>>17518000
   IF <> THEN                                                  <<N2297>>18261000
   BEGIN  << WE KEEP COUNTERS FOR THE DEVICE WE RECOGNIZED >> <<FNDICS>>18262000
         IF ((TOS := DRQ'FUNC) <= 1) OR (S0 = 5) OR (S0 = 6)   <<W2191>>18415100
            OR (S0 = 11) THEN   << IF FUNC = 5, 6, 11 THEN >>  <<W2191>>18415200
            BEGIN               << TREAT IT AS A WRITE FUNC>>  <<W2191>>18415300
            IF (S0 > 1) THEN                                   <<W2191>>18415400
               BEGIN                                           <<W2191>>18415500
               DEL;                                            <<W2191>>18415600
               TOS := 1;                                       <<W2191>>18415700
               END;                                            <<W2191>>18415800
            IF DRQ'BLOCKED THEN  << BLOCKED DISC I/O >>        <<W2191>>18415900
               CASE TOS OF                                     <<W2191>>18416000
                  BEGIN                                        <<W2191>>18416100
                  TOS := TOS + C'BLKREAD;                      <<W2191>>18416200
                  TOS := TOS + C'BLKWRITE;                     <<W2191>>18416300
                  END                                          <<W2191>>18416400
            ELSE IF DRQ'IOWAKE THEN  << UNBLOCKED DISC I/O >>  <<W2191>>18416500
               CASE TOS OF           << AWAKE SET >>           <<W2191>>18416600
                  BEGIN                                        <<W2191>>18416700
                  TOS := TOS + C'UNBLKREADAWAKE;               <<W2191>>18416800
                  TOS := TOS + C'UNBLKWRITEAWAKE;              <<W2191>>18416900
                  END                                          <<W2191>>18417000
            ELSE    << UNBLOCKED DISC IO, AWAKE NOT YET SET >> <<W2191>>18417100
               CASE TOS OF                                     <<W2191>>18417200
                  BEGIN                                        <<W2191>>18417300
                  TOS := TOS + C'UNBLKREAD;                    <<W2191>>18417400
                  TOS := TOS + C'UNBLKWRITE;                   <<W2191>>18417500
                  END;                                         <<W2191>>18417600
            END                                                <<W2191>>18417700
         ELSE       << CASE OF CONTROL FUNCTIONS >>            <<W2191>>18417800
            BEGIN                                              <<W2191>>18417900
            DEL;                                               <<W2191>>18418000
            TOS := TOS + C'DISCCONTROL;                        <<W2191>>18418100
            END;                                               <<W2191>>18418200
$EDIT VOID = 18640000                                          <<W2191>>18420000
   END     << END FOR WE CAN RECOGNIZE THE DISC DRIVE >>       <<N2297>>18650500
   ELSE   << IF WE DO NOT RECOGNIZE THIS DEVICE >>             <<N2297>>18651000
      ASMB(DEL,DDEL);  << DELETE BANK, BASE AND SEGRELOFF >>   <<N2297>>18652000
                                                               <<D1987>>18780010
<<IF THE IO GOES THROUGH DISC CACHING, BY THE TIME WE GET    >><<D1987>>18780100
<<HERE WE LOSE THE PCBNUM, THUS UNABLE TO ACCOUNT CORRECTLY  >><<D1987>>18780200
<<THE IO COUNTERS TO THE RIGHT PROCESS. PREVIOUS EFFORTS     >><<D1987>>18780300
<<TRIED TO RESTORE BACK INTO THE DRQ THE PCBNUM THAT GOT     >><<D1987>>18780400
<<ZEROED OUT WHILE GOING THROUGH MEMORY MANAGEMENT. THIS     >><<D1987>>18780500
<<APPROACH DID NOT SEEM TO MAKE GOOD RESULT. THE APPROACH    >><<D1987>>18780600
<<THAT I'M TAKING IS TO REMOVE THIS PIECE OF CODE AND MOVE   >><<D1987>>18780700
<<IT TO P'ATTACHIO TO HANDLE NON-CACHE DISC IOS. FOR DISC    >><<D1987>>18780800
<<CACHE IOS, SINCE STARTOBJECTWRITE AND FETCHOBJECT ARE THE  >><<D1987>>18780900
<<ONLY TWO PLACES IN MEMORY MANAGEMENT THAT BUILD THE DRQ    >><<D1987>>18781000
<<ENTRY FOR A CACHE IO, I WILL BUMP THE IO COUNTERS FOR THE  >><<D1987>>18781100
<<DRQ AT THE TIME IT GETS BUILT - AT THAT TIME THE PCB STILL >><<D1987>>18781200
<<AROUND. H. NGUYEN                                          >><<D1987>>18781300
                                                               <<D1987>>18781400
$EDIT VOID = 18915000                                          <<D1987>>18785000
<<                                                           >><<*9889>>18934010
<< The following STORE'IOQ is used by the Measurement        >><<*9889>>18934020
<< Interface to keep track of all DRQ's.                     >><<*9889>>18934030
<<                                                           >><<*9889>>18934040
<< Previously, this was only done in RETURNDRQ, but Caching  >><<*9889>>18934050
<< sometimes multiply uses DRQ's which don't get stored.     >><<*9889>>18934060
<<                                                           >><<*9889>>18934070
      IF IOSTATSENBLD THEN STORE'IOQ(DRQ'ENTRY'INDEX,FALSE);   <<*9889>>18934080
   IF <> THEN << MI CAN RECOGNIZE THE DISC >>                  <<N2297>>19576000
   BEGIN                                                       <<N2297>>19577000
   END                                                         <<N2297>>19716000
   ELSE                                                        <<N2297>>19717000
      ASMB(DEL,DDEL); << MI CAN'T RECOGNIZE THE DISC >>        <<N2297>>19718000
   << check if valid device to AVR and if it is then >>        <<s9286>>19945000
   << wake up DEVREC to do the work.                 >>        <<s9286>>19950000
                                                               <<s9286>>19955000
   RECOGNIZE'DEVICE(LDEV, DEVREC'WAKE);                        <<s9286>>19960000
$EDIT VOID = 20015000                                          <<s9286>>19965000
   STATE := IF STATE = %16 THEN 0 ELSE 3;                      <<I9166>>20400000
$EDIT VOID = 20971685                                          <<s9286>>20971000
$PAGE "REQUEST STATUS FROM DISC DEVICES"                                20975000
                                                               <<s9286>>21291000
         IF X <> -1 THEN                                       <<C9352>>28160000
