home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ENTERPRS
/
CPM
/
UTILS
/
F
/
PALASM.LBR
/
PALASM.FQR
/
PALASM.FOR
Wrap
Text File
|
2000-06-30
|
29KB
|
795 lines
C****************************************************************************
C
C
C MAIN PROGRAM
C
BYTE IPAL(4),REST(73),PATNUM(80),TITLE(80),COMP(80),
C ISYM(8,20),IBUF(8,20)
BYTE E,O,T,P,B,H,S,L,N,Q,U,F,C,R,A,
C BB,CC,DD,EE,FF,II,NN,OO,PP,RR,SS,TT,UU,
C IPAGE,FNAME(11),MYLINE(80),
C INOAI,IOT,INOO,CR,LF,IOP,CLRS
LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR,
C LFIX,LFIRST,LMATCH,LFUSES(32,64),LPHASE(20),LBUF(20),
C LPROD(80),LSAME,LACT,LOPERR,LINP,LPRD,LHEAD
COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR
COMMON /PGE/ IPAGE(80,100)
COMMON /FTEST/ IFUNCT,IDESC,IEND
DATA E/'E'/,O/'O'/,T/'T'/,P/'P'/,B/'B'/,H/'H'/,S/'S'/,L/'L'/,
C N/'N'/,Q/'Q'/,U/'U'/,F/'F'/,C/'C'/,R/'R'/,A/'A'/
DATA BB/'B'/,CC/'C'/,DD/'D'/,EE/'E'/,FF/'F'/,II/'I'/,NN/'N'/,
C OO/'O'/,PP/'P'/,RR/'R'/,SS/'S'/,TT/'T'/,UU/'U'/
DATA CR/X'0D'/,LF/X'0A'/,CLRS/X'0C'/
999 IFUNCT=0
IDESC=0
LSAME=.FALSE.
LACT=.FALSE.
LOPERR=.FALSE.
LINP=.FALSE.
LPRD=.FALSE.
LHEAD=.FALSE.
C
WRITE(1,3)CLRS
3 FORMAT(' ',A1,' PAL ASSEMBLER VERSION 3.1 ',/////)
530 CALL GFNAME(FNAME,INUNIT,.TRUE.)
CALL OPEN(6,FNAME,INUNIT)
READ(6,10,END=500) IPAL,INOAI,IOT,INOO,REST,PATNUM,TITLE,COMP
10 FORMAT(4A1,A1,A1,A1,73A1,/,80A1,/,80A1,/,80A1)
GOTO 510
500 WRITE(1,520)
ENDFILE 6
520 FORMAT(' FILE DOESN''T EXIST, REENTER',/)
GOTO 530
C
510 WRITE(1,511) IPAL,INOAI,IOT,INOO,REST,PATNUM,TITLE,COMP
511 FORMAT(' '4A1,A1,A1,A1,73A1,/,' ',80A1,/,
C ' ',80A1,/,' ',80A1)
DO 15 J=1,100
READ(6,11,END=16) MYLINE
11 FORMAT(80A1)
WRITE(1,561)MYLINE
561 FORMAT(' ',80A1)
DO 560 I = 1,80
IPAGE(I,J) = ' '
560 IF(.NOT.((MYLINE(I).EQ.CR).OR.(MYLINE(I).EQ.LF)))
C IPAGE(I,J) = MYLINE(I)
IF( IFUNCT.EQ.0 .AND.IPAGE(1,J).EQ.FF.AND.
C IPAGE(3,J).EQ.NN.AND.IPAGE(5,J).EQ.TT.AND.
C IPAGE(7,J).EQ.OO.AND.IPAGE(10,J) .EQ.TT ) IFUNCT=J
IF( IDESC.EQ.0 .AND.IPAGE(1,J).EQ.DD.AND.
C IPAGE(3,J).EQ.SS.AND.IPAGE(5,J).EQ.RR.AND.
C IPAGE(7,J).EQ.PP.AND.IPAGE(10,J) .EQ.OO ) IDESC=J
15 CONTINUE
16 IEND=J-1
CALL INITLZ(INOAI,IOT,INOO,ITYPE,LFUSES,IC,IL,IBLOW,LFIX)
ILE=IL+1
IF(ITYPE.NE.0) GO TO 17
WRITE(1,18) IPAL,INOAI,IOT,INOO
18 FORMAT(/,' PAL PART TYPE ',4A1,A1,A1,A1,' IS INCORRECT')
STOP ERROR
17 DO 20 J=1,20
20 CALL GETSYM(LPHASE,ISYM,J,IC,IL,LFIX)
IF(.NOT.(LEQUAL.OR.LLEFT.OR.LAND.OR.LOR.OR.LRIGHT)) GO TO 24
WRITE(1,23)
23 FORMAT(/,' LESS THAN 20 PIN NAMES IN PIN LIST')
STOP ERROR
24 ILE=IL
25 CALL GETSYM(LBUF,IBUF,1,IC,IL,LFIX)
28 IF(.NOT.LEQUAL) GO TO 25
COUNT=0
ILL=IL
CALL MATCH(IMATCH,IBUF,ISYM)
IF( IMATCH.EQ.0 ) GO TO 100
IPRD=IMATCH
LSAME = ( ( LPHASE(IMATCH)).AND.( LBUF(1)).OR.
C (.NOT.LPHASE(IMATCH)).AND.(.NOT.LBUF(1)) )
IF( IOT.EQ.H.AND.(.NOT.LSAME) ) LACT=.TRUE.
IF( (.NOT.(IOT.EQ.H.OR.IOT.EQ.C)).AND.(LSAME) ) LACT=.TRUE.
IF( (ITYPE.EQ.1.OR.ITYPE.EQ.5.OR.ITYPE.EQ.6).AND.IOT.NE.A.
C AND.(IMATCH.LT.12.OR.IMATCH.GT.19) ) LOPERR=.TRUE.
IF( ITYPE.EQ.2.AND.(IMATCH.LT.13.OR.IMATCH.GT.18) )
C LOPERR=.TRUE.
IF( ITYPE.EQ.3.AND.(IMATCH.LT.14.OR.IMATCH.GT.17) )
C LOPERR=.TRUE.
IF( ITYPE.EQ.4.AND.(IMATCH.LT.15.OR.IMATCH.GT.16) )
C LOPERR=.TRUE.
IF( (LACT).OR.(LOPERR) ) GO TO 100
I88PRO=(19-IMATCH)*8 + 1
IF(IOT.EQ.C) I88PRO=25
IC=0
30 CALL INCR(IC,IL,LFIX)
IF( .NOT.(LEQUAL.OR.LLEFT) ) GO TO 30
LPROD(I88PRO)=.TRUE.
IF(.NOT.LLEFT) CALL SLIP(LFUSES,I88PRO,INOAI,IOT,INOO,IBLOW)
DO 70 I8PRO=1,16
COUNT = COUNT + 1
IPROD = I88PRO + I8PRO - 1
LPROD(IPROD)=.TRUE.
LFIRST=.TRUE.
50 ILL=IL
CALL GETSYM(LBUF,IBUF,1,IC,IL,LFIX)
IF( (ITYPE.EQ.1.OR.ITYPE.EQ.2.AND.IPRD.GT.13
C .AND.IPRD.LT.18).AND.COUNT.GT.2 ) LPRD=.TRUE.
IF( (ITYPE.EQ.3.OR.ITYPE.EQ.2.AND.(IPRD.EQ.13.OR.
C IPRD.EQ.18)).AND.COUNT.GT.4 ) LPRD=.TRUE.
IF( IOT.NE.A.AND.IOT.NE.C.AND.COUNT.GT.8 ) LPRD=.TRUE.
IF( .NOT.LPRD ) GO TO 69
IF(IL.NE.IFUNCT.AND.IL.NE.IDESC) ILL=IL
IPROD = IPROD - 1
GO TO 118
69 IF(LFIX) GO TO 59
CALL MATCH(IMATCH,IBUF,ISYM)
IF( ITYPE.EQ.1.AND.IMATCH.GT.11 ) LINP=.TRUE.
IF( ITYPE.EQ.2.AND.(IMATCH.GT.12.AND.IMATCH.LT.19) )
C LINP=.TRUE.
IF( ITYPE.EQ.3.AND.(IMATCH.GT.13.AND.IMATCH.LT.18) )
C LINP=.TRUE.
ILL=IL
IF(LINP) GO TO 100
IF( IMATCH.EQ.0 ) GO TO 100
IF( IMATCH.EQ.10.OR.IMATCH.EQ.99 ) GO TO 64
IF(.NOT.LFIRST) GO TO 58
LFIRST=.FALSE.
DO 56 I=1,32
IBLOW = IBLOW + 1
56 LFUSES(I,IPROD)=.TRUE.
58 CALL IXLATE(IINPUT,IMATCH,LPHASE,LBUF,ITYPE)
IF(IINPUT.LE.0) GO TO 60
IBLOW = IBLOW - 1
LFUSES(IINPUT,IPROD)=.FALSE.
CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.FALSE.,ITYPE,
C LPROD,IOP,IBLOW)
GO TO 60
59 CALL FIXSYM(LBUF,IBUF,IC,IL,LFIRST,LFUSES,IBLOW,
C IPROD,LFIX)
60 IF(LAND) GO TO 50
64 IF(.NOT.LRIGHT) GO TO 68
66 CALL INCR(IC,IL,LFIX)
IF(.NOT.LEQUAL) GO TO 66
68 IF( .NOT.(LOR.OR.LEQUAL) ) GO TO 74
70 CONTINUE
74 ILL=IL
CALL GETSYM(LBUF,IBUF,1,IC,IL,LFIX)
IF(LLEFT.OR.LEQUAL) GO TO 28
100 IF( ILL.EQ.IFUNCT.OR.ILL.EQ.IDESC ) GO TO 102
ILERR=ILL+4
WRITE(1,101) (IBUF(I,1),I=1,8),ILERR,(IPAGE(I,ILL),I=1,79)
101 FORMAT(' ERROR SYMBOL = ',8A1,' IN LINE NUMBER ',I3,
C /,' ',80A1)
IF( (LACT).AND.( LSAME).AND.(.NOT.LOPERR) )
C WRITE(1,103) IPAL,INOAI,IOT,INOO
103 FORMAT(' OUTPUT MUST BE INVERTED SINCE ',4A1,A1,A1,A1,
C ' IS AN ACTIVE LOW DEVICE')
IF( (LACT).AND.(.NOT.LSAME).AND.(.NOT.LOPERR) )
C WRITE(1,109) IPAL,INOAI,IOT,INOO
109 FORMAT(' OUTPUT CANNOT BE INVERTED SINCE ',4A1,A1,A1,A1,
C ' IS AN ACTIVE HIGH DEVICE')
IF( (LOPERR).AND.IMATCH.NE.0 )
C WRITE(1,105) IMATCH,IPAL,INOAI,IOT,INOO
105 FORMAT(' THIS PIN NUMBER ',I2,' IS AN INVALID OUTPUT PIN',
C ' FOR ',4A1,A1,A1,A1)
IF(LINP) WRITE(1,115) IMATCH,IPAL,INOAI,IOT,INOO
115 FORMAT(' THIS PIN NUMBER ',I2,' IS AN INVALID INPUT PIN',
C ' FOR ',4A1,A1,A1,A1)
118 ILERR=ILL+4
IF(LPRD) WRITE(1,119)
C (ISYM(I,IPRD),I=1,8),IPRD,ILERR,(IPAGE(I,ILL),I=1,79)
119 FORMAT(' OUTPUT PIN NAME = ',8A1,' OUTPUT PIN NUMBER = ',I2,
C ' MINTERM IN LINE NUMBER ',I3,/,' ',80A1)
IF( LPRD.AND.COUNT.LT.8 )
C WRITE(1,116) IPROD,IPAL,INOAI,IOT,INOO
116 FORMAT(' THIS PRODUCT LINE NUMBER ',I2,' IS NOT VALID',
C ' FOR ',4A1,A1,A1,A1)
IF( LPRD.AND.COUNT.GT.8 )
C WRITE(1,117) IPAL,INOAI,IOT,INOO
117 FORMAT(' MAXIMUM OF 8 PRODUCTS LINES ARE VALID FOR ',4A1,A1,A1,A1,
C ' TOO MANY MINTERMS ARE SPECIFIED IN THIS EQUATION')
STOP ERROR
102 IF(ITYPE.LE.4) CALL TWEEK(ITYPE,IOT,LFUSES)
ENDFILE 6
108 WRITE(1,106)
106 FORMAT(' OPERATION CODES:')
WRITE(1,107)
107 FORMAT(/,' E=ECHO O=PINOUT P=PLOT B=BRIEF ',
C /,' H=HEX L=BHLF N=BNPF Q=QUIT S=SIMULATE')
WRITE(1,110)
110 FORMAT(' ENTER OPERATION CODE:')
READ(1,120) IOP
120 FORMAT(A1)
IF(IOP.EQ.E) CALL ECHO(IPAL,INOAI,IOT,INOO,REST,PATNUM,TITLE,
C COMP)
IF(IOP.EQ.O) CALL PINOUT(IPAL,INOAI,IOT,INOO,TITLE)
IF(IOP.EQ.P) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.TRUE.,ITYPE,
C LPROD,IOP,IBLOW)
IF(IOP.EQ.B) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.TRUE.,ITYPE,
C LPROD,IOP,IBLOW)
IF(IOP.EQ.H) CALL HEX(LFUSES)
IF(IOP.EQ.L) CALL BINR(LFUSES,H,L)
IF(IOP.EQ.N) CALL BINR(LFUSES,P,N)
C IF(IOP.EQ.R) GOTO 999
IF(IOP.EQ.S) CALL TEST(LPHASE,LBUF,TITLE,IC,IL,ILE,ISYM,IBUF,
C ITYPE,INOO,LFIX)
IF(IOP.NE.Q) GO TO 108
STOP
END
C
C************************************************************************
C
SUBROUTINE INITLZ(INOAI,IOT,INOO,ITYPE,LFUSES,IC,IL,IBLOW,LFIX)
BYTE INOAI,IOT,INOO
LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR,
C LFIX,LFUSES(32,64)
BYTE IPAGE,H,L,C,R,X,A,I0,I2,I4,I6,I8,INOAI,IOT,INOO
COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR
COMMON /PGE/ IPAGE(80,100)
DATA H/'H'/,L/'L'/,C/'C'/,R/'R'/,X/'X'/,A/'A'/
C I0/'0'/,I2/'2'/,I4/'4'/,I6/'6'/,I8/'8'/
DO 20 J=1,64
DO 20 I=1,32
20 LFUSES(I,J)=.FALSE.
IBLOW=0
IC=0
IL=1
ITYPE=0
IF( INOAI.EQ.I0 ) ITYPE=1
IF( INOAI.EQ.I2 ) ITYPE=2
IF( INOAI.EQ.I4 ) ITYPE=3
IF( (INOAI.EQ.I6) ) ITYPE=4
IF( (INOAI.EQ.I6).AND.(INOO.EQ.I8) ) ITYPE=5
IF( (IOT.EQ.R).OR.(IOT.EQ.X).OR.(IOT.EQ.A) ) ITYPE=6
IF( .NOT.(IOT.EQ.H.OR.IOT.EQ.L.OR.IOT.EQ.C
C .OR.IOT.EQ.R.OR.IOT.EQ.X.OR.IOT.EQ.A) ) ITYPE=0
CALL INCR(IC,IL,LFIX)
RETURN
END
C
C*************************************************************************
C
SUBROUTINE INCR(IC,IL,LFIX)
LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR,
C LFIX,LX1
BYTE IPAGE,IBLANK,ILEFT,IAND,IOR,COMENT,ISLASH,IEQUAL,
C IRIGHT,ICOLON
COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR
COMMON /PGE/ IPAGE(80,100)
DATA IBLANK/' '/,ILEFT/'('/,IAND/'*'/,IOR/'+'/,COMENT/';'/,
C ISLASH/'/'/,IEQUAL/'='/,IRIGHT/')'/,ICOLON/':'/
LBLANK=.FALSE.
LXOR=.FALSE.
LXNOR=.FALSE.
LX1=.FALSE.
LRIGHT=.FALSE.
10 IC=IC+1
IF( IC.LE.79.AND.IPAGE(IC,IL).NE.COMENT ) GO TO 30
IL=IL+1
20 IC=0
GO TO 10
30 IF( IPAGE(IC,IL).EQ.ICOLON.AND.(LFIX) ) RETURN
IF( IPAGE(IC,IL).NE.IBLANK ) GO TO 31
LBLANK=.TRUE.
GO TO 10
31 IF( IPAGE(IC,IL).NE.ICOLON ) GO TO 32
IF( (LXOR).OR.(LXNOR) ) GO TO 33
LX1=.TRUE.
GO TO 10
33 IF(LXOR) LOR=.TRUE.
IF(LXNOR) LAND=.TRUE.
RETURN
32 IF( .NOT.(LX1.AND.(IPAGE(IC,IL).EQ.IOR.OR.IPAGE(IC,IL).EQ.IAND)) )
C GO TO 34
IF( IPAGE(IC,IL).EQ.IOR ) LXOR=.TRUE.
IF( IPAGE(IC,IL).EQ.IAND ) LXNOR=.TRUE.
GO TO 10
34 LLEFT =( IPAGE(IC,IL).EQ.ILEFT )
LAND =( IPAGE(IC,IL).EQ.IAND )
LOR =( IPAGE(IC,IL).EQ. IOR )
LSLASH=( IPAGE(IC,IL).EQ.ISLASH )
LEQUAL=( IPAGE(IC,IL).EQ.IEQUAL )
LRIGHT=( IPAGE(IC,IL).EQ.IRIGHT )
RETURN
END
C
C************************************************************************
C
SUBROUTINE GETSYM(LPHASE,ISYM,J,IC,IL,LFIX)
BYTE ISYM(8,20)
LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR,
C LFIX,LPHASE(20)
BYTE IPAGE,IBLANK
COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LXNOR
COMMON /PGE/ IPAGE(80,100)
DATA IBLANK/' '/
LFIX=.FALSE.
IF( .NOT.(LLEFT.OR.LAND.OR.LOR.OR.LEQUAL.OR.LRIGHT) ) GO TO 10
CALL INCR(IC,IL,LFIX)
IF(LLEFT) GO TO 60
10 LPHASE(J)=( .NOT.LSLASH )
IF(LPHASE(J)) GO TO 15
CALL INCR(IC,IL,LFIX)
15 DO 20 I=1,8
20 ISYM(I,J)=IBLANK
25 DO 30 I=1,7
30 ISYM(I,J)=ISYM(I+1,J)
ISYM(8,J)=IPAGE(IC,IL)
CALL INCR(IC,IL,LFIX)
IF( LLEFT.OR.LBLANK.OR.LAND.OR.LOR.OR.LRIGHT.OR.LEQUAL ) RETURN
GO TO 25
60 LFIX=.TRUE.
RETURN
END
C
C***************************************************************************
C
SUBROUTINE MATCH(IMATCH,IBUF,ISYM)
BYTE IBUF(8,20),ISYM(8,20)
LOGICAL LMATCH
BYTE C,A,R,Y
DATA C/'C'/,A/'A'/,R/'R'/,Y/'Y'/
IMATCH=0
DO 20 J=1,20
LMATCH=.TRUE.
DO 10 I=1,8
10 LMATCH=LMATCH.AND.(IBUF(I,1).EQ.ISYM(I,J))
IF(LMATCH) IMATCH=J
20 CONTINUE
IF( IBUF(3,1).EQ.C.AND.IBUF(4,1).EQ.A.AND.IBUF(5,1).EQ.R.AND.
C IBUF(6,1).EQ.R.AND.IBUF(7,1).EQ.Y ) IMATCH=99
RETURN
END
C
C**********************************************************************
C
SUBROUTINE IXLATE(IINPUT,IMATCH,LPHASE,LBUF,ITYPE)
BYTE ITABLE(20,6)
LOGICAL LPHASE(20),LBUF(20)
DATA ITABLE/
C 3, 1, 5, 9,13,17,21,25,29,-10,31,-1,-1,-1,-1,-1,-1,-1,-1,-20,
C 3, 1, 5, 9,13,17,21,25,29,-10,31,27,-1,-1,-1,-1,-1,-1, 7,-20,
C 3, 1, 5, 9,13,17,21,25,29,-10,31,27,23,-1,-1,-1,-1,11, 7,-20,
C 3, 1, 5, 9,13,17,21,25,29,-10,31,27,23,19,-1,-1,15,11, 7,-20,
C 3, 1, 5, 9,13,17,21,25,29,-10,31,-1,27,23,19,15,11, 7,-1,-20,
C -1, 1, 5, 9,13,17,21,25,29,-10,-1,31,27,23,19,15,11, 7, 3,-20/
IINPUT=0
IBUBL=0
IF((( LPHASE(IMATCH)).AND.(.NOT.LBUF(1))).OR.
C ((.NOT.LPHASE(IMATCH)).AND.( LBUF(1)))) IBUBL=1
IF( ITABLE(IMATCH,ITYPE).GT.0 ) IINPUT=ITABLE(IMATCH,ITYPE)+IBUBL
RETURN
END
C
C************************************************************************
C
SUBROUTINE PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,LDUMP,ITYPE,
C LPROD,IOP,IBLOW)
BYTE IBUF(8,20),IOUT(64),TITLE(80)
LOGICAL LBUF(20),LFUSES(32,64),LDUMP,LPROD(80)
BYTE ISAVE(64,32),IAND,IOR,ISLASH,
C IDASH,X,IBLANK,P,B,HIFANT,IOP,CLRS
DATA ISAVE/2048*' '/,IAND/'*'/,IOR/'+'/,ISLASH/'/'/,
C IDASH/'-'/,X/'X'/,IBLANK/' '/,P/'P'/,B/'B'/,
C HIFANT/'O'/,CLRS/X'0C'/
IF(.NOT.LDUMP) GO TO 4
4 IF(LDUMP) GO TO 60
IF(ISAVE(IPROD,1).NE.IBLANK) RETURN
IF( LBUF(1) ) GO TO 5
DO 30 J=1,31
30 ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
ISAVE(IPROD,32)=ISLASH
5 DO 20 I=1,8
IF( ISAVE(IPROD,1).NE.IBLANK ) RETURN
IF( IBUF(I,1).EQ.IBLANK ) GO TO 20
DO 10 J=1,31
10 ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
ISAVE(IPROD,32)=IBUF(I,1)
20 CONTINUE
IF(ISAVE(IPROD,1).NE.IBLANK) RETURN
40 DO 50 J=1,31
50 ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
ISAVE(IPROD,32)=IAND
RETURN
60 WRITE(1,62) CLRS,TITLE
62 FORMAT(' ',A1,80A1,//,
C ' 11 1111 1111 2222 2222 2233',/,
C ' 0123 4567 8901 2345 6789 0123 4567 8901',/)
DO 100 I88PRO=1,57,8
DO 94 I8PRO=1,8
IPROD=I88PRO+I8PRO-1
ISAVE(IPROD,32)=IBLANK
DO 70 I=1,32
IF( ISAVE(IPROD,1).NE.IBLANK ) GO TO 70
DO 65 J=1,31
ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
65 CONTINUE
ISAVE(IPROD,32)=IBLANK
70 CONTINUE
DO 80 I=1,32
IOUT(I)=X
IF( LFUSES(I,IPROD) ) IOUT(I)=IDASH
IOUT(I+32)=ISAVE(IPROD,I)
80 CONTINUE
IF(ITYPE.LE.4) CALL FANTOM(ITYPE,IOUT,IPROD,I8PRO)
IPROD=IPROD-1
DO 85 J=1,32
IF( IOP.EQ.B.AND.IOUT(J).EQ.HIFANT ) IOUT(J)=IBLANK
85 CONTINUE
IF( (IOP.EQ.P).OR.(IOP.EQ.B.AND.(LPROD(IPROD+1))) )
C WRITE(1,90) IPROD,IOUT
90 FORMAT(' ',I2,8(' ',4A1),' ',32A1)
94 CONTINUE
WRITE(1,96)
96 FORMAT(1X)
100 CONTINUE
WRITE(1,110)
110 FORMAT(/,
C' LEGEND: X : FUSE NOT BLOWN (L,N,0) - : FUSE BLOWN (H,P,1)')
IF( IOP.EQ.P.AND.ITYPE.LE.4 ) WRITE(1,111)
111 FORMAT(
C' 0 : PHANTOM FUSE (L,N,0) O : PHANTOM FUSE (H,P,1)')
WRITE(1,112) IBLOW
112 FORMAT(/,' NUMBER OF FUSES BLOWN = ',I4)
WRITE(1,113)
113 FORMAT(////)
RETURN
END
C
C*************************************************************************
C
SUBROUTINE TWEEK(ITYPE,IOT,LFUSES)
BYTE IOT
LOGICAL LFUSES(32,64)
BYTE L,C
DATA L/'L'/,C/'C'/
IF(ITYPE.GE.4) GO TO 20
DO 10 IPROD=1,64
LFUSES(15,IPROD)=.TRUE.
LFUSES(16,IPROD)=.TRUE.
LFUSES(19,IPROD)=.TRUE.
LFUSES(20,IPROD)=.TRUE.
IF(ITYPE.GE.3) GO TO 10
LFUSES(11,IPROD)=.TRUE.
LFUSES(12,IPROD)=.TRUE.
LFUSES(23,IPROD)=.TRUE.
LFUSES(24,IPROD)=.TRUE.
IF(ITYPE.GE.2) GO TO 10
LFUSES( 7,IPROD)=.TRUE.
LFUSES( 8,IPROD)=.TRUE.
LFUSES(27,IPROD)=.TRUE.
LFUSES(28,IPROD)=.TRUE.
10 CONTINUE
DO 18 IINPUT=7,28
DO 12 IPROD=1,57,8
LFUSES(IINPUT,IPROD+4)=.FALSE.
LFUSES(IINPUT,IPROD+5)=.FALSE.
LFUSES(IINPUT,IPROD+6)=.FALSE.
12 LFUSES(IINPUT,IPROD+7)=.FALSE.
IF(ITYPE.GE.3) GO TO 18
DO 14 IPROD=17,41,8
LFUSES(IINPUT,IPROD+2)=.FALSE.
14 LFUSES(IINPUT,IPROD+3)=.FALSE.
IF(ITYPE.GE.2) GO TO 18
DO 16 IPROD=1,57,8
LFUSES(IINPUT,IPROD+2)=.FALSE.
16 LFUSES(IINPUT,IPROD+3)=.FALSE.
18 CONTINUE
20 IF( (ITYPE.EQ.1) .OR. ((ITYPE.EQ.4).AND.(IOT.EQ.L)) ) RETURN
DO 99 IINPUT=1,32
DO 30 IPROD=1,8
LFUSES(IINPUT,IPROD+ 0)= (IOT.NE.L)
30 IF(IOT.NE.C) LFUSES(IINPUT,IPROD+56)= (IOT.NE.L)
IF(ITYPE.LE.2) GO TO 99
DO 40 IPROD=1,8
LFUSES(IINPUT,IPROD+ 8)= (IOT.NE.L)
40 IF(IOT.NE.C) LFUSES(IINPUT,IPROD+48)= (IOT.NE.L)
IF(ITYPE.LE.3) GO TO 99
DO 50 IPROD=1,8
LFUSES(IINPUT,IPROD+16)= (IOT.NE.L)
50 IF(IOT.NE.C) LFUSES(IINPUT,IPROD+40)= (IOT.NE.L)
99 CONTINUE
RETURN
END
C
C************************************************************************
C
SUBROUTINE SLIP(LFUSES,I88PRO,INOAI,IOT,INOO,IBLOW)
LOGICAL LFUSES(32,64)
BYTE R,I1,I2,I4,I6,I8,IOT,INOO,INOAI
DATA R/'R'/,I1/'1'/,I2/'2'/,I4/'4'/,I6/'6'/,I8/'8'/
IF( (INOAI.NE.I6) .OR. (INOO.EQ.I1) .OR. (INOO.EQ.I2) .OR.
C ( (IOT.EQ.R).AND.(INOO.EQ.I8) ) .OR.
C ( (I88PRO.GE. 9).AND.(I88PRO.LE.49).AND.(INOO.EQ.I6) ) .OR.
C ( (I88PRO.GE.17).AND.(I88PRO.LE.41).AND.(INOO.EQ.I4)) ) RETURN
DO 10 I=1,32
IBLOW = IBLOW + 1
10 LFUSES(I,I88PRO) = .TRUE.
I88PRO = I88PRO + 1
RETURN
END
C
C*************************************************************************
C
SUBROUTINE FANTOM(ITYPE,IOUT,IPROD,I8PRO)
BYTE IOUT(64)
BYTE X,IDASH,LOFANT,HIFANT
DATA X/'X'/,IDASH/'-'/,LOFANT/'0'/,HIFANT/'O'/
DO 10 I=1,32
IF( IOUT(I).EQ.IDASH ) IOUT(I)=HIFANT
IF( IOUT(I).EQ.X ) IOUT(I)=LOFANT
10 CONTINUE
IF((ITYPE.EQ.4).AND.((IPROD.LE.24).OR.(IPROD.GE.41))) RETURN
IF((ITYPE.EQ.3).AND.((IPROD.LE.16).OR.(IPROD.GE.45))) RETURN
IF((ITYPE.EQ.2).AND.((IPROD.LE. 8).OR.(IPROD.GE.53))) RETURN
IF((ITYPE.LE.3).AND.(I8PRO.GE.5)) RETURN
IF((ITYPE.LE.2).AND.(IPROD.GE.19).AND.(IPROD.LE.48).AND.
C (I8PRO.GE.3)) RETURN
IF((ITYPE.EQ.1).AND.(I8PRO.GE.3)) RETURN
DO 50 I=1,32
IF(((I.EQ.15).OR.(I.EQ.16).OR.(I.EQ.19).OR.(I.EQ.20)).AND.
C (ITYPE.LE.3)) GO TO 50
IF(((I.EQ.11).OR.(I.EQ.12).OR.(I.EQ.23).OR.(I.EQ.24)).AND.
C (ITYPE.LE.2)) GO TO 50
IF(((I.EQ. 7).OR.(I.EQ. 8).OR.(I.EQ.27).OR.(I.EQ.28)).AND.
C (ITYPE.LE.1)) GO TO 50
IF( IOUT(I).EQ.HIFANT ) IOUT(I)=IDASH
IF( IOUT(I).EQ.LOFANT ) IOUT(I)=X
50 CONTINUE
RETURN
END
C
C****************************************************************************
C *****************************************************************
SUBROUTINE DATAIO (TEXT,NUMBER)
LOGICAL TEXT(1)
INTEGER NUMBER
EXTERNAL PUNCH
DO 10 I= 1, NUMBER
10 CALL PUNCH(TEXT(I))
RETURN
END
C ***********************************************************
C ***********************************************************
C ***********************************************************
LOGICAL FUNCTION IHEXA(I)
LOGICAL STRNG(16)
DATA STRNG/'0','1','2','3','4','5','6','7','8','9',
1 'A','B','C','D','E','F'/
M=MOD(I,16)+1
IHEXA=STRNG(M)
RETURN
END
C **********
SUBROUTINE HEX(LFUSES)
LOGICAL LFUSES(32,64)
LOGICAL ITEMP(64),IHEXA
LOGICAL T(128)
LOGICAL STX,ETX,NULL(50),DC1,READER
EXTERNAL READER
DATA STX/X'02'/,ETX/X'03'/,NULL/50*X'00'/,DC1/X'11'/
WRITE(1,81)
81 FORMAT(' DATA I/O SETUP:'/' TYPE ''SELECT 50,ENTER''')
WRITE(1,82)
82 FORMAT(' TYPE ''SELECT D2,ENTER''')
WRITE(1,83)
83 FORMAT(' THEN PRESS ''START'' BUTTON ')
87 IF(READER(0).XOR.DC1) GOTO 87
WRITE(1,88)
88 FORMAT(' STARTING TRANSMISSION')
ENCODE(T,70)STX
CALL DATAIO(T,1)
DO 40 I=1,33,32
INC=I-1
DO 40 IPROD=1,7,2
DO 20 J=1,2
DO 20 IINPUT=1,32
IHEX=0
M=IPROD+INC+J-1
IF(LFUSES(IINPUT,M+ 0)) IHEX=IHEX+1
IF(LFUSES(IINPUT,M+ 8)) IHEX=IHEX+2
IF(LFUSES(IINPUT,M+16)) IHEX=IHEX+4
IF(LFUSES(IINPUT,M+24)) IHEX=IHEX+8
M=IINPUT+32*(J-1)
20 ITEMP(M)=IHEXA(IHEX)
ENCODE(T,60)ITEMP
40 CALL DATAIO(T,128)
ENCODE(T,80)ETX,NULL
CALL DATAIO(T,51)
60 FORMAT(64(A1,' '))
70 FORMAT(A1)
80 FORMAT(51A1)
RETURN
END
C
C*************************************************************************
C
SUBROUTINE ECHO(IPAL,INOAI,IOT,INOO,REST,PATNUM,TITLE,COMP)
BYTE IPAL(4),REST(73),PATNUM(80),TITLE(80),COMP(79)
BYTE IPAGE,INOAI,IOT,INOO,CLRS
COMMON /PGE/ IPAGE(80,100)
COMMON /FTEST/ IFUNCT,IDESC,IEND
DATA CLRS/X'0C'/
WRITE(1,10)CLRS,IPAL,INOAI,IOT,INOO,REST,PATNUM,TITLE,COMP
10 FORMAT(' ',A1,4A1,A1,A1,A1,73A1,/,' ',80A1,/,' ',80A1,/,' ',80A1)
DO 30 J=1,IEND
WRITE(1,20) (IPAGE(I,J),I=1,80)
20 FORMAT(' ',80A1)
30 CONTINUE
RETURN
END
C
C******************************************************************************
C
SUBROUTINE BINR(LFUSES,H,L)
BYTE ITEMP(4,8),H,L,CLRS
LOGICAL LFUSES(32,64)
DATA CLRS/X'0C'/
WRITE(1,10)CLRS
10 FORMAT(' ',A1)
DO 20 I=1,33,32
INC=I-1
DO 20 IPROD=1,8
DO 20 J=1,25,8
DO 15 K=1,8
IINPUT=J+K-1
ITEMP(1,K)=L
ITEMP(2,K)=L
ITEMP(3,K)=L
ITEMP(4,K)=L
MYINX = IPROD + INC
IF(LFUSES(IINPUT,MYINX + 0)) ITEMP(4,K)=H
IF(LFUSES(IINPUT,MYINX + 8)) ITEMP(3,K)=H
IF(LFUSES(IINPUT,MYINX + 16)) ITEMP(2,K)=H
IF(LFUSES(IINPUT,MYINX + 24)) ITEMP(1,K)=H
15 CONTINUE
20 WRITE(1,30) ITEMP
30 FORMAT(' ',8('B',4A1,'F '))
WRITE(1,10)
RETURN
END
C
C**************************************************************************
C
SUBROUTINE PINOUT(IPAL,INOAI,IOT,INOO,TITLE)
BYTE IPAL(4),TITLE(80),PIN(8,20),IIN(7,2)
BYTE IPAGE,IBLANK,ISTAR,INOAI,IOT,INOO,CLRS
COMMON /PGE/ IPAGE(80,100)
DATA IBLANK/' '/,ISTAR/'*'/,CLRS/X'0C'/
DO 10 J=1,20
DO 5 I=1,8
5 PIN(I,J)=IBLANK
10 CONTINUE
15 DO 25 J=1,2
DO 20 I=1,7
20 IIN(I,J)=IBLANK
25 CONTINUE
IIN(2,1)=IPAL(1)
IIN(4,1)=IPAL(2)
IIN(6,1)=IPAL(3)
IIN(1,2)=IPAL(4)
IIN(3,2)=INOAI
IIN(5,2)=IOT
IIN(7,2)=INOO
J=0
IL=0
30 IC=0
IL=IL+1
35 IC=IC+1
40 IF( IC.GT.80 ) GO TO 30
IF( IPAGE(IC,IL).EQ.IBLANK ) GO TO 35
J=J+1
IF(J.GT.20) GO TO 60
DO 55 I=1,8
PIN(I,J)=IPAGE(IC,IL)
IC=IC+1
IF( IC.GT.80 ) GO TO 40
IF( IPAGE(IC,IL).EQ.IBLANK ) GO TO 40
55 CONTINUE
60 DO 75 J=1,10
II=0
65 II=II+1
IF(II.EQ.9) GO TO 75
IF( PIN(II,J).NE.IBLANK ) GO TO 65
I=9
70 I=I-1
II=II-1
PIN(I,J)=PIN(II,J)
PIN(II,J)=IBLANK
IF(II.NE.1) GO TO 70
75 CONTINUE
WRITE(1,76)CLRS,TITLE
76 FORMAT(' ',A1,80A1)
WRITE(1,78) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
78 FORMAT(/,' ',14X,14A1,3X,14A1,
C /,' ',14X,A1,13X,A1,1X,A1,13X,A1)
JJ=20
DO 88 J=1,10
WRITE(1,80) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
80 FORMAT(' ',11X,4A1,29X,4A1)
WRITE(1,81) (PIN(I,J),I=1,8),ISTAR,J,ISTAR,
C (IIN(I,1),I=1,7),ISTAR,JJ,ISTAR,(PIN(I,JJ),I=1,8)
81 FORMAT(' ',8A1,3X,A1,I2,A1,11X,7A1,11X,A1,I2,A1,3X,8A1)
WRITE(1,82) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
82 FORMAT(' ',11X,4A1,29X,4A1)
WRITE(1,84) ISTAR,(IIN(I,2),I=1,7),ISTAR
84 FORMAT(' ',14X,A1,11X,7A1,11X,A1)
DO 86 II=1,2
DO 85 I=1,7
85 IIN(I,II)=IBLANK
86 CONTINUE
JJ=JJ-1
88 CONTINUE
WRITE(1,90) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
C ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
90 FORMAT(' ',14X,31A1)
RETURN
END
C
C*****************************************************************************
C
SUBROUTINE FIXSYM(LBUF,IBUF,IC,IL,LFIRST,LFUSES,IBLOW,IPROD,LFIX)
LOGICAL LBUF(20),LFUSES(32,64),LFIRST,LMATCH,LFIX
BYTE IBUF(8,20),FIXBUF(8)
BYTE IPAGE,A,B,ISLASH,IOR,IBLANK,IRIGHT,IAND,
C N,Q,N0,N1,N2,N3,ICOLON,TABLE(5,14)
COMMON /PGE/ IPAGE(80,100)
DATA A/'A'/,B/'B'/,ISLASH/'/'/,IOR/'+'/,IBLANK/' '/,IRIGHT/')'/,
C IAND/'*'/,N/'N'/,Q/'Q'/,N0/'0'/,N1/'1'/,N2/'2'/,N3/'3'/,
C ICOLON/':'/
DATA TABLE / ' ','A','+','/','B',' ',' ','A','+','B',
C ' ',' ',' ',' ','A','/','A','+','/','B',' ',' ',' ','/','B',
C 'A',':','+',':','B',' ','A','*','/','B',' ','/','A','+','B',
C 'A',':','*',':','B',' ',' ',' ',' ','B',' ',' ','A','*','B',
C ' ',' ',' ','/','A','/','A','*','/','B',' ','/','A','*','B'/
IINPUT=0
DO 20 I=1,8
IBUF(I,1)=IBLANK
20 FIXBUF(I)=IBLANK
21 CALL INCR(IC,IL,LFIX)
I=IPAGE(IC,IL)
IF(I.EQ.IRIGHT) GO TO 40
IF(I.EQ.N0) IINPUT=8
IF(I.EQ.N1) IINPUT=12
IF(I.EQ.N2) IINPUT=16
IF(I.EQ.N3) IINPUT=20
DO 24 J=1,7
24 IBUF(J,1)=IBUF(J+1,1)
IBUF(8,1)=I
IF(.NOT. ( (I.EQ.A).OR.(I.EQ.B).OR.(I.EQ.ISLASH).OR.(I.EQ.IOR)
C .OR.(I.EQ.IAND).OR.(I.EQ.ICOLON) ) ) GO TO 21
DO 30 I=1,4
30 FIXBUF(I)=FIXBUF(I+1)
FIXBUF(5)=IPAGE(IC,IL)
GO TO 21
40 IMATCH=0
DO 60 J=1,14
LMATCH=.TRUE.
DO 50 I=1,5
50 LMATCH=LMATCH .AND. ( FIXBUF(I).EQ.TABLE(I,J) )
60 IF(LMATCH) IMATCH=J
IF(IMATCH.EQ.0) GO TO 100
IF(.NOT.LFIRST) GO TO 85
LFIRST=.FALSE.
DO 80 I=1,32
LFUSES(I,IPROD)=.TRUE.
80 IBLOW = IBLOW + 1
85 DO 90 I=1,4
IF( (IMATCH-7).LE.0 ) GO TO 90
MYINX = IINPUT + I
LFUSES(MYINX,IPROD)=.FALSE.
IBLOW = IBLOW - 1
IMATCH=IMATCH-8
90 IMATCH=IMATCH+IMATCH
LBUF(1)=.TRUE.
CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.FALSE.,ITYPE,
C LPROD,IOP,IBLOW)
100 LFIX=.FALSE.
CALL INCR(IC,IL,LFIX)
RETURN
END