ASMB,L,R,C
      HED RFAM  91740-16004 REV 1740 * (C) HEWLETT-PACKARD CO. 1977 
      NAM RFAM,19,30 91740-16004 REV 1740 771019
      SPC 2 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. 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 
****************************************************************
* 
*     RFAM RFA MONITOR
* 
*     SOURCE PART # 91740-18004 REV 1740
* 
*     REL PART #    91740-16004 REV 1740
* 
*     WRITTEN BY:    JEAN-PIERRE BAUDOUIN 
* 
*     DATE WRITTEN:  JUNE 1976
* 
*     MODIFIED BY:   CHUCK WHELAN 
* 
*     DATE MODIFIED: OCTOBER 1976 
* 
*************************************************************** 
      SPC 2 
      EXT EXEC,D65GT,D65SV
      EXT APOSN,CLOSE,FCONT,CREAT,LOCF,NAMF 
      EXT OPEN,POSNT,PURGE,READF,FSTAT,RWNDF
      EXT WRITF,#NODE,#RFSZ 
      EXT $LIBR,$LIBX,$CVT3,$OPSY 
      IFZ 
      EXT DBUG
      XIF 
      SUP 
      SPC 3 
ICLAS NOP 
RFAM2 LDA B,I       GET THE CLASS 
      STA ICLAS 
* 
      IFZ 
      CPA D99       DO THEY WANT DBUG ? 
      RSS           YES 
      JMP INIT      NO, NORMAL FLOW 
* 
      JSB DBUG
      DEF *+1 
* 
      JSB EXEC      NOW THAT DBUG HAS BEEN CALLED 
      DEF *+4         TERMINATE AND SAVE RESOURCES
      DEF D6
      DEF D0
      DEF D1
* 
      JMP RFAM2     GO BACK TO START
      XIF 
* 
      JMP INIT      GO EXECUTE THE INITIALIZATION PHASE 
      SPC 3 
      HED RFAM: ACTIVATOR * (C) HEWLETT-PACKARD CO. 1977
* 
*     WE COME HERE THE FIRST TIME WHEN THE INITIALIZATION IS COMPLETED
*     WE COME BACK HERE EACH TIME A REQUEST HAS BEEN PROCESSED. 
*     AS USUAL, WE HANG ON A CLASS WAITING FOR A REQUEST TO COME. 
*     THE CLASS HAS BEEN PASSED TO US BY LSTEN AT SYSON TIME. 
* 
GO    JSB D65GT     WAIT FOR A REQUEST TO COME
      DEF *+6 
      DEF ICLAS     CLASS # 
BPARM DEF PARMB     BUFFER
      DEF D14       MAXIMUM LENGTH OF THE INCOMING BUFFER 
DTBFA DEF DTBFR     DATA BUFFER ADDRESS 
      DEF D512      MAXIMUM DATA LENGTH 
      JMP GO        IGNORE ERROR RETURN 
* 
      STA RQLN      SAVE THE REQUEST LENGTH 
      LDA PARMB+4   GET THE FUNCTION CODE 
      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.
* 
      LDA PARMB+4   GET FCODE AGAIN 
      ADA BRNCH     ADD TO THE BEGINNING OF THE BRANCH TABLE
      JMP A,I       GO EXECUTE THE PREPROCESSING
      HED RFAM: ORIENTATION * (C) HEWLETT-PACKARD CO. 1977
