ASMB,C,Q
      HED RFAM * SINGLE DCB - RFA MONITOR * (C) HEWLETT-PACKARD CO. 1980
      NAM RFAM,19,30 91750-16164 REV.2013 800721 ALL
      SPC 2 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS      *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 2 
      SPC 2 
****************************************************************
* 
*     SINGLE DCB VERSION OF RFA MONITOR 
* 
*     NAME:         RFAM
*     SOURCE:       91750-18164 
*     RELOC:        91750-16164 
*     PGMR:         DAN GIBBONS 
* 
*************************************************************** 
      SPC 2 
      EXT #ATCH,DTACH 
      EXT EXEC,#GET,#SLAV,$OPSY 
      EXT APOSN,CLOSE,FCONT,CREAT,LOCF,NAMF 
      EXT OPEN,POSNT,PURGE,READF,FSTAT,RWNDF
      EXT WRITF,#NODE,#RFSZ 
      EXT .MVW,.CMW,.CAX,.DSX,.LDX,.SBX,.ISX
      EXT #RPB
RQB   EQU #RPB
      SUP 
* 
BUFSZ EQU 129       MAXIMUM DATA BUFFER 
* 
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 791213      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  DINIT, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*         DSTIO, LUMAP, #CMGT, INCNV, OTCNV, RMTIO               *
*         RSM,   DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM        *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 8 WORDS (#STR THRU #LVL) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     ERROR CODES & LEVEL # ALWAYS BE IN THE SAME PLACE,  *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS ALSO MAKES      *
***!!!!!     STORE-AND-FORWARD CODE MUCH SIMPLER.                *
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
* 
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
* GLBLK-END 
      SKP 
* RFBLK-START 
* 
******************************************************************
*                                                                *
*       R F A   B L O C K                REV 2013  791119        *
*                                                                *
*       OFFSETS INTO DS/1000 RFA MESSAGE BUFFERS, USED BY:       *
*                                                                *
*           RFMST, RFAM1, RFAM2, REMAT, RQCNV, RPCNV             *
*                                                                *
******************************************************************
* 
* OFFSETS INTO RFA REQUEST BUFFERS. 
* 
#FCN  EQU #REQ      RFA FUNCTION CODE.
#DCB  EQU #FCN+1    DCB/FILENAME AREA.
#IRC  EQU #DCB+3    DAPOS: IREC 
#IRB  EQU #IRC+1           IRB
#XIB  EQU #IRC+2           IRB   (DXAPO)
#IOF  EQU #IRB+1           IOFF 
#XIO  EQU #XIB+2           IOFF  (DXAPO)
#ITR  EQU #DCB+3    DCLOS: ITRUN
#IC1  EQU #DCB+3    DCONT: ICON1
#IC2  EQU #IC1+1           ICON2
#ICR  EQU #DCB+3    DCRET,DNAME,DOPEN,DPURG: ICR(1) 
#ID   EQU #ICR+1                             IDSEG
#ISC  EQU #ID+1                              ISECU
#SIZ  EQU #ISC+1    DCRET: ISIZE(1) 
#SZ2  EQU #SIZ+1           ISIZE(2) 
#XRS  EQU #SIZ+2           RECSZ (DXCRE)
#TYP  EQU #SZ2+1           ITYPE
#XTY  EQU #XRS+2           ITYPE (DXCRE)
#NNM  EQU #ISC+1    DNAME: NNAME
#IOP  EQU #ISC+1    DOPEN: IOPTN
#NUR  EQU #DCB+3    DPOSN: NUR
#IR   EQU #NUR+1           IR 
#XIR  EQU #NUR+2           IR    (DXPOS)
#IL   EQU #DCB+3    DREAD,DWRIT: IL 
#NUM  EQU #IL+1                  NUM
#LEN  EQU #FCN+1    DSTAT: ILEN 
#FOR  EQU #LEN+1           IFORM
#OPT  EQU #FOR+1           IOP
#NOD  EQU #ICR+1    "FLUSH" REQUEST: NODE NUMBER
* 
* OFFSETS INTO RFA REPLY BUFFERS. 
* 
#RFD  EQU #REP      DCRET,DOPEN: RFAMD ENTRY #
#JSZ  EQU #RFD+1    DCRET: JSIZE (DXCRE)
#LOG  EQU #REP      DREAD: XLOG 
#REC  EQU #REP      DLOCF: IREC 
#RB   EQU #REC+1           IRB
#XRB  EQU #REC+2           IRB   (DXLOC)
#OFF  EQU #RB+1            IOFF 
#XOF  EQU #XRB+2           IOFF  (DXLOC)
#JSC  EQU #OFF+1           JSECT
#XJS  EQU #XOF+1           JSECT (DXLOC)
#JLU  EQU #JSC+1           JLU
#XJL  EQU #XJS+2           JLU   (DXLOC)
#JTY  EQU #JLU+1           JTY
#XJT  EQU #XJL+1           JTY   (DXLOC)
#JRC  EQU #JTY+1           JREC 
#XJR  EQU #XJT+1           JREC  (DXLOC)
#IAD  EQU #REP      DSTAT: IADD 
* 
* MAXIMUM SIZE OF RFA REQUEST/REPLY BUFFER. 
* 
#RLW  EQU #MHD+13      M A X I M U M   S I Z E   ! ! !
* 
* RFBLK-END 
      SKP 
      SPC 3 
ICLAS NOP 
RFAM  LDA B,I       GET THE CLASS 
      STA ICLAS 
* 
      LDA D1        SET MAX # RFAM FILES
      STA #RFSZ      TO ONE.
* 
      JSB DTACH     DETACH FROM SESS. CONTROL BLOCK 
      DEF *+1       (IN CASE DINIT RUN FROM SESSION)
* 
* 
*     WE COME HERE INITIALLY AND EACH TIME A REQUEST HAS BEEN PROCESSED.
* 
GO    JSB #GET      WAIT FOR A REQUEST TO COME
      DEF *+6 
      DEF ICLAS     CLASS # 
      DEF RQB       BUFFER
      DEF C#RLW     MAXIMUM LENGTH OF THE INCOMING BUFFER 
DTBFA DEF DTBFR     DATA BUFFER ADDRESS 
      DEF BUFLN     MAXIMUM DATA LENGTH 
      JMP ERR53     MUST BE A LENGTH ERROR
* 
      STA RQLN      SAVE THE REQUEST LENGTH 
      LDA RQB+#FCN  GET THE FUNCTION CODE 
      STA FCODE     SAVE IT FOR LATER 
      SSA           CHECK FOR VALIDITY
      JMP ERR25     <0, NO GOOD 
      ADA DM14      CHECK UPPER BOUND 
      SSA,RSS 
      JMP ERR25     >13, NO GOOD EITHER 
* 
*     SINCE FUNCTION CODE LOOKS OK, WE USE IT AS INDEX IN A TABLE 
*     TO GO TO THE PROPER PREPROCESSING.
* 
      CLA 
      STA IERR
      LDA RQB+#FCN  GET FCODE AGAIN 
      ADA JSBTB 
      LDA 0,I 
      STA CALLI     SET UP "JSB" ADR
      LDA RQB+#FCN
      ADA BRNCH     ADD TO THE BEGINNING OF THE BRANCH TABLE
      JMP A,I       GO EXECUTE THE PREPROCESSING
      HED RFAM: ORIENTATION * (C) HEWLETT-PACKARD CO. 1980
* 
* 
*     WE WILL TRY TO DESCRIBE HERE THE FLOW OF OPERATIONS 
*     IN THIS PROGRAM.
* 
* 
* 
*  1. EACH REQUEST IS PROCESSED IN 4 PHASES:
*         - PREPROCESS
*         - FMP CALL BUILDING 
*         - EXECUTION OF THE FMP CALL 
*         - POSTPROCESS 
* 
*     THE CHOICE OF THE PROCESSOR IS MADE EACH TIME BY USING
*     THE REQUEST CODE AS AN INDEX IN A BRANCH TABLE. 
* 
* 
*  2. PREPROCESSING 
*     THE READER SHOULD FIND IN THE PREPROCESSING BRANCH TABLE
*     (BRNCH) THE LABEL AT WHICH THE CURRENT PREPROCESS WILL START. 
* 
* 
* 
*  3. FMP CALL FORMATING. 
*     THE TABLE WE WILL USE TO SELECT A PROCESSOR IS BLDTB. 
*     IN THIS PART WE ONLY SET THE ADDRESSES OF THE PARAMETERS
*     IN THE CALL BUFFER. 
* 
* 
*  4. POSTPROCESSING
*     ON COMPLETION OF THE FMP CALL WE GO TO "DONE" WHERE THE 
*     SELECTION OF THE PREPROCESSOR IS DONE THROUGH THE TABLE 
*     PSTBL.
* 
*     PST05 USED FOR DNAME AND DPURG
*         IF THE FILE WAS OPEN BEFORE THE FMP CALL AND THE CALL 
*         WAS EXECUTED WITHOUT ERROR, THE CURRENT RFAMD ENTRY 
*         IS DELETED. 
* 
*     PST04 USED FOR DCRET
*         IF THE ICR WAS NOT SPECIFIED IN THIS REQUEST, SET THE 
*         PROPER CRN VALUE IN THE RFAMD ENTRY.
*         IN ANY CASE, FIND THE RFAMD ENTRY # AND PASS IT TO
*         THE USER. 
* 
*     PST00 USED FOR DSTAT
*         SET THE DATA LENGTH TO 125 WORDS. 
* 
*     PST02 USED FOR DREAD
*         SET THE DATA LENGTH 
* 
*     PST03 USED FOR DOPEN
*         IF THE ICR WAS SPECIFIED IN THE REQUEST, THE RFAMD
*         ENTRY # IS SET IN THE REQST, AND THE REPLY IS SENT. 
*         IF THE ICR WAS NOT SPECIFIED IN THE REQUEST, THE
*         LEGALITY OF THIS OPEN IS CHECKED, AND EITHER: 
*         - REJECTED (ERR -08) THE TYPE OF THE OPEN MAY HAVE
*         BE RESTORED 
*         - ACCEPTED, THE CRN IS SET IN THE RFAMD ENTRY AND THE ENTRY 
*         NUMBER IS SET IN THE REQST. 
*         THE REPLY IS SENT.
* 
* 
*  5. IF THE OPERATION WAS A SUCCESSFUL CLOSE, THE CURRENT RFAMD
*     ENTRY IS DELETED. 
* 
* 
* 
* 
      HED RFAM: PREPROCESSING * (C) HEWLETT-PACKARD CO. 1980
      SPC 3 
* 
*  HERE ON A "DCRET"
BRN3  LDA %NAME     CURRENT DCB ID
      SZA           IS ENTRY AVAILABLE? 
      JMP ERR28     NO, GIVE ERROR -28
* 
BRN31 LDB FNAMA 
      LDA NAMA
      JSB .MVW      SET UP CURRENT ENTRY: NAME, CRN, ID SEG 
      DEF D5
      NOP 
      LDA RQB+#SRC  GET ORIGINATOR'S NODE 
      STA %NODE      & SAVE IN LOCAL ENTRY
      JMP BUILD     CURRENT ENTRY IS ALL SET! 
      SPC 3 
* 
*     HERE ON A DOPEN 
* 
BRN4  JSB CKENT     SET CRN, CHECK NAME, NODE, AND ID 
      JMP BRN31     OK OR CURRENT ENTRY IS EMPTY
      SPC 3 
* 
*     PROCESSOR FOR FLUSH 
* 
BRN6  LDB FNAMA 
      LDA NAMA
      JSB .CMW      COMPARE NAME WITH CURRENT ENTRY 
      DEF D3
      NOP 
      JMP *+3       MATCHES 
      NOP 
      JMP ERR11     DOESN'T MATCH, GIVE DCB NOT OPEN
* 
      LDB RQB+#NOD
      CPB DM1       CLOSE ALL?
      JMP BUILD     YES, DO IT
      CPB %NODE     IS IT THE ASSIGNED NODE?
      JMP BUILD     YES, FLUSH IT 
      JMP ERR11     NO, GIVE DCB NOT OPEN 
      SPC 3 
* 
*     HERE FOR DPURG AND DNAME
* 
BRN8  JSB CKENT     CHECK NAME, NODE, AND ID
      STA TMPAD     VALUE=0 IF NO CURRENT ENTRY 
      JMP BUILD     OK TO PROCEED 
      SPC 3 
* 
* 
*     HERE FOR DSTAT. THIS IS A SPECIAL CALL, IT DOES NOT 
*     NEED ANY DCB. SPECIAL TREATMENT.
* 
BRN10 EQU * 
* 
      LDA RQB+#SID  GET SESSION ID WORD FROM REQ. 
      AND B377      ISOLATE DEST. SESSION ID (BITS 0-7) 
      STA TEMP      SAVE SESSION ID FOR '#ATCH' CALL
* 
      JSB #ATCH     ATTACH TO SESSION CONTROL BLOCK 
      DEF *+2 
      DEF TEMP
* 
      INA,SZA,RSS   CHECK FOR ERROR 
      JMP RSERR     "RS01" ERROR: SCB NOT FOUND 
* 
      JSB FSTAT 
      DEF *+2 
      DEF DTBFR     STATUS BUFFER 
* 
      JSB DTACH     DETACH FROM SESS. CONTROL BLOCK 
      DEF *+1 
* 
* 
      LDB D125      SET THE LENGTH OF THE 
      JMP REPLY+1   DATA BUFFER & RETURN
      SPC 3 
* 
*  ENTER HERE FOR FUNCTIONS WHICH MUST ALREADY HAVE OPEN DCB
* 
BRN1  LDB %NAME 
      LDA RQB+#DCB+1
      CPA %SEQ      IS IT CORRECT ENTRY NUMBER? 
      SZB,RSS       YES, IS ENTRY STILL OPEN? 
      JMP ERR26     ANSWER TO EITHER IS NO, GIVE -26
      SKP 
      SPC 3 
*     HERE WE BRANCH TO THE PROPER CALL SETUP ROUTINE.
* 
BUILD LDA DCBA
      STA LDCB      INITIALIZE DCB ADDR IN CALL 
      LDA NAMA
      STA LDCB+2    INITIALIZE ADDR OF FILE NAME
      LDA SZOPA 
      STA LDCB+3    INITIALIZE ADDR OF SIZE/OPTNL PARAM 
      LDB PARAM     GET ADDR OF PARAMETER DESTINATION 
      LDA RQB+#FCN  GET FCODE AGAIN 
      ADA BLDTB     MAP IN "BUILD" TABLE
      JMP A,I       GO PREPARE THE CALL TO FMP
* 
      SPC 3 
* 
*     CALL BUILDER FOR DWRIT
* 
BLD12 LDA DTBFA 
      STA LDCB+2    SET BUFFER ADDRESS IN CALL
      INB 
      SPC 3 
* 
*     CALL BUILDER FOR DAPOS,DCLOS,DCONT,DPOSN,DWIND,FLUSH
* 
BLD0  LDA RQLN      REQUEST LENGTH
      ADA HDLEN     COMPUTE # OF PARAMETERS + 1 
      JSB .CAX
      LDA PRM0A     GET ADDR PRECEEDING REQ PARAMS
* 
BLDCM JSB .DSX      DECREMENT COUNT 
      INA,RSS 
      JMP BLD01     DONE MOVING PARAMETER "DEF"S
* 
BLDC2 STA 1,I       STORE "DEF" IN CALL SEQUENCE
      INB 
      JMP BLDCM     ITERATE 
      SPC 3 
* 
*      CALL BUILDER FOR DCRET 
* 
BLD3  LDA TYPEA     ADDR OF TYPE
      STA LDCB+4
* 
      LDB D3
* 
*     THE FOLLOWING PART IS COMMON TO DCRET, DNAME,DOPEN
*     AND DPURG, IT SETS THE SECURITY CODE AND THE CRN IN THE CALL
* 
BLD31 ADB PARAM     COMPUTE ADDR WITHIN CALL
      LDA SECUA     GET ADDRESS OF ISECU
      STA B,I       SET IT IN THE CALL
      LDA CRA       GET ADDRESS OF ICR
      INB           STEP TO NEXT PARAM IN CALL
      STA B,I       SET IT IN THE CALL
      LDA A,I       GET CRN 
      SZA           PRESENT ? 
      INB           YES, PUSH B TO NEXT 
      JMP BLD01     DONE HERE, GO COMPLETE AND CALL 
      SPC 3 
* 
*     CALL BUILDER FOR DLOCF
* 
BLD4  JSB .LDX      SET COUNTER 
      DEF D7
      LDA IRECA     GET ADDR OF 1ST RETURN PARAM IN REPLY 
      JMP BLDC2     GO SET-UP "DEF"S TO PARAMETERS
      SPC 3 
* 
*     CALL BUILDER FOR DNAME
* 
BLD5  LDB D2
      LDA TMPAD     WAS THE FILE ALREADY OPEN ? 
      SZA 
      JMP BLD31     YES, DCB ADDRESS ALREADY SET
      JMP BLD81     NO, USE DATA BUFFER AS DCB SPACE. 
      SPC 3 
* 
*     CALL BUILDER FOR DOPEN
* 
* 
BLD6  CLB           SET "FILE NOT OPEN" 
      STB %DCB+9          STATUS
* 
      LDB D2
      JMP BLD31     GO COMPLETE THE CALL
      SPC 3 
* 
*     CALL BUILDER FOR DPURG
* 
BLD8  LDA NAMA      GET FILE NAME ADDRESS 
      STA LDCB+2    SET IT IN CALL
      CLB,INB 
BLD81 LDA DTBFA     GET THE ADDRESS OF THE DATA BUFFER
      STA LDCB      USE IT AS THE DCB ADDRESS FOR THIS CALL 
      JMP BLD31     GO COMPLETE 
      SPC 3 
* 
*     CALL BUILDER FOR DREAD
* 
BLD9  LDA RQB+#IL   REQUESTED DREAD LENGTH
      CMA,INA 
      ADA BUFLN     BUFFER SIZE - REQUESTED LENGTH
      SSA           BUFFER EXCEEDED?
      JMP ERR53     YES, GIVE LENGTH ERROR
      LDA DTBFA     GET ADDRESS OF DATA BUFFER
      STA LDCB+2    SET IT IN CALL
      CLB 
      STB RQB+#LOG  PRE-INITIALIZE RETURNED LENGTH
      LDA CRA       GET ADDRESS OF REQUEST LENGTH 
      LDB LOGA      ALWAYS PASS LEN BACK. GET ITS ADDR
      DST LDCB+3
      INA 
      LDB A,I       GET NUM 
      SZB,RSS       PRESENT ? 
      JMP BLD91     NO
      STA LDCB+5    YES, SET IN CALL
      CLB,INB       GET A 1 
BLD91 ADB PARAM     FIND RETURN ADDRESS 
      ADB D3
* 
*  WRAP-UP PREPROCESSING
* 
BLD01 STB RTNAD     SET THE RETURN ADDRESS
      CLA 
      STA 1,I       CLEAN OUT REST OF CALL
      INB 
      CPB RTN       MORE? 
      JMP CALL      NO, GO EXECUTE FMGR CALL
      JMP *-4       YES 
      HED RFAM: POSTPROCESSING * (C) HEWLETT-PACKARD CO. 1980 
* 
*     POSTPROCESS FOR DNAME AND DPURG 
* 
PST05 CLB 
      CPB TMPAD     WAS IT AN ALREADY OPEN FILE ? 
      JMP REPLY     NO
      LDA IERR      GET COMPLETION CODE 
      SSA,RSS       ERROR ? 
      STB %NAME     NO, DELETE THE OLD ENTRY
      LDA FCODE     YES, GET FUNCTION CODE
      CPA DPURG     ERROR ON A DPURG? 
      STB %NAME     YES, DELETE ENTRY (FMP CLOSED FILE) 
      JMP REPLY     SEND THE REPLY
      SPC 2 
* 
*     POSTPROCESS FOR DCRET AND DOPEN 
* 
PST04 LDA IERR
      SSA           ANY ERROR ? 
      JMP CLENT     YES, JUST CLEAR OUT CURRENT ENTRY 
* 
      LDA RQB+#ICR  GET ICR 
      SZA           SPECIFIED ? 
      JMP PST41     YES 
* 
      LDA %DCB      NO, GET 1ST WORD OF DCB 
      AND B77       GET DISC LU 
      CMA,INA 
      STA RQB+#ICR  REPLACE IN THE REQST
PST41 JSB LUCR      TRANSFORM INTO CRN
      STB %CRN      SET IT
* 
      ISZ %SEQ      BUMP CURRENT SEQUENCE NUMBER
      NOP 
      LDA %SEQ
      STA #RPB+#RFD   SAVE IT IN REPLY
      JMP REPLY 
      SPC 2 
* 
*     WE COME HERE AFTER A DREAD
* 
PST02 LDB RQB+#LOG  GET LENGTH OF DATA
      SSB           SKIP IF NOT EOF 
      CLB           ELSE DO ZERO LENGTH XFER
      JMP REPLY+1 
      SPC 2 
* 
*     POST PROCESS FOR FLUSH
* 
PST08 CLA,INA       ONE FLUSHED ENTRY 
      STA IERR      SET AS COMPLETION CODE
* 
CLENT CLB 
      STB %NAME     CLEAN OUT CURRENT ENTRY 
      HED RFAM: SEND REPLY  * (C) HEWLETT-PACKARD CO. 1980
* 
*     POST-PROCESSING COMPLETED, SET-UP TO SEND REPLY 
* 
REPLY CLB           SET FOR NO DATA RETURNED
      STB LENGT 
      LDA #NODE     GET LOCAL NODE #
      STA #RPB+#ENO  SET AS COMPLETION LOCATION 
      LDA IERR      SET THE COMPLETION CODE 
      STA #RPB+#EC2   IN THE REPLY
* 
PST1A LDA FCODE     GET THE OPCODE
      ADA LNTBL     INDEX IN THE REPLY LENGTH TABLE 
      LDA A,I       GET THE LENGTH
      STA RQLN      SET THE LENGTH
* 
*     THE REPLY REQST IS READY, SEND IT BACK
* 
      JSB #SLAV 
      DEF *+4 
      DEF RQLN      REQST LENGTH
      DEF DTBFR     DATA BUFFER 
      DEF LENGT     DATA LENGTH 
* 
      NOP           IGNORE THE ERROR RETURN FROM #SLAV
* 
*     IF THE OPERATION WAS A DCLOS, AND IT WORKED PROPERLY, WE
*     HAVE TO DELETE THE RFAMD ENTRY. 
* 
      LDA FCODE     GET OPCODE FOR THE LAST TIME
      CPA D1        DCLOS ? 
      CLB,RSS 
      JMP PST06 
* 
* 
      LDA IERR      GET COMPLETION CODE 
      SSA,RSS       ERROR ? 
      STB %NAME     NO, CLEAR OUT CURRENT ENTRY 
* 
PST06 JSB .LDX      GET A COUNTER 
      DEF DM9 
      CLB           GET A 0 
PST07 JSB .SBX      CLEAN THE OPTIONAL AREA 
      DEF RQB+#RLW
      JSB .ISX
      JMP PST07     CONTINUE
      JMP GO        GET NEXT REQUEST. 
      HED RFAM: UTILITY ROUTINES * (C) HEWLETT-PACKARD CO. 1980 
* 
*  THIS ROUTINE CHECKS FILE NAME, CARTRIDGE REFERENCE, NODE, AND
*  ID SEGMENT ADDRESS IN THE NEW REQUEST AND RETURNS IF THEY
*  MATCH THE CURRENT ENTRY
* 
CKENT NOP 
      JSB LUCR      CONVERT POSSIBLE LU TO CRN
      LDA %NAME 
      SZA,RSS       CURRENT ENTRY AVAILABLE 
      JMP CKENT,I   YES 
      LDA RQB+#SRC
      CPA %NODE     NODES MATCH?
      RSS           YES 
      JMP ERR28     NO, GIVE NO TABLE SPACE ERROR?
      SZB,RSS       WAS CRN SPECIFIED 
      LDB %CRN      NO, USE CURRENT ENTRY'S CRN 
      STB RQB+#ICR
      LDB FNAMA 
      LDA NAMA
      JSB .CMW      COMPARE NAME,CRN, & ID SEGMENT ADDRS
      DEF D5
      NOP 
      JMP CKENT,I   MATCHED OK
      NOP 
      JMP ERR28     DOESN'T MATCH, GIVE NO TABLE SPACE ERROR
* 
*     THIS ROUTINE WILL TRANSFORM A NEGATIVE DISC LU
*     INTO A CARTRIDGE NUMBER. BOTH INPUT AND RESULTS 
*     ARE PASSED VIA REQST+#ICR. THE RESULT WILL ALSO BE
*     FOUND IN B REGISTER. IF AN ERROR IS DISCOVERED
*     WE WILL DIRECTLY JUMP TO THE ERROR ROUTINE. 
* 
LUCR  NOP 
      LDB RQB+#ICR
      SSB,RSS       IS IT AN LU?
      JMP LUCR,I    NO
* 
      LDA $OPSY     CHECK TYPE
      AND DM15
      CPA DM15      RTE-M?
      RSS           YES 
      JMP NOTM      NO, SKIP CTU-SYS CHECK
* 
      CMB,INB       YES, MAKE IT POSITIVE AND 
      STB DTBFR      SET UP STATUS CALL.
* 
      JSB EXEC      GET EQUIPMENT-TYPE CODE 
      DEF *+4 
      DEF D13I
      DEF DTBFR     USE DTBFR FOR CONWD 
      DEF DTBFR+1    AND EQT5.
      JMP ERR06     ILLEGAL LU
* 
      LDA DTBFR+1   GET EQT5
      ALF,ALF 
      AND B77       ISOLATE EQUIP-TYPE CODE 
      LDB RQB+#ICR  IF DVR05 (CTU SYSTEM),
      CPA D5         RETURN WITH
      JMP LUCR,I      B = -LU.
* 
NOTM  EQU * 
* 
      LDA RQB+#SID  GET SESSION ID WORD FROM REQ. 
      AND B377      ISOLATE DEST. SESSION ID (BITS 0-7) 
      STA TEMP      SAVE SESSION ID FOR '#ATCH' CALL
* 
      JSB #ATCH     ATTACH TO SESSION CONTROL BLOCK 
      DEF *+2 
      DEF TEMP
* 
      INA,SZA,RSS   CHECK FOR ERROR 
      JMP RSERR     "RS01" ERROR: SCB NOT FOUND 
* 
      JSB FSTAT     GET INFO ON THE CURRENTLY 
      DEF *+2         MOUNTED CARTRIGES.
DBFAD DEF DTBFR     SEND THE INFO IN THE DATA BUFFER
* 
      JSB DTACH     DETACH FROM SESS. CONTROL BLOCK 
      DEF *+1 
* 
* 
      LDA DBFAD     DCB BUFFER ADDR 
LP84  LDB 0,I       GET W1 OF ENTRY 
      CMB,INB 
      CPB RQB+#ICR  IS IT OUR LU? 
      JMP FND84     YES 
      SZB,RSS       END OF TABLE ?
      JMP ERR06     YES, ILLEGAL DISC LU
      ADA D4        PUSH THE ADDR TO THE NEXT ENTRY 
      JMP LP84      CONTINUE
* 
FND84 ADA D2        STEP TO THE CRN 
      LDB 0,I       GET IT
      STB RQB+#ICR  SET IT IN THE REQST 
      JMP LUCR,I
      SPC 3 
* 
*     THIS IS THE SKELETON OF THE FMP CALL
* 
PARAM DEF LDCB+2
      DEF LDCB
* 
CALL  EQU * 
* 
      LDA RQB+#SID  GET SESSION ID WORD FROM REQ. 
      AND B377      ISOLATE DEST. SESSION ID (BITS 0-7) 
      STA TEMP      SAVE SESSION ID FOR '#ATCH' CALL
* 
      JSB #ATCH     ATTACH TO SESSION CONTROL BLOCK 
      DEF *+2 
      DEF TEMP
* 
      INA,SZA,RSS   CHECK FOR ERROR 
      JMP RSERR     "RS01" ERROR: SCB NOT FOUND 
* 
      JSB CALLI,I   CALL FMP ROUTINE
RTNAD NOP           DEF RTRN
LDCB  DEF %DCB      ADDRESS OF DCB IF ANY 
      DEF IERR      ERROR 
      REP 8 
      NOP 
* 
DONE  EQU * 
* 
      JSB DTACH     DETACH FROM SESS. CONTROL BLOCK 
      DEF *+1 
* 
      LDA IERR      GET RETURNED ERROR CODE 
      SSA,RSS       DID FMP DETECT AN ERROR?
      JMP NOERR     NO
      LDA "FM"      YES, INDICATE AN FMP-DETECTED ERROR 
      STA #RPB+#EC1   IN THE REPLY. 
* 
NOERR LDA FCODE     GET FUNCTION CODE 
      ADA PSTBL     POST-PROCESSING TABLE 
      JMP 0,I       JUMP TO POST-PROCESSOR
* 
RTN   DEF DONE
CALLI NOP           ADR OF FMP CALL 
"FM"  ASC 1,FM
      SPC 3 
ERR06 JSB FMERR     THIS IS REPORTED AS AN FMP ERROR CODE 
      DEC -6
ERR11 JSB FMERR     THIS IS REPORTED AS AN FMP ERROR CODE 
      DEC -11 
ERR25 EQU *         INVALID FCODE. SET TO ZERO TO 
      CLA            INSURE VALID INDEX INTO REPLY
      STA FCODE       LENGTH TABLE LATER. 
      JSB ERRXX 
      DEC -25 
ERR26 JSB ERRXX 
      DEC -26 
ERR28 JSB ERRXX 
      DEC -28 
ERR53 JSB ERRXX 
      DEC -53 
* 
ERRXX NOP 
      LDB ERRXX,I   PICK UP ERROR CODE
      LDA "DS"      INDICATE A DS-DETECTED ERROR
* 
*     ENTER HERE WITH <A> = "DS" OR "FM" (GENERAL CATEGORY OF ERROR)
*     <B> = ERROR CODE (STORED IN #EC2 WHEN SENDING BACK REPLY) 
* 
ERRYY EQU * 
      STA #RPB+#EC1  STORE CATEGORY CODE OF ERROR 
      STB IERR      SET THE ERROR CODE IN THE REPLY 
      JMP REPLY       AND SHIP IT.
      SPC 2 
FMERR NOP           HERE ON FMP ERRORS
      LDB FMERR,I   PICK UP ERROR CODE
      LDA "FM"      RETURN "FM" ERROR CODE
      JMP ERRYY       AND RETURN VALUE OF "IERR"
* 
"DS"  ASC 1,DS
* 
RSERR LDA "RS"      RETURN SPECIAL ASCII
      STA #RPB+#EC1  REMOTE SESSION MONITOR 
      LDA "01"        ERROR CODE "RS01".
      STA #RPB+#EC2 
      LDA BIT15     SET SIGN BIT IN IERR TO SIMULATE
      STA IERR       NEG ERROR CODE FOR 'CLOS'. 
      IOR #NODE     SET LOCAL NODE # AND ASCII-ERROR
      STA #RPB+#ENO   BIT INTO REPLY. 
      CLA           SET DATA LENGTH FOR 
      STA LENGT       CALL TO #SLAV.
      JMP PST1A     GO SEND REPLY 
* 
* 
"RS"  ASC 1,RS
"01"  ASC 1,01
      HED RFAM: DATA AREA * (C) HEWLETT-PACKARD CO. 1980
A     EQU 0 
B     EQU 1 
      SPC 2 
**** DEFINE CURRENT OPEN RFAM ENTRY ****
%NAME DEC 0,0,0 
%CRN  NOP 
%IDSG NOP 
%NODE NOP 
%SEQ  NOP 
**** END OF CURRENT ENTRY ****
      SPC 2 
B10   OCT 10
B377  OCT 377 
DPURG EQU B10       FCODE FOR DPURG 
DM15  DEC -15 
DM14  DEC -14 
DM9   DEC -9
DM1   DEC -1
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D7    DEC 7 
D13I  OCT 100015
D125  DEC 125 
BUFLN ABS BUFSZ 
BIT15 OCT 100000
B77   OCT 77
FNAMA DEF %NAME 
HDLEN ABS -#DCB-2 
NAMA  DEF RQB+#DCB  ADDR OF THE FILE NAME 
PRM0A DEF RQB+#DCB+2  ADDR PRECEEDING REQUEST PARAMS
CRA   DEF RQB+#ICR  ADDR OF THE ICR 
SECUA DEF RQB+#ISC  ADDR OF ISECU 
SZOPA DEF RQB+#SIZ  ADDR OF SIZE/IOPTN
TYPEA DEF RQB+#TYP  ADDR OF TYPE
IRECA DEF #RPB+#REC  ADDR OF IREC (DLOCF PARAM) 
DCBA  DEF %DCB
LOGA  DEF #RPB+#LOG  ADDR OF LEN (XMISSION LOG) 
* 
*  VARIABLES
LENGT NOP 
IERR  NOP 
TMPAD NOP 
RQLN  NOP           REQUEST LENGTH
FCODE NOP           FUNCTION CODE 
TEMP  NOP 
      HED RFAM: TABLES * (C) HEWLETT-PACKARD CO. 1980 
BRNCH DEF *+1,I 
      DEF BRN1      DAPOS 
      DEF BRN1      DCLOS 
      DEF BRN1      DCONT 
      DEF BRN3      DCRET 
      DEF BRN1      DLOCF 
      DEF BRN8      DNAME 
      DEF BRN4      DOPEN 
      DEF BRN1      DPOSN 
      DEF BRN8      DPURG 
      DEF BRN1      DREAD 
      DEF BRN10     DSTAT 
      DEF BRN1      DWIND 
      DEF BRN1      DWRIT 
      DEF BRN6      FLUSH 
* 
JSBTB DEF *+1 
      DEF APOSN 
      DEF CLOSE 
      DEF FCONT 
      DEF CREAT 
      DEF LOCF
      DEF NAMF
      DEF OPEN
      DEF POSNT 
      DEF PURGE 
      DEF READF 
      NOP 
      DEF RWNDF 
      DEF WRITF 
      DEF CLOSE     FLUSH 
* 
BLDTB DEF *+1,I     CALL BUILDING TABLE 
      DEF BLD0      DAPOS 
      DEF BLD0      DCLOS 
      DEF BLD0      DCONT 
      DEF BLD3      DCRET 
      DEF BLD4      DLOCF 
      DEF BLD5      DNAME 
      DEF BLD6      DOPEN 
      DEF BLD0      DPOSN 
      DEF BLD8      DPURG 
      DEF BLD9      DREAD 
      NOP 
      DEF BLD0      DWIND 
      DEF BLD12     DWRIT 
      DEF BLD0      FLUSH 
* 
      SPC 3 
LNTBL DEF *+1       REPLY LENGTH TABLE
      ABS #REP      DAPOS 
      ABS #REP      DCLOS 
      ABS #REP      DCONT 
      ABS #RFD+1    DCRET 
      ABS #JRC+1    DLOCF 
      ABS #REP      DNAME 
      ABS #RFD+1    DOPEN 
      ABS #REP      DPOSN 
      ABS #REP      DPURG 
      ABS #LOG+1    DREAD 
      ABS #REP      DSTAT 
      ABS #REP      DWIND 
      ABS #REP      DWRIT 
      ABS #REP      FLUSH 
      SPC 3 
PSTBL DEF *+1,I     POST PROCESSING TABLE 
      DEF REPLY     DAPOS 
      DEF REPLY     DCLOS 
      DEF REPLY     DCONT 
      DEF PST04     DCRET 
      DEF REPLY     DLOCF 
      DEF PST05     DNAME 
      DEF PST04     DOPEN 
      DEF REPLY     DPOSN 
      DEF PST05     DPURG 
      DEF PST02     DREAD 
      NOP 
      DEF REPLY     DWIND 
      DEF REPLY     DWRIT 
      DEF PST08     FLUSH 
      HED RFAM: BUFFERS * (C) HEWLET-PACKARD CO. 1980 
C#RLW ABS #RLW      MAX LEN REQ/REPLY BUFFER. 
* 
* 
DTBFR BSS BUFSZ 
%DCB  BSS 144 
* 
SIZE  EQU * 
* 
      END RFAM
                                                                