File F1113.FT (FORTRAN source file)

Directory of image this file is from
This file as a plain text file


*	     ***   A AP16XX TEST PROGRAM   ***
*	     ***   A AP16XX TEST PROGRAM   ***
*
*
       IDENT SAMPLE
       MAG		     SHOULD PRECEED FIRST OBJECT OUTPUT
       M30		     STOULD PRECEED FIRST INSTRUCTION, M30 IS DE
*	     THE NEXT STATEMENT IS A 'SPACE 10'
       SPACE 10
** CONTROL INSTRUCTIONS
START  HLT		     NO OPERAND FIELD FOR CONTROL INSTRUCTIONS
       NOP
** CONDITIONAL JUMP INSTRUCTIONS
CJ     JOV   *+2	     A ZERO DISPLACEMENT ADDRESSES NEXT INST
       JAZ   2		     A NEGATIVE DISPLACEMENT
       NAB CJ		     OPERAND FIELD STARTS AFTER MNEMONIC
       NAX   *+300	     THIS OPERAND ADDRESS IS OUT OF RANGE
       SSS   CJ+2	     ILLEGAL MNEMONIC OPERATION CODE
** SHIFT INSTRUCTIONS
ALPHA  LLA   5
       LLL   -5 	     NEGATIVE OPERANDS ARE NOT ALLOWED FOR SHIFT
       ALA   X'10'	     SHIFT COUNT MAY BE EXPRESSION
ALPHA  ARL   TEN+2	     SYMBOL IN NAME IS MULTI-DEFINED
       ALA   ** 	     ** INDICATES TO BE CHANGED DURING EXECUT.
** INPUT/OUTPUT
BETA   IBS		     NO OPERAND NEEDED FOR SERIAL I/O
       IBA   2,2	     DEVICE ORDER,DEVICE NUMBER
       OBM   4,4,BUF,X	     MEMORY I/O WITH INDEX FLAG - X
** REGISTER OPERATE
       XRA		     NO OPERAND FOR REGISTER INSTRUCTIONS
** NON LITERAL MEMORY REFERENCING INSTRUCTIONS
123456 LDA   *		     MODE 0  SYMBOL IN NAME IS NOT LEGAL
       ORG   256	     ORG ASSEMBLER INSTRUCTION
.DOT   STA   *+2	     MODE 1
       LDX*  OOPS	     MODE 2   SYMBOL IN OPERAND IS UNDEFINED
       LDX*  BUF+5	     MODE 3
A23456 STX-		     MODE 4  NO OPERAND FIELD FOR THIS MODE
       ADV+  30 	     MODE 5
       MUL/  SAM,X	     MODE 6  WITH ADDRESS FLAG
       LDV/  SAM	     MODE 6  NO INDEX FLAG
** FIXED WORD LENGTH LITERAL MODE INSTRUCTIONS	(MODE 7)
       LDA=  H'-1'	     TWO BYTE LITERAL WITH FIRST BYTE ZERO
SPOT   STA=  ** 	     A REG. STORED IN SPOT+1
       MUL=  E'100'	     E AND D TYPES ARE NOT LEGAL IN FIXED WORD
       LDA=  A'ALPHA'	     ADDRESS TYPE WITH NO INDEX FLAG
       LDA=  A'ALPHA,X'      ADDRESS TYPE WITH INDEX FLAG - X
       LDX=  ALPHA	     ADDRESS TYPE LITERAL WITHOUT A'
       CPA=  C'A'	     TWO BYTE LITERAL WITH FIRST BYTE ZEROS
       ANA=  X'FF'	     TWO BYTE LITERAL WITH HEX RIGHT JUSTIFIED
** VARIABLE WORD LENGTH LITERALS (MODE 7)
       LDV=	 SAM	     TWO BYTE ADDRESS LITERAL
       ADV=  D'1023'	     FOUR BYTE INTEGER
       ANV=  X'9ABCDEF'      FOUR BYTE, LENGTH DETERMINED BY COUNT
       CPV=  C'A'	     SINGLE BYTE LITERAL, LENGTH DET. BY COUNT
** ASSEMBLER INSTRUCTIONS
TEN    EQU   8		     SYMBOL IS EQUATED TO 8
TEN    SET   10 	     SET DOES NOT ALLOW MULTI-DEFINED ERROR
       DC    A'TEN+2-1,X'    ADDRESS CONSTANT
       DC    TEN+2-1,X	     ADDRESS CONSTANT
SAM    DC    C'THIS IS A DC'
BUF    DS    4		     FOUR BYTES ARE RESERVED
       DC    ** 	     WORD TO BE CHANGED DURING EXECUTION
** JUMP AND RETURN JUMP INSTRUCTIONS
       JMP/  ALPHA	     MODE 6  TWO BYTE EXTENDED ADDRESS
       JMP=  ALPHA,X	     MODE 7  TWO BYTE INDIRECT EXTENDED ADDRESS
*  820 INSTRUCTION TEST
       LDB   *		     LOAD B REGISTER
       STB*  *+2	     STORE B REGISTER
       RTN		     RETURN
       CAL   1024,X	     CALL
       PLX		     PULL X
       PSX		     PUSH X
       PLA		     PULL A
       PSA		     PUSH A
       PLB		     PULL B
       PSB		     PUSH B
MST    MST   F'512'	     MULTIPLY STEP
       ADX   0-3	     ADD TO X
       JEP   MST	     JUMP EVEN PARITY
       EBX		     EXCHANGE B AND
       MOV		     MOVE
       GCC		     GENERATE CYCLIC CODE
       SCH		     SEARCH
       GAP		     GENERATE ASCII PARITY
*
*			     BIT 32 TEST
       DC    C'ABCDEFGHIJKL'
       LDV=  C'ABCD'
       LDV=  X'FFFFFFFF'
       LDV=  X'80000000'
*			     ORG TEST
       ORG   X'1000'
       NOP
       NOP
       NOP
       ORG   X'2000'
       NOP
       NOP
       ORG   X'3000'
       NOP
*
*	     END OPERAND USES:	0 = RETURN TO LOADER
*			    NOT 0 = EXECUTE ADDRESS
*			NONE, EOF = NO LOAD RACORD
       END   0
*	     A STACKED PROGRAM
       NOP
       END   0
C	      AP16XX CROSS ASSEMBLER	  5 OCT 73     VERSION 3.0
C
C	 P/N  11130
C
C     NOTE:  TO CHANGE TABLE SIZES ALTER --
C
C	ITEM		    VALUE OF -		DIMENSION OF -
C
C	SYMBOL TABLE	    STTOP		ST, STVAL, ROOTS
C	CROSS REFERENCE     REFTOP		REFS
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      INTEGER CSET(64),CARD(20),OPCODE(95), ASCII(64)
      DIMENSION MNEM(95)
C * MNEM CONTAINS A CODED VALUE OF ALL MNEMONICS.  OPCODE IS A CORRES-
C	 PONDING ARRAY OF VALUES.  PSEUDO OPS HAVE NEG VALUES.
C	 N*1000 IS ADDED TO INST VALUE, WHERE N IS NUMBER OF BYTES.GT. 1
C	 IN INSTRUCTION
C
C		   COMMON MNEMONICS
C
      DATA MNEM / 39496,23470,45389,29334,23333,45810,23174,
     1			      21325,21965,
     X	      35240,35241,35280,35281,35320,35616,
     2		       28069,47505,23552,      21543,23143,
     3		       44161,44162,44163,44164,45761,45762,45763,45764,
     4		       31391,30835,30875,31755,30823,31743,30811,30833,
     5		       37791,37235,37275,38155,37223,38143,37211,37233,
     6		       34450,34451,34461,34690,34691,34701,
     7		       16850,16851,16861,17090,17091,17101,
     8			     29250,29251,29262,37785,
     9			     38850,38851,38862,
     A		       39490,53890,39491,53891,29753,21313,17313,46113,
     B		       29730,29731,38890,38891,46833,46873,47730,47731,
     C		       31305,44379,30102,22102,34153,45993,
     D		       16530,16551,45250,45271, 	   16930,16951,
     E		       34130,34151,45970,45991/
