ASMB,R,L,C HED (FMGR) CO.UT: COPY COMMAND UTILITY ROUTINES * NAME: CO.UT * SOURCE: 92070-18317 * RELOC: 92070-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 92070-1X317 REV.2014 800331 * ENT CLR.C, DR.CT, IF.ER, CK.NM * EXT DR.RD, MSS., F.TST, LOCK. EXT PK.DR, CAM.O, C.BUF, INT. 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 * * DR.CT: CREATE PSEUDO-DIRECTORY * * THIS ROUTINE CREATES A PSEUDO-DIRECTORY IN LOCAL MEMORY * FROM THE CARTRIDGE DIRECTORY OF THE CARTRIDGE SPECIFIED. * A MAXIMUM OF DIRMX FILES ARE STORED INTO THE NAME ARRAY, * WITH THE FILE'S NAME, TYPE, NUMBER OF EXTENTS, SIZE, * AND SECURITY CODE BEING STORED. THE MORE FLAG WILL BE * SET IF ALL OF THE ENTRIES IN THE DIRECTORY HAVE NOT BEEN * SCANNED. * * CALLING SEQUENCE: * * CALL DR.CT(LU,NAME,DIRMX,DIRLN,MORE) * * WHERE: * * LU IS THE +CRN/-LU OF THE DISC CARTRIDGE TO BE USED * * NAME WILL BE THE PSEUDO-DIRECTORY (8 X DIRMX WORD ARRAY) * * DIRMX IS THE LENGTH OF THE NAME ARRAY * * DIRLN WILL BE THE ACTUAL LENGTH OF THE RETURNED DIRECTORY * * MORE WILL BE NON-ZERO IF THERE IS MORE DIRECTORIES TO BE * READ * * 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+4 GET FIRST FMP TRACK FROM CARTRIDGE HEADER STA PK.DR+9 SAVE AS NEXT AVAILABLE TRACK LDA PK.DR+5 GET FIRST AVAILABLE SECOTR FROM HEADER AND NB400 CLEAR SECTOR FIELD ADA PK.DR+22 ADD BOOTEX SIZE 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 FIRST AVAILABLE SECTOR FROM HEADER 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 LOCK. LOCK CARTRIDGE DEF *+3 DEF LU,I DEF .3 LOCK REQUEST * SEZ IF COULDN'T LOCK, JMP ER60 THEN TAKE ERROR 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 LOCK. UNLOCK THE CARTRIDGE DEF *+3 DEF LU,I DEF .5 * CLA NO ERROR INTENDED JMP CLR.C,I RETURN * ER60 LDA .60 SET FMGR 60 ERROR JMP CLR.C,I RETURN SKP * * DR.CT * SLU NOP NAME NOP DIRMX NOP DIRLN NOP MORE NOP FIRST NOP LAST NOP * DR.CT NOP JSB .ENTR GET PARAMETERS DEF SLU * * PROCESS REQUEST * LDA SBLK GET LAST BLOCK NUMBER LDB MORE,I GET MORE FLAG SZB IF NOT FIRST TIME HERE, JMP NOTFR THEN CONTINUE * CLA START AT BLOCK 0 STA FRST? ALSO CLEAR FIRST-FLAG STA LAST? AND FLAST-FLAG * NOTFR STA BLK SAVE BLOCK NUMBER CLA STA DIRLN,I CLEAR DIRECTORY LENGTH STA MORE,I AND MORE FLAG SKP * * IF THERE IS ENOUGH ROOM IN TABLE FOR ONE MORE DIRECTORY BLOCK * (EIGHT ENTRIES), OR IF THE MORE FLAG IS SET (SO WE CAN SEARCH * FOR EXTENTS) THEN CONTINUE * OTHERWISE SET THE MORE FLAG AND SAVE THE CURRENT BLOCK NUMBER * FOR LATER AND CONTINUE (BUT DON'T CREATE NEW ENTRIES) * LOOP1 LDA DIRLN,I GET CURRENT LENGTH CMA INCREMENT AND NEGATE ADA DIRMX,I ADD IN MAX LENGTH SSA,RSS IF NOT TOO FULL, JMP DIRC1 THEN CONTINUE * LDA MORE,I GET MORE FLAG SZA IF ALREADY SET, JMP DIRC1 THEN CONTINUE * LDA BLK GET CURRENT BLOCK STA SBLK SAVE FOR NEXT TIME ISZ MORE,I SET MORE FLAG * DIRC1 JSB DR.RD READ IN THE NEXT DIRECTORY BLOCK DEF *+4 INTO PK.DR DEF .1 DEF SLU,I DEF BLK * SEZ IF FAIL-RETURN, JMP DR.CT,I THEN RETURN * LDA N8 SET COUNTER FOR NUMBER OF ENTRIES PER BLOCK STA COUNT LDB APK.D GET ADDRESS OF FIRST ENTRY IN BUFFER STB ADDR SAVE FOR LATER * LOOP2 LDA ADDR,I GET WORD 0 OF AN ENTRY SZA,RSS IF END OF THE DIRECTORY, JMP DR.CT,I THEN RETURN * SSA IF PURGED OR CARTRIDGE ENTRY, JMP DIRC2 THEN IGNORE THIS ENTRY * LDB ADDR GET ENTRY BUFFER ADDRESS ADB .5 BUMP TO EXTENT WORD (WORD 5) LDA B,I GET IT AND NB400 ISOLATE EXTENT FIELD SZA,RSS IF NOT EXTENT, JMP DIRC3 THEN TRY ADDING TO TABLE SKP * * SEARCH PSEUDO-DIRECTORY FOR THE EXTENT'S NAME. * IF FOUND, THEN INCREMENT THE FILE'S EXTENT COUNTER. * (NO NEW ENTRY IS MADE FOR THE EXTENT) * IF NOT FOUND, THEN IGNORE IT. * LDA DIRLN,I GET PSEUDO-DIRECTORY LENGTH SZA,RSS IF DIRECTORY EMPTY, JMP DIRC2 THEN IGNORE EXTENT * CMA,INA NEGATE LENGTH STA COUN2 AND SAVE * LDA NAME GET ADDRESS OF PSEUDO-DIRECTORY STA INDX SAVE FOR INDEXING * LOOP3 JSB CK.NM CHECK NAME WITH TABLE ENTRY DEF *+3 DEF INDX,I DEF ADDR,I * SEZ IF NAME DOESN'T MATCH, JMP NOMCH THEN CONTINUE * LDA INDX BUMP TO NUMBER OF EXTENTS ADA .4 ISZ A,I AND INCREMENT JMP DIRC2 GO TO NEXT ENTRY * NOMCH LDA INDX BUMP TO ADA .8 NEXT STA INDX ENTRY ISZ COUN2 IF NOT FINISHED, JMP LOOP3 THEN TEST NEXT ONE JMP DIRC2 OTHERWISE IGNORE IT SKP * * PROCESS MAIN FILE ENTRIES * DIRC3 LDA MORE,I GET MORE FLAG SZA IF JUST LOOKING AT EXTENTS JMP DIRC2 THEN IGNORE THIS ENTRY * LDA LAST? FETCH LAST FLAG SZA IF PAST LAST FILE, JMP DIRC2 THEN IGNORE THIS ENTRY * * CHECK FOR FIRST AND LAST SELECTIONS * LDA FIRST,I GET FIRST WORD OF FIRST SZA,RSS IF ZERO, JMP OK1 THEN SET FIRST FLAG * JSB CK.NM CHECK IF NAME IS FIRST DEF *+3 DEF ADDR,I DEF FIRST,I * SEZ,RSS IF NAME IS THE FIRST ONE, OK1 ISZ FRST? THEN SET FIRST-FOUND * JSB CK.NM CHECK IF NAME IS LAST DEF *+3 DEF ADDR,I DEF LAST,I * SEZ,RSS IF NAME IS THE LAST ONE SELECTED, ISZ LAST? THEN SET LAST-FOUND * LDA FRST? FETCH FIRST FLAG SZA,RSS IF NOT SET, JMP DIRC2 THEN IGNORE THIS ENTRY * JSB F.TST CHECK AGAINST FILTER DEF *+2 DEF ADDR * SZA,RSS IF NOT OK, JMP DIRC2 THEN IGNORE THIS ENTRY SKP * * SAVE FILE INFO * LDB DIRLN,I GET DIRECTORY LENGTH ISZ DIRLN,I INCREMENT DIRECTORY LENGTH BLF,BRS MULTIPLY BY 8 ADB NAME OFFSET FROM BASE ADDRESS * LDA ADDR,I GET 2 CHARS FROM NAME STA B,I SAVE ISZ ADDR MOVE TO WORD 1 INB LDA ADDR,I GET 2 CHARS FROM NAME STA B,I SAVE ISZ ADDR MOVE TO WORD 2 INB LDA ADDR,I GET 2 CHARS FROM NAME STA B,I SAVE ISZ ADDR MOVE TO WORD 3 INB LDA ADDR,I GET FILE TYPE STA B,I SAVE INB CLA SET EXTENT TO ZERO STA B,I ISZ ADDR MOVE TO WORD 6 ISZ ADDR ISZ ADDR INB LDA ADDR,I GET FILE SIZE (IN SECTORS) ARS CONVERT TO BLOCKS STA B,I SAVE ISZ ADDR MOVE TO WORD 7 INB LDA ADDR,I GET FILE RECORD LENGTH (IN WORDS) STA B,I SAVE ISZ ADDR MOVE TO WORD 8 INB LDA ADDR,I GET SECURITY CODE STA B,I SAVE * LDA .8 MOVE TO NEXT ENTRY RSS * * MOVE TO ANOTHER ENTRY * DIRC2 LDA .16 MOVE TO NEXT ENTRY ADA ADDR STA ADDR ISZ COUNT IF NOT DONE WITH BLOCK, JMP LOOP2 THEN DO ANOTHER ENTRY * ISZ BLK INCREMENT CURRENT BLOCK NUMBER JMP LOOP1 AND GO READ ANOTHER BLOCK 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 .3 DEC 3 .4 DEC 4 .5 DEC 5 .8 DEC 8 .16 DEC 16 .31 DEC 31 .32 DEC 32 .36 DEC 36 .60 DEC 60 * N3 DEC -3 N8 DEC -8 N128 DEC -128 N2000 DEC -2000 * 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 SBLK NOP LAST EXAMINED BLOCK NUMBER COUNT NOP COUN2 NOP INDX NOP ADDR NOP * FRST? NOP LAST? NOP * A EQU 0 B EQU 1 * END EQU * * END