FTN4,L,C PROGRAM AB2MI() $,92071-16241 REV.2041 800729 C NAME: AB2MI C SOURCE: 92071-18241 C RELOC: 92071-16241 C PGMR: WWL,HLC,BC C C C **************************************************************** C * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * C * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * C * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * C * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * C **************************************************************** C C INTEGER ADCB(144),CDCB(144) INTEGER IBUF(128),OBUF(128) INTEGER TRECS C C THIS PROGRAM COPIES AN ABSOLUTE BINARY FILE C TO A MEMORY IMAGE (TYPE 1) FILE. ONLY THOSE LOCATIONS C SPECIFIED IN THE ABSOLUTE FILE ARE MODIFIED C IN THE MEMORY IMAGE FILE. C C OPERATION: C RU,AB2MI,INPUT:SC:CR,OUTPUT:SC:CR::SIZE C C THE INPUT FILE MUST HAVE BEEN PREVIOUSLY CREATED. C THE OUTPUT FILE IS CREATED BY 'AB2MI' IF IT IS C NOT FOUND. THE DEFAULT SIZE IS 256 BLOCKS (32K WORDS). C C CALL GETST(IBUF,-80,IB) LOG=LOGLU(ISES) C C IF NO FILES WERE INPUT, READ NAMES FROM TERMINAL C IF (IB.EQ.0) GOTO 500 100 IX=1 IREC=0 MXREC=0 IOPT=0 C C OPEN THE INPUT FILE (OPENF ALLOWS DEVICES OR FILES) C CALL NAMR(OBUF,IBUF,IB,IX) ITYP=IAND(OBUF(4),3) IF(ITYP .EQ. 1)IOPT=110B CALL OPENF(ADCB,IERR,OBUF(1),IOPT,OBUF(5),OBUF(6)) IF (IERR.LT.0) GOTO 800 C C CHECK INPUT FILE FOR TYPE 7 OR TYPE 0 AN LU IF( (IERR .NE. 7) .AND. ( IERR .NE. 0) )GOTO 690 C C OPEN OUTPUT FILE C CALL NAMR(OBUF,IBUF,IB,IX) IF (OBUF(1) .EQ. 0) GO TO 500 CALL OPEN(CDCB,IERR,OBUF(1),0,OBUF(5),OBUF(6)) IF (IERR .NE. -6) GO TO 200 ISIZE=OBUF(8) IF(ISIZE.EQ.0) ISIZE=256 CALL CREAT (CDCB,IERR,OBUF(1),ISIZE,1,OBUF(5),OBUF(6)) IF(IERR .LT. 0)GOTO 800 GO TO 400 C 200 IF (IERR .LT. 0) GO TO 800 C C CHECK FOR OUTPUT FOR TYPE 1 ONLY IF(IERR .NE. 1)GOTO 790 C C COPY THE FILE C 400 IF (IFBRK(ISES).LT.0) GOTO 850 CALL READF(ADCB,IERR,IBUF,128,LEN) IF (IERR.LT.0) GOTO 800 C IF (LEN.EQ.0) GOTO 400 C C LEN = -1 INDICATES END OF FILE C IF (LEN.LT.0) GOTO 600 IX=IBUF(1)/256 IA=IBUF(2) C C IC CONTAINS A RUNNING CHECKSUM OF THE DATA C IC=IA DO 410,I=1,IX ID=IBUF(I+2) IC=IC+ID C C COMPUTE THE BLOCK AND OFFSET WITHIN THE BLOCK C IBLOK=IA/128 IOFST=IA-IBLOK*128+1 IBLOK=IBLOK+1 C IF (IREC.EQ.IBLOK)GOTO 409 IF (IREC.EQ.0)GOTO 402 C C SOME OTHER BLOCK IS IN MEMORY. POST TO DISC. C CALL WRITF(CDCB,IERR,OBUF,128,IREC) IF (IERR.LT.0) GOTO 700 IF (IREC .GT. MXREC) MXREC=IREC C C READ IN THE BLOCK CONTAINING THE WORD. C 402 CALL READF(CDCB,IERR,OBUF,128,IJUNK,IBLOK) IF (IERR.LT.0) GOTO 800 IREC=IBLOK 409 OBUF(IOFST)=ID IA=IA+1 410 CONTINUE C C MAKE SURE CHECKSUM AGREES C IF (IC.EQ.IBUF(LEN)) GOTO 400 WRITE(LOG,440) 440 FORMAT(" CHECKSUM ERROR") GOTO 900 C C C C C END OF FILE, POST FINAL BLOCK TO THE DISC C 600 IF(IREC.EQ.0) GOTO 900 CALL WRITF(CDCB,IERR,OBUF,128,IREC) IF (IERR.LT.0) GOTO 800 IF (IREC .GT. MXREC) MXREC=IREC GO TO 900 C C C BREAK FLAG SET, PRINT MESSAGE AND ABORT C 850 WRITE(LOG,860) 860 FORMAT(" BREAK FLAG SET") GOTO 900 C C C INPUT FILE NAMES FROM TERMINAL C C C 500 WRITE(LOG,520) 520 FORMAT(" THIS PROGRAM COPIES AN ABSOLUTE BINARY (TYPE 7)"/ C" FILE TO A MEMORY IMAGE (TYPE 1) FILE.") 550 WRITE (LOG,570) 570 FORMAT(/" PLEASE ENTER THE INPUT FILE AND OUTPUT FILE NAMES."/ C" FORMAT: INPUT:SC:CR, OUTPUT:SC:CR::SIZE"/" _") CALL REIO(1,LOG+400B,IBUF,-80) CALL ABREG(IA,IB) IF(IB.EQ.0)GOTO 900 GOTO 100 C 690 IERR=-16 700 WRITE (LOG,710) IERR 710 FORMAT(" INPUT FILE ERROR " I7) IF(IERR .EQ. -6)GO TO 550 IF(IERR .EQ. -7)GO TO 550 IF(IERR .EQ. -32)GO TO 550 GO TO 900 C C C C PRINT FMP ERROR MESSAGE C 790 IERR=-16 800 WRITE (LOG,810)IERR 810 FORMAT(" OUTPUT FILE ERROR " I7) IF (IERR.EQ.-6) GOTO 550 IF (IERR.EQ.-7) GOTO 550 IF (IERR.EQ.-32) GOTO 550 C C C CLOSE INPUT AND OUTPUT FILES C 900 WRITE (LOG,905) MXREC 905 FORMAT (" HIGHEST BLOCK WRITTEN:"I4/) CALL CLOSE (CDCB) CALL CLOSE (ADCB) END