          EJECT
*         CTEXT  CTP$DFT_OS_REQUESTS
*
*         THIS DECK CONTAINS PROCESSORS FOR OPERATING SYSTEM REQUESTS.
 FPI      SPACE  4,10
**        FPI - FETCH PROCESSOR INFORMATION.
*
*         ENTRY  (VE REQUEST+4) = CPU NUMBER OR 10 FOR FIRST ACTIVE CPU.
*
*         CALLS  FHE, LRP, *ERR*.


          ROUTINE FPI

          RJM    LRP         LOAD REQUEST POINTER
          ADN    1
          CRDL   W4
          LDD    W4          GET CP PARAMETER
          LPN    7           ISOLATE CPU NUMBER
          STD    CP
 FPI1     SHN    14
          ADN    PROCID
          RJM    FHE         FETCH HARDWARE INFORMATION
          MJP    ERR         IF NO MORE CPUS
          LDM    HBUF+CPRSTAT+PSCPOFF
          LPC    1001
          ZJP    FPIX        IF CPU IS ON
          LDD    W4
          LPN    10
          NJN    FPI2        IF LOOKING FOR FIRST ACTIVE CPU
          UJP    ERR         ELSE SPECIFIC CPU NOT FOUND

 FPI2     AOD    CP
          UJN    FPI1        CHECK NEXT CPU
 FHD      SPACE  4,10
**        FHD - FIND HARDWARE DATA.
*
*         CALLS  FHE, LRP, *ERR*.


          ROUTINE FHD        ENTRY/EXIT

          RJM    LRP         LOAD REQUEST POINTER
          CRDL   W0          FETCH REQUEST PARAMETERS
          LDDL   W1          FETCH REQUESTED HARDWARE INFORMATION
          LPC    0#FF        PEEL OFF THE KIND OF ELEMENT
          STD    W0
          LMDL   W1
          SHN    14-10       POSITION THE NUMBER OF THE ELEMENT
          ADD    W0
          RJM    FHE         FIND HARDWARE ELEMENT
          MJP    ERR         IF NOT FOUND
          LDML   HBUF        CALCULATE WORD COUNT OF DATA IN HBUF
          SHN    -6
          ADN    3
          SHN    -2
          STD    T2
          RJM    LRP         LOAD REQUEST POINTER
          ADN    1
          CWML   HBUF,T2     WRITE HBUF TO BUFFER
          LJM    FHDX        RETURN
 FCD      SPACE  4,10
**        FCD - LOAD CIP DATA TO MEMORY.
*
*         CALLS  LRP, PFC, SPB, *ERR*.


          ROUTINE FCD

          RJM    LRP
          CRDL   W4
          LDN    24B
          STML   RTP1        SAVE FUNCTION CODE
          ADC    0#1000
          STML   CALB        WRITE FLAG AND *2AP* FUNCTION CODE
          LDD    W6
          STM    CALB+3      R-UPPER
          LDD    W7
          STM    CALB+4      R-LOWER
          LDD    W5
          STM    CALB+5      A-OFFSET
          LRD    W6
          RJM    SPB         SET PP BOUNDARY
          RJM    LRP
          ADN    1
          CRDL   W4
          LDD    W4
          STM    CALB+1      UPPER 12 BITS OF NAME
          LDD    W5
          STM    CALB+2      LOWER 12 BITS OF NAME
          CALL   PFC         SAVE NEEDED INFO AND CALL *2AP* OVERLAY
          LDM    CALB
          ADM    CALB+1
          ADM    CALB+2
          ZJN    FCD1        IF REQUEST HAD NO ERROR(S)
          LDN    0           NO RETURN / DO NOT SET STATUS / NO OFFSET
          STML   RTP2
          CALL   PDE         PROCESS DISK ERROR

 FCD1     LDM    CALB+3      R-UPPER RETURNED
          STD    W5
          LDM    CALB+4      R-LOWER RETURNED
          STD    W6
          LDM    CALB+5      A-OFFSET RETURNED
          STD    W4
          LRD    JT+1
          RJM    SPB         SET PP BOUNDARY
          RJM    LRP
          ADN    2
          CWDL   W4          RETURN LWA+1 OF MEMORY AREA JUST WRITTEN
          LJM    FCDX        RETURN
 ADS      SPACE  4,10