* 
* 
*     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. 
*     HERE IS A DESCRIPTION OF THESE PREPROCESSES.
* 
*     BRN2 USED BY DCLOS
*         SCAN THE RFAMD TABLE FOR OTHER USERS OF THIS FILE.
*         ONLY USER ? 
*         - YES => BRN9, GET READY FOR A REAL FILE CLOSE. 
*         - NO => BRN7, FAKE A CLOSE, SEND THE REPLY. 
* 
*     BRN8 USED FOR DPURG AND DNAME 
*         SCAN THE RFAMD LIST FOR USERS OF THIS FILE. 
*         - FILE NOT CURRENTLY USED => BRN5, PREPARE THE FMP CALL 
*         - FILE CURRENTLY USED, BUT ONLY BY US => BRN9, GET
*         CURRENT DCB, THEN BUILD THE CALL. 
*         - FILE CURRENTLY USED BY SOMEONE ELSE, RESTORE THE
*         TYPE OF THE OPEN IF NECESSARY (WE MIGHT HAVE HAD TO 
*         OPEN THE FILE TO LOCATE IT IF ICR WAS NOT SPECIFIED)
*         THEN REJECT THE REQUEST (ERR -08) 
* 
*     BRN4 USED ONLY BY DOPEN 
*         IS ICR SPECIFIED ?
*         - YES, CHECK THE LEGALITY OF THIS OPEN (BRN41)
*         REJECT (ERR -08) IF ILLEGAL.
*         - NO, SKIP THE CHECKING, IT WILL BE DONE LATER. 
*         => BRN3 
* 
*     BRN3 USED BY DCRET
*         GET A DCB SPACE IN CORE. SWAP AN OLD DCB IF NECESSARY.
*         GET AN RFAMD ENTRY, LINK IT TO THE LIST AND FORMAT IT.
* 
*     BRN1 USED BY DAPOS, DCONT, DLOCF, DPOSN, DREAD, DWIND 
*         AND DWRIT.
*         THE RFAMD ENTRY # PASSED IN THE PARMB IS CHECKED FOR
*         FOR VALIDITY. 
*         THE ENTRY IS LOCATED. 
*         THE DCB IS BROUGHT TO CORE IF CURRENTLY ON DISC.
*         THE RFAMD IS RELINKED:
*         - IF THE DCB WAS ALREADY IN CORE, THE ENTRY IS ADVANCED 
*         ONE POSITION (I.E. INSERTED BEFORE THE ENTRY IN FRONT 
*         ITSELF).
*         - IF THE DCB HAD TO BE BROUGHT TO CORE, THE ENTRY IS
*         INSERTED AS THE "LAST" ENTRY IN THE "DCB IN CORE" PART
*         OF THE RFAMD. 
*         WE THEN GO TO PREPARE THE CALL. 
* 
*     BRN10 FOR DSTAT ONLY
*         CALL FSTAT AND GO DIRECTLY TO THE REPLY SECTION 
* 
*     BRN6 FOR FLUSH ONLY 
*         - DELETE THE PROPER RFAMD TABLE ENTRIES AND RETURN
*         TO THE DCB FREE LIST THE DCB SPACES WHICH ARE NOT 
*         ANY MORE NEEDED.
*         - MAKE A DECISION ON WETHER OR NOT WE HAVE TO CLOSE 
*         THIS FILE. IF YES, JMP BRN9 FOR STANDARD CLOSE, ELSE
*         JMP BRN7 FOR TERMINATION. 
* 
* 
*  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 PARMB, 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 PARMB. 
*         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. 1977
      SPC 3 
* 
*     HERE FOR DCLOS
* 
BRN2  JSB ENTCK     CHECK THE VALIDITY OF THE ENTRY # 
      STA CRFAD     ENTRY # OK. A = ADDRESS OF ENTRY. 
      ADA D2        STEP TO THE FILE NAME 
      LDB FNAMA     GET THE DESTINATION ADDRESS 
      MVW D4        MOVE THE FILE NAME AND THE CRN
* 
      LDA FIRST     SET THE START POINTER TO
      STA PNTR1       SEARCH FROM THE FIRST ENTRY.
* 
BRN21 JSB SERCH     SEARCH THE LIST 
      JMP BRN9      UNSUCCESFUL SEARCH => OK
* 
*     SUCCESSFUL SEARCH. IS IT US ? 
* 
      LDA PNTR1     GET SEARCH POINTER
      CPA CRFAD     COMPARE TO CURRENT ENTRY
      RSS           YES, US, NO PROBLEM 
      JMP BRN22     NO, FAKE THE CLOSE. 
      LDA PNTR1,I   GET NEXT TO SEARCHED ENTRY
      STA PNTR1     RESET THE SEARCH POINTER
      JMP BRN21     CONTINUE TO SCAN. 
