PROGRAM PROM C C Input is object file in absolute (.ASECT) C form from the Macro Assembler C All records other than data (type 3) ignored. C C Output is INTEL MDS hex format for prom programmer C paper tape or EIA interface. C C B. Z. Lederman I.T.T. World Communications C IMPLICIT INTEGER (A-Z) C BYTE TYPE, BLANK, DATA(128), FILNAM(40), ANS LOGICAL BIAS, LIMIT C WRITE(5,10) 10 FORMAT('$ Input file name: ') READ(5,20,END=600) FILNAM 20 FORMAT(40A1) FILNAM(40)=0 OPEN (UNIT=1,NAME=FILNAM,TYPE='OLD',READONLY) WRITE(5,30) 30 FORMAT('$ Output file name: ') READ(5,40,END=600) MAX, FILNAM 40 FORMAT(Q,40A1) FILNAM(MAX+1)=0 OPEN (UNIT=2,NAME=FILNAM,TYPE='NEW',CARRIAGECONTROL='LIST') C WRITE(2,50) (FILNAM(I),I=1,MAX) 50 FORMAT(A1) C BIAS=.FALSE. LIMIT=.FALSE. 55 WRITE(5,60) 60 FORMAT('$ Do you want to subtract a base address [Y/N] ? ') READ(5,65,END=600) ANS 65 FORMAT(A1) IF (ANS.EQ.'Y') BIAS=.TRUE. IF (.NOT.BIAS) GO TO 80 WRITE(5,70) 70 FORMAT('$ Enter base address (HEX) : ') READ(5,75,END=600) BASE 75 FORMAT(Z4) 80 WRITE(5,85) 85 FORMAT('$ Do you want to set an upper address limit [Y/N] ? ') READ(5,65,END=600) ANS IF (ANS.EQ.'Y') LIMIT=.TRUE. IF (.NOT.LIMIT) GO TO 100 WRITE(5,90) 90 FORMAT('$ Enter address limit (HEX) : ') READ(5,65,END=600) TOP C C Processing Loop. C 100 READ(1,110,END=300) TYPE, BLANK, ADDR, MAX, (DATA(I),I=1,MAX) 110 FORMAT(A1,A1,A2,Q,128A1) C C Reject all but Data records. C IF (TYPE.NE.3) GO TO 100 IF (MAX .LT.1) GO TO 100 C C Check for address bias C IF (.NOT.BIAS) GO TO 112 ADDR=ADDR-BASE IF (ADDR.LT.0) GO TO 100 112 IF (.NOT.LIMIT) GO TO 115 IF (ADDR.GT.TOP) GO TO 100 C C Calculate modulo 256 checksum. C 115 CHECK=MAX TEMP=IAND("377,ADDR) CHECK=CHECK+TEMP TEMP=IAND("177400,ADDR) TEMP=ISHFT(TEMP,-8) CHECK=CHECK+TEMP DO 120 I=1,MAX CHECK=CHECK+DATA(I) 120 CHECK=IAND("377,CHECK) CHECK=-CHECK CHECK=IAND("377,CHECK) C C Write out prom programmer instruction followed by data C WRITE(2,125) ADDR 125 FORMAT('P',Z4.4) WRITE(2,130) MAX, ADDR, (DATA(I),I=1,MAX), CHECK 130 FORMAT(':',Z2.2,Z4.4,'00',Z2.2,Z2.2) GO TO 100 C C Write End of File record and finish up. C 300 WRITE(2,310) 310 FORMAT(':00000001FF') CLOSE (UNIT=2) CLOSE (UNIT=1) 600 STOP END