C
      DATA OPCODE / -2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,
     2		       0,1,2,  4,5,    8,9,10,11,12,13,14,15,
     4		       1016,1017,1018,1019,1020,1021,1022,1023,
     5		       1024,1025,1026,1027,1028,1029,1030,1031,
     6		       1032,1033,1034,1036,1037,1038,
     7		       1040,1041,1042,1044,1045,1046,
     8			    1049,1050,3051,52,	   1057,1058,3059,
     A		       64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     C		       96,104,112,120,128,136,		160,168,176,184,
     E			       208,216,224,232,240,248/
C
C		   MODEL DEPENDENT MNEMONICS
C
C    COLUMN USE:  1=10 2=11 3=13 4=20 5=21 6=30 7=OP
C
      INTEGER  XMNEM(7,34), DUMMY1(7,17), DUMMY2(7,17)
      EQUIVALENCE  (XMNEM(1,1), DUMMY1(1,1)),
     1		   (XMNEM(1,18),DUMMY2(1,1))
      DATA     DUMMY1 /
     1		   40905, 0,	 0,	0,     0,     40945, 3,
     2		   21909, 0,	 21909, 21909, 21909, 21909, 6,
     3		   23509, 0,	 23509, 23509, 23509, 23509, 7,
     4		   0,	  0,	 0,	0,     0,     47348, 2035,
     5		   0,	  0,	 0,	0,     0,     26018, 1039,
     6		   29268, 29268, 29268, 0,     0,     44393, 1048,
     7		   0,	  0,	 16553, 0,     20052, 20052, 53,
     8		   0,	  0,	 22873, 0,     0,     0,     54,
     9		   0,	  0,	 46105, 0,     0,     0,     55,
     A		   38868, 38868, 38868, 0,     0,     0,     1056,
     B		   0,	  0,	 31583, 0,     21213, 21213, 60,
     C		   0,	  0,	 31595, 0,     21931, 21931, 61,
     D		   0,	  0,	 29787, 0,     36421, 36421, 2062,
     E		   0,	  0,	 53787, 0,     21551, 21551, 2063,
     F		   0,	  0,	 34131, 44383, 44383, 44383, 80,
     G		   0,	  0,	 0,	19621, 19621, 19621, 2081,
     H		   0,	  0,	 0,	40873, 40873, 40873, 82/
      DATA     DUMMY2 /
     I		   0,	  0,	 0,	41153, 41153, 41153, 83,
     J		   0,	  0,	 0,	40850, 40850, 40850, 84,
     K		   0,	  0,	 0,	41130, 41130, 41130, 85,
     L		   0,	  0,	 0,	40851, 40851, 40851, 86,
     M		   0,	  0,	 0,	41131, 41131, 41131, 87,
     N		   0,	  0,	 45971, 36349, 36349, 36349, 2088,
     O		   0,	  0,	 0,	16553, 16553, 16553, 2089,
     P		   0,	  0,	 0,	30985, 30985, 30985, 1090,
     Q		   0,	  0,	 0,	22873, 22873, 22873, 91,
     R		   0,	  0,	 0,	36191, 36191, 36191, 92,
     S		   0,	  0,	 0,	26092, 26092, 26092, 93,
     T		   0,	  0,	 0,	45297, 45297, 45297, 94,
     U		   0,	  0,	 0,	26025, 26025, 26025, 95,
     V		   36421, 0,	 36421, 34131, 34131, 34131, 144,
     W		   21551, 0,	 21551, 45971, 45971, 45971, 152,
     X		   20210, 0,	 20210, 20210, 20210, 20210, 192,
     Y		   20231, 0,	 20231, 20231, 20231, 20231, 200/
C
C * CSET IS A CODE SET USED BY THIS PROGRAM.  THE TRANSLATION IS MADE
C     BY THE UNPACK PROGRAM.  THE 64 CODES ARE ORDER BY THEIR BCD OR
C     DISPLAY CODES
C
      DATA CSET/ 45,10,11,12,13,14,15,16,17,18,48,36,57,
     1			     41,37,55,56,19,20,21,22,23,24,25,26,27,
     2			     47,43,39,42,59,62,38,40,28,29,30,31,32,
     3			     33,34,35,63,46,54,49,58,60,0,1,2,3,4,
     4			     5,6,7,8,9,50,53,61,51,44,52/
C
      DATA ASCII / 176,177,178,179,180,181,182,183,184,185,
     1			      193,194,195,196,197,198,199,200,201,202,
     2			      203,204,205,206,207,208,209,210,211,212,
     3			      213,214,215,216,217,218,
     4			      174,171,173,170,175,168,169,164,189,160,
     5			      172,161,219,223,186,167,162,163,165,
     6			      222,166,188,190,187,191,192,220,255/
      DATA KBLNK /1H  /   , MEOF /0/,  KBLNK4 /4H    /
      INTEGER STTOP
C
      STTOP  = 999
      REFTOP = 1111
C
   50 STMAX = 0
      PC = 0
      IDENT = 0
      KLINE = 57
      KPAGE = 1
      REWIND 10
      REFMAX = 1
      DO 98 K=1,REFTOP
   98	   REFS(K)  = 0
      DO 99 K=1,STTOP
   99	   ROOTS(K) = 0
C		   DEFAULT MACHIN = 6 = 30
      MACHIN = 6
      ECOUNT = 0
C		   DEFAULT OBJECT MEDIA = 0 = CARDS,  NOT 0 = MAG TAPE
      MFLAG = 0
      LINE = 0
      IF (MEOF .NE. 0)	STOP
C
C  START OF PASS ONE
C
C  READ NEXT CARD
  100 CALL ERROR (-1)
      LINE = LINE + 1
      READ(1,102,END=105) (CARD(J),J=1,20)
  102 FORMAT (20A4)
  103 CALL UNPACK (A,CARD,CSET)
      KST = - 1
      INST = 0
      KPC = 0
      KSTOP = 0
      KTYPE = 0
      GO TO 106
  105 IF (IDENT .EQ. 0)  STOP
      MEOF = 1
      GO TO 260
C
C TEST FOR COMMENT CARD, TEST FOR SYMBOL
  106 IF (A(1) .EQ. 39) GO TO 120
      IF (A(1) .EQ. 45) GO TO 200
C GET SYMBOL AND PUT IN SYMBOL TABLE
      IF (A(1) .LT. 10) GO TO 118
      IF (A(1) .GT. 36) GO TO 118
      IA = 1
      CALL SYMBOL (KS)
      IF (A(IA) .NE. 45)  GO TO 118
      IF (STMAX .EQ. 0) GO TO 112
      DO 110 I=1,STMAX
      IF (KS .EQ. ST(I)) GO TO 114
  110 CONTINUE
  112 STMAX = STMAX + 1
      IF (STMAX .GT. STTOP) GO TO 130
      KST = STMAX
      ST(STMAX) = KS
      STVAL(STMAX) = PC
      CALL DEF(STMAX)
      GO TO 200
C SYMBOL ALREADY IN TABLE - THEREFORE DOUBLY DEFINED
  114 CALL ERROR (4)
      KST = I
      GO TO 200
  118 CALL ERROR (2)
      GO TO 200