* 
BRN22 CLA           SET FOR NO ERROR
      STA IERR
      JMP BRN7      RETURN
      SPC 3 
* 
*     HERE FOR DPURG AND DNAME
* 
BRN8  JSB BRN84     SET UP FOR LIST SCAN. 
      CLB 
      STB TMPAD 
      JSB SERCH     SCAN THE LIST 
      JMP BRN5      UNSUCCESFUL SEARCH => OK. 
* 
*     IF THE FILE IS OPENED TO US AND ONLY TO US, 
*     WE ARE ALLOWED TO EXECUTE THE REQUEST.
*     PNTR1 POINTS TO THE MATCHING ENTRY
* 
      JSB US?       IS IT OUR ENTRY ? 
      JMP BRN81     NO, NOT US
      STA TMPAD     SAVE ENTRY ADDRESS
      SSB           EXCLUSIVE OPEN ?
      JMP BRN82     YES, WE ARE THE ONLY USER 
* 
      LDA A,I       GET ADDRESS OF NEXT ENTRY 
      STA PNTR1     SET THE POINTER TO CONTINUE THE SEARCH  
      JSB SERCH     DO IT 
      RSS           NO BODY ELSE IN THE GAME, EXECUTE 
      JMP BRN81     SOME ONE ELSE, FORGET IT
* 
      LDA TMPAD     GET ENTRY ADDRESS 
BRN82 STA CRFAD     SET FOR DCB RETREIVAL 
      JSB FNDX      FIND THE ENTRY #
      JMP BRN91     GET THE DCB AND EXEC THE REQ. 
* 
*     SUCCESSFUL SEARCH, WE CANNOT PURGE NOR RENAME A FILE OPEN TO
*     SOMEONE ELSE. 
* 
*     THE FILE WAS FOUND TO BE CURRENTLY OPENED TO SOMEONE. 
*     TO FIND THIS WE MIGHT HAVE HAD TO OPEN THE FILE.
*     IF THE CURRENT OWNER(S) HAD IT NON EXCLUSIVELY OPENED,
*     WE HAVE TO RESTORE THIS STATUS. 
* 
BRN81 LDA DFLFL 
      SZA,RSS       DID WE HAVE TO DO AN OPEN ? 
      JMP ERR08     NO
      LDA PNTR1     GET ADDRESS OF RFAMD ENTRY
      ADA D7        STEP TO THE NODE NUMBER 
      LDA A,I       GET IT
      SSA           "EXCLUSIVE" BIT SET ? 
      JMP ERR08     YES, WE DID NOT CHANGE ANYTHING 
* 
      CLB           SET THE DCB IN
      STB DTBFR+9     "FILE NOT OPEN" STATUS
* 
      JSB OPEN      NO, REOPEN, NON EXCLUSIVELY 
      DEF *+7 
      DEF DTBFR     USE DATA AREA AS DCB
      DEF IERR1 
      DEF PARMB+5    FILE NAME
      DEF D1        OPTION
      DEF PARMB+10  ISECU 
      DEF PARMB+8   ICR 
* 
      JMP ERR08     NOW, SEND ERROR 
      SPC 3 
* 
*     WE COME HERE FOR DOPEN
* 
BRN4  LDA PARMB+8   GET ICR 
      SZA,RSS       PRESENT ? 
      JMP BRN3      NO, WE WILL DO THE CHECKING LATER 
      JSB BRN41     YES 
      JMP BRN3      OK TO OPEN
      JMP ERR08     CANNOT OPEN 
      SPC 3 
