IMD 1.16: 2/09/2008 14:37:31 84-93737-01 a000 f73701 6502 microprocessor firmware assembler (source, object, binary and jcl) 6aug82    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF182080609410104820806140046 820806140046EF73701 VOL6502 MICROPROCESSOR FIRMWARE ASSEMBLER 84-93737-XX A000   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc rC 6502 MICROPROCESSOR FIRMWARE ASSEMBLER 84-93737-10 A000 IMPLICIT INTEGER(A-Z) C C C C C--- ASSEMBLER FOR THE MOS TECHNOLOGY MCS-650X SERIES C--- OF MICRO PROCESSORS. C C--- WRITTEN BY MARK S SIMS - 1978 C--- SOUTHERN METHODIST UNIVERSITY C--- C--- COPYRIGHT 1978 BY MARK S. SIMS ALL RIGHTS RESERVED. C C--- REVISED MAY 1979 FOR CAI FORTRAN C C C C--- DEFINITION OF COMMON BLOCK VARIABLES C C C--- BLOCK /LNKLST/ C--- AVLIST: ARRAY IS A LINKED LIST USED FOR FREE STORAGE C---  FOR VARIOUS STACKS AND THE XREF CHAINS IN THE SYMBOL TABLE. C--- AVSIZE: THE MAXIMUM SIZE OF THE AVAILABLE LIST C C C--- BLOCK /OPTIONS/ C C--- NOLIST: THIS IS THE FLAG AS TO WHETHER OR NOT THE SOURCE LISTING C--- IS TO BE PRODUCED. 0=LIST, 1=DO NOT LIST. C--- NOOBJ: FLAGS WHETEHER OR NOT THE OBJECT FILE IS TO BE PRODUCED. C--- 0=PRODUCE OBJECT FILE. 1=DO NOT PRODUCE OBJECT FILE. C--- NOXREF: FLAGS WHETHER OR NOT A CROSS REFERENCE AND SYMBOL TABLE C--- DUMP ARE TO BE GENERATED. 0=PRODUCE CROSS REFERENCE. C--- 1=DO NOT PRODUCE CROSS REFERENCE. C--- NOGEN: 1=DO NOT LIST MULTIPLE LINES OF DATA GENERATION PSEUDO C--- OPS. 0=LIST ALL LINES OF DATA GENERATED DATA. C C C C--- BLOCK /STA TUS/ - VARIOUS ASSEMBLER STATUS WORDS C C C--- CARD: THE LINE NUMBER OF THE CURRENT LINE OF SOURCE TEXT AS C--- PRINTED ONTO THE SOURCE LISTING AND USED IN PRODUCING C--- THE CROSS REFERENCE LISTING. C--- PASS: THE CURRENT PASS OF THE ASSEMBLER. PASS=0 MEANS IN PASS 1 C--- BUT WE ARE GOING TO BE EVALUATING EXPRESSIONS FOR CERTAIN C--- THAT MUST HAVE ALL SYMBOLS DEFINED (EQU, BSS, ORG, ETC.) C--- PASS=1 MEANS PASS 1. PASS=2 MEANS PASS 2. C--- PCOUNT: THE VALUE OF THE LOCATION COUNTER. C--- AVAIL: THE POINTER TO THE CURRENT TOP OF THE AVAILABLE STORAGE C--- POOL. (FROM WHICH ALL STORAGE FOR ANY OF THE DYNAMIC LISTS C--- IS ALLOCATED) C--- ERRNUM: THE ERROR NUMBER WORD. UP TO 4 4-BIT ERROR NUMBER CODES C--- ARE PACKED INTO THE WORD. ERRORS GENERATED IN PASS 1 ARE C--- SENT TO PASS 2 THROUGH THE SCRATCH FILE. C--- ERRCNT: A COUNTER OF THE NUMBER OF ERROR MESSAGES PRINTED. C C C C--- BLOCK /FIELDS/ - THE VARIOUS FIELDS OF THE INPUT CARD AS RETURNED C--- BY THE PARSER. C--- ARRAY LABEL - THE LABEL FIELD C---  ARRAY OPCODE - THE OPCODE FIELD C--- ARRAY SYMBOL - THE OPERAND FIELD C--- OPTR - THE NUMBER OF CHARACTERS IN THE OPCODE FIELD C--- LABPTR - THE NUMBER OF CHARACTERS IN THE LABEL FIELD C--- SYMPTR - THE NUMBER OF CHARACTERS IN THE OPERAND FIELD. C C C C--- BLOCK /FILES/ - FILE ASSIGNMENT NUMBERS. C C--- INFILE: SOURCE FILE NUMBER (5) C--- OUTFIL: LISTING FILE NUMBER (6) C--- OBJ: OBJECT FILE NUMBER (8) C C C--- BLOCK /SYMBLK/ - THE SYMBOL TABLE VARIABLES C C--- SYMTAB: THIS ARRAY IS THE SYMBOL TABLE C--- SYMLEN: THE NUMBER OF CHARACTERS LONG A SYMBOL CAN BE. C--- MAXSYM: THE MAXIMUM NUMBER OF SYMBOLS THAT CAN BE DEFINED. C C C--- BLOCK /HEAD/ - PAGE HEADING AND CONTROL INFORMATION C C--- TITLE: CONTAINS THE CURRENT TITLE WHICH IS TO BE PRINTED AT C--- THE TOP OF EACH PAGE (IN 80A1 FORMAT). C--- LINENO: CONTAINS THE LINE NUMBER OF THE NEXT LINE TO BE C--- PRINTED ON THE PAGE. C--- PAGE: CONTAINS THE PAGE NUMBER OF THE CURREN PAGE OF SOURCE C--- LISTING C--- COMCOL: THE COLUMN IN WHICH THE OPERAND MUST BEGIN IN BEFORE C--- BEING CONSIDERED A COMMENT C--- MAXLIN: THE NUMBER OF LINES LONG A PAGE IS. RESETABLE C--- VIA THE 'PAGE' PSEUDO OP. C C C--- BLOCK /PTRS/ - ARRAY 'PTR' CONTAINS THE LIST OF POINTERS C--- TO THE BEGINNING AND END OF EACH FIELD (PARAMETER) C---  IN THE OPERAND (USUALLY) ARRAY. FUNCTION 'SETPTR' C--- IS CALLED TO LOAD THIS ARRAY WITH THE POINTERS. C---  THE START OF THE N'TH FIELD IS IN PTR(N,1) AND THE END C--- OF THE N'TH FIELD IS POINTED TO BY PTR(N,2). IF A FIELD C--- IS A NULL FIELD THEN PTR(N,1) WILL BE SET \ PTR(N,2) (OR TO C--- ZERO). C C C C--- BLOCK /BUFFER/ - ARRAY 'LINE' CONTAINS THE CURRENT SOURCE CARD C--- IMAGE BEING ASSEMBLED (80A1 FORMAT). THE IMAGE IS OBTAIND C---  FROM EITHE THE SOURCE FILE OR THE SCRATCH FILE. C C C C C C C--- THE AVAILABLE STORAGE POOL FOR THE DYNAMIC LISTS IS STORED IN BLANK C--- COMMON C COMMON/LNKLST/ AVLIST(2000,2), AVSIZE COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMM ON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN C DATA TITLE/0,26*1H ,1HM,1HC,1HS,1H-,1H6,1H5,1H0,1HX,1H ,1HM,1HA, +1HC,1HR,1HO,1H ,1HA,1HS,1HS,1HE,1HM,1HB,1HL,1HE,1HR,29*1H / C DATA SYMTAB/3600*0/ DATA MAXSYM/400/ DATA SYMLEN/7/ DATA LASTSYM/0/ C C DATA AVSIZE/2000/ DATA AVLIST/4000*0/ C DATA LINENO/100/ DATA PAGE/0/ DATA COMCOL/29/ DATA MAXLIN/59/ C DATA INFILE /5/ DATA OUTFIL /6/ DATA OBJ /4/ C DATA PASS/1/ DATA ERRCNT/0/ DATA PCOUNT/0/ DATA CARD/0/ C C--- LISTING/OUTPUT OPTIONS C  DATA NOLIST/0/ DATA NOOBJ/0/ DATA NOXREF/0/ DATA NOGEN/0/ C C C--- INITIALIZE THE AVAILABLE LIST FOR STACKS AND XREF CHAINS C DO 20 I=1,AVSIZE AVLIST(I,1)=0 AVLIST(I,2)=I+1 20 CONTINUE AVLIST(AVSIZE,2)=0  AVAIL=1 C C C--- INITIALIZE FILES C REWIND INFILE REWIND OUTFIL REWIND OBJ PAGE=0 CARD=0 C C--- START THE ASSEMBLY C 100 CONTINUE CALL PASS1 IF(ERRCNT.NE.0) CALL HEADING(0,0) C C C--- GENERATE THE XREF LISTING C 200 CONTINUE CARD=0 CALL PASS2 CALL SYMOUT C C--- PRINT THE STATISTICS C CALL HEADING(-3,1) CALL HEADING(1,1) WRITE(OUTFIL,300) ERRCNT 300 FORMAT(I6,' ERROR MESSAGES WERE PRINTED.') C REWIND INFILE  REWIND OUTFIL REWIND OBJ IF(ERRCNT .EQ. 0) STOP STOP 9999 END SUBROUTINE PASS1 IMPLICIT INTEGER (A-Z) COMMON/LNKLST/ AVLIST(2000,2), AVSIZE COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/PTRS/ PTR(41,2) COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/BUFFER/ LINE(80) COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/FIELDS/ LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN C LOGICAL STATE,QUOTE C C C--- THIS PROGRAM PERFORMS PASS 1 ONE THE ASSEMBLER. C C C C--- INITIALIZE FILES AND VARIABLES C C C--- READ IN A CARD AND PARSE IT C C 1 CONTINUE PASS=1 TYPE=0 ERRNUM=0 CALL PARSE C C--- LOOK UP THE OPCODE IN THE OPCODE TABLE C IN=OPLOOK(OPCODE,1,OPTR,TYPE2,OPVALU) IF(IN.GT.0) GO TO 60 LEN=0 CALL ADDLAB(PCOUNT) GO TO 82 C C--- THE OPCODE WAS IN THE OPCODE TABLE C 60 CONTINUE TYPE=(-TYPE2) C C--- SEE IF IT WAS AN END PSEUDO OP C IF(TYPE.EQ.5) GO TO 500 IF(TYPE2.LT.0) GO TO 90 C C--- OPCODE WAS A MACHINE INSTRUCTION, UPDATE PCOUNTER C CALL ADDLAB(PCOUNT)  LEN=TYPE2 IF(TYPE2.EQ.0) LEN=2 IF(LEN.EQ.3) GO TO 82 C 81 CONTINUE PCOUNT=PCOUNT+LEN GO TO 5000 C C--- SEE IF A 3 BYTE OPCODE CAN BE FORCED INTO A TWO BYTE ONE C 82 CONTINUE TEMP=OPTR+1 IF(TEMP.GT.7) GO TO 81  OPCODE(TEMP)=1HZ C I=OPLOOK(OPCODE,1,TEMP,TYPE2,OPVALU) IF(I.LE.0) GO TO 81 IF(TYPE2.NE.2) GO TO 81 TEMPERR=ERRNUM ERRNUM=0 I=EVAL(SYMBOL,1,SYMPTR) J=ERRNUM ERRNUM=TEMPERR C IF(J.NE.0) GO TO 81   CALL BYTES(I,IHI,ILO) IF(IHI.NE.0) GO TO 81 LEN=2 GO TO 81 C C C--- OPCODE WAS A PSEUDO OP, SO BRANCH TO THE CORRECT SERVICE ROUTINE C C 90 CONTINUE GO TO (100,200,300,400,500,100,100,100,900,1000,1000,800, + 100,100,100,100,100,100,1900,100,100,100,2200,100, + 100,100,100,100,100,2800,100,100,100,100,100),TYPE C C--- PSEUDO OPS THAT REQUIRE NO PASS1 ACTION EXCEPT LABELS C 100 CONTINUE CALL ADDLAB(PCOUNT) GO TO 5000 C C--- ORG, RESET PROGRAM COUNTER C 200 CONTINUE PASS=0 PCOUNT=EVAL(SYMBOL,1,SYMPTR) CALL ADDLAB(PCOUNT) PASS=1 GO TO 5000 C C--- BSS, ADD OPERAND TO PCOUNTER C 300 CONTINUE CALL ADDLAB(PCOUNT) PASS=0 PCOUNT=PCOUNT+EVAL(SYMBOL,1,SYMPTR) PASS=1 GO TO 5000 C C--- EQU, INSERTS LABEL WITH VALUE EQUAL TO THE OPERAND C 400 CONTINUE IF(LABPTR.EQ.1.AND.LABEL(LABPTR).EQ.1H.) GO TO 200 PASS=0 NUM=EVAL(SYMBOL,1,SYMPTR) CALL ADDLAB(NUM) PASS=1  GO TO 5000 C C--- END, RETURN TO MAIN PROGRAM FOR PASS2 C 500 CONTINUE CALL ADDLAB(PCOUNT) RETURN C C---  ROM LOADER CHECKSUM BYTE C 800 CONTINUE CALL ADDLAB(PCOUNT) PCOUNT = PCOUNT + 1 GOTO 5000 C C--- DB, INCREMENT PCOUNTER BY ONE FOR EACH OPERAND C 900 CONTINUE CALL ADDLAB(PCOUNT) J=SETPTR(SYMBOL,1,SYMPTR) PCOUNT=PCOUNT+J GO TO 5000 C C--- DW AND DA, INCREMENT PCOUNTER BY TWO FOR EACH OPERAND C 1000 CONTINUE CALL ADDLAB(PCOUNT) J=SETPTR(SYMBOL,1,SYMPTR) PCOUNT=PCOUNT+2*J GO TO 5000 C C--- PAGE, SET THE PAGE LENGTH C 1900 CONTINUE PASS=0 MAXLIN=EVAL(SYMBOL,1,SYMPTR) IF(MAXLIN.LE.5) MAXLIN=59 PASS=1 GO TO 5000 C C C--- END OF FILE PSEUDO OP (..) C C 2200 CONTINUE RETURN C C C--- TITLE PSEUDO OP, MOVE TITLE TO HEADING BUFFER C C 2300 CONTINUE CALL ADDLAB(PCOUNT) IF(TITLE(1).NE.0) GO TO 5000 DO 2320 I=1,80 TITLE(I)=1H 2320 CONTINUE IF(SYMPTR.LE.2) GOTO 5000 K=SYMPTR-1 DO 2340 I=2,K TITLE(I-1)=SYMBOL(I) 2340 CONTINUE GO TO 5000 C C C C C--- ASC - DEFINE AN ASCII CHARACTER STRING C C 2800 CONTINUE CALL ADDLAB(PCOUNT) PCOUNT=PCOUNT+MAX0(0,SYMPTR-2) GO TO 5000 C C C C--- WRITE LINE TO THE SCRATCH FILE AND GO GET ANOTHER C C 5000 CONTINUE IF(ERRNUM.EQ.0) GO TO 1 CALL OUTPUT(0,0,4,0) GO TO 1 END SUBROUTINE PASS2 IMPLICIT INTEGER (A-Z) COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMMON/PTRS/ PTR(41,2) COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/BUFFER/ LINE(80) COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/FIELDS/ LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN C LOGICAL QUOTE C C REWIND INFILE 5 CONTINUE PASS=2 PCOUNT=0 C C--- READ IN A LINE AND PARSE IT C 10 CONTINUE CALL PARSE C C--- CHECK THE OPCODE TO SEE IF A PSEUDO OP OR A MACHINE INSTRUCTION C II=OPLOOK(OPCODE,1,OPTR,TYPE2,OPVALU) IF(II.LE.0) GO TO 11 IF(TYPE2.LT.0) GO TO 100 IF(SYMPTR.NE.0) GOTO 11 IF(TYPE2.EQ.1) GOTO 11   ERRNUM=ERRNUM*16+1 C C--- IT WAS A MACHINE INSTRUCTION C 11 CONTINUE VAL=0 IF(SYMPTR.NE.0.AND.TYPE2.NE.1) VAL=EVAL(SYMBOL,1,SYMPTR) IF(II.LE.0) GO TO 15 IF(TYPE2.EQ.0) GO TO 30 IF(TYPE2.EQ.3) GO TO 15 C 12 CONTINUE IF(II.LE.0) GO TO 1500 CALL BYTES(VAL,J,IDUMMY) IF(TYPE2.EQ.2.AND.J.NE.0.AND.J.NE.255) ERRNUM=ERRNUM*16+2  CALL OUTPUT(OPVALU,VAL,TYPE2,EXPTYP) GO TO 10 C C--- SEE IF A THREE BYTE OPCODE CAN BE FORCED INTO A 2 BYTE ONE C 15 CONTINUE CALL BYTES(VAL,J,IDUMMY) IF(J.NE.0) GO TO 12 TEMP=OPTR+1 IF(TEMP.GT.7) GO TO 12 OPCODE(TEMP)=1HZ C I=OPLOOK(OPCODE,1,TEMP,TTYPE2,TOPVAL) IF(I.LT.0) GO TO 12 IF(TTYPE2.NE.2) GO TO 12 C TYPE2=TTYPE2 OPVALU=TOPVAL II=1 GO TO 12 C C--- THE INSTRUCTION WAS A PC RELATIVE BRANCH C 30 CONTINUE VAL2=VAL-PCOUNT-2 CALL BYTES(VAL2,I,J) IF(I.NE.0.AND.I.NE.255) ERRNUM=ERRNUM*16+2 CALL OUTPUT(OPVALU,J,2,0)  GO TO 10 C C C--- THE OPCODE WAS A PSEUDO OP C--- BRANCH TO THE CORRECT SERVICE ROUTINE C 100 CONTINUE TYPE=(-TYPE2) GO TO (600,200,300,900,1300,700,500,1100,400,400,400, + 1000,600,920,600,600,600,100,1900,600,600,600,1400,  + 600,600,600,600,600,1200,1600,600,600,600,600,600),TYPE C C C--- ORG C C 200 CONTINUE CALL PUSH(PCOUNT,ORGPTR)  I=EVAL(SYMBOL,1,SYMPTR) PCOUNT=I CALL OUTPUT(0,PCOUNT,4,0) GO TO 10 C C C--- BSS - RESERVE STORAGE BLOCK C C 300 CONTINUE I=EVAL(SYMBOL,1,SYMPTR) CALL OUTPUT(0,PCOUNT,4,0) PCOUNT=PCOUNT+I GO TO 10 C C C--- DB, DW, AND DA C C 400 CONTINUE TEMP=NOLIST LEN=2 IF(TYPE.EQ.9) LEN=1 C NUM=SETPTR(SYMBOL,1,SYMPTR)  IF(NUM.LE.0) GO TO 460 C C--- EVALUATE EACH PARAMETER IN THE PARAMETER LIST C DO 440 I=1,NUM VALUE=EVAL(SYMBOL,PTR(I,1),PTR(I,2)) CALL BYTES(VALUE,PCH,PCL) IF(PCH.NE.0.AND.PCH.NE.255.AND.LEN.EQ.1) +ERRNUM=ERRNUM*16+2 C C--- OUTPUT THE PARAMETER C IF(TYPE.EQ.9) CALL OUTPUT(PCL,0,1,EXPTYP) N=PCL*256+PCH IF(TYPE.EQ.11) CALL OUTPUT(0,N,7,EXPTYP) IF(TYPE.EQ.10) CALL OUTPUT(1,VALUE,7,EXPTYP) LABPTR=0 C C--- SET THE LISTING FLAG FOR THE REMAINING PARAMETERS C IF(NUM.EQ.1) GO TO 440 IF(I.NE.1) GO TO 440 IF(NOLIST.EQ.1) GO TO 440 NOLIST=NOGEN C C---  BLANK THE LINE C DO 420 N=1,80 LINE(N)=1H 420 CONTINUE 440 CONTINUE NOLIST=TEMP GO TO 10 C C--- NO OPERAND WAS GIVEN C 460 CONTINUE ERRNUM=ERRNUM*16+3 CALL OUTPUT(0,0,5,0) GO TO 10 C C C--- TITLE C C 500 CONTINUE DO 510 I=1,80 TITLE(I)=1H 510 CONTINUE IF(SYMPTR.LE.2) GO TO 580 J=SYMPTR-1 DO 540 I=2,J TITLE(I-1)=SYMBOL(I) 540 CONTINUE C 580 CONTINUE GO TO 10 C C C--- PSEUDO OPS THAT REQUIRE NO PASS 2 ACTION C C 600 CONTINUE CALL OUTPUT(0,0,5,0) GO TO 10 C C C--- OPTIONS C C 700 CONTINUE J=SETPTR(SYMBOL,1,SYMPTR) IF(J.LE.0) GO TO 460 C C--- PROCESS EACH PARAMETER C DO 760 I=1,J IF(PTR(I,1).GT.PTR(I,2)) GO TO 760  K=0 IF(SYMBOL(PTR(I,2)).EQ.1H-) K=1 IF(SYMBOL(PTR(I,1)).EQ.1HL) NOLIST=K IF(SYMBOL(PTR(I,1)).EQ.1HO) NOO BJ=K IF(SYMBOL(PTR(I,1)).EQ.1HG) NOGEN=K IF(SYMBOL(PTR(I,1)).EQ.1HX) NOXREF=K 760 CONTINUE CALL OUTPUT(0,0,5,0) GO TO 10 C C C C--- EQU - EQUATE SYMBOL C 900 CONTINUE IF(LABPTR.EQ.1.AND.LABEL(LABPTR).EQ.1H.) GO TO 200 920 CONTINUE I=EVAL(SYMBOL,1,SYMPTR) CALL OUTPUT(0,I,6,EXPTYP) GO TO 10 C C C--- GENERATE LOADER ROM CHECKSUM WORD C C 1000 CONTINUE WRITE(OBJ,1020) PCOUNT 1020 FORMAT(1X,'C',Z4,' 00') CALL OUTPUT(0,0,4,0) PCOUNT = PCOUNT + 1 GO TO 10 C C C C C--- PAGE EJECT C C 1100 CONTINUE CALL HEADING(0,0) GO TO 10 C C C--- SPACE C C 1200 CONTINUE I=EVAL(SYMBOL,1,SYMPTR) I=MAX0(1,I) CALL HEADING(-I,0) GO TO 10 C C C--- END CARD C C 1300 CONTINUE CALL OUTPUT(0,0,5,0) RETURN C C C--- END OF FILE CARD C C 1400 CONTINUE RETURN C C C--- A BAD OPCODE WAS FOUND C C 1500 CONTINUE ERRNUM=ERRNUM*16+4 CALL OUTPUT(0,0,5,0) GO TO 10 C C C--- ASCII STRINGS C C 1600 CONTINUE IF(SYMPTR.LE.2) GO TO 460 TEMP=NOLIST J=SYMPTR-1 C C--- OUTPUT THE STRING C DO 1640 I=2,J CALL OUTPUT(ASCII(SYMBOL(I)),0,1,0) LABPTR=0 IF(J.EQ.2) GO TO 1640 IF(I.NE.2) GO TO 1640 C C--- BLANK THE LISTING LINE C IF(NOLIST.EQ.1) GO TO 1640 DO 1620 K=1,80 LINE(K)=1H 1620 CONTINUE NOLIST=NOGEN 1640 CONTINUE NOLIST=TEMP GO TO 10 C C--- PAGE - SET PAGE LENGTH C C 1900 CONTINUE MAXLIN=EVAL(SYMBOL,1,SYMPTR) IF(MAXLIN.LE.5) MAXLIN=59 GO TO 10 C END SUBROUTINE ADDLAB(VALUE) IMPLICIT INTEGER(A-Z) COMMON/FIELDS/LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT C C--- THIS SUBROUTINE IS USED TO INSERT A LABEL (IF IT EXISTS) INTO C--- THE SYMBOL TABLE. THE LABEL IS ASSIGNED A VALUE EQUAL TO THE C--- PARAMETER 'VALUE'. C C--- THE FIRST WORD OF THE ATTRIBUTE INFO FOR THE LABEL IS C--- THE LABEL'S VALUE. THE SECOND WORD IS USED AS A POINTER C--- TO THE LABEL'S XREF CHAIN C C IF(LABPTR.EQ.0) RETURN IF(LABPTR.EQ.1.AND.LABEL(1).EQ.1H.) RETURN ATTR=VALUE XPTR=0 IN=MANGER(LABEL,1,LABPTR,ATTR,XPTR,0) IF(IN.NE.(-1)) RETURN ERRNUM=ERRNUM*16+6 RETURN END INTEGER FUNCTION SETPTR(LINE,START,FINISH) IMPLICIT INTEGER(A-Z) COMMON/PTRS/ PTR(41,2) COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT DIMENSION LINE(80) C C C--- THIS FUNCTION WILL CONSTRUCT AN ARRAY CONTAINING POINTERS C--- TO THE BEGINNING AND END OF EACH PARAMETER IN A C--- PARAMETER LIST CONTAINED IN FORMAL PARAMETER ARRAY 'LINE'. C--- PARAMETERS ARE SEPARATED BY ,'S NOT ENCLOSED WITHIN A LEVEL C--- OF PARENTHESIS. C--- THE FUNCTION IS RETURNED AS THE NUMBER OF PARAMETERS FOUND C--- ARRAY 'PTRS' CONTAINS THE POINTERS TO THE PARAMETERS C--- IF A PARAMETER IS A NULL FIELD, THEN THAT PARAMETER WILL C--- BE GIVEN A STARTING LOCATION GREATER THAN THE THE ENDING LOCATION C--- A MAXIMUM OF 40 PARAMETERS CAN BE POINTED TO. C C C LOGICAL QUOTE QUOTE=.FALSE. J=0 PAREN=0 S=START I=START-1 C C--- SCAN FOR COMMAS C  10 CONTINUE I=I+1 IF(I.GT.FINISH) GO TO 30 IF(LINE(I).EQ.1H') QUOTE=.NOT.QUOTE IF(QUOTE) GO TO 10  IF(LINE(I).EQ.1H() PAREN=PAREN+1 IF(LINE(I).EQ.1H).AND.PAREN.GT.0) PAREN=PAREN-1 IF(PAREN.NE.0) GO TO 10 IF(LINE(I).NE.1H,) GO TO 10 C C--- STORE POINTER IN THE POINTER ARRAY C 30 CONTINUE J=J+1 IF(J.GT.40) GO TO 40  PTR(J,1)=S PTR(J,2)=I-1 IF(LINE(S).EQ.1H() PTR(J,1)=PTR(J,1)+1 IF(LINE(S).EQ.1H() PTR(J,2)=PTR(J,2)-1  S=I+1 IF(I.LE.FINISH) GOTO 10 GO TO 45 C C--- ZERO OUT ANY OTHER PARAMETERS C 40 CONTINUE ERRNUM=ERRNUM*16+5 45 CONTINUE J=MIN0(J+1,41) DO 50 I=J,41 PTR(I,1)=0 PTR(I,2)=0 50 CONTINUE SETPTR=J-1  RETURN END SUBROUTINE PARSE IMPLICIT INTEGER(A-Z) COMMON/FIELDS/LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT  COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/BUFFER/ LINE(80) COMMON/FMT/OUT(110),LABST,LABEND,OPCST,OPCEND,OPRST,OPREND,COMST LOGICAL QUOTE, LABFLG, LABERR, PSEUDO, OPERR, OPEN C C--- THIS SUBROUTINE WILL OBTAIN A LINE OF SOURCE TEXT AND THEN C--- BREAK IT UP INTO THE VARIOUS FIELDS OF THE ASSEMBLER COMMANDS. C C--- THE LABEL FIELD IS PUT INTO ARRAY 'LABEL' AND VARIABLE 'LABPTR' C--- CONTAINS THE NUMBER OF CHARACTERS IN THE LABEL. C C--- THE OPCODE (WITH APPROPRIATE ADDRESSING MODE INFORMATION C--- IF SYNATCTICALLY DEFINED) IS PUT INTO ARRAY 'OPCODE' AND C--- VARIABLE 'OPTR' IS SET TO THE LENGTH OF THE OPCODE. C C C--- THE OPERAND FIELD (LESS ANY ADDRESSING MODE CHARACTERS C--- USED BY SYNTACTICALLY DEFINED OPCODES) IS PUT INTO ARRAY C--- 'SYMBOL' AND VARIABLE 'SYMPTR' IS SET TO THE NUMBER OF C--- CHARACTERS IN THE OPERAND FIELD. C C---  IF AN END OF FILE IS READ, A DUMMY '..' PSEUDO OP IS C--- GENERATED. C C C--- ADDRESSING MODE INFORMATION IS EXTRACTED FROM THE OPERAND C--- FIELD AND MOVED TO THE OPCODE FIELD BY: C--- 1) DELETING ('S C--- 2) MOVING )'S TO THE OPCODE FIELD C--- 3) DELETING ,'S AND MOVING THE CHARACTER FOLLOWING THE ',' C--- TO THE OPCODE FIELD. C--- 4) IF THE OPERAND FIELD IS NULL THEN A '*' IS APPENDED TO C--- THE OPCODE FIELD C--- 5) MOVING A LEADING '#' IN THE OPERAND TO THE OPCODE FIELD C--- THUS THE LINE: C--- LAB LDA (BUFFER),X C--- WOULD SET ARRAY LABEL TO 'LAB' AND VARIABLE LABPTR=3 C--- ARRAY OPCODE TO 'LDA)X' AND VARIABLE OPTR TO 5 C--- ARRAY SYMBOL TO 'BUFFER' AND VARIABLE SYMPTR=6 C C--- NOTE THAT IF A LABEL IS TERMINATED BY A ':' THE ':' IS NOT C--- MOVED TO THE ARRAY 'LABEL'. C C C C C--- INITIALIZE VARIABLES C LABFLG=.FALSE.  OPERR=.FALSE. LABERR=.FALSE. QUOTE=.FALSE. OPEN=.FALSE. ERRNUM=0 PSEUDO=.TRUE. OPTR=0  LABPTR=0 SYMPTR=0 PAREN=0 LABST=0 LABEND=0 OPCST=0 OPCEND=0 OPRST=0 OPREND=0 COMST=0 C C--- GET THE LINE FROM THE SOURCE FILE C C IF(PASS.EQ.2) GO TO 8 READ(INFILE,2,END=500) LINE  GO TO 10 2 FORMAT(80A1) C C--- PASS 2 READ C 8 CONTINUE READ(INFILE,2,END=600) LINE C C--- CHECK FOR A LABE L OR COMMENT C 10 CONTINUE I=0 CARD=CARD+1 IF(LINE(1).EQ.1H;) GO TO 300 IF(LINE(1).EQ.1H*) GO TO 300  IF(LINE(1).EQ.1H ) GO TO 30 LABST=1 C C--- A LABEL IS PRESENT. MOVE IT TO THE LABEL BUFFER C 20 CONTINUE  I=I+1 IF(I.GT.80) GO TO 300 IF(LINE(I).EQ.1H ) GO TO 30 LABEND=I IF(LINE(I).EQ.1H:) GO TO 30 IF(LABPTR.GE.7) LABERR=.TRUE. IF(LABERR) GO TO 20 LABPTR=LABPTR+1 LABEL(LABPTR)=LINE(I) GO TO 20 C C--- END OF LABEL. SPAN BLANKS TO THE OPCODE FIELD C 30 CONTINUE I=I+1 IF(I.GT.80) GO TO 300 IF(LINE(I).EQ.1H ) GO TO 30 OPCST=I I=I-1 C C--- MOVE THE OPCODE FIELD TO THE OPCODE BUFFER C 40 CONTINUE I=I+1 IF(I.GT.80) GO TO 300 IF(LINE(I).EQ.1H ) GO TO 60 IF(LINE(I).EQ.1H;) GO TO 290 OPCEND=I IF(OPTR.GE.7) OPERR=.TRUE. IF(OPERR) GO TO 40 OPTR=OPTR+1 OPCODE(OPTR)=LINE(I) GO TO 40 C C--- END OF OPCODE. SPAN BLANKS TO THE OPERAND FIELD C 60 CONTINUE I=I+1 IF(I.GT.80) GOTO 300 IF(LINE(I).EQ.1H ) GO TO 60 C C--- SEE IF THE OPCODE CAN BE A SYNTACTICALLY DEFINED MACHINE OP C 65 CONTINUE OPRST=I I=I-1 IF(OPTR.NE.3) GO TO 100  J=OPLOOK(OPCODE,1,OPTR,TYPE2,OPVALU) IF(J.LE.0.OR.TYPE2.GE.1) PSEUDO=.FALSE. IF(TYPE2.NE.1) GO TO 100 OPRST=0 OPREND=0 I=I+1 GOTO 290 C C--- SCAN THE OPERAND FIELD, MOVING THE INFORMATION TO THE C--- OPCODE OR OPERAND BUFFERS AS NEEDED C 100 CONTINUE I=I+1 IF(I.GT.80) GO TO 300 IF(LINE(I).EQ.1H') QUOTE=.NOT.QUOTE IF(QUOTE) GO TO 220 IF(PAREN.NE.0) GO TO 200 IF(LINE(I).EQ.1H ) GO TO 260 IF(LINE(I).EQ.1H;) GO TO 295 OPREND=I IF(PSEUDO) GO TO 200 C C--- WE HAVE WHAT IS MOST LIKELY A SYNTACTIACLLY DEFINED MACHINE OP. C--- MOVE SYNTAX INFORMATION TO THE OPCODE FIELD. C IF(LINE(I).EQ.1H#) GO TO 120 IF(LINE(I).EQ.1H() GO TO 130 IF(LINE(I).EQ.1H)) GO TO 120 IF(LINE(I).NE.1H,) GO TO 200 C I=I+1 IF(I.GT.80) OPERR=.TRUE. IF(OPERR) GO TO 100 OPREND=I C C--- MOVE CHARACTER TO THE OPCODE FIELD C 120 CONTINUE IF(OPTR.GE.7) OPERR=.TRUE. IF(OPERR) GO TO 100  OPTR=OPTR+1 OPCODE(OPTR)=LINE(I) IF(LINE(I).EQ.1H#) PSEUDO=.TRUE. GO TO 100 C 130 CONTINUE IF(OPEN) GO TO 200 OPEN=.TRUE. GO TO 100 C C--- MOVE CHARACTER TO THE OPERAND BUFFER C 200 CONTINUE IF(LINE(I).EQ.1H() PAREN=PAREN+1 IF(LINE(I).EQ.1H)) PAREN=PAREN-1 IF(PAREN.LT.0) ERRNUM=ERRNUM*16+9 C 220 CONTINUE SYMPTR=SYMPTR+1 SYMBOL(SYMPTR)=LINE(I) GO TO 100 C C--- FIND START OF COMMENT C 260 CONTINUE I=I+1 IF(I.GT.80) GOTO 300 IF(LINE(I).EQ.1H ) GOTO 260 GOTO 295 C C C--- END OF SCAN. CHECK FOR SPECIAL OPERANDS. C C 290 CONTINUE PSEUDO=.FALSE. C 295 CONTINUE COMST=I 300 CONTINUE IF(PSEUDO.AND.OPTR.NE.0) GO TO 350 IF(SYMPTR.NE.1) GOTO 350 IF(SYMBOL(SYMPTR).NE.1HA) GOTO 350 IF(OPTR.GE.7) OPERR=.TRUE. IF(OPERR) GO TO 350 OPTR=OPTR+1 OPCODE(OPTR)=1HA C C--- EXIT PARSE BY CHECKING FOR SCAN ERRORS AND COMMENT LINES C 350 CONTINUE IF(OPTR.EQ. 0) OPCODE(1)=1H* IF(OPTR.EQ.0) OPTR=1 IF(OPERR) ERRNUM=ERRNUM*16+7 IF(LABERR) ERRNUM=ERRNUM*16+8 IF(PAREN.NE.0) ERRNUM=ERRNUM*16+9 RETURN C C--- IF THE END OF FILE ON PASS 1 THEN CREATE A .. PSEUDO OP C 500 CONTINUE LINE(1)=1H LINE(2)=1H. OPCODE(1)=1H. LINE(3)=1H. OPCODE(2)=1H. OPTR=2 LABPTR=0 RETURN C C--- PASS 2 END OF FILE. CREATE A DUMMY END PSEUDO OP C 600 CONTINUE OPCODE(1)=1H. OPCODE(2)=1HE OPCODE(3)=1HN OPCODE(4)=1HD OPTR=4 LABPTR=0 SYMPTR=0 RETURN C END SUBROUTINE ERROR IMPLICIT INTEGER(A-Z) COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/FIELDS/LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ LOGICAL DIDIT(15) C C--- THIS SUBROUTINE HANDLES THE PRINTING OF ERROR MESSAGES C IF(ERRNUM.EQ.0) RETURN DO 5 I=1,15 DIDIT(I)=.FALSE. 5 CONTINUE C CALL HEADING(1,1) CALL HEADING(-1,1) C WRITE(OUTFIL,777) LABPTR,LABEL,OPTR,OPCODE,SYMPTR,SYMBOL C777 FORMAT(1X,I5,1X,7A1,/,1X,I5,1X,7A1,/,1X,I5,1X,80A1) C C--- LOOP FOR THE ERRORS IN THE ERROR WORD C 10 CONTINUE IF(ERRNUM.EQ.0) RETURN ERRCNT=ERRCNT+1 ERR=ERRNUM-ERRNUM/16*16 ERR=IABS(ERR) ERRNUM=ERRNUM/16 ERRNUM=IABS(ERRNUM) CALL HEADING(1,1) GO TO (500,1000,1200, + 1400,1800,1900,2000,2100,2200,2400, + 2500,2700,10,10),ERR C C 500 CONTINUE  IF(DIDIT(1)) GO TO 10 WRITE(OUTFIL, 550 ) DIDIT(1)=.TRUE. GO TO 10 550 FORMAT(' *** ERROR. REQUIRED FIELD IS MISSING. CARD IS IGN', + 'ORED.') C C 1000 CONTINUE IF(DIDIT(2)) GO TO 10 WRITE(OUTFIL, 1050 ) DIDIT(2)=.TRUE. GO TO 10 1050 FORMAT(' *** ERROR. OPERAND IS OUT OF RANGE. ONLY LOW ORDER', + ' BITS ARE USED.') C C 1200 CONTINUE IF(DIDIT(3)) GO TO 10 WRITE(OUTFIL, 1250 ) DIDIT(3)=.TRUE. GO TO 10 1250 FORMAT(' *** ERROR. REQUIRED FIELD IS MISSING.') C C 1400 CONTINUE IF(DIDIT(4)) GO TO 10 WRITE(OUTFIL, 1450 ) DIDIT(4)=.TRUE. GO TO 10 1450 FORMAT(' *** ERROR. INVALID OPCODE AND/OR ADDRESSING MODE CO', + 'NFLICT.') C C C 1800 CONTINUE  IF(DIDIT(5)) GO TO 10 WRITE(OUTFIL, 1850 ) DIDIT(5)=.TRUE. GO TO 10 1850 FORMAT(' *** ERROR. TOO MANY FIELDS IN OPERAND. EXCESS ARE ', + 'IGNORED.') C C 1900 CONTINUE IF(DIDIT(6)) GO TO 10 WRITE(OUTFIL, 1950 )  DIDIT(6)=.TRUE. GO TO 10 1950 FORMAT(' *** ERROR. DUPLICATE SYMBOL DEFINITION. FIRST DEFI', + 'NITION HOLDS.') C C 2000 CONTINUE IF(DIDIT(7)) GO TO 10 WRITE(OUTFIL, 2050 ) DIDIT(7)=.TRUE. GO TO 10 2050 FORMAT(' *** ERROR. OPCODE TRANSLATION WAS TOO LONG. EXCESS', + ' TRUNCATED.') C C 2100 CONTINUE IF(DIDIT(8)) GO TO 10  WRITE(OUTFIL, 2150 ) DIDIT(8)=.TRUE. GO TO 10 2150 FORMAT(' *** ERROR. LABEL WAS TOO LONG. EXCESS IS TRUNCATED.') C C 2200 CONTINUE IF(DIDIT(9)) GO TO 10 WRITE(OUTFIL, 2250 ) DIDIT(9)=.TRUE. GO TO 10 2250 FORMAT(' *** ERROR. UNBALANCED PARENTHESIS.') C C 2400 CONTINUE IF(DIDIT(10)) GO TO 10 WRITE(OUTFIL, 2450 ) DIDIT(10  )=.TRUE. GO TO 10 2450 FORMAT(' *** ERROR. SYMBOL HAS NOT YET BEEN DEFINED IN THIS ', + 'ASSEMBLY.') C C 2500 CONTINUE IF(DIDIT(11)) GO TO 10 WRITE(OUTFIL, 2550 ) DIDIT(11)=.TRUE. GO TO 10 2550 FORMAT(' *** ERROR. INVALID DIGIT IN NUMERIC CONSTANT') C C 2700 CONTINUE WRITE(OUTFIL,2750) 2750 FORMAT(' *** ERROR. SYMBOL TABLE FULL. ALL FOLLOWING ', +'SYMBOL DEFINITIONS IGNORED.') GO TO 10 END SUBROUTINE HEADING(VALUE,FORCE) IMPLICIT INTEGER(A-Z) COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN C C--- THIS SUBROUTINE WILL PRINTS OUT A HEADING AT THE TOP OF A PAGE C--- AND CONTROLS SPACING OF LINES, ETC. C C--- PARAMETER 'VALUE' IS A FUNCTION CODE. IF 0 THEN (-VALUE) BLANK C--- LINES WILL BE PRINTED. IF VALUE = 0, THEN A PAGE EJECT WILL OCCUR. C--- IF 'VALUE' \ 0, THEN THE LINE COUNTER WILL BE INCREMENTED BY C--- 'VALUE' LINES AND ANY NECESSARY PAGING WILL BE TAKEN IF THE C--- LINE COUNT IS \ THE MAXIMUM NUMBER OF LINES ON A PAGE. C C C--- CHECK LISTING OPTIONS AND FORCED OVERIDE PARAMETER ('FORCE'=1 C--- MEANS TO FORCE PRINTING OF HEADERS REGARDLESS OF LISTING OPTIONS). C IF(NOLIST.EQ.1.AND.FORCE.EQ.0) RETURN IF(VALUE.LT.0) GO TO 200 IF(VALUE.EQ.0) LINENO=10000 C C--- BUMP THE LINE COUNT C LINENO=LINENO+VALUE IF(LINENO.LT.MAXLIN) RETURN C C--- PRINT A PAGE EJECT AND A HEADER LINE C 50 CONTINUE PAGE=PAGE+1 LINENO=3 WRITE(OUTFIL,100) PAGE,TITLE 100 FORMAT('1PAGE ',I5,16X,80A1,//) RETURN C C--- PRINT BLANK LINES C 200 CONTINUE VAL=IABS(VALUE) LINENO=LINENO+VAL IF(LINENO.GT.MAXLIN-1) GO TO 50 DO 240 I=1,VAL WRITE(OUTFIL,220) 220 FORMAT(' ') 240 CONTINUE RETURN END INTEGER FUNCTION ASCII(CHAR) IMPLICIT INTEGER(A-Z) ASCII=IAND(CHAR,:7F00)/256 RETURN END INTEGER FUNCTION EVAL(LINE,START,FINISH) IMPLICIT INTEGER(A-Z) C C C--- THIS FUNCTION IS CALLED TO EVALUATE AN EXPRESSION. THE VALUE C--- OF THE EXPRESSION IN ARRAY 'LINE' STARTING AT COLUMN 'START' AND C--- ENDING IN COLUMN 'FINISH' IS RETURNED THROUGH THE FUNCTION NAME. C C--- THE EXPRESSION CAN HAVE ANY NUMBER OF PARENTHESES NESTED, ETC. C--- THE ALLOWABLE OPERATORS AND THEIR PRECEDENCE IS AS FOLLOWS: C--- C--- * - MULTIPLICATION - 8 C--- / - DIVISION - 8 C--- + - ADDITION - 7 C--- - - SUBTRACTION - 7 C--- < - LESS THAN - 6 C--- = - EQUAL TO - 6 C--- > - GREATER THAN - 6 C--- >= - GREATER THAN OR C--- => EQUAL TO -6 C--- <= - LESS THAN OR C--- =< EQUAL TO - 6 C--- <> - NOT EQUAL TO C--- >< - 6 C--- ** - AND - 5 C--- ++ - OR - 4 C--- // - EXCLUSIVE OR - 4 C--- - - UNARY MINUS - 3 C--- + - UNARY PLUS - 3 C--- -- - LOGICAL NOT - 2 C C DIMENSION LINE(80), OPTAB(10), PRCTAB(17) LOGICAL QUOTE DATA OPTAB/1H),1H(,1H+,1H-,1H*,1H/,1H',1H<,1H=,1H>/ DATA PRCTAB/1,2,7,7,8,8,-1,6,6,6,6,6,6,4,5,3,4/ F=FINISH EXPSTK=0 OPSTAK=0 QUOTE=.FALSE. I=START-1 N=I S=START C C--- START  SCAN OF STRING C 10 CONTINUE I=N+1 N=I IF(I.GT.F) GO TO 500 IF(QUOTE) GO TO 300 DO 20 J=1,10  IF(LINE(I).NE.OPTAB(J)) GO TO 20 OPER=J GO TO 40 20 CONTINUE GO TO 10 C C--- OPERATOR FOUND C 40 CONTINUE GO TO (400,100,180,180,180,180,300,110,110,110),OPER C C--- OPEN PAREN FOUND. PUSH ON OPSTACK C 100 CONTINUE  CALL PUSH(2,OPSTAK) S=I+1 GO TO 10 C C--- RELATIONAL OPERATOR C 110 CONTINUE IF(I.EQ.F) GO TO 100  J=I+1 IF(LINE(I).EQ.1H<.AND.LINE(J).EQ.1H=) OPER=11 IF(LINE(I).EQ.1H<.AND.LINE(J).EQ.1H>) OPER=13 IF(LINE(I).EQ.1H=.AND.LINE(J).EQ.1H>) OPER=12 IF(LINE(I).EQ.1H=.AND.LINE(J).EQ.1H<) OPER=11 IF(LINE(I).EQ.1H>.AND.LINE(J).EQ.1H=) OPER=12 IF(LINE(I).EQ.1H>.AND.LINE(J).EQ.1H<) OPER=13 IF(OPER.GE.11) N=J GO TO 200 C C--- LOGICAL OPERATOR C 180 CONTINUE IF(I.EQ.F) GO TO 200 J=I+1 IF(LINE(I).EQ.1H+.AND.LINE(J).EQ.1H+) OPER=14 IF(LINE(I).EQ.1H*.AND.LINE(J).EQ.1H*) OPER=15 IF(LINE(I).EQ.1H-.AND.LINE(J).EQ.1H-) OPER=16 IF(LINE(I).EQ.1H/.AND.LINE(J).EQ.1H/) OPER=17 IF(OPER.LT.14) GO TO 200 N=J GO TO 200 C C--- GET OPERATOR PRECEDENCE C 200 CONTINUE PRCD=PRCTAB(OPER) C C--- SEE IF UNARY OP C IF(OPER.NE.3.AND.OPER.NE.4.AND.OPER.NE.16) GO TO 245 IF(OPER.EQ.16) GO TO 245 IF(I.EQ.START) CALL PUSH(0,EXPSTK) IF(I.NE.START.AND.LINE(I-1).EQ.1H() CALL PUSH(0,EXPSTK) IF(I.EQ.START) GO TO 250 IF(I.NE.START.AND.LINE(I-1).EQ.1H() GO TO 250 245 CONTINUE C C--- CHECK PRECEDENCE OF TOP OF OPSTACK C 240  CONTINUE IF(S.GT.I-1) GO TO 250 OP=POP(OPSTAK) CALL PUSH(OP, OPSTAK) STKPRCD=0 IF(OP.NE.0) STKPRCD=PRCTAB(OP) VAL=TERM(LINE,S,I-1) CALL PUSH(VAL,EXPSTK) C C--- SEE IF OPERATION CAN BE GENERATED C 250 CONTINUE OP=POP(OPSTAK) STKPRCD=0 IF(OP.NE.0) STKPRCD=PRCTAB(OP) IF(STKPRCD.LT.PRCD) GO TO 260 CALL GENOP(OP,EXPSTK) GO TO 250 C C--- STACK PRECDENCE WAS LESS THAN OPERATOR PRECEDNCE C 260 CONTINUE CALL PUSH(OP,OPSTAK) S=N+1 CALL PUSH(OPER,OPSTAK) GO TO 10 C C--- QUOTE C 300 CONTINUE IF(.NOT.QUOTE) S=I IF(LINE(I).EQ.1H') QUOTE=.NOT.QUOTE IF(QUOTE) GO TO 10 C C--- END OF QUOTED TOKEN C VAL=TERM(LINE,S,I) CALL PUSH(VAL,EXPSTK) S=I+1 GO TO 10 C C--- CLOSE PAREN. START POPPING OPSTACK UNTIL AN OPEN PAREN C 400 CONTINUE VAL=0 IF(S.GT.I-1) GO TO 420 VAL=TERM(LINE,S,I-1) CALL PUSH(VAL,EXPSTK) 420 CONTINUE S=I+1 OP=POP(OPSTAK) IF(OP.EQ.0) GO TO 600 IF(OP.EQ.2) GO TO 10 CALL GENOP(OP,EXPSTK) GO TO 400 C C--- END OF LINE C 500 CONTINUE C IF(LINE(F).EQ.1H)) GO TO 520 IF(LINE(F).EQ.1H') GO TO 520 VAL=TERM(LINE,S,F) CALL PUSH(VAL,EXPSTK) C C--- FINISH OFF OPERATOR STACK C 520 CONTINUE OP=POP(OPSTAK) IF(OP.LE.2) GO TO 600 CALL GENOP(OP,EXPSTK) GO TO 520 C C--- RETURN A VALUE C 600 CONTINUE EVAL=POP(EXPSTK) RETURN END SUBROUTINE GENOP(OP,STACK) IMPLICIT INTEGER(A-Z) C C C--- THIS SUBROUTINE GENERATES OPERATIONS UPON THE NUMBERS C--- STORED  IN THE STACK POINTED TO BY PARAMETER 'STACK'. C C--- THE RESULT OF THE OPERATION IS PUT BACK ON THE STACK. C--- THE DESIRED OPERATION CODE IS PASSED IN PARAMETER 'OP'. C--- SEE THE COMMENTS IN THE ROUTINE FOR THE POSSIBLE OPERATIONS. C C OP2=POP(STACK) OP1=POP(STACK) VAL=0 GO TO (100,100,300,400,500,600,100,800,900,1000,1100, + 1200,1300,1400,1500,1600,1700),OP C C--- DUMMY OPS C 100 CONTINUE CALL PUSH(OP1,STACK) CALL PUSH(OP2,STACK) RETURN C C--- ADD C 300 CONTINUE VAL=OP1+OP2 GO TO 2000 C C--- SUBTRACT C 400 CONTINUE VAL=OP1-OP2 GO TO 2000 C C--- MULTIPLY C 500 CONTINUE VAL=OP1*OP2 GO TO 2000 C C--- DIVIDE C 600 CONTINUE IF(OP2.NE.0) VAL=OP1/OP2 GO TO 2000 C C--- LESS THAN C 800 CONTINUE IF(OP1.LT.OP2) VAL=(-1) GO TO 2000 C C--- EQUAL C 900 CONTINUE IF(OP1.EQ.OP2) VAL=(-1) GO TO 2000 C C--- GREATER THAN C 1000 CONTINUE IF(OP1.GT.OP2) VAL=(-1)  GO TO 2000 C C--- LESS THAN OR EQUAL C 1100 CONTINUE IF(OP1.LE.OP2) VAL=(-1) GO TO 2000 C C--- GREATER THAN OR EQUAL TO C 1200 CONTINUE IF(OP1.GE.OP2) VAL=(-1) GO TO 2000 C C--- NOT EQUAL TO C 1300 CONTINUE IF(OP1.NE.OP2) VAL=(-1) GO TO 2000 C C--- OR C 1400 CONTINUE VAL=IOR(OP1,OP2) GO TO 2000 C C--- AND C 1500 CONTINUE VAL=IAND(OP1,OP2) GO TO 2000 C C--- NOT C 1600 CONTINUE VAL=INOT(OP2) CALL PUSH(OP1,STACK) GO TO 2000 C C--- EXCLUSIVE OR C 1700 CONTINUE VAL=IEOR(OP1,OP2) GO TO 2000 C C--- PUT RESULT BACK ON THE STACK AND RETURN C 2000 CONTINUE CALL PUSH(VAL,STACK) RETURN END FUNCTION NUMVAL(LINE,START,FINISH) IMPLICIT INTEGER(A-Z) COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT DIMENSION LINE(80) C C--- THIS FUNCTION EVALUATES A NUMERIC CONSTANT IN ARRAY *LINE* FROM C--- COLUMNS *START* TO *FINISH*. BOTH PREFIXED RADIX OR C--- OR OPTIONAL POSTFIXING CAN BE HANDLED. C C--- IF AN INVALID NUMBER IS FOUND, A ERROR MESSAGE IS GENERATED C--- AND 'NUMVAL' IS RETURNED AS ZERO (0). C C--- BINARY (BASE 2) CONSTANTS CAN BE POSTFIXED WITH A 'B' OR 'S' C--- OCTAL (BASE 8) CONSTANTS CAN BE POSTFIXED WITH A 'O' OR 'Q' C--- DECIMAL (BASE 10) CONSTANTS CAN BE POSTFIXED WITH A 'D' C--- HEX (BASE 16) CONSTANTS CAN BE POSTFIXED WITH A 'H' OR 'Z' OR C--- CAN BE PREFIXED WITH A '$', A ':', OR A 0 (ZERO). C--- EXPLICIT BASE (BASE X) CAN BE POSTFIXED WITH A 'R' FOLLOWED BY C--- A SINGLE CHARACTER RADIX DIGIT (2-F) C C NUMVAL=0 BASE=10 I=START FIN=FINISH C C--- SEE IF PREFIXED RADIX C IF(LINE(I).EQ.1H$) BASE=16 IF(LINE(I).EQ.1H:) BASE=16 IF(BASE.NE.10) GO TO 110 C C--- SEE IF POSTFIXED RADIX C IF(LINE(FINISH-1).EQ.1HR) GO TO 300 IF(LINE(FINISH).EQ.1HS) BASE=2 IF(LINE(FINISH).EQ.1HB.AND.LINE(START).NE.1H0) BASE=2 IF(LINE(FINISH).EQ.1HQ) BASE=8 IF(LINE(FINISH).EQ.1HO) BASE=8 IF(LINE(FINISH).EQ.1HZ) BASE=16 IF(LINE(FINISH).EQ.1HH) BASE=16 IF(BASE.NE.10) GO TO 100 IF(LINE(FINISH).EQ.1HD.AND.LINE(START).NE.1H0) GO TO 100 C C--- IF A LEADING ZERO AND NO POSTFI  X THEN ASSUME BASE 16 C IF(LINE(START).EQ.1H0) BASE=16 GO TO 120 C C--- ADJUST ENDING CHARACTER FOR POSTFIXED RADIX C 100 CONTINUE FIN=FINISH-1 GO TO 120 C C--- CONSTANT EVALUATION LOOP (USES SHIFTED POLYNOMIAL TECHNIQUE) C 110 CONTINUE I=I+1 120 CONTINUE IF(I.GT.FIN) RETURN IF(BASE.NE.16) GO TO 140 IF(LINE(I).GT.1HF) GO TO 140 DIGIT=HEXVAL(LINE(I)) GO TO 150 140 CONTINUE DIGIT=HEXVAL(LINE(I)) 150 CONTINUE IF(DIGIT.GE.BASE) GO TO 200 IF(DIGIT.LT.0) GO TO 200 NUMVAL=NUMVAL*BASE+DIGIT GO TO 110 C C--- ERROR EXIT C 200 CONTINUE ERRNUM=ERRNUM*16+11 NUMVAL=0 RETURN C C--- EXPLICITLY NAMED BASE C 300 CONTINUE BASE=HEXVAL(LINE(FINISH)) IF(BASE.LT.2) GO TO 200 IF(BASE.GT.15) GO TO 200 FIN=FINISH-2 GO TO 120 END INTEGER FUNCTION TERM(LINE,START,FINISH) IMPLICIT INTEGER(A-Z) DIMENSION LINE(80) COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/FIELDS/ LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT C C--- THIS SUBROUTINE DETERMINES THE TYPE OF A TERM IN AN EXPRESSION C--- AND CALLS THE APPROPRIATE ROUTINE(S) TO OBTAIN ITS C--- BINARY VALUE. C C--- THE TERM TO BE EVALUATED IS CONTAINED IN PARAMETER ARRAY C--- 'LINE' FROM COLUMNS 'START' TO 'FINISH'. C C C C NUMBER=0 TERMTYP=2 S=START I=FINISH+1 IF(LINE(S).EQ.1H$) GO TO 200 IF(LINE(S).EQ.1H:) GO TO 200 IF(1H0.LE.LINE(S).AND.LINE(S).LE.1H9) GO TO 200 IF(LINE(S).EQ.1H') GO TO 300 IF(START.EQ.FINISH.AND. LINE(START).EQ.1H.) GO TO 400 C C--- SYMBOLIC DATA C N=I-1 TEMP=MANGER(LINE,S,N,SYMVAL,XPTR,1) IF(TEMP) 150,150,130 130 CONTINUE NUMBER=SYMVAL C C--- ADD AN XREF ENTRY TO THE XREF CHAIN FOR THE LABEL C IF(NOXREF.EQ.1.OR.PASS.NE.2) GO TO 500 CALL PUSH(CARD,XPTR) N=I-1 TEMP=MANGER(LINE,S,N,SYMVAL,XPTR,2) GO TO 500 C C--- UNDEFINED SYMBOL C 150 CONTINUE ERRNUM=ERRNUM*16+10 NUMBER=0  GO TO 500 C C--- NUMERIC DATA C 200 CONTINUE NUMBER=NUMVAL(LINE,S,I-1) GO TO 500 C C--- QUOTED ASCII DATA C 300 CONTINUE J=START+1 K=MIN0(FINISH-1,J+1) DO 320 I=J,K NUMBER=NUMBER*256+ASCII(LINE(I)) 320 CONTINUE GO TO 500 C C--- SYMBOL IS PROGRAM COUNTER CHARACTER C 400 CONTINUE NUMBER=PCOUNT C 500 CONTINUE TERM=NUMBER RETURN END INTEGER FUNCTION HEXVAL(ARG) IMPLICIT INTEGER(A-Z) INTEGER CNV(16) DATA CNV/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,1HA,1HB,1HC, + 1HD,1HE,1HF/ DO 10 I=1,16 HEXVAL=I-1 IF(ARG.EQ.CNV(I)) RETURN 10 CONTINUE HEXVAL=(-1) RETURN END SUBROUTINE PUSH(DATA,LIST) IMPLICIT INTEGER(A-Z) COMMON/LNKLST/ AVLIST(2000,2), AVSIZE COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/BUFFER/ LINE(80) C C C--- THIS SUBROUTINE WILL PUSH PARAMETER 'DATA' ONTO THE LINKED C--- STACK POINTED TO BY PARAMETER 'LIST'. C C---   SEE IF THERE IS ANY FREE SPACE IN THE AVAIL LIST C C P=AVAIL IF(P.EQ.0) ERRNUM=15 IF(P.EQ.0) CALL ERROR C C--- PUSH THE DATA ONTO THE STACK C AVAIL=AVLIST(P,2) AVLIST(P,1)=DATA AVLIST(P,2)=LIST LIST=P RETURN END INTEGER FUNCTION POP(STACK) IMPLICIT INTEGER(A-Z) COMMON/LNKLST/ AVLIST(2000,2), AVSIZE COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT C C--- THIS FUNCTION WILL POP A DATA WORD OFF OF THE STACK C--- POINTED TO BY PARAMETER 'STACK' AND RETURN IT. 'STACK' C--- IS SET TO 0 WHEN THE STACK BECOMES EMPTY. ANY ATTEMPT C--- TO POP AN EMPTY STACK WILL RETURN A DATA VALUE OF 0. C C C P=STACK POP=0 IF(STACK.LE.0) RETURN STACK=AVLIST(P,2)  POP=AVLIST(P,1) AVLIST(P,2)=AVAIL AVAIL=P RETURN END SUBROUTINE OUTPUT(OP,VAL,TYPE,REL) IMPLICIT INTEGER(A-Z) C C C--- THIS SUBROUTINE CONTROLS THE GENERATION OF THE OUTPUT FILES. C--- (BOTH SOURCE AND OBJECT) C C--- PARAMETER 'OP' IS THE OPCODE TO OUTPUT C--- PARAMETER 'VAL' IS THE OPERAND TO OUTPUT C--- PARAMETER 'TYPE' IS THE TYPE OF OUTPUT TO PERFORM C--- TYPE=1: OUTPUT 1 BYTE (OPCODE) C--- TYPE=2: OUTPUT 2 BYTES (OPCODE,VAL) C--- TYPE=3: OUTPUT 3 BYTES (OPCODE,VAL) C--- TYPE=4: OUTPUT SOURCE LINE ONLY C--- TYPE=5: OUTPUT SOURCE LINE AND VAL ON LISTING ONLY C--- TYPE=6: OUTPUT SOURCE LINE AND VAL BUT DO NO PHASE ERROR C--- CHECKING ON THE LABEL IF IT IS PRESENT C--- TYPE=7: OUTPUT 2 BYTES OF DATA IN PARAMETER 'VAL' C C COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT COMMON/FIELDS/ LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN  COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON /SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/BUFFER/ LINE(80) COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMMON/FMT/OUT(110),LABST,LABEND,OPCST,OPCEND,OPRST,OPREND,COMST C C--- DETERMINE IF LISTING FLAG IS TO BE SET TO SOME CHARACTER C FLAG=1H LEN=TYPE IF(LEN.GT.3) LEN=0 IF(LABPTR.EQ.0) GO TO 3 C C--- CHECK FOR A LABEL PHASE ERROR BETWEEN PASS1 AND PASS 2 C K=MANGER(LABEL,1,LABPTR,SYMVAL,XPTR,1) I=SYMVAL IF(I.NE.PCOUNT.AND.TYPE.NE.6.AND.K.GT.0) FLAG=1HP C 3 CONTINUE C--- FIRST PRINT ANY ERROR MESSAGES C 10 CONTINUE CALL ERROR C C--- DETERMINE THE CORECT OUTPUT GROUP C 20 CONTINUE IF(NOLIST.EQ.1) GO TO 2000  CALL HEADING(1,0) J=IABS(TYPE) GO TO (100,200,300,500,400,500,150),J C C--- 1 BYTE OUTPUT C 100 CONTINUE  CALL REFORM WRITE(OUTFIL,110) CARD,FLAG,PCOUNT,OP,OUT 110 FORMAT(1X,I5,'.',1X,A1,1X,Z4,2X,Z2,9X,110A1) GO TO 1000 C C--- 2 BYTE DATA WORDS C 150 CONTINUE LEN=2 CALL BYTES(VAL,N1,N2) CALL REFORM WRITE(OUTFIL,160) CARD,FLAG,PCOUNT,N1,N2,OUT 160 FORMAT(1X,I5,'. ',A1,1X,Z4,5X,Z2,1X,Z2,3X,110A1) GO TO 1000 C C--- 2 BYTE C 200 CONTINUE CALL REFORM WRITE(OUTFIL,210) CARD,FLAG,PCOUNT,OP,VAL,OUT 210 FORMAT(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,6X,110A1) GO TO 1000 C C--- 3 BYTE C 300 CONTINUE CALL BYTES(VAL,PCH,PCL) CALL REFORM WRITE(OUTFIL,310) CA RD,FLAG,PCOUNT,OP,PCL,PCH,OUT 310 FORMAT(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,1X,Z2,3X,110A1) GO TO 1000 C C--- SOURCE LINE ONLY C 400 CONTINUE WRITE(OUTFIL,410) CARD,FLAG,LINE 410 FORMAT(1X,I5,'. ',A1,18X,80A1) GO TO 2000 C C--- SOURCE LINE AND VAL ONLY C 500 CONTINUE CALL REFORM WRITE(OUTFIL,510) CARD,FLAG,VAL,OUT 510 FORMAT(1X,I5,'. ',A1,10X,'(',Z4,')',2X,110A1) GO TO 2000 C C--- BUMP CARD COUNTER C 1000 CONTINUE C C--- GENERATE THE OBJECT MODULE ENTRY C 2000 CONTINUE IF(LEN.EQ.0) GO TO 2500 IF(NOOBJ.EQ.1) GO TO 2500 CALL BYTES(VAL,PCH,PCL) P1=PCOUNT+1  P2=PCOUNT+2 IF(TYPE.NE.7) GO TO 2020 P1=PCOUNT P2=PCOUNT+1 I=PCL PCL=PCH PCH=I GO TO 2300 C C--- GENERATE THE FIRST BYTE OF OBJECT CODE C 2020 CONTINUE IF(LEN.NE.0.AND.IABS(TYPE).LE.3) WRITE(OBJ,2030) PCOUNT,OP 2030 FORMAT(' T',Z4,1X,Z2) C C--- SEE IF ANY MORE DATA TO OUTPUT C IF(LEN.EQ.1) GO TO 2500 IF(LEN.NE.2) GO TO 2300 C C--- OUTPUT THE SECOND BYTE OF A 2 BYTE OPCODE OR DATA WORD C WRITE(OBJ,2030) P1,PCL GO TO 2500 C C--- GENERATE THE SECOND AND THIRD BYTES OF A THREE BYTE OPCODE C C 2300 CONTINUE WRITE(OBJ,2030) P1,PCL WRITE(OBJ,2030) P2,PCH GO TO 2500 C C--- UPDATE THE PCOUNTER C 2500 CONTINUE PCOUNT=PCOUNT+LEN RETURN END  SUBROUTINE REFORM IMPLICIT INTEGER(A-Z) COMMON /FIELDS/ LABEL(7),OPCODE(7),SYMBOL(80),OPTR,LABPTR,SYMPTR COMMON/FMT/OUT(110),LABST,LABEND,OPCST,OPCEND,OPRST,OPREND,COMST COMMON/BUFFER/ LINE(80) C C C--- REFORM THE OUTPUT LINE TO GET A PRETTY LISTING REGARDLESS C--- OF HOW THE KLUTZ TYPED IT IN!!! C C DO 10 I=1,110 OUT(I)=1H 10 CONTINUE C C--- DO THE LABEL FIELD C END=0 LAST=30 FLD=1 IF(LABST.LE.0) GO TO 40 END=LABEND DO 20 I=LABST,END OUT(FLD+I-1)=LINE(I) 20 CONTINUE C C--- DO THE OPCODE C 40 CONTINUE IF(OPCST.LE.0) GOTO 100 FLD=MAX0(END+1,10) END=OPCEND IF(END.LE.0) GOTO 100 DO 60 I=OPCST,END OUT(I-OPCST+FLD)=LINE(I) 60 CONTINUE C C--- DO THE OPERAND C 100 CONTINUE IF(OPRST.LE.0) GOTO 200 FLD=MAX0(END+1,15) END=OPREND IF(END.LE.0) GOTO 200 DO 120 I=OPRST,END OUT(I+FLD-OPRST)=LINE(I) LAST=I+FLD-OPRST+2 120 CONTINUE C C--- DO THE COMMENT C 200 CONTINUE IF(COMST.LE.0) GOTO 300 FLD=MAX0(30,LAST) DO 220 I=COMST,80 OUT(I-COMST+FLD)=LINE(I) 220 CONTINUE C C--- EXIT C 300 CONTINUE RETURN END SUBROUTINE SYMOUT IMPLICIT INTEGER(A-Z) COMMON/FILES/ INFILE,OUTFIL,SCR1,OBJ COMMON/OPTIONS/ NOLIST,NOOBJ,NOXREF,NOGEN COMMON/SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/HEAD/ TITLE(80),LINENO,PAGE,COMCOL,MAXLIN DIMENSION OUT(20) C C C--- THIS SUBROUTINE PRINTS OUT THE SYMBOL TABLE AND XREF CHAINS C C IF(NOXREF.EQ.1) RETURN IF(LASTSYM.EQ.0) RETURN C C--- ITERATE FOR EACH ENTRY IN THE MAIN SYMBOL TABLE C CALL HEADING(0,1) DO 1000 I=1,LASTSYM 10 FORMAT(' SYMBOL TABLE AND CROSS REFERENCE MAP',// +' SYMBOL ADDR REFERENCES',/) C C--- CHECK IF THERE IS AN ENTRY IN THE SYMBOL TABLE FOR THE  LINK C--- FOLLOW THE CHAIN IF THERE IS C ADDR=SYMTAB(I,SYMLEN+1) TEMP=SYMTAB(I,SYMLEN+2) C C--- REVERSE THE LIST C CHAIN=0 20 CONTINUE REF=POP(TEMP) CALL PUSH(REF,CHAIN) IF(TEMP.NE.0) GOTO 20 DEFINED=POP(CHAIN) IF(CHAIN.EQ.0) GOTO 200 K=0 C DO 40 J=1,13 LINE=POP(CHAIN) IF(LINE.LT.DEFINED) GOTO 44 CALL PUSH(LINE,CHAIN) LINE=0-DEFINED DEFINED=32767 44 CONTINUE OUT(J)=LINE K=K+1 IF(CHAIN.NE.0) GO TO40 IF(DEFINED.EQ.32767) GOTO 50 CALL PUSH(0-DEFINED,CHAIN) DEFINED=32767 40 CONTINUE 50 CONTINUE C IF(LINENO.GT.MAXLIN-5) CALL HEADING(0,1) IF(LINENO.EQ.3) WRITE(OUTFIL,10) IF(LINENO.EQ.3) LINENO=5 CALL HEADING(1,1) WRITE(OUTFIL,60) (SYMTAB(I,JJ),JJ=1,SYMLEN),ADDR,(OUT(J),J=1,K) 60 FORMAT(2X,7A1,2X,Z4,2X,17(1X,I5))  IF(CHAIN.EQ.0) GO TO 1000 C C--- GENERATE THE FOLLOWING LINES OF OUTPUT C 70 CONTINUE K=0 DO 80 J=1,13 LINE=POP(CHAIN) IF(LINE.LT.DEFINED) GOTO 74 CALL PUSH(LINE,CHAIN) LINE=0-DEFINED DEFINED=32767 74 CONTINUE OUT(J)=LINE K=K+1 IF(CHAIN.NE.0) GO TO 80 IF(DEFINED.EQ.32767) GOTO 90 CALL PUSH(0-DEFINED,CHAIN) DEFINED=32767 80 CONTINUE 90 CONTINUE C IF(LINENO.GT.MAXLIN-5) CALL HEADING(0,1) IF(LINENO.EQ.3) WRITE(OUTFIL,10) IF(LINENO.EQ.3) LINENO=5 CALL HEADING(1,1) WRITE(OUTFIL,100)(OUT(J),J=1,K) 100 FORMAT(17X,17(1X,I5)) IF(CHAIN.NE.0) GO TO 70 GO TO 1000 C C--- NO REFERENCES C 200 CONTINUE IF(LINENO.GT.MAXLIN-5) CALL HEADING(0,1) IF(LINENO.EQ.3) WRITE(OUTFIL,10) IF(LINENO.EQ.3) LINENO=5 CALL HEADING(1,1) DEFINED=0-DEFINED WRITE(OUTFIL,220) (SYMTAB(I,JJ),JJ=1,SYMLEN),ADDR,DEFINED 220 FORMAT(2X,7A1,2X,Z4,3X,I5,6X,'NO REFERENCES') 1000 CONTINUE RETURN END SUBROUTINE BYTES(VALUE,UPPER,LOWER) IMPLICIT INTEGER(A-Z) C C C--- THIS SUBROUTINE RETURNS THE LOWER EIGHT BITS OF *VALUE* C--- IN PARAMETER *LOWER* AND THE NEXT EIGHT BITS IN *UPPER*. C C LOWER=IAND(VALUE,:FF) UPPER=IAND(VALUE,:7F00)/256 IF(VALUE.LT.0) UPPER=IOR(UPPER,:80) RETURN END INTEGER FUNCTION MANGER(NAME,START,FINISH,ATTR,XPTR,CODE) IMPLICIT INTEGER(A-Z) COMMON/LNKLST/ AVLIST(2000,2), AVSIZE COMMON/SYMBLK/ SYMTAB(400,9), MAXSYM, SYMLEN, LASTSYM COMMON/STATUS/ CARD,PASS,PCOUNT,AVAIL,ERRNUM,ERRCNT INTEGER NAME(80),FNAME(7) C C C C--- THIS FUNCTION IS THE SYMBOL TABLE MANAGER. C--- IT CONTROLS ALL ACCESSES AND UPDATES TO THE TABLE. C C--- THE TABLE IS A SORTED LINEAR LIST ... C C--- PARAMETER 'NAME' IS THE NAME OF AN ARRAY WHICH CONTAINS C--- THE SYMBOL TO MANIPULATE. C C--- PARAMETERS 'START' AND 'FINISH' POINT TO THE BEGINNING AND C--- ENDING CHARACTERS OF THE SYMBOL WITHIN THE ARRAY 'NAME'. C C C C--- PARAMETER 'ATTR' IS THE ATTRRIBUTE ASSOCITAED WITH THE C--- ACCESS. C C--- PARAMETER 'XPTR' IS THE POINTER TO THE SYMBOL'S XREF CHAIN. C C--- PARAMETER 'CODE' IS THE FUNCTION TO BE PERFORMED UPON THE C---  TABLE. C--- CODE = 0: INSERT THE SYMBOL AND ATTRIBUTE C--- CODE = 1: RETREIVE THE ATTRIBUTE C--- CODE = 2: CHANGE T HE ATTRIBUTE C C--- THE FUNCTION RETURNS A POSITIVE NUMBER IF THE TABLE ACCESS C--- WAS SUCCESSFUL. THIS NUMBER IS THE LOCATION OF THE SYMBOL C--- IN THE LINKED LIST ARRAY. OTHER POSSIBLE VALUES RETURNED ARE: C--- MANGER = (-1): DUPLICATE SYMBOL DEFINITION AND CODE ='ED 0 C--- MANGER = (-3): SYMBOL WAS UNDEFINED ON A RETREIVE. C--- MANGER = (0) : TABLE HAS OVERFLOWED. C C C C MANGER=0 C C--- MOVE NAME TO ARRAY 'FNAME' FOR PROCESSING. BLANK FILL. C DO 10 I=1,SYMLEN FNAME(I)=1H J=START+I-1 IF(J.GT.FINISH) GO TO 10 FNAME(I)=NAME(J) 10 CONTINUE IP=1 IF(LASTSYM.EQ.0) GO TO 100 C C--- SEARCH FOR FNAME IN THE SYMBOL TABLE C L=1 U=LASTSYM LASTI=0 C 50 CONTINUE I=(L+U)/2  IF(I.EQ.LASTI) GO TO 100 LASTI=I IF(U.LT.I) GO TO 100 C DO 60 J=1,SYMLEN IF(FNAME(J)-SYMTAB(I,J)) 64,60,66 60 CONTINUE C C--- SYMBOL FOUND C GO TO 200 C C--- SYMBOL < TABLE C 64 CONTINUE U=I-1 IP=U  GO TO 50 C C--- SYMBOL > TABLE C 66 CONTINUE L=I+1 IP=L GO TO 50 C C--- SYMBOL NOT FOUND. SEE WHAT THE CALLER WANTS TO DO. C 100 CONTINUE IF(CODE.EQ.0) GO TO 120 MANGER=(-3) RETURN C C--- INSERT THE SYMBOL AT 'IP' IN THE LIST C 120 CONTINUE IF(LASTSYM.GE.MAXSYM) RETURN LASTSYM=LASTSYM+1 IF(LASTSYM.GE.MAXSYM) ERRNUM=ERRNUM*16+15 IF(LASTSYM.LE.1) GO TO 144 SLP2=SYMLEN+2 K=IP DO 140 J=K,LASTSYM DO 130 L=1,SLP2 SYMTAB(LASTSYM-J+K,L)=SYMTAB(LASTSYM-J+K-1,L) 130 CONTINUE 140 CONTINUE C C--- PUT IT IN C 144 CONTINUE DO 150 J=1,SYMLEN SYMTAB(IP,J)=FNAME(J) 150 CONTINUE MANGER=IP SYMTAB(IP,SYMLEN+1)=ATTR XPTR=0 CALL PUSH(CARD,XPTR) SYMTAB(IP,SYMLEN+2)=XPTR RETURN C C--- SYMBOL FOUND. ERROR IF NOT RETREVING OR MODIFYING C 200 CONTINUE IF(CODE.NE.0) GO TO 220 MANGER=(-1) RETURN C C--- RETREVING??? C 220 CONTINUE IF(CODE.NE.1) GO TO 260 ATTR=SYMTAB(I,SYMLEN+1) XPTR=SYMTAB(I,SYMLEN+2) MANGER=I RETURN C C--- MODIFYING ??? C 260 CONTINUE MANGER=I SYMTAB(I,SYMLEN+1)=ATTR SYMTAB(I,SYMLEN+2)=XPTR RETURN END INTEGER FUNCTION OPLOOK(NAME,START,FINISH,TYPE2,OPVALU) IMPLICIT INTEGER(A-Z) INTEGER NAME(80) INTEGER FOP(5) INTEGER OP1(7,10) INTEGER OP2(7,10) INTEGER OP3(7,10) INTEGER OP4(7,10) INTEGER OP5(7,11) INTEGER OP6(7,10) INTEGER OP7(7,10) INTEGER OP8(7,10) INTEGER OP9(7,10) INTEGER OP10(7,10) INTEGER OP11(7,10)  INTEGER OP12(7,10) INTEGER OP13(7,10) INTEGER OP14(7,10) INTEGER OP15(7,10) INTEGER OP16(7,10)  INTEGER OP17(7,10) INTEGER OP18(7,10) INTEGER OP19(7,10) INTEGER OP20(7,1) C C C--- THIS FUNCTION IS CALLED TO SEARCH THE OPCODE TABLE C--- FOR THE OPCODE CONTAINED IN ARRAY 'NAME' FROM COLUMNS C--- 'START' TO 'FINISH'. C C C---  THE FIRST WORD OF A TABLE ENTRY IS THE SYMBOL (IN A FORMAT) C--- THE FOLLOWING WORDS ARE THE ATTRIBUTE VECTOR FOR THE SYMBOL. C C--- FOR MACHINE OPS THE ATTRIBUTE VECTOR IS DEFINE AS FOLLOWS C--- WORD 1: THE OPCODE VALUE C--- WORD 2: THE INSTRUCT IONS LENGTH. A LENGTH OF ZERO MEANS THE OPCODE C--- IS A TWO BYTE PC RELATIVE BRANCH. C C--- FOR PSEUDO OPS THE ATTRIBUTE VECTOR IS DEFINED AS FOLLOWS: C--- WORD 1: ALWAYS ZERO FOR PSEUDO OPS C--- WORD 2: THIS IS THE PSEUDO OP INDEX CODE. IT IS ALWAYS NEGATIVE C C DIMENSION OPDAT(7,192) EQUIVALENCE (OP1,OPDAT(1,1)) EQUIVALENCE (OP2,OPDAT(1,11)) EQUIVALENCE (OP3,OPDAT(1,21)) EQUIVALENCE (OP4,OPDAT(1,31)) EQUIVALENCE (OP5,OPDAT(1,41)) EQUIVALENCE (OP6,OPDAT(1,52)) EQUIVALENCE (OP7,OPDAT(1,62)) EQUIVALENCE (OP8,OPDAT(1,72)) EQUIVALENCE (OP9,OPDAT(1,82)) EQUIVALENCE (OP10,OPDAT(1,92)) EQUIVALENCE (OP11,OPDAT(1,102)) EQUIVALENCE (OP12,OPDAT(1,112)) EQUIVALENCE (OP13,OPDAT(1,122)) EQUIVALENCE (OP14,OPDAT(1,132)) EQUIVALENCE (OP15,OPDAT(1,142)) EQUIVALENCE (OP16,OPDAT(1,152)) EQUIVALENCE (OP17,OPDAT(1,162)) EQUIVALENCE (OP18,OPDAT(1,172)) EQUIVALENCE (OP19,OPDAT(1,182)) EQUIVALENCE (OP20,OPDAT(1,192)) DATA NUMOP / 192/ DATA OPLEN/5/ DATA OP1/ +1H*, 1H , 1H , 1H , 1H , 0, -1, +1H., 1H., 1H , 1H , 1H , 0, -23, +1H., 1HD, 1HA, 1H , 1H , 0, -11, +1H., 1HD, 1HB, 1H , 1H , 0, -9, +1H., 1HD, 1HW, 1H , 1H , 0, -10, +1H., 1HE, 1HN, 1HD, 1H , 0, -5, +1H=, 1H , 1H , 1H , 1H , 0, -4, +1HA, 1HD, 1HC, 1H , 1H , 109, 3, +1HA, 1HD, 1HC, 1H#, 1H , 105, 2, +1HA, 1HD, 1HC, 1H), 1HY, 113, 2/ DATA OP2/ +1HA, 1HD, 1HC, 1HX, 1H , 125, 3, +1HA, 1HD, 1HC, 1HX, 1H), 97, 2, +1HA, 1HD, 1HC, 1HX, 1HZ, 117, 2, +1HA, 1HD, 1HC, 1HY, 1H , 121, 3, +1HA, 1HD, 1HC, 1HZ, 1H , 101, 2, +1HA, 1HD, 1HC, 1HZ, 1HX, 117, 2, +1HA, 1HD, 1HD, 1HR, 1H , 0, -11, +1HA, 1HN, 1HD, 1H , 1H , 45, 3, +1HA, 1HN, 1HD, 1H#, 1H , 41, 2, +1HA, 1HN, 1HD, 1H), 1HY, 49, 2/ DATA OP3/ +1HA, 1HN, 1HD, 1HX, 1H , 61, 3, +1HA, 1HN, 1HD, 1HX, 1H), 33, 2, +1HA, 1HN, 1HD, 1HX, 1HZ, 53, 2, +1HA, 1HN, 1HD, 1HY, 1H , 57, 3, +1HA, 1HN, 1HD, 1HZ, 1H , 37, 2, +1HA, 1HN, 1HD, 1HZ, 1HX, 53, 2, +1HA, 1HS, 1HC, 1HI, 1HI, 0, -30, +1HA, 1HS, 1HL, 1H , 1H , 14, 3, +1HA, 1HS, 1HL, 1HA, 1H , 10, 1, +1HA, 1HS, 1HL, 1HX, 1H , 30, 3/ DATA OP4/ +1HA, 1HS, 1HL, 1HX, 1HZ, 22, 2, +1HA, 1HS, 1HL, 1HZ, 1H , 6, 2, +1HA, 1HS, 1HL, 1HZ, 1HX, 22, 2, +1HB, 1HC, 1HC, 1H , 1H , 144, 00, +1HB, 1HC, 1HS, 1H , 1H , 176, 00, +1HB, 1HE, 1HQ, 1H , 1H , 240, 00, +1HB, 1HI, 1HT, 1H , 1H , 44, 3, +1HB, 1HI, 1HT, 1HZ, 1H , 36, 2, +1HB, 1HM, 1HI, 1H , 1H , 48, 00, +1HB, 1HN, 1HE, 1H , 1H , 208, 0/ DATA OP5/ +1HB, 1HP, 1HL, 1H , 1H , 16, 00, +1HB, 1HR, 1HK, 1H , 1H , 0, 1, +1HB, 1HS, 1HS, 1H , 1H , 0, -3, +1HB, 1HV, 1HC, 1H , 1H , 80, 00, +1HB, 1HV, 1HS, 1H , 1H , 112, 00, +1HB, 1HY, 1HT, 1HE, 1H , 0, -9, +1HC, 1HK, 1HS, 1HU, 1HM, 0, -12, +1HC, 1HL, 1HC, 1H , 1H , 24, 1, +1HC, 1HL, 1HD, 1H , 1H , 216, 1, +1HC, 1HL, 1HI, 1H , 1H , 88, 1, +1HC, 1HL, 1HV, 1H , 1H , 184, 1/ DATA OP6/ +1HC, 1 HM, 1HP, 1H , 1H , 205, 3, +1HC, 1HM, 1HP, 1H#, 1H , 201, 2, +1HC, 1HM, 1HP, 1H), 1HY, 209, 2, +1HC, 1HM, 1HP, 1HX, 1H , 221, 3, +1HC, 1HM, 1HP, 1HX, 1H), 193, 2, +1HC, 1HM, 1HP, 1HX, 1HZ, 213, 2, +1HC, 1HM, 1HP, 1HY, 1H , 217, 3, +1HC, 1HM, 1HP, 1HZ, 1H , 197, 2, +1HC, 1HM, 1HP, 1HZ, 1HX, 213, 2, +1HC, 1HP, 1HX, 1H , 1H , 236, 3/ DATA OP7/ +1HC, 1HP, 1HX, 1H#, 1H , 224, 2, +1HC, 1HP, 1HX, 1HZ, 1H , 228, 2, +1HC, 1HP, 1HY, 1H , 1H , 204, 3, +1HC, 1HP, 1HY, 1H#, 1H , 192, 2, +1HC, 1HP, 1HY, 1HZ, 1H , 196, 2, +1HD, 1HE, 1HC, 1H , 1H , 206, 3, +1HD, 1HE, 1HC, 1HX, 1H , 222, 3, +1HD, 1HE, 1HC, 1HX, 1HZ, 214, 2, +1HD, 1HE, 1HC, 1HZ, 1H , 198, 2, +1HD, 1HE, 1HC, 1HZ, 1HX, 214, 2/ DATA OP8/ +1HD, 1HE, 1HX, 1H , 1H , 202, 1, +1HD, 1HE, 1HY, 1H , 1H , 136, 1, +1HE, 1HJ, 1HE, 1HC, 1HT, 0, -8, +1HE, 1HN, 1HD, 1H , 1H , 0, -5, +1HE, 1HN, 1HD, 1H , 1H , 0, -5, +1HE, 1HO, 1HR, 1H , 1H , 77, 3, +1HE, 1HO, 1HR, 1H#, 1H , 73, 2, +1HE, 1HO, 1HR, 1H), 1HY, 81, 2, +1HE, 1HO, 1HR, 1HX, 1H , 93, 3, +1HE, 1HO, 1HR, 1HX, 1H), 65, 2/ DATA OP9/ +1HE, 1HO, 1HR, 1HX, 1HZ, 85, 2, +1HE, 1HO, 1HR, 1HY, 1H , 89, 3, +1HE, 1HO, 1HR, 1HZ, 1H , 69, 2, +1HE, 1HO, 1HR, 1HZ, 1HX, 85, 2, +1HE, 1HQ, 1HU, 1H , 1H , 0, -4, +1HH, 1HE, 1HD, 1H , 1H , 0, -7, +1HI, 1HN, 1HC, 1H , 1H , 238, 3, +1HI, 1HN, 1HC, 1HX, 1H , 254, 3, +1HI, 1HN, 1HC, 1HX, 1HZ, 246, 2, +1HI, 1HN, 1HC, 1HZ, 1H , 230, 2/ DATA OP10/ +1HI, 1HN, 1HC, 1HZ, 1HX, 246, 2, +1HI, 1HN, 1HX, 1H , 1H , 232, 1, +1HI, 1HN, 1HY, 1H , 1H , 200, 1, +1HJ, 1HM, 1HP, 1H , 1H , 76, 3, +1HJ, 1HM, 1HP, 1H), 1H , 108, 3, +1HJ, 1HS, 1HR, 1H , 1H , 32, 3, +1HL, 1HD, 1HA, 1H , 1H , 173, 3, +1HL, 1HD, 1HA, 1H#, 1H , 169, 2, +1HL, 1HD, 1HA, 1H), 1HY, 177, 2, +1HL, 1HD, 1HA, 1HX, 1H , 189, 3/ DATA OP11/ +1HL, 1HD, 1HA, 1HX, 1H), 161, 2, +1HL, 1HD, 1HA, 1HX, 1HZ, 181, 2, +1HL, 1HD, 1HA, 1HY, 1H , 185, 3, +1HL, 1HD, 1HA, 1HZ, 1H , 165, 2, +1HL, 1HD, 1HA, 1HZ, 1HX, 181, 2, +1HL, 1HD, 1HX, 1H , 1H , 174, 3, +1HL, 1HD, 1HX, 1H#, 1H , 162, 2, +1HL, 1HD, 1HX, 1HY, 1H , 190, 3, +1HL, 1HD, 1HX, 1HY, 1HZ, 182, 2, +1HL, 1HD, 1HX, 1HZ, 1H , 166, 2/ DATA OP12/ +1HL, 1HD, 1HX, 1HZ, 1HY, 182, 2, +1HL, 1HD, 1HY, 1H , 1H , 172, 3, +1HL, 1HD, 1HY, 1H#, 1H , 160, 2, +1HL, 1HD, 1HY, 1HX, 1H , 188, 3, +1HL, 1HD, 1HY, 1HX, 1HZ, 180, 2, +1HL, 1HD, 1HY, 1HZ, 1H , 164, 2, +1HL, 1HD, 1HY, 1HZ, 1HX, 180, 2, +1HL, 1HS, 1HR, 1H , 1H , 78, 3, +1HL, 1HS, 1HR, 1HA, 1H , 74, 1, +1HL, 1HS, 1HR, 1HX, 1H , 94, 3/ DATA OP13/ +1HL, 1HS, 1HR, 1HX, 1HZ, 86, 2, +1HL, 1HS, 1HR, 1HZ, 1H , 70, 2, +1HL, 1HS, 1HR, 1HZ, 1HX, 86, 2, +1HN, 1HO, 1HP, 1H , 1H , 234, 1, +1HO, 1HP, 1HT, 1H , 1H , 0, -6, +1HO, 1HR, 1HA, 1H , 1H , 13, 3, +1HO, 1HR, 1HA, 1H#, 1H , 9, 2, +1HO, 1HR, 1HA, 1H), 1HY, 17, 2, +1HO, 1HR, 1HA, 1HX,  1H , 29, 3, +1HO, 1HR, 1HA, 1HX, 1H), 1, 2/ DATA OP14/ +1HO, 1HR, 1HA, 1HX, 1HZ, 21, 2, +1HO, 1HR, 1HA, 1HY, 1H , 25, 3, +1HO, 1HR, 1HA, 1HZ, 1H , 5, 2, +1HO, 1HR, 1HA, 1HZ, 1HX, 21, 2, +1HO, 1HR, 1HG, 1H , 1H , 0, -2, +1HP, 1HA, 1HG, 1HE, 1H , 0, -19, +1HP, 1HH, 1HA, 1H , 1H , 72, 1, +1HP, 1HH, 1HP, 1H , 1H , 8, 1, +1HP, 1HL, 1HA, 1H , 1H , 104, 1, +1HP, 1HL, 1HP, 1H , 1H , 40, 1/ DATA OP15/ +1HR, 1HO, 1HL, 1H , 1H , 46, 3, +1HR, 1HO, 1HL, 1HA, 1H , 42, 1, +1HR, 1HO, 1HL, 1HX, 1H , 62, 3, +1HR, 1HO, 1HL, 1HX, 1HZ, 54, 2, +1HR, 1HO, 1HL, 1HZ, 1H , 38, 2, +1HR, 1HO, 1HL, 1HZ, 1HX, 54, 2, +1HR, 1HO, 1HR, 1H , 1H , 110, 3, +1HR, 1HO, 1HR, 1HA, 1H , 106, 1, +1HR, 1HO, 1HR, 1HX, 1H , 126, 3, +1HR, 1HO, 1HR, 1HX, 1HZ, 118, 2/ DATA OP16/ +1HR, 1HO, 1HR, 1HZ, 1H , 102, 2, +1HR, 1HO, 1HR, 1HZ, 1HX, 118, 2, +1HR, 1HT, 1HI, 1H , 1H , 64, 1, +1HR, 1HT, 1HS, 1H , 1H , 96, 1, +1HS, 1HB, 1HC, 1H , 1H , 237, 3, +1HS, 1HB, 1HC, 1H#, 1H , 233, 2, +1HS, 1HB, 1HC, 1H), 1HY, 241, 2, +1HS, 1HB, 1HC, 1HX, 1H , 253, 3, +1HS, 1HB, 1HC, 1HX, 1H), 225, 2, +1HS, 1HB, 1HC, 1HX, 1HZ, 245, 2/ DATA OP17/ +1HS, 1HB, 1HC, 1HY, 1H , 249, 3, +1HS, 1HB, 1HC, 1HZ, 1H , 229, 2, +1HS, 1HB, 1HC, 1HZ, 1HX, 245, 2, +1HS, 1HE, 1HC, 1H , 1H , 56, 1, +1HS, 1HE, 1HD, 1H , 1H , 248, 1, +1HS, 1HE, 1HI, 1H , 1H , 120, 1, +1HS, 1HP, 1HA, 1HC, 1HE, 0, -29, +1HS, 1HT, 1HA, 1H , 1H , 141, 3, +1HS, 1HT, 1HA, 1H), 1HY, 145, 2, +1HS, 1HT, 1HA, 1HX, 1H , 157, 3/ DATA OP18/ +1HS, 1HT, 1HA, 1HX, 1H), 129, 2, +1HS, 1HT, 1HA, 1HX, 1HZ, 149, 2, +1HS, 1HT, 1HA, 1HY, 1H , 153, 3, +1HS, 1HT, 1HA, 1HZ, 1H , 133, 2, +1HS, 1HT, 1HA, 1HZ, 1HX, 149, 2, +1HS, 1HT, 1HX, 1H , 1H , 142, 3, +1HS, 1HT, 1HX, 1HY, 1HZ, 150, 2, +1HS, 1HT, 1HX, 1HZ, 1H , 134, 2, +1HS, 1HT, 1HX, 1HZ, 1HY, 150, 2, +1HS, 1HT, 1HY, 1H , 1H , 140, 3/ DATA OP19/ +1HS, 1HT, 1HY, 1HX, 1HZ, 148, 2, +1HS, 1HT, 1HY, 1HZ, 1H , 132, 2, +1HS, 1HT, 1HY, 1HZ, 1HX, 148, 2, +1HT, 1HA, 1HX, 1H , 1H , 170, 1, +1HT, 1HA, 1HY, 1H , 1H , 168, 1, +1HT, 1HI, 1HT, 1HL, 1HE, 0, -7, +1HT, 1HS, 1HX, 1H , 1H , 186, 1, +1HT, 1HX, 1HA, 1H , 1H , 138, 1, +1HT, 1HX, 1HS, 1H , 1H , 154, 1, +1HT, 1HY, 1HA, 1H , 1H , 152, 1/ DATA OP20/ +1HW, 1HO, 1HR, 1HD, 1H , 0, -10/ C C C--- SEARCH THE TABLE FOR THE NAME (BLANK FILLED) C C DO 10 I=1,OPLEN FOP(I)=1H J=START+I-1 IF(J.GT.FINISH) GO TO 10 FOP(I)=NAME(J) 10 CONTINUE C OPLOOK=(-1) L=1 U=NUMOP LASTI=0 C C--- DO A BINARY SEARCH C 100 CONTINUE I=(L+U)/2 IF(I.EQ.LASTI) RETURN LASTI=I IF(U.LT.I) RETURN C DO 120 J=1,OPLEN  IF(FOP(J)-OPDAT(J,I)) 130,120,140 120 CONTINUE C C--- OPCODE FOUND C OPLOOK=I OPVALU=OPDAT(OPLEN+1,I) TYPE2=OPDAT(OPLEN+2,I) RETURN C C--- NAME < TABLE C 130 CONTINUE U=I-1 GO TO 100 C C--- NAME > TABLE C 14 0 CONTINUE L=I+1 GO TO 100 END OPLOOK=(-1) L=1 U=NUMOP LASTI=0 C C--- DO A BINARY SEARCH C 100 CONTINUE I=(L+U)/2 IF(I.EQ.LASTI) RETURN LASTI=I IF(U.LT.I) RETURN C DO 120 J=1,OPLEN  IF(FOP(J)-OPDAT(J,I)) 130,120,140 120 CONTINUE C C--- OPCODE FOUND C OPLOOK=I OPVALU=OPDAT(OPLEN+1,I) TYPE2=OPDAT(OPLEN+2,I) RETURN C C--- NAME < TABLE C 130 CONTINUE U=I-1 GO TO 100 C C--- NAME > TABLE C 14OVicEdDanoT)Q" 7GRGH2HKHGGG9~GGGG99999999999999GP  M C S - 6 5 0 X M A C R O A S S E M B L E R  9  GGG9~)  GdGGG;99999999999GQ)" HI 7IpIwI~GRIJOwOOOO99I9IIG9~9999999GGGGGG9999HLQ*)HI 7IpIwI~GRIJOOOP;OH2PP999II99I9999G99999GGGGGGOxQIpIwI~7RPZI9IIGGG99999OQ HOR999999IQ: IpIwI~GI PRJ9IIIPPPPPPP999GGGG999999QQIpIwI~QRH29999999III999H3Q  GR9GGG9999999GPQQ ROQ OOORP;Q,Q?Q{O ) ( + - * / ' < = > OQ|Q RQ,P;QQ  QRQ999999Q@QQ#QE7IpIwI~GRPZP;QPP99999999GGGIII9999GGGG99QQQRQ0 1 2 3 4 5 6 7 8 9 A B C D E F P<Q" " I RQ999~9999Q-QE " R99~99999OQg,IpIwI~G7I PRPZQH2QOI9999999999IIGGGG99GGG99PPPPPPPQQPIpIwI~PI RPPPPPPPIIIHQ7GHRH2Q,P;9GGGG9999999GGGOQRP[Q " 7P`PRP;GGG999~9999JQ J OpJ)JoJJKAKKLL`LLM2MxMNNJNNOObJ)RJ*J+J1F* . . . D A . D B . D W . E N D = A D C mA D C # iA D C ) Y qJwFA D C X }A D C X ) aA D C X Z uA D C Y yA D C Z eA D C Z X uA D D R A N D -A N D # )A N D ) Y 1JFA N D X =A N D X ) !A N D X Z 5A N D Y 9A N D Z %A N D Z X 5A S C I I A S L A S L A A S L X KFA S L X Z A S L Z A S L Z X B C C B C S B E Q B I T ,B I T Z $B M I 0B N E  KIMB P L B R K B S S B V C PB V S pB Y T E C K S U M C L C C L D C L I XC L V KFC M P C M P # C M P ) Y C M P X C M P X ) C M P X Z C M P Y C M P Z C M P Z X C P X KFC P X # C P X Z C P Y C P Y # C P Y Z D E C D E C X D E C X Z D E C Z D E C Z X L"FD E X D E Y E J E C T E N D  E N D E O R ME O R # IE O R ) Y QE O R X ]E O R X ) ALhFE O R X Z UE O R Y YE O R Z EE O R Z X UE Q U H E D I N C I N C X I N C X Z I N C Z LFI N C Z X I N X I N Y J M P LJ M P ) lJ S R L D A L D A # L D A ) Y L D A X LFL D A X ) L D A X Z L D A Y L D A Z L D A Z X L D X L D X # L D X Y L D X Y Z L D X Z M:FL D X Z Y L D Y L D Y # L D Y X L D Y X Z L D Y Z L D Y Z X L S R  NL S R A JL S R X ^MFL S R X Z VL S R Z FL S R Z X VN O P O P T O R A O R A # O R A ) Y O R A X O R A X ) MFO R A X Z O R A Y O R A Z O R A Z X O R G P A G E P H A HP H P P L A hP L P (N FR O L .R O L A *R O L X >R O L X Z 6R O L Z &R O L Z X 6R O R nR O R A jR O R X ~R O R X Z vNRFR O R Z fR O R Z X vR T I @R T S `S B C S B C # S B C ) Y S B C X S B C X ) S B C X Z NFS B C Y  S B C Z S B C Z X S E C 8S E D S E I xS P A C E S T A S T A ) Y S T A X NFS T A X ) S T A X Z S T A Y S T A Z S T A Z X S T X S T X Y Z S T X Z S T X Z Y S T Y O$FS T Y X Z S T Y Z S T Y Z X T A X T A Y T I T L E T S X T X A  T X S T Y A OjW O R D QRQQRRRR=IRRSRQRQTF:MAIN +)e eǠe+ R R bWXY T]K[L;FB ]MNLLX[(I6,' ERROR MESSAGES WERE PRINTED.')] WXY[ gjl'mjn'o),/2^adp8q=KQr Es7Ht&Wu [v\w^ikxu@yyAzzN{{O||T}}U~~PASS1 ! W pXP)t }Q΀=23q tRHrp rRrt tt tZZD Yuvu)t }Qʀ=523vr  Xw X)t }wAS=vXxwXx T69:y t8&p#&& & &&&&&&&&&&&&&&&&!&"&#&$&%&&R=,, W)t }+3456Z 78 92:S|=ZR! WiJJR W)t }Sa=ZZ WRaa\ \ˎcgh W)t }SH={R; }|~W37R@# RZ$ R)t }U=xZZ  R)t }U=xZZ W)t }S=] ;] W@# R))v+ [f. w[ |)v*Πv+ | Ri[ } =ZZ3X  V   M= ?Z  s!!""##$$%%&& ''(())*PASS2 7'X Y ZO)t EP΀E12pq\q ]1 ]RVYD^ s\q )t EQEsaPdMrpqq pR345q t ]1 ]DFTsuZ7xY:zAAI S2316  R345t [wJw)t EP]ʀE79:xy yqzr p-sZ {R;84x ]1 ]FDk | S}24q|# T=)t E$%Z #&Q8ExZS5088)t EQ!ExS0ZxZQQQQ ^w ~|  ~WZ)t EUE)x7Pk@lm&gnjo,)t Ex+)tF+)tGQEFG@R@ABA ~ ]1 ]IG | SB6BOG@AC| S"C6 | S"@6 _ x ^ `^)'C+ QK`n x+ w^ ]1 ]S )x+ \ \ t)x*͠x+ t     S )t EU8Et,)x+)+)Ǟ24 Dx+Rǁ̎ D<@ x+)ǁ̎D^EI x+)ǁ̎DaNR x+)ǁ̎D`W[ x+)ǁ̎Db`3dx++gh@ijifk tS+qww_ _ʎy~~)t EQExS"86Tc.Z. (1X,'C',Z4,' 00')  SZBm;- }kDL MO VG _X V3)t EQEx 8xFVF S@#  @#  ]1 ]S\^w\ t)x|.   ^ )t EWEFS pF _t x ^ )'D+ `^QK)x+ tw^11)t E7=08@9:6; Q<EdDF ;dEHo!I CJJtJJJJGKL MMMoNNOOPPQQ+RR3SS5TT6UUBVVIWWKXXLYYdZZ[[\\]]^^__``aabbccddeeff(ggrhhsiiujjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~@ADDLAB N@#  N )Ȏ@# GZ [)t]M΀\ @# BO1 O@# . SETPTR G KT UVHW XXXIXˎT TTXˎVXˎV VVXˎUUWU+)ʀX +)ʠWˎU+) WˎU+R   XWXI86M1 M UYUUX +)+)ʠX+ U S@# 12' 3( 4) 56, 7(8 99):PARSE Aghijk Ol PQRmSTUVWXYZ [$>)t >(80A1)[Lh[$>)t gs n\)ˎ)ˎ)ˎ SnnnˎnTnˎQiiQnˡQǞaaUOnnnˎ6nU nnnz{~xACK]idpPeqsfr^|nˎnˎnVPihhPnˡPȞWUnn]nˎ6 nW nP )try; }*  j: N΀201op  -l   p  WXnnn"nˎj j#jm nˎInˎCnXlnˎnˎn=>$?&@*VA.SB2CD6NE:KF<GˎnˎnnSUhRTWhYnXEIQ[P^_h]ahc PnˡPȎljm(Fnkk#@CMosnˎxyzX{|}' b~5i# vwmnˎm mmO1 OD?RnˡRɞAnnnˎ6zDlBnY=>|PlB R RɎP9u( H) L, QPU_kpxhhPPP)P PhO1 ODiO1 ODmO1 OD@# _)˂)))) P Q@# k)Ȃ)Ȃ)Ȃ) P QR@#     A   * . E N D ERROR  M@#   )Z+ LLM@#   NMOG@k1M[ A [kM A ML[    )  O)۞E (' *** ERROR. REQUIRED FIELD IS MISSING. CARD IS IGN','ORED.')   )  O8)۞98&(' *** ERROR. OPERAND IS OUT OF RANGE. ONLY LOW ORDER',' BITS ARE USED.')    ) O^)۞-^(' *** ERROR. REQUIRED FIELD IS MISSING.')    ) Ot)۞!t"(' *** ERROR. INVALID OPCODE AND/OR ADDRESSING MODE CO','NFLICT.')    )                    O)۞ "(' *** ERROR. TOO MANY FIELDS IN OPERAND. EXCESS ARE ','IGNORED.')  $ $) 'O)۞%(' *** ERROR. DUPLICATE SYMBOL DEFINITION. FIRST DEFI','NITION HOLDS.')   0 0) 3O)۞$(' *** ERROR. OPCODE TRANSLATION WAS TOO LONG. EXCESS',' TRUNCATED.')   < <) ?O )۞ (' *** ERROR. LABEL WAS TOO LONG. EXCESS IS TRUNCATED.')  H H)  KO ) ۞ (' *** ERROR. UNBALANCED PARENTHESIS.')  T T)  WO 2) ۞ 2#(' *** ERROR.  SYMBOL HAS NOT YET BEEN DEFINED IN THIS ','ASSEMBLY.')   ` `      ( 4  @ L X a  & b      + 7 C O [ c^      , 8 D P \ d 2 e > f J g V h ` i)  lOs Urr) ۞ U(' *** ERROR. INVALID DIGIT IN NUMERIC CONSTANT')  u uOj ni n)(' *** ERROR. SYMBOL TABLE FULL. ALL FOLLOWING ','SYMBOL DEFINITIONS IGNORED.')  z G { k | ; G S _ t z }  b ~  e   f   g   h   |                     HEADIN   K H@#    GGL  GLLM  @#    N LO N)t   ('1PAGE ',I5,16X,80A1,//)  @#   G A WLLM L  d )XO  (' ')  X+ W@#   ' ž P          s   ^ ASCII   GOG@I@#    G    EVAL  G J IS TUVH WXHY XWXWS   V)ZWʠZZ[  $Z+ f # * [  . 7 7 N  WYO 4 A 5 A 6 A AWS C3 D WZWʎZʎ [ J N QWʎ  V  W  X T Y U ZZʎ [ Y ] ` WʎZʎ [ c g j WʎZʎ [ m q t WʎZʎ [ w { ~ WʎZʎ [   [  ZX   /  0  1  2  WS   +  8 & I S p  <  M b l z =  F    WZWʎZʎ [    WʎZʎ [    WʎZʎ [    WʎZʎ [   [  ZX     [\[  V  \ f v  >     D   [ [   C  [ WHN1   WHW*ʎN#  K   WHWHW*ʎ E  b W Y  O]N ^]]^ C    +    *    -  d    /  ^     !W {P;_N    2 O] ^]]^ ;C ?^\ B CQh A JN XYN 3 Z  Z ZVWY [ ^WʎV V a eV g   h(   3 iI % jU f k  - K T l& g mP{_Nu WY -   _W Y  W {P_;_NY   WYOM]  QU   SʎSʎP6_ D    Y ~   `  '  ]  \  k   S  P   N'    O]  Qfo    O R@#   )   ;            GENOP  $JLJM NG       K K @#    LMN  ! !MLN  % %MOG @N  , ,LMOG @N -F 4  5 5ML 7 :N 8 9 <  = =MLN ? B  C CML F HN E G J  K KML M ON N Q  R RML U VN T X  Y YMLN [B ^  _ _MLN  c cMLN  g g  h   iI  j   k&  $ + 4 < B J Q X ^ b f l g m L NKy u  w wMLNq l { {Kn@#  NUMVAL  G J S THUIVUʎ T  Uʎ T  T I*ʎIʎ T   IʎHʎ T  B Iʎ T  Iʎ T  Iʎ T  Iʎ T   T IʎHʎ  Hʎ   x       $     :    T     I V  U   UV  S@#    T Uʺ  Ut XLW    Ut XLW WTWTOG@ "R  #S  $B    %0  &Q  'O  (Z  )H  *D + ,!-WS>+0M1 M S@# ,88 It XLTDClETGHgII V# MF BNFO=P QTERM UG J n oHp Iqpʎpʎpʞnpʺsou pʎHIHʎ{!q rQ0245stnU V R5q rfzjwxjdRUe$ i:  Q0245sX1 X nrt q xS08n HvI x vy89wvqnOG@z  t {k0 q9 w' ~. & T;znq+ wYnnm@# G"   HEXVAL    )KK JGJ@#  K+ J@#  !"PUSH &MT N*-TL.2TɅMGɁHɀTH@# 3@7A0:B&C0D EPOP I GR QGQ@# PTRȅGȄQJȀRJQ@# UcXd0\eIfgOUTPUT  wIx xX)t DS΀D:;yz|YI yw G D[TZ UIA  }#**V[k\ 7bYG)tk(1X,I5,'.',1X,A1,1X,Z4,2X,Z2,9X,110A1)@)AA xW>?V[~{RST UVWP QX\ 7bY >b ?b)t~(1X,I5,'. ',A1,1X,Z4,5X,Z2,1X,Z2,3X,110A1)k$llV[\ 7bYGH)t(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,6X,110A1)%W@A  !+KmT.Np 2579Y\^adtwy{}=hª‘n>is?j^@kDVv[t\q 7bnYlGj Abg @bd)taaa(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,1X,Z2,3X,110A1)a'[Z \W 7bT)tQQ (1X,I5,'. ',A1,18X,80A1)&(VI[G\DR 7b?H=)t:::(1X,I5,'. ',A1,10X,'(',Z4,')',2X,110A1) (x] W4@A YB YCI YB CA|@A|@xIA   ^YGO (' T',Z4,1X,Z2) x {yPDx ^ Bb Ab,^ Bb Ab^ Cb @b+BCxYY@#  H&)25=@I!-8J *6AK^LLMMNNOOPREFORM T")W+  X Y ZMNXMWWZ [ˠ[ʠW+ XevO X[ZPXOWWOZ[ˠ[ʠW+ XwQ X[ZRXQWWZQ[ˠ[ʀ[ YW+ XS ! ZSWWSZ[ˠ[ʠW+ @# X T{= SYMOUT &N @# *-O@# .1K)])('  SYMBOL TABLE AND CROSS REFERENCE MAP',//' SYMBOL ADDR REFERENCES',/)9P]'DŽ^DŽ_ `LaM! _RSL b` c)dL ebgh M% bebfsedc`b b{M; byd+ |PR QZy&2 ;'Z=@FT`ILi&KzQ SQ  Q KgS)f]'tf+ P b)d4&d+ c(2X,7A1,2X,Z4,2X,17(1X,I5)) ` c)dL> eb M6% bebq{Z ^edc`br b{M; gbd+ P R QKQ SSQ Q  Q"% KSC  )d4&d+ c7 (17X,17(1X,I5)) :3;<:=`?@@R QCFKDELQ SNTQ  QVY K bbS )f]',tMf+ P bE "bB(2X,7A1,2X,Z4,3X,I5,6X,'?e820806094101820806094101820806094101e@820806094101820806094101820806122918" e820806094101820806094101820806094101e820806094101820806094101820806094101820806094101820806094101820806094101e38208061013065082080610132725820806113637en8208061018370082080611054825820806113736eW8208061124235082080611285925820806113821 e# i8208061050457582080610504700820806113842$ % & ' ( ) * + . ASM6502 FTNASM6502 OBJASM6502 BIN ASM6502 JCL, JF:MAIN O0SEGMENTOFORTRAN OF:FORT::OLNKLST OOPTION OSTATUS OFILES OSYMBLK OHEAD OPASS1:::OHEADIN::OPASS2:::OSYMOUT::ooo&ooooooTooooKF:XRDA KF:XFDA KF:RREW KPASS1 KHEADIN KPASS2 KSYMOUT KF:RWEF KF:RIOL KF:RETF KF:RSTO KF:RFZ KF:RSTU itdd/dodtd d d d dddddPdQdRdSddddddddddddddiF:MAIN gKF:RSTU i                          M C S - 6 5 0 X  M A C R O  A S S E M B L E R                              ii- . / 0 1 iiiiiiiiii2 3 4 5 6 7 iiPdiiQiiRiiS;iiiiiiiiiiiiiiiiiiiiiii)e  ee+ R R bWXY T]K[L;FB ]MNLLX[(I6,' ERROR MESSAGES WERE PRINTED.')]WXY[ gjll'mjn'ot ,p/p8 2p^papdpt8qt=rKrQrtEstHttWut[vt\wt ixkxt @yyAzzN{{O||T}}U~~JPASS1 O0SEGMENTOFORTRAN OPASS1:::OLNKLST OFILES OPTRS OSTATUS OBUFFER OSYMBLK OFIELDS OHEAD OOPTION OPARSE:::OOPLOOK::OADDLAB::OEVAL::::OBYTES:::OSETPTR::OOUTPUT::ooo>oooRooPooaoTooooooooKF:XRDA KF:XFDA KPARSE KOPLOOK KADDLAB KEVAL KBYTES KF:RCGO KSETPTR KMAX0 KOUTPUT itdd/dddod d d d td d dddddddd ^dd `d _d Sdddddddddddd Pd Qd Rd d d d iPASS1 gKF:RGMY  W pXP)t }Q΀=23q tRH%rp rRrt t36t tZZ$=8D= YuAC9Bv9Cu)t }Qʀ=523v9T9Ur 9W9XXw X)t })wa+bct  dteKet f-ft`gS=vXxwXx9t9uT69:y9~ t8bp#R= W)t }<}@CZ ahtvtS|=ZR! WiR W)t }Sa=ZZ WR\ \ W)t }SH={R; tW3R@# RZ$R)t }U=xZZ$$$$R)t }U=xZZ99 W)t }S=]9 HJ ;]IL WOO@# R))v+  [c. dd dd%dRdtXef.ftbgik[ |)v*v+ |yyRi[ } =ZZ8NxehjXVG[ g@tMt t Ol2DJPASS2 O0SEGMENTOFORTRAN OPASS2:::OFILES OOPTION OPTRS OSTATUS OBUFFER OSYMBLK OFIELDS OHEAD OPARSE:::OOPLOOK::OEVAL::::OBYTES:::OOUTPUT::OPUSH::::OSETPTR::OHEADIN::OASCII:::ooWoHoooRooPooaoToooooooooKF:XRDA KF:XFDA KF:RREW KPARSE KOPLOOK KEVAL KBYTES KOUTPUT KF:RCGO KPUSH KSETPTR KF:RWEF KF:RIOL KF:RETF KHEADIN KMAX0 KASCII KF:RFZ itddddod d d d td d d dddddddddd ^d `ddd _ddddd Sddddddddd Pd Qd RiPASS2  gKF:RGMY X Y ZO)t EP΀E12pq\q ]1 ](4,4/D4 s\q )t EQEs7PH:MHpqq pR345q t ]1 ]^DcZc\Fc*dIeKZf gtNYhitPjktltcmS2316 evhvR345tO~O [wOJOw)t EP]ʀE79:xOy Oyqzr p-fsZ {R;84x ]1 ]FDAtRwtdjntS}24q|#: T=)t EZ Q8ExZS50)t EQ!ExS0ZxZ''''''^w ~|  ~-0)t EUE)xA A&ABtCt =D@E)t Ex+)tF+)tGQEFG@R@ABA ~ ]1 ]lqgIqiGq| SB6s|BOG@AC| S"C6| S"@6 _ x ^ `^)'C+  QK6t DVt_tx+ w^]1 ]S)x+  \\ t)x*x+ tSut )t EU8Et)x+)+)  Dx+R Dx+)D^x+)Da$(x+)D`-1x+)Db6: :x+=>>>?@?<A tS+qMM_ _OTTTT)t EQExS"86TjjcZ(1X,'C',Z4,' 00') qSZB||C}~- SkL #O ,G 5X |V3)t EQEx 8xFVFS@# @# ]1 ]S; \^w\ t)xR. Ztkt ot pt rttt EWEFSpF _t x ^ )'D+  `^QKx+ tw^)t E t Q<Ed ;do      J      G!"t###E$$%%&&''(( )) ** ++,,--!.."//:00y11z2233445566778899::;;<<==H>>I??K@@^AAeBBgCCuDDvEEwFFxGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVJADDLAB O0SEGMENTOFORTRAN OADDLAB::OFIELDS OSYMBLK OSTATUS OMANGER::oo5ooaoooKF:XRDA KF:XFDA KMANGER itdddd dotdd_dd^d`ddddddddiADDLAB gKF:RGMY N@#  N )@#  GZ [)t]M΀\ @# 'B*O1 O@# 0. 1t2t 33$44JSETPTR O0SEGMENTOFORTRAN OSETPTR::OPTRS OSTATUS ooooRoKF:XRDA KF:XFDA KMIN0 itdddtddddddiSETPTR gKF:RGMY G KT UVHW XXXIXT TT !XV$'XV V*/,/V01X455UU9;WU+)X +)WU+)FKWU+R NT XWXIZ\Y8[6\:]M1 M\a UYUUX < +)+)X+  U S@#  {|' #}E}M}( )~) t3, 8(dth)JPARSE O0SEGMENTOFORTRAN OPARSE:::OFIELDS OHEAD OSTATUS OFILES OBUFFER OFMT OOPLOOK::ooo3oaoToooPouoKF:XRDA KF:XFDA KF:RREF KF:RIUS KF:RETF KOPLOOK itdddd dddtd dd^d_d`dndodpdqdrdsdtddddPdQdRdSddddddiPARSE gKF:RGMY ghijk Ol PQRmSTUVWXYZ [$)t (80A1).!L.[$)t -9 n\))) SnnOQnnTnQ^_i]aiKbKcQnQaHajTUjZOjnnnpnjs6jtnU nnn@{|Dx}~t _#/t*6NmP+7t,8t{|nnnVPihhxxPnPWUnn]n6nW nP )tr?; C* GSr jPY: \o|}N΀201op-lp  WXnnn"nj jjmnInCnXlnnnVS  N K  nnnhhnX !Q!P$%h#'h)PnPl03( 4kk#9 9959n>t?@ABC' (D= E/E# <F=GmFInm mLPmO1 OQDVVRnR]nnacn]f6]g@hh hhlgjjnYllllllllllllBllblPlmBpR RPy;y( zKz) {, |`|P}%}1}6}o~rvxxhhPP~P)P PhO1 ODiO1 ODmO1 OD@# %))))) P Q@# 1)))) P QR@# e huA * . E N \D JERROR O0SEGMENTOFORTRAN OERROR:::OSTATUS OFIELDS OFILES OHEADIN::oovo,ooaooKF:XRDA KF:XFDA KHEADIN KF:RCGO KF:RWEF KF:RETF itdddd dtddddddddd^d_d`dddiERROR gKF:RGMY M@# )Z+  LLM@# NMOG@k1M[A[kMAML[)O)E(' *** ERROR.  REQUIRED FIELD IS MISSING.  CARD IS IGN','ORED.'))O$)9$(' *** ERROR.  OPERAND IS OUT OF RANGE.  ONLY LOW ORDER',' BITS ARE USED.') )OJ)-J(' *** ERROR.  REQUIRED FIELD IS MISSING.') )O`)!`(' *** ERROR.  INVALID OPCODE AND/OR ADDRESSING MODE CO','NFLICT.') )tt> tO) (' *** ERROR.  TOO MANY FIELDS IN OPERAND. EXCESS ARE ','IGNORED.'))O)(' *** ERROR.  DUPLICATE SYMBOL DEFINITION.  FIRST DEFI','NITION HOLDS.') )O)(' *** ERROR.  OPCODE TRANSLATION WAS TOO LONG.  EXCESS',' TRUNCATED.') ((()+O)(' *** ERROR.  LABEL WAS TOO LONG. EXCESS IS TRUNCATED.')444) 7O )  (' *** ERROR.  UNBALANCED PARENTHESIS.')@@@) CO) (' *** ERROR.  SYMBOL HAS NOT YET BEEN DEFINED IN THIS ','ASSEMBLY.') LLLMMMMMM M,M8MDMtNOOOO OO#O/O;OGOtPPPP PP$P0P<PHPQ*R6SBTLU) XOsArr) A(' *** ERROR.  INVALID DIGIT IN NUMERIC CONSTANT')aaaOjZiZ(' *** ERROR.  SYMBOL TABLE FULL.  ALL FOLLOWING ','SYMBOL DEFINITIONS IGNORED.') fGgWh'i3i?iKi`ifiNjQkRlSmTnhoppqqrrssttuuJHEADIN O0SEGMENTOFORTRAN OHEADIN::OOPTION OFILES OHEAD oo^ooooTKF:XRDA KF:XFDA KF:RWEF  KF:RIOL KF:RIUS KF:RETF KF:RFZ itddtddPdSdQddddddddRiHEADIN gKF:RGMY K H@# GGL #GLLM'*@# (,),N LON)t ('1PAGE ',I5,16X,80A? 1,//) <@# >G?AAWLLM LHI,Gd,I)XO(' ') PX+ W@# !W'9žXPYt1ZLZt5[t:\t;]O]tJASCII O0SEGMENTOFORTRAN OASCII:::ooo KF:XRDA KF:XFDA itdtiASCII gKF:RGMY GOG@I@#  GtJEVAL O0SEGMENTOFORTRAN OEVAL::::OPUSH::::OPOP:::::OTERM::::OGENOP:::ooo<ooooKF:XRDA KF:XFDA KF:RCGO KPUSH KPOP KTERM KGENOP itdddd)tddddiEVAL gKF:RGMY G Ji ) ( + - * / ' < = > i i*i IS TUVH WXHY XWXWSV)ZWZZ[&*Z+  f)0[ 4==N  WYO:GG;GG<GGWS=I3=J WZWZ [PWTWW\]t^Z_[`Z [_fcfWZ [ipmpWZ [szwzWZ [}WZ [[ZX5678WS1t>tOYv< Shr= F WZWZ [WZ [WZ [WZ [[ZX[\[ \bl|>  D[ [ C[ WHN1 WHW*N# KWHWHW*EbW Y  O]N ^]]^C  @ + !!* ""- d#$$/ ^%&'W {P;_N#8%8 8O] ^]]^ACE^\HIQhGPN XYN9````VWYadWV VgkVmnn(  o9ot+ptlq3rQrZrtmsP{_Nu WY3 _W YW {P_;_NY WYOM] QUSSP6_Jt_f' ]\qSPN'O]QfoO R@# ) AJGENOP O0SEGMENTOFORTRAN OGENOP:::OPOP:::::OPUSH::::oooooKF:XRDA KF:XFDA KPOP KF:RCGO KPUSH itdtddiGENOP gKF:RGMY JLJM NG((((((K K @# 66LMN::MLN>>MOG @NEELMOG @NFFMNNMLPSNQURUVVMLNX[ \\ML_aN^c`c!ddMLfhNgj"kkMLnoNmq#rrMLNtBw$xxMLN%||MLN&t tt)/t9=DMU[cjqw{L NKy u'MLNqKn@# JNUMVAL O0SEGMENTOFORTRAN ONUMVAL::OSTATUS OHEXVAL::oooooKF:XRDA KF:XFDA KHEXVAL itdA dtdddddddiNUMVAL gKF:RGMY G J S THUIVU TU TT I*I T(+IH T.52B5I T8;I T>AI TDGI TJMT IHSXH\$x]^tO_`$ Wab: [c Tcf_gagI V\kUfmjmUVprS@# ouquT U{}Ut XLWw|Ut XLWWTWTOG@#R 'S -B 1VZ0 7Q =O CZ IH RD ]WS>M1 M S@# It XLTlTgI V#zF tJTERM O0SEGMENTOFORTRAN OTERM::::OOPTION OSYMBLK OFIELDS OFILES OHEAD OSTATUS OMANGER::OPUSH::::ONUMVAL::OASCII:::ooo<oooaooToooooKF:XRDA KF:XFDA KMANGER KPUSH KNUMVAL KMIN0 KASCII  itdddoddd dtd d d d dddddddddddd^d_d`dddddPdQdRdSddiTERM gKF:RGMY G J n oHp Iqppp"$$pHIH*/q rQ0245stnU V R5q rzPwQ'jR.dS=TBRUVtEWX$ Y: OZQ0245sTfX1 X nPmQm!m#mq xS08nRy HvI x vy89wvqnOG@zt {0  9 &' -B . 3[tGtSUWT;znq+ wYnelxnm@# G"qttt;cJHEXVAL  O0SEGMENTOFORTRAN OHEXVAL::oooKF:XRDA KF:XFDA itdd tiHEXVAL gKF:RGMY i 0 1 2 3 4 5 6 7 8 9 A B C D E F i)KK JGJ@#  K+  J@# tJPUSH O0SEGMENTOFORTRAN OPUSH::::OLNKLST OSTATUS OBUFFER OERROR:::oo#ooooPoKF:XRDA KF:XFDA KERROR itdd/dtddddddddiPUSH gKF:RGMY MT N TL TMGHTH@# 0 !t"tJPOP O0SEGMENTOFORTRAN OPOP:::::OLNKLST OSTATUS oo"oooKF:XRDA KF:XFDA itdd/tdddddddiPOP gKF:RGMY GR QGQ@#  RGQJRJQ@# 0 !tJOUTPUT O0SEGMENTOFORTRAN OOUTPUT::OSTATUS OFIELDS OHEAD OFILES OSYMBLK OBUFFER OOPTION OFMT OMANGER::OERROR:::OHEADIN::OREFORM::OBYTES:::oooEooaoToooPoouoooooKF:XRDA KF:XFDA KMANGER KERROR KHEADIN KF:RCGO KREFORM KF:RWEF KF:RIOL KF:RIUS KF:RETF KBYTES KF:RFZ itdddd ddodd td d d ddd_dd ddd dddddd^d`dPdQdRdSdddddd d d nd od pd qd rd sd tiOUTPUT gKF:RGMY wIx xX)t DS΀D:;yz|YI ywGD[TZ UIA}V[\ 7bYG)t(1X,I5,'.',1X,A1,1X,Z4,2X,Z2,9X,110A1) xW>?V[{t  tP \ 7bY >b ?b)C t(1X,I5,'. ',A1,1X,Z4,5X,Z2,1X,Z2,3X,110A1)V[,\ 7bYGH)t,(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,6X,110A1)W@A&t't(t)))t** *t+++++++++ +++++t,ª,‘,n---t ...t ///00t %1Vv[tA\q 7bnYlGj Abg @bd)taaaA(1X,I5,'. ',A1,1X,Z4,2X,Z2,1X,Z2,1X,Z2,3X,110A1)MaNN[ZY\W 7bT)tQQY(1X,I5,'. ',A1,18X,80A1)]^^^^VI[Ge\Dhgi 7b?H=)t:::e(1X,I5,'. ',A1,10X,'(',Z4,')',2X,110A1) t/uu]utuhuux] W4@A YB YCI YB CA|@A|@xIA^yYGOy(' T',Z4,1X,Z2) x v{yyZPDx ^y Bb Ab^y Bb Ab^y Cb @bxYY@# ttt JREFORM O0SEGMENTOFORTRAN OREFORM::OFIELDS OFMT OBUFFER ooooaouoPKF:XRDA KF:XFDA KMAX0 itdddd ddtdndodpdqdrdsdtd^d_d`iREFORM gKF:RGMY )W+   X Y ZMNXMWWZ [[W+ X&O X[ZPXOWWOZ[[W+ X'B3BQ X[ZRXQWWZQ[D [[ YW+ XCaOaS ZSWWSZ[[W+  bw@# y zt+{G{c{t/|| K}}f~~JSYMOUT O0SEGMENTOFORTRAN OSYMOUT::OFILES OOPTION OSYMBLK OHEAD OHEADIN::OPOP:::::OPUSH::::ooo<ooooToooKF:XRDA KF:XFDA KHEADIN KPOP KPUSH KF:RWEF KF:RETF KF:RIOL KF:RFZ itddodd&tddd ddddPdSdddddddddQdRiSYMOUT WgKF:RGMY N @# [^O@# _bK)]('   SYMBOL TABLE AND CROSS REFERENCE MAP',//' SYMBOL  ADDR   REFERENCES',/)jP]'^_ `LaM! _vvL b` c)dL ebM%  bebedc`b b{M; bd+  PR QyWt ctl'Znqwt}tKzQ SQ  QKgS-)f]'tf+ P b)d4&d+ c-(2X,7A1,2X,Z4,2X,17(1X,I5)) ` c)dL> ebM6%  bebZ !!t""t#edc`br b{M; gb)8d+  ,P=R Q@CKAIBIQ SSQKQQ  QSVKSC;)d4&d+ c7;(17X,17(1X,I5)) kllldltmkn`p qqR QtwKu}v}Q SQ  QK bbS C)f]',tE Mf+ P bE "bBC(2X,7A1,2X,Z4,3X,I5,6X,'NO REFERENCES') pmoWxt]+ O@# tifgGHZ[{|JBYTES O0SEGMENTOFORTRAN OBYTES:::ooo KF:XRDA KF:XFDA itdtiBYTES gKF:RGMY GIGOG@HGHHC@#   G tJMANGER O0SEGMENTOFORTRAN OMANGER::OLNKLST OSYMBLK OSTATUS OPUSH::::ooo1ooooKF:XRDA KF:XFDA KPUSH itdd/dodd%tdddddddddddiMANGER gKF:RGMY G O ])^^H _I_^^+ S `T aTb cabOG@^c^cb57)_^'m_m_+ SBI^ b`[ALN ^a`V"pS1aS6SL]@# TDYTU\]]@# [`TTUefV1 VdjTmo Sd`ee_)aT_emaOGt  @nmom nppoa+ d_+ Tln)_`'m_m_+ S`]S'J KnR Kn]@# HL]@# L S^'JK^]@# ^]S'JK]@# k:'~Gf'H'9'' ,GtJOPLOOK O0SEGMENTOFORTRAN OOPLOOK::ooiorKF:XRDA KF:XFDA itdddkd$djdddR O L X Z 6R O L Z  &R O L Z X 6R O R   nR O R A  jR O R X  ~R O R X Z vi iMR O R Z  fR O R Z X vR T I   @R T S   `S B C   S B C #  S B C ) Y S B C X  S B C X ) S B C X Z i iS B C Y  S B C Z  S B C Z X S E C   8S E D   S E I   xS P A C E S T A   S T A ) Y S T A X  i iS T A X ) S T A X Z S T A Y  S T A Z  S T A Z X S T X   S T X Y Z S T X Z  S T X Z Y S T Y   i iS T Y X Z S T Y Z  S T Y Z X T A X   T A Y   T I T L E T S X   T X A   T X S  H   T Y A   i ieW O R D  i )ggH hIhgg+ fd iej kijOG@gkd@# -1gkj57d@# 4:6:)hgh''qh'qh+ fgdgf'+K+Jd@# H]g jDGYa gi@ e (G<f>''gR'ght+ fd iej kijOG@gkd@# -1gkj57d@# 4:6:)hgh''qh'qh+ fgdNO REFERENCES') ?<zz>{&GZ| z}]+ O@# y^{856)*JK]^BYTES GIGOG@HGHHC@# G MANGER G O ])^^H _I_Ϡ^^+ S `T aTb cabOG@^c^cb)_^'m_m_+ S^ b`[L ^a`VpaL]@# D TU]@#  TTUV1 VT! Sd`ee_)aT_emaOG34 25@nmom nppΠoΠa+ d_+ T K')_`'m_mΠ_+ S`]S'J KnR Kn΀]@# rL]@# sxL S^'΅J΅K^]@# z^]S'J΁K΀]@# '0GfN'H]'9`m}'' Gf&OPLOOK G L )g̀gH hIh̠gg+ fd iej kijOG@gkd@# gkjd@# #)hgh''qh'qh+ fgdgf'+K+Jd@# g jDY gi@ G<'''0MIN0 MIN1 A*G A*G ĂDYYYDyY@# XEGV @# G#  7s *70MAX0 MAX1 A*G A*G ĂDYYYDyY@# XEGV @# G#  7s *jGGG$G*G2G9G=##?ARGUMENT TOO LARGEBOTH ARGUMENTS ZERO DIVISION BY ZERONUMBER OF ARGUMENTS NEGATIVE ARGUMENT SINGULARITY OVERFLOW pI A  p OGBG #COMPUTED GO TOINDEX OUT OF RANGE REWINDAGĂ w' I _AGĂ    TaRAGĂ    K1C,KE=bQ,ـK K $ RA’R'Ta@#RRE6 I _BB|# H%'H# J%'JC# )6  #  ERROR AT : LINE  CALLED FROM : IN SL $x$z` yNzO$ ` &EO+Nq M# ((nI 'դM͠1KXN IMě @# ' 逆 LCK(<ށCB)(<((bЁCB)'ǁC(B)@# ' A L($ @GĄC(JB)JC)_($GQٞ(MQ(CB)LXĄ'ˁC(B) ')(I'ФL  K([(<K'@# (I'ͤL ($ĄK''( LR$TCJL(UB)L(KB)@KKĄB)@# (LR$TLJ KC)_($̄QA (<(F @# )))((nEŸ&9&;yDEDo  EHEgGEe   FBF LI 'J+R` yz+KS@# @J G G')c# @Ĉ G G')eJ G G')c((nI)'J(nI*'@@KQL@<ć@#  @6   @6   @o6 @<@?6 @_6À?6I 6 # )g(@6ɀ    )] IЂG!AKĈ@ć )i HĀ# (MQ G )ˀKŀ< K# )(b G )K# G ) K# 6H/6-)] I I# @/6Ÿ)] # 6B/6 ,)e# zyGIHSDIIH@QM+GuHLI( ERG$T# IG'  )GLG& Ќ+G{L6E/6)]G&G' = # K(zK# @SBBI# ` A# L@M@}ćѠ1OALx D M@|@LćL# I8 I)I3WIWIĀVA # WIWIèQWΣQԄPL=1AQ81AQ1CRLRP# )pSLOC)cGG] GWI WIWII'I!I#I I"I0I1U@O6BUVY?  sU@ DJQB # LG IG' +G{LL # /*DEOLNEDICOUN ?) @A)'}mF1EBE5E3--E3E1# L@M@}ćѠ1OALx D M@|@LćL# I8 I)I3WIWIĀVA # WIWIèQWΣQԄPL=1AQ81AQ1CRLRP# )pSLOC)cGG] GWI WIWII'I!I#I I"/ / COMPILE AND LINK THE 6502 FIRMWARE ASSEMBLER PROGRAM / FORTRAN ASM6502 JOB LINK ASM6502+FORTRAN+OS4 820806094101820806094101820806094101IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII