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