* 
*     HERE WE WILL CREATE AN RFAMD ENTRY. 
*     THIS ENTRY WILL BE POSITIONED AT THE END OF THE 
*     LIST OF RFAMD ENTRIES POINTING TO IN-CORE-DCB'S.
*     WE WILL ALSO TAKE CARE OF FINDING A DCB SPACE AND 
*     LINKING IT TO ITS RFAMD ENTRY.
* 
BRN3  LDA BFREE     GET FREE RFAMD-LIST HEAD POINTER
      SZA,RSS       ANY FREE ENTRY ?
      JMP ERR28     NO, REJECT. 
* 
      LDA FCORE     GET FREE DCB-LIST HEAD POINTER. 
      SZA           ANY ROOM IN CORE ?
      JMP CRT1      YES, WE DONT HAVE TO SWAP ANYONE OUT. 
* 
*     SINCE THERE IS NO ROOM FOR ANOTHER DCB IN CORE AT 
*     THIS TIME, WE HAVE TO MAKE SOME ROOM. WE WILL SWAP
*     OUT THE "LAST" DCB. 
* 
      JSB WLAST     WRITE "LAST" DCB TO DISC
* 
      LDA LAST      GET THE ENTRY ADDRESS 
      INA           STEP TO "PREVIOUS" POINTER
      LDB A,I       GET ADDRESS OF PREVIOUS 
      STB LAST      RESET LAST
      ADA D7        STEP TO THE DCB POINTER 
      CLB 
      STB A,I       SET IT FOR "DCB ON DISC"
* 
      JMP CRT2
* 
CRT1  LDB FCORE,I   TAKE 1 DCB OUT OF THE 
      STB FCORE       FREE LIST AND RELINK THE LIST 
      STA LDCB      SAVE THE ADDRESS OF "OUR" DCB 
* 
*     NOW THAT WE HAVE A DCB, LET'S TAKE CARE OF THE RFAMD ENTRY. 
* 
CRT2  LDA BFREE     TAKE 1 OUT OF THE FREE LIST 
      LDB BFREE,I     AND RELINK THE FREE LIST
      STB BFREE 
* 
      STA CRFAD     SAVE ADDRESS OF OUR RFAM ENTRY
      LDB LDCB      GET DCB ADDRESS 
      ADA D8        STEP TO DCB POINTER 
      STB A,I       SET IT
      ADB D9        STEP TO THE OPEN FLAG AND DESTROY IT
      STB B,I       BY MAKING IT DIFFERENT FROM RFAM'S ID SEG ADDRESS 
* 
*     NOW INSERT CRFAD IN THE LIST
* 
      LDA LAST
      SZA           IS THERE ANYTHING IN THIS LIST ?
      JMP CRT3      YES 
* 
*     CRFAD WILL BE THE 1ST ENTRY OF THE LIST.
* 
      LDB CRFAD 
      STB LAST      SET IN-CORE LIMIT 
      LDA FIRST 
      SZA,RSS       IS THE LIST EMPTY ? 
      JMP CRT21     YES 
      JSB INSRT     INSERT
      STA FIRST     RESET THE LIST HEAD 
      JMP BRN31 
* 
CRT21 STB FIRST 
      STA 1,I       NO "NEXT" 
      INB 
      STA 1,I       NO "PREVIOUS" EITHER
      JMP BRN31     ALL DONE FOR THIS CASE. 
* 
*     WE HAVE TO INSERT THE NEW ENTRY AFTER THE "LAST" ONE
* 
CRT3  CPA CRFAD     ALREADY IN PLACE? 
      JMP CRT33     YES 
      LDB CRFAD     ADDR OF CURRENT ENTRY 
      LDA LAST,I    GET NEXT(LAST)
      STA 1,I       STORE IN CURR. ENTRY
      STB LAST,I    LINK OLD LAST TO THIS ONE 
      SZA,RSS       BOTTOM? 
      JMP *+3       YES 
****
      INA 
      STB 0,I 
      INB 
      LDA LAST
      STA 1,I       PREV(CRFAD)=OLD LAST
CRT33 LDA LAST,I    GET "NEXT" OF LAST
      STA LAST      UPDATE LAST 
