ASMB,R,L,C
      HED (FMGR) CO.UT: COPY COMMAND UTILITY ROUTINES 
*     NAME:    CO.UT
*     SOURCE:  92071-18317
*     RELOC:   92071-16317
*     PGMR:    E.D.B. 
* 
*  ***************************************************************
*  * (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 HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM CO.UT,7 92071-1X317 REV.2041 800630 
* 
      ENT CLR.C, IF.ER, CK.NM 
* 
      EXT DR.RD, MSS. 
      EXT PK.DR, CAM.O, C.BUF, INT. 
      EXT CRLK, CRULK 
      EXT REIO, .ENTR 
      SUP 
      SKP 
* 
*     DESCRIPTION 
* 
*     CLR.C: CLEAR DESTINATION DISC 
* 
*     THIS ROUTINE PURGES ALL FILES FROM A CARTRIDGE EXCEPT BOOTEX. 
*     IF BOOTEX IS FOUND AS THE FIRST FILE IN THE DIRECTORY, IT 
*     IS LEFT INTACT, OTHERWISE, IT IS PURGED.
* 
*     CALLING SEQUENCE: 
* 
*     CALL CLR.C(LU)
* 
*     WHERE:
* 
*     LU      IS THE +CRN/-LU OF THE DISC CARTRIDGE TO BE CLEARED 
* 
* 
*     IF.ER: TRAP FMP ERRORS
* 
*     THIS ROUTINE WILL TEST THE PASSED ERROR CODE. IF THE ERROR
*     CODE IS NEGATIVE (FMP ERROR), IT WILL BE PRINTED ONTO THE 
*     LOG LU, AND RETURN TO THE LOCATION SPECIFIED IN THE PARAMETER 
*     LIST. OTHERWISE, NOTHING WILL BE DONE, AND THE ROUTINE WILL 
*     ROUTINE NORMALLY. 
* 
*     CALLING SEQUENCE: 
* 
*     CALL IF.ER(ERR,ERLBL) 
* 
*     WHERE:
* 
*     ERR     IS THE SUSPECTED ERROR CODE 
* 
*     ERLBL   IS THE ADDRESS TO RETURN IF AN ERROR IS DETECTED
* 
* 
*     CK.NM: CHECK NAME FOR EQUALITY
* 
*     CALLING SEQUENCE: 
* 
*     CALL CK.NM(NAME1,NAME2) 
* 
*     WHERE:
* 
*     NAME1   IS THE FIRST NAME TO BE CHECKED 
* 
*     NAME2   IS THE SECOND NAME TO BE CHECKED
* 
*     THE E-REGISTER WILL BE CLEARED (0) IF NAMES ARE EQUAL 
      SKP 
* 
*     CLR.C 
* 
LU    NOP 
* 
CLR.C NOP 
      JSB .ENTR     GET PARAMETERS
      DEF LU
* 
*     PROCESS REQUEST 
* 
      LDA INT.      GET INTERACTIVE FLAG
      SZA,RSS       IF NOT INTERACTIVE, 
      JMP CLR.5      THEN ASSUME HE KNOWS WHAT HE'S DOING 
* 
*     MAKE SURE HE KNOWS WHAT HE'S DOING
* 
REPRM JSB REIO      OUTPUT FMGR 060 ERROR 
      DEF *+5 
      DEF .2
      DEF CAM.O 
      DEF PRMNT 
      DEF .31 
* 
      LDA CAM.O     GET OUTPUT LOG LU 
      IOR B400       SET OPTION 
      STA ADDR        AND SAVE
* 
      JSB REIO      GET RESPONSE
      DEF *+5 
      DEF .1
      DEF ADDR
      DEF C.BUF 
      DEF .36 
* 
      SSA           IF NO RESPONSE
      JMP REPRM      THEN REPROMPT USER 
* 
      LDA C.BUF     GET RESPONSE
      CPA .YE       IF YES, 
      JMP CLR.5      THEN CONTINUE
* 
      CPA .NO       IF NO,
      JMP ER60       THEN EXIT
      JMP REPRM      ELSE REPROMPT
      SKP 
* 
*     GET OLD DIRECTORY AND FIX UP
* 
CLR.5 JSB DR.RD     READ IN FIRST BLOCK OF DIRECTORY
      DEF *+4 
      DEF .1
      DEF LU,I
      DEF ZERO
* 
      JSB CK.NM     CHECK IF FIRST NAME IS BOOTEX 
      DEF *+3 
      DEF PK.DR+16
      DEF "BOOT 
* 
      SEZ           IF ALL THREE WORDS CORRECT, 
      JMP NBOOT      THEN DO NO BOOT STUFF
* 
      LDA PK.DR+6   GET WORD CONTAINING SECTORS / TRACK 
      AND B377       ISOLATE SECTORS / TRACK
      STA SC/TR       SAVE
* 
      LDA PK.DR+21  GET BOOTEX SECTOR ADDRESS 
      ADA PK.DR+22   ADD BOOTEX SIZE
      CLB             CLEAR FOR DIVIDE
      DIV SC/TR        DIVIDE INTO TRACK AND SECTOR 
      ADA PK.DR+20  ADD BOOTEX TRACK ADDRESS
* 
      STA PK.DR+9   SAVE NEXT AVAILABLE TRACK 
      LDA PK.DR+5   GET WORD CONTAINING NEXT AVAILABLE SECTOR 
      AND NB400      ISOLATE CPU USE FIELD
      IOR B           MERGE WITH NEXT AVAILABLE SECTOR
      STA PK.DR+5      SAVE AGAIN 
* 
      LDA .32       LOCATE NEW END OF DIRECTORY OFFSET
      JMP WRIT
* 
NBOOT LDA PK.DR+4   GET FIRST FMP TRACK FROM CARTRIDGE HEADER 
      STA PK.DR+9    SAVE AS NEXT AVAILABLE TRACK 
      LDA PK.DR+5   GET WORD CONTAINING NEXT AVAILABLE SECTOR 
      AND NB400      CLEAR SECTOR FIELD 
      STA PK.DR+5     SAVE AGAIN
* 
      LDA .16       LOCATE NEW END OF DIRECTORY OFFSET
      SKP 
* 
*     WRITE OUT NEW DIRECTORY 
* 
WRIT  STA B         COPY OFFSET INTO B
      ADA N128      CALCULATE NUMBER OF WORDS TO ZERO 
      STA COUNT 
      ADB APK.D     CALCULATE FIRST WORD TO ZERO
      CLA           FETCH A ZERO
* 
CLR.3 STA B,I       SET A ZERO
      INB           INCREMENT ADDRESS 
      ISZ COUNT     IF NOT FINISHED,
      JMP CLR.3      THEN DO ANOTHER WORD 
* 
      JSB CRLK      LOCK CARTRIDGE
      DEF *+2 
      DEF LU,I
* 
      SZA           IF ERROR OCCURED, 
      JMP EREX       THEN EXIT
* 
      JSB DR.RD     WRITE OUT NEW FIRST BLOCK 
      DEF *+4 
      DEF .2
      DEF LU,I
      DEF ZERO
* 
      LDA N128      SET 
      STA COUNT      COUNT TO -128
      LDB APK.D     GET ADDRESS OF BUFFER 
      CLA           FETCH A ZERO
      STA BLK        CLEAR BLK
* 
CLR.2 STA B,I        ZERO OUT BUFFER
      INB           INCREMENT ADDRESS 
      ISZ COUNT     IF NOT FINISHED,
      JMP CLR.2      THEN DO ANOTHER WORD 
* 
CLR.1 ISZ BLK       INCREMENT BLOCK 
      JSB DR.RD     WRITE OUT NEW BLOCK 
      DEF *+4 
      DEF .2
      DEF LU,I
      DEF BLK 
* 
      SEZ,RSS       IF WRITE OK,
      JMP CLR.1      THEN WRITE OUT ANOTHER BLOCK 
* 
      JSB CRULK     UNLOCK THE CARTRIDGE
      DEF *+2 
      DEF LU,I
* 
      CLA           NO ERROR INTENDED 
      JMP CLR.C,I   RETURN
* 
ER60  LDA .60       SET FMGR 60 ERROR 
* 
EREX  JMP CLR.C,I   RETURN
      SKP 
* 
*     IF.ER 
* 
ERR   NOP 
RTN   NOP 
* 
IF.ER NOP 
      JSB .ENTR     GET PARAMETERS
      DEF ERR 
* 
*     PROCESS REQUEST 
* 
      LDA ERR,I     GET SUSPECTED ERROR 
      SSA,RSS       IF NOT ERROR, 
      JMP IF.ER,I    THEN RETURN
* 
      ADA N2000     SUBTRACT 2000 SO WE DON'T TRANSFER CONTROL
      STA ERR        AND SAVE FOR MSS 
* 
      JSB MSS.      PRINT ERROR 
      DEF *+2 
      DEF ERR 
* 
      JMP RTN,I     AND TAKE ERROR RETURN 
      SKP 
* 
*     CK.NM: CHECK NAME 
* 
NAME1 NOP 
NAME2 NOP 
* 
CK.NM NOP 
      JSB .ENTR 
      DEF NAME1 
* 
*     PROCESS REQUEST 
* 
      LDB N3        PRESET COUNTER TO -3
      LDA NAME1,I   GET 2 CHARS FROM NAME 
      CPA NAME2,I   IF SAME AS IN TABLE,
      INB            THEN BUMP COUNTER
* 
      ISZ NAME1     BUMP TO NEXT WORDS
      ISZ NAME2 
      LDA NAME1,I 
      CPA NAME2,I   IF SAME AS IN TABLE,
      INB            THEN BUMP COUNTER
* 
      ISZ NAME1     BUMP TO LAST WORDS
      ISZ NAME2 
      LDA NAME1,I 
      CPA NAME2,I   IF SAME AS IN TABLE,
      INB            THEN BUMP COUNTER
* 
      CLE,SZB       IF NAME DON'T MATCH,
      CCE            THEN SET E FOR FAILURE 
      JMP CK.NM,I   RETURN
      SKP 
* 
*     STORAGE AREA
* 
ZERO  NOP 
* 
.1    DEC 1 
.2    DEC 2 
.16   DEC 16
.31   DEC 31
.32   DEC 32
.36   DEC 36
.60   DEC 60
* 
N3    DEC -3
N128  DEC -128
N2000 DEC -2000 
* 
B377  OCT 377 
B400  OCT 400 
NB400 OCT -400
* 
.YE   ASC 1,YE
.NO   ASC 1,NO
"BOOT ASC 3,BOOTEX
PRMNT ASC 24,FMGR 060 DO YOU REALLY WANT TO PURGE THIS DISC?
      ASC  6,(YES OR NO). 
      OCT 20137     CR + LF 
* 
APK.D DEF PK.DR 
* 
BLK   NOP           CURRENT BLOCK NUMBER
COUNT NOP 
ADDR  NOP 
SC/TR NOP           SECTORS/TRACK 
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                                                                                                                          