ASMB,R,L,C
*     NAME:   DCMCF 
*     SOURCE: 92064-18101 
*     RELOC:  92064-16058 
*     PGMR:   G.L.M.
* 
*  ***************************************************************
*  * (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 HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
* 
      NAM DCMCF,7  92064-16058  REV.1709  770323
* 
* 
      ENT DCMC
      EXT EXEC,.ENTR,CLD.R,.P1,.P2,.P3,.P4,.P5
      EXT $CDIR 
* 
*     MOUNT/DISMOUNT SUBROUTINE 
* 
*     CALLING SEQUENCE: JSB DCMC
*                       DEF RTN 
*                       DEF WHICH 
*                       DEF LUDRN 
*                       DEF LSTRK   (OPTIONAL)
*                  RTN  SZA 
* 
*     ON RETURN     A=OPERATION STATUS
*                A=0: GOOD OPERATION
*                A#0: FMP ERROR CODE
* 
*            WHICH=0: FOR MOUNT OPERATION 
*                 #0: FOR DISMOUNT OPERATION
* 
*            LUDRN= +DRN/-LU (ON MOUNT: +-LU) 
* 
*            LSTRK= OPTIONAL LAST TRACK INFORMATION 
*                       USED IN MOUNT CALL
* 
DCMC  NOP 
      CLA 
      STA CALL
      STA LSTRK 
      STA SECTR 
      STA SEC.T 
      LDA DCMC
      STA EXIT
      JMP EXIT+1
* 
CALL  NOP 
LUDRN NOP 
LSTRK NOP 
EXIT  NOP 
      JSB .ENTR 
      DEF CALL
      LDA LUDRN,I 
      SSA 
      CMA,INA 
      STA LU
      LDB CALL,I    FETCH CALL TYPE 
      SZB 
      JMP DISM      DO DISMOUNT WORK
* 
*    NOTE FALL THRU TO MOUNT WORK 
* 
      SKP 
*     MOUNT CARTRIDGE SUBROUTINE
*     THIS ROUTINE PERFORMS THE FOLLOWING:
*      -CHECK DRIVER TYPE (MUST BE DISC)
*      -DETERMINE MAX LAST TRACK
*      -DOES VALIDITY CHECK ON DISK 
*     PASSES CONTROL TO DIRECTORY MANAGER (D.RFP) WHO THEN: 
*      -FINDS DIRECTORY SPACE 
*      -CHECKS FOR DUPLICATE DRN OR LU
*      -WRITES DIRECTORY ENTRY IN MEMORY RESIDENT LIBRARY (%TBLFP)
* 
      JSB EXEC      GET STATUS ON LU
      DEF STRTN     TO DETERMINE DRIVER TYPE
      DEF STCOD     (100015B) 
      DEF LU
      DEF EQT5
STRTN JMP BADLU     IF LU IS UNDEFINED, EXIT
      LDA EQT5
      AND DTYPE     (36000B)
      CPA DISC      (14000B)
      JMP GDLU
BADLU LDA =D-18 
      JMP EXIT,I
*     CHECK FOR DVR30, IF SO, SKIP THIS SECTION 
GDLU  LDA EQT5
      AND TFLD      TYPE CODE FIELD (37400B)
      CPA DISC      TYPE 30 ? 
      JMP DVR30       YES 
      LDA =D9999
      STA TRACK     REQUEST READ FROM TRACK 9999
      JSB RD128     RETURNS ACTUAL LAST TRACK IN B
      CCA 
      ADB A 
*     IF LAST TRACK NOT GIVEN, USE MAX LAST TRACK 
      LDA LSTRK,I   PASSED LAST TRACK 
      SZA,RSS         IF ZERO 
      JMP DVR30+1       USE MAX LAST TRACK
*     LAST TRACK CANNOT BE > MAX LAST TRACK 
      CMA,INA 
      ADB A         SUBTRACT FROM MAX 
      LDA =D56
      SSB 
      JMP EXIT,I    (LAST TRACK IS > MAX) 
DVR30 LDB LSTRK,I 
      LDA =D55
      SZB,RSS 
      JMP EXIT,I
      STB TRACK 
*     READ CARTRIDGE DIRECTORY
      JSB RD128     READ SECTOR 0 OF DIRECTORY TRACK
*    DO VALIDITY CHECK ON DIRECTORY 
* 
      LDA DBUF      FIRST WORD
      SSA,RSS         MUST HAVE SIGN SET
      JMP NOINT     (NOT INITIALIZED) 
      LDA DBF3       WORD 3 (DRN) MUST BE POS NON-ZERO
      SSA,RSS 
      SZA,RSS 
      JMP NOINT 
      LDA DBF8       WORD 8(# OF DIRECTORY TRACKS MUST BE NEG)
      SSA,RSS 
      JMP NOINT 
      LDA DBF7      FETCH LOWEST DIRECTORY TRACK
      CMA,INA        SET IT NEG 
      ADA DBF4      FIRST AVAIL. MUST BE < DIRECT.
      SSA,RSS 
      JMP NOINT 
      LDB DBF9      NEXT AVAIL. FMP TRACK 
      SSB           MUST BE A POSITIVE VALUE
      JMP NOINT 
      CMB,INB 
      ADB DBF7            AND--MUST BE LESS THAN OR EQUAL 
      SSB            TO LOWEST DIRECTORY TRACK
      JMP NOINT 
* IT IS OK!, SET UP DIRECTORY MANAGER CALL
      LDA =D7       P1=7
      STA .P1 
      LDA LU        P2=-LU
      STA .P3 
      CMA,INA       P3=LU 
      STA .P2 
      LDA TRACK     P4=LAST TRACK 
      STA .P4 
      LDA DBF3      P5=DISC REFERENCE 
      STA .P5 
      CLA 
      LDB =D-2
      JSB CLD.R     GOTO DIRECTORY MANAGER
*     FETCH ERROR RETURN
      LDA B,I       (B IS POINTING TO ERROR)
      JMP EXIT,I
* 
*   DISC WAS NOT INITIALIZED SO RETURN -100 IN (A)
* 
NOINT LDA =D-100
      JMP EXIT,I
* 
* 
STCOD OCT 100015
EQT5  EQU CALL
LU    NOP 
LUD   EQU CALL
SECTR NOP 
TRACK NOP 
SEC.T NOP 
CNT   NOP 
* 
XEQT  EQU 1717B 
CDIR  DEF $CDIR 
* 
.1    DEC 1 
.128  DEC 128 
DTYPE OCT 36000 
DISC  OCT 14000 
TFLD  OCT 37400 
DBUF  BSS 128 
DBF3  EQU DBUF+3
DBF4  EQU DBUF+4
DBF7  EQU DBUF+7
DBF8  EQU DBUF+8
DBF9  EQU DBUF+9
* 
A     EQU 0 
B     EQU 1 
*     DISM - DISMOUNT SUBROUTINE PERFORMS THE FOLLOWING*
*      CHECKS FOR ANY FILES ON THIS LU OPEN TO THIS PROGRAM - 
*      CALLS THE DIRECTORY MANAGER TO PLACE A LOCK ON THE 
*      REQUESTED DISC - THIS ASSURES THAT NO  ACTIVE OPEN 
*      FILES EXIST ON THE DISC. 
* 
*      CALLS THE DIRECTORY MANGER TO CLEAR THE DIRECTORY
*      ENTRY FOR THE DISC & CLOSE UP ANY GAPS IN THE
*      DIRECTORY CAUSED BY THE DISMOUNT.
* 
*       ON RETURN (EXIT VIA EXIT,I) 
*                   A=0: ALL IS OK
*                   A#0: A=FMP ERROR CODE 
* 
DISM  LDB =D2 
      STB SKIP1 
      STB SKIP2 
      LDA LUDRN,I 
      SSA,RSS 
      JMP CR        CARTRIDGE REFERENCE GIVEN 
      CLA 
      STA SKIP1 
      LDA =D4 
      STA SKIP2 
CR    LDA CDIR
      STA LUD 
      LDB A,I 
      SZB,RSS 
      JMP NOTFN     END OF CARTRIDGE DIRECTORY
      ADA SKIP1 
      LDB A,I 
      CPB LU
      JMP FOUND     LU/CR FOUND IN DIRECTORY
      ADA SKIP2 
      JMP CR+1
* 
* 
NOTFN LDA =D54      NOT MOUNTED 
      JMP EXIT,I    ILLEGAL TO DISMOUNT 
* 
FOUND LDA LUD,I 
      STA LU
      ISZ LUD 
      LDA LUD,I 
      STA TRACK     LAST TRACK
      CCA 
      STA CNT 
      JSB RD16      READ SECTOR 0 OF DIRECTORY TRACK
      LDA DBUF+6
      CMA,INA 
      STA SEC.T     - SECTORS PER TRACK 
FLP   JSB RD16      READ DIRECTORY ENTRY FOR FILE 
      LDB A,I       A= ADDRESS OF DIRECTORY ENTRY 
      SZB,RSS 
      JMP OK        END OF DIRECTORY - NO OPEN FILES
      CMB,SZB,RSS 
      JMP FLP       PURGED FILE - SKIP TO NEXT
      ADA =D9 
      LDB A,I       OPEN FLAG 
      ELB,CLE,ERB   CLEAR 'EXCLUSIVE' BIT 
      LDA =D-8
      CPB XEQT
      JMP EXIT,I    LOCK REJECTED - OPEN FILE 
      JMP FLP       SEARCH ALL OF DIRECTORY 
* 
* 
RD128 NOP           READ A BLOCK
      JSB EXEC
      DEF R128X 
      DEF .1
      DEF LU
BUFAD DEF DBUF
      DEF .128
      DEF TRACK 
      DEF SECTR 
R128X JMP RD128,I 
* 
* 
RD16  NOP           GET ADDRESS OF NEXT DIRECTORY ENTRY 
      ISZ CNT 
      JMP RD.SK     SKIP READ - ALREADY IN BUFFER 
      LDA =D-8
      STA CNT 
      JSB RD128     READ A BLOCK
      LDA SECTR 
      ADA =D14
      LDB A 
      ADB SEC.T     NEXT SECTOR = (BLOCK*14) MOD SEC.T
      SSB 
      LDB A 
      STB SECTR 
      CCA 
      ADA TRACK 
      SZB,RSS       IF SECTOR ZERO
      STA TRACK       GO TO NEXT DIRECTORY TRACK
RD.SK LDA =D8 
      ADA CNT 
      MPY =D16
      ADA BUFAD     ADDRESS OF ENTRY IN 'A' 
      JMP RD16,I
* 
* 
OK    LDA =D3       SET FUNCTION CODE 
      STA .P1         FOR DISC LOCK 
      LDA LUDRN,I   FETCH THE -LU/DRN 
      STA .P2         SET FOR DIRECTORY MANAGER 
      JSB CLD.R     GOTO CLD.R
      LDA B,I       FETCH ERROR CODE
      SZA 
      JMP EXIT,I    ERROR EXIT
*     DISC IS LOCKED SO NO OPEN FILES EXIST 
*     SET UP DISMOUNT CALL TO DIRECTORY MANAGER 
* 
      LDA =D7       SET FUNCTION CODE 
      STA .P1         FOR DIRECTORY MODIFICATION
* 
*     .P2 STILL CONTAINS THE -LU/DRN
* 
      CLB           SET P3=0 & SUBFUNCTION (P7 WHICH
      STB .P3        IS PASSED VIA B) =0 FOR DISMOUNT 
      JSB CLD.R 
      LDA B,I       FETCH ERROR CODE
      JMP EXIT,I
* 
SKIP1 EQU RD128 
SKIP2 EQU RD16
      END 
                                                                                                                        