* 
*     AN RFAMD ENTRY IS CREATED AND LINKED INTO THE LIST. 
*     WE NOW HAVE TO FILL THE BLANKS IN THE RFAMD ENTRY.
* 
BRN31 LDB CRFAD     GET POINTER TO NEW RFAMD ENTRY. 
      ADB D2        STEP TO FILE NAME 
      LDA NAMA
      MVW D3        MOVE THE FILE NAME
      LDA PARMB+8   GET ICR 
      STA B,I       SET IT IN CRFAD 
      LDA PARMB+9   GET THE ID SEGMENT @ OF THE OWNER 
      INB 
      STA B,I 
      LDA PARMB+2   GET ORIGIN NODE 
      INB 
      STA B,I 
* 
*     ALL SET ! 
* 
      JMP BRN5
      SPC 2 
* 
*     SUBROUTINE TO SWAP OUT THE "LAST" IN-CORE DCB.
*     FIRST FIND ITS DISC ADDRESS.
* 
WLAST NOP 
      LDA LAST      GET CORE ADDRESS OF RFAMD ENTRY.
      JSB FNDX      FIND ENTRY #
      JSB CALDS     CALCULATE DISC ADDRESS
* 
      LDA LAST      NOW FIND ITS CORE ADDRESS 
      ADA D8        STEP TO DCB ADDRESS 
      LDB A,I       GET IT
      STB LDCB      SAVE
* 
      ADB D12       STEP TO FILE POSITION POINTER 
      CBX           SAVE THE ADDRESS
      LDB B,I       GET THE POINTER 
      LDA LDCB      GET THE DCB ADDRESS 
      CMA,INA       SUBTRACT FROM FILE POSITION 
      ADB A          POINTER TO FORM RELATIVE POINTER.
      STX A         RETRIEVE POINTER ADR
      STB A,I       SET RELATIVE POINTER INTO DCB 
* 
      JSB EXEC      NOW WRITE THE DCB 
      DEF *+7         ON THE DISC.
      DEF D2I       WRITE 
      DEF IDISC     DISC LU 
      DEF LDCB,I    CORE ADDRESS
      DEF D144      LENGTH
      DEF CTRK      TRACK # 
      DEF CSCT      SECTOR ADDRESS
* 
      JMP DSCER     DISC ERROR
* 
      JMP WLAST,I   RETURN
      SPC 3 
* 
*     PREPROCESSOR FOR FLUSH
* 
BRN6  CLA 
      STA IERR      SET FOR NO ERROR IN CASE OF NO ENTRY
      STA TMPNX     SET A FLUSHED ENTRY COUNTER 
      STA FLFLG     SET A FLUSH FLAG TO INDICATE THE
*     ABSENCE/PRESENCE OF ENTRIES CORRESPONDING TO THIS FILE
*     WHICH MUST NOT BE FLUSHED.
      LDA NAMA
      LDB FNAMA     SET THE FILE ID FOR THE SEARCH
      MVW D4
      LDA FIRST 
      STA PNTR1     SEARCH FROM THE START 
      JSB BRN62 
      JMP ERR11     NO ENTRY MATCHES, GIVE "DCB" NOT OPEN 
* 
      ISZ TMPNX     INC THE ENTRY COUNTER 
      LDA PNTR1     SAVE THE ENTRY @, WE WILL 
      STA TMPAD       USE IT FOR THE CLOSE
BRN61 LDA PNTR1,I   CONTINUE THE SEARCH 
      STA PNTR1 
      JSB BRN62 
      JMP BRN64     ALL DONE
      ISZ TMPNX     ONE MORE
      LDA PNTR1 
      JSB DELET     DELETE THIS ENTRY 
      JMP BRN61     CONTINUE
* 
BRN64 LDA TMPAD 
      LDB FLFLG     GET THE FLUSH FLAG
      SZB           DO WE CLOSE THIS FILE ? 
      JMP BRN65     NO
      STA CRFAD     SET THE ENTRY ADDRESS FOR THE CLOSE 
      LDA D8
      STA RQLN
      JMP BRN9      GO FOR A CLOSE