C
C COMMENT CARD
  120 KTYPE =-1
      GO TO 250
  130 PRINT 131
  131 FORMAT (18H SYMBOL TABLE FULL   )
      IDENT = 0
      GO TO 50
C
C DETERMINE INSTRUCTION
C
  200 KOP = 1600*A(8) + 40 * A(9) + A(10)
  205 KSTAR = A(11)
      KPC = 1
C
C   SEARCH MNEMONIC TABLE
      DO 210 I=1,95
      IF (KOP .EQ. MNEM(I)) GO TO 215
  210 CONTINUE
C		   SEARCH MODEL DEPENDENT TABLE
      DO 201  I=1,34
	 IF  (KOP .EQ. XMNEM(MACHIN,I))  GO TO 202
  201 CONTINUE
C			ABSENT
      GO TO 211
C			PRESENT
  202 INST = XMNEM(7,I)
      GO TO 2215
  211 CALL ERROR (5)
      KPC = 2
      GO TO 250
  215 INST = OPCODE(I)
 2215 CONTINUE
C
C FIND BEGINNING OF OPERAND FIELD
      DO 216 IA=11,20
      IF (A(IA) .EQ. 45)  GO TO 217
  216 CONTINUE
      IA = 14
  217 IS = IA
      DO 218 IA=IS,40
      IF (A(IA) .NE. 45)  GO TO 219
  218 CONTINUE
      IA = 14
  219 IA14 = IA
      IF (INST .GE. 0) GO TO 220
C
C INSTRUCTION IS PSEUDO OP - BRANCH ACCORDINGLY
      KTYPE = INST
      K = - INST
      KPC = 0
      INST = 0
      GO TO (250,300,305,320,330,310,250,250,340,350,360,370,380,
     1		     390,400,410), K
C
C PROCESS MACHIN INST.
C
  220 KPC =  INST/1000 + 1
      INST = INST - (KPC-1)*1000
      K = INST/16
      KTYPE = 0
C		   CHECK FOR	  RTX
      IF (MACHIN .NE. 6) GO TO 228
      IF (INST .EQ. 48) KPC=3
  228 CONTINUE
C			CHECK FOR MST, ADX
      IF (INST .EQ. 88)  GO TO 23
      IF (INST .EQ. 89)  GO TO 23
C			CHECK FOR GAI
      IF (INST .EQ. 39) GO TO 23
C ADDRESS MODE PROCESSING FOR 810
      IF (K .LT. 6) GO TO 250
      KPC = 2
      IF (KSTAR .EQ. 45) GO TO 250
      IF (KSTAR .EQ. 38) GO TO 230
      IF (KSTAR .EQ. 37) GO TO 232
      IF (KSTAR .EQ. 40) GO TO 234
      IF (KSTAR .EQ. 44) GO TO 236
      IF (KSTAR .EQ. 39) GO TO 225
      GO TO 211
C  MODES 2-3
  225 INST = INST + 2
      GO TO 250
C  MODE 4
  230 KPC = 1
      INST = INST + 4
      GO TO 250
C  MODE 5
  232 INST = INST + 5
      GO TO 250
C  MODE 6
  234 KPC = 3
      INST = INST + 6
      GO TO 250
C  MODE 7
  236 INST = INST + 7
      KPC = 3
      IF (K .EQ. 6) GO TO 250
  23  KPC = 1
C			LITERAL LENGTH NOT CHECKED FOR GAI
      IF (INST .EQ. 39) GO TO 24
      KNV = - 1
      IF (K .LT. 10)  GO TO 237
      IF (MSK(INST,16) .EQ. 7)	GO TO 237
  24  KNV = 0
C
C DETERMINE TYPE AND LENGTH OF LITERALS
C
  237 K = A(IA)
      IF (A(IA+1) .EQ. 51)  GO TO 238
C  A TYPE WITHOUT A'
      KTYPE = KTYPE + 8
      KPC = KPC + 2
      GO TO 250
  238 IF (K .EQ. 17)  GO TO 240
      IF (K .EQ. 15)  GO TO 241
      IF (K .EQ. 14)  GO TO 242
      IF (K .EQ. 13)  GO TO 243
      IF (K .EQ. 10)  GO TO 244
      IF (K .EQ. 33)  GO TO 245
      IF (K .EQ. 12)  GO TO 248
  239 CALL ERROR (6)
      KTYPE = 0
      KPC = KPC + 2
      GO TO 250
C  H TYPE
  240 KTYPE = KTYPE + 1
      KPC = KPC + 1
      IF (KNV .LT. 0)  KPC = 3
      GO TO 250
C  F TYPE
  241 KTYPE = KTYPE + 2
      KPC = KPC +2
      GO TO 250
C  E TYPE
  242 KTYPE = KTYPE + 3
      IF (KNV .LT. 0)  GO TO 272
      KPC = KPC + 3
      GO TO 250
C  D TYPE
  243 KTYPE = KTYPE + 4
      IF (KNV .LT. 0)  GO TO 272
      KPC = KPC + 4
      GO TO 250
C  A TYPE
  244 KTYPE = KTYPE + 5
      KPC = KPC + 2
      GO TO 250
C  X TYPE
  245 KTYPE = KTYPE + 6
      IA = IA + 2
      L = IA + 8
      DO 246 I=IA,L
      IF (A(I) .EQ. 51)  GO TO 247
  246 CONTINUE
      GO TO 239
  247 KPC = KPC + (I-IA+1)/2
      GO TO 270
C  C TYPE
  248 KTYPE = KTYPE + 7
      IA = IA + 2
      DO 249 I=IA,72
      IF (A(I) .EQ. 51)  GO TO 270
  249 KPC = KPC + 1
      KPC = 3
      GO TO 239
C
C WRITE TAPE
C
  250 WRITE (10) (CARD(J),J=1,20),INST,PC,KPC,(ERRTAB(J),J=1,4),IE,
     1		  KTYPE,IA14,KST
      IDENT = 1
      PC = PC + KPC
      IF (KSTOP .EQ. 0) GO TO 100
  260 END FILE 10
      REWIND 10
      IF (MFLAG .EQ. 0)  PUNCH 265
  265 FORMAT (80X)
      PRINT 726, KPAGE
      KPAGE = KPAGE + 1
      KSTOP = 0
      LINE = 0
      MACHIN = 6
      GO TO 500
C
C CHECK THAT FIXED WORD LENGTH LITERALS ARE TWO BYTES
C
  270 IF (KNV .EQ. 0)  GO TO 250
      IF (KPC .GT. 3)  GO TO 272
      KPC = 3
      GO TO 250
  272 CALL ERROR (6)
      KTYPE = 0
      KPC = 3
      GO TO  250
C
C PROCESS PSEUDO OPS
C
C  ORG - SET PC TO VALUE OF OPERAND IF IN RANGE
  300 CALL EVAL (32767,0)
      PC = KA
      IF (KST .EQ. STMAX)  GO TO 307
      INST = 0
      GO TO 250
C
C  EQU - SET LAST SYMBOL,IF ANY, TO VALUE IN OPERAND FIELD
  305 CALL EVAL (65535,0)
      IF (KST .LE. 0)  GO TO 250
      IF (STVAL(STMAX) .EQ. PC) GO TO 307
      CALL ERROR (2)
      GO TO 250
  307 STVAL(KST) = KA
      INST = KA
      GO TO 250
C
C  END
  310 KSTOP = 1
      GO TO 250
C
C  SET
  320 IF (KST .LT. 0)  GO TO 250
      IF (ERRTAB(4) .NE. KBLNK)  ECOUNT = ECOUNT -1
      CALL ERROR (-1)
      CALL EVAL (65535,-65536)
      GO TO 307
C
C	 IDENT - VESTIGIAL, FUNCTIONS AS COMMENT
  330 IF (IDENT .NE. 0) GO TO 250
      IDENT = 1
      GO TO 250
