ASMB,R,L,C
      HED GRPM 91700-16153 REV.A 760206 * (C) HEWLETT-PACKARD CO. 1976
      NAM GRPM,1,4 91700-16153 REV.A 760206 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      ENT GRPM
      EXT EXEC,#GRPM,#MNUM,#LDEF,#QRN,#SRPM,RNRQ
      EXT #QCLM,#CLWT,#PLOG,$TIME,#RSAX 
* 
* 
* GRPM
* SOURCE: 91700-18153 
* BINARY: 91700-16153 
* PRGMR: BOB SHATZER
* DATE: 06 FEB 76 
* 
* 
* 
*     GRPM IS THE GENERAL REQUEST PRE-PROCESS MODULE FOR DS-1.
*     IT RECEIVES INCOMING REQUESTS FROM QUEUE AND PERFORMS 
*     VALIDITY CHECKS ON THE STREAM TYPE. IF THE INCOMING 
*     PARMB IS A REPLY, IT IS FORWARDED TO THE STREAM TYPE
*     WHICH IS SPECIFIED IN PARMB WORD 2. ALL INCOMING SLAVE
*     REQUESTS ARE FORWARDED TO SRPM FOR DISPATCHING TO THE 
*     PROPER MONITOR. IF THE REQUEST IS FROM SCE/1, THE 
*     INCOMING REQUEST WORD IS PUT IN WORD 2 OF AN INTERN-
*     ALLY GENERATED STREAM 9 PARMB, AND THE REQUESTING LU
*     IS INDICATED IN WORD 25. IN THIS WAY, REQUESTS COMING INTO
*     THE SYSTEM FROM SCE/1 ARE REFORMATTED TO BE TREATED LIKE
*     ANY OTHER REQUEST.
* 
* 
*     ERRORS:  THE FOLLOWING ERROR CONDITIONS CAN OCCUR:
* 
*     1.  BAD CLASS NUMBER FOR GRPM - REPORT CATASTROPIC ERROR
*     2.  ILLEGAL STREAM TYPE - SEND "ILRQ" 
*     3.  SRPM'S CLASS IS BAD - REPORT CATASTROPHIC ERROR 
* 
*     ALL ERROR PROCESSING IS DONE BY THE DISC-RESIDENT MODULE
*     'QCLM'. THE NECESSARY ERROR PROCESSING INFORMATION AND THE
*     PARMB ARE WRITTEN INTO QCLM'S I/O CLASS. THUS, GRPM IS FREE TO
*     SERVICE THE NEXT INCOMING REQUEST.
* 
      SKP 
GRPM  CLA 
      STA QCB       CLEAR QCB WHERE NEEDED
      STA SHEDR 
      STA ERRAD 
* 
      JSB EXEC      CLASS GET TO WAIT FOR PARMB 
      DEF *+7 
      DEF D21I
      DEF #GRPM 
      DEF PARMB 
      DEF D35 
      DEF LU
      DEF SCODE 
      JSB ERR1
      SLA,RSS       CHECK FOR GOOD DRIVER COMPLETION
      JSB ERR0      NO GOOD - GIVE UP 
      DST REGS      SAVE REGISTERS ON RETURN FROM DRIVER
      LDA SCODE     GET SELECT CODE 
      ALF,ALF       ROTATE TO UPPER BYTE FOR CHANNEL WORD 
      IOR LU        STUFF IN THE LU 
      STA CHANL     AND SAVE IT IN THE CHANNEL WORD 
      LDA PARMB     GET FIRST WORD OF REQUEST 
      SSA,RSS       IS IT AN SCE1 REQUEST? (BIT15 = 1)
      JMP GRP.1     NO - GO PROCESS AS NORMAL REQUEST 
* 
      STA PARMB+1   STORE SCE1 REQUEST IN WORD 2 OF PARMB 
      LDA D9        GET PROGL STREAM TYPE 
      STA PARMB     AND PUT IT INTO WORD 1 OF THE PARMB 
* 
GRP.1 ALF           ROTATE 'FRIENDLY' (BIT11) TO BIT 15 
      SSA           IS IT SET?
      JMP GRP.2     YES - REQUEST IS FROM FRIENDLY SATELLITE
      DLD $TIME     REQUEST IS FROM 'OLD' BCS SATELLITE 
      DST PARMB+33  SET UP BOGUS TIME TAG 
GRP.2 LDA PARMB     GET FIRST WORD OF THE PARMB 
      AND B377      ISOLATE STREAM TYPE 
      STA STREM     AND SAVE IT 
      CMA,INA 
      ADA #MNUM     SUBTRACT FROM MAX STREAM NUMBER 
      SSA           DID IT OVERFLOW?
      JSB ERR2      YES - ILLEGAL STREAM TYPE 
      LDA PARMB     GET STREAM WORD OF PARMB
      RAL           ROTATE BIT 14 TO HI BIT 
      SSA           IS IT SET?
      JMP REPLY     YES - THIS IS A REPLY 
      LDA STREM     GET STREAM TYPE 
      MPY D3        MULTIPLY BY 3 TO SETUP OFFSET 
      LDB #LDEF,I   GET POINTER TO STREAM HEADERS 
      ADB A         INDEX BY STREAM TYPE
      ADB B2
      STB SHEDR     AND SAVE POINTER
      ADB B2        BUMP POINTER TO MONITOR'S ID SEG ADDR 
      LDA B,I       GET ID SEG ADDRESS
      SZA,RSS       IS IDSEG ADDR ZERO? 
      JSB ERR2      YES - NO SUCH MONITOR 