**        ADS - ACCESS DEADSTART SECTOR.
*
*         CALLS  LRP, PFC, *ERR*.


          ROUTINE ADS

          RJM    LRP
          ADN    1
          CRDL   W0          GET PARAMETERS FOR *2AP*
          LDN    30B         FUNCTION FOR READ DEADSTART SECTOR
          STM    CALB
          LDD    W0          DEVICE TYPE
          SHN    6
          LMD    W1          DEVICE TYPE AND CHANNEL
          STM    CALB+1
          LDD    W2
          STM    CALB+2
          LDD    W3          GET WHETHER TO WRITE OR READ
          ZJP    ADS1        IF READ THE SECTOR
          LDC    130B        FUNCTION TO WRITE THE SECTOR
          STM    CALB
          RJM    LRP
          CRDL   W4          GET POINTER TO DATA
          LDC    500/4
          STD    W4
          LRD    W6          GET R-REGISTER
          LDML   TINB        *2AP* INPUT BUFFER
          STML   ADSA
          LDD    W5          GET A OFFSET
          ADC    RR
          CRML   **,W4       READ TO *2AP* BUFFER
 ADSA     EQU    *-1
          CALL   PFC         PRESERVE DATA AND CALL *2AP*
          LDM    CALB
          ADM    CALB+1
          ADM    CALB+2
          NJP    ERR         IF ERRORS ON CALL
          LJM    ADSX        RETURN

 ADS1     CALL   PFC         PRESERVE DATA AND CALL *2AP*
          LDM    CALB
          ADM    CALB+1
          ADM    CALB+2
          NJP    ERR         IF ERROR ON FUNCTION
          RJM    LRP
          CRDL   W4          GET POINTER FOR DATA PLACEMENT
          LDC    500/4       CM SIZE OF A SECTOR
          STD    W4
          LRD    W6
          RJM    SPB         SET PP BOUNDARY
          LDML   TOUB        *2AP* OUTPUT BUFFER WITH LINKAGE BYTES
          STML   ADSB
          LDD    W5
          ADC    RR
          CWML   **,W4       WRITE SECTOR TO MEMORY
 ADSB     EQU    *-1
          LJM    ADSX        RETURN
 GCS      SPACE  4,20
**        GCS - GET NIO CHANNEL STATUS.
*
*         ENTRY  (JT - JT+3) = DFT REQUEST POINTER IN R POINTER FORMAT.
*                DFT REQUEST FORMAT:
*                  WORD 0 = 8/RESPONSE.
*                           8/DFT FUNCTION.
*                           8/IOU NUMBER.
*                           8/CHANNEL NUMBER.
*                           32/0.
*                  WORD 1 = POINTER FOR CHANNEL STATUS, R POINTER
*                           FORMAT.
*
*         EXIT   CHANNEL STATUS DATA AVAILABLE AT R POINTER ADDRESS.
*                  60/0.
*                  1/CHANNEL ACTIVE.
*                  1/CHANNEL FULL.
*                  1/CHANNEL FLAG SET.
*                  1/CHANNEL ERROR FLAG SET.
*
*         USES   T1, W0 - W7.
*
*         CALLS  LRP, SPB.


          ROUTINE GCS

          LDN    2           READ REQUEST WORDS
          STD    T1
          RJM    LRP
          CRML   W0,T1
          LDD    W7          VERIFY R-POINTER LENGTH
          SBN    1
          MJP    ERR         IF R-POINTER LENGTH EQUALS 0
          LDD    W1          GET CHANNEL NUMBER
          LPC    377
          STD    T1
          RAM    GCSA        PLUG CHANNEL INSTRUCTIONS
          LDD    T1
          RAML   GCSB
          LDD    T1
          RAM    GCSC
          LDD    T1
          RAM    GCSD
          CFM    GCS10,0     IF CHANNEL ERROR FLAG NOT SET
 GCSA     EQU    *-2
          AOM    GCSE+3      SET CHANNEL ERROR FLAG BIT
 GCS10    FCJM   GCS20,0     IF CHANNEL FLAG NOT SET
 GCSB     EQU    *-2
          LDN    2           SET CHANNEL FLAG BIT
          RAM    GCSE+3
 GCS20    EJM    GCS30,0     IF CHANNEL EMPTY
 GCSC     EQU    *-2
          LDN    4           SET CHANNEL FULL BIT
          RAM    GCSE+3
 GCS30    IJM    GCS40,0     IF CHANNEL INACTIVE
 GCSD     EQU    *-2
          LDN    10          SET CHANNEL ACTIVE BIT
          RAM    GCSE+3