* 
BRN65 JSB DELET     DELETE THIS ENTRY 
      JMP BRN7      AND RETURN. 
      SPC 3 
* 
*     HERE WE DO THE COMMON PART OF NEARLY EVERY REQUEST
* 
BRN1  JSB ENTCK     FIRST, CHECK THE VALIDITY OF THE ENTRY. 
      STA CRFAD     SAVE THE ADDRESS OF THE CURRENT ENTRY.
* 
*     IN THIS PART, KNOWING THE ADDRESS OF THE CURRENT RFAMD
*     ENTRY (CRFAD) WE WILL DETERMINE IF THE MATCHING DCB 
*     IS IN CORE OR ON DISC. IF THE DCB IS ON DISC, IT WILL 
*     BE BROUGHT UP TO CORE. THIS MAY REQUIRE THE SWAPPING OUT
*     OF ANOTHER DCB. 
* 
BRN9  LDA PARMB+6   GET THE ENTRY # 
BRN91 STA SWNX        AND SAVE IT FOR THE DISC ACCESS 
      LDA CRFAD     GET POINTER TO THE ENTRY. 
      ADA D8        STEP TO THE DCB POINTER 
      LDA A,I       GET IT
      SZA           IS DCB ON DISC ?
      JMP CASE1     NO
* 
*     SINCE WE HAVE TO BRING THE DCB INTO CORE, WE HAVE 
*     TO FIND ROOM FOR IT.
* 
      LDA FCORE     GET FREE DCB LIST HEAD POINTER
      SZA           ANY FREE DCB SPACE ?
      JMP SWIN1     YES, SWAP IN ONLY.
* 
*     WE WILL SWAP OUT THE "LAST" IN-CORE DCB.
* 
      JSB WLAST     WRITE "LAST" DCB TO DISC
* 
      LDB LAST
      ADB D8        STEP TO THE DCB POINTER 
      CLA 
      STA B,I       SET IT FOR DCB ON DISC
      STA TMP1      THIS FLAG MEANS THAT WE HAD TO SWAP OUT 
      JMP SWIN2 
* 
SWIN1 STA LDCB      SAVE ADDRESS OF LOCAL DCB 
      LDA LDCB,I    GET "NEXT" TO LDCB
      STA FCORE     RELINK THE DCB FREE LIST
      CCA 
      STA TMP1      SET THE FLAG TO "NO SWAP OUT" 
* 
SWIN2 LDA SWNX      GET NUMBER OF RFAMD ENTRY 
      JSB CALDS     FIND WHERE OUR DCB IS ON DISC 
* 
      JSB EXEC      GET THE DCB INTO CORE 
      DEF *+7 
      DEF D1I 
      DEF IDISC 
      DEF LDCB,I
      DEF D144      DCB LENGTH
      DEF CTRK      TRACK # 
      DEF CSCT      SECTOR NUMBER 
* 
      JMP DSCER     DISC ERROR
* 
*     NOW THAT THE DCB IS IN, RESET THE DCB POINTER IN CRFAD
*     AND THE FILE POSITION POINTER IN THE DCB. 
* 
      LDA CRFAD 
      ADA D8        STEP TO DCB POINTER 
      LDB LDCB      GET ADDRESS OF DCB
      STB A,I       SET THE POINTER 
      ADB D12       STEP TO RELATIVE FILE POSITION PTR
      LDA B,I       GET IT
      ADA LDCB      ADD DCB ADR TO FORM ABSOLUTE FILE 
      STA B,I        POSITION POINTER & SET INTO DCB. 
