|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 176640 (0x2b200)
Types: TextFile
Names: »mftn«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »mftn«
CC COPYRIGHT 1978 MOTOROLA INC.
CC
CC
CC ARTICLES, INFORMATION AND DATA ENCLOSED HEREIN
CC ARE PROPRIETARY TO MOTOROLA AND MAY NOT BE
CC DISTRIBUTED, REPRODUCED OR DISCLOSED OUTSIDE
CC BUYER'S ORGANIZATION WITHOUT THE EXPRESS WRITTEN
CC CONSENT OR APPROVAL OF AN AUTHORIZED MOTOROLA
CC OFFICER.
CC
CC
CC1.0 INTRODUCTION
CC
CC
CC SEE SECTION 3.0 FOR INSTALLATIONS PROCEDURES......
CC
CC THIS IS THE M68000 CROSS ASSEMBLER. IT IS WRITTEN IN
CC ANSI STANDARD FORTRAN-IV, SO IT SHOULD BE POSSIBLE
CC TO COMPILE AND EXECUTE IT ON ANY COMPUTER WHICH SUPPORTS
CC ANSI FORTRAN-IV.
CC
CC THIS IS A TWO PASS ASSEMBLER. ON THE FIRST PASS IT WILL READ
CC IN THE SOURCE FILE FROM FORTRAN UNIT 'LUSI' AND BUILD THE
CC SYMBOL TABLE. ON PASS TWO THE SOURCE FILE IS REWOUND AND A
CC LISTING IS OUTPUT TO FORTRAN UNIT 'LUOT'. THE OBJECT RECORD
CC (BINARY OBJECT RECORDS IN MC68000 FORMAT)
CC ARE OUTPUT TO THE FORTRAN UNIT 'LUOO'.
CC
CC SEE THE M68000 CROSS MACRO ASSEMBLER MANUAL FOR INFORMATION
CC ON THE INSTRUCTION SET.
CC
CC1.1 GENERAL INFORMATION ABOUT THE CROSS ASSEMBLER.
CC
CC EACH ROUTINE STARTS WITH COMMENTS DESCRIBING VERSION
CC NUMBER, DATE, ENTRY, EXIT VALUE OF ARGUMENTS IN CALLS, AND
CC ITS FUNCTION. ALSO INDICATES IF IT IS COMPUTER DEPENDENT OR
CC INDEPENDENT ON THE FIRST COMMENT LINE. IF COMPUTER
CC INDEPENDENT IT SAYS CMP: ALL. IF COMPUTER DEPENDENT IT
CC SAYS CMP: PDP-11.
CC TO MODIFY CROSS ASSEMBLER TO RUN ON NON PDP-11 TYPE
CC COMPUTERS, EACH ROUTINE WITH CMP: PDP-11 MUST BE MODIFIED TO
CC RUN ON NEW HOST COMPUTER. SOME ROUTINES INDICATE WHY THEY
CC ARE PDP-11 DEPENDENT, OTHERS ARE SELF EXPLANATORY. EACH
CC SOURCE STATEMENT IS READ IN USING ALPHA (A1) FORMAT. THE
CC STATEMENT IS THEN ZERO FILLED(R1 FORMAT) ON THE LEFT.
CC WHEN ASSEMBLY IS COMPLETED THE SOURCE LINE IS
CC PRINTED OUT IN A1 FORMAT. GENERATED M68000 HEX INSTRUCTIONS
CC ARE CONVERTED TO ASCII THEN OUTPUT.
CC
CC1.2 GENERAL OPERATION OF THE CROSS ASSEMBLER.
CC
CC DURING PASS ONE THE SOURCE LINE IS BROKEN INTO ELEMENTS
CC CALLED TOKENS BY ROUTINE 'SCN'. EACH TOKEN IS LOOKED UP
CC IN THE SYMBOL TABLE BY 'LKP'. IF A LABEL IT IS ENTERED
CC IN THE TABLE BY 'STF'. IF AN OPERAND IT IS LOCATED IN THE
CC SYMBOL TABLE AND INFORMATION STORED WITH IT IS USED TO BUILD
CC THE INSTRUCTION. PART OF THE DATA IS USED TO BRANCH IN
CC 'BUILD1' TO COMPLETE THE INSTRUCTION.
CC AT THE END OF PASS 1 THE FILE IS REWOUND AND EACH SOURCE
CC LINE IS READ IN AGAIN. OPERANDS ARE FOUND IN THE SYMBOL
CC TABLE AND DATA FOUND WITH THEM IS USED IN 'BUILD2'.
CC ROUTINE 'OUTPUT' PRINTS OUT THE SOURCE LINE AND THE
CC GENERATED INSTRUCTIONS.
CC ROUTINE 'PAR' WEAVES ITS WAY THROUGH THE PARSE NET TABLE
CC AND CALLING 'ACT1' IN PASS 1 AND 'ACT2' IN PASS 2 IT
CC BREAKS EACH SOURCE LINE DOWN, BUILDING THE INSTRUCTION FOR
CC FINAL ASSEMBLY IN 'BUILD1' OR 'BUILD2'. MACROS ARE
CC STORED IN THE SYMBOL TABLE AND ARE PULLED OUT DURING
CC EXPANSION IN EACH PASS. PASS ONE MUST EXAMINE A
CC MACRO TO SEE HOW MANY BYTES ARE REQUIRED FOR AN INSTRUCTION
CC IN ORDER TO KEEP IN PHASE WITH PASS TWO.
CC A MODIFICATION IN 'ACT1' OR 'BUILD1' CHANGING THE NUMBER
CC OF BYTES GENERATED WILL HAVE TO BE MADE IN 'ACT2' OR 'BUILD2'
CC TO AVOID PHASE ERRORS. THE REVERSE IS ALSO TRUE.
CC
CC2.0 INTRODUCTION
CC
CC THIS SECTION DEFINES DEVICE NUMBERS, COMMON,
CC HOW TO MODIFY THE SYMBOL TABLE SIZE, AND HOW TO CHANGE
CC DEVICE NUMBERS AND SPECIAL COMPUTER DEPENDENT VARIABLES.
CC
CC2.1 DEVICE NUMBERS. SEE SUBROUTINE 'COMDEP' TO CHANGE.
CC
CC LUSI = 2 (SOURCE INPUT)
CC LUOT = 6 (ASSEMBLY LISTING AND ERROR MESSAGES TO A PRINTER
CC LUOT = 3 (ASSEMBLY LISTING AND ERROR MESSAGES TO FILE)
CC LUOT = 5 (ASSEMBLY LISTING AND ERROR MESSAGES TO CONSOLE)
CC LULT = 5 (OUTPUT TO CONSOLE)
CC LUOT = 3 RSX-11M SETTING TO SPOOL OUTPUT INSTEAD
CC OF GOING DIRECTLY TO PRINTER. SEE 'COMDEP'.
CC LUCI = 5 (INPUT FROM CONSOLE)
CC LUOO = 1 (ASSEMBLED OBJECT OUTPUT)
CC
CC2.2 COMMON
CC
CC ALL COMMON IS LABELED /A/. THE DICTIONARY, PARSENET TABLE, AND
CC HASH TABLE ARE INITIALIZED IN BLOCK DATA.
CC
CC ISYM - SYMBOL TABLE, THE DICTIONARY IS IN THE FIRST 1200
CC WORDS. SEE BLOCK DATA WHERE THE DICTIONARY IS
CC INITIALIZED.
CC AN ENTRY IN THE SYMBOL TABLE IS AS FOLLOWS:
CC ISYM(1)->M.S.WORD OF SYMBOL'S VALUE.
CC (2)->M.S.BYTE = NUMBER CHARACTERS IN SYMBOL NAME TIMES 2.
CC 1 = 1-2 CHARS, 2=3-4 CHARS ETC.
CC (2)->L.S.BYTE=TYPE: 255=OPCODE 1=LABEL
CC (3)->LINK TO NEXT SYMBOL IN TABLE
CC (4)-(4+S)-> S=(SIZE-1)/2 2 CHARACTERS/WORD
CC (4+S+1)->ADDRESS TYPE, SEE RR-MMM-TTT BELOW.
CC IN LEAST SIGNIFICANT BYTE(L.S.B).
CC (4+S+2)-> 2 L.S.B OF SYMBOL'S ADDRESS.
CC JSUC POINTS TO ISYM(1) ON RETURN FROM 'LKP'.
CC JPTR & LPTR POINT TO ISYM(4+S+1) ON RETURN FROM 'LKP'.
CC
CC 1 - SYMBOL TABLE:
CC LOW BYTE BITS DEFINED AS RR-MMM-TTT WHERE:
CC RR = 00 - UNDEFINED SYMBOL
CC 01 - DEFINED IN PASS ONE
CC 10 - DEFINED IN PASS TWO
CC 11 - MULTIPLY DEFINED SYMBOL
CC MMM = RESERVED FOR MODE (ASCII,BIN,ETC)
CC TTT = 0 - ABSOLUTE SYMBOL
CC 1 - RELATIVE SYMBOL
CC 2 - REGISTER
CC 3 - KEYWORD
CC 2 - ADDRESS OF THE SYMBOL
CC
CC KARD1 - INPUT SOURCE IMAGE GOES HERE.
CC
CC KARD2 - MACRO PARAMETER SAVE AREA IN R1 FORMAT
CC MFLD - POINTERS TO EACH SUBFIELD IN KARD2
CC MDEP - DEPTH OF MACRO NESTING, MAX = 3
CC MPTR - POINTER TO MACRO DEFINITION OR ELSE = 0
CC
CC ITOKEN - SYMBOL IS BROKEN DOWN FROM 'KARD1' TO HERE AND
CC IS TAKEN FROM HERE AND PUT IN SYMBOL TABLE.
CC
CC TKNSIZ - NUMBER OF CHARACTERS IN 'ITOKEN'.
CC
CC TKNTYP - TYPE OF TOKEN IN 'ITOKEN'.
CC 24 = VARIABLE
CC 25 = NUMBER
CC 27 = 'STRING' OVER 4 BYTES LONG
CC 28 = REGISTER
CC 29 = STATEMENT LABEL
CC 30 = MNEMONIC
CC
CC TKNVAL - VALUE OF 'ITOKEN'.
CC TKNVA2 - HOLDS OVERFLOW FROM 'TKNVAL', SET IN 'SCN'.
CC
CC SYMTYP - MODE OF THE FIRST OPERAND
CC 0 = ABSOLUTE
CC 1 = RELATIVE
CC
CC JSUC - FLAG SET BY SYMBOL LOOKUP ROUTINE 'LKP'.
CC
CC JPTR - SET TO POINT AT SYMBOL TABLE ENTRY OF SYMBOL.
CC
CC NXSYM - POINTS TO NEXT AVAILABLE ADDRESS IN SYMBOL TABLE.
CC NXSYM1 - SAVE START OF LABELS IN SYMBOL TABLE,END OF DICT.
CC
CC KOLUMN - POSITION OF SCAN IN 'KARD1'.
CC
CC KD1BCT - END OF INPUT BUFFER(KARD1)
CC
CC KD1LNO - SOURCE LINE NUMBER.
CC
CC PASS,IPASS - PASS NUMBER FLAG ASSEMBLER IS CURRENTLY ON
CC -1 = PASS ONE
CC 0 = PASS TWO
CC
CC IPCC - CURRENT P-COUNT.
CC IPC2 - M.S.B. OF CURRENT P-COUNT(3RD BYTE)
CC
CC IOPC - OPCODE CLASS
CC
CC INS - ARRAY INSTRUCTION IS BUILT IN AND OUTPUT FROM.
CC
CC ISIZ - SIZE (B,W,L) FOR CURRENT INSTRUCTION
CC PASS 1 PASS 2
CC B = BYTE = 1 0
CC W = WORD = 2 64
CC L = LONG WORD = 4 128
CC
CC INSL - NUMBER OF BYTES REQUIRED FOR CURRENT INSTRUCTION.
CC
CC IADM - ADDRESS MODE FOR FIELD-1 AND FIELD-2 OF
CC THE OPERAND.
CC IADM(1,2):
CC ADDESS MODE ASSEMBLER FORMAT
CC 00 = DATA REG DIRECT D1
CC 08 = ADDR REG DIRECT A1
CC 16 = ADDR REG INDIRECT (A1)
CC 24 = POST INCREMENT (A1)+
CC 32 = PRE DECREMENT -(A1)
CC 40 = INDIRECT & DISPL'MT 3(A1)
CC 48 = DISPL'MT & IND & X 3(A1,A2)
CC 56 = ABSOLUTE SHORT $1234
CC 57 = ABSOLUTE LONG $123456
CC 58 = PC + DISPL'MT REL
CC 59 = PC + X + DISPL'MT REL(A1)
CC 60 = IMMEDIATE SHORT #$1234
CC IMMEDIATE LONG #$123456
CC 64 = STATUS REGISTER SR,CCR
CC
CC 2 - REGISTER #
CC
CC X IADM(X,1) IADM(X,2)
CC - --------- --------
CC 3 ... NO. BYTES IN INS(5)
CC 4 SYMTYP(1) SYMTYP(2)
CC 0 = ABSOLUTE 0 = ABSOLUTE
CC 1 = RELATIVE 1 = RELATIVE
CC 5 FORWARD REFERENCE?
CC 0 = BACKWARDS 0 = BACKWARD
CC 1 = FORWARD 1 = FORWARD
CC 6 A0-D7 BIT MASK D0-A7 BIT MASK
CC 7 CURRENT IPC MODE ...
CC 0 = ABSOLUTE 0 = 2 BYTE ADDRESSING
CC 1 = RELATIVE 1 = 3 BYTE ADDRESSING: > 65535
CC
CC LENSYM - LENGTH OF SYMBOL TABLE, EQUALS NUMBER OF
CC DIMENSIONS OF 'ISYM-10'.
CC
CC KASH - HASH TABLE FOR SYMBOL LOOKUP.
CC
CC KCLAS - TOKEN CLASS.
CC
CC NET1 -> NET5 - PARSENET TABLE.
CC
CC NBPW - NUMBER OF BYTES IN HOST COMPUTER'S WORD.
CC
CC IEOT - END OF LINE = 4.
CC
CC LSP - ASCII BLANK RIGHT JUSTIFIED.
CC
CC IHB480 - HEX CONSTANT SET IN 'COMDEP'
CC
CC IHEX9K - HEX CONSTANT SET IN 'COMDEP'
CC
CC
CC KCFF - HEX CONSTANT $FF SET IN 'COMDEP'
CC
CC LIST - LIST, NOLIST OPTION FLAG.
CC 1 = LIST ASSEMBLY (DEFAULT)
CC 0 = DON'T LIST ASSEMBLY
CC
CC IOBJ - OBJECT OUTPUT, NO OBJECT OUTPUT FLAG
CC 1 = OBJECT OUTPUT REQUESTED - DEFAULT
CC 0 = NO OBJECT OUTPUT REQUESTED
CC
CC IPLEN - NUMBER OF LINES PER PAGE
CC INITIALIZED TO 65
CC
CC LLEN - NUMBER CHARACTERS PER LINE
CC DEFAULT = 80
CC MIN = 26
CC MAX = 120
CC MAX NUMBER CHARACTERS INPUT ON SOURCE LINE = 95
CC
CC LLENSW - FLAG INDICATING COMMAND 'LLEN' HAS BEEN USED.
CC 1 = 'LLEN' IN EFFECT, ADJUST OUTPUT LINE TO
CC PARTICULAR COLUMN
CC 0 = DEFAULT = 'LLEN' NOT IN EFFECT.
CC NOTE: A SOURCE LINE IS NOT COLUMN ADJUSTED ON
CC OUTPUT UNLESS 'LLEN' IS USED.
CC
CC ICOL - USED TO FLAG IFXX IN PROCESS, AND MACRO FLAG.
CC
CC NEST - IFXX-ENDC NEST COUNT.
CC
CC2.3 MODIFYING SYMBOL TABLE SIZE.
CC
CC CHANGE EACH OCCURRANCE OF ISYM(N) IN COMMON /A/ FROM ITS
CC CURRENT VALUE TO DESIRED VALUE. CHANGE VARIABLE 'LENSYM'
CC IN BLOCK DATA TO EQUAL VALUE OF 'N-10' IN COMMON /A/ ISYM(N).
CC
CC2.4 ERROR MESSAGES
CC
CC ERROR # DESCRIPTION
CC ------- ----------
CC 0201 ILLEGAL CHARACTER
CC 0202 SYMBOL TOO LONG
CC 0203 IMPROPER TERMINATION OF OPERAND FIELD
CC 0204 SYNTAX ERROR
CC 0205 SIZE SUBFIELD NOT ALLOWED FOR THIS OPCODE
CC 0206 REDEFINED SYMBOL
CC 0207 UNDEFINED SYMBOL
CC 0208 DISPLACEMENT RANGE (SIZE) ERROR
CC 0209 ILLEGAL ADDRESS MODE FOR THIS INSTRUCTION
CC 0210 VALUE TOO LARGE
CC 0211 UNDEFINED SYMBOL
CC 0212 DATA SIZE IS INVALID
CC 0213 REGISTER MUST BE ADDRESS REGISTER
CC 0214 INVALID SIZE SPECIFIED FOR INDEX REGISTER (MUST BE .L)
CC 0215 REGISTER MUST BE DATA REGISTER
CC 0216 NEGATIVE NOT ALLOWED
CC 0217 BYTE MODE NOT ALLOWED
CC 0218 DESTINATION MUST BE ALTERABLE
CC 0219 TOO MANY OPERANDS FOR THIS INSTRUCTION
CC 0220 PHASING ERROR BETWEEN PASS ONE AND PASS TWO.
CC 0221 SYMBOL TABLE OVERFLOW
CC 0222 INTERNAL ERROR - PARSE STACK OVERFLOW
CC 0223 INTERNAL ERROR - UNDEFINED ACTION
CC 0224 ILLEGAL MACRO PARAMETER
CC 0225 MISPLACED 'MACRO' OR 'ENDM'
CC 0226 MACRO CALLS NESTED TOO DEEP
CC 0227 MULTIPLE REGISTERS ALLOWED ONLY FOR MOVEM(LDM,STM)
CC 0228 INTERNAL ERROR - SYMBOL LOST
CC 0229 LABEL REQUIRED ON THIS STATEMENT
CC 0230 INSTRUCTION ADDRESS HAS FALLEN ON AN ODD BOUNDARY
CC 0231 SYMBOL/EXPRESSION MUST BE ABSOLUTE
CC 0232 AND/OR/EOR TO CCR OR SR MUST HAVE IMMEDIATE SOURCE
CC 0233 ILLEGAL REGISTER FOR THIS INSTRUCTION
CC 0234 INVALID SYNTAX FOR THIS INSTRUCTION
CC 0235 FORWARD REFERENCED ADDRESS CANNOT BE LONG ABSOLUTE MODE
CC 0236 MEMORY SHIFTS MAY ONLY BE SINGLE BIT
CC 0237 ILLEGAL OPERATION ON A RELATIVE SYMBOL
CC 0238 INVALID BYTE SIZE FOR THIS INSTRUCTION
CC 0239 'END' DOES NOT TERMINATE SOURCE PROGRAM AS IT SHOULD
CC 0240 ILLEGAL FORWARD REFERENCE
CC
CC3.0 INSTALLATION OF THE M68000 CROSS ASSEMBLER ON A PDP-11 SYSTEM
CC TYPE SYSTEM.
CC
CC THE CROSS ASSEMBLER COMES ON A TAPE IN ONE FILE.
CC EACH SUBPROGRAM MUST BE SEPARATED FROM THIS FILE AND COMPILED
CC SEPARATELY IN ORDER TO LINK THE ENTIRE PROGRAM INTO A TASK.
CC ALL BUT 5 SUBPROGRAMS ARE WRITTEN IN FORTRAN. PROGRAMS MUST BE
CC COMPILED WITH THE /ON AND /SU FORTRAN OPTIONS TO GET THE LOAD
CC MODULE SMALL ENOUGH TO FIT IN 28K OF MEMORY ON A DOS SYSTEM.
CC USE /NOVA/NOSN ON AN RSX-M SYSTEM.
CC NOVA=NO 32 BIT INTEGERS
CC NOSN=NO INTERNAL STATEMENT #'S GEN'D BY COMPILER
CC THE FOLLOWING SWITCHES ARE USED WITH FORTRAN IV-PLUS, V02-51
CC /NOTR NO TRACE
CC /NOCK NO SUBCRIPT CHECKING
CC
CC IT SHOULD BE POSSIBLE TO OVERLAY THIS PROGRAM TO
CC GET MORE MEMORY AVAILABLE FOR SYMBOL TABLE SPACE. ALL ROUTINES
CC EXCEPT 'ACT1', 'BUILD1', 'ACT2', 'BUILD2', AND 'PRSYM' MUST
CC BE IN MEMORY, OR MUST BE IN THE MAIN OVERLAY. ACT1 CALLS
CC BUILD1 AND BOTH ARE USED IN PASS 1 ONLY. THEREFORE THESE TWO
CC SUBPROGRAMS CAN BE CONCATENATED AS ONE OVERLAY. ACT2, BUILD2
CC DO NOT CALL EACH OTHER AND MAY EACH BE THE SAME LEVEL OVERLAY
CC AS ACT1 SINCE THEY ARE USED ONLY IN PASS 2 . PRSYM PRINTS OUT
CC SYMBOL TABLE WHEN PASS 2 IS DONE SO IT CAN BE AT THE SAME
CC LEVEL AS ACT1, ACT2, AND BUILD2.
CC
CC SEVERAL PAGES OF NOTES ON ASSEMBLER CONSTRUCTION, VARIABLE
CC NAMES, COMMON, AND A DESCRIPTION OF THE VARIABLE NAMES IS
CC INCLUDED. THIS IS FOR INFORMATION ONLY AND IS NOT PART OF THE
CC OVERALL SOURCE PROGRAM.
CC
CC THE MAIN PROGRAM IS 'MACS'. SEVERAL SUBPROGRAMS FOLLOW 'MACS'
CC ALL IN FORTRAN. FIVE MORE IN PDP-11 ASSEMBLY LANGUAGE FOLLOW.
CC THE ASSEMBLY LANGUAGE PROGRAMS ARE: ADD,MUL,SUB,DIV,NEGATE.
CC SEPARATE THE FORTRAN PROGRAMS AND COMPILE EACH ONE. THEN
CC SEPARATE THE ASSEMBLY PROGRAMS AND ASSEMBLE EACH ONE.
CC LINK ALL OF THE RESULTANT .OBJ FILES IN TO A TASK(LOAD
CC MODULE). WHEN THIS IS DONE IT IS READY FOR EXECUTION.
CC
CC AS A TEST OF THE INSTALLATION OF THE CROSS ASSEMBLER IT
CC IS SUGGESTED THE SORT PROGRAM FOUND IN APPENDIX E OF THE
CC CROSS MACRO ASSEMBLER REFERENCE MANUAL, M68KXASM(D3), BE
CC USED. THIS PROGRAM SHOULD EXECUTE IN EITHER THE HARDWARE
CC OR A SIMULATOR SUCCESSFULLY.
CC
CC ONCE THE LOAD MODULE IS UP AND RUNNING, IT IS READY
CC FOR EXECUTION.
CC
CC RSX-11M SYSTEM.
CC ROUTINE 'FILEOP' HAS 'CALL ASSIGN' IN IT FOR THE RSX-11M
CC SYSTEM. THIS ROUTINE MUST BE CHANGED IF THE USER DOES NOT
CC WANT TO USE THIS METHOD OF ACCESSING FILES. 'FILEOP' ALSO
CC REQUESTS THE FILENAME FOR THE OUTPUT LISTING. IF THE SYSTEM
CC ALLOWS DIRECT OUTPUT TO THE LINE PRINTER THIS MAY BE
CC CHANGED ACCORDINGLY. THE 'CALL FILEOP(6)' IN 'MACS'
CC MUST ALSO BE DELETED IN THIS CASE, UNLESS THE COMPLETE
CC IN CHANGE IS MADE IN 'FILEOP'. THE REQUEST FOR PRINTING
CC PASS 1 IN 'MACS' MAY ALSO BE REMOVED IF DESIRED. THIS IS A
CC DEBUGGING AID.
CC NAMES FOR ALL FILES ARE REQUESTED FROM 'FILEOP'.
CC
CC THIS SOFTWARE HAS BEEN CHECKED OUT ON AN RSX-11M VERSION 3.2
CC SYSTEM. IT HAS NOT BEEN RAN ON AN RSTS OR UNIX SYSTEM. THE
CC SOFTWARE IS SENT OUT ON AN 800 BPI UN-LABELED 9-TRACK TAPE.
CC IT IS IN ASCII, 80 BYTES PER RECORD AND BLOCK. THE USER
CC MUST BE ABLE TO READ THIS TYPE OF TAPE.
CC A FORTRAN PROGRAM USING CALLS TO 'QIO' IS AVAILABLE FROM
CC MOTOROLA TO DO THIS READ. IT IS PLANNED TO PUT A COPY
CC OF THIS PROGRAM IN THE NEXT UPDATE OF THE REFERENCE MANUAL.
CC RELEASES PREVIOUS TO 1.4 WERE CHECKED OUT ON RSX-11M, FORTRAN
CC V02.2-1. RELEASE 1.4 WAS CHECKED OUT ON FORTRAN IV-PLUS
CC V02-51. A CHANGE HAD TO BE MADE IN THE CALL TO 'ASSIGN' TO
CC BE DOWNWARD COMPATIBLE WITH DEC'S CHANGE IN 'ASSIGN' REQUIRING
CC THE FIRST CHARACTER AT THE END OF THE FILENAME TO BE A NULL.
CC
CC AFTER READING THE TAPE IN TO A DISC FILE IT IS BEST TO WRITE A
CC FORTRAN PROGRAM THAT READ IN THAT FILE AND SPLIT IT INTO THE
CC SEPARATE SUBPROGRAMS.
CC
CC *** END OF THIS ARTICLE ***
CC
CC
CC
CC
CC NAM: MACS VER: 1.0 DAT: DEC 8, 1978 CMP: PDP-11
CC
CC SYS: MACS
CC
CC FNC: THIS IS THE MAIN PROGRAM FOR THE M68000 CROSS ASSEMBLER.
CC IT INITIALIZES SEVERAL VARIABLES, AND
CC CALLS ROUTINES FOR PASS1 AND PASS 2.
CC
CC ******************************************************
CC *** ***
CC *** COPYRIGHT 1978 BY MOTOROLA INCC ***
CC *** ***
CC ******************************************************
CC
CC ***********************************************************
CC *** ***
CC *** THIS IS A PRELIMINARY RELEASE OF THE MC68000 ***
CC *** CROSS ASSEMBLER. AS SUCH IT IS POSSIBLE THE ***
CC *** INSTRUCTION SET FOR THE MC68000 MAY CHANGE ***
CC *** CAUSING CHANGES IN THIS CROSS ASSEMBLER. ***
CC *** MOTOROLA RESERVES THE RIGHT TO MAKE CHANGES ***
CC *** WITHOUT NOTICE. ***
CC *** ***
CC ***********************************************************
CC
CC REV: N/A
CC
CCALLS COMDEP-FILEOP-PNCH-ERR-PRSYM-PAGE
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
COMMON /A/ NXSYM1
DIMENSION KCLAS2(64)
DATA KCLAS2/8,9,9,9,3,9,9,5,9,9,9,9,9,9,9,9,
& 7,7,7,7,7,7,7,7,7,7,9,9,9,9,9,9,
& 6,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,
& 6,6,6,6,6,6,6,6,6,6,6,9,2,9,6,6/
DATA IYES/'Y'/
C
C*** INITIALIZE VARIABLES, IO DEVICES
CALL COMDEP
9960 FORMAT(' PRINT PASS 1? (Y/N)'/)
9961 FORMAT(A1)
WRITE(LULT,9960)
READ(LUCI,9961) JJJ
IF(JJJ.EQ.IYES) CALL DEBUG(1)
C
C+++ THIS FILE OUTPUT OF SOURCE IS TO GET AROUND
C+++ THE SPOOLING TO PRINTER ON THE SYSTEM.
C+++ REMOVE THE 'CALL FILEOP(6)' TO GO DIRECTLY TO PRINTER
C
C+++ ALSO REMOVE TEST AT END OF THIS PROGRAM FOR CLOSING FILE 3
CALL FILEOP(6)
C
C+++ END
C
DO 40 I=1,11
DO 40 J=1,3
40 MFLD(I,J)=0
C*** SET UP COMMON /A/ARRAY 'KCLAS'
DO 70 I=1,64
70 KCLAS(I)=KCLAS2(I)
C*** PAGE SWITCH DEFAULT ON
NOP=1
C*** FLAG NOT TO PRINT EXPANDED LITERALS
LUDI=0
C*** IOBJ=1=OBJECT OUT - IOBJ=0=NO OBJECT OUT
IOBJ=1
C
C*** LIST=0 NOLIST - LIST=1 LIST(DEFAULT).
LIST= 1
C*** SET DEFAULT LINE LENGTH
LLEN=80
C*** SET DO NOT ADJUST OUTPUT LINE SWITCH
LLENSW=0
C*** SET DEFAULT PAGE COUNT TO 65 LINES/PAGE
IPLEN=65
ICOL=0
NEST=0
MNUM=0
C*** ASCII BLANK, RIGHT JUSTIFIED, ZERO FILLED.
LSP=32
C*** LEAVE SYMBOL TABLE SIZE LESS THAN MAX IN ORDER TO HANDLE
C*** SYMBOL TABLE OVERFLOW.
LENSYM=2990
IEOT=4
JERR=0
IPC2=0
IPC=0
IADM(7,2)=0
IADM(7,1)=1
C*** INIT MACRO @000 VALUE
KARD2(1,1)=64
KARD2(2,1)=48
KARD2(3,1)=48
KARD2(4,1)=48
KARD2(5,1)=0
C*** PRINT THIS HEADER TO CONSOLE
CALL PAGE(81)
C
C
C*** GET SI FN OPENED
C
CALL FILEOP(1)
C*** OUTPUT HEADER
CALL PAGE(82)
C
C*** PERFORM PASS ONE
C
750 CONTINUE
IPASS=-1
C*** SAVE FOR SYMBOL TABLE PRINT OUT.
900 NXSYM1=NXSYM
1000 CALL PAR
IF(IPASS.LT.0) GO TO 1000
C
C*** PERFORM PASS TWO
C
C*** IS OBJECT OUTPUT DESIRED?
IF(IOBJ.EQ.0) GO TO 1100
C*** OPEN OBJ FILE
CALL FILEOP(5)
CALL PNCH(1,IPC)
CALL PNCH(3,IPC)
1100 CONTINUE
C
C*** IN CASE IFXX - ENDC NOT EQUAL RESET
C
NEST=0
C
C
C*** RESET MACRO @ COUNTER
KARD2(1,1)=64
KARD2(2,1)=48
KARD2(3,1)=48
KARD2(4,1)=48
KARD2(5,1)=0
C
2000 CALL PAR
IF(IPASS.EQ.0) GO TO 2000
C*** END OF PASS 2
C*** PRINT FINAL ERROR COUNT
CALL ERR(-1)
C*** PRINT SYMBOL TABLE
CALL PRSYM
C*** PUT OUT TRAILING RECORD IF OBJECT OUT REQ.
IF(IOBJ.EQ.0) GO TO 3000
CALL PNCH(2,IPC)
C*** CLOSE OBJECT OUTPUT FILE
2900 CALL FILEOP(4)
C
C+++ IF LIST IS TO FILE, CLOSE IT
C
3000 CONTINUE
IF(LUOT.EQ.3) CALL CLOSE(3)
END
BLOCK DATA
CC NAM: BLOCK DATA VER: 1.0 DAT: DEC 8, 1978 CMP: PDP-11
C
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST
C
C*** THE C>>> MUST NOT BE MOVED, PARNET USES IT
C>>>
DATA NXSYM/1171/
DATA ISYM( 1)/O 0/,ISYM( 2)/O 1777/,ISYM( 3)/O 141/
DATA ISYM( 4)/O 46501/,ISYM( 5)/O 41522/,ISYM( 6)/O 47400/
DATA ISYM( 7)/O177777/,ISYM( 8)/O 0/,ISYM( 9)/O 0/
DATA ISYM( 10)/O 1377/,ISYM( 11)/O 661/,ISYM( 12)/O 42516/
DATA ISYM( 13)/O 42115/,ISYM( 14)/O177777/,ISYM( 15)/O 1/
DATA ISYM( 16)/O 0/,ISYM( 17)/O 1777/,ISYM( 18)/O 150/
DATA ISYM( 19)/O 46505/,ISYM( 20)/O 54111/,ISYM( 21)/O 52000/
DATA ISYM( 22)/O177777/,ISYM( 23)/O 2/,ISYM( 24)/O 0/
DATA ISYM( 25)/O 1377/,ISYM( 26)/O 275/,ISYM( 27)/O 42516/
DATA ISYM( 28)/O 42000/,ISYM( 29)/O 1/,ISYM( 30)/O 1/
DATA ISYM( 31)/O 0/,ISYM( 32)/O 1377/,ISYM( 33)/O 402/
DATA ISYM( 34)/O 42516/,ISYM( 35)/O 42103/,ISYM( 36)/O 1/
DATA ISYM( 37)/O 2/,ISYM( 38)/O 0/,ISYM( 39)/O 1377/
DATA ISYM( 40)/O 616/,ISYM( 41)/O 50101/,ISYM( 42)/O 43505/
DATA ISYM( 43)/O 1/,ISYM( 44)/O 3/,ISYM( 45)/O 0/
DATA ISYM( 46)/O 1377/,ISYM( 47)/O 742/,ISYM( 48)/O 46111/
DATA ISYM( 49)/O 51524/,ISYM( 50)/O 1/,ISYM( 51)/O 4/
DATA ISYM( 52)/O 0/,ISYM( 53)/O 1777/,ISYM( 54)/O 677/
DATA ISYM( 55)/O 47117/,ISYM( 56)/O 46111/,ISYM( 57)/O 51524/
DATA ISYM( 58)/O 1/,ISYM( 59)/O 5/,ISYM( 60)/O 0/
DATA ISYM( 61)/O 1377/,ISYM( 62)/O 706/,ISYM( 63)/O 47117/
DATA ISYM( 64)/O 46000/,ISYM( 65)/O 1/,ISYM( 66)/O 5/
DATA ISYM( 67)/O 0/,ISYM( 68)/O 1377/,ISYM( 69)/O 1756/
DATA ISYM( 70)/O 52124/,ISYM( 71)/O 46000/,ISYM( 72)/O 1/
DATA ISYM( 73)/O 6/,ISYM( 74)/O 0/,ISYM( 75)/O 1777/
DATA ISYM( 76)/O 303/,ISYM( 77)/O 47117/,ISYM( 78)/O 50101/
DATA ISYM( 79)/O 43505/,ISYM( 80)/O 1/,ISYM( 81)/O 7/
DATA ISYM( 82)/O 0/,ISYM( 83)/O 1777/,ISYM( 84)/O 175/
DATA ISYM( 85)/O 47117/,ISYM( 86)/O 47502/,ISYM( 87)/O 45000/
DATA ISYM( 88)/O 1/,ISYM( 89)/O 10/,ISYM( 90)/O 0/
DATA ISYM( 91)/O 1377/,ISYM( 92)/O 266/,ISYM( 93)/O 41515/
DATA ISYM( 94)/O 50114/,ISYM( 95)/O 1/,ISYM( 96)/O 11/
DATA ISYM( 97)/O 0/,ISYM( 98)/O 1377/,ISYM( 99)/O 634/
DATA ISYM( 100)/O 41515/,ISYM( 101)/O 50122/,ISYM( 102)/O 1/
DATA ISYM( 103)/O 12/,ISYM( 104)/O 0/,ISYM( 105)/O 777/
DATA ISYM( 106)/O 242/,ISYM( 107)/O 43400/,ISYM( 108)/O 1/
DATA ISYM( 109)/O 13/,ISYM( 110)/O 0/,ISYM( 111)/O 1777/
DATA ISYM( 112)/O 562/,ISYM( 113)/O 46501/,ISYM( 114)/O 51513/
DATA ISYM( 115)/O 31000/,ISYM( 116)/O 1/,ISYM( 117)/O 14/
DATA ISYM( 118)/O 0/,ISYM( 119)/O 1377/,ISYM( 120)/O 257/
DATA ISYM( 121)/O 51124/,ISYM( 122)/O 42400/,ISYM( 123)/O 2/
DATA ISYM( 124)/O 47163/,ISYM( 125)/O 0/,ISYM( 126)/O 1377/
DATA ISYM( 127)/O 1104/,ISYM( 128)/O 51124/,ISYM( 129)/O 51000/
DATA ISYM( 130)/O 2/,ISYM( 131)/O 47167/,ISYM( 132)/O 0/
DATA ISYM( 133)/O 1377/,ISYM( 134)/O 2067/,ISYM( 135)/O 51124/
DATA ISYM( 136)/O 51400/,ISYM( 137)/O 2/,ISYM( 138)/O 47165/
DATA ISYM( 139)/O 0/,ISYM( 140)/O 1777/,ISYM( 141)/O 1066/
DATA ISYM( 142)/O 51105/,ISYM( 143)/O 51505/,ISYM( 144)/O 52000/
DATA ISYM( 145)/O 2/,ISYM( 146)/O 47160/,ISYM( 147)/O 0/
DATA ISYM( 148)/O 1777/,ISYM( 149)/O 0/,ISYM( 150)/O 52122/
DATA ISYM( 151)/O 40520/,ISYM( 152)/O 53000/,ISYM( 153)/O 2/
DATA ISYM( 154)/O 47166/,ISYM( 155)/O 0/,ISYM( 156)/O 1377/
DATA ISYM( 157)/O 1326/,ISYM( 158)/O 47117/,ISYM( 159)/O 50000/
DATA ISYM( 160)/O 2/,ISYM( 161)/O 47161/,ISYM( 162)/O 0/
DATA ISYM( 163)/O 777/,ISYM( 164)/O 1371/,ISYM( 165)/O 42103/
DATA ISYM( 166)/O 4/,ISYM( 167)/O 0/,ISYM( 168)/O 0/
DATA ISYM( 169)/O 1377/,ISYM( 170)/O 652/,ISYM( 171)/O 47522/
DATA ISYM( 172)/O 43400/,ISYM( 173)/O 5/,ISYM( 174)/O 1/
DATA ISYM( 175)/O 0/,ISYM( 176)/O 1377/,ISYM( 177)/O 553/
DATA ISYM( 178)/O 42521/,ISYM( 179)/O 52400/,ISYM( 180)/O 5/
DATA ISYM( 181)/O 2/,ISYM( 182)/O 0/,ISYM( 183)/O 1377/
DATA ISYM( 184)/O 733/,ISYM( 185)/O 51505/,ISYM( 186)/O 52000/
DATA ISYM( 187)/O 5/,ISYM( 188)/O 3/,ISYM( 189)/O 0/
DATA ISYM( 190)/O 777/,ISYM( 191)/O 420/,ISYM( 192)/O 42123/
DATA ISYM( 193)/O 5/,ISYM( 194)/O 4/,ISYM( 195)/O 0/
DATA ISYM( 196)/O 1377/,ISYM( 197)/O 337/,ISYM( 198)/O 51117/
DATA ISYM( 199)/O 51107/,ISYM( 200)/O 5/,ISYM( 201)/O 5/
DATA ISYM( 202)/O 0/,ISYM( 203)/O 1377/,ISYM( 204)/O 1221/
DATA ISYM( 205)/O 43101/,ISYM( 206)/O 44514/,ISYM( 207)/O 5/
DATA ISYM( 208)/O 6/,ISYM( 209)/O 0/,ISYM( 210)/O 1377/
DATA ISYM( 211)/O 715/,ISYM( 212)/O 51520/,ISYM( 213)/O 41400/
DATA ISYM( 214)/O 5/,ISYM( 215)/O 7/,ISYM( 216)/O 0/
DATA ISYM( 217)/O 1377/,ISYM( 218)/O 1005/,ISYM( 219)/O 46111/
DATA ISYM( 220)/O 47113/,ISYM( 221)/O 6/,ISYM( 222)/O 47120/
DATA ISYM( 223)/O 0/,ISYM( 224)/O 1377/,ISYM( 225)/O 1670/
DATA ISYM( 226)/O 52516/,ISYM( 227)/O 46113/,ISYM( 228)/O 6/
DATA ISYM( 229)/O 47130/,ISYM( 230)/O 0/,ISYM( 231)/O 1377/
DATA ISYM( 232)/O 364/,ISYM( 233)/O 51527/,ISYM( 234)/O 40520/
DATA ISYM( 235)/O 7/,ISYM( 236)/O 44100/,ISYM( 237)/O 0/
DATA ISYM( 238)/O 1377/,ISYM( 239)/O 1720/,ISYM( 240)/O 52122/
DATA ISYM( 241)/O 40520/,ISYM( 242)/O 10/,ISYM( 243)/O 47100/
DATA ISYM( 244)/O 0/,ISYM( 245)/O 1377/,ISYM( 246)/O 1174/
DATA ISYM( 247)/O 52123/,ISYM( 248)/O 52000/,ISYM( 249)/O 11/
DATA ISYM( 250)/O 45000/,ISYM( 251)/O 0/,ISYM( 252)/O 1377/
DATA ISYM( 253)/O 501/,ISYM( 254)/O 41514/,ISYM( 255)/O 51000/
DATA ISYM( 256)/O 11/,ISYM( 257)/O 41000/,ISYM( 258)/O 0/
DATA ISYM( 259)/O 1377/,ISYM( 260)/O 1147/,ISYM( 261)/O 47105/
DATA ISYM( 262)/O 43400/,ISYM( 263)/O 11/,ISYM( 264)/O 42000/
DATA ISYM( 265)/O 0/,ISYM( 266)/O 1377/,ISYM( 267)/O 643/
DATA ISYM( 268)/O 47117/,ISYM( 269)/O 52000/,ISYM( 270)/O 11/
DATA ISYM( 271)/O 43000/,ISYM( 272)/O 0/,ISYM( 273)/O 1377/
DATA ISYM( 274)/O 1417/,ISYM( 275)/O 47102/,ISYM( 276)/O 41504/
DATA ISYM( 277)/O 12/,ISYM( 278)/O 44000/,ISYM( 279)/O 0/
DATA ISYM( 280)/O 1377/,ISYM( 281)/O 1317/,ISYM( 282)/O 50105/
DATA ISYM( 283)/O 40400/,ISYM( 284)/O 13/,ISYM( 285)/O 44100/
DATA ISYM( 286)/O 0/,ISYM( 287)/O 1377/,ISYM( 288)/O 751/
DATA ISYM( 289)/O 45123/,ISYM( 290)/O 51000/,ISYM( 291)/O 14/
DATA ISYM( 292)/O 47200/,ISYM( 293)/O 0/,ISYM( 294)/O 1377/
DATA ISYM( 295)/O 463/,ISYM( 296)/O 45115/,ISYM( 297)/O 50000/
DATA ISYM( 298)/O 14/,ISYM( 299)/O 47300/,ISYM( 300)/O 0/
DATA ISYM( 301)/O 1377/,ISYM( 302)/O 526/,ISYM( 303)/O 41122/
DATA ISYM( 304)/O 40400/,ISYM( 305)/O 15/,ISYM( 306)/O 60000/
DATA ISYM( 307)/O 0/,ISYM( 308)/O 1377/,ISYM( 309)/O 0/
DATA ISYM( 310)/O 41123/,ISYM( 311)/O 51000/,ISYM( 312)/O 15/
DATA ISYM( 313)/O 60400/,ISYM( 314)/O 0/,ISYM( 315)/O 1377/
DATA ISYM( 316)/O 625/,ISYM( 317)/O 41110/,ISYM( 318)/O 44400/
DATA ISYM( 319)/O 15/,ISYM( 320)/O 61000/,ISYM( 321)/O 0/
DATA ISYM( 322)/O 1377/,ISYM( 323)/O 1237/,ISYM( 324)/O 41114/
DATA ISYM( 325)/O 51400/,ISYM( 326)/O 15/,ISYM( 327)/O 61400/
DATA ISYM( 328)/O 0/,ISYM( 329)/O 1377/,ISYM( 330)/O 1737/
DATA ISYM( 331)/O 41103/,ISYM( 332)/O 41400/,ISYM( 333)/O 15/
DATA ISYM( 334)/O 62000/,ISYM( 335)/O 0/,ISYM( 336)/O 1377/
DATA ISYM( 337)/O 535/,ISYM( 338)/O 41103/,ISYM( 339)/O 51400/
DATA ISYM( 340)/O 15/,ISYM( 341)/O 62400/,ISYM( 342)/O 0/
DATA ISYM( 343)/O 1377/,ISYM( 344)/O 0/,ISYM( 345)/O 41116/
DATA ISYM( 346)/O 42400/,ISYM( 347)/O 15/,ISYM( 348)/O 63000/
DATA ISYM( 349)/O 0/,ISYM( 350)/O 1377/,ISYM( 351)/O 571/
DATA ISYM( 352)/O 41105/,ISYM( 353)/O 50400/,ISYM( 354)/O 15/
DATA ISYM( 355)/O 63400/,ISYM( 356)/O 0/,ISYM( 357)/O 1377/
DATA ISYM( 358)/O 0/,ISYM( 359)/O 41126/,ISYM( 360)/O 41400/
DATA ISYM( 361)/O 15/,ISYM( 362)/O 64000/,ISYM( 363)/O 0/
DATA ISYM( 364)/O 1377/,ISYM( 365)/O 1041/,ISYM( 366)/O 41126/
DATA ISYM( 367)/O 51400/,ISYM( 368)/O 15/,ISYM( 369)/O 64400/
DATA ISYM( 370)/O 0/,ISYM( 371)/O 1377/,ISYM( 372)/O 0/
DATA ISYM( 373)/O 41120/,ISYM( 374)/O 46000/,ISYM( 375)/O 15/
DATA ISYM( 376)/O 65000/,ISYM( 377)/O 0/,ISYM( 378)/O 1377/
DATA ISYM( 379)/O 2206/,ISYM( 380)/O 41115/,ISYM( 381)/O 44400/
DATA ISYM( 382)/O 15/,ISYM( 383)/O 65400/,ISYM( 384)/O 0/
DATA ISYM( 385)/O 1377/,ISYM( 386)/O 0/,ISYM( 387)/O 41107/
DATA ISYM( 388)/O 42400/,ISYM( 389)/O 15/,ISYM( 390)/O 66000/
DATA ISYM( 391)/O 0/,ISYM( 392)/O 1377/,ISYM( 393)/O 1032/
DATA ISYM( 394)/O 41114/,ISYM( 395)/O 52000/,ISYM( 396)/O 15/
DATA ISYM( 397)/O 66400/,ISYM( 398)/O 0/,ISYM( 399)/O 1377/
DATA ISYM( 400)/O 1747/,ISYM( 401)/O 41107/,ISYM( 402)/O 52000/
DATA ISYM( 403)/O 15/,ISYM( 404)/O 67000/,ISYM( 405)/O 0/
DATA ISYM( 406)/O 1377/,ISYM( 407)/O 1212/,ISYM( 408)/O 41114/
DATA ISYM( 409)/O 42400/,ISYM( 410)/O 15/,ISYM( 411)/O 67400/
DATA ISYM( 412)/O 0/,ISYM( 413)/O 1377/,ISYM( 414)/O 670/
DATA ISYM( 415)/O 47105/,ISYM( 416)/O 43530/,ISYM( 417)/O 16/
DATA ISYM( 418)/O 40000/,ISYM( 419)/O 0/,ISYM( 420)/O 1377/
DATA ISYM( 421)/O 1615/,ISYM( 422)/O 42530/,ISYM( 423)/O 52000/
DATA ISYM( 424)/O 17/,ISYM( 425)/O 44200/,ISYM( 426)/O 0/
DATA ISYM( 427)/O 1377/,ISYM( 428)/O 0/,ISYM( 429)/O 52101/
DATA ISYM( 430)/O 51400/,ISYM( 431)/O 20/,ISYM( 432)/O 45300/
DATA ISYM( 433)/O 0/,ISYM( 434)/O 1377/,ISYM( 435)/O 1014/
DATA ISYM( 436)/O 51510/,ISYM( 437)/O 44400/,ISYM( 438)/O 21/
DATA ISYM( 439)/O 51300/,ISYM( 440)/O 0/,ISYM( 441)/O 1377/
DATA ISYM( 442)/O 2117/,ISYM( 443)/O 51514/,ISYM( 444)/O 51400/
DATA ISYM( 445)/O 21/,ISYM( 446)/O 51700/,ISYM( 447)/O 0/
DATA ISYM( 448)/O 1377/,ISYM( 449)/O 1401/,ISYM( 450)/O 51503/
DATA ISYM( 451)/O 41400/,ISYM( 452)/O 21/,ISYM( 453)/O 52300/
DATA ISYM( 454)/O 0/,ISYM( 455)/O 1377/,ISYM( 456)/O 724/
DATA ISYM( 457)/O 51503/,ISYM( 458)/O 51400/,ISYM( 459)/O 21/
DATA ISYM( 460)/O 52700/,ISYM( 461)/O 0/,ISYM( 462)/O 1377/
DATA ISYM( 463)/O 1245/,ISYM( 464)/O 51516/,ISYM( 465)/O 42400/
DATA ISYM( 466)/O 21/,ISYM( 467)/O 53300/,ISYM( 468)/O 0/
DATA ISYM( 469)/O 1377/,ISYM( 470)/O 760/,ISYM( 471)/O 51505/
DATA ISYM( 472)/O 50400/,ISYM( 473)/O 21/,ISYM( 474)/O 53700/
DATA ISYM( 475)/O 0/,ISYM( 476)/O 1377/,ISYM( 477)/O 0/
DATA ISYM( 478)/O 51526/,ISYM( 479)/O 41400/,ISYM( 480)/O 21/
DATA ISYM( 481)/O 54300/,ISYM( 482)/O 0/,ISYM( 483)/O 1377/
DATA ISYM( 484)/O 0/,ISYM( 485)/O 51526/,ISYM( 486)/O 51400/
DATA ISYM( 487)/O 21/,ISYM( 488)/O 54700/,ISYM( 489)/O 0/
DATA ISYM( 490)/O 1377/,ISYM( 491)/O 1050/,ISYM( 492)/O 51520/
DATA ISYM( 493)/O 46000/,ISYM( 494)/O 21/,ISYM( 495)/O 55300/
DATA ISYM( 496)/O 0/,ISYM( 497)/O 1377/,ISYM( 498)/O 1301/
DATA ISYM( 499)/O 51515/,ISYM( 500)/O 44400/,ISYM( 501)/O 21/
DATA ISYM( 502)/O 55700/,ISYM( 503)/O 0/,ISYM( 504)/O 1377/
DATA ISYM( 505)/O 1471/,ISYM( 506)/O 51507/,ISYM( 507)/O 42400/
DATA ISYM( 508)/O 21/,ISYM( 509)/O 56300/,ISYM( 510)/O 0/
DATA ISYM( 511)/O 1377/,ISYM( 512)/O 1156/,ISYM( 513)/O 51514/
DATA ISYM( 514)/O 52000/,ISYM( 515)/O 21/,ISYM( 516)/O 56700/
DATA ISYM( 517)/O 0/,ISYM( 518)/O 1377/,ISYM( 519)/O 1642/
DATA ISYM( 520)/O 51507/,ISYM( 521)/O 52000/,ISYM( 522)/O 21/
DATA ISYM( 523)/O 57300/,ISYM( 524)/O 0/,ISYM( 525)/O 1377/
DATA ISYM( 526)/O 1310/,ISYM( 527)/O 51514/,ISYM( 528)/O 42400/
DATA ISYM( 529)/O 21/,ISYM( 530)/O 57700/,ISYM( 531)/O 0/
DATA ISYM( 532)/O 1377/,ISYM( 533)/O 1426/,ISYM( 534)/O 44506/
DATA ISYM( 535)/O 42521/,ISYM( 536)/O 22/,ISYM( 537)/O 1/
DATA ISYM( 538)/O 0/,ISYM( 539)/O 1377/,ISYM( 540)/O 1507/
DATA ISYM( 541)/O 44506/,ISYM( 542)/O 47105/,ISYM( 543)/O 22/
DATA ISYM( 544)/O 2/,ISYM( 545)/O 0/,ISYM( 546)/O 1377/
DATA ISYM( 547)/O 1165/,ISYM( 548)/O 46114/,ISYM( 549)/O 42516/
DATA ISYM( 550)/O 23/,ISYM( 551)/O 1/,ISYM( 552)/O 0/
DATA ISYM( 553)/O 1377/,ISYM( 554)/O 1254/,ISYM( 555)/O 50114/
DATA ISYM( 556)/O 42516/,ISYM( 557)/O 23/,ISYM( 558)/O 2/
DATA ISYM( 559)/O 0/,ISYM( 560)/O 1377/,ISYM( 561)/O 0/
DATA ISYM( 562)/O 51524/,ISYM( 563)/O 47520/,ISYM( 564)/O 23/
DATA ISYM( 565)/O 47162/,ISYM( 566)/O 0/,ISYM( 567)/O 1377/
DATA ISYM( 568)/O 0/,ISYM( 569)/O 46525/,ISYM( 570)/O 46125/
DATA ISYM( 571)/O 24/,ISYM( 572)/O140300/,ISYM( 573)/O 0/
DATA ISYM( 574)/O 1377/,ISYM( 575)/O 0/,ISYM( 576)/O 46525/
DATA ISYM( 577)/O 46123/,ISYM( 578)/O 24/,ISYM( 579)/O140700/
DATA ISYM( 580)/O 0/,ISYM( 581)/O 1377/,ISYM( 582)/O 1727/
DATA ISYM( 583)/O 42111/,ISYM( 584)/O 53125/,ISYM( 585)/O 24/
DATA ISYM( 586)/O100300/,ISYM( 587)/O 0/,ISYM( 588)/O 1377/
DATA ISYM( 589)/O 2045/,ISYM( 590)/O 42111/,ISYM( 591)/O 53123/
DATA ISYM( 592)/O 24/,ISYM( 593)/O100700/,ISYM( 594)/O 0/
DATA ISYM( 595)/O 1377/,ISYM( 596)/O 0/,ISYM( 597)/O 40504/
DATA ISYM( 598)/O 42000/,ISYM( 599)/O 25/,ISYM( 600)/O150000/
DATA ISYM( 601)/O 0/,ISYM( 602)/O 1377/,ISYM( 603)/O 1525/
DATA ISYM( 604)/O 40504/,ISYM( 605)/O 42111/,ISYM( 606)/O 25/
DATA ISYM( 607)/O150001/,ISYM( 608)/O 0/,ISYM( 609)/O 1377/
DATA ISYM( 610)/O 1353/,ISYM( 611)/O 40504/,ISYM( 612)/O 42101/
DATA ISYM( 613)/O 25/,ISYM( 614)/O150002/,ISYM( 615)/O 0/
DATA ISYM( 616)/O 1377/,ISYM( 617)/O 1410/,ISYM( 618)/O 40504/
DATA ISYM( 619)/O 42121/,ISYM( 620)/O 25/,ISYM( 621)/O 50000/
DATA ISYM( 622)/O 0/,ISYM( 623)/O 1377/,ISYM( 624)/O 2004/
DATA ISYM( 625)/O 51525/,ISYM( 626)/O 41111/,ISYM( 627)/O 25/
DATA ISYM( 628)/O110001/,ISYM( 629)/O 0/,ISYM( 630)/O 1377/
DATA ISYM( 631)/O 1606/,ISYM( 632)/O 51525/,ISYM( 633)/O 41101/
DATA ISYM( 634)/O 25/,ISYM( 635)/O110002/,ISYM( 636)/O 0/
DATA ISYM( 637)/O 1377/,ISYM( 638)/O 2103/,ISYM( 639)/O 51525/
DATA ISYM( 640)/O 41121/,ISYM( 641)/O 25/,ISYM( 642)/O 50400/
DATA ISYM( 643)/O 0/,ISYM( 644)/O 1377/,ISYM( 645)/O 1230/
DATA ISYM( 646)/O 51525/,ISYM( 647)/O 41000/,ISYM( 648)/O 25/
DATA ISYM( 649)/O110000/,ISYM( 650)/O 0/,ISYM( 651)/O 1377/
DATA ISYM( 652)/O 0/,ISYM( 653)/O 40516/,ISYM( 654)/O 42000/
DATA ISYM( 655)/O 26/,ISYM( 656)/O140000/,ISYM( 657)/O 0/
DATA ISYM( 658)/O 1377/,ISYM( 659)/O 1362/,ISYM( 660)/O 40516/
DATA ISYM( 661)/O 42111/,ISYM( 662)/O 26/,ISYM( 663)/O140000/
DATA ISYM( 664)/O 0/,ISYM( 665)/O 1377/,ISYM( 666)/O 0/
DATA ISYM( 667)/O 47522/,ISYM( 668)/O 44400/,ISYM( 669)/O 26/
DATA ISYM( 670)/O 0/,ISYM( 671)/O 0/,ISYM( 672)/O 777/
DATA ISYM( 673)/O 1272/,ISYM( 674)/O 47522/,ISYM( 675)/O 26/
DATA ISYM( 676)/O100000/,ISYM( 677)/O 0/,ISYM( 678)/O 1377/
DATA ISYM( 679)/O 1534/,ISYM( 680)/O 42517/,ISYM( 681)/O 51000/
DATA ISYM( 682)/O 27/,ISYM( 683)/O130400/,ISYM( 684)/O 0/
DATA ISYM( 685)/O 1377/,ISYM( 686)/O 1500/,ISYM( 687)/O 42517/
DATA ISYM( 688)/O 51111/,ISYM( 689)/O 27/,ISYM( 690)/O130400/
DATA ISYM( 691)/O 0/,ISYM( 692)/O 1377/,ISYM( 693)/O 1570/
DATA ISYM( 694)/O 41515/,ISYM( 695)/O 50000/,ISYM( 696)/O 30/
DATA ISYM( 697)/O130000/,ISYM( 698)/O 0/,ISYM( 699)/O 1377/
DATA ISYM( 700)/O 1335/,ISYM( 701)/O 41515/,ISYM( 702)/O 50101/
DATA ISYM( 703)/O 30/,ISYM( 704)/O130001/,ISYM( 705)/O 0/
DATA ISYM( 706)/O 1377/,ISYM( 707)/O 0/,ISYM( 708)/O 41515/
DATA ISYM( 709)/O 50111/,ISYM( 710)/O 30/,ISYM( 711)/O 6000/
DATA ISYM( 712)/O 0/,ISYM( 713)/O 1377/,ISYM( 714)/O 0/
DATA ISYM( 715)/O 42530/,ISYM( 716)/O 43400/,ISYM( 717)/O 31/
DATA ISYM( 718)/O140500/,ISYM( 719)/O 0/,ISYM( 720)/O 1377/
DATA ISYM( 721)/O 0/,ISYM( 722)/O 41510/,ISYM( 723)/O 45400/
DATA ISYM( 724)/O 32/,ISYM( 725)/O 40600/,ISYM( 726)/O 0/
DATA ISYM( 727)/O 1377/,ISYM( 728)/O 1775/,ISYM( 729)/O 41515/
DATA ISYM( 730)/O 50115/,ISYM( 731)/O 33/,ISYM( 732)/O130410/
DATA ISYM( 733)/O 0/,ISYM( 734)/O 1377/,ISYM( 735)/O 1543/
DATA ISYM( 736)/O 40504/,ISYM( 737)/O 42130/,ISYM( 738)/O 34/
DATA ISYM( 739)/O150400/,ISYM( 740)/O 0/,ISYM( 741)/O 1377/
DATA ISYM( 742)/O 0/,ISYM( 743)/O 51525/,ISYM( 744)/O 41130/
DATA ISYM( 745)/O 34/,ISYM( 746)/O110400/,ISYM( 747)/O 0/
DATA ISYM( 748)/O 1377/,ISYM( 749)/O 0/,ISYM( 750)/O 40502/
DATA ISYM( 751)/O 41504/,ISYM( 752)/O 35/,ISYM( 753)/O140400/
DATA ISYM( 754)/O 0/,ISYM( 755)/O 1377/,ISYM( 756)/O 1444/
DATA ISYM( 757)/O 51502/,ISYM( 758)/O 41504/,ISYM( 759)/O 35/
DATA ISYM( 760)/O100400/,ISYM( 761)/O 0/,ISYM( 762)/O 1777/
DATA ISYM( 763)/O 0/,ISYM( 764)/O 46517/,ISYM( 765)/O 53105/
DATA ISYM( 766)/O 50000/,ISYM( 767)/O 36/,ISYM( 768)/O 400/
DATA ISYM( 769)/O 0/,ISYM( 770)/O 1377/,ISYM( 771)/O 1453/
DATA ISYM( 772)/O 42102/,ISYM( 773)/O 51101/,ISYM( 774)/O 40/
DATA ISYM( 775)/O 50710/,ISYM( 776)/O 0/,ISYM( 777)/O 1377/
DATA ISYM( 778)/O 0/,ISYM( 779)/O 42102/,ISYM( 780)/O 52000/
DATA ISYM( 781)/O 40/,ISYM( 782)/O 50310/,ISYM( 783)/O 0/
DATA ISYM( 784)/O 1377/,ISYM( 785)/O 1552/,ISYM( 786)/O 42102/
DATA ISYM( 787)/O 44111/,ISYM( 788)/O 40/,ISYM( 789)/O 51310/
DATA ISYM( 790)/O 0/,ISYM( 791)/O 1377/,ISYM( 792)/O 2215/
DATA ISYM( 793)/O 42102/,ISYM( 794)/O 46123/,ISYM( 795)/O 40/
DATA ISYM( 796)/O 51710/,ISYM( 797)/O 0/,ISYM( 798)/O 1377/
DATA ISYM( 799)/O 0/,ISYM( 800)/O 42102/,ISYM( 801)/O 41503/
DATA ISYM( 802)/O 40/,ISYM( 803)/O 52310/,ISYM( 804)/O 0/
DATA ISYM( 805)/O 1377/,ISYM( 806)/O 1462/,ISYM( 807)/O 42102/
DATA ISYM( 808)/O 41523/,ISYM( 809)/O 40/,ISYM( 810)/O 52710/
DATA ISYM( 811)/O 0/,ISYM( 812)/O 1377/,ISYM( 813)/O 0/
DATA ISYM( 814)/O 42102/,ISYM( 815)/O 47105/,ISYM( 816)/O 40/
DATA ISYM( 817)/O 53310/,ISYM( 818)/O 0/,ISYM( 819)/O 1377/
DATA ISYM( 820)/O 1516/,ISYM( 821)/O 42102/,ISYM( 822)/O 42521/
DATA ISYM( 823)/O 40/,ISYM( 824)/O 53710/,ISYM( 825)/O 0/
DATA ISYM( 826)/O 1377/,ISYM( 827)/O 0/,ISYM( 828)/O 42102/
DATA ISYM( 829)/O 53103/,ISYM( 830)/O 40/,ISYM( 831)/O 54310/
DATA ISYM( 832)/O 0/,ISYM( 833)/O 1377/,ISYM( 834)/O 0/
DATA ISYM( 835)/O 42102/,ISYM( 836)/O 53123/,ISYM( 837)/O 40/
DATA ISYM( 838)/O 54710/,ISYM( 839)/O 0/,ISYM( 840)/O 1377/
DATA ISYM( 841)/O 0/,ISYM( 842)/O 42102/,ISYM( 843)/O 50114/
DATA ISYM( 844)/O 40/,ISYM( 845)/O 55310/,ISYM( 846)/O 0/
DATA ISYM( 847)/O 1377/,ISYM( 848)/O 0/,ISYM( 849)/O 42102/
DATA ISYM( 850)/O 46511/,ISYM( 851)/O 40/,ISYM( 852)/O 55710/
DATA ISYM( 853)/O 0/,ISYM( 854)/O 1377/,ISYM( 855)/O 1561/
DATA ISYM( 856)/O 42102/,ISYM( 857)/O 43505/,ISYM( 858)/O 40/
DATA ISYM( 859)/O 56310/,ISYM( 860)/O 0/,ISYM( 861)/O 1377/
DATA ISYM( 862)/O 1577/,ISYM( 863)/O 42102/,ISYM( 864)/O 46124/
DATA ISYM( 865)/O 40/,ISYM( 866)/O 56710/,ISYM( 867)/O 0/
DATA ISYM( 868)/O 1377/,ISYM( 869)/O 0/,ISYM( 870)/O 42102/
DATA ISYM( 871)/O 43524/,ISYM( 872)/O 40/,ISYM( 873)/O 57310/
DATA ISYM( 874)/O 0/,ISYM( 875)/O 1377/,ISYM( 876)/O 0/
DATA ISYM( 877)/O 42102/,ISYM( 878)/O 46105/,ISYM( 879)/O 40/
DATA ISYM( 880)/O 57710/,ISYM( 881)/O 0/,ISYM( 882)/O 1377/
DATA ISYM( 883)/O 0/,ISYM( 884)/O 46105/,ISYM( 885)/O 40400/
DATA ISYM( 886)/O 42/,ISYM( 887)/O 40700/,ISYM( 888)/O 0/
DATA ISYM( 889)/O 1377/,ISYM( 890)/O 0/,ISYM( 891)/O 40523/
DATA ISYM( 892)/O 46000/,ISYM( 893)/O 43/,ISYM( 894)/O160400/
DATA ISYM( 895)/O 0/,ISYM( 896)/O 1377/,ISYM( 897)/O 0/
DATA ISYM( 898)/O 40523/,ISYM( 899)/O 51000/,ISYM( 900)/O 43/
DATA ISYM( 901)/O160000/,ISYM( 902)/O 0/,ISYM( 903)/O 1377/
DATA ISYM( 904)/O 1660/,ISYM( 905)/O 46123/,ISYM( 906)/O 46000/
DATA ISYM( 907)/O 43/,ISYM( 908)/O160410/,ISYM( 909)/O 0/
DATA ISYM( 910)/O 1377/,ISYM( 911)/O 2111/,ISYM( 912)/O 46123/
DATA ISYM( 913)/O 51000/,ISYM( 914)/O 43/,ISYM( 915)/O160010/
DATA ISYM( 916)/O 0/,ISYM( 917)/O 1377/,ISYM( 918)/O 1710/
DATA ISYM( 919)/O 41103/,ISYM( 920)/O 44107/,ISYM( 921)/O 44/
DATA ISYM( 922)/O 500/,ISYM( 923)/O 0/,ISYM( 924)/O 1377/
DATA ISYM( 925)/O 2171/,ISYM( 926)/O 41103/,ISYM( 927)/O 46122/
DATA ISYM( 928)/O 44/,ISYM( 929)/O 600/,ISYM( 930)/O 0/
DATA ISYM( 931)/O 1377/,ISYM( 932)/O 0/,ISYM( 933)/O 41123/
DATA ISYM( 934)/O 42524/,ISYM( 935)/O 44/,ISYM( 936)/O 700/
DATA ISYM( 937)/O 0/,ISYM( 938)/O 1377/,ISYM( 939)/O 0/
DATA ISYM( 940)/O 41124/,ISYM( 941)/O 51524/,ISYM( 942)/O 44/
DATA ISYM( 943)/O 400/,ISYM( 944)/O 0/,ISYM( 945)/O 1777/
DATA ISYM( 946)/O 0/,ISYM( 947)/O 41103/,ISYM( 948)/O 44107/
DATA ISYM( 949)/O 53400/,ISYM( 950)/O 47/,ISYM( 951)/O 500/
DATA ISYM( 952)/O 0/,ISYM( 953)/O 1777/,ISYM( 954)/O 2075/
DATA ISYM( 955)/O 41103/,ISYM( 956)/O 46122/,ISYM( 957)/O 53400/
DATA ISYM( 958)/O 47/,ISYM( 959)/O 600/,ISYM( 960)/O 0/
DATA ISYM( 961)/O 1777/,ISYM( 962)/O 2013/,ISYM( 963)/O 41123/
DATA ISYM( 964)/O 42524/,ISYM( 965)/O 53400/,ISYM( 966)/O 47/
DATA ISYM( 967)/O 700/,ISYM( 968)/O 0/,ISYM( 969)/O 1777/
DATA ISYM( 970)/O 0/,ISYM( 971)/O 41124/,ISYM( 972)/O 51524/
DATA ISYM( 973)/O 53400/,ISYM( 974)/O 47/,ISYM( 975)/O 400/
DATA ISYM( 976)/O 0/,ISYM( 977)/O 1377/,ISYM( 978)/O 2053/
DATA ISYM( 979)/O 46517/,ISYM( 980)/O 53105/,ISYM( 981)/O 45/
DATA ISYM( 982)/O 0/,ISYM( 983)/O 0/,ISYM( 984)/O 1777/
DATA ISYM( 985)/O 2061/,ISYM( 986)/O 46517/,ISYM( 987)/O 53105/
DATA ISYM( 988)/O 40400/,ISYM( 989)/O 45/,ISYM( 990)/O 0/
DATA ISYM( 991)/O 0/,ISYM( 992)/O 1777/,ISYM( 993)/O 0/
DATA ISYM( 994)/O 46517/,ISYM( 995)/O 53105/,ISYM( 996)/O 50400/
DATA ISYM( 997)/O 45/,ISYM( 998)/O 70000/,ISYM( 999)/O 0/
DATA ISYM(1000)/O 1377/,ISYM(1001)/O 0/,ISYM(1002)/O 46104/
DATA ISYM(1003)/O 46400/,ISYM(1004)/O 46/,ISYM(1005)/O 46000/
DATA ISYM(1006)/O 0/,ISYM(1007)/O 1377/,ISYM(1008)/O 2031/
DATA ISYM(1009)/O 51524/,ISYM(1010)/O 46400/,ISYM(1011)/O 46/
DATA ISYM(1012)/O 44200/,ISYM(1013)/O 0/,ISYM(1014)/O 1777/
DATA ISYM(1015)/O 0/,ISYM(1016)/O 46517/,ISYM(1017)/O 53105/
DATA ISYM(1018)/O 46400/,ISYM(1019)/O 46/,ISYM(1020)/O 44200/
DATA ISYM(1021)/O 0/,ISYM(1022)/O 1377/,ISYM(1023)/O 0/
DATA ISYM(1024)/O 51117/,ISYM(1025)/O 46000/,ISYM(1026)/O 43/
DATA ISYM(1027)/O160430/,ISYM(1028)/O 0/,ISYM(1029)/O 1377/
DATA ISYM(1030)/O 2125/,ISYM(1031)/O 51117/,ISYM(1032)/O 51000/
DATA ISYM(1033)/O 43/,ISYM(1034)/O160030/,ISYM(1035)/O 0/
DATA ISYM(1036)/O 1377/,ISYM(1037)/O 0/,ISYM(1038)/O 51117/
DATA ISYM(1039)/O 54114/,ISYM(1040)/O 43/,ISYM(1041)/O160420/
DATA ISYM(1042)/O 0/,ISYM(1043)/O 1377/,ISYM(1044)/O 0/
DATA ISYM(1045)/O 51117/,ISYM(1046)/O 54122/,ISYM(1047)/O 43/
DATA ISYM(1048)/O160020/,ISYM(1049)/O 0/,ISYM(1050)/O 401/
DATA ISYM(1051)/O 2133/,ISYM(1052)/O 42060/,ISYM(1053)/O 2/
DATA ISYM(1054)/O 0/,ISYM(1055)/O 0/,ISYM(1056)/O 401/
DATA ISYM(1057)/O 2141/,ISYM(1058)/O 42061/,ISYM(1059)/O 2/
DATA ISYM(1060)/O 1/,ISYM(1061)/O 0/,ISYM(1062)/O 401/
DATA ISYM(1063)/O 2147/,ISYM(1064)/O 42062/,ISYM(1065)/O 2/
DATA ISYM(1066)/O 2/,ISYM(1067)/O 0/,ISYM(1068)/O 401/
DATA ISYM(1069)/O 2155/,ISYM(1070)/O 42063/,ISYM(1071)/O 2/
DATA ISYM(1072)/O 3/,ISYM(1073)/O 0/,ISYM(1074)/O 401/
DATA ISYM(1075)/O 2163/,ISYM(1076)/O 42064/,ISYM(1077)/O 2/
DATA ISYM(1078)/O 4/,ISYM(1079)/O 0/,ISYM(1080)/O 401/
DATA ISYM(1081)/O 0/,ISYM(1082)/O 42065/,ISYM(1083)/O 2/
DATA ISYM(1084)/O 5/,ISYM(1085)/O 0/,ISYM(1086)/O 401/
DATA ISYM(1087)/O 0/,ISYM(1088)/O 42066/,ISYM(1089)/O 2/
DATA ISYM(1090)/O 6/,ISYM(1091)/O 0/,ISYM(1092)/O 401/
DATA ISYM(1093)/O 0/,ISYM(1094)/O 42067/,ISYM(1095)/O 2/
DATA ISYM(1096)/O 7/,ISYM(1097)/O 0/,ISYM(1098)/O 401/
DATA ISYM(1099)/O 0/,ISYM(1100)/O 40460/,ISYM(1101)/O 2/
DATA ISYM(1102)/O 10/,ISYM(1103)/O 0/,ISYM(1104)/O 401/
DATA ISYM(1105)/O 0/,ISYM(1106)/O 40461/,ISYM(1107)/O 2/
DATA ISYM(1108)/O 11/,ISYM(1109)/O 0/,ISYM(1110)/O 401/
DATA ISYM(1111)/O 0/,ISYM(1112)/O 40462/,ISYM(1113)/O 2/
DATA ISYM(1114)/O 12/,ISYM(1115)/O 0/,ISYM(1116)/O 401/
DATA ISYM(1117)/O 0/,ISYM(1118)/O 40463/,ISYM(1119)/O 2/
DATA ISYM(1120)/O 13/,ISYM(1121)/O 0/,ISYM(1122)/O 401/
DATA ISYM(1123)/O 0/,ISYM(1124)/O 40464/,ISYM(1125)/O 2/
DATA ISYM(1126)/O 14/,ISYM(1127)/O 0/,ISYM(1128)/O 401/
DATA ISYM(1129)/O 0/,ISYM(1130)/O 40465/,ISYM(1131)/O 2/
DATA ISYM(1132)/O 15/,ISYM(1133)/O 0/,ISYM(1134)/O 401/
DATA ISYM(1135)/O 0/,ISYM(1136)/O 40466/,ISYM(1137)/O 2/
DATA ISYM(1138)/O 16/,ISYM(1139)/O 0/,ISYM(1140)/O 401/
DATA ISYM(1141)/O 2177/,ISYM(1142)/O 40467/,ISYM(1143)/O 2/
DATA ISYM(1144)/O 17/,ISYM(1145)/O 0/,ISYM(1146)/O 401/
DATA ISYM(1147)/O 0/,ISYM(1148)/O 51520/,ISYM(1149)/O 2/
DATA ISYM(1150)/O 17/,ISYM(1151)/O 0/,ISYM(1152)/O 1001/
DATA ISYM(1153)/O 0/,ISYM(1154)/O 52523/,ISYM(1155)/O 50000/
DATA ISYM(1156)/O 2/,ISYM(1157)/O 20/,ISYM(1158)/O 0/
DATA ISYM(1159)/O 1001/,ISYM(1160)/O 0/,ISYM(1161)/O 41503/
DATA ISYM(1162)/O 51000/,ISYM(1163)/O 2/,ISYM(1164)/O 74/
DATA ISYM(1165)/O 0/,ISYM(1166)/O 401/,ISYM(1167)/O 0/
DATA ISYM(1168)/O 51522/,ISYM(1169)/O 2/,ISYM(1170)/O 174/
DATA ISYM(1171)/O 0/,ISYM(1172)/O 0/,ISYM(1173)/O 0/
DATA NET1( 1)/ 29/,NET2( 1)/ 0/,NET3( 1)/ 2/,
& NET4( 1)/ 2/,NET5( 1)/ 1/
DATA NET1( 2)/ 30/,NET2( 2)/ 0/,NET3( 2)/ 0/,
& NET4( 2)/ 3/,NET5( 2)/ 2/
DATA NET1( 3)/ 46/,NET2( 3)/ 0/,NET3( 3)/ 5/,
& NET4( 3)/ 4/,NET5( 3)/ 0/
DATA NET1( 4)/ 24/,NET2( 4)/ 0/,NET3( 4)/ 0/,
& NET4( 4)/ 5/,NET5( 4)/ 3/
DATA NET1( 5)/ 0/,NET2( 5)/ 8/,NET3( 5)/ 0/,
& NET4( 5)/ 6/,NET5( 5)/ 0/
DATA NET1( 6)/ 44/,NET2( 6)/ 0/,NET3( 6)/ -1/,
& NET4( 6)/ 5/,NET5( 6)/ 4/
DATA NET1( 7)/ 0/,NET2( 7)/ 0/,NET3( 7)/ 0/,
& NET4( 7)/ 0/,NET5( 7)/ 0/
DATA NET1( 8)/ 28/,NET2( 8)/ 0/,NET3( 8)/ 12/,
& NET4( 8)/ 9/,NET5( 8)/ 5/
DATA NET1( 9)/ 45/,NET2( 9)/ 0/,NET3( 9)/ 11/,
& NET4( 9)/ 10/,NET5( 9)/ 0/
DATA NET1(10)/ 28/,NET2(10)/ 0/,NET3(10)/ 0/,
& NET4(10)/ 11/,NET5(10)/ 15/
DATA NET1(11)/ 47/,NET2(11)/ 0/,NET3(11)/ -1/,
& NET4(11)/ 8/,NET5(11)/ 0/
DATA NET1(12)/ 40/,NET2(12)/ 0/,NET3(12)/ 16/,
& NET4(12)/ 13/,NET5(12)/ 34/
DATA NET1(13)/ 28/,NET2(13)/ 0/,NET3(13)/ 24/,
& NET4(13)/ 14/,NET5(13)/ 6/
DATA NET1(14)/ 41/,NET2(14)/ 0/,NET3(14)/ 0/,
& NET4(14)/ 15/,NET5(14)/ 0/
DATA NET1(15)/ 43/,NET2(15)/ 0/,NET3(15)/ -1/,
& NET4(15)/ -1/,NET5(15)/ 7/
DATA NET1(16)/ 45/,NET2(16)/ 0/,NET3(16)/ 20/,
& NET4(16)/ 17/,NET5(16)/ 24/
DATA NET1(17)/ 40/,NET2(17)/ 0/,NET3(17)/ 23/,
& NET4(17)/ 18/,NET5(17)/ 34/
DATA NET1(18)/ 28/,NET2(18)/ 0/,NET3(18)/ 24/,
& NET4(18)/ 19/,NET5(18)/ 8/
DATA NET1(19)/ 41/,NET2(19)/ 0/,NET3(19)/ 0/,
& NET4(19)/ -1/,NET5(19)/ 0/
DATA NET1(20)/ 35/,NET2(20)/ 0/,NET3(20)/ 22/,
& NET4(20)/ 21/,NET5(20)/ 0/
DATA NET1(21)/ 0/,NET2(21)/ 36/,NET3(21)/ 0/,
& NET4(21)/ -1/,NET5(21)/ 10/
DATA NET1(22)/ 27/,NET2(22)/ 0/,NET3(22)/ 25/,
& NET4(22)/ -1/,NET5(22)/ 16/
DATA NET1(23)/ 0/,NET2(23)/ 40/,NET3(23)/ 0/,
& NET4(23)/ 26/,NET5(23)/ 11/
DATA NET1(24)/ 0/,NET2(24)/ 38/,NET3(24)/ 0/,
& NET4(24)/ 26/,NET5(24)/ 11/
DATA NET1(25)/ 0/,NET2(25)/ 36/,NET3(25)/ 0/,
& NET4(25)/ 26/,NET5(25)/ 11/
DATA NET1(26)/ 40/,NET2(26)/ 0/,NET3(26)/ -1/,
& NET4(26)/ 27/,NET5(26)/ 0/
DATA NET1(27)/ 28/,NET2(27)/ 0/,NET3(27)/ 0/,
& NET4(27)/ 28/,NET5(27)/ 12/
DATA NET1(28)/ 46/,NET2(28)/ 0/,NET3(28)/ 31/,
& NET4(28)/ 29/,NET5(28)/ 0/
DATA NET1(29)/ 24/,NET2(29)/ 0/,NET3(29)/ 0/,
& NET4(29)/ 30/,NET5(29)/ 13/
DATA NET1(30)/ 41/,NET2(30)/ 0/,NET3(30)/ 0/,
& NET4(30)/ -1/,NET5(30)/ 0/
DATA NET1(31)/ 44/,NET2(31)/ 0/,NET3(31)/ 35/,
& NET4(31)/ 32/,NET5(31)/ 0/
DATA NET1(32)/ 28/,NET2(32)/ 0/,NET3(32)/ 0/,
& NET4(32)/ 33/,NET5(32)/ 14/
DATA NET1(33)/ 46/,NET2(33)/ 0/,NET3(33)/ 35/,
& NET4(33)/ 34/,NET5(33)/ 0/
DATA NET1(34)/ 24/,NET2(34)/ 0/,NET3(34)/ 0/,
& NET4(34)/ 35/,NET5(34)/ 13/
DATA NET1(35)/ 41/,NET2(35)/ 0/,NET3(35)/ 0/,
& NET4(35)/ -1/,NET5(35)/ 0/
DATA NET1(36)/ 45/,NET2(36)/ 0/,NET3(36)/ 37/,
& NET4(36)/ 37/,NET5(36)/ 24/
DATA NET1(37)/ 40/,NET2(37)/ 0/,NET3(37)/ 40/,
& NET4(37)/ 38/,NET5(37)/ 34/
DATA NET1(38)/ 0/,NET2(38)/ 36/,NET3(38)/ 0/,
& NET4(38)/ 39/,NET5(38)/ 0/
DATA NET1(39)/ 41/,NET2(39)/ 0/,NET3(39)/ 0/,
& NET4(39)/ 43/,NET5(39)/ 35/
DATA NET1(40)/ 24/,NET2(40)/ 0/,NET3(40)/ 41/,
& NET4(40)/ 43/,NET5(40)/ 17/
DATA NET1(41)/ 25/,NET2(41)/ 0/,NET3(41)/ 42/,
& NET4(41)/ 43/,NET5(41)/ 17/
DATA NET1(42)/ 42/,NET2(42)/ 0/,NET3(42)/ 0/,
& NET4(42)/ 43/,NET5(42)/ 17/
DATA NET1(43)/ 62/,NET2(43)/ 0/,NET3(43)/ 45/,
& NET4(43)/ 44/,NET5(43)/ 25/
DATA NET1(44)/ 62/,NET2(44)/ 0/,NET3(44)/ 0/,
& NET4(44)/ 37/,NET5(44)/ 0/
DATA NET1(45)/ 60/,NET2(45)/ 0/,NET3(45)/ 47/,
& NET4(45)/ 46/,NET5(45)/ 26/
DATA NET1(46)/ 60/,NET2(46)/ 0/,NET3(46)/ 0/,
& NET4(46)/ 37/,NET5(46)/ 0/
DATA NET1(47)/ 38/,NET2(47)/ 0/,NET3(47)/ 48/,
& NET4(47)/ 36/,NET5(47)/ 27/
DATA NET1(48)/ 33/,NET2(48)/ 0/,NET3(48)/ 50/,
& NET4(48)/ 36/,NET5(48)/ 28/
DATA NET1(49)/ 37/,NET2(49)/ 0/,NET3(49)/ 50/,
& NET4(49)/ 36/,NET5(49)/ 29/
DATA NET1(50)/ 42/,NET2(50)/ 0/,NET3(50)/ 51/,
& NET4(50)/ 36/,NET5(50)/ 30/
DATA NET1(51)/ 47/,NET2(51)/ 0/,NET3(51)/ 52/,
& NET4(51)/ 36/,NET5(51)/ 31/
DATA NET1(52)/ 43/,NET2(52)/ 0/,NET3(52)/ 53/,
& NET4(52)/ 36/,NET5(52)/ 32/
DATA NET1(53)/ 45/,NET2(53)/ 0/,NET3(53)/ -1/,
& NET4(53)/ 36/,NET5(53)/ 33/
DATA KASH( 1)/ 0/,KASH( 2)/ 573/,KASH( 3)/ 740/,KASH( 4)/ 139/
DATA KASH( 5)/1013/,KASH( 6)/ 960/,KASH( 7)/ 559/,KASH( 8)/ 16/
DATA KASH( 9)/ 328/,KASH(10)/ 594/,KASH(11)/ 608/,KASH(12)/1042/
DATA KASH(13)/ 797/,KASH(14)/ 147/,KASH(15)/ 384/,KASH(16)/ 0/
DATA KASH(17)/ 0/,KASH(18)/ 0/,KASH(19)/ 601/,KASH(20)/ 314/
DATA KASH(21)/ 916/,KASH(22)/ 300/,KASH(23)/ 279/,KASH(24)/ 24/
DATA KASH(25)/ 335/,KASH(26)/ 52/,KASH(27)/ 31/,KASH(28)/ 356/
DATA KASH(29)/ 202/,KASH(30)/ 38/,KASH(31)/ 110/,KASH(32)/ 503/
DATA KASH(33)/ 691/,KASH(34)/ 251/,KASH(35)/ 391/,KASH(36)/ 923/
DATA KASH(37)/ 9/,KASH(38)/ 531/,KASH(39)/ 209/,KASH(40)/ 293/
DATA KASH(41)/ 168/,KASH(42)/ 60/,KASH(43)/ 643/,KASH(44)/ 118/
DATA KASH(45)/ 90/,KASH(46)/ 155/,KASH(47)/ 216/,KASH(48)/ 286/
DATA KASH(49)/ 0/,KASH(50)/ 265/,KASH(51)/ 1/,KASH(52)/ 510/
DATA KASH(53)/ 67/,KASH(54)/1055/,KASH(55)/ 587/,KASH(56)/ 237/
DATA KASH(57)/ 82/,KASH(58)/ 132/,KASH(59)/ 74/,KASH(60)/ 230/
DATA KASH(61)/ 45/,KASH(62)/ 937/,KASH(63)/ 0/,KASH(64)/ 0/
END
SUBROUTINE ERR(JERNO)
CC NAM: ERR VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MACS
CC
CC ENT: JERNO > 0 - ERROR NUMBER
CC = 0 - OUTPUT TOTAL # OF ERRORS FOR CURRENT INSTRUCTION
CC = -1 - OUTPUT TOTAL # OF ERRORS FOR PROGRAM
CC
CC RTN: JERNO - N/C
CC
CC FNC: THIS ROUTINE TABLES ERROR #'S FOR EACH SOURCE STATEMENT
CC AND AT THE END OF SCAN OUTPUTS ALL ERRORS FOR IT.
CC IT OUTPUTS TOTAL # ERRORS FOR THE PROGRAM AT THE END.
CC
CC REV: N/A
CC
CCALLS PAGE
C
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT
C
DIMENSION NERR(2,10)
DATA KD1LN2/0/
DATA ITOTER/0/,LASK/42/
C*** TABLE THE ERROR FOR THIS SOURCE LINE?
IF(JERNO.LE.0) GO TO 100
IF(JERR.EQ.10) RETURN
JERR=JERR+1
NERR(1,JERR)=JERNO
NERR(2,JERR)=KOLUMN
RETURN
C*** PRINT THE ERRORS IF ANY, 0=NONE, LESS THAN 0= PRINT TOTAL
100 IF(JERNO.LT.0) GO TO 300
IF(JERR.EQ.0) RETURN
C*** PRINT EACH ERROR FOR THIS SOURCE LINE.
DO 200 K=1,JERR
KK=NERR(2,K)
DO 130 J=1,41
130 JBUF(J)=LSP
C*** NAX # CHARS TO PRINT.
IF(KK.GT.41) KK=41
IF(KK.GT.0) JBUF(KK)=LASK
C
C*** IF "NOLIST" PRINT THE SOURCE LINE HERE
C*** KD1LN2= LAST LINE # ENCOUNTERED WITH AN ERROR.
JBUF(51)=KD1LN2
IF(LIST.EQ.1) GO TO 140
IF(KARD1(1).EQ.0) GO TO 140
IF(KD1BCT.GT.41) KD1BCT=41
WRITE(LUOT,9900) KD1LNO,(KARD1(J),J=1,KD1BCT)
CALL PAGE(1)
9900 FORMAT(I4,21X,80A1)
KARD1(1)=0
140 CONTINUE
WRITE(LUOT,9980) NERR(1,K),KD1LN2,(JBUF(J),J=1,KK)
9980 FORMAT('****** ERROR ',I4,'--',I4,41A1)
CALL PAGE(1)
200 CONTINUE
C*** KEEP LINE # OF THIS ERROR.
KD1LN2=KD1LNO
ITOTER=ITOTER+JERR
JERR=0
RETURN
C*** FINAL ERROR COUNT PRINT
300 WRITE(LUOT,9970) ITOTER,KD1LN2
9970 FORMAT(/' ****** TOTAL ERRORS ',I3,'--',I4)
CALL PAGE(2)
C*** IF SOURCE GOES TO FILE, PRINT TOTAL ERRORS AT CONSOLE
IF(LUOT.NE.LULT) WRITE(LULT,9970) ITOTER,KD1LN2
RETURN
END
SUBROUTINE COMDEP
CC NAM: COMDEP VER: 1.0 DAT: 12/08/78 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: THIS ROUTINE SETS VARIABLES IN COMMON TO WHAT THE
CC COMPUTER IT IS CURRENTLY RUNNING ON REQUIRES.
CC IT ALSO SETS I/O DEVICE NUMBERS TO 6800 DEVICES.
CC DEVICE NUMBER VARIABLE NAME
CC 2 LUSI - SOURCE INPUT
CC 3 LUOT - ASSEMBLY LISTING(TO A FILE)
CC 6 LUOT - ASSEMBLY LISTING( TO PRINTER)
CC 5 LUOT - ASSEMBLY LISTING( TO CONSOLE)
CC 5 LULT - OUTPUT TO CONSOLE.
CC 5 LUCI - INPUT FROM CONSOLE.
CC 1 LUOO - ASSEMBLED OBJECT OUTPUT.
CC
CC
CC REV: N/A
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT
C
C
C
C*** IHB480 CHANGED TO HEX B180 FROM B480
DATA IB480/O130600/,IHX9K/O110000/
C*** IHB480 = $B180 HEX
IHB480 = IB480
C*** IHEX9K = 9000 HEX
IHEX9K=IHX9K
C*** # OF BYTES PER COMPUTER WORD
NBPW=2
C
C*** DEFAULT SOURCE OUTPUT DEVICE NUMBER
C
LUOT=6
C
C*** SOURCE INPUT DEVICE NUMBER
C
LUSI=2
C
C*** CONSOLE INPUT
C
LUCI=5
C
C*** CONSOLE OUTPUT
C
LULT=5
C
C*** OBJECT OUTPUT(S RECORDS) DEVICE #
LUOO=1
C*** POWER OF 2 SHIFT
C*** 'AND' MASK
KCFF=255
C*** LINE COUNT
KD1LNO=0
C*** END OF RECORD POINTER
KD1BCT=0
RETURN
END
SUBROUTINE SOUCIN(I)
CC NAM: SOUCIN VER: 1.0 DAT: 12/08/78 CMP: PDP-11
CC
CC SYS: MC68000 ASM
CC
CC ENT: N/A
CC
CC RTN: I=0=END OF FILE - I=1=END OF FILE NOT FOUND
CC
CC FNC: READ A SOURCE RECORD DEPENDING ON COMPUTER TYPE
CC
CCALLS MPUCVC
C
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
DATA IO377/O377/
9920 FORMAT(100A1)
I=1
GO TO 200
135 I=0
C*** RESET LINE COUNTER AND BUFFER POINTER
KD1BCT=0
KD1LNO=0
RETURN
200 CONTINUE
READ(LUSI,9920,END=135) KARD1
C*** UPDATE LINE COUNT
KD1LNO=KD1LNO+1
C*** REMOVE BLANK FROM UPPER BYTE
DO 300J=1,95
KARD1(J)=MPUAND(KARD1(J),IO377)
300 CONTINUE
C*** SET END OF LINE
KD1BCT=95
KARD1(96)=IEOT
RETURN
END
SUBROUTINE FILEOP(IOP)
CC NAM: FILEOP VER: 1.0 DAT 12/08/78 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: IOP - 1 = OPEN SI FILE
CC - 2 = CLOSE SI FILE
CC - 3 = REWIND SOURCE INPUT FILE FOR SECOND PASS.
CC - 4 = CLOSE OBJ FILE
CC - 5 = OPEN OBJ FILE
CC - 6 = OPEN FILE FOR LIST TO GO TO.
CC
CC RTN: N/C
CC
CC FNC: THIS ROUTINE IS FOR FILE OPERATIONS ON DIFFERENT
CC COMPUTERS, SUCH AS OPENING AND CLOSING FILES ETC.
CC
CC REV: N/A
CC
CCALLS ASSIGN
C
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT
DATA LSPP/' '/
GO TO (100,200,300,400,500,600),IOP
9910 FORMAT(100A2)
100 CONTINUE
WRITE(LULT,9900)
9900 FORMAT(' ENTER SI FILENAME')
READ(LUCI,9910) JBUF
C*** INSERT ZERO AS LAST CHAR
DO 150 I=1,10
IF(JBUF(I).NE.LSPP) J=I
150 CONTINUE
JBUF(J+1)=0
CALL ASSIGN(LUSI,JBUF,0)
GO TO 610
200 CONTINUE
CALL CLOSE(LUSI)
RETURN
300 CONTINUE
REWIND LUSI
RETURN
400 CONTINUE
CALL CLOSE(LUOO)
RETURN
500 CONTINUE
WRITE(LULT,9930)
9930 FORMAT(' ENTER OBJ FILENAME')
READ(LUCI,9910) JBUF
C*** INSERT ZERO AS LAST CHAR
DO 550 I=1,10
IF(JBUF(I).NE.LSPP) J=I
550 CONTINUE
JBUF(J+1)=0
CALL ASSIGN(LUOO,JBUF,0)
RETURN
C
C*** OPEN FILE FOR LISTING
C
600 CONTINUE
RETURN
610 CONTINUE
WRITE(LULT,9950)
9950 FORMAT(' ENTER LISTING FILENAME')
READ(LUCI,9910) JBUF
LUOT=3
C*** INSERT ZERO AS LAST CHAR
DO 650 I=1,10
IF(JBUF(I).NE.LSPP) J=I
650 CONTINUE
JBUF(J+1)=0
CALL ASSIGN(LUOT,JBUF,0)
RETURN
END
SUBROUTINE REREAD
CC NAM: REREAD VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MC68000 ASM
CC
CC ENT: ALL VARIABLES USED ARE IN COMMON
CC
CC RTN: N/A
CC
CC FNC: THIS ROUTINE INCREMENTS THE @NNN NUMBER IN A MACRO.
CC
CC REV: N/A
CC
CCALLS NONE.
C
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C*** 57 = ASCII 39 = 9
C*** IS THE COUNT > 9?
IF(KARD2(4,1).EQ.57) GO TO 100
KARD2(4,1)=KARD2(4,1)+1
RETURN
100 KARD2(4,1)=48
IF(KARD2(3,1).EQ.57) GO TO 200
KARD2(3,1)=KARD2(3,1)+1
RETURN
200 KARD2(3,1)=48
KARD2(2,1)=KARD2(2,1)+1
RETURN
END
SUBROUTINE DEBUG(II)
C THIS SUBROUTINE IS FOR DEBUGGING ONLY
C IT IS CALLED FROM 'PAGE' AND 'OUTPUT'
C
DATA I1STP/0/
GO TO (10,100),II
10 CONTINUE
I1STP=1
RETURN
100 CONTINUE
IF(I1STP.EQ.1) II=1
RETURN
END
SUBROUTINE PAR
CC NAM: PAR VER: 1.0 DAT: 12/08/78 CMP: ALL
CC PGM: PARSE ROUITNE
CC
CC SYS: MC68000 ASM
CC
CC ENT: N/A
CC RTN: N/A
CC
CC FNC: CHECK THE PARSE NET FOR THE TOKEN TYPE AND WHEN FOUND
CC DOES ITS ACTIONS.
CC
CC REV: N/A
CC
CCALLS SCN-ACT1-ACT2-ERR
CC
CC ERROR NUMBERS CALLED: 203,204,222
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
C TKNTYP DEFINED ALTERNATE SUCCESSOR ACTION
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
DIMENSION JSTACK(20)
C*** SPECIAL ALT,SUC CODE ***
DATA NONE/0/
100 KOLUMN=0
105 CALL SCN
110 JG=1
NPTR=1
LPTR=0
C*** HAVE WE CAME TO END OF FILE?
IF(TKNTYP.EQ.0) RETURN
130 CONTINUE
IF(NET2(JG).EQ.NONE) GO TO 140
C... *** DEFINED LOWER, PUSH ENTRY INTO STACK
JSTACK(NPTR)=JG
NPTR=NPTR+1
IF(NPTR.NE.20) GO TO 135
C... *** ERROR - PARSE NET STACK OVERFLOW
CALL ERR(222)
RETURN
135 CONTINUE
JG=NET2(JG)
GO TO 130
140 CONTINUE
IF(NET1(JG).EQ.TKNTYP) GO TO 170
C--- DEBUG...
C IF(IPASS.EQ.0) WRITE(LUOT,881) JG
881 FORMAT('PAR-TST,JG=',I4)
150 CONTINUE
JG=NET3(JG)
IF(JG) 200,160,130
C*** "NONE" FOUND, GET THE LAST ENTRY ON THE STACK
160 NPTR=NPTR-1
IF(NPTR.NE.0) GO TO 165
C... *** ERROR - SYNTAX ERROR
IF(IPASS.GE.0) CALL ERR(204)
IOPC=0
RETURN
165 JG=JSTACK(NPTR)
GO TO 150
C*** TOKEN TYPE FOUND
170 J5=NET5(JG)
IF(J5.EQ.NONE) GO TO 180
IF(IPASS.GE.0) GO TO 175
CALL ACT1(J5)
GO TO 180
175 CONTINUE
CALL ACT2(J5)
180 IF(KOLUMN.LE.0) GO TO 105
TKNTYP=-1
190 JG=NET4(JG)
IF(JG.LT.0) GO TO 200
IF(TKNTYP.LT.0) CALL SCN
GO TO 130
C*** "EXIT" FOUND
200 NPTR=NPTR-1
IF(NPTR.NE.0) GO TO 210
C... *** ASSURE PROPER TERMINATION OF OPERAND
IF(TKNTYP.EQ.0) RETURN
IF(KARD1(KOLUMN).EQ.LSP) RETURN
IF(IPASS.GE.0) CALL ERR(203)
RETURN
210 JG=JSTACK(NPTR)
J5=NET5(JG)
IF(J5.EQ.NONE) GO TO 190
IF(IPASS.GE.0) GO TO 220
CALL ACT1(J5)
GO TO 190
220 CONTINUE
CALL ACT2(J5)
GO TO 190
END
SUBROUTINE SCN
CC NAM: SCN VER: 1.0 DAT: 12/08/78 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: ISSUES READ TO 'SOUCIN' TO GET NEXT SOURCE LINE.
CC BREAKS IT INTO 'TOKENS'. STACKS MACROS INTO ARRAYS
CC 'KARD2' AND 'MFLD' FOR PROCESSING.
CC
CC NOTE: THIS ROUTINE IS 16-BIT MACHINE DEPENDENT DUE TO BIT
CC HANDLING IN 'TKNVA2'. IT HOLDS THE 2 MOST SIGNIFICANT
CC BYTES OF A 32-BIT NUMBER.
CC
CC REV: N/A
CC
CCALLS OUTPUT-MPUGTC-ERR-SOUCIN-LKP-REREAD-MPUPTC-KLAS-ASCBIN
CC
CC ERROR NUMBERS CALLED: 201,202,226
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
COMMON /A/LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3)
C
DIMENSION KCTB(140)
EQUIVALENCE (MFLD(11,1),MPTR)
DATA MDEP/0/
C*** MULTIPLE CHARACTER ACTION ARRAY
DATA KCTB/1,2,2,2,2,2,2,2,1,2,
& 0,-1,25,24,27,24,25,-1,-1,-1,
& 1,2,2,2,3,2,2,3,1,1,
& 5,2,4,2,6,2,3,1,1,1,
& 1,6,6,6,1,6,6,6,1,1,
& 1,2,1,1,2,1,1,6,1,1,
& 1,2,1,1,2,1,1,6,1,1,
& 1,2,2,2,2,2,1,6,1,1,
& 1,2,1,1,7,1,1,6,1,1,
& 1,2,1,2,2,2,1,6,1,1,
& 1,2,2,2,2,2,2,6,1,1,
& 1,6,6,6,2,6,6,3,1,1,
& 1,2,6,6,2,6,6,6,1,1,
& 1,1,1,1,2,1,1,6,1,1/
DATA LASK/42/,L0/48/
DATA LBS/92/,LAT/64/,LLB/60/,LRB/62/,LCM/44/,LPD/46/
C
JCC=0
IF(ICOL.NE.-2) ICOL=KOLUMN
IF(KOLUMN.GT.0) GO TO 150
C
C*** READ IN THE NEXT SOURCE RECORD
C
100 CONTINUE
101 CONTINUE
IF(KD1BCT.NE.0) CALL OUTPUT
IF(MPTR.EQ.0) GO TO 130
C
C*** MACRO EXPANSION
N1=1
C*** BLANK BUFFER TO REMOVE LAST INSTRCUTION
KD1BCT=1
DO 50 I=1,95
50 KARD1(I)=LSP
102 CONTINUE
CALL MPUGTC(KK,ISYM(MPTR),N1)
IF(KK.GT.1) GO TO 107
IF(KK.EQ.0) GO TO 1020
C*** MEXIT, ARE WE IN IFXX-ENDC?
IF(ICOL.GE.0) GO TO 1020
MPTR=MPTR+1
GO TO 102
C... *** END OF MACRO
1020 MPTR=0
MDEP=MDEP-1
IF(MDEP.EQ.0) GO TO 130
DO 103 J=1,11
MFLD(J,1)=MFLD(J,2)
103 MFLD(J,2)=MFLD(J,3)
DO 104 J=1,80
KARD2(J,1)=KARD2(J,2)
104 KARD2(J,2)=KARD2(J,3)
GO TO 102
107 N1=N1+1
IF(KK.EQ.LBS) GO TO 108
KARD1(KD1BCT)=KK
KD1BCT=KD1BCT+1
IF(KK.NE.IEOT) GO TO 102
C... *** END OF CARD
MPTR=MPTR + (N1 + NBPW - 2) / NBPW
KD1BCT=KD1BCT - 2
GO TO 140
C... *** INSERT ACTUAL PARAMETER
108 CONTINUE
CALL MPUGTC(KK,ISYM(MPTR),N1)
N1=N1+1
IF(KK.NE.LAT) GO TO 110
C... *** USE GENERATED LABEL
N=1
GO TO 116
110 KK=KK-L0
IF(KK.LT.0) GO TO 112
IF(KK.LE.9) GO TO 114
C... *** ERROR - ILLEGAL MACRO PARAMETER
112 CALL ERR(224)
GO TO 102
114 N=MFLD(KK+1,1)
IF(N.NE.0) GO TO 116
IF(KK.NE.0) GO TO 102
IF(KARD1(KD1BCT-1).NE.LPD) GO TO 102
KD1BCT=KD1BCT-1
GO TO 102
116 KK=KARD2(N,1)
N=N+1
IF(KK.EQ.0) GO TO 102
KARD1(KD1BCT)=KK
KD1BCT=KD1BCT+1
GO TO 116
C
130 CALL SOUCIN(I)
C*** I = 0 = EOF
IF(I.EQ.0) GO TO 295
C... *** COMMENT CARD?
IF(KARD1(1).NE.LASK) GO TO 140
135 IOPC=0
CALL OUTPUT
GO TO 130
C
C*** INITIALIZE FOR A NEW CARD
140 KOLUMN=1
C+++ 16-BIT - TKNVA2 = 1ST 2 BYTES IF MORE THAN 2 IN CONSTANT
TKNVA2=0
FLDN=0
DO 145 I=2,5
145 INS(I)=0
JCC=-1
ITOKEN(69)=0
C*** SETUP THE 1ST CHAR OF THE TOKEN
150 TKNSIZ=0
JC=KARD1(KOLUMN)
IF(JC.NE.LSP) GO TO 170
C... *** BLANK DELIMITER(S)
FLDN=FLDN+1
C@@@ CHECK FOR END OF OPERAND FIELD
IF(FLDN.EQ.3) GO TO 295
160 KOLUMN=KOLUMN+1
JC=KARD1(KOLUMN)
IF(JC.EQ.LSP) GO TO 160
C*** IS THIS A NULL LINE? IF SO GO PRINT IT.
IF(JCC.EQ.-1.AND.JC.EQ.4.AND.FLDN.EQ.1) GO TO 135
C*** GET CHAR CLASS
170 JCC=KLAS(JC)
C*** SET THE TOKEN'S TYPE
TKNTYP=KCTB(JCC+10)
IF(TKNTYP.LT.0) TKNTYP=JC
180 J=KCTB(JCC)
GO TO (270,190),J
C*** 1ST CHAR OF A MULTIPLE CHARACTER TOKEN
190 J=KCTB(JCC+20)
GO TO (220,250,200,260,270,280),J
C*** DISCARD CHARACTER AND CONTINUE
200 KOLUMN=KOLUMN+1
C*** CHARACTER ACTION FOR NEXT CHARACTER OF MULTI-CHAR TOKEN
JC=KARD1(KOLUMN)
JCX=KLAS(JC)*10+30+JCC
J=KCTB(JCX)
GO TO (220,250,200,260,270,280,230),J
C*** CHARACTER ACTION ROUTINE.
C*** ERROR '201' ILLEGAL CHARACTER SCANNED
220 IF(IPASS.GE.0) CALL ERR(201)
GO TO 295
C*** ' SCANNED, INCLUDE IT IF THERE ARE 2
230 IF(JC.NE.KARD1(KOLUMN+1)) GO TO 270
C*** SKIP THE NEXT CHAR IN THE RECORD (^ OR ')
KOLUMN=KOLUMN+1
C*** ADD CHARACTER TO TOKEN AND CONTINUE.
250 TKNSIZ=TKNSIZ+1
IF(TKNSIZ.LE.68) GO TO 255
C... *** ERROR '202' TOKEN OVERFLOW (OVER 70 CHARACTERS LONG)
IF(IPASS.GE.0) CALL ERR(202)
GO TO 295
255 ITOKEN(TKNSIZ)=JC
GO TO 200
C*** ADD CHARACTERS TO TOKEN AND STOP.
260 TKNSIZ=TKNSIZ+1
ITOKEN(TKNSIZ)=JC
C*** DISCARD CHARACTER AND STOP
270 KOLUMN=KOLUMN+1
C*** LEAVE CHARACTER IN STRING AND STOP
280 CONTINUE
C*** LAST CHARACTER OF A TOKEN, DO ITS ACTION
290 J=KCTB(JCC+30)
GO TO (900,300,700,800,295,600),J
C*** END OF CARD RETURN
295 TKNTYP=0
RETURN
C
C*** TOKEN ACTION ROUTINES
C
C*** VARIABLE NAME FOUND ***
C... *** STATEMENT LABEL?
300 IF(KARD1(KOLUMN).NE.58) GO TO 305
C*** LABEL:
KOLUMN=KOLUMN + 1
FLDN=0
305 IF(FLDN.NE.0) GO TO 310
C... *** INSIDE A MACRO DEFINITION?
IF(ICOL.LT.0) GO TO 150
TKNTYP=29
GO TO 900
C... *** OPCODE FIELD?
310 IF(FLDN.NE.1) GO TO 390
C... *** OPCODE FIELD - LOOKUP THE OPCODE ***
CALL LKP(-1,JSUC,JPTR)
IF(JSUC.GT.0) GO TO 320
C... *** UNDEFINED OP CODE
IF(ICOL.EQ.-2) GO TO 100
GO TO 900
320 IOPC=ISYM(JPTR)
INS(1)=ISYM(JPTR+1)
C... *** LOOKING FOR ENDC?
IF(ICOL.NE.-2) GO TO 330
INSL=0
IF(IOPC.EQ.18) NEST=NEST+1
IF(IOPC.NE.1) GO TO 100
IF(INS(1).NE.2) GO TO 100
NEST=NEST-1
IF(NEST.GE.0) GO TO 100
ICOL=0
NEST=0
GO TO 100
330 TKNTYP=30
C... *** TEST FOR MACRO CALL
IF(IOPC.NE.0) GO TO 900
C... *** INSIDE A MACRO DEFINITION?
IF(ICOL.LT.0) GO TO 900
C
C... *** MACRO CALL *** - ASSURE NOT TOO DEEP
IF(MDEP.EQ.0) GO TO 351
IF(MDEP.NE.3) GO TO 340
C... *** ERROR - NESTED TOO DEEP
CALL ERR(226)
GO TO 900
340 DO 342 J=1,11
MFLD(J,3)=MFLD(J,2)
342 MFLD(J,2)=MFLD(J,1)
DO 344 J=1,80
KARD2(J,3)=KARD2(J,2)
344 KARD2(J,2)=KARD2(J,1)
351 MDEP=MDEP+1
IP=0
MPTR=JPTR+1
C... *** INCREASE THE GENERATED MACRO NUMBER
MNUM=MNUM+1
CALL REREAD
C*** INITIALIZE THE FIELD POINTERS
DO 352 NF=1,10
352 MFLD(NF,1)=0
N2=6
NF=1
C... *** LOOK FOR OPCODE.SIZE
IF(KARD1(KOLUMN).NE.LPD) GO TO 354
MFLD(1,1)=N2
KOLUMN=KOLUMN+1
353 KK=KARD1(KOLUMN)
KOLUMN=KOLUMN+1
IF(KK.EQ.LSP) KK=0
KARD2(N2,1)=KK
N2=N2+1
IF(KK.EQ.IEOT) GO TO 380
IF(KK.NE.0) GO TO 353
C... *** SKIP TO THE START OF THE OPERAND FIELD
354 DO 355 KOLUMN=KOLUMN,KD1BCT
IF(KARD1(KOLUMN).NE.LSP) GO TO 358
355 CONTINUE
RETURN
C*** MOVE THE OPERAND TO KARD2 AND LOOK FOR COMMAS
358 NF=NF+1
IF(NF.EQ.11) GO TO 101
MFLD(NF,1)=N2
360 KK=KARD1(KOLUMN)
KOLUMN=KOLUMN+1
IF(IP.EQ.0) GO TO 365
IF(KK.NE.LRB) GO TO 370
IP=IP-1
GO TO 360
C... ** IP EQ 0
365 IF(KK.EQ.LSP) KK=IEOT
IF(KK.EQ.LCM) KK=0
IF(KK.NE.LLB) GO TO 370
IP=IP+1
GO TO 360
C... ** NOT < OR >
370 KARD2(N2,1)=KK
N2=N2+1
IF(KK.EQ.0) GO TO 358
IF(KK.NE.4) GO TO 360
C... *** END OF CARD
380 KARD2(N2-1,1)=0
GO TO 101
C
C... *** REGISTER NAME?
390 CALL LKP(1,JSUC,JPTR)
IF(JSUC.LE.0) GO TO 900
IF(ISYM(JPTR).NE.2) GO TO 900
TKNTYP=28
GO TO 900
C
C*** CONSECUTIVE ', PUT IN A BLANK
600 IF(TKNSIZ.GT.0) GO TO 605
TKNSIZ=1
ITOKEN(1)=32
605 CONTINUE
IF(IOPC.EQ.4) GO TO 625
J=2
IF(IPASS.EQ.0) J=64
I=ISIZ
C... *** LEAVE AS A STRING FOR DC.B
IF(IOPC.NE.5) GO TO 610
C... *** DC - LEAVE AS STRING IF DC.B
IF(TKNSIZ.EQ.1) GO TO 610
IF(ISIZ.LE.1) RETURN
610 CONTINUE
IF(I.EQ.0.AND.TKNSIZ.NE.1) I=J
IF(I.EQ.J.AND.TKNSIZ.GT.2) I=I+J
TKNVAL=0
NB=5-I/J*2
IF(NB.EQ.5) NB=4
C*** IF MORE THAN 4 CHARACTERS USE ONLY 4.
IF(TKNSIZ.LT.5) GO TO 615
TKNSIZ=4
CALL ERR(210)
615 CONTINUE
DO 620 J=1,TKNSIZ
CALL MPUPTC(ITOKEN(J),TKNVAL,NB)
620 NB=NB+1
TKNTYP=25
C*** TKNVAL & TKNVA2 ARE REVERSED IN MEMORY HERE AS COMPARED TO 6800
C*** REVERSE THEM.
J=TKNVAL
TKNVAL=TKNVA2
TKNVA2=J
GO TO 900
625 IADM(1,1)= -1
RETURN
C*** BINARY CONVERSION FROM CHARACTER STRING
700 CONTINUE
TKNVAL=0
C*** SET 2 MSB ALSO
TKNVA2=0
CALL ASCBIN
GO TO 900
C
C*** HEXADECIMAL CONVERSION FROM CHARACTER STRING
800 TKNVAL=0
DO 850 J=2,TKNSIZ
JC=ITOKEN(J)
I=JC-L0
IF (I.GT.9) I=I-7
C+++ 16-BIT - PUT MORE THAN 2 BYTES IN TKNVA2
IF(J.LT.6) GO TO 840
TKNVA2=ISHFT(TKNVA2,4)
TKNVA2=TKNVA2 + ISHFT(TKNVAL,-12)
840 CONTINUE
TKNVAL=ISHFT(TKNVAL,4) + I
C
C*** EXIT FROM THE SCAN SUBROUTINE...
850 CONTINUE
900 CONTINUE
RETURN
END
FUNCTION KLAS(KL)
CC NAM: KLAS VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MACS
CC
CC ENT: KL - CHARACTER FROM INPUT BUFFER 'KARD1'.
CC
CC RTN: KL - N/C
CC KLAS - SET TO CLASS
CC
CC FNC: DETERMINE THE CLASS OF A CHARACTER FROM THE INPUT
CC BUFFER AND RETURN IT.
CC
CC REV: N/A
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C*** CHARACTER SET BASE OFFSET
DATA JCOFS/31/
JL=KL-JCOFS
C*** 00-1F ARE EOT'S
IF(JL.GT.0) GO TO 925
KLAS=1
RETURN
C*** SPECIAL CHARACTERS
925 IF(JL.LE.64) GO TO 950
KLAS=9
RETURN
950 KLAS=KCLAS(JL)
RETURN
END
SUBROUTINE LKP(NTYP,NSUC,NPTR)
CC NAM: LKP VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MC68000 ASM
CC
CC ENT: NTYP - TOKEN TYPE (-1, 0 OR 1 SEE STF)
CC NSUC - N/A
CC NPTR - N/A
CC
CC RTN: NTYP - N/C
CC NSUC - -1=> NO ENTRY IN THE HASH TABLE
CC - 0=> ENTRY IN HASH, BUT NO SYMBOL IN THE TABLE
CC - >0=> ENTRY FOUND, INDEX TO SYMBOL ENTRY IN SYM
CC NPTR - NSUC= -1=> INDEX TO HASH TABLE
CC - NSUC= 0=> POINTER TO THE PREVIOUS LINK IN SYM
CC - NSUC= >0=> INDEX TO THE DATA ENTRY OF THE SYMBOL
CC
CC FNC: PACK THE TOKEN INTO COMPUTER WORDS AND SEARCH THE HASH
CC AND SYMBOL TABLE FOR THE SYMBOL.
CC
CC REV: N/A
CC
CCALLS MPUPTC-MPUAND
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
EQUIVALENCE(ITOKEN(70),ITYP1)
C*** TKNSIZ//(NUMBER BYTES PER WORD ***
KPWCT=(TKNSIZ+NBPW-1) / NBPW
KPAC(KPWCT)=0
NTYP1=MPUAND(NTYP,255)+ISHFT(KPWCT,8)
NPTR=0
NSUC=-1
DO 100 J=1,TKNSIZ
NPTR=NPTR+ITOKEN(J)
J1=J
100 CALL MPUPTC(ITOKEN(J),KPAC,J1)
NPTR=MPUAND(NPTR,63)+1
JP=KASH(NPTR)
110 IF(JP.EQ.0) RETURN
IF(ISYM(JP+1).EQ.NTYP1) GO TO 130
120 NSUC=0
NPTR=JP
JP=ISYM(JP+2)
GO TO 110
130 JPP = JP + 2
DO 140 J=1,KPWCT
JPP=JPP + 1
IF(ISYM(JPP).NE.KPAC(J)) GO TO 120
140 CONTINUE
NSUC=JP
NPTR=JP+KPWCT+3
RETURN
END
SUBROUTINE STF(KSUC,KPTR,KSIZ,KTYP)
CC NAM: STF VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MC68000 ASM
CC
CC ENT: KSUC - -1=> NO ENTRY IN HASH TABLE
CC - 0=> ENTRY IN HASH, BUT CANNOT FIND THE SYMBOL
CC - >0=> SYMBOL FOUND, INDEX TO THE SYMBOL ENTRY
CC KPTR - KSUC= -1=> INDEX TO THE HASH TABLE
CC - KSUC= 0=> POINTER TO THE PREVIOUS LINK
CC - KSUC= >0=> INDEX TO THE DATA ENTRY OF THE SYMBOL
CC KSIZ - REQUIRED SIZE OF THE DATA ENTRY
CC KTYP - -1=> DICTIONARY SYMBOL
CC - 0=> CONSTANT SYMBOL
CC - 1=> VARIABLE SYMBOL
CC
CC RTN: KSUC - INDEX TO THE SYMBOL ENTRY
CC KPTR - INDEX TO THE SYMBOL'S DATA ENTRY
CC KSIZ - N/CC
CC KTYP - N/CC
CC
CC FNC: STORE THE SYMBOL IN 'KPAC' INTO THE SYMBOL TABLE.
CC
CC REV: N/A
CC
CCALLS ERR
CC
CC ERROR NUMBERS CALLED: 221
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
EQUIVALENCE(ITOKEN(70),KTYP1)
K = 0
IF (KSUC .LE. 0) K = KPWCT + 3
260 IF (KSUC) 200,210,250
200 KASH(KPTR)=NXSYM
GO TO 220
210 ISYM(KPTR+2)=NXSYM
220 ISYM(NXSYM)=0
ISYM(NXSYM+1)=MPUAND(KTYP,255)+ISHFT(KPWCT,8)
ISYM(NXSYM+2)=0
JCX = NXSYM + 2
DO 230 J=1,KPWCT
JCX= JCX + 1
230 ISYM(JCX)=KPAC(J)
KSUC=NXSYM
IF (NXSYM + K + KSIZ - 1 .LE. LENSYM) GO TO 250
CALL ERR(221)
C*** SET POINTERS TO USE SCRATCH AREA
KPTR=NXSYM+K
RETURN
250 KPTR=NXSYM+ K
NXSYM=KPTR+KSIZ
RETURN
END
SUBROUTINE ACT1(KMD)
CC NAM: ACT1 VER: 1.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: KMD - EQUALS ACTION TO BE TAKEN UPON ENTRY AS DETERMINED
CC FROM PARSE TABLE.
CC
CC RTN: KMD - N/C
CC
CC FNC: P A S S O N E A C T I O N S
CC ------------------------------
CC PERFORM THE ACTIONS FOR THE DIFFERENT "TOKENS"
CC ENCOUNTERED DURING THE STATEMENT SCAN.
CC IT SETS ADDRESS MODE IN 'IADM' TABLE, ENTERS EXPRESSION
CC IN EXPRESSION TABLE, ENTERS NEW SYMBOL IN SYMBOL TABLE.
CC ---------------------------------------------
CC THIS SUBROUTINE IS A MODIFICATION OF "ACT2"
CC THERE MUST NOT BE ANY DIFFERENCE BETWEEN ACT1
CC AND ACT2 THAT COULD AFFECT THE ASSUMED SIZE OF
CC THE INSTRUCTIONS.
CC ----------------------------------------------
CC
CC THIS ROUTINE IS 16-BIT DEPENDENT DUE TO THE CHECK ON
CC 'TKNVA2' FOR THE 2 MOST SIGNIFICANT BYTES OF A 32-BIT #.
CC INTEGER CONSTANT 192=$C0, 128=$80($=HEX).
CC NOTE ALSO INTEGER CONSTANTS 192 & 64 ARE SPECIAL HEX
CC VALUES $C0 AND $40.
CC
CC REV: N/A
CC
CC ERROR NUMBERS CALLED: 221,225
CC
CCALLS ERR-LKP-STF-SCN-MPUPTC-BUILD1-EXP
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
COMMON /A/ NXSYM1
DIMENSION NSZ(40),MREL(40)
EQUIVALENCE (IADM(4,1),SYMTYP),(IADM(5,1),LFRF)
DATA LB/66/,LW/87/,LL/76/,LAP/39/
DATA LS/83/
DATA Z8000/O100000/
C*** OPCODE SIZES 01 02 03 04 05 06 07 08 09 10
C*** 01-10
DATA NSZ/ 0, 2, 0,-1,-1, 2, 2, 2,-1,-1,
& -1,-1,-1,-1, 2,-1,-1,-1, 0,-1,
& -1,-1,-1,-1, 2,-1, 2, 2, 2,-1,
& 0, 2, 2,-1,-1,-1,-1,-1,-1, 0/
C
C*** USE PC REL? 01 02 03 04 05 06 07 08 09 10
C*** 01-10
DATA MREL/ 0, 0, 0, 0,-1, 0, 0, 0, 1, 1,
& 1, 1,-1, 1, 1, 1, 1, 0, 0, 1,
& 1, 1, 1, 1, 0, 0, 0, 0, 0, 1,
& 0,-1, 0, 1, 0, 1, 1, 1, 1, 0/
GO TO(100,200,300,400,500,600,700,800,800,
& 1000,1100,1200,1300,1400,1500,1600,1700),KMD
C*** EXPRESSION ACTION
CALL EXP(KMD)
RETURN
C
C*** STATEMENT LABEL
C
100 CALL LKP(1,LSUC,LPTR)
C*** SAVE AS FLAG FOR FINDING MULT DEF MACRO
N1=0
IF(LSUC.LE.0) GO TO 105
IF(ISYM(LPTR).EQ.0) GO TO 110
C*** ERROR - MULTIPLE DEFINED SYMBOL
ISYM(LPTR)=IADM(7,1) + 192
GO TO 120
C*** CHECK FOR SYMBOL ALREADY USED AS MACRO OR LABEL.
105 CALL LKP(-1,N1,N2)
CALL STF(LSUC,LPTR,2,1)
C*** *** FORWARD REFERENCE
110 ISYM(LPTR)=IADM(7,1) + 64
ISYM(LPTR+1)=IPC
C+++ 16-BIT - PUT M.S.B. OF P-COUNT IN SYM TABLE.
ISYM(LSUC)=IPC2
C*** SAVE FOR BUILD1
120 ITOKEN(69)=LSUC
RETURN
C
C*** OPCODE
C
200 KSYS=1
IF(JSUC.GT.0) GO TO 210
C*** ERROR - UNDEFINED OP-CODE
KOLUMN=0
RETURN
C*** *** MACRO DEFINITION?
210 IF(IOPC.GE.0) GO TO 260
IQ=0
C*** ASSURE OPCODE IS MACRO
IF(INS(1).NE.0) CALL ERR(225)
C*** IS SYMBOL ALREADY DEF?
IF(ISYM(LPTR).EQ.192) GO TO 250
C*** CHECK FOR MULT DEF MACRO
IF(N1.LT.NXSYM1) GO TO 220
C*** SET MULT DEF FLAG
ISYM(LPTR)=192
GO TO 230
220 CONTINUE
C*** TABLE THE MACRO DEFINITION
ISYM(LPTR)=0
C*** MAKE FIRST WORD NON-ZERO FOR SYM TABLE ROUTINE 'PRSYM'
225 ISYM(LSUC)=1
C*** MAKE TYPE 255 & KEEP # OF WORDS IN NAME
ISYM(LSUC+1)=ISYM(LSUC+1)+254
C*** *** CALL FOR OPCODE FIELD
230 KOLUMN=-1
CALL SCN
C*** *** FIND # FIELDS AND CHECK FOR ENDM
NF=3
IF(TKNTYP.NE.30) GO TO 234
IF(IOPC.GT.0) GO TO 232
IF(IOPC.EQ.0) GO TO 234
IF(INS(1).EQ.0) CALL ERR(225)
IF(INS(1).NE.1) GO TO 231
C*** ENDM
ISYM(LPTR+1)=0
KOLUMN=0
RETURN
C
C*** MEXIT
231 LPTR=LPTR+1
CALL MPUPTC(1,ISYM(LPTR),1)
GO TO 230
232 IF(IOPC.LT.4) NF=2
C*** *** PACK THE CARD INTO SYM
234 N1=1
N2=1
236 KK=KARD1(N1)
N1=N1+1
238 CALL MPUPTC(KK,ISYM(LPTR+1),N2)
N2=N2+1
IF(KK.NE.LAP) GO TO 240
C*** *** QUOTE FOUND
IQ=IQ+1
IF(IQ.EQ.2) IQ=0
240 IF(IQ.NE.0) GO TO 244
IF(KK.NE.LSP) GO TO 244
NF=NF-1
IF(NF.NE.0) GO TO 242
KK=4
GO TO 238
242 KK=KARD1(N1)
IF(KK.NE.LSP) GO TO 244
N1=N1+1
GO TO 242
244 IF(KK.NE.4) GO TO 236
C*** *** END OF CARD
NW=(N2 + NBPW -2) / NBPW
LPTR=LPTR+NW
NXSYM=NXSYM+NW
IF(NXSYM.LE.LENSYM-100) GO TO 230
C*** *** SYMBOL TABLE OVERFLOW
CALL ERR(221)
RETURN
C*** MULT DEF MACRO AND LABEL-FLUSH OUT MACRO AND LEAVE SYBOL
C*** TABLE DEFINED AS LABEL INSTEAD OF MACRO
250 CONTINUE
KOLUMN= -1
CALL SCN
IF(INS(1).NE.1) GO TO 250
KOLUMN=0
RETURN
C*** LOOKUP TENTATIVE INST. LENGTH
260 IF(IOPC.LE.0) RETURN
INSL=NSZ(IOPC)
ISIZ=2
IADM(5,2)=0
LFRF=0
IADM(1,1)=0
IF(INSL.GE.0) GO TO 265
C*** *** VARIABLE SIZE
CALL EXP(21)
RETURN
C*** *** FIXED SIZE
265 KOLUMN=0
RETURN
C
C*** DATA SIZE
C
300 IF(ITOKEN(1).EQ.LB) ISIZ=0
IF(ITOKEN(1).EQ.LL) ISIZ=4
IF(ITOKEN(1).EQ.LS) ISIZ=0
RETURN
C
C*** COMMA STARTING FIELD-2 OPERAND ***
C
C
400 CALL EXP(21)
IF(IOPC.NE.4) GO TO 410
C*** DC - FORCE DATA OUT
CALL BUILD1
RETURN
410 IF(IOPC.GE.19) GO TO 420
C*** *** OPCODE REQUIRES ONLY ONE OPERAND
KOLUMN=0
RETURN
420 IF(KSYS.EQ.2) KOLUMN=0
KSYS=2
TKNVA2=0
RETURN
C
C*** OPERAND - REGISTER
C
500 IADM(1,KSYS)=0
C*** *** ADDR REGISTER?
IF(ISYM(JPTR+1).GT.7) IADM(1,KSYS)=8
RETURN
C
C*** REGISTER INDIRECT MODE ***
C
600 CONTINUE
IADM(1,KSYS)=16
RETURN
C
C*** POST INCREMENT ***
C
700 CONTINUE
IADM(1,KSYS)=24
RETURN
C
C*** PRE DECREMENT ***
C
800 CONTINUE
IADM(1,KSYS)=32
RETURN
C
C*** IMMEDIATE OPERAND ***
C
C
1000 CALL EXP(37)
KK=ISIZ
IF(KK.EQ.0) KK=2
IADM(1,KSYS)=60
IF(INSL.GT.0) GO TO 1010
C*** *** FIRST FIELD
INSL=2
1010 INS(3)=TKNVAL
C+++ 16-BIT - MOST SIGNIFICANT BYTE OF P-COUNT
INS(2)=TKNVA2
INSL=INSL + KK
RETURN
C
C*** DISPLACEMENT ***
C
1100 IADM(1,KSYS)=56
CALL EXP(37)
C
K=2
C*** PC REL?
IF(IADM(4,KSYS).EQ.1) GO TO 1110
IF(IADM(5,KSYS).EQ.0) GO TO 1105
C*** DEFAULT FORWARD REFERENCES TO 2 OR 4 BYTES
IF(IADM(7,2).EQ.1) K=4
GO TO 1110
C+++ 16-BIT
1105 IF(TKNVA2.EQ.-1) GO TO 1110
C*** CHECK FOR ADDRESS FROM FF8000-FFFFFF
I=MPUAND(TKNVAL,Z8000)
IF(I.EQ.Z8000.AND.TKNVA2.EQ.KCFF) GO TO 1110
IF(TKNVA2.NE.0) K=4
C*** ADDR >$7FFF IS LONG ADDR.
IF(I.NE.0.AND.TKNVA2.EQ.0) K=4
1110 IF(INSL.LT.0) GO TO 1120
C*** *** SECOND FIELD
INSL=INSL + K
1115 IF(K.EQ.4) IADM(1,KSYS)=57
RETURN
C*** *** FIRST FIELD
1120 INSL=K + 2
INS(3)=TKNVAL
C+++ 16-BIT - MOST SIGNIFICANT BYTE OF P-COUNT
INS(2)=TKNVA2
GO TO 1115
C
C*** REGISTER FOR 3(A1) ADDRESSING MODE ***
C
1200 CONTINUE
C*** TEST FOR ORG.L ALREADY SET ADDR MODE
IF(IADM(1,KSYS).EQ.57) INSL=INSL-2
RETURN
C
C*** .L FOR 3(A1.L) ADDRESSING MODE ***
C
1300 RETURN
C
C*** SECOND REGISTER FOR 3(A1,A2) ADDRESSING MODE ***
C
1400 RETURN
C
C*** SECOND REGISTER OF R1-R2 FOR LDM,STM
C
1500 RETURN
C
C*** 'STRING' GT 4 BYTES (DC ONLY)
C
1600 INS(3)=TKNSIZ
IADM(1,1)=-1
RETURN
C
C*** CONSTANT OR VARIABLE OPERAND ***
C
1700 CONTINUE
IADM(4,KSYS)=0
C
IF(TKNTYP.EQ.24) GO TO 1710
C*** CONSTANT OPERAND
IF(TKNTYP.NE.42) GO TO 1730
C*** ASTERISK
IADM(4,KSYS)=IADM(7,1)
TKNVAL=IPC
TKNVA2=IPC2
GO TO 1730
C*** DEFINED PREVIOUSLY?
1710 IF(JSUC.GT.0) GO TO 1720
C*** NEW DEFINITION, PUT IN SY.
CALL STF(JSUC,JPTR,2,1)
ISYM(JPTR)=0
ISYM(JPTR+1)= 0
1720 IF(MPUAND(ISYM(JPTR),192).EQ.0) IADM(5,KSYS)=1
TKNVAL=ISYM(JPTR+1)
TKNVA2=ISYM(JSUC)
C*** PC REL?
IF(MPUAND(ISYM(JPTR),7).EQ.1) IADM(4,KSYS)=1
C*** *** GIVE OPERAND TO EXP
1730 CALL EXP(22)
RETURN
END
SUBROUTINE BUILD1
CC NAM: BUILD1 VER: 10.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: BUILD THE INSTRUCTION FOR PASS ONE
CC USES INFORMATION IN TABLE 'IADM', AND 'INS' ARRAY.
CC
CC REV: N/A
CC
CCALLS MPUAND-ERR-MOD2-IABS-PAGE
CC
CC ERROR NUMBERS CALLED: 223,229,239,240
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,PLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
COMMON /A/ NXSYM1
DIMENSION IMCD(6),NIMM(40)
EQUIVALENCE (IADM(4,1),SYMTYP)
DATA MASK2/0/,Z7000/O70000/,Z8000/O100000/,Z7100/O70400/
DATA ZB001/O130001/,ZD001/O150001/,ZD002/O150002/
DATA Z9001/O110001/,Z9002/O110002/,ZF000/O170000/
C ORI SUBI EORI CMPI ANDI ADDI
DATA IMCD/ 0000, 1024, 2560, 3072, 512, 1536/
DATA NIMM/
& 0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,1,
& 1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0/
C
IF(ISIZ.EQ.0) ISIZ=1
C
C*** PERFORM ACTIONS FOR THE OPCODE CLASS
IF(IOPC.GT.0) GO TO 1620
INSL=0
RETURN
1620 IF(INSL.LT.0) INSL=2
GO TO(100, 200,9223,400,500, 600, 700, 800, 900, 1000,
& 1100,1200,1300,1400,1500,1600,1700,1800,1900),IOPC
J=IOPC-19
GO TO(2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,
& 9223,3200,9223,3400,3500,3600,3700,3800),J
J=J-19
GO TO(3900),J
GO TO 9223
C
C*** PSEUDO OPS WITHOUT OPERANDS
100 INS1=INS(1)
GO TO(110,120,120,130,140,150,170,180,120,120,120,197),INS1
C... *** END
110 IPASS=0
IPC2=0
IPC=0
MNUM=0
C*** SLEW & PRINT HEADER IF PASS 1 ERRORS
CALL PAGE(82)
KD1LNO=0
REWIND LUSI
C*** RESET TO START OF PASS 1
LIST=1
RETURN
120 RETURN
C*** LIST ***
130 LIST=1
RETURN
C
C*** NOLIST ***
140 LIST=0
RETURN
C*** TTL
150 CONTINUE
RETURN
C*** NOPAGE
170 CONTINUE
NOP=0
RETURN
C
C*** NOOBJ - NO OBJECT OUTPUT
C
180 CONTINUE
IOBJ=0
RETURN
197 CONTINUE
C*** MASK2 DIRECTIVE
MASK2=1
TKNSIZ=4
C*** FIND ROOM FOR 'DCNT'
ITOKEN(1)=68
ITOKEN(2)=67
ITOKEN(3)=78
ITOKEN(4)=84
CALL LKP(-1,LSUC,LPTR)
C*** PUT 'DCNT' IN SYMM TABLE
CALL STF(LSUC,LPTR,2,-1)
ISYM(LPTR)=32
C*** SET OPCODE
ISYM(LPTR+1)=Z7100
NXSYM1=NXSYM
C*** FIND 'DBRA'
ITOKEN(1)=68
ITOKEN(2)=66
ITOKEN(3)=82
ITOKEN(4)=65
CALL LKP(-1,LSUC,LPTR)
IF(LSUC.LE.0) GO TO 199
DO 198 I=1,16
ISYM(LSUC+3)=LSP
LSUC=LSUC+ISHFT(ISYM(LSUC+1),-8)+5
198 CONTINUE
C*** CHANGE OPCODE OF 'STOP' TO 2
ITOKEN(1)=83
ITOKEN(2)=84
ITOKEN(3)=79
ITOKEN(4)=80
CALL LKP(-1,LSUC,LPTR)
IF(LSUC.LE.0) GO TO 199
ISYM(LPTR)=2
RETURN
9900 FORMAT(' SYMBOL DBRA NOT FOUND')
199 WRITE(LULT,9900)
RETURN
C
C
C*** OP CODES WITHOUT OPERANDS
200 RETURN
C
400 INSL=0
C
C*** DC
IF(IADM(1,1).GE.0) GO TO 410
C*** 'STRING'
KK=INS(3)
I=MOD(INS(3),ISIZ)
IF(I.NE.0) KK=KK-I+ISIZ
GO TO 415
410 KK=ISIZ
415 I=0
GO TO 545
C
C*** PSEUDO OPS WITH OPERANDS
500 INSL=0
INS1=INS(1)
GO TO(510,520,520,540,550,560,570),INS1
GO TO 9223
C... *** ORG
510 IPC=INS(3)
C+++ 16-BIT - GET MOST SIGNIFICANT BYTE
IPC2=INS(2)
IADM(7,1)=0
IADM(7,2)=0
IF(ISIZ.EQ.4) IADM(7,2)=1
GO TO 530
C... *** EQU
520 IF(LPTR.GT.0) GO TO 522
C... *** ERROR - NO LABEL ON STATEMENT
CALL ERR(229)
RETURN
522 ISYM(LPTR)=MPUAND(ISYM(LPTR),192) + SYMTYP
ISYM(LPTR+1)=INS(3)
IF(INS(1).EQ.2) GO TO 525
C... *** 'SET' DIRECTIVE, ALLOW REDEFINITION
ISYM(LPTR)= SYMTYP + 64
C+++ 16 BIT PUT M.S.B. OF ADDRESS IN SYM TABLE.
C*** LSUC HAS BEEN SAVE IN 'ACT1'
525 KK=ITOKEN(69)
ISYM(KK)=INS(2)
C*** FORWARD REF ILLEGAL
530 IF(IADM(5,1).EQ.1) GO TO 9240
RETURN
C
C*** DS
C
C*** KK=INS(3)*ISIZ
540 I=0
KK=ISIZ
CALL MUL(I,KK,INS(2),INS(3))
C*** CHECK FOR A FORWARD REFERERENCE WHICH IS ILLEGAL
IF(IADM(5,1).EQ.1) GO TO 9240
545 LPTR=0
C*** IPC=IPC + KK
CALL ADD(IPC2,IPC,I,KK)
IF(ISIZ.NE.1) CALL MOD2
RETURN
C
C*** RORG
C
550 IPC=INS(3)
C+++ 16-BIT - GET MOST SIGNIFICANT BYTE
IPC2=INS(2)
IADM(7,1)=1
IADM(7,2)=0
RETURN
C
C*** FAIL
C
560 RETURN
C
C*** SPC ***
C
570 CONTINUE
RETURN
C
C*** LINK/UNLK - ADDRESS REGISTER TO BITS 2-0
C
600 CONTINUE
C*** CHECK FOR LINK - 20048 = $4E50 = LINK
IF(INS(1).EQ.20048) INSL=4
RETURN
C
C*** SWAP - DATA REGISTER TO BITS 2-0
C
700 RETURN
C
C*** TRAP - ESTABLISH DISPLACEMENT IN BITS 3-0
C
800 RETURN
C
C*** ABS/CLR/NEG/NOT/TST - BUILD EA
C
900 RETURN
C
C*** NBCD
C
1000 RETURN
C
C*** PEA
C
1100 RETURN
C
C*** JSR,JMP
C
1200 CONTINUE
RETURN
C
C*** BCC
C
1300 CONTINUE
IF(INSL.EQ.6) INSL=4
IF(ISIZ.NE.1) GO TO 1310
C*** FORCE SHORT FORM
INSL=2
RETURN
1310 IF(INS(3).EQ.-1) RETURN
C*** IS IT A FORWARD REFERENCE?
IF(IADM(5,1).EQ.1) RETURN
C... *** BACKWARD REFERENCE
IOFS=INS(3)-IPC-2
IF(IABS(IOFS).LE.127) INSL=2
RETURN
C
C*** NEGX
C
1400 RETURN
C
C*** EXT
C
1500 RETURN
C
C*** TAS
C
1600 RETURN
C
C*** SCC
1700 RETURN
C
C*** CONDITIONAL ASSEMBLY
C
1800 INSL=0
INS1=INS(1)
GO TO(1810,1820),INS1
C... *** EQ
C
1810 IF(INS(3).NE.0) GO TO 1890
IF(INS(2).NE.0) GO TO 1890
RETURN
C... *** NE
1820 IF(INS(3).EQ.0.AND.INS(2).EQ.0) GO TO 1890
RETURN
C... *** SKIP TO ENDC
1890 ICOL=-2
RETURN
C
C*** PAGE LENGTH(PLEN) - LINE LENGTH(LLEN)
C
1900 CONTINUE
IF(INS(1).GT.2) INSL=4
RETURN
C
C*** MULTIPLY,DIVIDE
C
2000 RETURN
C
C*** ADD/SUB PROCESSING
C
2100 CONTINUE
IF(IADM(1,2).EQ.8.AND.ISIZ.EQ.1) RETURN
C*** ADD1/SUBQ? IF SO FORCE QUICK
C*** 20480=$5000 - 20736 = $ 5100
IF(INS(1).EQ.20480.OR.INS(1).EQ.20736) GO TO 2120
IF(INS(3).LE.0) RETURN
IF(INS(3).GT.8) RETURN
C*** TEST FOR IMMEDIATE SOURCE
IF(IADM(1,1).NE.60) RETURN
C*** ADD1/SUBI? IF SO FORCE IT
IF(INS(1).EQ.ZD001.OR.INS(1).EQ.Z9001) RETURN
C*** ADDA/SUBA?
IF(INS(1).EQ.ZD002.OR.INS(1).EQ.Z9002) RETURN
C... *** QUICK MODE
2120 INSL=INSL - 2
IF(ISIZ.EQ.4) INSL= INSL - 2
RETURN
C
C*** AND,OR
C
2200 RETURN
C
C*** EOR
2300 RETURN
C
C*** CMP
C
2400 RETURN
C
C*** EXG
C
2500 RETURN
C
C*** CHK
C
2600 RETURN
C
C*** CMPM
C
2700 RETURN
C
C*** ADDX,SUBX
C
2800 RETURN
C
C*** ABCD,SBCD
C
2900 RETURN
C
C*** MOVEP
C
3000 RETURN
C
C*** DCNT
C
3200 IF(MASK2.EQ.0) INSL=4
RETURN
C
C*** LEA
C
3400 RETURN
C
C*** SHIFTS
C
3500 CONTINUE
IF(IADM(1,1).EQ.60.AND.ISIZ.EQ.4) INSL=INSL-2
C*** ALLOW #BIT NUMBER ALSO
IF(IADM(1,1).EQ.60) IADM(1,1)=56
IF(IADM(1,1).EQ.56) INSL=INSL-2
RETURN
C
C*** BIT INSTRUCTIONS
C
3600 CONTINUE
IF(IADM(1,1).EQ.60.AND.ISIZ.EQ.4) INSL=INSL-2
IF(MASK2.NE.1) RETURN
I=MPUAND(INS(5),1)
IF(I.EQ.0) RETURN
GO TO 3930
3900 IF(MASK2.NE.0) RETURN
IF(INS(3).GT.7) RETURN
3930 CONTINUE
IF(IADM(1,2).NE.16) RETURN
INSL=INSL+2
IADM(1,2)=40
IADM(3,2)=1
RETURN
C
C*** MOVE INSTRUCTION
C*-* TEST FOR IMMEDIATE SOURCE AND D SINK
3700 CONTINUE
C*** MOVEQ?
IF(INS(1).EQ.Z7000) GO TO 3705
IF(IADM(1,1).NE.60) RETURN
IF(IADM(1,2).NE.0) RETURN
C *-* MOVE #,D - CAN W USE LDQ?
C
IF(ISIZ.NE.4) GO TO 3710
C*** FORWARD REFERENCE?
IF(IADM(5,1).EQ.1) RETURN
IF(INS(3).LT. -127) RETURN
IF(INS(3).GT.127) RETURN
C*** IS VALUE TO BIG FOR MOVEQ DEFAULT?
IF(INS(2).NE.0.AND.INS(2).NE.-1) RETURN
C*** DON'T DEFAULT TO MOVEQ FOR VALID 16 BIT POSITIVE #
IF(INS(2).EQ.0.AND.MPUAND(TKNVAL,Z8000).NE.0) RETURN
C * -* USE LDQ
3705 INSL=2
RETURN
C
C*** USE 4 BYTES FOR MOVE #,REG
3710 CONTINUE
INSL=4
RETURN
C
C*** LDM,STM
C
3800 INSL=INSL+2
RETURN
C
C*** ERROR RETURNS
C
C... *** UNDEFINED ACTION (INTERNAL ERROR)
C
9223 CALL ERR(223)
RETURN
C
C*** ILLEGAL FORWARD REFERENCE
C
9240 CONTINUE
CALL ERR(240)
RETURN
END
SUBROUTINE EXP(NACT)
CC
CC NAM: EXP VER:1.00 DATE: 12/11/78 CMP: PDP-11
CC SYS: MACS
CC
CC ENT: NACT - 1 = INITIALIZE
CC 2 = OPERAND (VALUE IN TKNVAL)
CC 3 = RESERVED
CC 4 = OPERATOR: UNARY MINUS
CC 5 = >> (SHIFT RIGHT)
CC 6 = << (SHIFT LEFT)
CC 7 = & (AND)
CC 8 = ^ (OR)
CC 9 = % (EOR)
CC 10 = * (MPY)
CC 11 = YMTYP/IADM(4,K (DIV)
CC 12 = + (ADD)
CC 13 = - (SUB)
CC 14 = ( (OPEN PREN)
CC 15 = ) (CLOSE PAREN)
CC 16 = I- (BGN EXPR)
CC 17 = -I (END EXPR)
CC
CC RTN: TKNVAL = VALUE OF THE EXPRESSION
CC IADM(4,KSYS) = MODE OF THE RESULT
CC 0 = ABSOLUTE
CC 1 = RELATIVE
CC KSYS=1=1ST OPERAND
CC KSYS=2=2ND OPERAND
CC
CC FNC: PERFORMS EXPRESSION RECOGNIZE BY BOTTOM UP OPERATOR
CC PRECEDENT.
CC
CC REV: NYMTYP/IADM(4,KA
CC
CCALLS MPUIOR-ERR-ISHFT-MPUAND
CC
CC ERROR NUMBERS CALLED: 223,237
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
DIMENSION STK1(20),STK2(20),FVTAB(17),ACTAB(17)
DIMENSION STK11(20)
C
C - > < & ^ % * / + - ( ) 4 5
DATA FVTAB/0,0,0,7,6,6,5,5,5,4,4,3,3,2,2,1,1/
DATA ACTAB/0,0,0,3,4,4,4,4,4,4,4,4,4,2,2,1,1/
C
KACT=NACT-20
C 1 2 3 4 5 6 7 8 9 10
GO TO ( 10, 20,999,200,200,200,200,200,200,200,
& 200,200,200,240,200,999,200),KACT
C
C*** INITIALIZE
C
10 NDX=1
LOP=16
STK1(1)=LOP
RETURN
C
C*** OPERAND
C
20 NDX=NDX+1
STK1(NDX)=TKNVAL
STK2(NDX)=IADM(4,KSYS)
C*** SAVE UPPER 2 BYTES
STK11(NDX)=TKNVA2
TKNVA2=0
RETURN
C
C*** OPERATORS
C
200 FVOP1=FVTAB(KACT)
205 IF(FVOP1.LE.FVTAB(LOP)) GO TO 1000
240 LOP=KACT
NDX=NDX +1
STK1(NDX)=KACT
RETURN
C
C*** UNSTACK THE OPERATION
C
1000 J=ACTAB(LOP)
GO TO (1010,1020,1030,1040),J
C
C*** BEGIN EXPRESSION - END EXPRESSION
C
1010 TKNVAL=STK1(2)
IADM(4,KSYS)=STK2(2)
C*** SET POSSIBLE NUMBER >$FFFF
TKNVA2=STK11(2)
RETURN
C
C*** LEFT PAREN - RIGHT PAREN
C
1020 NDX=NDX-1
STK1(NDX)=STK1(NDX+1)
STK11(NDX)=STK11(NDX+1)
STK2(NDX)=STK2(NDX+1)
LOP=STK1(NDX-1)
RETURN
C
C*** UNARY MINUS
C
1030 KK= STK1(NDX)
S1= STK2(NDX)
S2= 0
KK1= STK11(NDX)
C*** COMPLEMENT THE #
CALL NEGATE(KK1,KK)
NDX=NDX-1
GO TO 3000
C
C** ARITHMETIC OPERATOR
C
1040 NDX=NDX-2
A= STK1(NDX)
A1=STK11(NDX)
S1=STK2(NDX)
B= STK1(NDX+2)
B1=STK11(NDX+2)
S2=STK2(NDX+2)
C
C*** PERFORM THE OPERATION
C
GO TO ( 999, 999, 999, 999,2050,2060,2070,2080, 999,
& 2100,2110,2120,2130),LOP
C
C*** SHIFT RIGHT
2050 B= -B
C
C***
C
2060 KK=ISHFT(A,B)
GO TO 3000
C
C*** AND
C
2070 KK=MPUAND(A,B)
GO TO 3000
C
C*** OR
C
2080 KK=MPUIOR(A,B)
GO TO 3000
C
C*** MPY
C
2100 CONTINUE
C*** USE REG MPY IF NEG #'S
IF(B1.EQ.-1.AND.A1.EQ.-1) GO TO 2108
C*** GO MPY
2102 CALL MUL(A1,A,B1,B)
KK=A
KK1=A1
GO TO 3000
2108 A1=0
B1=0
GO TO 2102
C
C*** DIV
C
2110 CONTINUE
IF(A1.EQ.-1.AND.B1.EQ.-1) GO TO 2118
C*** IS IT DIV BY ZERO?
IF(B.EQ.0.AND.B1.EQ.0) GO TO 2900
CALL DIV(A1,A,B1,B)
KK=A
KK1=A1
GO TO 3000
2118 KK=A/B
KK1=0
GO TO 3000
C
C*** ADD
C
2120 CALL ADD(A1,A,B1,B)
KK=A
KK1=A1
GO TO 3100
C
C*** SUB
C
2130 CALL SUB(A1,A,B1,B)
KK=A
KK1=A1
IF(S1.EQ.S2) S1 =0
GO TO 3200
2900 KK=0
KK1=0
C
C*** ASSURE VALID OPERATION FOR OPERAND MODES
C
C... *** DISALLOW REL,XXX
3000 IF(S1.EQ.0) GO TO 3100
IF(IPASS.GE.0) CALL ERR(237)
C... *** DISALLOW XXX,REL
3100 IF(S2.EQ.0) GO TO 3200
IF(IPASS.GE.0) CALL ERR(237)
C
C... *** ALLOW ANY MODE
C
3200 STK1(NDX)=KK
STK2(NDX)=S1
STK11(NDX)=KK1
LOP=STK1(NDX-1)
GO TO 205
C
C*** ERROR EXIT
C
999 CALL ERR(223)
RETURN
END
SUBROUTINE RANGE(KK)
CC NAM: RANGE VER: 1.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: KK - NUMERIC VALUE TO BE CHECKED FOR SIZE
CC
CC RTN: KK - N/C
CC
CC FNC: VALIDATE NUMERIC RANGE VALUES IN #N TYPE STATEMENTS
CC
CC REL: N/A
CC
CCALLS ERR-ISHFT
CC
CC ERROR NUMBERS CALLED: 210
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
KKK=KK
IF(ISIZ.EQ.128) RETURN
C*** WORD OR BYTE?
IF(ISIZ.EQ.0) GO TO 100
C*** CHECK UPPER 2 BYTES
IF(TKNVA2.EQ.0) RETURN
IF(TKNVA2.NE.-1) GO TO 210
RETURN
100 CONTINUE
C
IF(TKNVA2.GT.0) GO TO 210
JJ=ISHFT(KKK,-8)
IF(JJ.EQ.0) RETURN
IF(JJ.EQ.255) RETURN
210 CALL ERR(210)
RETURN
END
SUBROUTINE ACT2(KMD)
CC NAM: ACT2 VER: 1.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: KMD - EQUALS ACTION TO BE TAKEN AS FOUND
CC IN THE PARSE TABLE.
CC
CC RTN: N/C
CC
CC FNC: P A S S T W O A C T I O N S
CC ------------------------------
CC PERFORM THE ACTIONS FOR THE DIFFERENT "TOKENS"
CC ENCOUNTERED DURING THE STATEMENT SCAN.
CC SETS UP 'IADM' TABLE, ENTERS EXP IN EXP TABLE.
CC
CC THIS ROUTINE IS 16-BIT DEPENDENT DUE TO THE CHECK ON
CC 'TKNVA2' FOR THE 2 MOST SIGNIFICANT BYTES OF A 32-BIT #.
CC INTEGER CONSTANT 192=$C0, 128=$80($=HEX).
CC
CC REV: N/A
CC
CCALLS ERR-LKP-SCN-OUTPUT-RANGE-MASK-EXP-MPUGTC
CC IABS-ISHFT-MPUAND-MPUIOR
CC
CC ERROR NUMBERS CALLED: 205,206,207,208,209,212,213,214,219,227
CC 228,231,234,235
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/LIST,ICOL,NEST
DIMENSION NSZF(40),NSZ(40),MREL(40)
EQUIVALENCE(IADM(4,1),SYMTYP),(IADM(5,1),LFRF)
DATA LB/66/,LW/87/,LL/76/,LAP/39/
DATA LS/83/
C*** 0 = UNSIZED INSTRUCTION
C*** 1 = B,W,L ALLOWED
C*** 2 = B ONLY
C*** 66 = W ONLY
C*** 130 = L ONLY
C*** SIZE SUBFIELD ALLOWED? ***
DATA NSZF/
& 0,0,0,1,1,0,66,0,1,2,130,0,-1,1,1,2,0,0,0,66,
& 1,1,1,1,130,66,1,1,2,1,0,0,1,130,1,1,1,1,1,0/
C OPCODE SIZES 01 02 03 04 05 06 07 08 09 10
C*** 01-10
DATA NSZ/ 0, 2, 0,-1,-1,-1, 2,-1,-1,-1,
& -1,-1,-1,-1, 2,-1,-1, 0, 0,-1,
& -1,-1,-1,-1, 2,-1, 2, 2, 2,-1,
& 0,-1, 2,-1,-1,-1,-1,-1,-1, 0/
C USE PC REL? 01 02 03 04 05 06 07 08 09 10
C*** 01-10
DATA MREL/ 0, 0, 0, 0,-1, 0, 0, 0, 1, 1,
& 1, 1,-1, 1, 1, 1, 1, 0, 0, 1,
& 1, 1, 1, 1, 0, 0, 0, 0, 0, 1,
& 0,-1, 0, 1, 0, 1, 1, 1, 1, 0/
DATA Z8000/O100000/
C
GO TO(100,200,300,400,500,600,700,800,800,
& 1000,1100,1200,1300,1400,1500,1600,1700),KMD
C*** EXPRESSION ACTION
CALL EXP(KMD)
RETURN
C
C*** STATEMENT LABEL
C
100 CALL LKP(1,LSUC,LPTR)
IF(LSUC.LE.0) RETURN
IR=ISYM(LPTR)
KR=MPUAND(IR,192)
C
C*** SAVE FOR BUILD2
ITOKEN(69)=LSUC
IF(KR.NE.192) GO TO 110
C*** REDEFINED SYMBOL
CALL ERR(206)
RETURN
C
C*** DEFINE FOR PASS TWO
110 ISYM(LPTR)= MPUAND(IR,63) + 128
C
RETURN
C
C*** OPCODE
C
200 KSYS=1
IF(JSUC.GT.0) GO TO 210
C*** ERROR 207 - UNDEFINED OP-CODE
CALL ERR(207)
KOLUMN=0
RETURN
C *** MACRO DEFINITION?
210 IF(IOPC.GT.0) GO TO 260
IF(IOPC.EQ.0) GO TO 265
C *** LOOK FOR ENDM
230 KOLUMN=-1
LPTR=0
IOPC=0
CALL SCN
IF(TKNTYP.NE.30) GO TO 230
IF(IOPC.GE.0) GO TO 230
C*** ASSURE NOT MEXIT
IF(INS(1).EQ.2) GO TO 230
KOLUMN=0
RETURN
C *** NEED OPERAND FIELD?
260 CONTINUE
INSL=NSZ(IOPC)
JNSL=INSL
IF(IOPC.GE.4) GO TO 270
C *** OPERAND FIELD NOT NEEDED
265 KOLUMN=0
RETURN
270 IADM(1,1)=-1
IADM(3,2)=0
IADM(1,2)=-1
IADM(6,1)=0
IADM(6,2)=0
ISIZ=64
C*** ALLOW .B ONLY FOR BIT INSTRUCTIONS
IF(IOPC.EQ.36) ISIZ=0
IADM(4,1)=0
IADM(4,2)=0
IADM(5,2)=0
LFRF=0
CALL EXP(21)
RETURN
C
C*** DATA SIZE
C
C
300 KK=NSZF(IOPC)
C
IF(KK.GT.0) GO TO 310
C
C*** IS "S" ALLOWED?
IF(KK.EQ.0) GO TO 305
C
IF(ITOKEN(1).NE.LS) GO TO 390
C*** ALLOW "S"
ISIZ=0
RETURN
C
C *** ERROR - SIZE SUBFIELD NOT ALLOWED FOR THIS OPCODE
305 CALL ERR(205)
RETURN
310 IF(TKNSIZ.NE.1) GO TO 390
IF(ITOKEN(1).NE.LB) GO TO 320
ISIZ=0
GO TO 395
320 IF(ITOKEN(1).NE.LL) GO TO 330
ISIZ=128
GO TO 395
330 IF(ITOKEN(1).EQ.LW) GO TO 392
C *** ERROR - UNKNOWN DATA SIZE SPECIFIED
390 CALL ERR(212)
RETURN
392 ISIZ=64
395 CONTINUE
C*** IF ALL 3 SIZES ALLOWED, SKIP
IF(KK.EQ.1) RETURN
IF(ISIZ.NE.KK-2) CALL ERR(238)
RETURN
C
C*** COMMA STARTING FIELD-2 OPERAND ***
C
C
400 CALL EXP(21)
IF(IOPC.NE.4) GO TO 410
C*** DC - FORCE OUT
CALL OUTPUT
INSL=-1
RETURN
C
410 CONTINUE
IF(KSYS.EQ.2) GO TO 420
C*** CHECK FOR 'LINK' - 20048 = $4E50 = LINK
IF(IOPC.EQ.6.AND.INS(1).EQ.20048) GO TO 430
IF(IOPC.GE.19) GO TO 430
C *** OPCODE REQUIRES ONLY ONE OPERAND
420 CALL ERR(219)
KOLUMN=0
RETURN
C+++ MOVE REG,MODE TO SS 2
430 KSYS=2
TKNVA2=0
RETURN
C
C*** OPERAND - REGISTER
C
500 IADM(1,KSYS)=0
JR=ISYM(JPTR+1)
IADM(2,KSYS)=JR
C
C *** STATUS REGISTER?
IF(JR.LE.15) GO TO 510
C *** DEFINE AS STATUS REGISTER
IADM(1,KSYS)=64
RETURN
C *** ADDR REGISTER?
510 IF(JR.GT.7) IADM(1,KSYS)=8
IF(IOPC.EQ.38) CALL MASK(JR)
RETURN
C
C*** REGISTER INDIRECT MODE ***
C
600 IADM(1,KSYS)=16
GO TO 900
C
C*** POST INCREMENT ***
C
700 IADM(1,KSYS)=24
RETURN
C
C*** PRE DECREMENT ***
C
800 IADM(1,KSYS)=32
C
C*** REGISTER OF (A1) ADDRESSING MODE ***
C
900 JR=ISYM(JPTR+1)
910 IF(JR.GT.7) GO TO 920
C *** ERROR - REGISTER INDIRECT SPECIFIES DATA REGISTER.
CALL ERR(213)
RETURN
920 IADM(2,KSYS)=JR
RETURN
C
C*** IMMEDIATE OPERAND ***
C
1000 IADM(1,KSYS)=60
CALL EXP(37)
C
CALL RANGE(TKNVAL)
1006 IF(INSL.GT.0) GO TO 1010
C *** DETERMINE OPERAND SIZE
INSL=4
IF(ISIZ.NE.128) GO TO 1008
INSL=6
C+++ 16-BIT - GET NEXT 2 BYTES
INS(2)=TKNVA2
1008 INS(3)=TKNVAL
RETURN
C *** SECOND OPERAND FIELD
1010 IF(JNSL.GE.0) GO TO 1190
IADM(3,2)=2
IF(ISIZ.EQ.128) IADM(3,2)=4
INSL=INSL+ IADM(3,2)
C+++ IN CASE 16-BITS GET REST OF #
INS(4)=TKNVA2
INS(5)=TKNVAL
RETURN
C
C*** DISPLACEMENT ***
C
C
1100 CALL EXP(37)
KM=56
KL=2
C*** RELOCATABLE SYMBOL
RTYP=MREL(IOPC)
C
IF(RTYP.LE.0) GO TO 1110
C *** IS EXPRESSION ABSOLUTE?
IF(IADM(4,KSYS).EQ.0) GO TO 1110
C
IF(IADM(7,2).EQ.1.AND.IADM(5,KSYS).GT.0) CALL ERR(231)
K=INSL
IF(K.LT.0) K=2
C*** TKNVAL=TKNVAL - IPC - K
C*** SUBTRACT IPC FROM TKNVAL
CALL SUB(TKNVA2,TKNVAL,IPC2,IPC)
C*** NOW SUBTRACT K
CALL SUB(TKNVA2,TKNVAL,0,K)
KM=58
C*** TEST FOR VALID NEG#
IF(TKNVA2.EQ.-1) GO TO 1120
C
C*** TEST FOR GREATER THAN 2 BYTES INSTEAD OF ONE(32767 NOT 127)
IF(TKNVA2.NE.0) CALL ERR(208)
GO TO 1120
C*** ABSOLUTE SYMBOL, FIND ITS SIZE
1110 CONTINUE
C*** BACK OR FORWARD REF?
IF(IADM(5,KSYS).EQ.0) GO TO 1112
C*** IS LONG OR SHORT FWD REF IN USE - ORG.L?
IF(IADM(7,2).EQ.1) GO TO 1115
C*:: NOT ORG.L, CHECK SIZE OF FORWARD ADDRESS
IF(TKNVA2.EQ.0) GO TO 1120
C*** DON'T GIVE ERROR FOR BCC, IT WILL BE CAUGHT LATER IF VALID ERR.
IF(IOPC.EQ.13) GO TO 1120
C*** VALID NEGATIVE #?
IF(TKNVA2.EQ.-1) GO TO 1120
C*** DC?
IF(IOPC.EQ.4) GO TO 1120
C*** ERROR - FORWARD REFERENCE IS LONG ABSOLUTE
CALL ERR(210)
GO TO 1120
C*** BAKWARDS REF, CHECK SIZE OF VALUE
C*** VALID NEG #?
1112 IF(TKNVA2.EQ.-1) GO TO 1120
C*** CHECK FOR ADDRESS FF8000-FFFFFF
I=MPUAND(TKNVAL,Z8000)
IF(I.EQ.Z8000.AND.TKNVA2.EQ.KCFF) GO TO 1120
IF(TKNVA2.NE.0) GO TO 1115
C*** ADDRESS >$7FFF IS LONG
IF(I.EQ.0) GO TO 1120
1115 KM=57
KL=4
C *** SAVE ADDRESS MODE AND VALUE
1120 IADM(1,KSYS)=KM
IF(INSL.GT.0) GO TO 1130
C *** FIRST FIELD
INSL=KL + 2
C+++ 16-BIT - TKNVA2 IS ALWAYS ZEROED AT START OF SOURCE LINE
C IN CASE CURRENT # IS NOT BIG ENOUGH TOGO THERE
INS(2)=TKNVA2
C
INS(3)=TKNVAL
KOPN=3
RETURN
C
C
C *** SECOND FIELD
1130 IF(JNSL.GE.0) GO TO 1190
C
INSL=INSL + KL
IADM(3,2)=KL
INS(4)=TKNVA2
C
INS(5)=TKNVAL
KOPN=5
RETURN
C
C*** ERROR - INSTRUCTION DOESN'T ALLOW THIS MODE
1190 CALL ERR(234)
C
RETURN
C
C
C
C*** REGISTER FOR 3(A1) ADDRESSING MODE ***
C
1200 JR=ISYM(JPTR+1)
C
C*** IN CASE UJNDEFINEDS ARE PRESENT COUNT MAY BE OFF
IF(INSL.EQ.10.AND.IADM(7,2).EQ.0) INSL=8
C*** SWITCH VALUE TO PRINT IF ORG.L IN SOME CASES
IF(IADM(3,2).EQ.4) IADM(3,2)=2
C*** HAS LONG FORWARD REF BEEN SET?
IF(IADM(1,KSYS).EQ.57) INSL=INSL-2
IF(IADM(1,KSYS).EQ.58) GO TO 1220
C*** ABSOLUTE SYMBOL
IF(TKNVA2.EQ.0) GO TO 1210
C*** VALID NEG #?
IF(TKNVA2.EQ.-1) GO TO 1210
C *** ERROR - 32 BIT DISPLACEMENT
CALL ERR(208)
C*** RESET TO SHORT ADDRESS
IADM(1,KSYS)=56
RETURN
1210 IADM(1,KSYS)=40
GO TO 910
C *** (PC) RELATIVE ADDRESS MODE - USE (PC)+X+D
1220 IADM(1,KSYS)=59
GO TO 1410
C
C*** .L FOR 3(A1.L) ADDRESSING MODE ***
C
1300 IF(TKNSIZ.NE.1) GO TO 1310
C*** ALLOW WORD .W
IF(ITOKEN(1).EQ.LW) RETURN
IF(ITOKEN(1).EQ.LL) GO TO 1310
C *** ERROR - SIZE FOR TAG(A1.L) IS NOT L
CALL ERR(214)
RETURN
1310 IF(IADM(1,KSYS).EQ.48) GO TO 1320
IF(IADM(1,KSYS).EQ.59) GO TO 1320
C *** ERROR - ILLEGAL ADDRESS MODE
CALL ERR(209)
RETURN
1320 INS(KOPN)=INS(KOPN) + 2048
RETURN
C
C*** SECOND REGISTER FOR 3(A1,A2) ADDRESSING MODE ***
C
1400 JR=ISYM(JPTR+1)
IF(IADM(4,KSYS).NE.0) CALL ERR(231)
IADM(1,KSYS)=48
1410 IF(IABS(TKNVAL).GT.128) CALL ERR(208)
INS(KOPN)=ISHFT(JR,12) + MPUAND(TKNVAL,255)
RETURN
C
C*** SECOND REGISTER OF R1-R2 FOR LDM,STM
C
1500 IF(IOPC.EQ.38) GO TO 1510
C *** ERROR - NOT LDM,STM
CALL ERR(227)
RETURN
1510 KR=ISYM(JPTR+1)
IF(JR.GT.KR) GO TO 1530
DO 1520 J=JR,KR
JJ=J
1520 CALL MASK(JJ)
RETURN
1530 DO 1540 J=KR,JR
JJ=J
1540 CALL MASK(JJ)
RETURN
C
C*** 'STRING' OVER 4 BYTES LONG
C
1600 INS(3)=TKNSIZ
RETURN
C
C*** CONSTANT OR VARIABLE OPERAND ***
C
1700 CONTINUE
IADM(4,KSYS)=0
IF(TKNTYP.EQ.24) GO TO 1710
C *** CONSTANT OPERAND
C
IF(TKNTYP.NE.42) GO TO 1730
C*** ASTERISKS
TKNVAL=IPC
C+++ 16-BIT - UPPER BYTE.
TKNVA2=IPC2
IADM(4,KSYS)=IADM(7,1)
GO TO 1730
C *** DEFINED PREVIOUSLY?
1710 IF(JSUC.GT.0) GO TO 1720
C *** INTERNAL ERROR - MISSING SYMBOL
CALL ERR(228)
GO TO 1730
1720 TKNVAL=ISYM(JPTR+1)
KK=ISYM(JPTR)
C+++ 16-BIT - GET M.S.B.
TKNVA2=ISYM(JSUC)
C
C*** IS SYMBOL RELOCATABLE?
IF(MPUAND(KK,7).EQ.1) IADM(4,KSYS)=1
KK=MPUAND(KK,192)
C
C*** UNDEFINED SYMBOL?
IF(KK.NE.0) GO TO 1725
CALL ERR(207)
C*** FORCE LONG ADDR FOR UNDEF A DISPLACEMENT CALC TO AVOID PHASE PROB
KK=64
C*** SET UNDEFINED FLAG
IADM(5,KSYS)=2
1725 CONTINUE
C*** REDEFINED SYMBOL?
IF(KK.EQ.192) CALL ERR(206)
C*** FORWARD REFERENCE?
IF(KK.EQ.64) IADM(5,KSYS)=MPUIOR(IADM(5,KSYS),1)
C*** GIVE OPERAND TO EXP
1730 CALL EXP(22)
RETURN
END
SUBROUTINE MASK(JR)
CC NAM: MASK VER: 1.0 DAT: 12/08/78 CMP: ALL
CC
CC SYS: MACS
CC
CC ENT: JR - MASK TO BE SHIFTED
CC
CC RTN: JR - N/C
CC
CC FNC: FORMAT REGISTER BIT MASK FOR LDM,STM
CC
CC REV: N/A
CC
CCALLS ISHFT-MPUIOR
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
C
IB=ISHFT(1,JR)
IADM(6,1)=MPUIOR(IADM(6,1),IB)
C
KR=15 -JR
IB=ISHFT(1,KR)
IADM(6,2)=MPUIOR(IADM(6,2),IB)
RETURN
END
SUBROUTINE MOD2
CC NAM: MOD2 VER: 1.0 DAT: 12/08/78 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: FORCE TO AN EVEN WORD BOUNDARY
CC
CC REV: N/A
CC
CCALLS MPUAND-ADD
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
C
IF(MPUAND(IPC,1).EQ.0) RETURN
C*** IPC=IPC+1 - ADD ALL 24 BITS
CALL ADD(IPC2,IPC,0,1)
IF(LPTR.EQ.0) RETURN
ISYM(LPTR+1)=IPC
I=ITOKEN(69)
ISYM(I)=IPC2
C*** FORWARD REF IS ON ODD BYTE
CALL ERR(230)
RETURN
END
SUBROUTINE OUTPUT
CC NAM: OUTPUT VER: 1.0 DAT: 12/08/78 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/C
CC
CC FNC: OUTPUT THE CURRENT INSTRUCTION.
CC
CC REV: N/A
CC
CCALLS BUILD1-BUILD2-PAGE-PCOUNT-OBJ-MPUCA1-MPUAND-ERR-MOD2
CC HEXASC
CC
CC ERROR NUMBERS CALLED: 230
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW
EQUIVALENCE(INS(1),INS1)
DIMENSION KRDOUT(95)
DIMENSION INS1A(4),INS2(4),INS3(4),INS4(4),INS5(4),IPC22(2),
& IPC1(4)
DATA LSPHEX/' ' /
C*** PUT OUT INSTRUCTION OR SPECIAL PRINT.
C*** REGULAR INSTRUCTION
1 CONTINUE
C
C*** ARE WE IN A MACRO DEFINITION?
IF(ICOL.EQ. -1) INSL=0
C... *** FINISH BUILDING THE INSTRUCTION.
IF(IPASS.GE.0) GO TO 3
C*** ARE WE IN IFXX?
IF(ICOL.LT.0) GO TO 17
CALL BUILD1
17 CONTINUE
C
C*** DEBUG
C
I=2
CALL DEBUG(I)
IF(I.EQ.1) GO TO 5
C*** END DEBUG
18 IF(JERR.GT.0) GO TO 5
GO TO 900
3 CONTINUE
C*** ARE WE IN IFXX?
IF(ICOL.LT.0) GO TO 5
CALL BUILD2
CALL OBJ
5 II=1
C*** HAS THE LINE ALREADY BEEN PRINTED?
IF(KARD1(1).EQ.0) GO TO 1000
KD1BCT=LLEN-25
C*** NOLIST ON?
6 IF(LIST.EQ.0) GO TO 500
C*** SKIP ADJUSTMENT IF REMARK
IF(KARD1(1).EQ.42) GO TO 8000
C*** SHOULD OUTPUT BE PRETTILY ADJUSTED??
IF(LLENSW.EQ.0) GO TO 8000
C*** ADJUST OUTPUT TO SPECIFIC COLUMNS
C*** IS THERE A LABEL?
DO 7000 I=1,KD1BCT
7000 KRDOUT(I)=LSP
I=1
IPOS=1
IF(KARD1(1).EQ.LSP) GO TO 7050
DO 7010 I=1,31
KRDOUT(I)=KARD1(I)
IPOS=I+1
IF(KARD1(I).EQ.LSP) GO TO 7050
7010 CONTINUE
C*** IF HERE 31ST CHAR NOT BLANK
KRDOUT(32)=LSP
C*** FIND END OF LABEL
J=I
DO 7020 I=J,KD1BCT
IF(KARD1(I).EQ.LSP) GO TO 7050
7020 CONTINUE
GO TO 8100
7050 CONTINUE
C*** FIND MNEMONIC
J=I+1
DO 7100 I=J,KD1BCT
IF(KARD1(I).NE.LSP) GO TO 7150
7100 CONTINUE
GO TO 8100
C*** MNEMONIC
7150 CONTINUE
IF(IPOS.LT.10) IPOS=10
DO 7200 K=IPOS,KD1BCT
KRDOUT(K)=KARD1(I)
IF(KARD1(I).EQ.LSP) GO TO 7250
I=I+1
7200 CONTINUE
GO TO 8100
7250 CONTINUE
IPOS=K+1
C*** OPCODE
C*** REMOVE ANY EXCESS BLANKS BETWEEN MNEMONIC & OPERAND.
DO 7260 K=I,KD1BCT
IF(KARD1(K).NE.LSP) GO TO 7280
7260 CONTINUE
GO TO 8100
7280 I=K
J=0
IF(IPOS.LT.18) IPOS=18
DO 7300 K=IPOS,KD1BCT
IF(KARD1(I).EQ.IEOT) GO TO 8100
C*** CHECK FOR ' '
IF(KARD1(I).EQ.39) J=J+1
C*** IS IT 1ST '?
IF(MOD(J,2).NE.0) GO TO 7290
IF(KARD1(I).EQ.LSP) GO TO 7350
7290 KRDOUT(K)=KARD1(I)
I=I+1
7300 CONTINUE
GO TO 8100
7350 CONTINUE
C*** REMARKS
C*** REMOVE ANY EXCESS BLANKS BETWEEN OPERAND AND REMARKS.
DO 7360 J=I,KD1BCT
IF(KARD1(J).NE.LSP) GO TO 7380
7360 CONTINUE
GO TO 8100
7380 CONTINUE
I=J
IF(J.LT.40) J=40
IF(K.GT.40) J=K+1
DO 7400 K=J,KD1BCT
IF(KARD1(I).EQ.IEOT) GO TO 8100
KRDOUT(K)=KARD1(I)
I=I+1
7400 CONTINUE
GO TO 8100
8000 DO 8 J=1,KD1BCT
8 KRDOUT(J)=KARD1(J)
8100 CONTINUE
C WRITE(LUOT,9999) INSL,(INS(I),I=1,5)
9999 FORMAT(' OUTPUT-INSL,INS=',I3,5O8)
CALL HEXASC(INS(1),INS1A,4,1)
CALL HEXASC(INS(2),INS2,4,1)
CALL HEXASC(INS(3),INS3,4,1)
CALL HEXASC(INS(4),INS4,4,1)
CALL HEXASC(INS(5),INS5,4,1)
CALL HEXASC(IPC2,IPC22,2,1)
CALL HEXASC(IPC,IPC1,4,1)
IF(INSL.EQ.0) GO TO 10
IF(INSL.LT.0) GO TO 20
C*** 20 = SPC
IF(INSL.EQ.20) GO TO 950
GO TO(100,200,200,400,400,600,600,880,80),INSL
C*** 5 WORD INSTRUCTION
WRITE(LUOT,999) KD1LNO,IPC22,IPC1,INS1A,INS2,INS3,INS4,INS5
& , (KRDOUT(J),J=1,KD1BCT)
GO TO 690
C*** FOUR WORD INSTRUCTION
880 IF(IADM(3,2).EQ.2) GO TO 770
C... *** LONG INTEGER IN INS(5)
WRITE(LUOT,2999) KD1LNO,IPC22,IPC1,INS1A,INS3,INS4,INS5,
& (KRDOUT(J),J=1,KD1BCT)
GO TO 690
C.. *** SHORT INTEGER IN INS(5)
770 WRITE(LUOT,1999) KD1LNO,IPC22,IPC1,INS1A,INS2,INS3,INS5,
& (KRDOUT(J),J=1,KD1BCT)
GO TO 690
C*** THREE WORD INSTRUCTION
600 IF(IADM(3,2).EQ.0) GO TO 660
C... *** SHORT INTEGER IN INS(5)
WRITE(LUOT,1998) KD1LNO,IPC22,IPC1,INS1A,INS3,INS5,
& (KRDOUT(J),J=1,KD1BCT)
GO TO 700
C... *** NO INTEGER IN INS(5) - INS(3) ONLY
660 WRITE(LUOT,998) KD1LNO,IPC22,IPC1,INS1A,INS2,INS3,
& (KRDOUT(J),J=1,KD1BCT)
GO TO 700
C
500 CONTINUE
IF(INSL.EQ.0) GO TO 800
IF(INSL.LT.0) GO TO 540
C*** CHECK FOR SPC
IF(INSL.EQ.20) GO TO 980
GO TO (800,700,700,700,700,700,700,700,78),INSL
GO TO 700
540 IF(INSL.NE.-1) GO TO 35
GO TO 800
C*** TWO WORD INSTRUCTION
400 WRITE(LUOT,997) KD1LNO,IPC22,IPC1,INS1A,INS3,
& (KRDOUT(J),J=1,KD1BCT)
GO TO 700
C*** ONE WORD INSTRUCTION
200 WRITE(LUOT,996) KD1LNO,IPC22,IPC1,INS1A,(KRDOUT(J),J=1,KD1BCT)
GO TO 700
C*** ONE BYTE VALUE
100 WRITE(LUOT,995) KD1LNO,IPC22,IPC1,INS3(3),INS3(4),
& (KRDOUT(J),J=1,KD1BCT)
GO TO 800
80 CONTINUE
C*** CONVERT VALUE TO ASCII
CALL HEXASC(ITOKEN(1),INS2,2,1)
WRITE(LUOT,995) KD1LNO,IPC22,IPC1,INS2(1),INS2(2),
& (KRDOUT(J),J=1,KD1BCT)
CALL PAGE(1)
78 INSL=1
IF(INS1.EQ.1) GO TO 75
DO 70 J=2,INS1
CALL PCOUNT
IF(LIST.EQ.0) GO TO 70
C*** IS OPTION G- OR G?
IF(LUDI.EQ.0) GO TO 70
C*** CONVERT HEX TO ASCII
CALL HEXASC(IPC,IPC1,4,1)
CALL HEXASC(IPC2,IPC22,2,1)
CALL HEXASC(ITOKEN(J),KRDOUT,2,1)
WRITE(LUOT,991) IPC22,IPC1,KRDOUT(1),KRDOUT(2)
CALL PAGE(1)
70 CONTINUE
75 CALL PCOUNT
C*** DON'T 0 MOD 2 IF DC.B
LPTR=0
IF(ISIZ.EQ.0) GO TO 72
I=2
IF(ISIZ.EQ.128) I=4
C*** IF NOT 0 MOD 2 FOR .W OR 0 MOD 4 FOR .L PUT OUT FIILER OF 0
IF(INS1.LT.5) INS1=INS1+4
J=MOD(INS1,I)
IF(J.EQ.0) GO TO 72
I=I-J
DO 71 J=1,I
CALL PNCH(4,0)
IF(LIST.EQ.0) GO TO 71
C*** IS OPTION G- OR G?
IF(LUDI.EQ.0) GO TO 71
C*** 'LPTR' MUST = 0
CALL HEXASC(IPC,IPC1,4,1)
CALL HEXASC(IPC2,IPC22,2,1)
CALL HEXASC(LPTR,KRDOUT,2,1)
WRITE(LUOT,991) IPC22,IPC1,KRDOUT(1),KRDOUT(2)
CALL PAGE(1)
71 CALL PCOUNT
72 KARD1(1)=0
INSL=0
GO TO 800
C*** PSUEDO OP
10 WRITE(LUOT,994) KD1LNO,(KRDOUT(J),J=1,KD1BCT)
GO TO 800
C*** PSEUDO OP WITH A VALUE
20 IF(INSL.NE.-1) GO TO 30
C... *** PRINT W/O PC
WRITE(LUOT,993) KD1LNO,INS2,INS3,(KRDOUT(J),J=1,KD1BCT)
GO TO 800
C... *** DS - PRINT WITH PC
30 WRITE(LUOT,997) KD1LNO,IPC22,IPC1,INS2,INS3,(KRDOUT(J),J=1,KD1BCT)
35 CALL ADD(IPC2,IPC,INS(2),INS(3))
INSL=0
GO TO 800
999 FORMAT(I5,1X,2A1,4A1,1X,12A1/16X,8A1,1X,100A1)
1999 FORMAT(I5,1X,6A1,1X,12A1/16X,4A1,5X,100A1)
2999 FORMAT(I5,1X,6A1,1X,8A1/16X,8A1,1X,100A1)
1998 FORMAT(I5,1X,6A1,1X,12A1,1X,100A1)
998 FORMAT(I5,1X,6A1,1X,12A1,1X,100A1)
997 FORMAT(I5,1X,6A1,1X,8A1,5X,100A1)
996 FORMAT(I5,1X,6A1,1X,4A1,9X,100A1)
995 FORMAT(I5,1X,6A1,1X,2A1,11X,100A1)
994 FORMAT(I5,21X,100A1)
993 FORMAT(I5,8X,8A1,5X,100A1)
991 FORMAT(6X,6A1,1X,2A1)
9920 FORMAT(A1)
C*** INCREMENT LINE COUNT BY 2
690 II=2
C*** ASSURE EVEN BOUNDARY
700 IF(MPUAND(IPC,1).EQ.0) GO TO 800
CALL ERR(230)
CALL PNCH(4,0)
CALL MOD2
C*** PRINT THE ERRORS IF ANY
800 CALL ERR(0)
IF(KARD1(1).NE.0) CALL PAGE(II)
C*** COMPUTE NEW PC ADDRESS
C
900 KARD1(1)=0
IF(INSL.LE.0) RETURN
C*** INCREMENT THE P-COUNTER.
CALL PCOUNT
RETURN
C*** SPC ***
950 CONTINUE
I=INS(3)
C
DO 960 J=1,I
CALL PAGE(1)
960 WRITE(LUOT,9920) LSPHEX
C
980 KARD1(1)=0
INSL=0
GO TO 800
1000 CONTINUE
C*** IF DC FINISH OUTPUT IF REQUIRED & INCREMENT THE PCOUNT
IF(IOPC.NE.4) GO TO 800
IF(INSL.EQ.9.AND.LUDI.EQ.0) GO TO 78
IF(LUDI.EQ.0) GO TO 800
KARD1(1)=LSP
KD1BCT=1
GO TO 6
END
SUBROUTINE BUILD2
CC NAM: BUILD2 VER: 1.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: BUILD THE INSTRUCTION FOR PASS TWO
CC
CC THIS ROUTINE IS 16-BIT DEPENDENT DUE TO THE
CC 24-BIT ADDRESS WHICH MUST BE MANIPULATED.
CC
CC REV: N/A
CC
CCALLS ERR-MOD2-ISHFT-MPUAND-MPUIOR-PAGE
CC
CC ERROR NUMBERS CALLED: 205,208,209,210,212,213,215,216,217,218
CC 220,223,229,232,233,234,236,238
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
COMMON /A/ NXSYM1,LIST1,MASK2
DIMENSION IMCD(6),NIMM(40)
EQUIVALENCE(IADM(4,1),SYMTYP),(IADM(5,1),LFRF)
EQUIVALENCE (INS(1),INS1)
C ORI SUBI EORI CMPI ANDI ADDI
DATA IMCD/ 0000, 1024, 2560, 3072, 512, 1536/
C
C*** THE FOLLOWING DATA STATEMENTS DEFINE HEX CONSTANTS
C*** LOCAL TO THIS ROUTINE.
C
DATA IH4E60/O47140/,IH40C0/O40300/
DATA IH44C0/O42300/,IH46C0/O43300/
DATA IH48C0/O44300/
C
C*** END HEX DATA CONSTANTS.
C
C*** 01-20 NO IMM - 2ND ROW IS 21 04
DATA NIMM/
& 0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,1,
& 1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0/
C
C*** HEX 7000
DATA I7KH/O70000/
DATA IHA0C0/O120300/
DATA IH5K/O50000/,IH5100/O50400/
DATA IH4100/O40400/
DATA ZB001/O130001/,ZD001/O150001/,ZD002/O150002/,Z9001/O110001/
DATA Z9002/O110002/,ZF000/O170000/,Z8000/O100000/
DATA ZB140/O130500/
DATA CMP/0/,MASK2/0/
C*** ERROR 220 ???
C***
IF(IOPC.EQ.0) GO TO 45
C*** CHECK FOR DC WITH A LABEL, IS SO SKIP ERR 220 CHECK
IF(IOPC.EQ.4) GO TO 50
IF(IOPC.EQ.5) GO TO 50
C... *** NOT SET,EQU ASSURE NO PHASE ERROR
IF(LPTR.EQ.0) GO TO 40
IF(ISYM(LPTR+1).NE.IPC) CALL ERR(220)
C*** PERFORM ACTIONS FOR THE OPCODE CLASS
40 IF(IOPC.GT.0) GO TO 50
45 INSL=0
RETURN
50 IF(INSL.LT.0) INSL=2
GO TO(100, 200,9223,400,500, 600, 700, 800, 900, 950,
& 1100,1100,1300,1400,1500, 950, 950,1800,1900),IOPC
J=IOPC-19
GO TO(2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,
& 9223,3200,9223,3400,3500,3600,3700,3800),J
J=J-19
GO TO(3900),J
GO TO 9223
C
C*** PSEUDO OPS WITHOUT OPERANDS
100 CONTINUE
GO TO(110,120,130,140,150,160,170,180,190,195,196,197),INS1
C... *** END
110 IPASS=1
120 RETURN
C*** PAGE
130 CONTINUE
CALL PAGE(84)
RETURN
C
C*** LIST
140 LIST=1
145 KARD1(1)=0
RETURN
C
C*** NOLIST ***
150 LIST=0
RETURN
C*** TTL
160 CALL PAGE(80)
GO TO 145
C*** NO PAGE(NOP)
170 CONTINUE
NOP=0
RETURN
C
C*** NOOBJ -NO OBJECT OUTPUT, SET IN PASS 1
C
180 RETURN
C
C*** CMPL - CMP DESTINATION,SOURCE
C
190 CMP=1
RETURN
C
C*** CMPR - CMP S,D
C
195 CMP=0
RETURN
C
C*** 'G' DIRECTIVE
C
196 LUDI=1
RETURN
C
C*** 'MASK2' DIRECTIVE
C
197 MASK2=1
RETURN
C
C*** OP CODES WITHOUT OPERANDS
200 RETURN
C
C*** DC
400 GO TO 540
C
C*** PSEUDO OPS WITH OPERANDS
500 IF(IADM(1,1).EQ.56) GO TO 505
IF(IADM(1,1).NE.57) CALL ERR(234)
505 INSL=-1
GO TO(510,520,520,540,508,560,570),INS1
GO TO 9223
C*** RORG
508 IADM(7,1)=1
GO TO 512
C... *** ORG AND RORG
510 IADM(7,1)=0
512 IPC=INS(3)
C+++ 16-BIT - GET MOST SIGNIFICANT BYTE
IPC2=INS(2)
IADM(7,2)=0
IF(ISIZ.EQ.128) IADM(7,2)=1
CALL PNCH(3,IPC)
RETURN
C... *** EQU
520 IF(LPTR.GT.0) GO TO 522
C... *** ERROR - NO LABEL ON STATEMENT
CALL ERR(229)
RETURN
522 ISYM(LPTR)=MPUAND(ISYM(LPTR),192) + SYMTYP
ISYM(LPTR+1)=INS(3)
C
C*** IS THIS "SET"?
IF(INS(1).NE.2)
& ISYM(LPTR)=128
C*** SAVED IN 'ACT2'
KK=ITOKEN(69)
IF(KK.EQ.0) RETURN
ISYM(KK)=INS(2)
RETURN
C... *** DC AND DS
540 INSL=1
IF(ISIZ.EQ.0) GO TO 545
C*** IF PCOUNT ODD, PUT OUT FILL BYTE(A ZERO) IN 'S' RECORD
IF(MPUAND(IPC,1).NE.0) CALL PNCH(4,0)
CALL MOD2
INSL=2
IF(ISIZ.EQ.128) INSL=4
545 IF(IOPC.NE.4) GO TO 550
C... *** DC
C
INS1=INS(3)
IF(IADM(1,1).GE.0) GO TO 547
C*** INSL=9 TELLS OUTPUT TO PRINT STRING BYTE AT A TIME
INSL=9
C... *** 'STRING' OVER 4 BYTES
C
DO 546 J=1,INS1
CALL PNCH(4,ITOKEN(J))
546 CONTINUE
RETURN
C*** NUMERIC TYTE,WORD, OR LONG DC CONSTANT
547 IF(INSL.EQ.4) GO TO 548
C... *** BYTE OR WORD - ASSURE NOT TOO BIG
C
CALL RANGE(INS(3))
RETURN
C
C+++ 16-BIT - GET 1ST 2 BYTES
548 INS(1)=TKNVA2
RETURN
C... *** DS
C*** INS(3)=INS(3)*INSL
550 CONTINUE
CALL MUL(INS(2),INS(3),0,INSL)
555 INSL=-2
C*** IPC=IPC+INS(3)
CALL PNCH(5,INS(3))
RETURN
C
C*** FAIL
560 CALL ERR(INS(3))
RETURN
C*** SPC ***
570 CONTINUE
INSL=20
RETURN
C
C*** LINK/UNLK - ADDRESS REGISTER TO BITS 2-0
600 IF(IADM(1,1).NE.8) GO TO 9213
C*** 2 BYTE LINK INSTRUCTION ILLEGAL
IF(INSL.EQ.2.AND.INS(1).EQ.20048) GO TO 12340
C*** CHECK FOR UNLK - 20056 = $4E58
IF(INS(1).EQ.20056) INSL=2
INS(1)=INS(1)+IADM(2,1)-8
RETURN
C
C*** SWAP - DATA REGISTER TO BITS 2-0
700 IF(IADM(1,1).NE.0) GO TO 9215
INS(1)=INS(1)+IADM(2,1)
RETURN
C
C*** TRAP - ESTABLISH DISPLACEMENT IN BITS 3-0
800 INSL=2
IF(IADM(1,1).EQ.60) IADM(1,1)=56
IF(IADM(1,1).NE.56) GO TO 9209
IF(INS(3).GT.15) GO TO 9210
IF(INS(3).LT.0) GO TO 9216
INS(1)=INS(1)+INS(3)
RETURN
C
C*** ABS/CLR/NEG/NOT/TST - BUILD EA
C
900 INS(1)=INS(1)+ISIZ
C*** CHECK FOR ADDRESS REG
950 IF(IADM(1,1).EQ.8) GO TO 9215
C*** *** ERROR IF IMMEDIATE MODE
IF(IADM(1,1).GT.57.AND.IADM(1,1).LT.61) GO TO 9209
GO TO 8300
C
C*** PEA-JSR-JMP
C
1100 CONTINUE
C*** PEA (AN)+ AND PEA -(AN) ILLEGAL, CHECK FOR THEM
IF(IADM(1,1).EQ.16) GO TO 8300
IF(IADM(1,1).LT.40) GO TO 9209
IF(IADM(1,1).EQ.60) GO TO 9209
GO TO 8300
C
C*** BCC
C
1300 IOFS=INS(3) - IPC - 2
C
MAG=IABS(IOFS)
C*** ALLOW ABSOLUTE ADDRESS ONLY
IF(IADM(1,1).LT.56) CALL ERR(234)
C*** IN CASE BIT 16 SET INSTRUCTION TO LONG, RESET
IF(INSL.EQ.6) INSL=4
C
IF(ISIZ.NE.0) GO TO 1310
C*** FORCE SHORT FORM
IF(MAG.GT.127) CALL ERR(208)
GO TO 1320
1310 IF(LFRF.NE.0) GO TO 1330
C... *** BACKWARD REFERENCE
IF(MAG.GT.127) GO TO 1330
C... *** USE SHORT FORM
1320 INS(1)=INS(1) + MPUAND(IOFS,255)
INSL=2
C*** IF OFFSET IS ZERO IT WILL CAUSE HARDWARE TO EXPECT LONG BRANCH AND
C*** USE NEXT 2 BYTES FOR OFFSET SO FLAG AS ERROR. THIS IS CAUSED BY
C*** A BRA TO NEXT INSTRUCTION.
IF(IOFS.EQ.0) GO TO 9208
RETURN
C... *** USE LONG FORMAT
1330 IF(MAG.GT.32767) CALL ERR(208)
INS(3)=IOFS
RETURN
C
C*** NEGX
1400 GO TO 900
C
C*** EXT
1500 IF(ISIZ.EQ.0) GO TO 9217
C
IF(ISIZ.EQ.128) INS(1)=IH48C0
INS(1)=MPUIOR(INS(1),IADM(2,1))
IF(IADM(1,1).EQ.8) CALL ERR(215)
RETURN
C
C*** CONDITIONAL ASSEMBLY
1800 INSL=0
INS1=INS(1)
GO TO(1810,1820),INS1
C... *** EQ
1810 IF(INS(3).NE.0) GO TO 1890
IF(INS(2).NE.0) GO TO 1890
RETURN
C... *** NE
1820 IF(INS(3).EQ.0.AND.INS(2).EQ.0) GO TO 1890
RETURN
C... *** SKIP TO ENDC
1890 ICOL=-2
RETURN
C
C*** PAGE LENGTH(PLEN) - LINE LENGTH(LLEN)
C
1900 CONTINUE
C*** IS IT PLEN?
IF(INS1.EQ.2) GO TO 1980
C*** CHECK FOR NEW MASK SET - STOP
IF(INS1.EQ.1) GO TO 1910
INSL=4
IF(IADM(1,1).NE.60) CALL ERR(232)
RETURN
1910 CONTINUE
C*** LLEN
LLENSW=1
LLEN=INS(3)
IF(LLEN.GT.120) LLEN=120
IF(LLEN.LT.26) LLEN=26
INSL=0
RETURN
C*** PLEN
1980 IPLEN=INS(3)
RETURN
C*** MULTIPLY,DIVIDE
2000 ISIZ=0
GO TO 8110
C
C*** ADD/SUB PROCESSING
C
C... *** TEST FOR IMMEDIATE SOURCE
2100 CONTINUE
C*** BYTE ADD ON AN ILLEGAL
IF(IADM(1,2).EQ.8.AND.ISIZ.EQ.0) GO TO 9217
C*** ADD.B AN,DN ILLEGAL
IF(IADM(1,1).EQ.8.AND.ISIZ.EQ.0) GO TO 9217
C*** DESINATION PC REL & PC REL + INDEX ILLEGAL
IF(IADM(1,2).GT.57.AND.IADM(1,2).LT.61) CALL ERR(231)
C*** CHECK FOR ADDI/SUBI - IF SO SKIP QUICK
IF(INS(1).EQ.ZD001.OR.INS(1).EQ.Z9001) GO TO 6980
C*** IF ADDQ/SUBQ FORCE IT
IF(INS(1).EQ.IH5K.OR.INS(1).EQ.IH5100) GO TO 2108
C*** ADDA/SUBA?
IF(INS(1).EQ.ZD002.OR.INS(1).EQ.Z9002) GO TO 2125
IF(IADM(1,1).NE.60) GO TO 2120
C... *** POSSIBLE QUICK MODE?
IF(INS(3).LE.0) GO TO 2110
IF(INS(3).GT.8) GO TO 2110
C*** CHECK FORWARD REF CANNOT BE 'Q'
IF(LFRF.GT.0.AND.IADM(5,2).GT.0) GO TO 2110
IF(LFRF.GT.0.AND.IADM(1,2).LT.56) GO TO 2110
C... *** QUICK MODE
2105 INSL=INSL - 2
IF(ISIZ.EQ.128) INSL=INSL - 2
IF(INS(3).GT.8) GO TO 9210
KK=IH5K
C*** IH5100=$5100
IF(INS(1).EQ.IHEX9K.OR.INS(1).EQ.IH5100) KK=IH5100
C
INS(1)=ISHFT(INS(3),9) + ISIZ
INS(1)=MPUIOR(INS(1),KK)
IADM(3,2)=0
INS(3)=INS(5)
C*** INCASE LONG WORD
INS(2)=INS(4)
GO TO 8600
C*** ADDQ/SUBQ MUST BE IMM
2108 IF(IADM(1,1).NE.60) CALL ERR(234)
GO TO 2105
C... *** USE IMMEDIATE OP-CODE?
2110 IF(IADM(1,2).NE.8) GO TO 7000
C... *** CREATE MODE FIELD
2120 IF(IADM(1,2).EQ.0) GO TO 8110
IF(IADM(1,2).NE.8) GO TO 2130
C... *** SINK IS A REGISTER - ASSURE NOT BYTE
IF(ISIZ.EQ.0) GO TO 9217
2125 ISIZ=ISIZ*2
C*** DN AS DEST INVALID
IF(IADM(1,2).EQ.0) GO TO 9213
C*** ADDA/SUBA INST.
INS(1)=MPUAND(INS(1),ZF000)
C***
INS(1)=INS(1) + MPUIOR(ISIZ,192)
GO TO 8210
C... *** SINK TO MEMORY - ASSURE SOURCE IS D REGISTER
2130 ISIZ=ISIZ+256
GO TO 8400
C
C*** AND,OR
C
C
2200 IF(IADM(1,1).EQ.8) GO TO 9215
IF(IADM(1,1).NE.0) GO TO 2310
C*** POSSIBLE D->EA
IF(IADM(1,2).EQ.0) GO TO 8100
IF(IADM(1,2).EQ.8) GO TO 9215
ISIZ=MPUIOR(ISIZ,256)
GO TO 8400
C
C*** EOR
C*** 8192 = $2000
2300 IF(IADM(1,1).NE.60) GO TO 8400
C*** IMMEDIATE MODE
INS(1)=8192
C... *** TEST FOR CCR/SR DESTINATION
2310 IF(IADM(1,2).EQ.64) GO TO 2320
C... *** NOT CCR/SR - TRY IMM MODE
IF(IADM(1,1).EQ.60) GO TO 7000
GO TO 8100
C... *** CCR/SR DESTINATION - ASSURE IMMEDIATE
2320 IF(IADM(1,1).NE.60) CALL ERR(232)
C... ***CREATE IMM BIT PATTERM
KK=ISHFT(INS(1),-12)
KK=MPUAND(KK,7)
INS(1)=IMCD(KK+1) + IADM(2,2)
RETURN
C
C*** CMP
C*** SWITCH INFO ON CMP
2380 KK=IADM(1,1)
IADM(1,1)=IADM(1,2)
IADM(1,2)=KK
KK=IADM(2,1)
IADM(2,1)=IADM(2,2)
IADM(2,2)=KK
C*** IF 6 OR MORE BYTE INST, SWITCH 'INS' ALSO
IF(INSL.LT.6) GO TO 2390
IF(IADM(1,1).LT.40) GO TO 2390
KK=INS(2)
INS(2)=INS(4)
INS(4)=KK
KK=INS(3)
INS(3)=INS(5)
INS(5)=KK
2390 GO TO (2406,2620,2720),I
C... *** IS COMPARE WITH A REGISTER?
2400 CONTINUE
C*** IS IT CMP S,D?
I=1
IF(CMP.EQ.0) GO TO 2380
C*** CMPA?
2406 IF(INS(1).EQ.ZB001.AND.IADM(1,1).NE.8) GO TO 9213
IF(IADM(1,1).NE.8) GO TO 2410
C*** *** YES, USE CMPA(BYTE MODE ILLEGAL)
IF(ISIZ.EQ.0) GO TO 9217
ISIZ=ISIZ*2
INS(1)=MPUIOR(IHA0C0,ISIZ)
GO TO 8510
C... *** CAN WE USE CMPI?
2410 IF(IADM(1,2).NE.60) GO TO 8400
INS(1)=3072 + ISIZ
IF(IADM(1,1).LT.40) GO TO 8300
C... *** MEMORY MODE
KK=INS(3)
INS(3)= INS(5)
INS(5)=KK
C+++ 16-BIT
KK=INS(2)
INS(2)= INS(4)
INS(4)=KK
IADM(3,2)=2
IF(IADM(1,1).EQ.57) IADM(3,2)=4
C*** 3=UNDEFINED SYMBOL/LABEL
IF(IADM(5,2).EQ.3) IADM(3,2)=3
GO TO 8300
C
C*** EXG
2500 CONTINUE
C*** EXG DN,DM
IF(IADM(1,1).EQ.0.AND.IADM(1,2).EQ.0) GO TO 2530
C*** EXG AN,DM
IF(IADM(1,1).EQ.8.AND.IADM(1,2).EQ.0) GO TO 2505
C*** EXG DN,AM
IF(IADM(1,1).EQ.0.AND.IADM(1,2).EQ.8) GO TO 2510
C*** EXG AN,AM
IF(IADM(1,1).EQ.8.AND.IADM(1,2).EQ.8) GO TO 2520
GO TO 9209
2505 CONTINUE
C*** EXG AN,DM
I=IADM(2,1)
IADM(2,1)=IADM(2,2)
IADM(2,2)=I
2510 CONTINUE
C*** DN,AM - 64=$40
INS(1)=INS(1)+64
GO TO 2530
C*** AN,AM
2520 CONTINUE
INS(1)=ZB140
2530 INS(1)=INS(1)+ISHFT(IADM(2,1),9)+IADM(2,2)
RETURN
C
C*** CHK
2600 I=2
C*** IS IT CHK S,D?
IF(CMP.EQ.0) GO TO 2380
2620 GO TO 8500
C
C*** CMPM
2700 I=3
C*** IS IT CMPM D,S?
IF(CMP.EQ.1) GO TO 2380
2720 IF(IADM(1,1).NE.24) GO TO 9209
IF(IADM(1,2).NE.24) GO TO 9209
GO TO 7100
C
C*** ADDX,SUBX
2800 GO TO 2910
C
C*** ABCD,SBCD
2900 ISIZ=0
2910 IF(IADM(1,1).NE.0) GO TO 2920
IF(IADM(1,2).NE.0) GO TO 9209
GO TO 7100
C... *** -(A1),-(A1) MODE
2920 IF(IADM(1,1).NE.32) GO TO 9209
IF(IADM(1,2).NE.32) GO TO 9209
IADM(2,2)=IADM(2,2)-8
GO TO 7100
C
C*** MOVEP
C
3000 CONTINUE
C*** CHECK FOR CORRECT BYTE SIZE - .B ILLEGAL
IF(ISIZ.EQ.0) GO TO 9205
C*** ENTER LONG WORD FLAG?
IF(ISIZ.EQ.128) INS(1)=INS(1) + 64
C*** FIND ADDRESS MODE
IF(IADM(1,1).EQ.40) GO TO 3020
C*** REG TO MEMORY INSTRUCTION
IF(IADM(1,2).NE.40) GO TO 9209
C*** RESET ADDRESS MODE FLAG TO ADD IN A FLAG LATER
IADM(1,2)=8
C*** SET REG -> MEMORY FLAG - 128=$80
INS(1)=MPUIOR(INS(1),128)
GO TO 8500
C*** MEMORY -> REG INSTRUCTION
3020 IADM(1,1)=8
GO TO 8200
C
C*** DCNT
C
3200 INSL=2
IF(IADM(1,2).EQ.57) IADM(1,2)=56
IF(IADM(1,1).NE.0) GO TO 9215
IF(IADM(1,2).NE.56) GO TO 9209
IOFS=INS(3) - IPC -2
IF(MASK2.EQ.0) GO TO 3201
IF(IOFS.GE.0.OR.IOFS.LT.-128) CALL ERR(208)
INS(1)=INS(1) + ISHFT(IADM(2,1),9) + MPUAND(IOFS,255)
RETURN
C*** DBCC
3201 CONTINUE
INS(1)=INS(1)+IADM(2,1)
INSL=4
INS(3)=IOFS
RETURN
C
C*** LEA
C
3400 CONTINUE
C*** DESTINATION MUST BE ADDRESS ONLY
IF(IADM(1,2).NE.8) GO TO 9213
IADM(2,2)=MPUAND(IADM(2,2),7)
C*** CHECK FOR VALID MODES
IF(IADM(1,1).EQ.16) GO TO 8210
IF(IADM(1,1).LT.40) GO TO 9213
C*** IMM INVALID
IF(IADM(1,1).EQ.60) GO TO 9234
GO TO 8210
C
C*** SHIFTS
3500 CONTINUE
IF(IADM(1,1).EQ.60.AND.ISIZ.EQ.128) INSL=INSL-2
C*** MAKE #BITNO LOOK LIKE BITNO
IF(IADM(1,1).EQ.60) IADM(1,1)=56
IF(IADM(1,1).EQ.56) INSL=INSL-2
C*** ADDRESS REG IS ILLEGAL
IF(IADM(1,2).EQ.8) GO TO 9215
IF(IADM(1,2).NE.0) GO TO 3520
C... *** REGISTER SHIFT
IF(IADM(1,1).EQ.0) GO TO 3510
C... *** STATIC SHIFT
IF(IADM(1,1).NE.56) GO TO 9209
IF(INS(3).LT.1) GO TO 9216
IF(INS(3).GT.8) GO TO 9208
IF(INS(3).EQ.8) INS(3)=0
INS(1)=INS(1)+ISHFT(INS(3),9)+ISIZ+IADM(2,2)
RETURN
C... *** DYNAMIC SHIFT
3510 ISIZ=ISIZ + LSP
GO TO 8400
C... *** MEMORY SHIFT
3520 KK=MPUAND(INS(1),24)
INS(1)=INS(1) - KK + 192 + ISHFT(KK,6)
C*** 192 = $C0
C
C*** ALLOW SHIFT 1,MEMORY
IF(IADM(1,1).NE.56) GO TO 9209
IF(INS(3).NE.1) CALL ERR(236)
C*** WORD SIZE ONLY ALLOWED.
IF(ISIZ.NE.64) CALL ERR(238)
INS(3)=INS(5)
IF(IADM(7,2).EQ.0) GO TO 8600
IF(LFRF.GT.0.OR.TKNVA2.NE.0) INS(3)=INS(4)
GO TO 8600
C
C*** BIT INSTRUCTIONS
3600 CONTINUE
IF(IADM(1,1).EQ.60.AND.ISIZ.EQ.128) INSL=INSL-2
J=8
C*** AN DESTINATION ILLEGAL
IF(IADM(1,2).EQ.8) GO TO 9209
C*** IMM DESTINATION ILLEGAL
IF(IADM(1,2).EQ.60) GO TO 9209
C*** WORD ILLEGAL IN THIS CASE, MASK 3
IF(ISIZ.EQ.64.AND.MASK2.LT.2) CALL ERR(238)
C*** IF MASK 2 AND BX GO ADJUST IT
IF(MASK2.EQ.1) GO TO 3920
3605 IF(IADM(1,1).NE.0) GO TO 3610
C*** DYNAMIC - IS IT BTST?
IF(INS(1).EQ.256) GO TO 8510
C*** PC REL & PC REL + INDEX ILLEGAL FOR OTHERS
IF(IADM(1,2).GT.57.AND.IADM(1,2).LT.61) CALL ERR(231)
GO TO 8510
C*** STATIC
3610 IF(IADM(1,1).EQ.56.OR.IADM(1,1).EQ.60) GO TO 3620
GO TO 9209
C*** 1792=$700
3620 INS(1)=INS(1)+1792
IF(IADM(1,2).EQ.0) J=32
INS(3)=MOD(INS(3),J)
GO TO 3680
3640 INS(3)=INS(3)-8
GO TO 3680
C*** MASK2=1 - AND WE HAVE BX.BB - ADJUST FOR MASK 2
3660 CONTINUE
C*** ODD ADDRESS?
I=MPUAND(INS(5),1)
IF(I.EQ.0) GO TO 3670
INS(5)=INS(5)-1
GO TO 3930
3670 INS(3)=INS(3)+8
C*** TEST PC REL - PC REL + INDEX - VALID FOR BTST ONLY
3680 CONTINUE
C*** BTST+$700 AT THIS POINT
IF(INS(1).EQ.2048) GO TO 8600
IF(IADM(1,2).GT.57.AND.IADM(1,2).LT.61) CALL ERR(231)
GO TO 8600
3900 IF(IADM(1,2).EQ.8) GO TO 9209
IF(IADM(1,2).EQ.60) GO TO 9209
IF(IADM(1,1).EQ.60.AND.ISIZ.EQ.128) INSL=INSL-2
J=16
IF(MASK2.NE.0) GO TO 3605
3920 IF(IADM(1,1).EQ.0.AND.IADM(1,2).EQ.0) GO TO 8510
IF(IADM(1,1).EQ.0) GO TO 9209
C*** (AN)+ -(AN)
IF(IADM(1,2).EQ.24.OR.IADM(1,2).EQ.32) GO TO 9209
IF(IADM(1,2).EQ.0) J=32
INS(1)=INS(1)+1792
INS(3)=MOD(INS(3),J)
IF(IADM(1,2).EQ.0) GO TO 3680
IF(IOPC.EQ.36) GO TO 3660
IF(INS(3).GT.7) GO TO 3640
C*** ADJ ADDR BY
INS(5)=INS(5)+1
C*** IF (AN) SET UP DISPLACEMENT OF 1
3930 IF(IADM(1,2).NE.16) GO TO 3680
INSL=INSL+2
IADM(3,2)=1
IADM(1,2)=40
GO TO 3680
C
C*** MOVE INSTRUCTION
C... *** TEST FOR IMMEDIATE SOURCE AND D SINK
3700 CONTINUE
C*** CHECK FOR 2ND OPERAND PRESENT
IF(IADM(1,2).EQ.-1) GO TO 9209
C*** MOVE S,PC REL OR PC REL+INDEX ILLEGAL
IF(IADM(1,2).GT.57.AND.IADM(1,2).LT.61) CALL ERR(231)
C*** MOVEQ?
IF(INS(1).EQ.I7KH) GO TO 3705
IF(IADM(1,1).NE.60) GO TO 3710
C*** IMM PC REL INVALID
IF(SYMTYP.EQ.1) CALL ERR(231)
IF(IADM(1,2).NE.0) GO TO 3710
C... *** MOVE #,0 - CAN WE USE LDQ?
C*** 128 = $80
IF(ISIZ.NE.128) GO TO 3710
C*** FORWARD REFERENCE?
IF(IADM(5,1).GT.0) GO TO 3710
IF(INS(3).LT. -127) GO TO 3710
IF(INS(3).GT.127) GO TO 3710
IF(INS(2).NE.0.AND.INS(2).NE.-1) GO TO 3710
IF(INS(2).EQ.0.AND.MPUAND(TKNVAL,Z8000).NE.0) GO TO 3710
C... *** USE LDQ
3705 INS(1)= I7KH + ISHFT(IADM(2,2),9) + MPUAND(INS(3),255)
INSL=2
C*** ONLY DN DEST ALLOWED
IF(IADM(1,2).NE.0) GO TO 9209
IF(IABS(INS(3)).GT.KCFF) GO TO 9210
RETURN
3710 IF(ISIZ.NE.0) GO TO 3720
C... *** BYTE MODE
IF(IADM(1,1).EQ.8) GO TO 9217
IF(IADM(1,2).EQ.8) GO TO 9217
3720 INS(1)=ISHFT(ISIZ,6)+4096
C*** MOVE.W= OPCODE 3 - MOVE.L = OPCODE 2
C*** 12288=$3000 - 8192=$2000
IF(ISIZ.EQ.0) GO TO 3726
IF(INS(1).EQ.12288) GO TO 3722
INS(1)=12288
GO TO 3726
3722 INS(1)=8192
3726 CONTINUE
KM=MPUAND(IADM(1,2),56)
IF(KM.EQ.56) GO TO 3730
C... *** REGISTER MODE (00-60)
KR=MPUAND(IADM(2,2),7)
GO TO 3740
C... *** MEMORY MODE (7X)
3730 KR=MPUAND(IADM(1,2),7)
C... *** FORM FIELD-1 REG,MODE
3740 INS(1)=INS(1)+ISHFT(KR,9)+ISHFT(KM,3)
C... *** FORM FIELD-2 EA
C
C... *** TEST FOR CONTROL REGISTER SOURCE
IF(IADM(1,1).NE.64) GO TO 3760
C... *** SOURCE IS CONTROL REGISTER - ASSURE USP -> A
IF(IADM(2,1).NE.16) GO TO 3750
IF(IADM(1,2).NE.8) GO TO 9213
C
INS(1)=IH4E60 + IADM(2,2)
RETURN
C
C... *** MOVE SR,EA?
3750 IF(IADM(2,1).NE.124) GO TO 9233
C... *** 124 = $7C
INS(1)=IH40C0
GO TO 8600
C... *** TEST FOR CONTROL REGISTER DESTINATION
3760 IF(IADM(1,2).NE.64) GO TO 8300
C... *** DESTINATION IS CONTROL REGISTER A-> USP?
IF(IADM(2,2).NE.16) GO TO 3770
C
IF(IADM(1,1).NE.8) GO TO 9213
INS(1)=(IH4E60 - 8) + IADM(2,1)
RETURN
C... *** ASSUME EA -> CC/SR
3770 INS(1)=IH44C0
IF(IADM(2,2).EQ.124) INS(1)=IH46C0
GO TO 8300
C
C*** LDM,STM - MOVEM
C*** 19456 = $4C00
3800 INSL=INSL+2
C
C*** CHECK FOR ILLEGAL LDM
IF(IADM(1,1).LT.9.AND.INS(1).EQ.19456) GO TO 9209
INS(5)=INS(3)
INS(4)=INS(2)
KM=2
KK=1
C*** IS IT STM PART OF MOVEM?
IF(IADM(1,1).LT.9) GO TO 3810
INS(1)=19456
C*** LDM - ASSURE NOT -1(A)
IF(IADM(1,1).EQ.32) GO TO 9209
C*** PUT IN BIT 7 FOR LDM
INS(1)=INS(1) + 128
C*** SET THE MASK A0-D7 IN
INS(3)=IADM(6,1)
GO TO 3820
C*** STM - ASSURE NOT (A)+ OR PC RELATIVE
3810 CONTINUE
KK=2
KM=1
C*** SET IN D0-A7 BIT MASK
INS(3)=IADM(6,2)
IF(IADM(1,2).EQ.24) GO TO 9209
IF(IADM(1,2).GE.58) GO TO 9208
C*** ASSURE NOT BYTE MODE
3820 IF(ISIZ.EQ.0) GO TO 9217
ISIZ=ISIZ-64
C
C*** DISALLOW REGISTER DIRECT MODES
IF(IADM(1,KK).LE.8) GO TO 9209
C*** ASSURE MASK IS FIRST FIELD
IF(IADM(1,KM).GT.8) GO TO 9209
IF(INSL.EQ.6) IADM(3,2)=2
IF(INSL.EQ.8) IADM(3,2)=4
INS(1)=INS(1) + ISIZ
C*** IF CONTROL MODE (AN), MASK MUST APPEAR SAME AS LDM MASK FOR (AN).
IF(IADM(1,2).EQ.16.OR.IADM(1,2).EQ.40) INS(3)=IADM(6,1)
IF(IADM(1,2).EQ.56.OR.IADM(1,2).EQ.57) INS(3)=IADM(6,1)
IF(IADM(1,2).EQ.48) INS(3)=IADM(6,1)
C*** LDM STM
GO TO (8300,8600),KK
C
C*** --- STANDARD ACTIONS --
C
C*** IMMEDIATE OPCODE
C*** ADDI/SUBI TO AN ILLEGAL
6980 IF(IADM(1,2).EQ.8) GO TO 9209
C*** MUST BE IMM
IF(IADM(1,1).NE.60) GO TO 9209
7000 IF(IADM(1,2).EQ.60) GO TO 9209
KK=ISHFT(INS(1),-12)
KK=MPUAND(KK,7)
INS(1)=IMCD(KK+1)+ISIZ
IF(IADM(1,2).EQ.8) GO TO 9215
GO TO 8610
C
C*** REGISTER-REGISTER OPCODES
7100 KK=ISHFT(IADM(2,2),9)
INS(1)=MPUIOR(INS(1),KK)+ISIZ
INS(1)=MPUIOR(INS(1),IADM(2,1))
RETURN
C
C -------- FIELD 1 --> FIELD 2 -------
C
C*** ESTABLISH SIZE IN BITS 7-6
C... *** IS IMMEDIATE EA ALLOWED?
8100 IF(IADM(1,1).NE.60) GO TO 8110
IF(NIMM(IOPC).NE.0) GO TO 9218
8110 INS(1)=INS(1)+ISIZ
C
C*** ESTABLISH REGISTER(2) IN BITS 11-9
8200 IF(IADM(1,2).NE.0) GO TO 9215
8210 KK=ISHFT(IADM(2,2),9)
INS(1)=MPUIOR(INS(1),KK)
C
C*** ESTABLISH EA(1) IN BITS 5-0
8300 IF(IADM(1,1).LT.0) GO TO 9209
INS(1)=INS(1)+IADM(1,1)
IF(IADM(1,1).NE.0) GO TO 8320
C... *** DATA REGISTER MODE
INS(1)=INS(1)+IADM(2,1)
RETURN
8320 IF(IADM(1,1).LT.56) INS(1)=INS(1)+IADM(2,1)-8
C... *** ASSURE NOT SR DESTINATION
IF(IADM(1,1).EQ.64) GO TO 9233
RETURN
C
C -------- FIELD 2 --> FIELD 1 -------
C*** ESTABLISH SIZE IN BITS 7-6
8400 INS(1)=INS(1)+ISIZ
C
C*** ESTABLISH DATA REGISTER(1) IN BITS 11-9
8500 IF(IADM(1,1).NE.0) GO TO 9215
8510 INS(1)=INS(1)+ISHFT(IADM(2,1),9)
C
C*** ESTABLISH EA(2) IN BITS 5-0
C... *** IS IMMEDIATE EA ALLOWED?
8600 IF(IADM(1,2).NE.60) GO TO 8610
IF(NIMM(IOPC).NE.0) GO TO 9218
8610 IF(IADM(1,2).LT.0) GO TO 9209
INS(1)=INS(1)+IADM(1,2)
IF(IADM(1,2).NE.0) GO TO 8620
C... *** DATA REGISTER MODE
INS(1)=INS(1)+IADM(2,2)
RETURN
8620 IF(IADM(1,2).LT.56) INS(1)=INS(1)+IADM(2,2)-8
C... *** ASSURE NOT SR DESTINATION
IF(IADM(1,2).EQ.64) GO TO 9233
RETURN
C
C*** ERROR STOPS
C
C*** BYTE SIZE ERROR
9205 CALL ERR(205)
RETURN
C... *** RANGE ERROR
9208 CALL ERR(208)
RETURN
C... *** ILLEGAL ADDRESS MODE
9209 CALL ERR(209)
RETURN
C*** VALUE TO BIG
9210 CALL ERR(210)
RETURN
C*** DATA SIZE INVALID
9212 CALL ERR(212)
RETURN
C... *** REGISTER MUST BE ADDRESS REGISTER
9213 CALL ERR(213)
RETURN
C... *** REGISTER MUST BE DATA REGISTER
9215 CALL ERR(215)
RETURN
C... *** NEGATIVE NOT ALLOWED
9216 CALL ERR(216)
RETURN
C... *** BYTE MODE NOT ALLOWED
9217 CALL ERR(217)
RETURN
C... *** DESTINATION MUST BE ALTERABLE
9218 CALL ERR(218)
RETURN
C... *** UNDEFINED ACTION (INTERNAL ERROR)
9223 CALL ERR(223)
RETURN
C... *** ILLEGAL REGISTER FOR THIS INSTRUCTION
9233 CALL ERR(233)
RETURN
12340 INSL=4
9234 CALL ERR(234)
RETURN
END
SUBROUTINE OBJ
CC NAM: OBJ VER: 1.0 DAT: 12/08/78 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: CREATE THE OBJECT FILE OUTPUT
CC STUFFS EACH BYTE INTO A BUFFER, CALCULATES CHECKSUM.
CC
CC REV: N/A
CC
CCALLS PNCH
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ
C
C*** RETURN IF NO PUNCH OUTPUT DESIRED
IF(IOBJ.EQ.0) RETURN
IF(INSL.LE.0) RETURN
C*** IF LONG 'STRING' DO NOT PUT OUT AGAIN
IF(INSL.EQ.9) RETURN
C*** SPC?
IF(INSL.EQ.20) RETURN
IF(INSL.NE.1) CALL PNCH(4,ISHFT(INS(1),-8))
CALL PNCH(4,INS(1))
GO TO (100,100,200,200,300,300,400,400,500,500),INSL
C... *** ONE WORD
100 RETURN
C... *** THREE WORD OR LARGER
C
300 IF(IADM(3,2).EQ.0) GO TO 500
GO TO 200
400 IF(IADM(3,2).NE.2) GO TO 200
C... *** PUNCH INS(2)
500 CALL PNCH(4,ISHFT(INS(2),-8))
CALL PNCH(4,INS(2))
C... *** TWO WORD
200 CALL PNCH(4,ISHFT(INS(3),-8))
CALL PNCH(4,INS(3))
IF(INSL.LT.6) RETURN
IF(IADM(3,2).EQ.0) RETURN
C... *** FOUR/FIVE WORD
C
IF(IADM(3,2).NE.4) GO TO 1000
C... *** PUNCH INS(4)
CALL PNCH(4,ISHFT(INS(4),-8))
CALL PNCH(4,INS(4))
C... *** FIVE WORD
1000 CALL PNCH(4,ISHFT(INS(5),-8))
CALL PNCH(4,INS(5))
RETURN
END
SUBROUTINE PNCH(JTYP,JVAL)
CC NAM: PNCH VER: 1.0 DAT: 02/19/79 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: JTYP - FUNCTION TYPE
CC 1 - OUTPUT HEADER
CC 2 - OUTPUT TRAILER
CC 3 - NEW ORIGIN
CC 4 - NEXT BYTE IN SEQUENCE
CC 5 - ADJUST COUNT FOR A 'DS'
CC JVAL - DATA BYTE
CC
CC RTN: JTYP - N/C
CC JVAL - N/C
CC
CC FNC: WRITE THE OBJECT RECORDS TO DEVICE 'LUOO'
CC IF NO OUTPUT DESIRED(IOBJ=0) IT RETURNS.
CC S1 RECORD = 2 BYTE ADDRESS
CC S2 RECORD = 3 BYTE ADDRESS
CC
CCALLS MPUAND-HEXASC-ISHFT-ADD
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
DIMENSION LIN(17)
DIMENSION LIN2(50)
DATA JX/0/
DATA CKSM/0/
DATA JPC/0/,JPC1/0/
DATA ISREC/1/
9900 FORMAT('S',I1,50A1)
C*** CHECK FOR NO OBJECT OUT
IF(IOBJ.EQ.0) RETURN
JVAL1=JVAL
GO TO(100,200,300,400,250),JTYP
C
C*** OUTPUT HEADER
100 WRITE(LUOO,110)
110 FORMAT('S00600004844521B')
RETURN
C
200 CONTINUE
C*** OUTPUT TRAILER
C*** ASSURE LAST RECORD IS OUT
IF(JX.NE.0) GO TO 410
220 WRITE(LUOO,210)
210 FORMAT('S9030000FC')
RETURN
C*** INCREMENT FOR A 'DS'
250 NPC1=IPC2
NPC=IPC
CALL ADD(NPC1,NPC,INS(2),JVAL1)
GO TO 320
C
C*** NEW ORIGIN
300 NPC=JVAL1
NPC1=IPC2
320 IF(JX.NE.0) GO TO 410
GO TO 430
C
C*** NEXT BYTE IN SEQUENCE
400 CONTINUE
JX=JX+1
LIN(JX)=JVAL1
C*** IS THIS FIRST TIME THRU?
IF(CKSM.NE.0) GO TO 405
C*** ADD 2 BYTE ADDRESS TO COUNT
J=ISHFT(JPC,-8)
CKSM=IPC2 + J + MPUAND(JPC,KCFF)
405 CKSM=CKSM+JVAL1
IF(JX.NE.16) RETURN
C*** OUTPUT THE FULL LINE
C*** NPC=NPC+JX - USE 'ADD' TO GET 32 BITS.
CALL ADD(NPC1,NPC,0,JX)
410 JX=JX+1
C*** JXX= # BYTES IN RECORD INCLUDING CHECK SUM
JXX=JX + 2 + ISREC - 1
J=CKSM + JXX
C*** CALCULATE THE CHECK SUM.
CKSM=KCFF - MPUAND(J,KCFF)
LIN(JX) = CKSM
C*** CONVERT THE WHOLE MESS TO ASCII
CALL HEXASC(JXX,LIN2,2,1)
CALL HEXASC(JPC,LIN2,4,5)
J=7
DO 415 I=1,JX
J=J+2
CALL HEXASC(LIN(I),LIN2,2,J)
415 CONTINUE
J=J+1
C*** IS IT 16 OR 24 BIT ADDRESS?
IF(ISREC.EQ.1) GO TO 425
CALL HEXASC(JPC1,LIN2,2,3)
WRITE(LUOO,9900) ISREC,(LIN2(I),I=1,J)
GO TO 430
C*** 2 BYTE ADDRESS.
425 WRITE(LUOO,9900) ISREC,LIN2(1),LIN2(2),(LIN2(I),I=5,J)
430 JX=0
C*** OUTPUT TRAILER?
IF(JTYP.EQ.2) GO TO 220
CKSM = 0
C*** INCREMENT THE P-COUNT
JPC=NPC
JPC1=NPC1
IF(JPC1.NE.0) ISREC=2
IF(JPC1.EQ.0) ISREC=1
RETURN
END
SUBROUTINE PRSYM
CC NAM: PRSYM VER: 1.0 DAT: 01/31/79 CMP: PDP-11
CC
CC SYS:MACS
CC
CC ENT: N/A
CC
CC RTN: N/A
CC
CC FNC: FIND SYMBOL NAME AND ADDRESS IN SYMBOL TABLE,
CC STUFF IN LOW 'ISYM', SORT, THEN OUTPUT TO 'LUOT'.
CC
CCALLS MPUGTC-MPUPTC-MPUAND-PAGE-ISHFT
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
COMMON /A/ NXSYM1
DATA LSN/1/
DATA LSPP/' '/
C*** SHOULD TABLE BE LISTED?
IF(LIST.EQ.0) RETURN
9900 FORMAT(//' SYMBOL TABLE - APPROX',I5,' SYMBOL ENTRIES LEFT'/)
NX=(LENSYM-NXSYM)/9
WRITE(LUOT,9900) NX
CALL PAGE(4)
NX=NXSYM1
10 ISIZ=ISHFT(ISYM(NX+1),-8)
ITYP=MPUAND(ISYM(NX+1),255)
C*** CHECK FOR MACRO
IF(ITYP.EQ.255) GO TO 1000
IF(ITYP.NE.1) GO TO 850
C*** SYMBOL IS A LABEL
JPTR=NX+ISIZ+3
ITYP=MPUAND(ISYM(JPTR),7)
IF(ITYP.GT.1) GO TO 850
C*** GET CHAR SYMBOL 2 BY 2
I=ISIZ*2
CALL MPUGTC(J,ISYM(NX+3),I)
C*** IF LAST CHAR IS BINARY ZERO, REPLACE WITH ASCII BLANK
IF(J.EQ.0) CALL MPUPTC(LSP,ISYM(NX+3),I)
I=ISYM(NX+3)
J=LSPP
IF(ISIZ.GT.1) J=ISYM(NX+4)
K=LSPP
IF(ISIZ.GT.2) K=ISYM(NX+5)
L=LSPP
IF(ISIZ.GT.3) L=ISYM(NX+6)
JJ=LSN
IF(LSN.EQ.1) GO TO 800
70 II=LSN/6
C*** NEGATIVE DO LOOP VALUE
M= -1
C*** FIND WHERE THIS SYMBOL GOES ALPHABETICALLY & INSERT
C*** NEXT HIGH LOCATION IN TABLE
KK=1
IF(II.EQ.2) KK=7
IF(II.LT.3) GO TO 100
II=(II+1)/2
KK=LSN - II*6
C*** UPPER HALF OF ARRAY?
100 CONTINUE
KKK=KK
IF(ISYM(KK).LT.I) GO TO 200
C*** LOWER HALF?
IF(ISYM(KK).GT.I) GO TO 400
IF(ISYM(KK+1).LT.J) GO TO 200
IF(ISYM(KK+1).GT.J) GO TO 400
IF(ISYM(KK+2).LT.K) GO TO 200
IF(ISYM(KK+2).GT.K) GO TO 400
IF(ISYM(KK+3).LT.L) GO TO 200
IF(ISYM(KK+3).GT.L) GO TO 400
C*** UPPER HALF OF ARRAY, FIND WHICH HALF OF THIS HALF SYMBOL FALLS IN
C*** ARE WE DONE?
200 IF(II.EQ.1) GO TO 500
C*** NOT DONE, CUT IN HALF AGAIN
KK=KK + (II/2)*6
II=(II+1)/2
C*** ARE WE AT TOP OF TABLE?
IF(KK.GE.LSN) GO TO 800
GO TO 100
C*** LOWER HALF, CUT IT IN HALF
400 IF(II.EQ.1) GO TO 450
KK=KK - (II/2)*6
II=(II+1)/2
GO TO 100
C*** CHECK FOR POSSIBILITY CURRENT VALUE IS LESS THAN
C*** NEXT LOWEST ONE BEING POINTED AT.
450 IF(KK.EQ.1) GO TO 550
C*** CHECK NEXT LOWER VALUE.
KK=KK-6
GO TO 100
500 KKK=KKK+6
550 CONTINUE
C*** MOVE SYMBOLS UP IN TABLE
JJ=LSN
600 ISYM(JJ+6)=ISYM(JJ)
C*** IS LOOP DONE?
IF(JJ.EQ.KKK) GO TO 800
JJ=JJ-1
GO TO 600
C*** INSERT CURRENT SYMBOL
C*** SET NEXT SYMBOL IN ALPHABETICAL ORDER
800 ISYM(JJ)=I
ISYM(JJ+1)=J
ISYM(JJ+2)=K
ISYM(JJ+3)=L
C*** INSERT ADDRESS OF SYMBOL.
ISYM(JJ+4)=ISYM(NX)
ISYM(JJ+5)=ISYM(JPTR+1)
C*** FIND BYTE POSITION TO CHECK FOR ZERO IF ODD # OF CHAR IN NAME.
LSN=LSN+6
C*** ADVANCE TOTHE NEXT SYMBOL
850 NX=NX+ISIZ+5
IF(NX.LT.NXSYM) GO TO 10
C*** IF NO ENTRIES DON'T OUTPUT.
870 IF(LSN.EQ.1) GO TO 900
LSN=LSN-1
C*** PRINT SYMBOL TABLE
DO 300I=1,LSN,24
NX=I+23
IF(NX.GT.LSN) NX=LSN
II=1
DO 250 J=I,NX,6
JBUF(II)=ISHFT(ISYM(J),8)+ISHFT(ISYM(J),-8)
JBUF(II+1)=ISHFT(ISYM(J+1),8)+ISHFT(ISYM(J+1),-8)
JBUF(II+2)=ISHFT(ISYM(J+2),8)+ISHFT(ISYM(J+2),-8)
JBUF(II+3)=ISHFT(ISYM(J+3),8)+ISHFT(ISYM(J+3),-8)
C*** CONVERT HEX TO ASCII
CALL HEXASC(ISYM(J+4),JBUF,2,II+4)
CALL HEXASC(ISYM(J+5),JBUF,4,II+6)
II=II+10
250 CONTINUE
II=II-1
WRITE(LUOT,998) (JBUF(J),J=1,II)
CALL PAGE(1)
300 CONTINUE
998 FORMAT(4(1X,4A2,3X,6A1))
900 CONTINUE
RETURN
C*** FIND END OF MACRO AND START WITH SYMBOL FOLLOWING IT.
1000 CONTINUE
NX=NX+ISIZ+5
1040 K=1
IF(NX.GE.NXSYM) GO TO 870
1050 CALL MPUGTC(I,ISYM(NX),K)
K=K+1
C*** END OF MACRO DEFINITION IS A 04 FOLLOWED BY WORD OF ZEROS
IF(I.NE.4) GO TO 1050
NX=NX+(K+2)/2-1
IF(ISYM(NX).NE.0) GO TO 1040
NX=NX+1
GO TO 10
END
SUBROUTINE PAGE(LCNT)
CC NAM: PAGE VER: 1.0 DAT: 02/02/79 CMP: PDP-11
CC
CC SYS: MC6800 ASM
CC
CC ENT: LCNT - NUMBER OF LINES JUST OUTPUT, OR IF > 79 THEN
CC - 80 = SET TTL IN BUFFER
CC - 81 = OUTPUT HEADER TO DEVICE 'LULT'
CC - 82 = OUTPUT HEADER TO DEVICE 'LUOT'
CC - 83 = SAME AS 82 FOR PDP-11
CC - 84 = 'PAGE', SLEW TO TOP OF PAGE IF 'LUOT'=PRINTER
CC - 85 = SKIP TO BOTTOM OF PAGE, DONOT PRINT HEADER
CC
CC RTN: N/C
CC
CC FNC: THIS ROUTINE INCREMENTS THE LINE COUNTER AND OUTPUTS A
CC TOP OF PAGE HEADER AT PROPER TIME. IT PUTS
CC HEADER INTO OUTPUT BUFFER WHEN ENCOUNTERING THE 'TTL'
CC COMMAND. PAGING IS EFFECTIVE FOR PRINTER OUTPUT ONLY.
CC THIS ROUTINE CONTAINS THE RELEASE # AND COPYRIGHT
CC MESSAGE IN A DATA STATEMENT, THE ONLY PLACE IT APPEARS
CC IN THE PROGRAM.
CC NOTE: THIS ROUTINE CAN POSSIBLY BE CHANGED TO CALL ADD ROUTINE
CC THIS WOULD HELP DECREASE ASSEMBLE TIME. TRY:
CC CALL ADD(IPC2,IPC,0,INSL)
CC THEN REMOVE ALL OTHER INSTRUCTIONS FROM DATA IO1
CC TO STATEMENT 240.
CC
CCALLS MPUPTC
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST,LUCI,LULT,MFLD(11,3),IOBJ,LLENSW,NOP
DIMENSION ITTL(30)
C*** RELEASE AND COPYRIGHT MESSAGE..
DATA ITTL/'MC','68','00','0 ','AS','M ','RE'
& ,'V=',' 1','.4',' -',' C','OP','YR','IG','HT'
& ,' B','Y ','MO','TO','RO','LA',' 1','97','8 ',' ',
& ' ',' ',' ',' '/
DATA IPAGE/1/,LINENO/0/
DATA ITTLSZ/30/
C*** ITTLSZ IS SIZE OF 'ITTL'
DATA ISW/0/
998 FORMAT(2X,30A2,' PAGE',I3//)
9900 FORMAT(80A1)
9910 FORMAT(5X,40A2)
9920 FORMAT(1X,30A2)
9930 FORMAT(2X,30A2)
C*** ALWAYS SET TTL
IF(LCN.EQ.80) GO TO 500
C** IS LISTING REQUIRED?
IF(LIST.EQ.0) RETURN
C*** IS PAGING REQUIRED?
IF(NOP.EQ.0) RETURN
LCN=LCNT
IF(LCN.GT.79) GO TO 500
C*** INCREMENT LINE COUNT
LINENO=LINENO+LCN
IF(LINENO.LT.IPLEN-6) RETURN
C*** PAGE IT
GO TO 8400
500 CONTINUE
LCN=LCN-79
GO TO(8000,8100,8200,8300,8400,8400),LCN
RETURN
C*** PUT TTL IN BUFFER
8000 CONTINUE
DO 8020 I=1,30
8020 ITTL(I)=' '
J=1
C*** FIND 'TTL' IN BUFFER
DO 8030 I=LCN,72
C*** LOOK FOR 'L' IN 'TTL'
IF(KARD1(I).EQ.76) GO TO 8040
8030 CONTINUE
8040 LCN= I+1
C*** INSERT THE TITLE.
DO 8050 I=LCN,64
CALL MPUPTC(KARD1(I),ITTL,J)
J=J+1
8050 CONTINUE
C*** REVERSE THE LETTERS IN TITLE
DO 8060 I=1,30
ITTL(I)=ISHFT(ITTL(I),8) + ISHFT(ITTL(I),-8)
8060 CONTINUE
RETURN
C*** OUTPUT TO 'LULT'
8100 WRITE(LULT,9920) (ITTL(I),I=1,ITTLSZ)
RETURN
C*** OUTPUT TO LUOT
8200 CONTINUE
C*** IF ERRORS IN PASS1 SLEW TO TOP OF PAGE FOR PASS2
IF(LINENO.EQ.3) RETURN
IF(LINENO.EQ.0) GO TO 8220
GO TO 8400
8220 IF(LUOT.NE.LULT) WRITE(LUOT,998) (ITTL(I),I=1,ITTLSZ),IPAGE
IPAGE=IPAGE+1
LINENO=3
RETURN
8300 CONTINUE
GO TO 8200
8400 CONTINUE
C*** SKIP TO TOP OF PAGE
IF(LUOT.EQ.LULT) RETURN
DO 8450 I=LINENO,IPLEN
WRITE(LUOT,9900) LSP
8450 CONTINUE
LINENO=3
IF(LCN.EQ.6) RETURN
GO TO 8220
9000 RETURN
END
SUBROUTINE PCOUNT
CC NAM: PCOUNT VER: 1.0 DAT: 01/29/79 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: 'IPC' CONTAINS 2 LEAST SIGNIFICANT BYTES OF P-COUNT.
CC 'IPC2' = MOST SIGNIFICANT BYTE OF P-COUNTER.
CC 'INSL' = AMOUNT TO INCREMENT P-COUNT BY.
CC
CC RTN: 'IPC' AND 'IPC2' HAVE NEXT P-COUNT.
CC
CC FNC: THE CURRENT INSTRUCTION LENGTH IN 'INSL' IS ADDED
CC TO 'IPC' & 'IPC2' TO GIVE NEXT INSTRUCTION ADDRESS.
CC
CC REV: N/A
CC
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST
DATA IO1/O100000/,IO7/O77777/
C*** SAVE M.S. BIT
K=IPC .AND. IO1
C*** REMOVE M.S. BIT SO CARRY ON ADD CAN BE DETECTED
IPC=IPC .AND. IO7
IPC=IPC + INSL
C*** DID ADD PUT A BIT IN 16TH POSITION?
J=IPC .AND. IO1
IF(J.NE.0) GO TO220
C*** NO CARRY ON ADD, PUT 16TH BIT BACK IN CASE IT IS 1.
IPC=IPC .OR. K
GO TO 240
220 CONTINUE
C*** ADD HAD CARRY, INCREMENT 2ND WORD IF PREVIOUS UPPER BIT NOT ZERO.
IF(K.NE.0) K=1
IPC2=IPC2+K
C*** J NE 0 AND K NE 0 THERE IS ROLL OVER AND 16TH BIT MUST BE ZERO.
IF(K.EQ.1) IPC=IPC .AND. IO7
240 CONTINUE
RETURN
END
SUBROUTINE HEXASC(IHEX,IB,KNT,IPOS)
CC NAM: HEXASC VER: 1.0 DATE: 05/18/19 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: IHEX - CONTAINS HEX CHARACTERS TO CONVERT
CC IB - N/A
CC KNT - NUMBER OF HEX CHAR TO CONVERT
CC MAX OF 4 HEX CHARS, ONE WORD, CAN BE CONVERTED AT A TI
CC IPOS - POSITION IN 'IB' TO PUT THE CONVERTED CHARS.
CC
CC RTN: IHEX - N/C
CC IB - CONTAINS THE HEX CHARS IN ASCII, 1 PER WORD
CC KNT - N/C
CC IPOS - N/C
CC
CC REV: N/A
CC
CC
CC FNC: CHANGE HEX VALUES TO ASCII AND STORE ONE CONVERTED HEX VALUE
CC PER ARRAY WORD.
CC
CCALLS MPUAND-ISHFT
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST
DIMENSION IB(120)
IPOS2=IPOS+KNT-1
K=IHEX
DO 100 I=1,KNT
C*** GET 1ST 4 BITS
J=MPUAND(K,15)
C*** CHECK 0-9 & A-F
IF(J.GT.9) GO TO 50
C*** 0-9
IB(IPOS2)=J+48
GO TO 80
C*** A-F
50 CONTINUE
IB(IPOS2)=J + 55
80 IPOS2=IPOS2-1
C*** GET THE NEXT 4 BITS TO THE RIGHT, LEAST SIGNIFICANT.
K=ISHFT(K,-4)
100 CONTINUE
RETURN
END
FUNCTION MPUAND (JA,JB)
CC NAM: MPUAND VER: 1.0 DATE: 04/16/79 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: JA - VALUE TO BE ANDED
CC JB - VALUE TO AND WITH
CC
CC RTN: JA - N/C
CC JB - N/C
CC
CC FNC: 'AND' JA WITH JB
CC
CC REV: N/A
C*
MPUAND=JA .AND. JB
RETURN
END
FUNCTION MPUIOR (JA,JB)
CC NAM: MPUIOR VER: 1.0 DATE: 04/16/79 CMP:PDP-11
CC
CC SYS: MACS
CC
CC ENT: JA - VALUE TO BE 'ORED'
CC JB - VALUE TO USE IN THE 'OR'
CC
CC RTN: JA - N/C
CC JB - N/C
CC
CC FNC: THE VALUE OF JB IS 'ORED' INTO JA
CC
CC REV: N/A
CC
C*
MPUIOR= JA .OR. JB
RETURN
END
FUNCTION ISHFT(K1,K2)
CC NAM: ISHFT VER: 1.0 DATE: 04/16/79 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: K1 - VALUE TO BE SHIFTED
CC K2 - AMOUNT TO SHIFT K1
CC = MINUS VALUE, SHIFT RIGHT TO LSB.
CC = POSITIVE VALUE, SHIFT LEFT, HIGH ORDER BIT.
CC
CC RTN: K1 - N/C
CC K2 - N/C
CC
CC FNC: SHIFT A 16-BIT WORD RIGHT OR LEFT.
CC
CC REV: N/A
CC
CCALLS IABS
DATA IO7/O37777/
DATA IO57S/O77777/
DATA IO4/O40000/
DATA IO1/O100000/
K=K1
C***
C*** ASSEMBLY ROUTINE SHIFT MAY NOT BE RETURNING RIGHT
C**
C*** USE MULT AND DIVIDE FOR NOW
C
KK=K2
50 CONTINUE
C*** IF SHIFT VALUE IS ZERO, RETURN
IF(KK.EQ.0) GO TO 300
IF(KK.LT.0) GO TO 100
DO 80 I=1,KK
C*** SAVE 15TH BIT IN CASE ON. IF SO IT CAUSES A RUNTIME
C*** MULTIPLY ERROR. IF ON IT MUST BE OR'ED IN LATER SO IT ISN'T LOST
KKK=K .AND. IO4
K=K .AND. IO7
80 K=K*2
C*** IF THE 15TH BIT WAS ON BEFORE LAST SHIFT, OR IT IN HERE, IT IS
C*** THE 16TH BIT.
IF(KKK.NE.0) K=K .OR. IO1
ISHFT=K
RETURN
100 KK=IABS(KK)
C*** STATEMENT: KK= -KK APEARS TO CAUSE F342 ERROR, SO USED IABS
DO 250 I=1,KK
C*** KEEP UPPER BIT IN CASE ON. IF IT IS ON IT MUST BE OR'ED
C*** IN. IF LEFT ON # IS MINUS AND DIVIDE WILL NOT WORK FOR SHIFTING
C*** DATA.
KKK=K .AND. IO1
K=K .AND. IO57S
K=K/2
C*** IF 16TH BIT WAS ON PUT IT IN 15TH POSITION .
IF(KKK.NE.0) K=K .OR. IO4
250 CONTINUE
300 CONTINUE
ISHFT=K
RETURN
END
SUBROUTINE MPUPTC(JBYT,JBUF,JBIX)
CC NAM: MPUPTC VER: 1.0 DATE: 04/19/79 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: JBYT - BYTE IN THE RIGHT 8 BITS OF THE WORD(LOW ORDER BITS)
CC JBUF - N/A
CC JBIX - BYTE INDEX LOCATION TO PLACE JBYT IN JBUF, LEFT BYTE
CC IS BYTE 1 ETC.
CC
CC RTN: JBYT - N/C
CC JBUF - CONTAINS BYTE FROM JBYT IN THE JBIX POSITION
CC JBIX - N/C
CC
CC FNC: TAKE THE RIGHT JUSTIFIED, ZERO FILLED BYTE FROM
CC JBYT AND PLACE IT IN THE JBIX POSITION OF JBUF.
CC
CC REV: N/A
CC
CCALLS MPUAND-ISHFT-MOD
CC
C*
DIMENSION JBUF(10)
DATA IOV1/O177400/
K1=JBIX
J1=JBYT
KK=MOD(K1,2)
IF(KK.EQ.0) GO TO 500
C*** M.S. BYTE - UPPER BYTE OF WORD
K1=K1/2+1
KK=JBUF(K1)
JBUF(K1)=MPUAND(KK,255) + ISHFT(J1,8)
RETURN
C*** L.S. BYTE - LOWER BYTE OF WORD
500 CONTINUE
K1=K1/2
KK=JBUF(K1)
JBUF(K1)=MPUAND(KK,IOV1) + J1
RETURN
END
SUBROUTINE MPUGTC(JBYT,JBUF,JBIX)
CC NAM: MGUPTC VER: 1.0 DATE: 04/19/79 CMP: 16-BIT
CC
CC SYS: MACS
CC
CC ENT: JBYT - N/A
CC JBUF - WORD OR ARRAY CONTAINING DESIRED BYTE(CHAR)
CC JBIX - INDEX, POSITION IN JBUF TO GET BYTE(CHAR) FROM
CC
CC RTN: JBYT - BYTE(CHAR) FROM JBUF, RIGHT JUSTIFIED, ZERO FILLED
CC JBUF - N/C
CC JBIX - N/C
CC
CC FNC: TAKE THE JBIX BYTE(CHAR) FROM JBUF AND STORE IT
CC RIGHT JUSTIFIED, ZERO FILLED IN JBYT, THE LOWER 8 BITS.
CC
CC REV: N/A
CC
CCALLS MPUAND-ISHFT-MOD
CC
C*
DIMENSION JBUF(1)
K1=JBIX
KK=MOD(K1,2)
IF(KK.EQ.0) GO TO 500
C*** M.S. BYTE - UPPER BYTE OF WORD
K1=K1/2+1
KK=JBUF(K1)
JBYT=ISHFT(KK,-8)
RETURN
C*** L.S. BYTE - LOWER BYTE OF WORD
500 CONTINUE
K1=K1/2
KK=JBUF(K1)
JBYT=MPUAND(KK,255)
RETURN
END
SUBROUTINE ASCBIN
CC NAM: ASCBIN VER: 1.0 DATA@E: 04-23/79 CMP: PDP-11
CC
CC SYS: MACS
CC
CC ENT: 'ITOKEN' = THE ARRAY WHICH CONTAINS THE RIGHT JUSTIFIED
CC ZERO FILLED ASCII NUMBER.
CC 'TKNSIZ' = NUMBER OF CHARACTERS IN 'ITOKEN'
CC 'TKNVAL AND 'TKNVA2'= 0
CC
CC RTN: 'TKNVAL' = 2 LEAST SIGNIFICANT BYTES.
CC 'TKNVA2' = 2 M.S.B.
CC
CC FNC: THIS ROUTINE TAKES A RIGHT JUSTIFIED, ZERO FILLED ASCII
CC ARRAY AND CONVERTS IT TO A BINARY # UP TO 4 BYTES LONG.
CC
CC REV: N/A
CC
CCALLS ISHFT
CC
C*
C*
IMPLICIT INTEGER (A-Z)
COMMON /A/ ISYM(3000),KARD1(96),ITOKEN(70),TKNSIZ,TKNTYP,
& TKNVAL,TKNVA2,JSUC,JPTR,LPTR,NXSYM,KOLUMN,KD1BCT,KD1LNO,JERR,
& MNUM,IPASS,IPC2,IPC,IOPC,INS(5),INSL,ISIZ,IADM(7,2),LUOT
COMMON /A/ KASH(64),KPAC(15),KPWCT,LENSYM,KCLAS(64)
COMMON /A/ NET1(64),NET2(64),NET3(64),NET4(64),NET5(64)
COMMON /A/ NBPW,KSYS,IEOT,LSP,JBUF(83),KARD2(80,3),IHB480,IHEX9K
COMMON /A/ IA1SHF,KCFF,LUSI,LUDI,LUOO,LLEN,IPLEN
COMMON /A/ LIST,ICOL,NEST
C***
DATA IO1/O100000/
DATA IO7/O77777/
DO 600 I=1,TKNSIZ
C*** REMOVE ASCII BITS
ITOKEN(I)=ITOKEN(I) - 48
C*** SAVE FOR LATER
TKNVA3=TKNVAL
TKNVA4=TKNVA2
C*** SHIFT TWICE
DO 100 J=1,2
C*** IS M.S. BIT ON?
K=TKNVAL .AND. IO1
C*** SHOULD M.S. BIT BE MOVED INTO 2ND WORD, 1ST BIT.
IF(K.NE.0) K=1
TKNVA2=ISHFT(TKNVA2,1)+K
50 TKNVAL=ISHFT(TKNVAL,1)
100 CONTINUE
C*** ADD IN THE # WE HAD BEFORE SHIFTING STARTED
C
C*** SAVE M.S. BIT
K=TKNVAL .AND. IO1
C*** REMOVE M.S. BITSO CARRY ON ADD CAN BE DETECTED
TKNVAL=TKNVAL .AND. IO7
200 TKNVAL=TKNVAL+TKNVA3
C*** DID ADD PUT A BIT IN 16TH POSITION?
J=TKNVAL .AND.IO1
C*** NO CARRY ON ADD, PUT 16TH BIT BACK IN CASE IT IS 1
IF(J.EQ.0)
1 TKNVAL=TKNVAL .OR. K
220 CONTINUE
C*** ADD HAD CARRY, INCREMENT 2ND WORD IF PREVIOUS UPPER BIT NOT ZERO.
IF(K.NE.0) K=1
IF(J.EQ.0) K=0
TKNVA2=TKNVA2+K+TKNVA4
C*** IF J NE 0 AND K NE 0 THERE IS ROLL OVER & 16TH BIT MUST BE ZERO
IF(K.EQ.1) TKNVAL=TKNVAL .AND. IO7
240 CONTINUE
C*** SHIFT LEFT ONE MORE BIT
K=TKNVAL .AND. IO1
IF(K.NE.0) K=1
TKNVA2=ISHFT(TKNVA2,1)+K
250 TKNVAL=ISHFT(TKNVAL,1)
C*** SAVE M.S. BIT
K=TKNVAL .AND. IO1
C*** REMOVE M.S. BIT SO CARRY ON ADD CAN BE DETECTED
TKNVAL=TKNVAL .AND. IO7
C*** ADD IN THE NEW #.
TKNVAL=TKNVAL+ITOKEN(I)
C*** DID ADD PUT A BIT IN 16TH POSITION?
J=TKNVAL .AND. IO1
IF(J.NE.0) GO TO 300
C*** NO CARRY ON ADD, PUT 16TH BIT BACK IN CASE IT IS 1
TKNVAL=TKNVAL .OR. K
GO TO 400
300 CONTINUE
C*** ADD HAD CARRY, INCREMENT 2ND WORD IF PREVIOUS UPPER BIT NOT ZERO.
IF(K.NE.0) K=1
TKNVA2=TKNVA2+K
C*** IF J NE 0 & K NE 0 THERE IS CARRY OVER, ZERO 16TH BIT.
IF(K.EQ.1) TKNVAL=TKNVAL .AND. IO7
400 CONTINUE
600 CONTINUE
RETURN
END
▶EOF◀