*         WRITE CHANNEL STATUS DATA.

 GCS40    LRD    W5          LOAD R REGISTER
          RJM    SPB         SET PP BOUNDARY
          LDDL   W4          OFFSET
          LMC    RR
          CWML   GCSE,ON     WRITE STATUS DATA
          LJM    GCSX        RETURN

 GCSE     BSSZ   4           CHANNEL STATUS BUFFER
 RWC      SPACE  4,10
**        RWC - READ/WRITE COMMON DISK AREA.
*
*         CALLS  LRP, PFC, SPB, *ERR*.


          ROUTINE RWC

          RJM    LRP
          ADN    1
          CRDL   W0          READ FUNCTION PARAMETERS
          RJM    LRP
          CRDL   W4          READ POINTER PARAMETER
          LDN    20B
          STM    CALB
          LDDL   W0          VALID FLAG
          SHN    12
          LMM    CALB
          STM    CALB
          LDD    W1          12/16 BIT FILE
          SHN    11
          LMM    CALB
          STM    CALB
          LDD    W2          READ ENTIRE PARTIAL PROGRAM
          SHN    10
          LMM    CALB
          STM    CALB
          LDD    W3          READ OR WRITE FLAG
          STD    T1
          SHN    6
          LMM    CALB
          STM    CALB
          RJM    LRP
          ADN    2
          CRDL   W0          READ SECOND PARAMETER WORD
          LDD    W0
          STM    CALB+1      UPPER 12 BITS OF NAME
          LDD    W1
          STM    CALB+2      LOWER 12 BITS OF NAME
          LDD    T1          WRITE BIT
          NJN    RWC1        IF WRITE TO BE PERFORMED
          CALL   PFC
          RJM    LRP
          ADN    2
          CRDL   W4          READ SPECIAL CASE FOR CEL
          LDD    W7
          NJP    RWC2        IGNORE VALID CHECK IF CEL SECTOR
          LDM    CALB+1
          SHN    21-12       GET V BIT
          MJP    RWC2        IF DATA IS VALID
          LJM    ERR         PROCESS ERROR

*         WRITE DATA TO CDA.

 RWC1     LDD    W2
          STM    CALB+3      SAVE PP WORD COUNT
          SHN    -2
          STD    W2          CM WORD COUNT FOR READ
          LRD    W6
          LDML   TOUB        *2AP* OUTPUT BUFFER OFFSET FOR LINKAGE BYTES
          STML   RWCA
          LDD    W5
          ADC    RR
          CRML   **,W2       READ IN DATA TO BE WRITTEN
 RWCA     EQU    *-1
          CALL   PFC
          LDM    CALB
          ADM    CALB+1
          ADM    CALB+2
          NJP    ERR         IF ERRORS ON FUNCTION CALL
          LJM    RWCX        RETURN

*         READ DATA FROM CDA.

 RWC2     LDM    CALB+1
          LPC    0#3FF       SAVE WORD COUNT
          SHN    -2          CM WORD COUNT
          STD    T5
          RJM    LRP
          CRDL   W4          RE ESTABLISH PARAMETERS
          LRD    W6          POINTER
          RJM    SPB         SET PP BOUNDARY
          LDML   TOUB        *2AP* OUTPUT BUFFER
          STML   RWCB
          LDD    W5
          ADC    RR
          CWML   **,T5       WRITE DATA TO CENTRAL MEMORY
 RWCB     EQU    *-1
          LJM    RWCX        RETURN
 UFC      SPACE  4,10
