SPL,L,O,M,C ! NAME: BATBL ! SOURCE: 92076-18017 ! RELOC: 92076-16002 ! PGMR: B.J.L. ! ! **************************************************************** ! * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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. * ! **************************************************************** ! NAME BATBL(3,99) "92076-16002 REV.2040 800802" ! ! CHANGED ENDING MESSAGES IN EXEC TO USE LOGLU INSTEAD OF ! LU 1 WHICH IN L IS SYSTEM CONSOLE. 800802 ! ! DELETED T.LST EXTERNAL AND ANY REFERENCES TO TRANSFER FILE ! FOR XL AND THEREFORE THE L. 800728 ! ! ! MADE SO WILL PRINT OUT DUPLICATE FILE NAME ON ERROR IN ! CREATE "CRFIL" ROUTINE. 800322 ! LET T.ENT(900), \ENTRY POINT BUFFER T.BRN(525), \BRANCH TABLE BUFFER T.COM(75), \COMMAND BUFFER T.OVB(96), \MNTBL AND OVERLAY BUFFER T.FIL(8), \FILE NAME BUFFER T.DCB(144), \DCB BUFFER T.BAD, \BRANCH TABLE ADDRESS T.SUB(32), \SUBROUTINE COUNT BUFFER T.ERN, \ERROR CODE T.PRI, \PRIORITY FOR OVERLAYS T.SEC, \SCODE FOR OVERLAY DIRECTS. T.CRF, \CR REF # FOR OVERLAYS T.MAD, \MNEMONIC TABLE ADDRESS T.EAD, \ENTRY POINT TABLE ADDRESS T.LEN, \LINE LENGTH, # ENTRIES T.CON, \CONTROL WORD T.IDL, \ID LETTER T.LST \USED FOR ENDING MESS. BE INTEGER,GLOBAL ! LET CMDCB(16), \COMMAND DCB SAVE BRDCB(16), \BRANCH TABLE DCB SAVE MNDCB(16), \MNEMONIC TABLE DCB SAVE TRDCB(16), \TRANSFER FILE DCB SAVE FMERR(18), \FMGR ERROR TABLE T.ERR(18), \BATBL ERROR TABLE \ \ THE FOLLOWING DECLARATIONS SHOULD STAY IN THIS ORDER. \ BRNAM(3), \BRANCH FILE NAME BRSEC, \BRANCH SECURITY CODE BRICR, \BRANCH CARTRIDGE ID MNNAM(3), \MNEMONIC TABLE NAME MNSEC, \MNEMONIC SECURITY CODE MNICR, \MNEMONIC CARTRIDGE ID TRNAM(3), \TRANSFER FILE NAME TRSEC, \TRANSFER SECURITY CODE TRICR, \TRANSFER CARTRIDGE ID SAVE, \TEMPORARY ADDR, \TEMPORARY MIN1, \SAVE FOR SORT MIN2, \SAVE FOR SORT ER(5), \END MESSAGE RA(7), \ABORT MESSAGE FLAG, \FLAG FOR NO SEGMENT NS(13), \NO SEGMENT MESSAGE SUBN, \SUBROUTINE # OVLAY, \OVERLAY # CMNAM(3), \COMMAND NAME CMSEC, \COMMAND SECURITY CODE CMICR \COMMAND CRN# BE INTEGER ! LET A BE CONSTANT(0) ! LET .DFER,T.PAR \3-WORD TRANSFER BE SUBROUTINE,DIRECT,EXTERNAL ! LET T.LNK BE SUBROUTINE,EXTERNAL ! INITIALIZE FMERR TO -1,-2,-3,-4,-5, \ -6,-7,-8,-11,-12,-13,-14,-15,-16, \ -17,-19,-32,-33 INITIALIZE T.ERR TO 10,15,18,19,20, \ 16,14,12,21,22,13,11,9,23, \ 17,24,25,26 INITIALIZE T.ERN,BRSEC,BRICR,MNSEC, \ MNICR,TRSEC,TRICR,CMSEC,CMICR, \ FLAG TO 10(0) INITIALIZE ER TO "$END BATBL" INITIALIZE RA TO "$BATBL ABORTED" INITIALIZE NS TO "BATBL'S SEGMENT NOT FOUND" INITIALIZE T.SUB TO 32(0) ! LET READF, \FMGR READ RECORD WRITF, \FMGR WRITE RECORD CREAT, \FMGR CREAT FILE OPENF, \FMGR OPEN FILE OPEN, \ CLOSE, \FMGR CLOSE FILE PURGE, \FMGR PURGE FILE RWNDF, \FMGR REWIND POST, \POST DCB BUFFER EXEC \RTE SYSTEM CALLS BE SUBROUTINE,EXTERNAL ! ! THE FOLLOWING SUBROUTINE MOVES A 16-WORD BLOCK FROM ! BUFR1 TO BUFR2. ! MOVE: SUBROUTINE(BUFR1,BUFR2) LET BUFR1,BUFR2 BE INTEGER SAVE _ @BUFR2; ADDR _ @BUFR1 !SET BUFFER POINTERS. REPEAT 16 TIMES DO [ \DO THE MOVE. $SAVE _ $ADDR; $ADDR _ 0; \CLEAR OUT ORIGINAL ADDR _ ADDR + 1; \BUFFER IN THE SAVE _ SAVE + 1] !PROCESS. RETURN END ! ! ! SAVBF: SUBROUTINE(DCBBF) DIRECT LET DCBBF BE INTEGER POST(T.DCB) MOVE(T.DCB,DCBBF) RETURN END ! ! ! THE FOLLOWING SUBROUTINE CHECKS FOR ERRORS AND ! TRANSLATES A FMGR ERROR TO AN BATBL ERROR CODE ! IF NECESSARY. THEN IT PRINTS THE ERROR. IT ALSO ! SETUPS FOR PURGING ANY CREATED FILES, CLOSING ! OTHERS, AND PRINTING AN ERROR MESSAGE IF ONE OF ! BATBL'S SEGMENTS CANNOT BE FOUND. ! T.ERC: SUBROUTINE DIRECT,FEXIT,GLOBAL IF FLAG #0 THEN GOTO NOSEG !CHECK FOR NO SEG. CONDITION IFNOT T.ERN THEN RETURN !RETURN IF ERROR=0. SAVE _ @FMERR; ADDR _ @T.ERR !SET UP POINTERS. IF T.ERN > 0 THEN GOTO T.ER1 !IF FMGR ERROR, REPEAT 18 TIMES DO [ \SEARCH THE FMGR IF T.ERN = $SAVE THEN [ \ERROR TABLE. T.ERN _ $ADDR; GOTO T.ER1]; \TRANSLATE A MATCH. SAVE _ SAVE + 1; \INCREMENT POINTERS ADDR _ ADDR + 1] !AND LOOP. T.ER1: SUBN_0; OVLAY_1 !PRINT MESSAGE. T.LNK(SUBN,OVLAY,FLAG) IF FLAG #0 THEN GOTO NOSEG !CHECK FOR NO SEG. T.ERN _ 0 GOTO FINI NOSEG: FLAG_0 !CLEAR FLAG EXEC(2,T.LST,NS,13) !PRINT NO SEG. MESS FINI: FRETURN END ! ! THE FOLLOWING SUBROUTINE CREATES A FILE AND ! SAVES THE DCB. ! CRFIL: SUBROUTINE(TYPE,DCBSV,FLNAM,FLSEC,FLICR) FEXIT LET TYPE,DCBSV,FLNAM,FLSEC,FLICR BE INTEGER CREAT(T.DCB,T.ERN,FLNAM,10,TYPE, \TRY CREATING THE FLSEC,FLICR) !FILE. IF T.ERN = -2 THEN GOTO CRFL1 IF T.ERN > 0 THEN T.ERN _ 0 T.ERC ? [FRETURN] !REPORT ANY ERRORS. SAVBF(DCBSV) !SAVE DCB BUFFER. RETURN CRFL1: EXEC (2,T.CON,FLNAM,3) T.ERC ? [FRETURN] END ! ! ! CLSFL: SUBROUTINE(SVDCB) LET SVDCB BE INTEGER MOVE(SVDCB,T.DCB) !RESTORE CORRECT DCB. CLOSE(T.DCB,T.ERN) !CLOSE THE FILE. T.ERC RETURN END ! ! ! PRGFL: SUBROUTINE(DCBUF,FNAM,FSEC,FICR) LET DCBUF,FNAM,FSEC,FICR BE INTEGER CLSFL(DCBUF) PURGE(T.DCB,T.ERN,FNAM,FSEC,FICR) IF T.ERN > 0 THEN T.ERN _ 0 T.ERC RETURN END ! ! SUBROUTINE TO CLEAR THE READ BUFFER. ! CLBUF: SUBROUTINE DIRECT SAVE _ @T.COM REPEAT 31 TIMES DO [ \ $SAVE _ 0; SAVE _ SAVE + 1] RETURN END ! ! ! THE MAIN PROGRAM STARTS HERE ! BATBL: T.ERN _ 0 T.MAD _ @CMNAM T.PAR !PARSE COMND NAME. T.ERC ? [GOTO ABORT] !CHECK FOR ERROR OPENF(T.DCB,T.ERN,CMNAM,0,CMSEC,CMICR)!OPEN COMMAND FILE. IF T.ERN > 0 THEN T.ERN _ 0 T.ERC ? [GOTO ABORT] !NOT FOUND (ONLY TIME ERR=-6) ! CLBUF !CLEAR READ BUFFER. READF(T.DCB,T.ERN,T.COM,40,T.LEN) !GET FILE NAMES. T.ERC ? [GOTO ABRT0] !REPORT ANY ERRORS. ! SAVBF(CMDCB) T.MAD _ @BRNAM; !SET UP FOR T.GFI. SUBN_0 ; OVLAY_0 T.LNK(SUBN,OVLAY,FLAG) !PARSE THE 1ST COMMAND. T.ERC ? [GOTO ABRT0] !CHECK FOR ERRORS. CRFIL(7,BRDCB,BRNAM,BRSEC,BRICR) ? \CREATE BRTBL FILE. [GOTO ABRT0] ! CRFIL(7,MNDCB,MNNAM,MNSEC,MNICR) \CREATE MNTBL FILE. ? [GOTO ABRT1] ! ! ***************************REMOVED 800728***************** ! ! CRFIL(3,TRDCB,TRNAM,TRSEC,TRICR) \CREATE TRANSFER FILE. ! ? [GOTO ABRT2] ! ! MOVE(TRDCB,T.DCB) !PUT TRANSFER FILE ! OPEN(T.DCB,T.ERN,TRNAM,0,TRSEC,TRICR) ! SAVBF(TRDCB) !IN NORMAL WRITE MODE. ! *****************************800728*********************** MOVE(MNDCB,T.DCB) WRITF(T.DCB,T.ERN,T.COM,1) !SAVE SPACE FOR LENGTH. T.ERC ? [GOTO ABRT2] !CHECK ERRORS. MIN1 _ 1 !SET UP POINTERS T.EAD _ @T.ENT; I _ 0 !FOR TABLE BUILDER. BATB5: T.MAD _ @T.OVB; SAVBF(MNDCB) !FOR ALL SPECS . . . T.BAD _ @T.BRN; J _ 0 ! BATB2: CLBUF; MOVE(CMDCB,T.DCB) !CLEAR READ BUFFER READF(T.DCB,T.ERN,T.COM,75,T.LEN) !READ A RECORD. SAVBF(CMDCB) IF T.LEN = -1 THEN GOTO BATB6 !IF DONE, LEAVE LOOP. IF I = 300 THEN T.ERN _ 7 !CHECK FOR TABLE OVERFLOW. T.ERC ? [GOTO ABRT2] !REPORT ERRORS. EXEC(100002K,T.CON,T.COM,T.LEN) !WRITE A LINE. GOTO ABRT2 !ERROR RETURN. SUBN_MIN1; OVLAY_0 !BUILD TABLE ENTRIES. T.LNK(SUBN,OVLAY,FLAG) T.ERC ? [GOTO ABRT2] !REPORT ERRORS. MIN1 _ 100001K; !SET SEG SWITCH ! ! *******************REMOVED 800728*********************** ! ! MOVE (TRDCB,T.DCB) ! WRITF(T.DCB,T.ERN,T.FIL,5) !SAVE FILE NAME ! ! SAVBF(TRDCB); T.ERC ? [GOTO ABRT3] !IN TRANSFER FILE. ! ! *************************800728************************* I _ I + 1; J _ J + 1 !INCREMENT COUNTERS. IF J < 15 THEN GOTO BATB2 ! BATB6: MOVE(BRDCB,T.DCB) !RESTORE BRANCH DCB. WRITF(T.DCB,T.ERN,T.BRN, \ (T.BAD-@T.BRN)) ! SAVBF(BRDCB) !SAVE BRTBL DCB. T.ERC ? [GOTO ABRT2] !REPORT ANY ERRORS. ! MOVE(MNDCB,T.DCB) WRITF(T.DCB,T.ERN,T.OVB, \WRITE THIS SEGMENT (T.MAD-@T.OVB)) !OF MNTBL. T.ERC ? [GOTO ABRT2] !CHECK ERRORS. IF T.LEN >= 0 THEN GOTO BATB5 !CHECK FOR DONE. ! T.OVB(1) _ -I !PUT IN SUB. COUNT. RWNDF(T.DCB) !GO BACK TO BEGINNING. WRITF(T.DCB,T.ERN,T.OVB,1) !WRITE MNTBL. SAVBF(MNDCB) !SAVE MNTBL DCB. T.ERC ? [GOTO ABRT2] !REPORT ERRORS. ! ! T.BAD _ @T.BRN; K _ 0 !READ IN THE BRANCH MOVE(BRDCB,T.DCB); RWNDF(T.DCB) !TABLE, CONDENSING IT BATB3: READF(T.DCB,T.ERN,$T.BAD,60,T.LEN) !TO PAIRS OF ENTRIES. IF T.LEN = -1 THEN GOTO BATB1 !IF EOF, SKIP. T.ERC ? [GOTO ABRT2] !REPORT ANY ERRORS. T.LEN _ T.LEN >-1 FOR I _ 2 TO (T.LEN-2) BY 2 DO \CONDENSE THIS PIECE [$(T.BAD+I) _ $(T.BAD+(I<-1))] !OF THE TABLE. K _ K + T.LEN !UPDATE POINTERS. T.BAD _ T.BAD + T.LEN GOTO BATB3 !READ MORE PIECES. ! BATB1: SAVBF(BRDCB) ADDR _ @T.BRN; T.EAD _ @T.ENT !SET UP FOR SORT FOR I _ 1 TO (K-1) BY 2 DO \NUMBER ENTRIES WITH [$(ADDR+I) _ (I-1) >-1] !RECORD POSITION. I _ 0 !SORT ACCORDING TO BATB4: $[REAL]@MIN1 _ $[REAL](ADDR+I) !OVERLAY AND SUB- SAVE _ I !ROUTINE NUMBER. FOR J _ I+2 TO (K-2) BY 2 DO \DO THE SORT. [IF $(ADDR+J) < MIN1 THEN [ \ $[REAL]@MIN1_$[REAL](ADDR+J); \ SAVE _ J]] ! $[REAL](ADDR+SAVE) _ $[REAL](ADDR+I) $[REAL](ADDR+I) _ $[REAL]@MIN1 MIN1 _ (I >-1)*3 + T.EAD !SET UP ADDRESS PTRS. MIN2 _ (SAVE >-1)*3 + T.EAD !TO ENT. PT. NAMES. .DFER(T.COM,$MIN1) !EXCHANGE THE ENTRY .DFER($MIN1,$MIN2) !POINT NAMES CORRES. .DFER($MIN2,T.COM) !TO BRTBL ENTRIES. I _ I + 2 IF I <= (K-4) THEN GOTO BATB4 SUBN_1; OVLAY_1 !CREATE OVERLAY DIRS. T.LNK(SUBN,OVLAY,FLAG) T.ERC ? [GOTO ABRT4] !REPORT ERRORS. ! ! ***********************REMOVED 800728*************************** ! MOVE(TRDCB,T.DCB) ! IF T.LEN THEN [ \IF ANY OVERLAYS ! OVLAY_2; T.LNK(SUBN,OVLAY,FLAG); \WERE CREATED, THEN ! T.ERC ? [GOTO ABRT4]] !CREATE TRANSFER FILE. ! ! ***************************800728******************************* ! ! ! NORMAL RETURN FROM MAIN. ! ! ! **************************REMOVED 800728********************** ! CLOSE(T.DCB,T.ERN) !CLOSE TRANSFER FILE. ! T.ERC !REPORT ERRORS - CONT. ! ! *****************************800728*************************** CLSFL(MNDCB) !CLOSE MNTBL FILE. CLSFL(BRDCB) !CLOSE BRTBL FILE. CLSFL(CMDCB) !CLOSE COMMAND FILE. IF T.ERN THEN GOTO ABORT !IF T.ERN, IND. ABORT. ! EXEC(2,T.LST,ER,5) !PRINT END MESSAGE. GOTO TERM !TERMINATE. ! ! ABORT SEQUENCE FROM MAIN. ! ABRT4: IFNOT T.LEN THEN GOTO ABRT2 !ERROR FROM T.OVL. ADDR _ @T.OVB REPEAT T.LEN TIMES DO [ \ATTEMPT TO PURGE PURGE(T.DCB,T.ERN,$ADDR,T.SEC, \CREATED OVERLAYS, IF T.CRF); \ T.ERC; ADDR _ ADDR + 4] !ANY. PRINT MESSAGES. ! ! *********************REMOVED 800728**************************** !ABRT3: PRGFL(TRDCB,TRNAM,TRSEC,TRICR) !PURGE TRANSFER FILE. ! ! *****************************800728**************************** ABRT2: PRGFL(MNDCB,MNNAM,MNSEC,MNICR) !PURGE MNTBL FILE. ABRT1: PRGFL(BRDCB,BRNAM,BRSEC,BRICR) !PURGE BRTBL FILE. ABRT0: CLSFL(CMDCB) !CLOSE COMMAND FILE. ABORT: EXEC(2,T.LST,RA,7) !PRINT ABORT MESS. TERM: EXEC(3,((T.CON AND 77K) OR 1100K),-1)!EJECT PAGE. EXEC(6) !TERMINATE. ! END BATBL END$