* 
*     NOW IS TIME TO RELINK THE RFAMD LIST. 
*     WE HAVE 3 SEPARATE CASES: 
*                       1) THE DCB WAS ALREADY IN CORE. WE SWITCH 
*                   CRFAD WITH ITS PREVIOUS ENTRY EXCEPT IF CRFAD 
*                   THE FIRST ENTRY. IF CRFAD WAS THE 2ND AND-OR
*                   LAST ENTRY, THE FIRST AND-OR LAST POINTERS
*                   HAVE TO BE RESET. 
*                       2) THE DCB WAS ON DISC AND THERE WAS ROOM 
*                   IN CORE. CRFAD IS INSERTED AFTER THE "LAST" ENTRY,
*                   AND LAST IS RESET TO POINT TO CRFAD. IF BEFORE THE
*                   INSERTION LAST=0 (I.E. THERE IS NO DCB IN CORE )
*                   THEN INSERT CRFAD BEFORE FIRST AND RESET FIRST AND
*                   LAST TO CRFAD.
*                       3) THE DCB WAS ON DISC AND THERE WAS NO ROOM
*                   IN CORE. INSERT CRFAD BEFORE LAST AND RESET LAST
*                   TO CRFAD. IF FIRST=LAST, RESET ALSO FIRST (CASE 
*                   OF ONLY ONE DCB IN CORE). 
* 
      LDA TMP1      GET FLAG
      SZA,RSS       WHAT CASE IS THIS ? 
      JMP CASE3     GUESS 
* 
*     HERE WE TREAT CASE 2
* 
      LDA LAST      GET ADDRESS OF LAST 
      SZA           LIMIT CASE ?
      JMP CASE2     NO, NORMAL CASE2
      LDA CRFAD     TAKE CRFAD OUT
      JSB COUT        OF LIST.
      LDA FIRST     INSERT IT ON TOP OF THE LIST
      JSB INSRT 
* 
      STA LAST      RESET LAST
      STA FIRST     RESET FIRST 
      JMP BRN5      ALL DONE. 
* 
*     NOW FOR REAL CASE 2 
* 
CASE2 LDA LAST,I    GET NEXT TO LAST
      CPA CRFAD     CRFAD ALREADY IN PLACE? 
      JMP CAS21     YES, NO INSERTION NECESSARY.
      LDA CRFAD 
      JSB COUT      TAKE CRFAD OUT OF ITS LIST. 
      LDA LAST,I    SET POINTER 
      JSB INSRT         OF CRFAD AFTER LAST.
* 
CAS21 STA LAST      RESET LAST. 
      JMP BRN5      ALL DONE FOR CASE2
* 
*     HERE ON CASE 3
* 
CASE3 LDA CRFAD 
      JSB COUT      TAKE CRFAD OUT OF THE LIST
      LDA LAST      SET POINTER 
      JSB INSRT         CRFAD BEFORE LAST 
      STA LAST      RESET LAST
      LDB 0 
      INA           STEP TO PREVIOUS OF CRFAD 
      LDA A,I       GET IT
      SZA,RSS       IS CRFAD FIRST NOW ?
      STB FIRST     RESET FIRST TO CRFAD. 
      JMP BRN5      GO AWAY 
* 
*     HERE FOR CASE 1 
* 
CASE1 STA LDCB      SAVE ADDRESS OF DCB 
      LDA CRFAD 
      CPA FIRST     ALREADY TOP OF LIST?
      JMP BRN5      YES, DONE 
* 
      JSB COUT      REMOVE CRFAD FROM ITS SLOT
      LDA CRFAD 
      INA 
      LDA A,I       GET PREV(CRFAD) 
      JSB INSRT       BEFORE PREVIOUS.
* 
      INA 
      LDA A,I       GET PREV(CRFAD) 
      SZA           IS CRFAD NOW FIRST ENTRY ?
      JMP CAS11     NO
      LDA CRFAD     YES, GET ITS ADDRESS AGAIN
      STA FIRST     RESET FIRST.
* 
CAS11 LDB CRFAD,I   GET ADDR OF NEXT
      LDA LAST      WAS LAST POINTING TO CRFAD
      CPA CRFAD       BEFORE THE SWITCH ? 
      STB LAST      YES, RESET LAST TO CRFAD(NEXT)
      JMP BRN5      ALL DONE
      SPC 3 