C
C  DC TYPE
  340 KTYPE = 10
      KNV = 0
      GO TO 237
C
C  DS TYPE
  350 CALL EVAL (32767,0)
      KPC = KA
      GO TO 250
C			M10
  360 MACHIN = 1
      GO TO 250
C			M11
  370 MACHIN = 2
      GO TO 250
C			M20
  380 MACHIN = 4
      GO TO 250
C			M21
  390 MACHIN = 5
      GO TO 250
C			M30
  400 MACHIN = 6
      GO TO 250
C			MAG, SET FLAG
  410 MFLAG = 1
      GO TO 250
C
C
C START OF PASS TWO	******************************************
C
  500 DO 501 I =1,14
  501 B(I) = KBLNK
      LINE  = LINE + 1
C  READ CARD AND DETERMINE TYPE INST. -  KTYPE NEG FOR PSEUDO OPS,
C	   ZERO FOR NON LITERAL INST, AND POS IF A LITERAL CODE
      READ (10,END=711) (CARD(J),J=1,20),INST,PC,KPC,(ERRTAB(J),J=1,4),
     1	     IE,  KTYPE,IA,KST
      CALL UNPACK  (A,CARD,CSET)
      IF (KTYPE .GE. 10)  GO TO 730
      IF (KTYPE .GE. 0) GO TO 509
      K = -KTYPE
      GO TO (800,703,700,705,710,715,720,725,800,730,
     1		  741,742,743,744,745,800), K
C
C PROCESS MACHIN INST.
C
  509 CALL HEX (PC,2,1)
      KPC = KPC - 1
      IF (INST/16 .LT. 6)  GO TO 650
      M = MSK(INST,8) + 1
      GO TO (510,510,510,510,770,540,550,560),M
C
C PROCESS ADDRESS MODES
C  .PAGE ZERO AND RELATIVE MODES
  510 CALL EVAL (32767,0)
      IF (A(IA) .NE. 45)  GO TO 517
      IF (KA .LT. 256) GO TO 780
      INST = INST + 1
  513 KA = KA - PC - 2
      IF (KA .GT. 127) GO TO 515
      IF (KA .LT. (-128))  GO TO 515
      GO TO 780
  515 CALL ERROR (7)
  516 KA = 0
      GO TO 780
  517 CALL ERROR (6)
      GO TO 516
C  INDEX WITH BIAS
  540 CALL EVAL (255,0)
      GO TO 780
C  EXTENDED ADDRESS MODE
  550 CALL EVAL (65535,0)
      IF (A(IA) .NE. 46)  GO TO 780
      IF (A(IA+1) .EQ. 33)  KA = MSK(KA,32768) + 32768
      GO TO 780
C  LITERAL MODE
  560 IF (INST/16 .EQ. 6)  GO TO 550
  564 K = KTYPE
      IF (KTYPE .EQ. 0) GO TO 516
      IF (KTYPE .GE. 10) K = KTYPE - 10
      KA = 0
      IF (K .EQ. 0) GO TO 780
      IA = IA + 2
  565 GO TO (570,580,590,600,610,620,630,640),K
C
C  H TYPE
  570 CALL EVAL (127,-128)
      KA = MSK(KA,256)
      GO TO 780
C
C  F TYPE
  580 CALL EVAL (32767,-32768)
      GO TO 780
C
C  E TYPE
  590 CALL EVAL (8388607,-8388608)
      GO TO 780
C
C  D TYPE
  600 CALL EVAL (2147483647, 2**31)
      GO TO 780
C
C  A TYPE
  610  GO TO 550
C
C  X TYPE
  620 IA = IA - 2
      GO TO (571,621,591,600),KPC
  621 CALL EVAL (65535,0)
      GO TO 780
C
  571 CALL EVAL (255,0)
      KA = MSK(KA,256)
      GO TO 780
C
  591 CALL EVAL(16777216,0)
      GO TO 780
C
C  C TYPE
  630 IF (KTYPE .EQ. 17)  GO TO 632
      CALL HEX (INST,1,5)
      CALL PUNCH (INST,1,PC,MFLAG)
      PC = PC + 1
      IF (A(IA+1) .NE. 51)  GO TO 632
      J = A(IA)
      KA = ASCII(J+1)
      GO TO 790
  632 L = KPC - 1 + IA
      DO 635 I=IA,L
      J = A(I)
      IF (J .EQ. 51)  J = 45
      KA = ASCII (J+1)
      CALL PUNCH (KA,1,PC,MFLAG)
      IF (I .LE. IA+3)	CALL HEX (KA,1,7+2*(I-IA))
  635 PC = PC +1
      GO TO 800
C
C  ADDRESS TYPE WITH NO A'
  640 IA = IA - 2
      GO TO 550
C
C INSTRUCTIONS LESS THAN 6
  650 K = INST/16 + 1
      GO TO (655,657,660,670,770,680),K
C
C UNRECOGNIZABLE MNEMONIC - LEAVE TWO BYTES OF ZERO
  655 IF (KPC .EQ. 0) GO TO 770
      KA = 0
      GO TO 780
C
C CONDITIONAL JUMPS
  657 CALL EVAL (32767,0)
      IF (KA .NE. 0)  GO TO 513
      IF (A(IA-1) .NE. 39)  GO TO 513
      IF (A(IA-2) .NE. 39)  GO TO 513
      GO TO 780
C
C  SHIFTS
C			CHECK FOR TNS
  660 IF  (INST .EQ. 35)  GO TO 550
C			CHECK FOR GAI
  662 IF (INST .EQ. 39)  GO TO 564
      CALL EVAL (127,0)
      GO TO 780
C
C  INPUT/OUTPUT   JUMP OUT IF NOP
C			CHECK FOR RTX
  670 IF (INST .NE. 48)  GO TO 671
      IF (MACHIN .EQ. 6) GO TO 550
  671 CONTINUE
C			CHECK FOR NOP, CLC, DAD, DSB
      IF (INST .EQ. 52)  GO TO 770
      IF (INST .EQ. 53)  GO TO 770
      IF (INST .EQ. 60)  GO TO 770
      IF (INST .EQ. 61)  GO TO 770
C			CHECK FOR MUL, DIV
      IF (INST .EQ. 62)  GO TO 550
      IF (INST .EQ. 63)  GO TO 550
      KA = 0
C			CHECK FOR IBS, OBS
      IF (INST .EQ. 48)  GO TO 780
      IF (INST .EQ. 56)  GO TO 780
      CALL HEX (INST,1,5)
      CALL PUNCH (INST,1,PC,MFLAG)
      CALL EVAL (7,0)
      K = KA
      IA = IA + 1
      CALL EVAL (31,0)
      IA = IA + 1
      KA = KA + 32*K
      CALL HEX (KA,1,7)
      CALL PUNCH (KA,1,PC+1,MFLAG)
      IF (INST .EQ.  51) GO TO 675
      IF (INST .NE. 59)  GO TO 800
C  IBM AND OBM
  675 CALL EVAL (65535,0)
      IF (A(IA) .NE. 46)  GO TO 677
      IF (A(IA+1) .EQ. 33)  KA = MSK (KA,32768) + 32768
  677 CALL PUNCH (KA,2,PC+2,MFLAG)
      CALL HEX (KA,2,9)
      GO TO 800
C
C INST 5
  680 M = MSK(INST,16) + 1
      GO TO (770,550,770,770,770,770,770,770,564,564,657,
     1		       770,770,770,770,770),M
C
C PSEUDO OPS
C
C  EQU TYPE
  700 CALL HEX (INST,2,7)
      GO TO 800