**        UFC - UPDATE FREE RUNNING COUNTER FOR OPERATING SYSTEM.
*
*         ENTRY  FREE RUNNING COUNTER PARAMETER IN REQUEST.
*
*         EXIT   FREE RUNNING COUNTER UPDATED.
*                DISK ENTRY FOR CLOCK MRT ENTRY UPDATED.
*
*         USES   *UCDA*, T1, T2.
*
*         CALLS  FHE, LRP, RCD, RPK, UPR, *ERR*, *UCD*.


          ROUTINE UFC

          RJM    RCD         READ CLOCK DESCRIPTOR INTO *2AP* INPUT BUFFER
          LDN    1           NUMBER OF PARAMETERS
          STD    T1
          RJM    LRP         GET PARAMETER POINTER
          CRML   UDTA,T1
          LDN    0
          STML   UDTA        ZERO OUT TASKID PORTION LEAVING ONLY *FRC* VALUE

*         MOVE VALUE TO *RDATA* THEN UNPACK IT AND WRITE REGISTER(S).

          LDN    3
          STD    T1
 UFC2     LDML   UDTA,T1
          STML   MRVAL,T1
          SOD    T1
          PJN    UFC2        IF MORE TO MOVE
          IF     DEF,HCM$
          RJM    HAC         HALT ALL CPUS
          ENDIF
          RJM    UPR         UNPACK REGISTER DATA WILL BE IN *RDATA*
          WRITMR RDATA,CMCC,MFRC  WRITE FREE RUNNING COUNTER REGISTER
          IF     DEF,HCM$
          LDN    0
          RJM    SAC
          ENDIF
          LDN    7
          STD    T2          *TOIP* OFFSET FOR *FRC* VALUE
          RJM    RPK         REPACKAGE INTO 12-BIT FORMAT
          LDN    1
          STM    UWCC        DONT WANT TO UPDATE WALL CLOCK CHIP
          CALL   UCD         UDATE CLOCK INFO
          LDN    0
          STM    UWCC        RESET FLAG
          LJM    UFCX        RETURN
 UDT      SPACE  4,10
**        UDT - UPDATE TIME FOR OPERATING SYSTEM.
*
*         CALLS  FHE, LRP, RCD, RPK, *ERR*, *UCD*.


          ROUTINE UDT

          LDML   TINB        *2AP* INPUT BUFFER
          STML   UDTB        PLUG BUFFER ADDRESSES
          STML   UDTC
          STML   UDTD
          RJM    RCD         READ CLOCK DESCRIPTOR INTO *2AP* INPUT BUFFER
          LDN    2           WORDS IN REQUEST
          STD    T1
          RJM    LRP
          CRML   UDTA,T1     READ PARAMETERS INTO *2AP* BUFFER
          LDM    HBUF+WCCHDR
          STM    **          OVERWRITE TASKID IN *2AP* BUFFER
 UDTB     EQU    *-1

*         REFORMAT 16 BIT DATA PER PP WORD TO 8 BIT DATA.

          LDN    1
          STD    T2          INDEX TO STORE TO
          LDN    1
          STD    T1          INDEX TO GET FROM
 UDT1     LDML   UDTA,T1
          SHN    -10
          STM    **,T2       STORE UPPER 8 BITS FIRST
 UDTC     EQU    *-1
          AOD    T2
          LDML   UDTA,T1     GET LOWER PART
          LPC    0#FF        LOWER 8 BITS
          STM    **,T2
 UDTD     EQU    *-1
          AOD    T2
          AOD    T1
          SBN    4
          MJN    UDT1        IF MORE TO MOVE

*         NEXT MOVE FREE RUNNING COUNTER.

          RJM    RPK         REPACKAGE FREE RUNNING COUNTER TO 12 FORMAT
          CALL   UCD         UPDATE CLOCK INFO