* 
*     HERE FOR DSTAT. THIS IS A SPECIAL CALL, IT DOES NOT 
*     NEED ANY DCB. SPECIAL TREATMENT.
* 
BRN10 JSB FSTAT 
      DEF *+2 
      DEF DTBFR     STATUS BUFFER 
* 
      CLA 
      STA IERR      SET FOR NO ERROR
      LDB D125      SET THE LENGTH OF THE 
      JMP PST01     DATA BUFFER & RETURN
      SPC 3 
* 
*     HERE WE BRANCH TO THE PROPER CALL SETUP ROUTINE.
* 
BRN5  LDA PARMB+4   GET THE FUNCTION CODE 
      ADA JSBTB     ADD POINTER TO FMP CALL DEF-TABLE 
      LDA A,I       GET ADR OF FMP CALL 
      STA CALLI     SET IT
      LDA PARMB+4   GET FCODE AGAIN 
      ADA BLDTB     MAP IN "BUILD" TABLE
      JMP A,I       GO PREPARE THE CALL TO FMP
* 
      SPC 3 
* 
*     CALL BUILDER FOR DAPOS,DCLOS,DCONT,DPOSN,DWIND
* 
BLD0  LDB PARAM     GET @ OF NEXT PARAM DEST. 
* 
BLD02 LDA RQLN      GET THE REQUEST LENGTH
      CMA,INA 
      ADA D8        SET A PARAMETER COUNTER 
      SZA,RSS       NO PARAMETER ?
      JMP BLD01 
      STA CNTR1 
      LDA BPARM     GET ADDRESS OF PARMB
      ADA D8        STEP TO NEXT PARAMETER ORIGIN 
* 
BLDCM STA B,I       SAVE IN CALL
      INB 
      INA           STEP TO NEXT PARAM
      ISZ CNTR1     DONE ?
      JMP BLDCM     NO
* 
BLD01 STB CALL+1    SET THE RETURN ADDRESS
      JSB NOPS      CLEAN THE END OF THE BUFFER 
      JMP CALL      EXECUTE THE CALL
      SPC 3 
* 
*      CALL BUILDER FOR DCRET 
* 
BLD3  LDA BPARM     GET @ OF PARMB
      ADA D5        STEP TO NAME
      STA LDCB+2
      ADA D6        STEP TO SIZE
      STA LDCB+3
      ADA D2        STEP TO TYPE
      STA LDCB+4
* 
      LDA CRFAD     GET THE ADDRESS OF THE RFAMD ENTRY
      ADA D7        STEP TO THE NODE #
      LDB A,I       GET IT
      CCE 
      RBL,ERB       SET THE EXCLUSIVE-OPEN BIT
      STB A,I       RESTORE THE WORD
* 
      LDB PARAM 
      ADB D3        SET B TO CURRENT RETURN 
* 
*     THE FOLLOWING PART IS COMMON TO DCRET, DNAME,DOPEN
*     AND DPURG, IT SETS THE SECURITY CODE AND THE CRN IN THE CALL
* 
BLD31 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  LDB PARAM 
      LDA DM7 
      STA CNTR1     USE AS PARAMETER COUNTER
      LDA BPARM     GET ADDRESS OF PARMB
      ADA D7        STEP TO 1ST RETURN PARAMETER
BLD41 STA B,I       SET @ OF RETURN PARAM. IN CALL
      INA           INC PARAMETER @ 
      INB           INC CALL POINTER
      ISZ CNTR1     ALL DONE ?
      JMP BLD41     NO, CONTINUE
      JMP BLD01     YES, COMPLETE AND EXECUTE 
      SPC 3 
* 
*     CALL BUILDER FOR DNAME
* 
BLD5  LDA BPARM     GET @ OF PARMB
      ADA D5        STEP TO NAME
      STA LDCB+2    SET @ OF NAME IN CALL 
      ADA D6        GET @ OF NNAME
      STA LDCB+3    SET IN CALL 
      LDB PARAM 
      ADB D2        SET FOR THE REST
      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 
                                                                                                                                                                                                                          