C
C  ORG
  703 IF (INST .NE. 0)	CALL HEX (PC,2,1)
      GO TO 735
C
C  SET
  705 IF (KST .LT. 0)  GO TO 800
      CALL EVAL (65535,-65536)
      INST = KA
      STVAL(KST) = KA
      GO TO 700
C
C  IDENT
  710 GO TO 800
C
C  END
C			ENTRY FORM EOF (NO END CARD)
  711 DO 712 I=1,20
  712	 CARD(I) = KBLNK4
      DO 713 I=1,14
  713	 B(I) = KBLNK
      DO 714 I = 1, 80
  714	 A(I) = 45
  715 KSTOP = 1
      CALL HEX (PC,2,1)
      IF (A(IA) . EQ. 45)  GO TO 800
      CALL EVAL (32767,0)
      CALL PUNCH (0,999,KA,MFLAG)
      INST = KA
      GO TO 700
C
C  SPACE
  720 CALL EVAL (60,0)
      IF (KLINE-KA .LT. 2)  GO TO 725
      IF (KA .GT. 20)  GO TO 725
      IF (KA .EQ. 0)  GO TO 500
      DO 722 I=1,KA
  722 PRINT 723
  723 FORMAT (1H )
      KLINE = KLINE - KA
      GO TO 500
C
C EJECT
  725 PRINT 726, KPAGE
  726 FORMAT (1H1, 9X, 18HAP16XX VERSION 3.0 , 40X, 5HPAGE , I3, /, 1H
     1	   / 3X, 5HFLAGS, 3X, 2HPC,  3X, 6HOBJECT,   9X, 4HLINE,
     2	       2X, 6HSOURCE )
      KLINE = 57
      KPAGE = KPAGE + 1
      GO TO 500
C
C  DC AND DS TYPE
  730 CALL HEX (PC,2,1)
      IF (KTYPE .GE. 10)  GO TO 564
  735 CALL PUNCH (0,0,0,MFLAG)
      GO TO 800
C		   M10
  741 MACHIN = 1
      GO TO 800
C		   M11
  742 MACHIN = 2
      GO TO 800
C		   M20
  743 MACHIN = 4
      GO TO 800
C		   M21
  744 MACHIN = 5
      GO TO 800
C		   M30
  745 MACHIN = 6
      GO TO 800
C
C PLACE INST IN PUNCH AND PRINT BUFFERS
C
  770 CALL HEX (INST,1,5)
      CALL PUNCH (INST,1,PC,MFLAG)
      GO TO 800
C
  780 IF (KTYPE .GE. 10)  GO TO 790
      IF (KTYPE .LT. 0)   GO TO 790
      CALL HEX (INST,1,5)
      CALL PUNCH (INST,1,PC,MFLAG)
      PC = PC + 1
C
C PLACE OPERAND IN PUNCH AND PRINT BUFER
C
  790 CALL HEX (KA,KPC,7)
      CALL PUNCH (KA,KPC,PC,MFLAG)
C
C PRINT LINE OF LISTING
C
  800 PRINT 802,(ERRTAB(I),I=1,4),(B(I),I=1,14),LINE,(CARD(I),I=1,20)
  802 FORMAT (1H ,3X,4A1,2X,4A1,2X,10A1,5X,I4,2X,20A4)
      KLINE = KLINE - 1
      IF (KSTOP .EQ. 0) GO TO 810
  806 REWIND 10
      CALL PUNCH (0,0,PC,MFLAG)