*         AT THIS POINT SET BIT 55 OF D7ST WORD OF EICB TO INDICATE
*         AN OPERATOR DATE TIME UPDATE HAS OCCURRED.

          LRD    IB+1
          RJM    SPB         SET OS BOUNDS
          LDN    D7ST
          RJM    IIB
          CRDL   CM          GET D7ST WORD
          LDDL   CM
          LPC    -0#80       CLEAR BIT 55
          LMC    0#80        SET DATE TIME UPDATE FLAG
          STDL   CM
          LDN    D7ST
          RJM    IIB
          RDSL   CM          READ AND SET LOCK ON FLAG BIT
          LJM    UDTX        RETURN

 UDTA     BSSZ   10          BUFFER FOR CYBER 170 DATE/TIME TRANSLATION
 RCD      SPACE  4,10
**        RCD - READ CLOCK DESCRIPTOR.  READS THE CLOCK DESCRIPTOR AND
*                MOVES IT INTO THE *2AP* INPUT BUFFER.
*
*         ENTRY  (TINB) = ADDRESS OF *2AP* INPUT BUFFER.
*
*         EXIT   (HBUF) = ((TINB)) = THE CLOCK DESCRIPTOR AS READ FROM
*                         THE *MRT*.
*
*         CALLS  ERR, FHE.
*
*         USES   T2.
*

 RCD      SUBR               ENTRY/EXIT
          LDML   TINB        SET ADDRESS OF *2AP* INPUT BUFFER
          STML   RCDA
          LDN    WCCID
          RJM    FHE         FETCH CLOCK DESCRIPTOR
          MJP    ERR         IF CLOCK DESCRIPTOR NOT FOUND
          LDML   HBUF
          SHN    -6
          STD    T2          CLOCK DESCRIPTOR LENGTH

*         MOVE CLOCK DESCRIPTOR TO *2AP* INPUT BUFFER.

 RCD1     LDML   HBUF,T2
          STML   **,T2       MOVE TO *2AP* BUFFER
 RCDA     EQU    *-1         ** INSTRUCTION MODIFICATION **
          SOD    T2
          NJN    RCD1        IF MORE TO MOVE
          UJN    RCDX        RETURN

 RPK      SPACE  4,10
**        RPK - REPACKAGE *FRC* INTO 12 BIT FORMAT.
*
*         ENTRY  *FRC* IN *UDTA* IS IN 16 BIT FORMAT.
*                (T2) = INDEX TO *2AP* BUFFER AREA.
*
*         EXIT   16 BIT FORMAT IS CONVERTED TO 5 12 BIT PP WORDS.
*                STORED IN *TOIP* (*2AP* BUFFER).
*
*         USES   T1, T2, T3, T4, *TOIP*.


 RPK      SUBR               ENTRY/EXIT
          LDML   TINB        *2AP* INPUT BUFFER
          STML   RPKA
          STML   RPKB
          STML   RPKC        PLUG BUFFER REFERENCES
          STML   RPKD
          STML   RPKE
          STML   RPKF
          STML   RPKG
          STML   RPKH
          STML   RPKI
          LDN    4
          STD    T1
          LDML   UDTA,T1     *FRC* PARCEL 1 NEEDS NO CONVERSION
          STM    **,T2
 RPKA     EQU    *-1
          AOD    T2
          AOD    T1
          LDML   UDTA,T1     GET 16 BIT SECOND PARCEL
          LPN    0#F
          STD    T3

          LDML   UDTA,T1
          SHN    -4
          STM    **,T2       SECOND WORD OF 12 BITS
 RPKB     EQU    *-1
          AOD    T2
          AOD    T1
          LDML   UDTA,T1
          LPC    0#FF
          STD    T4          SAVE FRACTION FOR NEXT WORD
          LDML   UDTA,T1
          SHN    -10
          STM    **,T2
 RPKC     EQU    *-1
          LDD    T3          GET PREVIOUS FRACTIONAL WORD
          SHN    10
          LMM    **,T2
 RPKD     EQU    *-1
          STM    **,T2       SAVE THIRD WORD OF 12 BITS
 RPKE     EQU    *-1
          AOD    T2
          AOD    T1
          LDML   UDTA,T1     GET 16 BIT PARCEL 4
          LPC    0#FFF
          STD    T3
          LDML   UDTA,T1
          SHN    -14
          STM    **,T2
 RPKF     EQU    *-1
          LDD    T4          GET PREVIOUS FRACTION
          SHN    4
          LMM    **,T2
 RPKG     EQU    *-1
          STM    **,T2       SAVE FOURTH WORD OF 12 BITS
 RPKH     EQU    *-1
          AOD    T2
          LDD    T3          GET LAST FRACTIONAL PART
          STM    **,T2       SAVE FIFTH WORD OF 12 BITS
 RPKI     EQU    *-1
          LJM    RPKX        RETURN
 THR      SPACE  4,10