* 
      JSB RNRQ      CHECK FOR #QRN BEING SET
      DEF *+4 
      DEF GLCN      GLOBAL LOCK-CLEAR NO WAIT 
      DEF #QRN
      DEF STREM 
      JSB ERR0      GET NEXT REQUEST IF ERROR 
      LDA STREM     GET RETURNED STATUS 
      CPA D1        IS RN CLEAR?
      RSS           YES - GO ON 
      JSB ERR3      NO - REJECT REQUEST 
      JSB #CLWT     WRITE PARMB TO SRPM'S CLASS 
      DEF *+6 
      DEF #SRPM 
      DEF QCB 
      DEF D42 
      DEF LU
      DEF SCODE 
      JSB ERR1      ERROR ON CLASS WRITE/READ 
      JMP GRPM      GO BACK TO GET
* 
REPLY JSB #RSAX     SEARCH FOR AN EXISTING CLASS IN RES 
      DEF *+4         TO MAKE SURE REPLY ISN'T WRITTEN
      DEF D5          A GENERAL RTE USER WHO IS HUNG ON A 
      DEF D1          NON-NETWORK ASSIGNED CLASS. 
      DEF PARMB+1 
      SZA           DOES CLASS EXIST? 
      JSB ERR4      NO - GO BACK TO GET NEXT REQUEST
      JSB #CLWT     WRITE TO MASTER REQUESTOR'S CLASS 
      DEF *+6 
      DEF PARMB+1 
      DEF PARMB 
      DEF D35 
      DEF ZERO
      DEF ZERO
      JSB ERR4      IGNORE THE ERROR - GO BACK TO GET 
* 
      LDA #PLOG     GET PARMB LOGGING FLAG
      SZA,RSS       IS IT SET?
      JMP GRPM      NO - GO AND GET NEXT REQUEST
      JSB #CLWT     FLAG IS SET - WRITE QCB AND PARMB 
      DEF *+6         TO THE PLOG MONITOR 
      DEF #PLOG 
      DEF QCB 
      DEF D42 
      DEF XEQT
      DEF ZERO
      NOP           IGNORE THE ERROR
      JMP GRPM      GO BACK TO GET ANOTHER REQUEST
* 
      SKP 
* 
*     ERROR PROCESSING SECTION
* 
ERR0  NOP           HERE TO GIVE UP AND TERMINATE 
      DST REGS      SAVE REGISTERS IN QCB 
      CLA           SET QCB CONTROL WORD TO ZERO
      LDB ERR0      PICK UP ORIGINATION ADDRESS 
      JMP ERRN      AND GO TO GENERAL ERROR PROCESSOR 
* 
ERR1  NOP           HERE TO REPORT CATASTROPHIC ERROR 
      DST REGS
      LDA BIT15 
      LDB ERR1
      JMP ERRN
* 
ERR2  NOP           HERE TO SEND 'ILRQ' TO REMOTE 
      DST REGS
      LDA B5
      LDB ERR2
      JMP ERRN
* 
ERR3  NOP           HERE TO SEND BUSY REPLY 
      DST REGS
      LDA B2
      LDB ERR3
      JMP ERRN
* 
ERR4  NOP           SEND 'STOP' IF DATA PENDING.
      STA REGS      SAVE FIRST HALF OF ERROR CODE.
      LDA REGS+1    GET DRIVER STATUS (EQT12).
      STB REGS+1    SAVE REMAINDER OF ERROR CODE FOR <QCLM>.
      ALF,ALF       POSITION DATA PENDING BIT(#8) TO LSB. 
      AND D1        ISOLATE. IF DP SET, <QCLM> SENDS 'STOP'.
      LDB ERR4      GET ORIGINATION ADDRESS.
* 
ERRN  STA QCB       SAVE CONTROL WORD 
      ADB M1        SUBTRACT 1 FROM ERROR ADDRESS 
      STB ERRAD     AND SAVE IT IN THE QCB
      JSB #CLWT     WRITE QCB+PARMB TO QCLM 
      DEF *+6 
      DEF #QCLM 
      DEF QCB 
      DEF D42 
      DEF XEQT
      DEF ZERO
      NOP           ERROR RETURN
      JMP GRPM      GO BACK TO GET
* 
      SKP 
* 
*     CONSTANTS AND STORAGE 
* 
A     EQU 0 
B     EQU 1 
XEQT  EQU 1717B 
D21I  ABS 100000B+21
ZERO  OCT 0 
D9    DEC 9 
D35   DEC 35
B377  OCT 377 
STREM NOP 
LU    NOP 
SCODE NOP 
B5    OCT 5 
B2    OCT 2 
BIT15 OCT 100000
M1    DEC -1
D1    DEC 1 
D5    DEC 5 
D3    DEC 3 
GLCN  OCT 140006
QCB   NOP           QCB - DO NOT REORDER THESE 8 LINES
SHEDR NOP           STREAM LIST HEADER ADDRESS
      NOP           DUMMY PARAMETER 
CHANL NOP           REQUESTING LU AND SELECT CODE 
ERRAD NOP           ERROR ORIGINATION ADDRESS 
REGS  NOP           REGISTER SAVE AREA
      NOP 
PARMB BSS 35        PARMB AREA
D42   DEC 42
* 
      END GRPM
                                                                                                                                                                                                                                