C			IF MAG TAPE, WRITE EOF
      IF  (MFLAG .NE. 0)  END FILE 9
      IF  (STMAX .GT. 0)  CALL LIST
      IF  (ECOUNT .NE. 0)  GO TO 808
      PRINT 807
  807 FORMAT (////, 28H1 NO ERRORS IN THIS ASSEMBLY)
      GO TO 50
C
  808 IF  (ECOUNT .GT. 100)  ECOUNT = 100
      PRINT 809, ECOUNT, (ELIST(I), I=1,ECOUNT)
  809 FORMAT(1H1,//,I4,25H ERRORS IN THIS ASSEMBLY:,  /// 99(2X,20I5//))
      GO TO 50
  810 IF (KLINE .EQ. 0) GO TO 725
      GO TO 500
      END
      SUBROUTINE  PUNCH  (K,M,LC,MFLAG)
C
C **PUNCH ROUTINE CAUSES OUTPUT TO CARDS.  EACH BYTE IS PUNCHED AS
C      TWO HOLLERITH CHARACTERS.  K=BINARY OUTPUT, M= NO. OF BYTES.
C  IF NUMBER  (M) IS GT 99 PUT ONLY LC IN COL 1-4
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      INTEGER	LC,OCT(17)
      DIMENSION KPBUF(120)
      DATA OCT		   / 1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,
     1			     1HA,1HB,1HC,1HD,1HE,1HF,1H /
      DATA  IP/1/
C
      INTEGER  POWER (8)
      DATA     POWER /1, 16, 256, 4096, 65536, 1048576, 16777216,
     1							  268435456/
C
      KK = K
      IF (KK .LT. 0)  KK = KK +2**31
C
C			CHECK FOR MAG TAPE OUTPUT
      IF (MFLAG .NE. 0)  GO TO 1
      IF (M .NE. 0) GO TO 100
      IF (IP .EQ. 1) RETURN
      PUNCH 105,(KPBUF(J),J=1,80)
      IP = 1
      RETURN
  100 IF (IP .EQ. 1)  GO TO 108
      IF (M+M+IP .LE. 81)  GO TO 120
  102 PUNCH  105,(KPBUF(J),J=1,80)
  105 FORMAT (80A1)
  108 DO 110 I=1,80
  110 KPBUF(I) = OCT(17)
      IP = 5
      DO 115 I=1,4
      L = MSK (LC/ POWER(5-I), 16)
  115 KPBUF(I) = OCT(L+1)
      IF (M .GT. 40) RETURN
  120 N = 2*M
      DO 130 I=1,N
      L = MSK (KK/ POWER(N-I+1), 16)
C			ACCOMODATE SIGN BIT
      IF (K .GE. 0) GO TO 125
      IF (N .NE. 8) GO TO 125
      IF (I .EQ. 1)  L = L+8
  125 CONTINUE
      KPBUF(IP) = OCT(L+1)
  130 IP = IP +1
      RETURN
C
C
C		   MAG TAPE OUTPUT
C
C			CHECK FIRST OR LAST ENTRY
1     IF (M .NE. 0)  GO TO 200
      IF (IP .EQ. 1)  RETURN
      CALL MAG (KPBUF,IP)
      IP = 1
      RETURN
C			CHECK FIRST OR FULL
200   IF (IP .EQ. 1)  GO TO 208
      IF (M+IP .LE. 120)  GO TO 220
      CALL MAG (KPBUF,IP)
C			RESET BUFFER
208   DO 210 I = 1,80
210   KPBUF(I) = 0
      IP = 4
      KPBUF(2) = LC/256
      KPBUF(3) = MSK (LC,256)
      IF (M .GT. 40)  RETURN
C			PUT DATA IN BUFFER
220   DO 230 I = 1, M
      L = MSK (KK / POWER (2*(M-I) + 1), 256)
      IF (K .GE. 0)  GO TO 225
      IF (M .NE. 4)  GO TO 225
      IF (I .EQ. 1)  L = L + 128
225   CONTINUE
      KPBUF(IP) = L
230   IP = IP + 1
      RETURN
      END
      SUBROUTINE  HEX  (K,M,JS)
C  HEX SUBROUTINE PLACES K IN HEXADECIMAL IN B FOR PRINTING LISTING
      INTEGER	OCT(17)
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      DATA OCT / 1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,
     1			     1HA,1HB,1HC,1HD,1HE,1HF,1H /
C
      INTEGER  POWER (8)
      DATA     POWER /1, 16, 256, 4096, 65536, 1048576, 16777216,
     1							  268435456/
C
      KK = K
      IF (KK .LT. 0)  KK = KK +2**31
      IF (M .EQ. 0)  RETURN
      IF (M .GT. 4)  RETURN
      N = M + M
      DO 190 I=1,N
      L = MSK (KK/ POWER(N-I+1), 16)
C			ACCOMODATE 32 BIT SIGN
      IF (K .GE. 0) GO TO 9
      IF (N .NE. 8) GO TO 9
      IF (I .EQ. 1)  L = L+8
9     CONTINUE
      J = JS + I - 1
  190 B(J) = OCT (L+1)
      RETURN
      END
      SUBROUTINE  MAG (KPBUF, IP)
C
C	      COMPUTES CHECKSUM AND WRITES REC
C
C     DCL 1 MAG.REC
C	    2 LENGTH   (1)
C	    2 LOCATION (2)
C	    2 DATA     (LENGTH)
C	    2 CHECKSUM (1)
C
      INTEGER  KPBUF(120)
      DATA  K24 /16 777 216/
C
C			INSERT LENGTH
      KPBUF(1) = IP-4
C			COMPUTE CHECKSUM
      K = 0
      IP1 = IP - 1
      DO 99 I=1, IP1
	 K1 = K/128
	 K2 = KPBUF(I)/128
	 K  = K + KPBUF(I)
	 K  = MSK (K,256)
	 K3 = K/128
	 IF (K1 .NE. K2)  GO TO 99
	 IF (K1 .NE. K3)  K = K+1
99	 K = MSK (K,256)
      KPBUF(IP) = K
C			WRITE TAPE
      DO 98  I = 1,IP
98	 KPBUF(I) = KPBUF(I) * K24
      WRITE (9,100)  (KPBUF(K), K=1,IP)
100   FORMAT (120A1)
C			EXIT
      RETURN
      END
      SUBROUTINE EVAL (KH,KL)
C
C** EVAL ROUTINE EVALUATE AN ADDRESS EXPRESSION CONSISTING OF DECIMAL
C      AND HEXADECIMAL NUMBERS, AND DEFINED SYMBOLS, WITH +- OPERATORS.
C  KH IS HIGH LIMIT,  KL IS LOW LIMIT
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      INTEGER  DEC
      KA = 0
      KSIGN = 0
C TEST FOR FIRST CHARACTER +-BLANK
      M = A(IA)
      IF (M .EQ. 37) GO TO 110
      IF (M .EQ. 38) GO TO 112
      IF (M .EQ. 45)  GO TO 105
C TEST FOR HEX, DECIMAL, SYMBOL, *, **
  100 M = A(IA)
      IF (M .NE. 33)  GO TO 102
      IF (A(IA+1) .NE. 51)  GO TO 150
      IF (A(IA+2) .LT. 16)  GO TO 120
  102 IF (M .EQ. 39)  GO TO 160
      IF (M .LT. 10)  GO TO 140
      IF (M .LT. 37)  GO TO 150
C ERROR IN ADDRESS EXPRESSION, SKIP TO , OR BLANK
  105 CALL ERROR (6)
  106 IS = IA
      DO 107 I=IS,72
      IA = I
      IF (A(I) .EQ. 45)  GO TO 109
      IF (A(I) .EQ. 46)  GO TO 109
  107 CONTINUE
  109 KA = 0
      RETURN
C
C + SIGN
  110 KSIGN = 0
      IA = IA + 1
      GO TO 100
C - SIGN
  112 KSIGN = -1
      IA = IA + 1
      GO TO 100
C
C HEXADECIMAL NUMBER
  120 IA = IA + 2
      DEC = 0
      L = IA+8
      IS = IA
      DO 122 I=IS,L
      IA = I
      M = A(I)
      IF (M .GT. 15) GO TO 124
  122 DEC = DEC*16 + M
      GO TO 105
C CHECK FOR PROPER TERMINATION OF HEX FIELD
  124 IF (M .NE. 51) GO TO 105
      IA = IA+1
C
C ADD DEC TO KA
  128 KA = KA + DEC
      IF (KSIGN .LT. 0)  KA = KA - 2*DEC
C
C  TEST NEXT CHAR FOR +-',BLANK
C ' , OR BLANK ENDS EXPRESSION
  130 M = A(IA)
      IF (M .EQ. 37)  GO TO 110
      IF (M .EQ. 38)  GO TO 112
      IF (M .EQ. 51)  GO TO 180
      IF (M .EQ. 45)  GO TO 180
      IF (M .EQ. 46)  GO TO 180
      GO TO 105
C
C DECIMAL NUMBER
  140 DEC = 0
      L = IA + 10
      IS = IA
      DO 142 I=IS,L
      IA = I
      IF (A(I) .GT. 9)	GO TO 128
  142 DEC = DEC*10 + A(I)
      GO TO 105
C
C SYMBOL- FIND SYMBOL IN ST AND PUT VALUE IN DEC AND ADD TO KA
  150 CALL SYMBOL(M)
      IF (STMAX .EQ. 0) GO TO 156
      DO 154 I=1,STMAX
      DEC = STVAL(I)
      IF  (ST(I) .NE. M)  GO TO 154
	  CALL REF(I)
	  GO TO 128
  154 CONTINUE
C SYMBOL NOT IN SYMBOL TABLE
  156 CALL ERROR(3)
      GO TO 106
C
C * OR ** SYMBOL
  160 IA = IA + 1
      DEC = PC
      IF (A(IA) .NE. 39) GO TO 128
      IA = IA + 1
      DEC = 0
      GO TO 128
C
C  CHECK THAT VALUE IS IN RANGE
C
  180 IF (KA .GT. KH) GO TO 105
      IF (KA .LT. KL) GO TO 105
C
C*** FIX TO TWOS COMPLEMENT NUMBER IF ONES COMP MACHINE
C
C     IF (KA .LT. 0)  KA = MSK (KA, 2**32) + 1
C
      RETURN
      END
      SUBROUTINE  SYMBOL (KS)
C
C** SYMBOL ROUTINE ACCUMULATES A SYMBOL AND ASSIGNS A NUMERIC IDENTIFIER
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      KS = 0
      L = IA + 5
      IS = IA
      DO 110 I=IS,72
      IA = I
      IF (A(I)	.GE. 37)  GO TO 120
      IF (I .LE. L) KS = 37*KS+A(I)
  110 CONTINUE
  120 RETURN
      END
      SUBROUTINE  ERROR (KD)
C
C ** ERROR ROUTINE PLACES AN ERROR FLAG IN ERRTAB
C		AND BUILDS ELIST, BUMPS ECOUNT
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
      INTEGER EFT(7)
      DATA EFT		  / 1H ,1HN,1HU,1HM,1HO,1HA,1HR /
C
      IF (KD .GE. 0) GO TO 100
      DO 50 I=1,4
   50 ERRTAB(I) = EFT(1)
      IE = 4
      RETURN
  100 ERRTAB(IE) = EFT(KD)
      IF (IE .GT. 1) IE = IE - 1
      ECOUNT = ECOUNT + 1
      IF  (ECOUNT .LE. 100)  ELIST(ECOUNT) = LINE
      RETURN
      END
C					    ***   LIST	 ***
      SUBROUTINE  LIST
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
C
      INTEGER  CHRBUF(12), REFBUF(18), CONVRT(37), FIRST, SYM, BIAS, DEC
      DATA  K64  /65536/,  K37X5 /69 343 957/
      DATA  CONVRT /1H0, 1H1, 1H2, 1H3, 1H4, 1H5, 1H6, 1H7, 1H8, 1H9,
     A	  1HA, 1HB, 1HC, 1HD, 1HE, 1HF, 1HG, 1HH, 1HI, 1HJ, 1HK, 1HL,
     B	  1HM, 1HN, 1HO, 1HP, 1HQ, 1HR, 1HS, 1HT, 1HU, 1HV, 1HW, 1HX,
     C	  1HY, 1HZ, 1H./
      DATA  CHRBUF /1H ,1H ,1H ,1H ,1H ,1H ,1H ,1H ,1H ,1H ,1H ,1H /
C					    INITIALIZE
      KPAGE = 0
      LINE  = 55
      FIRST = 0
C					    INSERT INDEX IN ROOT TABLE
      DO 1 K=1,STMAX
    1	   ROOTS(K) = ROOTS(K) + K * K64
C					    SORT ROOT TABLE
C
      I = STMAX/2
    2 IF  (I .LT. 2)  GO TO 3
	  CALL SIFTUP(I,STMAX)
	  I = I-1
	  GO TO 2
C
C
    3 I = STMAX
    4 IF  (I .LT. 2)  GO TO 5
	  CALL SIFTUP(1,I)
	  JUNK	   = ROOTS(1)
	  ROOTS(1) = ROOTS(I)
	  ROOTS(I) = JUNK
	  I	   = I-1
	  GO TO 4
    5 CONTINUE
C					    PROCESS WARNING MESSAGE
C
       IF  (REFMAX .GT. REFTOP-2)  PRINT 101
  101	   FORMAT (////, 49H   ***   WARNING:  REFERENCE TABLE OVERFLOW
     X	***)
C					    BEGIN MAIN PRINT LOOP
C
      DO 99 INDEX = 1, STMAX
      LINE = LINE + 1
C					    PROCESS TITLE
C
       IF  (LINE .LE. 55)  GO TO 8
	   LINE = 1
	   KPAGE = KPAGE + 1
	   PRINT 102, KPAGE
  102	   FORMAT (84H1  ****	 A P 1 6 X X	 C R O S S     R E F E R
     A E N C E	   L I S T I N G    ****, 15X, 4HPAGE, I3,
     B	     //    37H SYMBOL	 VALUE	  DEFN * REFERENCES, / )
C					    CONVERT SYMBOL TO CHARACTERS
C
    8 SYM = ST(ROOTS(INDEX) / K64)
      DO 98 BIAS=1,37
C	 PRINT 100, INDEX,BIAS,SYM
	   IF  (SYM .GE. 0)  GO TO 10
	   SYM =SYM - K37X5
   98	   CONTINUE
   10 DO 97 K=1,6
	   CHRBUF(7-K)= MOD(SYM,37)
   97	   SYM	      =     SYM/37
      CHRBUF(1) = CHRBUF(1) + BIAS - 1
      DO 96 K = 1,6
   96	   CHRBUF(K) = CONVRT(CHRBUF(K)+1)
C					    PROCESS NEW FIRST CHARACTER
C
      DO 91 LEAD=1,6
	   IF  (CHRBUF(LEAD) .NE. CONVRT(1))  GO TO 15
   91	   CONTINUE
   15 LEAD6 = LEAD + 5
      IF  (FIRST .EQ. CHRBUF(LEAD))  GO TO 20
	  LINE = LINE + 1
	  FIRST = CHRBUF(LEAD)
	  PRINT 111
  111	  FORMAT (1H )
C					    FETCH VALUE IN DEC, HEX
C
   20 DEC = STVAL(ROOTS(INDEX)/K64)
      CALL HEX(DEC,2,1)
C					    FETCH DEF
C
      LINK = MSK(ROOTS(INDEX),K64)
      KDEF = 0
      IF  (LINK .NE. 0)  KDEF = REFS(LINK)/K64
      LINK = MSK(REFS(LINK),K64)
C					    PROCESS CASE OF NO REFS
C
      IF  (LINK .NE. 0) GO TO 25
	  PRINT103, (CHRBUF(K), K=LEAD,LEAD6), DEC, (B(K), K=1,4), KDEF
  103	  FORMAT (1X, 6A1, I7, 1X, 4A1, I5, 15H *     - NONE -)
	  GO TO 99
C					    TRANSFER FIRST 18 REFS
C
   25 DO 95 KBUF=1,18
	  IF (LINK .EQ. 0)  GO TO 30
	  REFBUF(KBUF) =     REFS(LINK)/K64
   95	  LINK	      = MSK(REFS(LINK),K64)
C					    PRINT FIRST LINE OF SYMBOL
C
      KBUF = KBUF + 1
   30 KBUF = KBUF - 1
      PRINT 104,    (CHRBUF(K), K=LEAD,LEAD6), DEC, (B(K), K=1,4), KDEF,
     A		    (REFBUF(K), K=1,KBUF)
  104 FORMAT	 (1X, 6A1, I7, 1X, 4A1, I5, 2H * , 18I5)
C					    PROCESS NEXT 18 REFS
C
   35 IF  (LINK .EQ. 0)  GO TO 99
      DO 94 KBUF=1,18
	  IF  (LINK .EQ. 0)  GO TO 40
	  REFBUF(KBUF) =     REFS(LINK)/K64
   94	  LINK	       = MSK(REFS(LINK),K64)
C					    PRINT NEXT LINE
C
      KBUF = KBUF + 1
   40 KBUF = KBUF - 1
      PRINT 105, (REFBUF(K), K=1,KBUF)
  105 FORMAT (24X, 2H * , 18I5)
      LINE = LINE + 1
      IF  (LINE .LE. 55)  GO TO 35
	    LINE  = 0
	    KPAGE = KPAGE + 1
	    PRINT 102, KPAGE
	    GO TO 35
C					    END MAIN PRINT LOOP
C
   99 CONTINUE
C					    PRINT SUMMARY
C
      K = REFMAX - STMAX -1
      PRINT 109, STMAX, K
  109 FORMAT (///// 24H NUMBER OF SYMBOLS    = , I5, //,
     A		    24H NUMBER OF REFERENCES = , I5)
      RETURN
C
C
      END
C					    ***   SIFTUP   ***
      SUBROUTINE  SIFTUP(INDEX, MAX)
C
C	 INDEX, MAX = INDICIES TO ROOT TABLE
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
C
      DATA  K64 /65536/
      K    = INDEX
      KOPY = ROOTS(K)
      ITEM = ST(KOPY/K64)
C
    1 J = 2*K
      IF  (J .GT. MAX)	GO TO 9
	  IF  (J .GE. MAX)  GO TO 2
	      IF  (KOMPAR(ST(ROOTS(J+1)/K64),
     A			 ST(ROOTS(J  )/K64) ) .GT. 0)  J=J+1
    2	  IF  (KOMPAR(ST(ROOTS(J  )/K64), ITEM) 	.LE. 0)  GO TO 9
	      ROOTS(K) = ROOTS(J)
	      K       = J
	      GO TO 1
C
    9 ROOTS(K) = KOPY
      RETURN
C
      END
C					    ***   KOMPAR   ***
      INTEGER FUNCTION	KOMPAR(I,J)
C
C	 I,J = INDICIES TO ROOT TABLE
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
C
      DATA  K37X5 /  69 343 957 /
C
C					    NORMALIZE VALUES, SAVING LEN
      LOCALI = I
      DO 99 K=1,6
	  IF  (LOCALI .LT. 0	)  GO TO 1
	  IF  (LOCALI .GE. K37X5)  GO TO 1
	  LOCALI = LOCALI * 37
   99	  CONTINUE
    1 LENI = 7-K
C
      LOCALJ = J
      DO 98 K=1,6
	  IF  (LOCALJ .LT. 0	)  GO TO 2
	  IF  (LOCALJ .GE. K37X5)  GO TO 2
	  LOCALJ = LOCALJ * 37
   98	  CONTINUE
    2 LENJ = 7-K
C					    DETERMINE CASE
      IF  (LOCALI .GE. 0)  GO TO 3
	  IF  (LOCALJ .LT. 0)  GO TO 5
	      GO TO 30
    3 IF  (LOCALJ .LT. 0)  GO TO 10
C					    CASE OF BOTH SAME SIGN
    5 IF  (LOCALI-LOCALJ)  10, 9,30
C					    CASE OF SAME
    9 IF  (LENI  -LENJ	)  10,20,30
C					    LT=-1, CASE OF SECOND NEG
   10 KOMPAR = -1
      RETURN
C					    EQ= 0
   20 KOMPAR =	0
      RETURN
C					    GT=+1, CASE OF FIRST  NEG
   30 KOMPAR = +1
      RETURN
C
      END
C					    ***   DEF	***
      SUBROUTINE  DEF(INDEX)
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
C
      DATA  K64 /65536/
C					    CHECK FOR NO ROOM
      IF  (REFMAX .GE. REFTOP)	RETURN
C					    PROCESS NEW SYMBOL
      IF  (ROOTS(INDEX) .NE. 0) GO TO 1
	  ROOTS(INDEX) = REFMAX
	  REFS(REFMAX) = LINE * K64
	  REFMAX       = REFMAX + 1
C					    PROCESS OLD SYMBOL
    1 LINK	 = ROOTS(INDEX)
      REFS(LINK) = MSK(REFS(LINK), K64) + LINE * K64
      RETURN
C
      END
C					    ***   REF	***
      SUBROUTINE  REF(INDEX)
C
      COMMON  A(80),IA,ERRTAB(4),IE,B(14),PC,KA,ST(999),STVAL(999),STMAX
      COMMON  LINE, ECOUNT, ELIST(100)
      COMMON  REFMAX, REFTOP, ROOTS(999), REFS(1111)
      INTEGER REFMAX, REFTOP, ROOTS,	  REFS
      INTEGER  A,ERRTAB,IE,ST,STVAL,STMAX,PC, B, ECOUNT,ELIST
C
      DATA  K64 /65536/
C					    CHECK FOR NO ROOM
      IF  (REFMAX .GT. REFTOP-2)  RETURN
C					    PROCESS NEW SYMBOL
      IF  (ROOTS(INDEX) .NE. 0)   GO TO 1
	  ROOTS(INDEX	) = REFMAX
	  REFS (REFMAX	) = REFMAX+1
	  REFS (REFMAX+1) = LINE * K64
	  REFMAX	   = REFMAX + 2
	  RETURN
C					    PROCESS OLD SYMBOL; SEARCH
C						 CHAIN TO DETERMINE CASE
    1 LINK0 = ROOTS(INDEX)
      LINK00= LINK0
      LINK1 = MSK(REFS(LINK0),K64)
C
    2 IF  (LINK1 .EQ. 0)  GO TO 3
	  LINERF = REFS(LINK1)/K64
	  IF  (LINERF .EQ. LINE)  GO TO 4
	  IF  (LINERF .GT. LINE)  GO TO 5
	      LINK0 = LINK1
	      LINK1 = MSK(REFS(LINK1),K64)
	      GO TO 2
C					    CASE OF TRAILING REF
    3 REFS(LINK0)  = REFS(LINK0) + REFMAX
      REFS(REFMAX) = LINE	 * K64
      REFMAX	   = REFMAX	 + 1
      RETURN
C					    CASE OF DUPLICATE REF
    4 IF  (LINK00 .NE. LINK0)  RETURN
C					    CASE OF INSERTED REF
    5 REFS(LINK0)  = REFS(LINK0) - LINK1 + REFMAX
      REFS(REFMAX) = LINE * K64  + LINK1
      REFMAX	   = REFMAX + 1
      RETURN
      END
      INTEGER FUNCTION	MSK(M,N)
C
C	 EXTRACTS CONSECUTIVE LOW ORDER BITS
C
      INTEGER  SIGN
      DATA  SIGN /0/
C			EVALUATE SIGN JUST ONCE
      IF (SIGN .EQ. 0)	SIGN = 2 ** 31
      MM = M
C
C	 TURN OFF SIGN BIT
C
      IF  (MM .LT. 0)  MM = MM + SIGN
C
      MSK = MM - N * (MM/N)
C
      RETURN
      END
      SUBROUTINE  UNPACK (A,CARD,CSET)
C
C	 UNPACKS CARD(80) VIA CSET(64) INTO A(80)
C
      INTEGER  A(80), CARD(20), CSET(64), POWER(4),  SIGN, IMAGE
      DATA  POWER /16777216,65536,256,1/
C
      SIGN = 2**31
      I = 1
      DO 100 K = 1,20
      IMAGE = CARD(K)
      IF  (IMAGE .LT. 0)  IMAGE = IMAGE + SIGN
      DO  50 J = 1,4
      II = MSK (IMAGE / POWER(J),  64)
      A(I) = CSET(II+1)
   50 I = I+ 1
  100 CONTINUE
C
      RETURN
      END
*			      ***   UNPACK   ***
*
*
*	       DIM   ARRAY(80), CARD(20), CSET(64)
*
*	       CALL UNPACK  (ARRAY, CARD, CSET)
*
*
*	 UNPACKS  CARD	INTO  ARRAY  VIA  CSET TRANSLATION TABLE
*
*
*
*			      ENTRY
UNPACK	 CSECT
	 B     12(15)
	 DC    AL1(7)
	 DC    CL7'UNPACK'
	 STM   14,8,12(13)
	 BALR  3,0		   3 = BASE REG
	 USING *,3
	 LM    4,6,0(1) 	   LOAD ARG ADDRESSES
	 LA    8,80		   8 = 80 COUNTER
*
*			      PROCESS
LOOP	 IC    7,0(5)		   5 = CARD
	 N     7,=XL4'3F'	   7 = LOW 6 BITS OF CHAR
	 SLL   7,2		   WORD ALIGN
	 L     7,0(6,7) 	   6 = CSET
	 ST    7,0(4)		   4 = ARRAY
	 LA    5,1(5)		   BUMP CARD PTR BY 1
	 LA    4,4(4)		   BUMP ARRAY PTR BY 4
	 BCT   8,LOOP
*
*			      EXIT
	 LM    2,8,28(13)
	 MVI   12(13),X'FF'
	 BR    14
	 EJECT
*			      ***   MSK   ***
*
*
*
*	       X = MSK (DATA, MASKCODE)
*
*
*	 MASKS DATA WITH MASKCODE-1
*
*
*
*			      ENTRY
MSK	 CSECT
	 B     8(15)
	 DC    AL1(3)
	 DC    C'MSK'
	 STM   14,3,12(13)
	 BALR  3,0
	 USING *,3
*			      PROCESS
	 LM    2,3,0(1)
	 L     0,0(3)		   0 = MASKCODE
	 BCTR  0,0			       -1
	 N     0,0(2)		   AND WITH DATA = 2
*				   RESULT IN 0
*
*			      EXIT
	 LM    2,3,28(13)
	 MVI   12(13),X'FF'
	 BR    14
*
	 END
@
$
*
*
*			      ENTRY
MSK	 CSECT
	 B     8(15)
	 DC    AL1(3)
	 DC    C'MSK'
	 STM   14,3,12(13)
	 BALR  3,0
	 USING *,3
*			      PROCESS
	 LM    2,3,0(1)
	 L     0,0(3)		   0 = MASKCODE



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search