          IDENT  SDA,SDA
          PERIPH
          BASE   MIXED
          SST    OVLA,SSCP,RDS,EXR,LDS
          TITLE  DSP$SYSTEM DEADSTART ASSIST (SDA)
          SPACE  4
***       SDA    - INITIALIZE CYBER 180.
*
*         *SDA* PERFORMS DEADSTART INITIALIZATION OF
*         C180 STATE FROM THE C170 ENVIRONMENT BY
*         LOADING CPU REGISTERS AND PP DRIVERS.
*
*         CALL   - 24/*SDAP*,12/R,24/P
*
*  P      VFD    12/DEBUG,24/CR,24/RB
*
*         CR - ADDRESS OF CONFIGURATION RECORD.
*         RB - ADDRESS OF REQUEST BLOCK.
          SPACE  4
***       DAYFILE MESSAGES.
*
*         * SDA - ATTEMPT IDLE OF NOS PP.*
*         * SDA - BAD REQUEST BLOCK ADDRESS.*
*         * SDA - BUFFER OUTSIDE FL.*
*         * SDA - BUFFER TOO SMALL FOR HDT.*
*         * SDA - CIP CHANNEL IS DOWN.*
*         * SDA - FAILURE IN DFT FUNCTION.*
*         * SDA - ILLEGAL REQUEST.*
*         * SDA - ILLEGAL USER ACCESS.*
*         * SDA - NO BUFFER LENGTH SPECIFIED.*
*         * SDA - UNABLE TO LOAD SCI.*
*         * SDA - (603) CH17 PARITY ERROR.*
*         * SDA - (604) CH17 INTERLOCK ERR.*
*         * SDA - (605) CH17 ACTIVE.*
*         * SDA - (60C) PP LOAD ERROR.*
*         * SDA - (60F) CH17 INACTIVE.*


**        ROUTINES USED.


          PURGMAC SUBR,PAUSE,MONITOR,RJP
*IF ($string($name(wev$target_operating_system))='NOS')
 OPL     XTEXT     COMPMAC
*IFEND
*copy dsi$pp_macros
*copy dsi$maintenance_register_macros
*copy COMPIOU
*copy dsc$pp_mr_and_tpm_constants
*copy dsi$pp_instruction_mnemonics
*copy dsa$hardware_table_definitions
*copy dsa$ve_requests_to_dft
*copy ctc$ei_control_block
*copy cti$dft_analysis_codes
*copy ctc$dft_constants
 OPL     XTEXT     COMSDST
*IF ($string($name(wev$target_operating_system))='NOS')
 OPL     XTEXT     COMSMSC
 OPL     XTEXT     COMSCPS
 OPL     XTEXT     COMSSSD
*ELSE
 OPL     XTEXT     SSYS
*IFEND
 RICHI$   SET    0
*IF ($string($name(wev$target_operating_system))='NOSBE')
          SPACE  4,10
**        MACRO DEFINITIONS FOR NOS/BE

          PURGMAC MONITOR
 MONITOR  MACRO  FUNC
          LDK    FUNC
          RJM    R.MTR
          ENDM

          PURGMAC SUBR
          MACRO SUBR,A
A_X       LJM   *
A         EQU   *-1
          ENDM

          PURGMAC MACREF
 MACREF   MACRO   N
          QUAL    MACRO$
 N        SET     *
          QUAL    *
          ENDM
*IFEND
          SPACE  4
****      DIRECT LOCATION ASSIGNMENT.

*IF ($string($name(wev$target_operating_system))='NOSBE')
 T0       EQU    0           TEMPORARY STORAGE
 T1       EQU    1
 T2       EQU    2
 T3       EQU    3
 T4       EQU    4
 T5       EQU    5
 T6       EQU    6
 T7       EQU    7
 CM       EQU    D.T0        CM WORD BUFFER
 IR       EQU    D.PPIRB
 RA       EQU    D.RA
 FL       EQU    D.FL
 ON       EQU    D.PPONE
 CP       EQU    D.CPAD
*IFEND
 W0       EQU    20          WORKING STORAGE
 W1       EQU    21
 W2       EQU    22
 W3       EQU    23
 W4       EQU    24
 W5       EQU    25
 W6       EQU    26
 RN       EQU    27          MAINTENANCE REGISTER NUMBER
 EC       EQU    30          ELEMENT CONNECT CODE
 TW       EQU    31          CONTAINS CONSTANT 2
 IB       EQU    32 - 34     EI BUFFER POINTER
 HP       EQU    35 - 36     HARDWARE BUFFER POINTER
 SV       EQU    37 - 40     OS R-REGISTER VALUE
 VP       EQU    41 - 45     VE POINTER TO *DFT*
*IF ($string($name(wev$target_operating_system))='NOSBE')
          SPACE  4
**        NOS/BE SYSTEM EQUIVALENTS.

 ABTM     EQU    M.ABORT
 DFM      EQU    R.DFM
 DPPM     EQU    M.DPP
 DSBP     EQU    P.EICB
 HNGM     EQU    M.KILL
 PPFW     EQU    C.PPFWA
 PPR      EQU    R.IDLE
*IFEND
          SPACE  4
**        CHANNEL AND PP TYPE DEFINITIONS.
*


 CH       EQU    13B         COMMUNICATION CHANNEL
 RR       EQU    400000B     R REGISTER ACTIVATOR
 EICBP    EQU    EIBP        EI BUFFER POINTER
          TITLE  *SDA* MAIN PROGRAM
          ORG    PPFW
 SDA      RJM    PRS         CALL INITIALIZER

          LDM    SDAA,IR+2   REQUEST PROCESSOR ADDRESS
          STD    T1
          LJM    0,T1        PROCESS REQUEST


**        REQUEST PROCESSORS JUMP TABLE.


 SDAA     BSS    0
          LOC    0
          CON    ILL         ILLEGAL REQUEST
          CON    LPB         LOAD *SCI* TO DEADSTART NOS/VE
          CON    MRR         MAINTENANCE REGISTER REQUEST
          CON    ILL
          CON    ILL
          CON    IPP         IDLE PP
          CON    DAC         DEACTIVATE CHANNEL
          CON    MDR         MAKE *DFT* REQUEST
          CON    ILL
          CON    FHD         FETCH HARDWARE DESCRIPTOR
          CON    CVP         CLEAR NOS/VE *DFT* BUFFER POINTER
          CON    WDR         WRITE *DFT* REQUEST BLOCK
          CON    FVE         FETCH VE ENABLED STATUS
 MAXRQ    EQU    *
          LOC    *O
 BLOCK    SPACE  4,10
**        BLOCK - *SDA* REQUEST BLOCK CONTENTS.  THIS IS THE GENERAL FORMAT OF
*                *SDA* REQUESTS.  REQUESTS ARE 2 CM WORDS LONG AND HAVE TWO
*                BASIC FORMATS.  FORMAT ONE CONSISTS OF THE FIRST 5 PP WORDS
*                AND FORMAT 2 CONSISTS OF BOTH CM WORDS.  THE ONLY FIELDS
*                USED IN THE FIRST 5 WORDS FOR REQUESTS IN FORMAT 2 ARE THE
*                *SIZE* AND *COMPLT* FIELDS.  FORMAT 2 IS ONLY USED FOR THE
*                *WDR* REQUEST.
*


 BLOCK    BSS    0

 MRPORT   CON    0           MAINTENANCE REGISTER PORT
 PPCHNM   CON    0           4/PP TYPE(0=NIO,1=CIO),8/PP NUMBER
 SIZE     CON    0,0         PROGRAM TO LOAD FROM CIP DEVICE
 COMPLT   CON    0           COMPLETE BIT

 VBUF     CON    0,0,0       VE BUFFER POINTER
 BUFP     CON    0,0         MR BUFFER POINTER
 MRDATA   SPACE  4,10
**        MRDATA - MAINTENANCE REGISTER BUFFER.
*


 MRDATA   BSS    10
 MRREGN   CON    0
 MRSTAT   CON    0

 RDATA    EQU    MRDATA
          SPACE  4
**        GLOBAL SYMBOLS.
*


 I0CC     CON    0           IOU PORT CODE
 IOUM     CON    0           IOU MODEL NUMBER
 ISPB     CON    0           FLAG TO INDICATE WHETHER TO IGNORE OS BOUNDS
 PPNO     CON    0           *SDA* PP NUMBER

*         FOLLOWING IS NEEDED FOR GETTING HARDWARE ELEMENT ROUTINES.

          BSSZ   3
 HBUF     BSSZ   CMXLEN

 CIPCH    CON    0           CIP CHANNEL
          SPACE  4,10
**        MAINTENANCE REGISTER COMMON DECK.
*


*copy dsi$maintenance_register_access
          EJECT
**        DROP PP.
*
*         EXIT   TO *PPR*.
*
*         USES   W0.
*
*         CALLS  LDA, SPB.
*
*         MACROS MONITOR.


 DPP      LRD    SV          RESTORE OS R-REGISTER
          RJM    SPB         SET PP BOUNDARY
          LDN    1
          STM    COMPLT
          LDN    IR+3
          RJM    LDA
          CWM    BLOCK,ON    UPDATE STATUS
          MONITOR DPPM       DROP PP

*         CLEAR PP MEMORY AFTER RESIDENT.

 DPP1     LDC    DPPE
          STD    W0
 DPP3     BSS    0
          LDN    0
          STI    W0
          AOD    W0
          LMC    7775B       CLEAR TO END OF MEMORY
          NJN    DPP3
          LJM    PPR         JUMP TO IDLE LOOP
 DPPE     BSS    0
 IFM      SPACE  4,10
**        IFM - ISSUE FATAL MESSAGE AND HANG.
*
*         ENTRY  (A) = ANALYSIS CODE.
*
*         EXIT   NO EXIT.
*
*         USES   T2.
*
*         CALLS  DFM.


 IFM      BSS    0
          STM    IFMA        SAVE ANALYSIS CODE

*         SEARCH FOR ANALYSIS CODE.

          LDN    0
          STD    T2
          UJN    IFM2        CHECK FIRST ENTRY

 IFM1     LDN    2
          RAD    T2
 IFM2     LDM    IFMB,T2
          ZJN    IFM3        IF ANALYSIS CODE IS NOT IN TABLE
          LMM    IFMA
          NJN    IFM1        IF ANALYSIS CODE IS NOT IN TABLE

          LDM    IFMB+1,T2   ISSUE DAYFILE MESSAGE
          LRD    SV          RESTORE R-REGISTER
          RJM    DFM

 IFM3     LDM    IFMA
          UJN    *           HANG

 IFMA     BSSZ   1           ANALYSIS CODE

*         TABLE OF ANALYSIS CODES FOR WHICH A MESSAGE IS TO BE WRITTEN.

 PGACE    MICRO  1,,* SDA - *  PREFIX FOR GACE MICRO
 SGACE    MICRO  1,,*.*      SUFFIX FOR GACE MICRO

 IFMB     GACE   DAMP,DMMP,D * SDA - (603) CH17 PARITY ERROR.*
          GACE   DAMI,DMMI,D * SDA - (604) CH17 INTERLOCK ERR.*
          GACE   DAMA,DMMA,D * SDA - (605) CH17 ACTIVE.*
          GACE   DACI,DMCI,D * SDA - (60F) CH17 INACTIVE.*
          CON    0           END OF TABLE

 GACEM    HERE


 ILL      LDC    =C* SDA - ILLEGAL REQUEST.*

 FTL      LRD    SV          RESTORE R-REGISTER
          RJM    DFM
          MONITOR ABTM       ABORT CONTROL POINT
          LJM    DPP1
          TITLE  CVP - CLEAR NOS/VE *DFT* BUFFER POINTER
**        CLEAR NOS/VE DFT BUFFER POINTER IN *DFT* BLOCK.
*
*         EXIT   NOS/VE DFT POINTER CLEARED IN *DFT* BLOCK.
*
*         USES   VP - VP+3, W0 - W3.
*
*         CALLS  IIB.


 CVP      BSS    0
          LDN    DSDFT       FETCH *DFT* POINTER
          RJM    IIB
          CRDL   W0
          LDDL   W0+3        LENGTH OF *DFT* BLOCK
          ZJN    CVP5        IF *DFT* BLOCK NOT DEFINED
          LRD    W0+1        FETCH NVE POINTER FROM *DFT* BLOCK
          LDC    RR+NVEP
          ADD    W0
          CRDL   VP
          LDDL   VP+3        LENGTH OF NOS/VE BUFFER
          ZJN    CVP5        IF NOS/VE BUFFER NOT DEFINED
          LDN    0
          STDL   VP+3        ZERO LENGTH OF NOS/VE BUFFER
          LDC    RR+NVEP     UPDATE NOS/VE BUFFER POINTER
          ADD    W0
          CWDL   VP
 CVP5     LJM    DPP         DROP PP AND EXIT
          TITLE  DAC - DEACTIVATE CHANNEL
***       DAC - DEACTIVATE CHANNEL.
*
*         ENTRY  PPCHNM  = CHANNEL NUMBER.
*
*         EXIT   CHANNEL INACTIVE.


 DAC      BSS    0
          LDM    PPCHNM
          RAM    DACA        SET CHANNEL NUMBER
 DACA     DCN    40
          LJM    DPP         EXIT
          TITLE  FHD - FETCH HARDWARE DESCRIPTOR
***       FHD - FETCH HARDWARE DESCRIPTOR.
*
*         ENTRY  (BUFP - BUFP+1) = BUFFER FOR HARDWARE TABLE.
*
*         EXIT   TO *FTL* IF BUFFER TOO SMALL FOR HDT.
*                CIP HARDWARE TABLE COPIED TO (BUFP - BUFP+1).
*
*         USES   T2, T3, T4.
*
*         CALLS  /DSIGHE/RHT, GNE, LDA, VBA.


 FHD      BSS    0
          RJM    VBA         VERIFY BUFFER ADDRESS

          LDN    0
          STD    T4
          RJM    /DSIGHE/RHT RESET HARDWARE TABLE

 FHD1     RJM    GNE         GET NEXT HARDWARE ELEMENT

          LDM    HBUF        SAVE DESCRIPTOR LENGTH (BYTES)
          SHN    -6
          STD    T2
          LDN    0
          STD    T3
 FHD2     AOD    T3          FIND MULTIPLE OF 5 LARGER THAN DESCRIPTOR LENGTH
          SHN    2
          ADD    T3
          SBD    T2
          MJN    FHD2        IF NOT LARGE ENOUGH

          LDD    T2
          ZJN    FHD3        IF LAST ENTRY
          LDM    HBUF        STORE WORD COUNT INTO ENTRY HEADER
          LPN    77
          STM    HBUF
          LDD    T3
          SHN    6
          RAM    HBUF

 FHD3     LDD    T3
          ADD    T4
          SBM    SIZE+1
          PJN    FHD4        IF TOO LARGE FOR THE BUFFER

          LDC    BUFP        WRITE THIS ENTRY TO BUFFER IN CM
          RJM    LDA
          ADD    T4
          CWM    HBUF,T3

          LDD    T3          INCREMENT INDEX
          RAD    T4
          LDD    T2
          NJP    FHD1        IF MORE TO COPY
          LJM    DPP

 FHD4     LDC    =C* SDA - BUFFER TOO SMALL FOR HDT.*
          LJM    FTL         ABORT *SDA*
          TITLE  FVE - FETCH VE ENABLED STATUS.
***       FVE - FETCH VE ENABLED STATUS.
*
*         ENTRY  (BUFP - BUFP+1) = BUFFER REPLY.
*
*         EXIT   TO *FTL* IF BUFFER TOO SMALL FOR RESULT.
*                (BUFFER) = 12/ E, 48/0.
*                WHERE E = 1, IF VE ENABLED PER *NOS* *SSTL*.
*                             (ALWAYS 1 FOR NOS/BE).
*
*         USES   T2, T3, T4.
*
*         CALLS  LDA, VBA.


 FVE      BSS    0
          RJM    VBA         VERIFY BUFFER ADDRESS

*IF ($string($name(wev$target_operating_system)) = 'NOS')
          LDN    SSTL
          CRD    T0
          LDD    T3
          SHN    21-13
          PJN    FVE1        IF VE ENABLED AT DEADSTART
          LDN    0           SET NOT ENABLED STATUS
          STM    FVEA
*IFEND
 FVE1     LDC    BUFP        WRITE RESULT TO BUFFER IN CM
          RJM    LDA
          CWM    FVEA,ON
          LJM    DPP

 FVEA     VFD    12/1,48/0   VE ENABLED RESULT
 IPP      TITLE  IPP - IDLE PP
***       IPP - IDLE PP.
*
*         ENTRY  (PPCHNM) = PP NUMBER.
*
*         EXIT   PP IS IN HARDWARE IDLE STATE.
*
*         CALLS  IVP.


 IPP      BSS    0
          RJM    IVP         IDLE NOS/VE PP
          LJM    DPP         EXIT
          TITLE  LPB - LOAD PP BOOT
***       LPB - LOAD SYSTEM CONSOLE INTERFACE (*SCI*) TO INITIALIZE FOR
*                DEADSTARTING NOS/VE.
*
*         ENTRY  (CIPCH) = CIP CHANNEL NUMBER.
*                (PPCHNM) = PP NUMBER FOR PP BOOT.
*
*         EXIT   NORMAL EXIT IS TO *DPP* IF *SCI* LOADED AND COMPLETED ITS PRESET.
*                ERROR EXIT IS TO *FTL*.
*
*         USES   CM - CM+3.
*
*         CALLS  CSD, DCC, GSI, GVP, IIB, IVP, LPI, RCC, SPB, SNO, WSF.
*
*         MACROS FINDCM.


 LPB      BSS    0
          RJM    RCC         RESERVE CIP CHANNEL

*         THE FOLLOWING CODE CLEARS THE UPPER 4 BITS OF THE *DFT*
*         POINTER IN THE *EICB*.  SOME OF THESE BITS MAY BE SET
*         ON SOME TYPES OF MAINFRAMES.

          LRD    IB+1
          RJM    SPB         SET PP BOUNDARY
          LDN    DSDFT       GET *DFT* POINTER
          RJM    IIB
          CRDL   W0
          LDD    W0          CLEAR UPPER 4 BITS
          STD    W0
          LDN    DSDFT       REWRITE *DFT* POINTER
          RJM    IIB
          CWDL   W0

          RJM    GVP         SET VE REQUEST POINTER TO *DFT*
          RJM    CSD         CLEAR *SCI* DEADSTART STATUS IN *D8ST*

*         CHECK IF *SCI* IS RUNNING BY LOOKING FOR A PP NUMBER IN THE
*         PARAMETER TABLE.  MUST ALSO CHECK FOR *SCD* ACTIVE BIT SET
*         FOR THE CASE OF AN OLDER VERSION OF NOS RUNNING NOS/*SCD*.
*         IN THAT CASE THERE WOULD BE NO PP NUMBER IN THE PARAMETER
*         TABLE.

          RJM    GSI         GET *SCI* PARAMETER TABLE INTERLOCK
          NJN    LPB3        IF TABLE NOT DEFINED
          LDDL   CM+1        CHECK IF *SCI* LOADED
          SHN    -4
          LPN    77
          NJN    LPB4        IF *SCI* RUNNING
          LDDL   CM+2        CHECK *SCD* ACTIVE BIT
          LPC    4000
          NJN    LPB4        IF *SCD* ACTIVE
          LDM    PPCHNM      SET PP NUMBER IN *SCI* PARAMETER BLOCK
          SHN    4
          RADL   CM+1
          RJM    WSF         WRITE *SCI* PARAMETER TABLE FIRST WORD

*         LOAD *SCI*.

 LPB3     LDN    1
          RJM    SNO         SET NOS/VE OWNS THE *SCI* PP
          RJM    IVP         IDLE THE *SCI* PP
          FINDCM SCI         FIND *SCI* IN EI BUFFER SPACE
          ZJP    LPB20       IF *SCI* NOT FOUND
          ADN    1
          RJM    LPI         LOAD PP IMAGE
          NJP    LPB21       IF PP LOAD ERROR
          UJN    LPB5        SET DEADSTART FLAG

*         *SCI* IS ALREADY LOADED.

 LPB4     RJM    WSF         CLEAR *SCI* PARAMETER TABLE INTERLOCK
          LDN    0
          RJM    SNO         SET NOS/VE DOES NOT OWN THE *SCI* PP

*         SET FLAG TO INDICATE THAT *SCI* SHOULD DEADSTART NOS/VE.

 LPB5     LRD    IB+1
          RJM    SPB         SET PP BOUNDARY
          LDN    D8ST
          RJM    IIB
          CRDL   CM - CM+3   *D8ST* WORD FROM EICB.
          LDDL   CM+3
          SCN    1
          LMN    1           SET DEADSTART NOS/VE FLAG
          STDL   CM+3
          LDN    D8ST        UPDATE *D8ST* WORD IN EICB
          RJM    IIB
          CWDL   CM

 LPB10    LDN    D8DS        CHECK IF PP BOOT FINISHED WITH CHANNEL
          RJM    IIB
          CRDL   CM
          LDD    CM+1
          NJN    LPB10       WAIT FOR *SCI* PRESET COMPLETE
          RJM    DCC         DROP CIP CHANNEL

*         WAIT FOR *SCI* TO CLEAR *VE* DEADSTART FLAG.

 LPB15    LDN    D8ST        WAIT FOR *SCI* TO CLEAR *VE* DEADSTART FLAG
          RJM    IIB
          CRDL   CM          *D8ST* WORD FROM EICB
          LDDL   CM+3
          LPN    1           DEADSTART *VE* FLAG
          NJN    LPB15       IF DEADSTART *VE* FLAG NOT CLEARED
          LJM    DPP         EXIT

 LPB20    RJM    DCC         DROP CIP CHANNEL
          LDC    =C* SDA - UNABLE TO LOAD SCI.*
          UJN    LPB22       ABORT THE CONTROL POINT

 LPB21    RJM    IVP         IDLE THE *SCI* PP
          LDM    CIPCH       MAKE CIP CHANNEL INACTIVE
          LMC    DCNI+40
          STM    LPBA
          DCN    40
 LPBA     EQU    *-1
          RJM    DCC         DROP CIP CHANNEL
          LDC    =C* SDA - _"DMLE".*  * SDA - (60C) PP LOAD ERROR.*
 LPB22    LJM    FTL         ABORT THE CONTROL POINT
          TITLE  MDR - MAKE DFT REQUEST
***       MDR - MAKE *DFT* REQUEST.
*
*         ENTRY  (VBUF - VBUF+2) = ADDRESS OF REQUEST.
*
*         EXIT   TO *DPP* WHEN *DFT* HAS HONORED THE REQUEST.
*
*         USES   NONE.
*
*         CALLS  GVP, IDR, RCC.

 MDR      RJM    RCC         REQUEST CIP CHANNEL

          RJM    GVP         GET VE REQUEST POINTER
          LDN    1           SET *DFT* REQUEST BLOCK LENGTH
          RJM    IDR         ISSUE *DFT* REQUEST
          LJM    DPP         RETURN
          TITLE  MRR - READ MAINTENANCE REGISTER
***       MRR - READ MAINTENANCE REGISTER.
*
*         READ MAINTENANCE REGISTERS AS PER REQUEST.
*
*         ENTRY  (MRPORT) = MAINTENANCE REGISTER PORT ACCESS CODE.
*                (MRREGN) = MAINTENANCE REGISTER TO READ.
*
*         EXIT   (MRDATA - MRDATA+10) = DATA READ.
*
*         BLOCK FORMAT
*         12/RB0, 12/RB1, 12/RB2, 12/RB3, 12/RB4,
*         12/RB5, 12/RB6, 12/RB7, 12/RN , 12/ST ,
*
*         CALLS  LDA, VBA.
*
*         MACROS READMR.


 MRR      BSS    0
          RJM    VBA         VERIFY BUFFER ADDRESS
          LDC    BUFP
          RJM    LDA
          CRM    MRDATA,TW   READ REGISTER BLOCK
          LDM    MRREGN
          STD    RN          SET REGISTER NUMBER
          READMR MRDATA,MRPORT
          LDC    BUFP
          RJM    LDA
          CWM    MRDATA,TW   REWRITE REGISTER BLOCK
          LJM    DPP         DROP PP TO COMPLETE REQUEST
          TITLE  WDR - WRITE DFT REQUEST BLOCK
***       WDR - WRITE *DFT* REQUEST BLOCK.
*
*         ENTRY  (BLOCK - BLOCK+9) = *SDA* REQUEST IN FOLLOWING FORMAT:
*                (SIZE + 1) = LENGTH OF *DFT* REQUEST BLOCK.
*                (VBUF - VBUF+2) = ADDRESS (R POINTER) FOR *DFT* REQUEST.
*                (BUFP - BUFP+1) = OFFSET FROM CONTROL POINT RA OF *DFT*
*                                  REQUEST.
*
*         EXIT   FIRST WORD OF *DFT* REQUEST WRITTEN BACK TO CALLER WITH
*                     *DFT* STATUS SET.
*                TO *FTL* IF *DFT* REQUEST BLOCK LENGTH > 2.
*                TO *DPP* WHEN *DFT* HAS RESPONDED TO REQUEST.
*
*         USES   CM, CM+1, W6.
*
*         CALLS  GVP, IDR, LDA, RCC, VBA.


 WDR      BSS    0
          LDM    SIZE+1      CHECK *DFT* BLOCK SIZE
          STD    W6          SAVE *DFT* BLOCK SIZE
          ZJN    WDR5        IF *DFT* REQUEST LENGTH OF ZERO
          SBN    2+1
          MJN    WDR10       IF *DFT* REQUEST BLOCK NOT TOO BIG
 WDR5     BSS    0
          LDC    =C* SDA - BAD REQUEST BLOCK ADDRESS.*
          LJM    FTL         ISSUE MESSAGE AND DROP PP

 WDR10    RJM    VBA         VERIFY BUFFER ADDRESS

*         FETCH *DFT* REQUEST BLOCK.

          LDC    BUFP        FORM ADDRESS
          RJM    LDA
          CRML   WDRA,W6     READ *DFT* REQUEST BLOCK

*         SET UPPER 4 BITS OF EACH WORD READ TO ZERO.

          LDM    WDRA
          STML   WDRA
          LDM    WDRA+4
          STML   WDRA+4

*         WRITE *DFT* REQUEST BLOCK TO AREA SPECIFIED BY CALLER.  IF
*         THIS IS BELOW THE OS BOUNDS REGISTER, IT WILL GET AN IOU BOUNDS
*         FAULT.  IT COUNTS ON THE CALL TO *GVP* TO SET THIS PP ON
*         UPPER SIDE OF BOUNDS REGISTER TO WRITE VE REQUEST INTO THE *SSR*.

          RJM    RCC         REQUEST CIP CHANNEL
          RJM    GVP         GET NOS/VE REQUEST POINTER
          LDM    VBUF+1
          STD    CM
          LDM    VBUF+2
          STD    CM+1
          LDM    VBUF        CREATE ADDRESS
          LMC    RR
          LRD    CM
          CWML   WDRA,W6
          LDD    W6          REQUEST BLOCK LENGTH
          RJM    IDR         ISSUE *DFT* REQUEST.

*         MOVE THE FIRST WORD OF THE *DFT* REQUEST WITH *DFT* RESPONSE
*         BACK TO THE CALLER SO THAT THE RESPONSE CAN BE CHECKED.
*         EXPECT THE CLEARING OF THE *CIP* CHANNEL RESERVE TO SET THIS
*         PP BELOW THE OS BOUNDS REGISTER.

          LDC    BUFP        FORM ADDRESS
          RJM    LDA
          CWDL   W0          WRITE *DFT* REQUEST WORD WITH RESPONSE
          LJM    DPP         RETURN

 WDRA     BSS    10          *DFT* REQUEST BUFFER
          TITLE  COMMON SUBROUTINES
 CSD      SPACE  4,10
**        CSD - CLEAR *SCI* DEADSTART STATUS.
*
*         EXIT   *SCI* DEADSTART STATUS IN *D8ST* IS CLEAR.
*
*         USES   CM - CM+3.
*
*         CALLS  IIB, SPB.


 CSD      SUBR               ENTRY/EXIT
          LDN    D8ST
          RJM    IIB
          CRDL   CM
          LDDL   CM+3        CLEAR STATUS
          LPC    174077
          STDL   CM+3
          RJM    SPB
          LDN    D8ST        REWRITE *D8ST*
          RJM    IIB
          CWDL   CM
          UJN    CSDX        RETURN
 DCC      SPACE  4,15
**        DCC - DROP CIP CHANNEL.
*
*         ENTRY  (CIPCH) = CIP CHANNEL NUMBER
*
*         EXIT   CHANNEL IS RELEASED.
*                D8DS WORD OF EICB IS CLEARED.
*
*         USES   CM - CM+3.
*
*         CALLS  IIB, SPB.
*
*         MACROS DCHAN.


 DCC      SUBR               ENTRY/EXIT

          LRD    SV
          RJM    SPB         SET PP BOUNDARY TO 170 SIDE

          LDM    CIPCH       RELEASE THE CHANNEL
*IF ($string($name(wev$target_operating_system))='NOSBE')
          RJM    R.DCH
*ELSE
          DCHAN
*IFEND
          SRD    SV

          LDN    D8DS        CLEAR FLAG IN WORD *D8DS*
          RJM    IIB
          CRDL   CM
          LDN    0
          STD    CM+1
          LDN    D8DS
          RJM    IIB
          CWDL   CM
          UJN    DCCX        RETURN
 GSI      SPACE  4,10
**        GSI - GET *SCI* PARAMETER TABLE INTERLOCK.
*
*         EXIT   (A) <> 0 IF PARAMETER TABLE NOT DEFINED.
*                (W6) = OFFSET.
*                (W4 - W5) = R-REGISTER.
*                (CM - CM+3) = FIRST WORD OF PARAMETER TABLE WITH
*                              INTERLOCK CLEARED.
*
*         USES   CM - CM+3, W0 - W0+3.
*
*         CALLS  IIB, SPB, STA.


 GSI10    LDN    1           INDICATE TABLE NOT DEFINED

 GSI      SUBR               ENTRY/EXIT
          LDN    D7RS+2      NOS *SCI* PARAMETER TABLE ADDRESS
          RJM    IIB
          CRDL   W0
          LDDL   W0+2
          ADDL   W0+3
          ZJN    GSI10       IF TABLE NOT DEFINED
          RJM    STA         CREATE R-REGISTER ADDRESS
          RJM    SPB         SET PP BOUNDARY
 GSI5     LDN    0
          STD    CM
          STD    CM+2
          STD    CM+3
          LDC    10000       INTERLOCK BIT
          STDL   CM+1
          LDD    W6
          LMC    RR
          RDSL   CM          SET INTERLOCK
          LDDL   CM+1
          LPC    10000
          NJN    GSI5        IF INTERLOCK ALREADY SET
          UJN    GSIX        RETURN

 IDR      SPACE  4,10
**        IDR - ISSUE *DFT* REQUEST.
*
*         ENTRY  (A) = LENGTH OF *DFT* REQUEST.
*                (VBUF - VBUF+2) = R POINTER TO DFT REQUEST, NO LENGTH.
*                CIP CHANNEL RESERVED.
*
*         EXIT   (W0 - W0+3) = FIRST WORD OF *DFT* REQUEST WITH RESPONSE CODE.
*                DFT RESPONDED TO REQUEST.
*                CIP CHANNEL RESERVE CLEARED.
*
*         USES   CM - CM+3, W0 - W0+3.
*
*         CALLS  IVB, DCC.

 IDR      SUBR               ENTRY/EXIT

*         CREATE R POINTER TO *DFT* REQUEST.

          STD    CM+3        SET LENGTH OF *DFT* REQUEST
          LDM    VBUF
          STD    CM
          LDM    VBUF+1
          STD    CM+1
          LDM    VBUF+2
          STD    CM+2

          LDN    1           USE WORD 1 OF THE NOS/VE *DFT* REQUEST BUFFER
          RJM    IVB
          CWDL   CM          ISSUE REQUEST TO *DFT*

 IDR5     LDD    CM          LOOP UNTIL REQUEST COMPLETED
          ADC    RR
          LRD    CM+1
          CRDL   W0
          LDDL   W0
          SHN    -10
          ZJN    IDR5        IF REQUEST NOT YET COMPLETE

          RJM    DCC         DROP CIP CHANNEL
          UJN    IDRX        RETURN
 IVB      SPACE  4,10
**        IVB - INCREMENT *DFT* NOS/VE BLOCK.
*
*         ENTRY  (A) = OFFSET FROM *DFT* VE BLOCK.
*
*         EXIT   (A - R-REGISTER) = ADDRESS OF DESIRED WORD.


 IVB      SUBR               ENTRY/EXIT
          ADD    VP
          LMC    RR
          LRD    VP+1
          UJN    IVBX        RETURN
 IVP      SPACE  4,15
**        IVP - IDLE VE PP.
*
*         ENTRY  (PPCHNM) = PP NUMBER.
*
*         EXIT   (A) = 0, IF PP SUCCESSFULLY IDLED.
*
*         USES   RN.
*
*         CALLS  CPB, IDP, SCF.
*
*         MACROS READMR.


 IVP      SUBR               ENTRY/EXIT
          LDN    IOSB
          STD    RN
          LDM    PPCHNM
          LPC    0#100       CLEAR ALL BUT CONCURRENT BIT
          ZJN    IVP0        IF NOT CONCURRENT
          LDN    4
          RAD    RN
 IVP0     READMR RDATA,I0CC
          LDM    PPCHNM
          RJM    CPB         CHECK PP BIT IN HARDWARE REGISTER
          ZJN    IVP1        IF ASSIGNED TO NOS/VE
          LDC    =C* SDA - ATTEMPT IDLE OF NOS PP.*
          LJM    FTL

 IVP1     LDN    15
          RJM    SCF         SET CHANNEL FLAG
          LDM    PPCHNM
          RJM    IDP         IDLE PP
          CCF    *,15
          LJM    IVPX        RETURN
 GVP      SPACE  4,10
**        GVP - GET VE REQUEST POINTER.
*
*         ENTRY  PIB HAS BEEN CALLED.
*
*         EXIT   (VP - VP+3) = VE BUFFER POINTER.
*                OS BOUNDS REGISTER SET FOR WRITE TO VE BUFFER.
*
*         USES   W0 - W3.
*
*         CALLS  IIB, SPB.


 GVP1     LRD    VP+1
          RJM    SPB         SET PP BOUNDARY

 GVP      SUBR               ENTRY/EXIT
          LDN    DSDFT       FETCH *DFT* POINTER
          RJM    IIB
          CRDL   W0
          LRD    W0+1        FETCH NVE POINTER FROM *DFT* BLOCK
          LDC    RR+NVEP
          ADD    W0
          CRDL   VP
          LDDL   VP+3        LENGTH OF NOS/VE BUFFER
          NJN    GVP1        IF NOS/VE BUFFER DEFINED
          LRD    IB+1        BUILD TEMPORARY POINTER INTO EICB
          SRD    VP+1
          LDD    IB
          ADN    D8SV+2
          STD    VP
          LDN    1
          STD    VP+3
          LDC    RR+NVEP
          LRD    W0+1
          ADD    W0
          CWDL   VP
          UJP    GVP1        RETURN
 LDA      SPACE  4,10
**        LDA - LOAD ADDRESS.
*
*         ENTRY  (A) = POINTER TO ADDRESS.
*
*         EXIT   (A) = READY FOR CM INSTRUCTION.


 LDA      SUBR               ENTRY/EXIT
          STD    T1
          LRD    SV          LOAD PROPER R-REGISTER
          LDI    T1          CREATE ABSOLUTE ADDRESS
          LPN    37
          SHN    6
          ADD    RA
          SHN    6
          ADM    1,T1
          UJN    LDAX        RETURN
 LPI      SPACE  4,15
**        LPI - LOAD PP IMAGE FROM CM.  THIS SUBROUTINE IS SPECIFICALLY
*                TAILORED TO LOAD *SCI* AS FAR AS DIRECT CELL SETUP IS
*                CONCERNED.
*
*         ENTRY  (A) = OFFSET RELATIVE TO R REGISTER OF PP IMAGE.
*                (R REGISTER) = TOGETHER WITH (A) POINTS TO PP IMAGE IN CM.
*                (PPCHNM) = PP NUMBER OF PP TO LOAD.
*
*         EXIT   (A) = 0, IF NO LOAD ERROR DETECTED.
*                    .NE. 0, IF PP LOAD ERROR.
*
*         USES   CM - CM+2, T1.
*
*         CALLS  DLP, IIB, SCF.


 LPI      SUBR               ENTRY/EXIT

          STDL   CM          SAVE ADDRESS OFFSET
          SRD    CM+1        SAVE CORRESPONDING R-REGISTER

          LDN    15
          STD    T1
          RJM    SCF         ACQUIRE CHANNEL 15

          LDM    PPCHNM
          RJM    DLP         DEADSTART LOAD PP

          LDD    CM+1        SET UP R POINTER TO PP IMAGE IN BOOT
          STML   LPIAC+1
          LDD    CM+2
          STML   LPIAC+2
          LRD    CM+1
          LDDL   CM
          STML   LPIAC       SAVE R REGISTER OFFSET
          ADC    RR
          CRML   LPIAB,ON    DIRECTORY ENTRY OF PP BEING LOADED
          LDN    DSCM+2
          RJM    IIB         INDEX TO CTI DIRECTORY POINTER
          CRML   LPIAD,ON    SET CTI DIRECTORY POINTER
          LDM    PPCHNM      SET PP NUMBER IN PP BEING LOADED
          LPN    77          PP NUMBER
          STM    LPIAE
          LDN    LPIAL       LENGTH OF BOOT ROUTINE
          OAM    LPIA,15     OUTPUT BOOT
          FJM    *,15
          DCN    15+40
          CCF    *,15        RELEASE CHANNEL 15
          LJM    LPIX        RETURN
          SPACE  4
**        BOOT THAT IS LOADED INTO THE PP BEING LOADED.  IT LOADS
*         THE PP IMAGE FROM CM.  IF THE POSITION OF CELLS *LPIAB*
*         THROUGH *LPIAE* CHANGES RELATIVE TO LPIA *SCI* MUST BE
*         CHANGED TO REFLECT THIS.
*

 LPIA     BSS    0
          CON    0
          LDD    LPIAB-LPIA
          STD    LPIAA-LPIA
          LDD    LPIAC-LPIA
          ADC    RR+1
          LRD    LPIAC+1-LPIA
          CRML   **,LPIAB+1-LPIA
 LPIAA    EQU    *-1         LOAD ADDRESS OF PROGRAM
          LDN    0           SET DUAL STATE FLAG
          STD    70
          LJM    100         START RUNNING PROGRAM

*         DEFINE DIRECT CELLS IN *SCI*.  IF THESE CELLS MOVE RELATIVE
*         TO LPIA THEN *SCI* MUST BE CHANGED TO ACCOUNT FOR THIS.  THE
*         LOCATION OF *LPIAB* IS 15B FROM *LPIA*.

          ERRNZ  *-LPIA-15B  PP BOOT CHANGED, *SCI* UPDATE REQUIRED.

*         LOCATION RELATIVE TO *LPIA* IS 15B.

 LPIAB    CON    0,0,0,0     DIRECTORY ENTRY OF PP BEING LOADED.

*         LOCATION RELATIVE TO *LPIA* IS 21B.

 LPIAC    CON    0,0,0       POINTER TO PROGRAM

*         LOCATION RELATIVE TO *LPIA* IS 24B.

 LPIAD    CON    0,0,0       CTI DIRECTORY POINTER.

*         LOCATION RELATIVE TO *LPIA* IS 27B.

 LPIAE    CON    0           PP NUMBER OF PP LOADED.
 LPIAL    EQU    *-LPIA
 RCC      SPACE  4,10
**        RCC - RESERVE CIP CHANNEL.
*
*         ENTRY  NONE.
*
*         EXIT   CHANNEL IS INTERLOCKED.
*
*         USES   CM - CM+3.
*
*         CALLS  FHE, IIB.


 RCC      SUBR               ENTRY/EXIT
          LDN    GPDID       GENERAL PROCESSOR DESCRIPTOR
          RJM    FHE

          LRD    SV
          RJM    SPB         SET PP BOUNDARY TO 170

          LDM    HBUF+GPDDST
          LPN    77
          STM    CIPCH       RESERVE CHANNEL
*IF ($string($name(wev$target_operating_system))='NOSBE')
          RJM    R.RCH
*ELSE
          STD    CM+2
          LMC    4000B       SELECT RETURN ON DOWN CHANNEL
          STD    CM+1
          MONITOR  RCHM
          LDD    CM+1
          SHN    21-13
          PJN    RCC1        IF CHANNEL NOT DOWN
          LDC    =C* SDA - CIP CHANNEL IS DOWN.*
          LJM    FTL

 RCC1     BSS    0
*IFEND
          SRD    SV

          LDN    D8DS        SET CHANNEL LOCKED STATUS IN THE EICB
          RJM    IIB
          CRDL   CM
          LDN    40
          ADM    CIPCH
          STD    CM+1
          LDN    D8DS
          RJM    IIB
          CWDL   CM
          LJM    RCCX        RETURN
 SNO      SPACE  4,10
**        SNO - SET/CLEAR NOS/VE OWNS THE *SCI* PP.
*
*         ENTRY  (A) = 0 IF NOS/VE DOES NOT OWN THE *SCI* PP.
*                    = 1 IF NOS/VE OWNS THE *SCI* PP.
*
*         EXIT   FLAG SET/CLEARED IN *D8ST* ACCORDINGLY.
*
*         USES   CM - CM+3.
*
*         CALLS  IIB, SPB.


 SNO      SUBR               ENTRY/EXIT
          SHN    4
          RAM    SNOA        SAVE SET/CLEAR FLAG
          LRD    IB+1
          RJM    SPB         SET PP BOUNDARY
          LDN    D8ST
          RJM    IIB
          CRDL   CM
          LDDL   CM+1        SET/CLEAR THE FLAG
          LPC    177757
          LMN    0
 SNOA     EQU    *-1
*         LMN    20          (SET NOS/VE OWNS THE *SCI* PP)
          STDL   CM+1
          LDN    D8ST        REWRITE *D8ST*
          RJM    IIB
          CWDL   CM
          UJN    SNOX        RETURN
 VBA      SPACE  4,10
**        VBA - VERIFY BUFFER ADDRESS.
*
*         ENTRY  (BUFP - BUFP+1) = ADDRESS OF BUFFER.
*                (SIZE+1) = SIZE OF BUFFER.
*
*         EXIT   TO *FTL* IF ERROR.


 VBA      SUBR               ENTRY/EXIT
          LDM    BUFP        CHECK MAINTENANCE REGISTER BUFFER
          SHN    12D
          ADM    BUFP+1
          ADM    SIZE+1
          ADN    77
          SHN    -6
          SBD    FL
          MJN    VBAX        IF BUFFER WITHIN FL
          LDC    =C* SDA - BUFFER OUTSIDE FL.*
          LJM    FTL
 WSF      SPACE  4,10
**        WSF - WRITE *SCI* PARAMETER TABLE FIRST WORD.
*
*         ENTRY  (CM - CM+3) = UPDATED FIRST WORD.
*                (W6) = OFFSET.
*                (W4 - W5) = R-REGISTER ADDRESS.
*                TABLE INTERLOCKED.
*                PP BOUNDS SET TO LOWER PP.
*
*         EXIT   UPDATED FIRST WORD WRITTEN TO PARAMETER TABLE.


 WSF      SUBR               ENTRY/EXIT
          LRD    W4
          LDD    W6
          LMC    RR
          CWDL   CM
          UJN    WSFX        RETURN
          TITLE  SYSTEM COMMON DECKS
 COM      SPACE  4,10
**        COMMON DECKS.


          LIST   X
*copy dsi$find_cip_module
*copy dsi$pp_utility_subroutines
*copy dsi$validate_pp_bounds
*copy dsi$get_hardware_element
*copy DSI$DUMP_LOAD_IDLE_PP
          LIST   *
          EJECT
          TITLE  INITIALIZE FOR REQUEST PROCESSING
**        PRS - INITIALIZE FOR REQUEST PROCESSING.


          USE    PRESET

 BUF      BSS    0           PP MEMORY BUFFER

 PRS      SUBR
*IF ($string($name(wev$target_operating_system))='NOSBE')
          LDN    1
          STD    ON          SET CONSTANT 1
          RJM    R.RAFL      REQUEST FIELD LENGTH ACCESS
          SRD    SV          SAVE OS R-REGISTER
          LDN    P.PCOM      CALCULATE PP NUMBER
          CRD    CM
          LDD    D.PPIR
          SBD    CM+C.PCOM
          ADN    10
          SHN    -3
          STM    PPNO
          SBN    12
          MJN    PRS0        IF NOT IN THE UPPER BARREL
          LDN    6
          RAM    PPNO        CONVERT TO PHYSICAL PP NUMBER
 PRS0     LDD    D.PPIR
          CRD    IR          READ INPUT REGISTER
          LDN    P.SSCT      SUBSYSTEM CONTROL TABLE ADDRESS
          CRD    CM
          LDD    CM+C.SSCT
          SHN    3
          ADN    SS.NVE      NVE SUBSYSTEM CONTROL WORD
          CRD    CM
          LDD    CM+4
          SHN    7
          LMD    CP
*ELSE
          SRD    SV          SAVE OS R-REGISTER
          LDN    PPCP        DETERMINE PHYSICAL PP NUMBER
          CRD    CM
          LDD    IA
          SBD    CM+4
          SHN    -3
          STM    PPNO        SAVE LOGICAL PP NUMBER
          SBN    12
          MJN    PRS0        IF NOT IN THE UPPER BARREL
          LDN    6
          RAM    PPNO        CONVERT TO PHYSICAL PP NUMBER
 PRS0     LDD    CP          CHECK SUBSYSTEM ID OF CALLER
          ADN    JCIW
          CRD    CM
          LDD    CM+2
          ADC    -NVSI
*IFEND
          ZJN    PRS1        IF CORRECT SUBSYSTEM
          LDC    =C* SDA - ILLEGAL USER ACCESS.*
          LJM    FTL

 PRS1     LDD    IR+2
          SBN    MAXRQ
          MJN    PRS2        IF VALID REQUEST
          LDC    =C* SDA - ILLEGAL REQUEST.*
          LJM    FTL

 PRS2     LDD    IR+3        MAKE INTERFACE TBL ADDR
          SHN    12D
          ADD    IR+4
          ADN    2
          SHN    -6
          SBD    FL
          MJN    PRS5        IF REQUEST BLOCK IS OK
          LDC    =C* SDA - BAD REQUEST BLOCK ADDRESS.*
          LJM    FTL

*         FETCH *SDA* REQUEST BLOCK.

 PRS5     LDN    2
          STD    TW
          LDN    IR+3
          RJM    LDA         FORM ADDRESS
          CRM    BLOCK,TW    READ REQUEST BLOCK
          EXITMR IFM
          FATALMR  IFM
          LDC    MK16TBL
          RJM    DLI         MAKE 16 BIT INSTR.
          RJM    PIB         PRESET INTERFACE BLOCK
          RJM    PHT         PRESET HARDWARE TABLES
          LDN    0
          RJM    FHE         FIND IOU INFORMATION
          LDM    HBUF+CIOPC
          STM    I0CC        SAVE IOU PORT CODE
          LDM    HBUF+CIOE+EM
          SHN    -4          SHIFT OFF UPPER 4 BITS OF SERIAL NUMBER
          STM    IOUM        SAVE IOU MODEL NUMBER
          RJM    PII         PRESET IOU INFORMATION
          LRD    SV          RESTORE R-REGISTER
          LJM    PRSX        START REQUEST PROCESSING
          SPACE  4,10
*copy DSI$DEFINE_LONG_INSTRUCTION

 STCHTBL  CON    0           CHANNEL TABLE
 MK16TBL  LIST16             16 BIT INSTRUCTION TABLE
 ENDOVL   BSS    0


          END