**        THR - UPDATE THRESHOLD VALUES FOR ERRORS.
*
*         CALLS  FHE, IDA, LRP, SPB, *ERR*.


          ROUTINE THR

          LDN    VER4
          RJM    VCK         CHECK VERSION
          PJP    THRX        IF VERSION 4 OR GREATER EXIT
          LDN    0
          STD    T7          INDEX TO PARAMETER WORDS
 THR1     RJM    LRP         SET UP TO READ PARAMETERS
          ADD    T7          PARAMETER WORD (I)
          CRDL   W0          GET THRESHOLD PARAMETER WORD
          LDD    W1
          LPN    1           CHECK IF VALID
          ZJP    THRX        IF NOT VALID ENTRY MUST BE AT END
          LDDL   W2          GET ELEMENT TYPE AND INDEX
          SHN    -10
          STDL   T1          SAVE ELEMENT TYPE
          LDDL   W2
          LPC    0#FF        ISOLATE ELEMENT INDEX
          SHN    14          POSITION ELEMENT INDEX
          LMDL   T1
          RJM    FHE         FIND HARDWARE ELEMENT
          MJP    ERR         IF NON-EXISTENT
          STD    T6          SAVE FOUND ELEMENT ORDINAL
          ADM    NUMHW
          ADM    NBUF
          RJM    IDA
          CRDL   CM          READ IN PROPER THRESHOLD ENTRY
          LDD    W1
          SHN    -1          GET TO WHICH THRESHOLDS TO UPDATE
          ZJP    ERR         IF NONE - VALID ENTRY NOTHING TO DO
          SBN    1
          ZJN    THR2        IF UNCORRECTED UPDATE
          SBN    1
          ZJN    THR3        IF CORRECTED UPDATE

*         UPDATE BOTH CORRECTED AND UNCORRECTED THRESHOLDS.

          LDDL   W3
          STDL   CM          UPDATE CORRECTED/UNCORRECTED THRESHOLDS
          UJN    THR4        UPDATE DFT BLOCK

*         UPDATE UNCORRECTED THRESHOLD ONLY.

 THR2     LDDL   CM
          LPC    0#FF00      CLEAR OLD UNCORRECTED THRESHOLD
          STDL   CM
          LDDL   W3
          LPC    0#FF        TAKE JUST NEW UNCORRECTED THRESHOLD
          LMDL   CM
          STDL   CM          UPDATE UNCORRECTED
          UJN    THR4        UPDATE DFT BLOCK

*         UPDATE CORRECTED THRESHOLD ONLY.

 THR3     LDDL   CM
          LPC    0#FF        CLEAR OLD CORRECTED
          STDL   CM
          LDDL   W3
          LPC    0#FF00      TAKE JUST NEW CORRECTED THRESHOLD
          LMDL   CM
          STDL   CM
 THR4     LRD    DP+1
          RJM    SPB         SET OS BOUNDS
          LDD    T6
          ADM    NUMHW
          ADM    NBUF
          RJM    IDA
          CWDL   CM          RE WRITE NEW ERROR THRESHOLD
          AOD    T7
          LJM    THR1        LOOP FOR NEXT REQUEST IF ANY

*         END    CTP$DFT_OS_REQUESTS
