mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-03 15:12:41 +00:00
15301 lines
454 KiB
Plaintext
15301 lines
454 KiB
Plaintext
TITLE MACRO %53B(1247) 29-AUG-86
|
||
SUBTTL EDIT BY MCHC/JBC/EGM/MFB/PY/HD/TL
|
||
|
||
DEFINE COPYRIGHT<
|
||
ASCIZ /
|
||
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1968,1988. ALL RIGHTS RESERVED.
|
||
/> ;[1247]
|
||
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1968,1985,1986,1987,1988.
|
||
; ALL RIGHTS RESERVED.
|
||
;
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
|
||
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
|
||
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
|
||
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
|
||
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
|
||
;TRANSFERRED.
|
||
;
|
||
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
|
||
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
|
||
;CORPORATION.
|
||
;
|
||
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
|
||
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
|
||
|
||
VMACRO==53 ;VERSION NUMBER
|
||
VUPDATE==2 ;DEC UPDATE LEVEL
|
||
VEDIT==1247 ;EDIT NUMBER
|
||
VCUSTOM==0 ;NON-DEC UPDATE LEVEL
|
||
|
||
|
||
LOC <.JBVER==137>
|
||
<VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT
|
||
RELOC
|
||
|
||
COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
|
||
|
||
SWITCHES ON (NON-ZERO) IN DEC VERSION
|
||
PURESW GIVES TWO SEGMENT MACRO
|
||
CCLSW GIVES RAPID PROGRAM GENERATION FEATURE
|
||
TEMP TMPCOR UUO IS TO BE USED
|
||
FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW)
|
||
DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)
|
||
KI10 GIVES KI10 OP-CODES
|
||
KL10 GIVES KL10 OP-CODES
|
||
POLISH GIVES EXTERNAL ARITHMETIC EXPRESSIONS
|
||
|
||
SWITCHES OFF (ZERO) IN DEC VERSION
|
||
FTPSEC GIVES .PSECT PSEUDO-OPS AND PSECT MULTIPLE RELOCATION COUNTERS
|
||
STANSW GIVES STANFORD FEATURES
|
||
LNSSW GIVES LNS VERSION
|
||
IIISW GIVES III FEATURES
|
||
OPHSH GIVES HASH SEARCH OF OPCODES
|
||
F40 GIVES F40 UUOS
|
||
TOPS20 PROCESSES LONG FILES, REMOVES TOPS10 SYMBOLS
|
||
TSTCD GIVES LINK DEBUGGING SAND DEVELOPMENT DIRECTIVES
|
||
|
||
OTHER SWITCHES
|
||
UUOSYM DEFINES TOPS10 UUO'S, CALLI'S, TTCALL'S
|
||
*
|
||
SUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
|
||
|
||
IFNDEF PURESW,<PURESW==1>
|
||
|
||
IFNDEF STANSW,<STANSW==0>
|
||
IFN STANSW,<CCLSW==1>
|
||
|
||
IFNDEF LNSSW,<LNSSW==0>
|
||
|
||
IFNDEF CCLSW,<CCLSW==1>
|
||
|
||
IFNDEF TEMP,<TEMP==1>
|
||
|
||
|
||
IFNDEF IIISW,<IIISW==0>
|
||
IFN IIISW,<
|
||
IFNDEF DFRMSW,<DFRMSW==0>>
|
||
|
||
IFNDEF DFRMSW,<DFRMSW==1>
|
||
IFN DFRMSW,<FORMSW==1>
|
||
|
||
IFNDEF FORMSW,<FORMSW==1>
|
||
|
||
IFNDEF OPHSH,<OPHSH==0>
|
||
|
||
IFNDEF KI10,<KI10==1>
|
||
IFNDEF KL10,<KL10==1>
|
||
IFN KL10,<KI10==1> ;[1214]
|
||
|
||
IFNDEF POLISH,<POLISH==1>
|
||
|
||
IFNDEF F40,<F40==0>
|
||
IFNDEF TOPS20,<TOPS20==0>
|
||
IFNDEF UUOSYM,<UUOSYM==^-TOPS20>
|
||
|
||
IFNDEF FTPSEC,<FTPSEC==1>
|
||
IFN FTPSEC,<POLISH==1>
|
||
|
||
IFNDEF TSTCD,<TSTCD==0>
|
||
|
||
;DEFAULT LISTING CONTROL DIRECTIVES
|
||
.DIRECTIVE FLBLST
|
||
SUBTTL REVISION HISTORY
|
||
|
||
;START OF VERSION 53
|
||
;552 DON'T SEARCH UNIVERSALS WHEN PROCESSING LABEL,FOO##,END,
|
||
; EXTERN,OPDEF,ASSIGN,SYN,INTEGER,ARRAY,.COMMON,& DEFINE.
|
||
;553 (22193) FLAG NON-SIXBIT IN SINGLE-QUOTE STRINGS WITH Q-ERROR
|
||
;554 (10382) DON'T REPLACE ^Z WITH LF UNLESS INPUT DEV IS TTY
|
||
;555 (10202) WARN USER IF CODE STORED BEFORE .COMMON
|
||
;556 (22425) ALLOW LEADING NUMERIC CHAR IN ARGUMENTS TO "SEARCH"
|
||
;557 (22491) GENERATE -X (WHERE X IS RELOCATABLE) PROPERLY
|
||
;560 (22488) PLACE ALL OCCURENCES OF FLAGS 'INASGN','INANGL' UNDER POLISH FEATURE TEST
|
||
;561 (22490) GENERATE -1^!X (WHERE X IS RELOCATABLE) PROPERLY
|
||
;562 (22544) FIX PAGE OFFSET AFTER PRGEND
|
||
;563 (22495) FIX ;; COMMENTS LISTING WHEN DEFINED UNDER LALL
|
||
;564 (22493) PREVENT "IO TO UNASSIGNED CHANNEL" ERROR AFTER "?POLISH TOO COMPLEX" ERROR MESSAGE
|
||
;565 (22489) PREVENT TERMINAL WAIT AFTER PRGEND AFTER BEING DETACHED OR CCONTED
|
||
;566 (22498) REMOVE EDIT 531; BROKE LISTING OF EMBEDDED MACRO CALLS UNDER XALL
|
||
;567 (22500) ENHANCEMENT EDIT/REQUEST REL:HELPER,LC SYMBOL TYPES,U-LC MONTHS
|
||
;570 (10570) PREVENT E-ERRORS AFTER PURGE OF UNDEF OR EXT SYMBOL
|
||
;571 (22676) FORCE HISEG TO START ON PAGE BOUNDARY, NOT K-BOUNDARY
|
||
;572 (22748) REPLACE EDIT 556 BY ALTERNATE EDIT ACCOMPLISHING SAME PURPOSE
|
||
;573 (22321) FIX LOC/RELOC IN TWOSEG RELOC PROGRAMS
|
||
;574 (22501) ADD "ILLEGAL SYNTAX IN MACRO DEFINITION" ERROR MESSAGE
|
||
;575 (22492) PUT ALL PSECT-RELATED CODE UNDER FTPSECT SWITCH
|
||
;576 (22485) FIX LABEL+OFFSET ACROSS SEGMENTS, AND WHEN OFFSET > 1000
|
||
;577 (22187) FIX LISTING OF MACRO EXPANSION WITH ERRORS UNDER SALL
|
||
;600 TURN ON FTPSEC
|
||
;601 FIX TAGS IN LIT USED WITH PSECTS
|
||
;602 ALLOW .PSECT/.ENDPS IN LIT
|
||
;603 FORCE EXPRESSION EVALUATION IN CONDITIONAL.
|
||
;604 COMMENT OUT 1LINE @BOUT20+5 (NEEDS RE-WORK)
|
||
;605 FIX BUG WITH WRONG RELOC VALUE FOR PSECT @%SWSG2+6
|
||
;606 E-ERROR IF FOO##=EXP @ASSIG3+6
|
||
;607 GENERATE A WORD OF 0 FOR [SIXBIT\\] @SIXB20+
|
||
;610 DO EXPRESSION OF POLISH SYMBOLS FROM UNV IN PASS2 @EVNUM+
|
||
;611 ALPHABETIZE .IF/.IFN ATTRIBUTE TABLE.
|
||
;612 FIX BUG WITH "IOWD A##,FOO" WHEN USED WITH PSECT
|
||
;613 STORE CURRENT RADIX IN CURADX AND FREE UP RX AS FRR.
|
||
;614 OUTPUT "#" IN BINARY LISTING TO INDICATE POLISH FIXUP.
|
||
;615 OUTPUT NUMBER OF PAGES USED INSTEAD.
|
||
;616 DON'T ALLOW POLISH FOR "BLOCK" & "RELOC" PSEUDO-OPS.
|
||
;617 DON'T MAKE LTAGF SYMBOLS EXTERNALS AT END OF PASS1.
|
||
;620 Q-ERROR IF EXTERNALS PURGED.
|
||
;621 ADD .IF FOO,REFERENCED,<...>
|
||
;622 FIX BUG WITH OUTPUTTING "#"
|
||
;623 ALLOW EXPRESSIONS OF EXTERNALS AND PSECT-SYMBOLS.
|
||
;624 ALLOW POLISH WITH OPDEF
|
||
;625 GENERATE POLISH FWF FOR [A##]
|
||
;626 ADD .IF FOO,NEEDED,<...>
|
||
;627 UPDATE KL INSTRUCTIONS
|
||
;630 MORE ON EDIT 625 TO CHECK FOR LH=0,INDIRECT,INDEX,& POLISH
|
||
;631 GENERATE A SET OF BLOCK23'S BEFORE ALL THE SYMBOLS
|
||
;632 (SAME AS 577)
|
||
;633 OUTPUT "#" AND "*" FOR ASSIGNMENTS AND SYMBOL TABLES.
|
||
;634 ALLOW "A FOO##+1(1)".
|
||
;635 ADD SPECIAL CHARS \' AND \" IN A MACRO CALL.
|
||
;636 ALLOW POLSH AND INDEXING
|
||
;637 DON'T DO FWF FOR OPDEF A[B##]
|
||
;640 SAVE AC FR ON STACK BEFORE DOING EXPONENT IN NUMBER PROCESSING.
|
||
;641 CHECK FOR PSECT WHEN DOING FWF @OCTFW+
|
||
;642 SET PSECT INDEX TO 0 BEFORE GENERATING BLOCK 5
|
||
;643 FIX BUG WITH F00##(1)
|
||
;644 FIX BUG WITH EXP FOO##,FOO##,FOO##
|
||
;645 FWF FOR UNDEFINED SYMBOL IN OPERATOR FIELD.
|
||
;646 ILLEGAL TO USE PRGEND WITH PSECT, TREAT IT AS END
|
||
;647 OUTPUT PSECT INDEX IN LISTING
|
||
;650 (22327) FIX DISAPPEARING MACRO CALLS WITH FF UNDER SALL
|
||
;651 (22226) FIX VARIETY OF LISTING BUGS TIED TO ERROR-FLAGGING
|
||
;652 (22999) FIX "ENTRY FOO" WHERE FOO IS ALSO AN OPDEF
|
||
;653 (22497) FLAG "VERSION SKEW" IF OLD-STYLE UNV WITH SYN
|
||
;654 FIX TYPOGRAPHICAL ERROR IN PUBLISHED EDIT 564
|
||
;655 (22482) FIX TOO MANY LINES/PAGE WITH XLIST INSIDE SALL MACRO
|
||
;656 (22499) FIX "?ILL MEM REF" WHILE EXPANDING MACRO CALLS WITH EMBEDDED COMMAS
|
||
;657 (Q1382) EXTEND NEW MACRO ARG HANDLING TO PARENTHESIZED ARG STRING
|
||
;660 (23098) RESTORE IFE/IFN A## HANDLING TO OLD (PRE-52) WAY
|
||
;661 (22515) PREVENT ILL MEM REF ON UNCLOSED TEXT IN MULTI-LINE ASSIGNMENT
|
||
;662 SIMPLIFY EDIT 561
|
||
;663 (23170) FIX LOST ERRORS IN PASS1 DURING LINE "IMAGE" TYPEOUT
|
||
;664 SPEED AND EFFICIENCY ENHANCEMENTS;ROUTINES:GETCHR,PRINT,CHARAC,READ1A
|
||
;665 (23246) DON'T TREAT LEADING COMMAS AS SEMICOLONS
|
||
;666 FIX VARIOUS BUGS TIED TO "LABEL+OFFSET" TYPEOUT
|
||
;667 FIX BAD ASCIZ IN LITERALS (SIDE-EFFECT OF EDIT 661)
|
||
;670 ALLOW .NODDT OF OPDEF (I.E. .NODDT PJRST,CALL,ETC.)
|
||
;671 REMOVE EDIT 657 (I.E. TAKE FAMILIAR PATH OF LEAST RESISTANCE
|
||
; WITH REGARD TO EXISTING PROGRAMS)
|
||
;672 IGNORE REDUNDANT SEARCH ARGS, ADD "SEARCH TABLE OVERFLOW" ERROR MESSAGE
|
||
;673 (Q1286) LIST CRLFS IN PARENTHESIZED MACRO ARGS CORRECTLY
|
||
;674 GIVE E-ERROR FOR EXTERNAL ARRAY NAME
|
||
;675 HANDLE INTERN OF MIXED ARG TYPES CORRECTLY
|
||
;676 PREVENT THE USE OF ARGUMENTS < 4 TO /NNL
|
||
;677 ALLOW .IF EXPRESSION,QUALIFIER<CODE> (OMITTING COMMA)
|
||
;700 ALTER "CORE ALLOCATION PROBLEM" ERROR MESSAGE, FORCE
|
||
; REALLOCATION UNLESS /U (MEMORY-RESIDENT UNIVERSALS)
|
||
;701 FLAG NON-SIXBIT IN SIXBIT PSEUDO-OP CORRECTLY, TERMINATING STRING
|
||
;702 REPLACE MBR,MBC,MBI MESSAGES WITH ISR,ISC,ISI (SYNTAX CHECKS)
|
||
;703 (22939) HANDLE COMPLEX FORWARD REF OF SYM WHERE SYM=POLISH CORRECTLY
|
||
;704 FIX BAD CREF OUTPUT WHEN LISTING MACRO ARGS W/CRLFS AND "\"
|
||
;705 (23527) FIX ILL MEM REF WITH IFX <POLISH SYMBOL> (SIDE EFFECT OF 660)
|
||
;706 (22484) MAKE <LH,,POLISH>,<POLISH,,RH>,<POLISH,,POLISH> WORK
|
||
;707 FIX BUG WITH LITERAL PC WHEN DOING PSECT CHANGES AT END.
|
||
;710 GET CORRECT RELOCATION WHEN EVALUATING "!".
|
||
;711 ENTER PSECT-NAMES AS EXTERNAL SYMBOLS.
|
||
;712 COLLAPSE 2 INSTRUCTIONS INTO EXTRN2 ROUTINE
|
||
;713 MOVE NO UNV SEARCH FLAG INTO AC FRR.
|
||
;714 RESET SYMBOL TABLE POINTER WHEN A TAG HAS OTHER USE IN DIFF PSECTS
|
||
;715 SEARCH ONLY CURRENT SYMBOL TABLE IN LOOKING FOR VARS.
|
||
;716 RESET REL1P POINTER AT PASS INITIALIZATION
|
||
;717 BUG FIX WITH PSECT OUTPUT FORMAT
|
||
;720 FLAG .DIREC NO NO ARG WITH Q-ERROR
|
||
;721 FIX BUG IN EDIT 573 WITH RELOC/RELOC/LOC/RELOC ARG
|
||
;722 (10945) FLAG IOWD A,B WHERE A IS RELOC WITH R-ERROR
|
||
;723 (10929) FIX TRUNCATING OR GARBLING OF LONG PRINTX TEXT
|
||
;724 (23826) GIVE "UNASSIGNED" ERROR MESSAGE FOR UNDEFINED SYMBOLS
|
||
; WITH UNRESOLVED 36BIT VALUES (E.G. B=B+1000000).
|
||
;725 (23588) DON'T COLLAPSE LITERALS WHICH CONTAIN LABELS. THIS EDIT
|
||
; SHOULD BE REMOVED WHEN A FACILITY IS ADDED TO UPDATE
|
||
; LABEL VALUES AFTER LITERAL POOLING.
|
||
;726 IMPLEMENT "LTL LITERAL TOO LONG" ERROR MESSAGE.
|
||
;727 GENERATE CORRECT POLISH FOR -<POL>.
|
||
;730 GENERATE CORRECT POLISH FOR <IOWD POL,POL>
|
||
;731 BBN BUG FIX WITH GETCHR
|
||
;732 INCLUDE S-ERROR IN DEFINITION OF ERRORS.
|
||
;733 (24065) FIX BAD ENTRY BLOCK CAUSED BY BAD SEARCH/ENTRY INTERACTION
|
||
;734 (23987) HANDLE NEGATIVE RELOCATION CORRECTLY WITH POLISH
|
||
;735 ALLOW FORWARD-REF OF TAGS IN LIT(GENERATE 10-BLOCKS).
|
||
;736 FIXUP SYMTAB AFTER FORWARD-REF TO USER-DEFINED OPERATOR.
|
||
; (MACRO,OPDEF,SYN)
|
||
;737 FIX BUG WITH THE NEW IOWD CODE.
|
||
;740 CHECK FOR NON-REFERENCED LITERAL TAGS.
|
||
;741 A-ERROR WHEN LH-TRUNCATED WITH RELOC.
|
||
;742 VARF (TREF) USED WITH LTAGF MEAN TAG REFERENCED
|
||
;743 SUPPRESS PASS1 IFX V-ERROR.
|
||
;744 (Q2191) MAKE SURE LTGSW GETS CLEARED EACH TIME.
|
||
;745 CHECK FOR SPTR BEFORE UPDATE IN ASSIGN.
|
||
;746 GIVE ERRMSG WHEN MRP POINTS TO 0 DUE TO MACRO EXPANSION ERR.
|
||
;747 GENERATE CORRECT POLISH FOR <E,,K>,<K,,E>, & <E,,E>.
|
||
;750 FIX BUG WITH @POL(K).
|
||
;751 <POINT K,POL,POL> TO USE ANGFP ROUTINES.
|
||
;752 RESOLVE EDITS 736 &675 CONFLICT IN OPDEF HANDLING.
|
||
;753 (18606) PREVENT EXTRA LINE LISTING WITH FF INSIDE REPEAT 0 OR
|
||
; FAILING CONDITIONAL.
|
||
;754 (22804) CLEAR XLIST AFTER END/PRGEND (DOESN'T AFFECT LITS,ETC.).
|
||
;755 (22442) OUTPUT TITLE ".MAIN" FOR UNTITLED PRGEND MODULES DURING RPG ASSEMBLY.
|
||
;756 (24473) FIX TOO FEW LINES/LISTING-PAGE WITH PRINTX
|
||
;757(REMOVED) MAKE SURE ^- HAS HIGHER PRECEDENCE OVER BINARY OPERATORS.
|
||
;760 OUTPUT BINARY ON BLOCK STATEMENT IN A LONG LINE INSIDE MACRO.
|
||
;761 (Q2201) FIX BUG IN EOUT THAT GENERATED WRONG COUNT FOR BLOCK 4.
|
||
;762 (Q2204) E-ERROR FOR BYTE (N)...POL... WHERE N .NE. ^D36.
|
||
;763 (Q2211) GENERATE BLOCK22 WITH SYMBOL TABLE INSTEAD OF BLOCK23.
|
||
;764 CHECK FOR INTERNAL OPDEF AT IFDEF.
|
||
;765 (Q2195) DON'T GENERATE EMPTY ENTRY BLOCK.(REMOVED)
|
||
|
||
;766 SAME AS 761
|
||
;767 (Q2185) RE-DO CALCULATION OF RC IN EVADR
|
||
;770 (Q2210) FIX BUG WITH FLAGGING MULTIPLY DEFINED TAGS IN DIFFERENT PSECTS.
|
||
;771 TEST FOR NOPSW AT CLOSING ANGLE BRACKET
|
||
;772 FIX BUG WITH REFERENCING POLISH OPDEF
|
||
;773 REPLACE EDIT 747
|
||
;774 MAKE LABEL+OFFSET HANDLING CONSISTANT
|
||
;775 (Q2200) CHECK CPU VALUE BEFORE TYPEOUT OF SIZE INFO.
|
||
;776 DON'T DO PSECT CHECK FOR PHASED LABEL.
|
||
;777 ALLOW BYTE(18) OF POLISH IF HALF WORD ALIGNED.
|
||
;1000 ADD 2 CELLS FOR BUILDING OPDEF CODE TO AVOID PROBLEM WITH NESTED LITERALS.
|
||
;1001 DON'T LET MACRO EXPANSIONS CHANGE LABEL+OFFSET SETTINGS.
|
||
;1002 (Q2235) DON'T STORE UNV NAME UNTIL IT'S VERIFIED.
|
||
;1003 (24751) MAKE FF LIST CORRECTLY (SUPERSEDES EDIT 753)
|
||
;1004 MINOR SOURCE CHANGES: TABS IN LONG LINE, PAGE, ETC.
|
||
;1005 DON'T GENERATE GLOBAL REQUEST FOR A SYMBOL WHERE SYMBOL=UND.
|
||
;1006 SAVE INOPDF @SQBRK+ TO ALLOW LITERAL IN OPDEF DEFINITION.
|
||
;1007 GIVE EPP MESSAGE DUE TO TYPOS CAUSING ILLEGAL POLISH.
|
||
;1010 ADD A WORDS TO DIFFERENCIATE <0,,POL> WITH <POL>
|
||
;1011 (Q2276) SAVE INOPDF @ANGLB+ TO ALLOW NESTED <...> IN OPDEF DEFINITION.
|
||
;1012 RECOVER EXTPNT IF NEEDED AT OP3.
|
||
;1013 MOVE LEFT POLISH TO FREE SPACE BEFORE STORING THE PTR IN XWDANG.
|
||
;1014 ALLOW ENTRY,INTER STATEMENTS TO APPEAR IN DIFF. PSECT THEN THE TAG.
|
||
;1015 FIX BUG WITH SETTING UP CORRECT MP FOR MACROS NEXTED IN CONDTIONALS.
|
||
;1016 DEFINE A RELOCATABLE PSECT BIT FOR PSECTS WITH NO FIXED ORIGIN.
|
||
;1017 CARRY UNDEFINED BIT ACROSS ASSIGMENT DURING PASS1.
|
||
;1020 MODIFY BLOCK 22'S AND BLOCK 23'S AND ADD BLOCK 24'S.
|
||
; MACRO 53 RELEASE IN SPRING 1978
|
||
;FOLLOWING 3 PATCHES ARE DOCUMENTED IN THE MACRO 53 BWR FILE
|
||
;1021 WHEN MULTIPLE .PSECT STMNTS EXIST FOR THE SAME PSECT, ORIGIN NEED ONLY BE IN ONE.
|
||
;1022 IN ARRAY PSEUDO OP, ALLOW UNV-SEARCHING OF SYMBOLS USED IN DIMENSION ARGUMENT.
|
||
;1023 CORRECT ASSEMBLY OF STMNTS LIKE: "FOO=IFNB <>,<BAR=5>".
|
||
;1024 SOME CLEANUP
|
||
;1025 DON'T GO POLISH CALCULATING "REPEAT" COUNT
|
||
;1026 FIX BUG CAUSED BY EDIT 1010 ( <POINT K,POL> )
|
||
;1027 MAKE SURE UOUT ROUTINE SEARCHES ALL PSECT SYMBOL TABLES.
|
||
;1030 AC0 TO AC2 IN PART OF EDIT1021; CAUSE P-ERROR IN PSECT PROGAM
|
||
;1031 TURN OFF FLAG IN RC TO INDICATE UNDEF IN LITERAL IN STOLIT
|
||
;1032 (25358) FIX .XTABM WITH PARENTHESIZED MACRO CALL ARG LISTS
|
||
;1033 (25358) CLEAR MACMPD AND .XTABM/.ITABM SETTINGS ACROSS PASSES
|
||
;1034 (25555) FIX FATAL ERRORS CAUSED BY BAD RECOVERY FROM N-ERRORS.
|
||
;1035 (26078) FIX OPDEF WITH TEXT PSEUDO-OPS AND INSIDE LITS (REWORK
|
||
; EDIT 1000)
|
||
;1036 UP CTLSIZ TO 1000 CHARACTERS
|
||
;1037 ADD CODE TO USE FORCEP FOR <POLISH>B<EXP> WHEN NOT IN LARGER EXP.
|
||
;1040 MOVE EMBEDDED POLISH INTO FREE SPACE WHEN DOING POLPSH.
|
||
;1041 ADD .DIRECTIVE .NOUUO
|
||
;1042 CALCULATE TOTAL SYMBOL COUNT BEFORE TURNING ON ATTRIBUTE BITS
|
||
; (MOVE EDIT 1021 ONE INSTRUCTION LOWER AND REMOVE EDIT 1027)
|
||
;1043 CHANGE .DIRECTIVE .NOUUO TO .DIRECTIVE .NOCALLIS
|
||
;1044 (25015) FIX BAD LOAD-TIME RELOCATION FOR EXPRESSIONS OF THE FORM
|
||
; "A+B" OR "A-B" WHERE A OR B IS RELOCATABLE.
|
||
;1045 (25581) PRESERVE SYMBOL CHARACTERISTICS ACROSS NESTED
|
||
; ASSIGNMENTS (E.G., A==:<B==2>)
|
||
;1046 (11716) FIX "ILL MEM REF" TO ADDR 777777 DUE TO BAD MACRO
|
||
; CALL SYNTAX
|
||
;1047 MAKE EXPRESSIONS OF THE FORM <A##,,POLISH> WHERE POLISH
|
||
; IS A POLISH EXPRESSION ASSEMBLE CORRECTLY
|
||
;1050 FIX "?MCREPP" ERROR DURING PROCESSING OF EXPRESSIONS
|
||
; WITH COMPLEX EXTERNAL LEFT HALVES (E.G., <EXT##+1,,0>)
|
||
;1051 FIX "?ILL MEM REF" AFTER "?MCREPP" (EXPAND EDIT 1007)
|
||
;1052 (26137) FIX "?ILL MEM REF" WITH LARGE PRGENDED FILES
|
||
;1053 GENERATE X-ERROR IF EXCEEDED MAX OF CREATED SYMBOL (..7777);
|
||
; START OVER FROM ..0000 RATHER THAN CREATING ./0000
|
||
;1054 (25910) GIVE UNARY OPERATORS PRECEDENCE OVER SHIFT OPERATORS AND
|
||
; LOGICAL OPERATORS.
|
||
;1055 (26428) DON'T GENERATE POLISH FOR REL-ABS IN SINGLE-SEGMENT,
|
||
; NON-HISEG, NON-PSECT PROGRAM.
|
||
;1056 (25357) MAKE MACRO MORE FLEXIBLE IN HANDLING ANGLE-BRACKETED
|
||
; ARGS TO .IF/.IFN; IMPLEMENT "EXPRESSION" ATTRIBUTE.
|
||
;1057 (12055) RESTORE CORRECT .PSECT/.ORG INTERACTION IN WAKE OF EDIT 573
|
||
;1060 (25477) IMPROVE "?MCRPTC POLISH TOO COMPLEX" ERROR MESSAGE BY
|
||
; APPENDING "FOR SYMBOL XXXXXX" OR "FOR LOCATION XXXXXX"
|
||
;1061 (25715) RE-DO "ERROR WHILE EXPANDING" ERROR-TRAPPING (SUPERSEDES
|
||
; EDITS 1046,746)
|
||
;1062 (25907) FIX LISTING OF LIT INSIDE SALL MACRO EXPANSION
|
||
;1063 (25777) MAKE .XCREF, .CREF WORK INSIDE LITERALS
|
||
;1064 (25777) FIX LISTING OF LALL INSIDE SALL MACRO
|
||
;1065 (25777) MAKE LALL, XALL, SALL, LIST, XLIST, .DIREC WORK INSIDE
|
||
; LITERALS (REQUIRES EDIT 1064)
|
||
;1066 (25838) MAKE MACRO OBSERVE THE SETTINGS OF MESSAGE LEVEL BITS DURING
|
||
; ERROR MESSAGE TYPEOUT (SEE GETTAB 35 MONITOR TABLE)
|
||
;1067 (26529) BYTE PSUEDO OP SPECIFYING EXTERNALS ON OTHER THAN FULL OR HALF
|
||
; WORD BOUNDARIES PRODUCES EPP ERRORS AND ILL MEM REF.
|
||
;1070 (26571) CORRECTLY INDICATE EXTERN/INTERN CONFLICTS AS E ERRORS INSTEAD
|
||
; OF P OR A ERRORS
|
||
;1071 (26690) SET POLISH FLAG IN CORRECT HALF OF FR WHEN DOING FORCED
|
||
; RIGHT HALF POLISH IN ANGLE BRACKETS
|
||
;1072 (26749) LIST COMPLETE MACRO CALL LINE WHEN XALL IS IN EFFECT
|
||
;1073 (26884) FIX ?ILL MEM REF AND E ERRORS DURING POLISH INDEXING
|
||
;1074 (12239) FORCE PAIRING OF LIT BRACKETS WITHIN .PSECT/.ENDPS
|
||
; MAKE END ILLEGAL WITHIN LITERAL OF ANY PSECT, NOT JUST CURRENT
|
||
; CORRECT ERROR MSG. TAG OFFSET IF WITHIN NESTED LITS WITH LABELS
|
||
;1075 (27082) LIST COMMENT ON MACRO CALL LINE WHEN XALL IS IN EFFECT
|
||
;1076 (27099) DO NOT ALLOW '@' IN AC FIELD, FLAG AS QUESTIONABLE
|
||
;1077 ALLOW RIGHT JUSTIFIED RELOCATABLES TO BE GTR. 18 BITS FOR BYTE
|
||
; MAKE BYTE ALLOW POLISH SYMBOLS ONLY FOR FULL AND HALF WORDS
|
||
; ENHANCEMENT TO EDIT 1067.
|
||
;1100 ELIMINATE PHASE ERRORS PRODUCED BY EDIT 1074
|
||
;1101 FIX BAD POLISH FOR EXPRESSIONS INVOLVING INTER-PSECT REFERENCES
|
||
; OF RELOCATABLES. ADDITION TO EDIT 1040.
|
||
;1102 KEEP DDT SUPPRESS BITS WHEN SYMBOL DEFINED AS INTERNAL HAS AN
|
||
; EXTERNAL OR POLISH VALUE
|
||
;1103 REWORK REL+ABS, REL+REL, REL-ABS, REL-REL CODE ADDED BY EDITS
|
||
; 1044 AND 1055 TO HANDLE RH RELOCATABLES ONLY
|
||
;1104 (12505) DO NOT GENERATE POLISH FWF WHEN DOING POLISH INDEXING
|
||
;1105 (12506) MAKE OP AC,-<POL> GENERATE CORRECT RH FIXUP
|
||
;1106 (12637) DO NOT GENERATE FULLWORD FIXUP UNLESS EXTERNAL IS OF THE
|
||
; FORM 0,,EXT
|
||
;1107 (27389) DO NOT ALLOW POLISH IN INDEX FIELD, DO NOT ALLOW EXTERNALS IN OP
|
||
; CODE INDEX, MAKE PSUEDO-OP IN INDEX FIELD WORK IN ALL CASES
|
||
;1110 GENERATE CORRECT POLISH FOR V=EXT##+K WHEN V IS STILL DEFINED
|
||
; BY A SPECIAL EXTERNAL POINTER (NOT YET DEFINED IN PASS 2)
|
||
; MORE OF EDIT 703.
|
||
;1111 AUGMENT EDIT 1103 TO GENERATE LESS POLISH. CASES IMPROVED
|
||
; INVOLVE NEGATIVE RELOCATABLES AND RELOCATABLES SLIGHTLY LESS
|
||
; THAN HMIN (RANGE HMIN-400).
|
||
;1112 (27167) EXPAND .IF/.IFN FEATURE BY ADDING "NAME" ATTRIBUTE INDICATING
|
||
; A SINGLE RADIX50 NAME (SYMBOL) HAS BEEN PASSED AS AN ARGUMENT.
|
||
;1113 (27418) ELIMINATE OPDEF PROCESSING INCONSISTENCIES
|
||
;1114 (27388) ADD THE SWAPPED LEFT HALF VALUE OF THE INDEX TO THE POLISH
|
||
; GENERATED FOR STATEMENTS OF THE FORM 'OPCODE AC,POLISH(LH,,RH)'
|
||
;1115 (27544) FOR DEC/EXP/OCT, GIVE Q ERROR FOR UNBRACKETED EXPRESSIONS
|
||
; INVOLVING '@'. FORCES USE OF BRACKETS FOR FULL ADDRESS CALC.
|
||
;1116 FIX INTER-PSECT REFERENCES TO SPECIAL POINTERS OF EXTERNALS
|
||
; SO THE EXTERNAL CHAIN DOES NOT CROSS PSECTS.
|
||
;1117 (27728) MAKE .PSECT HANDLE ATTRIBUTE SPECIFICATIONS CORRECTLY
|
||
;1120 (12962) RESET RP AND MP IN THE END CODE SINCE MACROS MUST BE COMPLETED
|
||
;1121 INCREASE THE NUMBER OF EXTRA (XTRA) LOCATIONS TO SAVE FOR PRGEND
|
||
; TO 8 TO PREVENT POSSIBLE ?ILL MEM REFS
|
||
;1122 (27813) DO NOT COPY NULLS INTO STATEMENT OUTPUT BUFFER
|
||
;1123 (27976) GENERATE Q ERROR FOR MULTIPLE TITLES/OR TITLE/UNIVERSAL
|
||
; CONFLICTS, INSTEAD OF M ERROR DURING ONLY PASS 1
|
||
;1124 (Q3051) INCREASE .UNIV TO 50.
|
||
;1125 (Q3038) RE-INSTALL MACROS FOR DIRECTIVE ARGS AND ROUTINES
|
||
;1126 (Q3045) FLAG MOST ASSIGMENTS INVOLVING A LABEL DEFINED WITHIN A LITERAL
|
||
; AS L ERRORS. LABEL MAY NOT BE DEFINED TILL END OF PASS2.
|
||
;1127 (Q3053) GENERATE THE DESIRED ASCII STRING FOR MACRO CALL ARG ' \N '
|
||
; WHEN N IS A SYMBOL OR EXPRESSION - BROKEN BY EDIT 137
|
||
;1130 RESET ASSEMBLY MODE TO RELOCATABLE (1) AT PASS INITIALIZATION.
|
||
;1131 REMOVE EDIT 646, MAKE PRGEND WORK WITH PSECTS
|
||
;1132 FIX NUMEROUS PSECT BUGS - PSECT FOO,1000 / PSECT FOO LOSES ORIG.
|
||
; PSECT AND LOC INCONSISTENCIES, PSECT AND PHASE INCONSISTENCIES.
|
||
;1133 (Q3047) FIX RSW3 TO PROPERLY DETECT WHEN THE LISTING OUTPUT BUFFER IS
|
||
; FULL - HANDLE TABS PROPERLY AFTER THE 128 CHARACTER LIMIT
|
||
;1134 MAKE LOCO STAY IN SYNC. WITH LOCA DURING PASS 1. PSECTS NESTED
|
||
; WITHIN LITERALS CAUSE OUT-OF-SYNC.
|
||
;1135 (28104) DO 'OP' PROCESSING INSTEAD OF A FULL WORD FIXUP FOR CASES SUCH
|
||
; AS 'OP## AC,ADDR'. THIS AND POLISH OPCODES WILL NOT PRODUCE THE
|
||
; PROPER CODE FOR LEFT HALF EXTERNALS.
|
||
;1136 CLEAR PSECT NESTING COUNTER AND OTHER PSECT ITEMS AT PRGEND,
|
||
; PLUS CHECK FOR PRGEND INSIDE LITERALS
|
||
;1137 FLAG NON-ABSOLUTE PSECT ORIGINS AS AN 'A' ERROR
|
||
;1140 EDIT 1123 BROKE 5 CHARACTER TITLES IN PRGENED FILES, CLEAR OUT
|
||
; 2ND WORD OF TITLE WHEN LOADING DEFAULT TITLE OF .MAIN
|
||
;1141 (Q3085) FOR PRGENDED PROGRAMS, PRINT BREAK, CPU TIME, CORE USED DATA
|
||
; FOR EACH PROGRAM MODULE
|
||
;1142 (Q3181) REPEAT THE EOL CHAR. IF A TERMINATING ANGLE BRACKET IS MISSING.
|
||
;1143 SYN A,B WILL NOT CREF B AS DEFINING OCCURANCE
|
||
;1144 SAVE/CLEAR/AND RESTORE CPU TYPE OVER PRGENDS
|
||
;1145 EDIT 1135 STOPPED GENERATION OF FULL WORD FIXUP FOR [FOO##]
|
||
;1146 ALLOW NUL: AS CREF DEVICE
|
||
;1147 EDIT 1113 CAUSED THE OPDEF IN "EXP OPDEF AC,ADDR" TO BE
|
||
; PROCESSED AS AN ADDRESS, DISCARDING THE REMAINING FIELDS.
|
||
;1150 (Q3261) XLIST UNDER SALL PUTS EXTRA CHARACTERS IN THE LISTING FILE
|
||
;1151 DO NOT OUTPUT BLOCK 22'S AFTER THE END BLOCK FOR PRGEND.
|
||
;1152 (Q3410) EDIT 1143 CAUSED BAD CREF DATA TO BE GENERATED FOR A SYN
|
||
; SUCH AS "SYN IFE,IF".
|
||
|
||
;Start of Version 53B
|
||
|
||
;1153 MFB 5-Sep-80 (QAR 3465)
|
||
; Fix assignment of: external "operator" assignment
|
||
; ( X=B##+<N=N+1>-2 ) to generate correct code.
|
||
|
||
;1154 MFB 5-Sep-80
|
||
; Fix phase errors in literals caused by finding Polish
|
||
; in universal files.
|
||
|
||
;1155 MFB 10-Sep-79
|
||
; Set inter-psect reference bit on in IO if switching from
|
||
; macro to symbol at EVAS3.
|
||
|
||
;1156 MFB 17-Sep-80
|
||
; Make sure a macro definition is an absolute value.
|
||
|
||
;1157 MFB 27-Sep-80 SPR 10-28746
|
||
; Fix "?MCREPP EXPRESSION PARSING PROBLEM" involving
|
||
; ^! (the exclusive or operator) while expanding macros.
|
||
|
||
;1160 MFB 28-Sep-80
|
||
; Get rid of extra <CR><LF> due to XLIST inside a macro under
|
||
; SALL (refer to edit 1150).
|
||
|
||
;1161 MFB 9-Oct-79 SPR 10-28753
|
||
; Allow MACRO to write out Polish blocks (block type 11)
|
||
; that are more than 18 words long.
|
||
|
||
;1162 MFB 24-Oct-79 (SPR 10-28820)
|
||
; If the maximum number of arguments for a macro definition
|
||
; is exceeded, give an error message.
|
||
|
||
;1163 MFB 1-Nov-79 SPR 20-13664
|
||
; Fix bad code generated by Bshift of a relocatable.
|
||
|
||
;1164 MFB 1-Nov-79
|
||
; Fix bad Polish generated by X=<<FOO##+2>B8+17>
|
||
|
||
;1165 MFB 25-Jan-80 SPR 10-28821
|
||
; Allow name: .LOW. to imply the global psect (i.e. .PSECT .LOW.)
|
||
|
||
;1166 MFB 31-Jan-80 SPR 10-28979
|
||
; Fix bad store operator for Polish expression in literal
|
||
; that is inside phased code.
|
||
|
||
;1167 MFB 21-Feb-80
|
||
; Edit 1151 broke more than one lit in the last program
|
||
; of a PRGENDed file.
|
||
|
||
;1170 MFB 7-Mar-80
|
||
; Reset EXTPNT in STMNT9 in case MACRO cleared it while
|
||
; trying to parse the rest of the line. Fixes writing a
|
||
; blank symbol name out in a Polish block.
|
||
|
||
;1171 MFB 7-Mar-80 SPR 20-14030
|
||
; Fix phase errors generated by macro call inside a literal
|
||
; with created symbol argument missing.
|
||
|
||
;1172 MFB 14-Mar-80 SPR 10-29346
|
||
; Do not generate V errors for forward reference of store
|
||
; address for .LINK psuedo-op.
|
||
|
||
;1173 MFB 24-Mar-80
|
||
; Allow KS10 as argument to .DIRECTIVE pseudo-op.
|
||
|
||
;1174 MFB 2-May-80
|
||
; Fix bug with external symbol becoming relocatable after
|
||
; specifying .NODDT for that symbol.
|
||
|
||
;1175 MFB 5-Jun-80
|
||
; Make "E" errors only apply to line where error occured
|
||
; and not the next binary producing line as well.
|
||
|
||
;1176 MFB 5-Jun-80
|
||
; Reset CTIBUF if TOPS20 version and only an input file
|
||
; was specified. (fixes loop at end of pass 1).
|
||
|
||
;1177 MFB 10-Jun-80 SPR 10-29621
|
||
; If in remark, do not change "}","|","{" to strange control char.
|
||
|
||
;1200 MFB 16-Jul-80 SPR 10-29754
|
||
; Assemble statements like: "HRLI (HRRZ ,(15))" correctly.
|
||
; Broken by edit 1113.
|
||
|
||
;1201 PY 4-Sep-80 SPR 10-29907
|
||
; Flag error when symbol is referenced as external in universal
|
||
; file but local in program.
|
||
|
||
;1202 PY 30-Sep-80
|
||
; Change revision history, starting with version 53B. Add
|
||
; date of edit, author's initials, and 10- or 20- to SPR
|
||
; number. Also change history to lower case.
|
||
|
||
;1203 PY 1-Oct-80 SPR 10-30018
|
||
; Remove edit 653, as it is possible to generate UNV files
|
||
; with synonyms that do not have VARF set.
|
||
|
||
;1204 PY 2-Oct-80 SPR 10-29908, 10-30021
|
||
; Test for inter-PSECT references involving special pointers
|
||
; with additive fixups that will not go Polish. These consist
|
||
; of LEFT,,0 where LEFT is non-zero.
|
||
|
||
;1205 PY 3-Oct-80 SPR 10-30043
|
||
; If processing the END statement, and the start address label
|
||
; has the same name as a macro, do not incorrectly set the
|
||
; inter-PSECT reference bit. Broken by Edit 1155.
|
||
|
||
;1206 PY 14-Oct-80 SPR 10-30104
|
||
; MCROBL message is printed instead of MCROQE error, prefix
|
||
; is printed as garbage.
|
||
|
||
;1207 PY 16-Oct-80 SPR 10-30103
|
||
; Fix skewed listing when BYTE or SIXBIT psuedo-ops are used
|
||
; in Psected programs.
|
||
|
||
;1210 PY 5-Nov-80 SPR 20-15019
|
||
; Do not clobber the size of an ARRAY during pass 1 if the array
|
||
; is being made INTERNAL.
|
||
|
||
;1211 PY 4-Feb-81 SPR 10-30309
|
||
; Remove code which does not allow semicolons or CRLFs in some
|
||
; failing conditionals.
|
||
|
||
;1212 PY 11-Feb-81 SPR 20-15625
|
||
; Fix handling of constants to give Q error in more cases
|
||
; of integer overflow. Also fix code so that floating point
|
||
; numbers will not get erroneous Q errors when the part before
|
||
; the decimal point is too large to fit in an integer.
|
||
|
||
;1213 PY 17-Feb-81
|
||
; Fix edit 1204 so that special pointers with zero fixups will
|
||
; always be copied. The only fixup that should not be copied
|
||
; is one which has a non-zero right half. This is because it
|
||
; is legal to say SKIPE ABC where ABC is a special pointer with
|
||
; a zero addition and this case will not go Polish.
|
||
|
||
;1214 PY 24-Mar-81 SPR 10-30814
|
||
; An incorrect feature test flag could allow KL symbols
|
||
; to be defined without KI symbols being defined.
|
||
|
||
;1215 PY 27-Apr-81
|
||
; If a fullword expression containing an external is in
|
||
; angle brackets it will go polish on pass 2. Therefore,
|
||
; do not fold it if it is in a literal in pass 1.
|
||
|
||
;1216 PY 1-Sep-81
|
||
; Make DEFINE A(B,,C) take a more severe error, so that
|
||
; the universal file writer will not be confused by a bad
|
||
; definition.
|
||
|
||
;1217 EGM/PY 27-Jan-81 SPR 20-17083
|
||
; Change the way negation is done to fix cases such as
|
||
; <-.> and negation of relocatables in general.
|
||
|
||
;1220 EGM 3-Feb-82 10-31828
|
||
; Eliminate large number of causes of ?Ill mem refs for address 777777.
|
||
; Convert fake Polish relocations back to listing flags at proper points.
|
||
|
||
;1221 EGM 3-Feb-82
|
||
; Flag cases of bad Polish fixup chains with E errors.
|
||
|
||
;1222 EGM 3-Feb-82
|
||
; Add code to report pass 1 only Polish as a new type of undefined
|
||
; variable, which is declared as external at the end of pass 2.
|
||
|
||
;1223 EGM 4-Feb-82
|
||
; Eliminate longstanding bogus E error for BYTE (18) EXT##.
|
||
|
||
;1224 EGM 4-Feb-82
|
||
; Allow use of Variables/VAR with PSECTs. Broken by edit 602.
|
||
|
||
;1225 EGM 4-Feb-82
|
||
; Prevent Polish data on temporary stack from being destroyed during
|
||
; complex expression evaluation.
|
||
|
||
;1226 EGM 15-Feb-82
|
||
; Alter type 2 .REL block symbol codes for partially defined globals to
|
||
; eliminate confusion at LINK time. Right half deferred = 24 (same),
|
||
; left half deferred = 30 (new), both halves deferred = 34 (new).
|
||
; Also eliminate extra bit (04) in second symbol bits for 60/50, 60/70
|
||
; pairs, to conform to documentation. Requires LINK edit 1330.
|
||
|
||
;1227 EGM 17-Feb-82
|
||
; Eliminate bad .REL files for left half Polish in OPDEFs and assignments
|
||
; that are not enclosed in angle brackets. Also correct edit 767 to catch
|
||
; relocatable left halves with Polish right halves.
|
||
|
||
;1230 PY 16-Feb-82
|
||
; Allow expressions of the form A=B##,,0 in UNIVERSAL files.
|
||
; This edit supercedes edit 1201.
|
||
|
||
;1231 EGM 18-Feb-82
|
||
; Eliminate spurious listing header to TTY:, and wrong elapsed times
|
||
; during PRGEND processing (edit 1141). Also cleanup edit 1146.
|
||
|
||
;1232 PY 17-Jun-82
|
||
; Allow assignments or opdefs before .COMMON statements.
|
||
|
||
;1233 PY 12-Jul-82
|
||
; Fix typo in edit 1222.
|
||
|
||
;1234 EGM 28-Sep-82 SPR:10-32977
|
||
; Finish up job started by 1113/1147 treating OPDEFs at all levels
|
||
; in a consistent manner. Re-instate useful deviation from documented
|
||
; behavior that essentially causes entry into an angle-bracketed
|
||
; expression to revert to opcode field processing to allow
|
||
; processing Opcodes/OPDEFs as operators and not symbols.
|
||
|
||
;1235 PY 30-Sep-82 SPR 20-18269
|
||
; Allow PSECT origins to be greater than 18 bits.
|
||
|
||
;1236 PY 8-Dec-82 SPR 10-33238
|
||
; Add G-floating instructions, XMOVEI, and XHLLI.
|
||
|
||
;1237 PY 26-Apr-83 SPR 10-33691
|
||
; Fix typo in edit 1236
|
||
|
||
;1240 PY 10-May-83
|
||
; Fix external in END statement. Broken by edit 1234.
|
||
|
||
;1241 PY 27-May-83 SPR 20-19194
|
||
; Dont increment count twice for psect indices when counting
|
||
; for long polish blocks.
|
||
|
||
;1242 PY 3-Aug-83 SPR 20-19096
|
||
; Fix problem with CREFing psected programs. Don't use
|
||
; DEFCRS when updating a symbol, since the cref code turns
|
||
; it off.
|
||
|
||
;1243 HD 22-Feb-85 SPR 10-35085
|
||
; IOWD constant,external will go polish on pass 2, therefore don't
|
||
; fold it in if it is in a litteral, during pass 1.
|
||
|
||
;1244 HD 13-Nov-85 SPR 20-20963
|
||
; Flag LOC value greater than 18 bits as an error.
|
||
|
||
;1245 TL 23-Aug-86 Abott/7.03 monitor
|
||
; EXTER5 call on SSRCH could find a MACRO definition in another PSECT,
|
||
; resulting in new EXTERNAL symbol being placed in the wrong PSECT's
|
||
; symbol table. Look only in current PSECT.
|
||
|
||
;1246 TL 29-Aug-86 DPM
|
||
; Add PMOVE and PMOVEM opcodes to the PST.
|
||
|
||
;1247 RJF 10-Feb-88
|
||
; Update copyright to 1988, and make sure the copyright
|
||
; gets into the .EXE file.
|
||
|
||
;*****End of Revision History*****
|
||
SUBTTL OTHER PARAMETERS
|
||
|
||
.PDP==^D100 ;BASIC PUSH-DOWN POINTER
|
||
IFN POLISH,<.PDP==^D250> ;BE GENEROUS WITH STACK
|
||
IFNDEF LPTWID,<LPTWID==^D132> ;DEFAULT WIDTH OF PRINTER
|
||
.LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING
|
||
.CPL==.LPTWD-^D32 ;WIDTH AVAILABLE FOR TEXT WHEN
|
||
;BINARY IS IN HALFWORD FORMAT
|
||
.CPLX==LPTWID-.LPTWD ;EXCESS SPACE IN LAST TAB STOP
|
||
IFNDEF .LPP,<
|
||
IFE STANSW,<.LPP==^D57> ;LINES/PAGE
|
||
IFN STANSW,<.LPP==^D52> ;LINES/PAGE
|
||
>
|
||
.STP==^D100 ;STOW SIZE
|
||
.TBUF==^D80 ;TITLE BUFFER
|
||
.SBUF==^D80 ;SUB-TITLE BUFFER
|
||
.IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE
|
||
.R1B==^D18
|
||
.UNIV==^D50 ;[1124] NUMBER OF UNIVERSAL SYMBOL TABLES ALLOWED
|
||
.LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE
|
||
.SFDLN==5 ;NUMBER OF SFD'S ALLOWED
|
||
|
||
NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE
|
||
IFN FTPSECT,< ;[575]
|
||
SGNSGS==^D64 ;MAX # OF DISTINCT PSECTS ALLOWED
|
||
;IN ONE ASSEMBLY
|
||
SGNDEP==^D16 ;MAX PSECT DEPTH ALLOWED
|
||
> ;END IFN FTPSECT
|
||
IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D1000>> ;[1036]
|
||
IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>
|
||
IFNDEF NUMBUF,<NUMBUF==5> ;NUMBER OF INPUT BUFFERS
|
||
|
||
EXTERN .JBREL,.JBFF,.JBAPR,.JBSA,.JBERR
|
||
EXTERN .HELPR
|
||
IFE TOPS20,<
|
||
IFDEF .REQUEST,<.REQUEST REL:HELPER >> ;[567]
|
||
IFN TOPS20,<
|
||
IFDEF .REQUEST,<.REQUEST SYS:HELPER >> ;[567]
|
||
|
||
LOWL:! ;START OF LOW SEGMENT
|
||
IFN PURESW,<TWOSEGMENTS
|
||
RELOC 400000>
|
||
|
||
COPYRIGHT ;[1247] PUT COPYRIGHT IN .EXE FILE
|
||
SALL ;SUPPRESS ALL MACROS
|
||
|
||
;SOME ASCII CHARACTERS
|
||
|
||
HT==11
|
||
LF==12
|
||
VT==13
|
||
FF==14
|
||
CR==15
|
||
CZ==32
|
||
EOL==33
|
||
CLA==37
|
||
OBRCKT=="<"
|
||
|
||
;ACCUMULATORS
|
||
AC0== 0
|
||
AC1= AC0+1
|
||
AC2= AC1+1
|
||
SDEL= 3 ;SEARCH INCREMENT
|
||
SX= SDEL+1 ;SEARCH INDEX
|
||
ARG= 5 ;ARGUMENT
|
||
V= 6 ;VALUE
|
||
C= 7 ;CURRENT CHARACTER
|
||
CS= C+1 ;CHARACTER STATUS BITS
|
||
RC= 11 ;RELOCATION BITS
|
||
MWP= 12 ;MACRO WRITE POINTER
|
||
MRP= 13 ;MACRO READ POINTER
|
||
IO= 14 ;IO REGISTER (LEFT)
|
||
ER== IO ;ERROR REGISTER (RIGHT)
|
||
FR= 15 ;FLAG REGISTER (LEFT)
|
||
FRR== FR ;[613] MOVE FLAGS (RIGHT)
|
||
MP= 16 ;MACRO PUSHDOWN POINTER
|
||
P= 17 ;BASIC PUSHDOWN POINTER
|
||
|
||
%OP== 3
|
||
%MAC== 5
|
||
%DSYM== 2
|
||
%SYM== 1
|
||
%DMAC== %MAC+1
|
||
%ERR== %MAC
|
||
|
||
OPDEF RESET [CALLI 0]
|
||
OPDEF SETDDT [CALLI 2]
|
||
OPDEF DDTOUT [CALLI 3]
|
||
OPDEF DEVCHR [CALLI 4]
|
||
OPDEF CORE [CALLI 11]
|
||
OPDEF EXIT [CALLI 12]
|
||
OPDEF UTPCLR [CALLI 13]
|
||
OPDEF DATE [CALLI 14]
|
||
OPDEF APRENB [CALLI 16]
|
||
OPDEF MSTIME [CALLI 23]
|
||
OPDEF PJOB [CALLI 30]
|
||
OPDEF RUN [CALLI 35]
|
||
OPDEF TMPCOR [CALLI 44]
|
||
OPDEF MTWAT. [MTAPE 0]
|
||
OPDEF MTREW. [MTAPE 1]
|
||
OPDEF MTEOT. [MTAPE 10]
|
||
OPDEF MTSKF. [MTAPE 16]
|
||
OPDEF MTBSF. [MTAPE 17]
|
||
|
||
;FR FLAG REGISTER (FR/RX)
|
||
IOSCR==000001 ;NO CR AFTER LINE
|
||
POLSW==000002 ;DOING POLISH ON GLOBALS
|
||
MTAPSW==000004 ;MAG TAPE
|
||
ERRQSW==000010 ;IGNORE Q ERRORS
|
||
LOADSW==000020 ;END OF PASS1 & NO EOF YET
|
||
DCFSW==000040 ;DECIMAL FRACTION
|
||
RIM1SW==000100 ;RIM10 MODE
|
||
NEGSW==000200 ;NEGATIVE ATOM
|
||
RIMSW==000400 ;RIM OUTPUT
|
||
PNCHSW==001000 ;RIM/BIN OUTPUT WANTED
|
||
CREFSW==002000
|
||
R1BSW==004000 ;RIM10 BINARY OUTPUT
|
||
TMPSW==010000 ;EVALUATE CURRENT ATOM
|
||
INDSW==020000 ;INDIRECT ADDRESSING WANTED
|
||
RADXSW==040000 ;RADIX ERROR SWITCH
|
||
FSNSW==100000 ;NON BLANK FIELD SEEN
|
||
MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS
|
||
P1==400000 ;PASS1
|
||
|
||
|
||
;[613] FRR FLAGS (RIGHT HALF OF FR)
|
||
NOPSW==400000 ;[613] NO-POLISH IN CONDITIONAL
|
||
LHPSW==200000 ;[613] OUTPUT "#" AFTER LH OF BINARY LISTING
|
||
RHPSW==100000 ;[613] OUTPUT "#" AFTER RH OF BINARY LISTING
|
||
FWPSW==040000 ;[613] FULL WORD FORMAT + "#" IN BINARY LISTING
|
||
WD2SW==020000 ;[607] PROCESSING 2ND WORD OF MULTIPLE WORD DATA
|
||
EXPSW==010000 ;[634] DOING EXP, KEEP FULL WORD FIXUP
|
||
PIDXSW==004000 ;[636] DOING POLISH AND INDEXING
|
||
NOUNVS==002000 ;[713] DON'T SEARCH UNIVERSALS
|
||
LTGSW==001000 ;[735] GOT A TAG IN LITERAL
|
||
IDXSW==000400 ;[1107] DOING OP INDEXING
|
||
|
||
;IO FLAG REGISTER (IO/ER)
|
||
FLDSW==400000 ;ADDRESS FIELD
|
||
IOMSTR==200000
|
||
ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION
|
||
IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
|
||
NUMSW==020000
|
||
IOMAC==010000 ;MACRO EXPANSION IN PROGRESS
|
||
IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS
|
||
IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION
|
||
CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG
|
||
IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO
|
||
IOENDL==000200 ;BEEN TO STOUT
|
||
IOPAGE==000100
|
||
DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)
|
||
IOIOPF==000020 ;IOP INSTRUCTION SEEN
|
||
MFLSW==000010 ;MULTI-FILE MODE,PRGEND SEEN
|
||
IORPTC==000004 ;REPEAT CURRENT CHARACTER
|
||
RSASSW==000002 ;REFERENCE IS TO A SYMBOL IN ANOTHER PSECT
|
||
IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED
|
||
|
||
OPDEF CALL [PUSHJ P,] ;FUNCTIONAL MNEMONIC
|
||
OPDEF RET [POPJ P,] ;FUNCTIONAL MNEMONIC
|
||
|
||
OPDEF JUMP1 [JUMPL FR,] ;JUMP IF PASS 1
|
||
OPDEF JUMP2 [JUMPGE FR,] ;JUMP IF PASS 2
|
||
|
||
OPDEF JUMPOC [JUMPGE IO,] ;JUMP IF IN OP-CODE FIELD
|
||
OPDEF JUMPAD [JUMPL IO,] ;JUMP IF IN ADDRESS FIELD
|
||
|
||
OPDEF JUMPCM [JUMPL CS,] ;JUMP IF CURRENT CHAR IS COMMA
|
||
OPDEF JUMPNC [JUMPGE CS,] ;JUMP IF CURRENT CHAR IS NON-COMMA
|
||
|
||
OPDEF PJRST [JRST] ;JUMP TO RET ;RETURN
|
||
OPDEF HALT [HALT] ;TO PUT IN CREF TABLE
|
||
|
||
.NODDT PJRST,CALL
|
||
|
||
;ER ERROR REGISTERS (IO/ER)
|
||
TTYSW==000001
|
||
LPTSW==000002
|
||
ERRF==000004 ;FAKE ERROR TO PREVENT LITERALS BEING COLLAPSED
|
||
|
||
ERRS==000010 ;ILLEGAL PSECT USAGE
|
||
ERRM==000020 ;MULTIPLY DEFINED SYMBOL
|
||
ERRE==000040 ;ILLEGAL USE OF EXTERNAL
|
||
ERRP==000100 ;PHASE DISCREPANCY
|
||
ERRO==000200 ;UNDEFINED OP CODE
|
||
ERRN==000400 ;NUMBER ERROR
|
||
ERRV==001000 ;VALUE PREVIOUSLY UNDEFINED
|
||
ERRU==002000 ;UNDEFINED SYMBOL
|
||
ERRR==004000 ;RELOCATION ERROR
|
||
ERRL==010000 ;LITERAL ERROR
|
||
ERRD==020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL
|
||
ERRA==040000 ;PECULIAR ARGUMENT
|
||
ERRX==100000 ;MACRO DEFINITION ERROR
|
||
ERRQ==200000 ;QUESTIONABLE, NON-FATAL ERROR
|
||
ERROR1==ERRP!ERRM!ERRV!ERRX ;ERRORS THAT PRINT ON PASS 1
|
||
ERRORS==777770 ;[732]
|
||
|
||
;SYMBOL TABLE FLAGS
|
||
SYMF==400000 ;SYMBOL !(LTAGF)
|
||
TAGF==200000 ;TAG !(LTAGF)
|
||
NOOUTF==100000 ;NO DDT OUTPUT WFW
|
||
SYNF==040000 ;SYNONYM !(SIXF)
|
||
MACF==SYNF_-1 ;MACRO
|
||
OPDF==SYNF_-2 ;OPDEF
|
||
PNTF==004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE !(SIXF)
|
||
UNDF==002000 ;UNDEFINED !(LTAGF)
|
||
EXTF==001000 ;EXTERNAL
|
||
INTF==000400 ;INTERNAL
|
||
ENTF==000200 ;ENTRY
|
||
VARF==000100 ;VARIABLE !(LTAGF, SIXF)
|
||
NCRF==000040 ;DO NOT CREF THIS SYMBOL
|
||
MDFF==000020 ;MULTIPLY DEFINED
|
||
SPTR==000010 ;SPECIAL EXTERNAL POINTER
|
||
SUPRBT==000004 ;SUPRESS OUTPUT TO REL AND LISTING
|
||
LELF==000002 ;LEFT HAND RELOCATABLE
|
||
RELF==000001 ;RIGHT HAND RELOCATABLE
|
||
LTAGF==SYMF+TAGF+UNDF ;[601] TAG IN LITERAL DURING PASS 1
|
||
TREF==VARF ;[742] TREF+LTAGF MEANS TAG NOT REF'ED
|
||
SIXF==SYNF+PNTF+VARF ;USED WITH SYN IN UNV FILE
|
||
;POINTER TO A SIXBIT OPERATOR
|
||
P1PF==UNDF+PNTF+EXTF+MDFF ;[1222] PASS1 ONLY POLISH
|
||
|
||
LITF==200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
|
||
ADDF==100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES
|
||
TNODE==200000 ;TERMINAL NODE FOR EVALEX
|
||
|
||
;FLAGS IN BLSW
|
||
BLOFF==1B0 ;BINARY LISTING OFF (MUST BE B0)
|
||
FLBLST==1B1 ;FIRST-LINE BINARY ONLY MODE
|
||
|
||
;POLISH FIXUP CODES
|
||
|
||
POLRHF==-1 ;RIGHT-HALF FIXUP
|
||
POLLHF==-2 ;LEFT-HALF FIXUP
|
||
POLFWF==-3 ;FULL-WORD FIXUP
|
||
|
||
;UNIVERSAL VERSION BIT DEFINITION
|
||
|
||
|
||
;THE FIRST WORD OF A UNV FILE MUST CONTAIN:
|
||
; LEFT HALF 777
|
||
; RIGHT HALF UNIVERSAL VERSION NUMBER
|
||
;WHEN WRITING A UNV FILE, MACRO WRITES OUT:
|
||
; 777,,UWVER FOR THE FIRST WORD
|
||
; .JBVER FOR THE SECOND WORD( MACRO VERSION NUMBER)
|
||
;WHEN READING A UNV FILE, MACRO READS THE FIRST WORD AND CHECKS FOR:
|
||
; 777 IN LEFT HALF, AND
|
||
; CHECKS THE RIGHT HALF AGAINST MASK .URVER
|
||
; WILL SKIP THE SECOND WORD IF A VERSION NUMBER IS EXPECTED THERE
|
||
;
|
||
|
||
UMACV==000020 ;HAS MACRO VERSION IN 2ND WORD
|
||
USYN==000010 ;NEW SYN HANDLING IN UNIVERSAL
|
||
UBAS==000004 ;MUST HAVE THIS BASIC BIT ON
|
||
;SAME AS THE FIRST VERSION #4
|
||
UPOL==000002 ;POLISH INCLUDED
|
||
UMAD==000001 ;MACRO ARG DEFAULT VALUE BUG FIXED
|
||
|
||
UALL==UBAS+UMAD+UPOL+USYN+UMACV ;EVERYTHING
|
||
|
||
IFN POLISH,<.URVER==^-UALL> ;WILL READ EVERY KIND OF UNV
|
||
IFE POLISH,<.URVER==^-<UALL-UPOL>> ;WILL NOT READ POLISH STUFF IN UNV
|
||
|
||
;USEFUL MACROS
|
||
|
||
DEFINE FORERR(AC,ABC)<
|
||
MOVE AC,[PAGENO,,ABC'PG]
|
||
BLT AC,ABC'PG+3
|
||
>
|
||
|
||
DEFINE BITON(BIT,ADR)<
|
||
PUSH P,0
|
||
MOVEI 0,BIT
|
||
IORM 0,ADR
|
||
POP P,0
|
||
>
|
||
SUBTTL START ASSEMBLING
|
||
|
||
ASSEMB: CALL INZ ;INITIALIZE FOR PASS
|
||
SKIPA AC1,.+1 ;LOCALIZED CODE
|
||
ASCII /.MAIN/
|
||
MOVEM AC1,TBUF
|
||
SETZM TBUF+1 ;[1140] CLEAR 2ND WORD FOR ASCIZ TITLE
|
||
SETZM TTLFND ;[1123] NO TITLE SPECIFIED YET
|
||
MOVEI SBUF
|
||
HRRM SUBTTX
|
||
|
||
ASSEM1: CALL CHARAC ;TEST FOR FORM FEED
|
||
SKIPGE LIMBO ;CRLF FLAG?
|
||
JRST ASSEM1 ;YES ,IGNORE LF
|
||
CAIN C,14
|
||
SKIPE SEQNO
|
||
JRST ASSEM2
|
||
TLNE IO,IOSALL ;[650] IGNORE FF IF SALL IN MACRO
|
||
JUMPN MRP,ASSEM1 ;[650]
|
||
CALL OUTFF3 ;[774]
|
||
JRST ASSEM1
|
||
|
||
ASSEM2: CAIN C,"\" ;BACK-SLASH?
|
||
TLZA IO,IOMAC ;YES, LIST IF IN MACRO
|
||
TLO IO,IORPTC
|
||
CALL STMNT ;OFF WE GO
|
||
TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?
|
||
CALL STOUT ;NO, POLISH OFF LINE
|
||
SETZM EXTPNT ;[1175] DO NOT PROPAGATE E ERRORS
|
||
JRST ASSEM1
|
||
SUBTTL STATEMENT PROCESSOR
|
||
|
||
STMNT:
|
||
IFN POLISH,<
|
||
SKIPLE POLTYP ;INIT POLISH
|
||
SETZM POLTYP
|
||
TRZ FRR,LTGSW!LHPSW!RHPSW!FWPSW> ;[744][614]
|
||
TLZ FR,INDSW!FSNSW!POLSW
|
||
SETZM UPARROW ;CLEAR SPECIAL REPEAT CHARACTER
|
||
TLZA IO,FLDSW
|
||
STMNT1: CALL LABEL
|
||
STMNT2: CALL ATOM ;GET THE FIRST ATOM
|
||
CAIN C,'=' ;"="?
|
||
JRST ASSIGN ;YES
|
||
CAIN C,':' ;":"?
|
||
JRST STMNT1 ;YES
|
||
JUMPAD STMNT9 ;NUMERIC EXPRESSION
|
||
JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD
|
||
CAIE C,EOL ;[665] END OF LINE?
|
||
CAIN C,']' ;CLOSING LITERAL?
|
||
RET ;YES
|
||
JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE
|
||
|
||
STMN2A: SKIPE C
|
||
TLO IO,IORPTC ;REPEAT TERMINATOR IF NOT BLANK
|
||
CALL MSRCH ;SEARCH FOR MACRO/OPDEF/SYN
|
||
JRST STMNT3 ;NOT FOUND, TRY OP CODE
|
||
LDB SDEL,[POINT 3,ARG,5]
|
||
JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS
|
||
SOJE SDEL,[ TLNE CS,(17B5) ;[1113] TERMINATED WITH OPERATOR (+,-..)
|
||
JRST STMNT9 ;[1113] YES - TREAT AS SYMBOL
|
||
JRST OPD1] ;[1113] NO - PROCESS OPDEF IF 1
|
||
SOJE SDEL,CALLM ;MACRO IF 2
|
||
JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES
|
||
|
||
STMNT3: CALL OPTSCH ;SEARCH OP CODE TABLE
|
||
JRST STMNT5 ;NOT FOUND
|
||
STMNT4: TLNE CS,(17B5) ;TERMINATED WITH OPERATOR? (+,-,ETC.)
|
||
JRST [ HRRZ AC1,V ;YES
|
||
TRZ AC1,ADDF+LITF
|
||
CAIE AC1,OP ;REGULAR OPCODE?
|
||
JRST .+1 ;NO, MUST EXECUTE IT
|
||
JRST STMNT9] ;YES, TREAT AS SYMBOL
|
||
HLLZ AC0,V ;PUT CODE IN AC0
|
||
TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG
|
||
TRZE V,LITF ;VALID IN LITERAL?
|
||
SKIPN LITLVL ;NO, ARE WE IN A LITERAL?
|
||
JRST 0(V) ;EXECUTE APPROPRIATE PROCESSOR
|
||
RET ;YES,EXIT
|
||
|
||
STMNT5: CALL SSRCH ;TRY SYMBOLS
|
||
JRST STMNT8 ;NOT FOUND
|
||
STMNT9:
|
||
IFN POLISH,<
|
||
PUSH P,[0,,POLFWF] ;MARK AS TEMP FULL WORD FIXUP
|
||
POP P,POLTYP ;IN CASE WE GO POLISH
|
||
>
|
||
JUMPL RC,STMN9A ;[1170] IF ALREADY POLISH, SKIP THIS
|
||
TDNN RC,[-2,,-2] ;[1170] ANY EXTERNALS?
|
||
JRST STMN9A ;[1170] NO
|
||
SKIPE EXTPNT ;[1170] EXTPNT ALREADY SET UP?
|
||
JRST STMN9A ;[1170] YES
|
||
TRNE RC,-2 ;[1170] NO, IF RIGHT HALF EXTERNAL
|
||
HRRM RC,EXTPNT ;[1170] RESET VALUE OF EXTPNT
|
||
TLNE RC,-2 ;[1170] DO THE SAME FOR THE LEFT HALF
|
||
HLLM RC,EXTPNT ;[1170]
|
||
STMN9A: TLO IO,FLDSW ;[1170][636] MUST BE DOING ADDR FIELD(NOT OPTR)
|
||
TLZ IO,IORPTC ;EVAL WILL HANDLE TERMINATOR IN C
|
||
CALL EVALHA ;EVALUATE EXPRESSION
|
||
IFN FORMSW,< MOVE AC1,HWFORM> ;USE STANDARD FORM
|
||
TLNE FR,FSNSW ;FIELD SEEN?
|
||
JRST STOW ;YES,STOW THE CODE AND EXIT
|
||
CAIE C,']' ;CLOSING LITERAL?
|
||
CAIN C,'>' ;[1023] CLOSING ANGLE-BRACKET?
|
||
RET ;[1023] YES, RETURN
|
||
TRO ER,ERRQ ;NO, GIVE "Q" ERROR
|
||
RET ;EXIT
|
||
|
||
STMNT8:
|
||
IFN UUOSYM,< ;ALL THIS ONLY IF TOPS10 SYMS WANTED
|
||
SKIPE NOUUO ;[1043][1041] .DIRECTIVE .NOCALLIS SEEN?
|
||
JRST STMN8A ;[1041] YES, JUMP OUT OF UUO SEARCH CODE
|
||
MOVEI V,0 ;ALWAYS START SCAN WITH 0
|
||
CAIL V,CALNTH ;END OF TABLE?
|
||
JRST STMN8C ;YES, TRY TTCALLS
|
||
CAME AC0,CALTBL(V) ;FOUND IT?
|
||
AOJA V,.-3 ;NO,TRY AGAIN
|
||
SUBI V,NEGCAL ;CALLI'S START AT -1
|
||
HRLI V,(CALLI) ;PUT IN UUO
|
||
STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF
|
||
STMN8B: CALL INSERT ;PUT OPDEF IN TABLE
|
||
JRST OPD ;AND TREAT AS OPDEF
|
||
|
||
STMN8C: SETZ V, ;START WITH ZERO
|
||
CAIL V,TTCLTH ;END OF TABLE?
|
||
JRST STMN8E ;TRY MTAPES
|
||
CAME AC0,TTCTBL(V) ;MATCH?
|
||
AOJA V,.-3 ;NO, KEEP TRYING
|
||
LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)
|
||
HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF
|
||
JRST STMN8D ;SET OPDEF FLAG
|
||
|
||
STMN8E: SETZ V, ;START AT ZERO
|
||
CAIL V,MTALTH ;END OF TABLE?
|
||
JRST STMN8A ;YES, ERROR
|
||
CAME AC0,MTATBL(V) ;MATCH
|
||
AOJA V,.-3 ;NOT YET
|
||
PUSH P,AC0 ;SAVE IT
|
||
MOVE AC0,[POINT 9,MTACOD]
|
||
IBP AC0 ;GET TO RIGHT ONE
|
||
SOJGE V,.-1 ;EVENTUALLY
|
||
LDB V,AC0 ;GET FUNCTION
|
||
HRLI V,(MTAPE) ;FILL IN OPCODE
|
||
POP P,AC0
|
||
JRST STMN8D
|
||
|
||
STMN8A:
|
||
> ;END UUOSYM
|
||
IFN POLISH,< ;[645]
|
||
JRST STMNT9 ;[645]
|
||
> ;[645]
|
||
IFE POLISH,<
|
||
SETZB V,RC ;CLEAR VALUE AND RELOCATION
|
||
TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE
|
||
JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1
|
||
MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS
|
||
JRST STMN8B ;[664] TO FORCE OUT A MESSAGE
|
||
>
|
||
SUBTTL LABEL PROCESSOR
|
||
|
||
LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC
|
||
JUMPE AC0,LABEL5 ;ERROR IF BLANK
|
||
TLO IO,DEFCRS ;THIS IS A DEFINITION
|
||
JUMPN MRP,LABL10 ;[1001] IF EXPANDING, DON'T RESET OFFSET
|
||
SKIPN LITLVL ;LABEL IN LITERAL?
|
||
JRST LABL10 ;NO
|
||
SETOM LBLFLG ;SET FLAG
|
||
PUSH P,TAGINC ;[774]
|
||
POP P,LTGINC ;SET MARKER
|
||
LABL10: TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL SSRCH ;SEARCH FOR OPERAND
|
||
IFE FTPSECT,< ;[714]
|
||
MOVSI ARG,SYMF!UNDF!TAGF ;[714] NOT FOUND
|
||
> ;[714]
|
||
IFN FTPSECT,< ;[714]
|
||
JRST [ MOVSI ARG,SYMF!UNDF!TAGF ;[714] NOT FOUND
|
||
SKIPE SGNMAX ;[714] DOING PSECTS?
|
||
CAMN AC1,SGWFND ;[714] AC1 HAS CURENT PSECT#
|
||
JRST LABL12 ;[714] JUMP IF ALREADY POINTS TO CURRENT TABLE
|
||
CALL SRCHI ;[714] OTHERWISE, RESET SYMBOL PTR
|
||
CALL SRCH ;[714] TO CURRENT PSECT TABLE
|
||
JFCL ;[714]
|
||
JRST LABL12] ;[714]
|
||
> ;[714]
|
||
LABL12: TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
TLZN ARG,EXTF ;WAS EXTERNAL?
|
||
JRST LABEL0 ;NO
|
||
TLON ARG,UNDF ;[735] YES, BECAUSE UNDEFINED?
|
||
JUMP2 LABEL3 ;NO, ERROR
|
||
LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?
|
||
JRST LABEL2 ;YES, CHECK EQUALITY
|
||
MOVE V,LOCA ;WFW
|
||
MOVE RC,MODA ;[601]
|
||
LABL11: TLO ARG,TAGF
|
||
CALL PEEK ;GET NEXT CHAR.
|
||
CAIE C,":" ;SPECIAL CHECK FOR ::
|
||
JRST LABEL1 ;NO MATCH
|
||
TLO ARG,INTF ;MAKE IT INTERNAL
|
||
CALL GETCHR ;PROCESS NEXT CHAR.
|
||
CALL PEEK ;PREVIEW NEXT CHAR.
|
||
LABEL1: CAIE C,"!" ;HALF-KILL SIGN
|
||
JRST LABEL6 ;NO
|
||
TLO ARG,NOOUTF ;YES, SUPPRESS IT
|
||
CALL GETCHR ;AND GET RID OF IT
|
||
LABEL6: SKIPN MRP ;[1001] IF EXPANDING, DON'T RESET TAG
|
||
MOVEM AC0,TAG ;[774] SAVE FOR ERRORS
|
||
SKIPN LITLVL ;[774] IN LITERAL?
|
||
JRST [ JUMPN MRP,INSERT ;[1001] DON'T RESET IF EXPANDING
|
||
SETZM TAGINC ;[774] NO RESET OFFSET
|
||
JRST INSERT] ;[774] INSERT/UPDATE AND EXIT
|
||
TRO ER,ERRF ;[774] YES, PREVENT COLLAPSING
|
||
JUMP2 LBLFIX ;[774] RETURN TO STMNT PROCESSING
|
||
MOVSI ARG,LTAGF ;[774] PASS1, SET FLAGS
|
||
SETZ V, ;[774]
|
||
MOVE RC,MODA ;[774] CURRENT RELOCATION
|
||
JRST INSERT ;INSERT/UPDATE AND EXIT
|
||
|
||
;HERE IF TAGS ENCOUNTERED INSIDE A LITERAL ON PASS2
|
||
;3-WORD-BLOCK PER TAG IS ADDED IN FRONT OF A CHAIN
|
||
;THE START OF THE CHAIN IS POINTED BY LBLPNT
|
||
; THE FORMAT OF THE 3-WORD-BLOCK IS:
|
||
; LITLVL,,POINTER TO NEXT BLOCK (OR 0 FOR END)
|
||
; NAME OF TAG IN SIXBIT
|
||
; ARG FLAGS,,OFFSET INTO CURRENT LITERAL
|
||
;
|
||
LBLFIX: PUSH P,AC0
|
||
MOVE AC1,FREE ;GET 3 WORDS FROM FREE CORE
|
||
ADDI AC1,3
|
||
CAML AC1,SYMBOL ;ENOUGH?
|
||
CALL XCEEDS ;NO, GET MORE
|
||
EXCH AC1,FREE ;UPDATE FREE
|
||
HRR AC0,LBLPNT ;UPDATE THE NEXT BLOCK POINTER
|
||
HRL AC0,LITLVL ;GET LITERAL LEVEL
|
||
MOVEM AC0,0(AC1) ;STORE IN WORD1
|
||
MOVE AC0,STPX ;CURRENT DEPTH IN LITERAL
|
||
SUB AC0,STPY ;MINUS THE START
|
||
TLZ ARG,EXTF+PNTF ;[740] MAKE SURE THEY ARE OFF
|
||
HLL AC0,ARG ;ARG FLAG IN LEFT HALF
|
||
MOVEM AC0,2(AC1) ;STORE FLAGS,,OFFSET IN WORD 3
|
||
POP P,AC0 ;RESTORE TAG NAME
|
||
MOVEM AC0,1(AC1) ;STORE IN WORD 2
|
||
MOVEM AC1,LBLPNT ;UPDATE START POINTER
|
||
RET ;[735] RETURN TO STMNT PROCESSING
|
||
|
||
;HERE IF TAG ALREADY DEFINED
|
||
|
||
LABEL2: SKIPE LITLVL ;IN LITERAL?
|
||
JRST LABEL3 ;YES, DEFINITE ERROR
|
||
HRLOM V,LOCBLK ;SAVE LIST LOCATION
|
||
IFN FTPSECT,< ;[575]
|
||
SKIPN SGNMAX ;[770] DOING PSECT?
|
||
JRST LABEL8 ;[770] NO, DON'T NEED TO CHECK PSECTS
|
||
SKIPN MODA ;[776] RELOCATABLE?
|
||
JRST LABEL8 ;[776] NO, JUMP, DON'T DO PSECT CHECK
|
||
MOVE AC1,SGNCUR ;[770] GET CURRENT PSECT
|
||
CAME AC1,SGWFND ;[770] SAME PSECT?
|
||
JRST LABEL3 ;[770] NO, FLAG MULTIPLY DEFINED
|
||
LABEL8:> ;[770]
|
||
CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW
|
||
CAME RC,MODA
|
||
LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP
|
||
JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.
|
||
TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR
|
||
CALL UPDATE ;UPDATE AND EXIT
|
||
JRST LABEL9 ;GET RID OF EXTRA CHARS.
|
||
|
||
;HERE IF EXPRESSION PRECEEDING COLON
|
||
|
||
LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?
|
||
CAME RC,MODA
|
||
LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR
|
||
JRST LABEL9 ;GET RID OF EXTRA CHARS.
|
||
|
||
LABEL7: JUMPN MRP,LABEL9 ;[1001] DON'T RESET OFFSET IF EXPANDING
|
||
MOVEM AC0,TAG ;SAVE FOR ERRORS
|
||
SKIPN LITLVL ;[774] DON'T RESET OFFSET IN LITERAL
|
||
SETZM TAGINC ;[576]
|
||
LABEL9: CALL PEEK ;INSPECT A CHAR.
|
||
CAIN C,":" ;COLON?
|
||
CALL GETCHR ;YES, DISPOSE OF IT
|
||
CALL PEEK ;EXAMINE ONE MORE CHAR.
|
||
CAIN C,"!" ;EXCLAMATION?
|
||
JRST GETCHR ;YES, INDEED
|
||
RET
|
||
SUBTTL ATOM PROCESSOR
|
||
|
||
ATOM: CALL CELL ;GET FIRST CELL
|
||
SETZ PR, ;[747]
|
||
TLNE IO,NUMSW ;IF NON-NUMERIC
|
||
ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,
|
||
RET ;EXIT
|
||
|
||
PUSH P,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT
|
||
PUSH P,AC1
|
||
PUSH P,RC
|
||
PUSH P,CURADX ;[613] PUSH CURRENT RADIX
|
||
HRRI AC0,^D10 ;[613] COMPUTE SHIFT IN RADIX 10
|
||
HRRZM AC0,CURADX ;[613] STORE IN CURRENT RADIX
|
||
SETOM BSHFLG ;[1054] IN CASE <ARG>B^-ARG
|
||
CALL CELLSF ;GET SHIFT
|
||
SETZM BSHFLG ;[1054]
|
||
MOVE ARG,RC ;SAVE RELOCATION
|
||
POP P,CURADX ;[613] RESTORE CURRENT RADIX
|
||
POP P,RC
|
||
POP P,AC1
|
||
MOVN SX,AC0 ;USE NEGATIVE OF SHIFT
|
||
POP P,AC0
|
||
JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE
|
||
TLNN IO,NUMSW ;AND NUMERIC,
|
||
JRST NUMER2 ;FLAG ERROR
|
||
IFN POLISH,<
|
||
CAME SX,[-^D35] ;SPECIAL TEST FOR <EXP>B35
|
||
JUMPN RC,ATOM3 ;[1037] JUMP IF RELOCATABLE OR POLISH
|
||
>
|
||
LSHC AC0,^D35(SX)
|
||
LSH RC,^D35(SX)
|
||
JRST ATOM1 ;TEST FOR ANOTHER
|
||
|
||
|
||
IFN POLISH,<
|
||
;HERE IF WE HAVE RELOCATABLE OR POLISH VALUES TO BE B-SHIFTED
|
||
;CONVERT TO A POLISH EXPRESSION USING UNDER-SCORE SHIFT
|
||
|
||
|
||
ATOM3: HRRZ PS,(P) ;[1037] GET RETURN ADDRESS
|
||
CAIN PS,EVATOM+1 ;[1037] IF IN EXPRESSION EVAL
|
||
JRST ATOM2 ;[1037] YES
|
||
PUSH P,CS ;[1037]
|
||
PUSH P,C ;[1037]
|
||
CAIN RC,1 ;[1163] IS IT RELOCATABLE?
|
||
MOVEM AC0,SAVCV ;[1163] YES, SAVE CURRENT VALUE
|
||
HRREI AC0,POLFWF ;[1037]
|
||
MOVEM AC0,POLTYP ;[1037]
|
||
MOVEI AC0,^D35(SX) ;[1037] NO
|
||
MOVE PS,CSTAT+'_' ;[1037]
|
||
TLNE CS,17000 ;[1037] PART OF LARGER EXPRESSION
|
||
SETOM BSHIFT ;[1037] YES, FLAG IT
|
||
CAIE RC,1 ;[1163] IS IT RELOCATABLE?
|
||
JRST ATOM3A ;[1163] NO, SKIP THIS
|
||
MOVEM RC,SAVRC ;[1163] YES, SAVE RC
|
||
SETZ RC, ;[1163] AND CLEAR IT
|
||
CALL FORCPP ;[1163] FORCE IT TO GO POLISH
|
||
SKIPA ;[1163] SKIP THE CALL TO FORCEP
|
||
ATOM3A: CALL FORCEP ;[1163][1037] POLISH OF <RC>_<AC>
|
||
SETZM BSHIFT ;[1037]
|
||
POP P,C ;[1037]
|
||
POP P,CS ;[1037]
|
||
TLNE CS,170000 ;[1037] OPERATOR FOLLOWING, THUS PART OF EXP?
|
||
CALL MOVSTK ;[1037]
|
||
TLZ FR,POLSW ;[1037]
|
||
JRST ATOM1 ;[1037]
|
||
|
||
ATOM2: POP P,(P) ;REMOVE TOP ADDRESS
|
||
MOVE PS,(P) ;GET NODE
|
||
CAME PS,[TNODE,,0] ;NOTHING THERE YET?
|
||
JRST .+3 ;YES, BYPASS INITIALIZATION
|
||
MOVSI PS,4000 ;NO, FAKE IT
|
||
ADDM PS,(P) ;PS
|
||
PUSH P,AC0 ;CV
|
||
PUSH P,RC ;RC
|
||
PUSH P,CSTAT+'_' ;CS
|
||
SETZB RC,EXTPNT
|
||
MOVEI AC0,^D35(SX) ;SHIFT ARG
|
||
JRST EVGETD ;EVALUATE
|
||
>
|
||
|
||
CELLSF: TLO IO,FLDSW
|
||
CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION
|
||
SETZB AC1,AC2 ;CLEAR WORK REGISTERS
|
||
MOVEM P,PPTEMP ;SAVE PUSHDOWN POINTER
|
||
TLZ IO,NUMSW
|
||
TLZA FR,NEGSW!DCFSW!RADXSW
|
||
|
||
CELL1: TLO IO,FLDSW
|
||
AOSLE UPARRO ;SKIP GETCHR IF RE-EATING ^
|
||
CALL BYPASS ;[664]
|
||
SKIPE .IFFLG ;[1112] DOING .IF/.IFN?
|
||
JRST %IFCHK ;[1112] YES - DO "NAME" CHECKING
|
||
CELL1A: ;[1112] AND POSSIBLY RESUME HERE
|
||
LDB V,[POINT 4,CSTAT(C),14] ;GET CODE
|
||
XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
|
||
JRST CELL1 ;0; BLANK, (TAB OR "+")
|
||
JRST LETTER ;1; LETTER ] $ % ( ) , ; >
|
||
TLC FR,NEGSW ;2; "-"
|
||
TLO FR,INDSW ;3; "@"
|
||
JRST NUM1 ;4; NUMERIC 0 - 9
|
||
JRST ANGLB ;5; "<"
|
||
JRST SQBRK ;6; "["
|
||
JRST QUOTES ;7; ""","'"
|
||
JRST QUAL ;10; "^"
|
||
JRST PERIOD ;11; "."
|
||
TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER
|
||
;12; ! # & * / : =? \ _
|
||
|
||
LETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER
|
||
LETTE1: CALL GETCHR ;GET CHARACTER
|
||
TLNN CS,6 ;ALPHA-NUMERIC?
|
||
JRST LETTE3 ;NO,TEST FOR VARIABLE
|
||
TLNE AC2,770000 ;STORE ONLY SIX BYTES
|
||
LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD
|
||
JRST LETTE1
|
||
|
||
LETTE3: CAIE C,03 ;"#"?
|
||
RET
|
||
SETZM .IFNAM ;[1112] NOT SIMPLE RADIX50 NAME
|
||
JUMPE AC0,CPOPJ ;[664] TEST FOR NULL
|
||
CALL PEEK ;PEEK AT NEXT CHAR.
|
||
CAIN C,"#" ;IS IT 2ND #?
|
||
JRST LETTE4 ;YES, THEN IT'S AN EXTERN
|
||
TLO IO,DEFCRS
|
||
CALL SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)
|
||
MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAG AS UNDEFINED SYM.
|
||
TLNN ARG,UNDF ;UNDEFINED?
|
||
JRST LETTE5 ;NO, BUT SEE IF ALREADY DEFINED AS EXTERNAL
|
||
TLC ARG,LTAGF ;[742] PART OF LTAGF?
|
||
TLCN ARG,LTAGF ;[742]
|
||
JRST GETCHR ;[742] YES, GET NEXT CHR AND RETURN
|
||
TLO ARG,VARF ;YES, FLAG AS A VARIABLE
|
||
TRO ER,ERRU ;SET UNDEFINED ERROR FLAG
|
||
CALL INSERZ ;INSERT IT WITH A ZERO VALUE
|
||
JRST GETDEL
|
||
|
||
LETTE4: CALL GETCHR ;AND SCAN PAST IT
|
||
TLZ IO,DEFCRS ;MAKE SURE NOT A DEFINITION
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL EXTER5 ;PUT IN SYMBOL TABLE
|
||
JRST GETCHR ;GET RID OF #
|
||
|
||
LETTE5: TLNE ARG,EXTF ;EXTERNAL
|
||
TRO ER,ERRQ ;YES, FLAG WITH "Q" ERROR
|
||
JRST GETCHR ;GET NEXT CHAR AND RETURN
|
||
|
||
NUMER1: SETZB AC0,RC ;RETURN ZERO
|
||
NUMER2: TROA ER,ERRN ;[1034] FLAG ERROR
|
||
|
||
GETDEL: CALL GETCHR
|
||
GETDE1: JUMPE C,.-1
|
||
MOVEI AC1,0
|
||
GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC
|
||
SKIPN RC ;[1217] IS IT RELOCATABLE?
|
||
TLZN FR,NEGSW ;[1217] IS ATOM NEGATIVE?
|
||
RET ;NO, EXIT
|
||
JUMPE AC1,GETDE2
|
||
MOVNS AC1
|
||
TDCA AC0,[-1]
|
||
GETDE2: MOVNS AC0 ;YES, NEGATE VALUE
|
||
MOVNS RC ;AND RELOCATION
|
||
RET ;[664] EXIT
|
||
|
||
QUOTES: CAIE C,"'"-40 ;IS IT "'"
|
||
JRST QUOTE ;NO MUST BE """
|
||
JRST SQUOTE ;YES
|
||
|
||
QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?
|
||
TRO ER,ERRQ ;YES, GIVE WARNING
|
||
ASH AC0,7
|
||
IOR AC0,C
|
||
QUOTE: CALL CHARAC ;GET 7-BIT ASCII
|
||
CAIG C,15 ;TEST FOR LF, VT, FF OR CR
|
||
CAIGE C,12
|
||
JRST .+2 ;NO, SO ALL IS WELL
|
||
JRST QUOTE2 ;ESCAPE WITH Q ERROR
|
||
CAIE C,42
|
||
JRST QUOTE0
|
||
CALL PEEK ;LOOK AT NEXT CHAR.
|
||
CAIE C,42
|
||
JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT
|
||
CALL CHARAC ;GET NEXT CHAR.
|
||
JRST QUOTE0 ;USE IT
|
||
|
||
QUOTE2: TRO ER,ERRQ ;SET Q ERROR
|
||
QUOTE1: JRST GETDEL
|
||
|
||
SQUOT0: CAIL C,"a" ;TEST FOR LOWER CASE
|
||
CAILE C,"z" ;...
|
||
JRST .+2 ;NO
|
||
SUBI C," "
|
||
TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?
|
||
TRO ER,ERRQ ;YES
|
||
LSH AC0,6
|
||
IORI AC0,-40(C) ;OR IN SIXBIT CHAR.
|
||
|
||
SQUOTE: CALL CHARAC
|
||
CAIGE C," " ;VALID SIXBIT?
|
||
JRST QUOTE2 ;FLAG WITH "Q" ERROR
|
||
CAIE C,"'"
|
||
JRST SQUOT0
|
||
CALL PEEK
|
||
CAIE C,"'"
|
||
JRST QUOTE1
|
||
CALL CHARAC
|
||
JRST SQUOT0
|
||
|
||
QUAL: CALL BYPASS ;[664] SKIP BLANKS, GET NEXT CHARACTER
|
||
CAIN C,'B' ;"B"?
|
||
JRST QUAL2 ;YES, RADIX=D2
|
||
CAIN C,'O' ;"O"?
|
||
JRST QUAL8 ;YES, RADIX=D8
|
||
CAIN C,'F' ;"F"?
|
||
JRST NUMDF ;YES, PROCESS DECIMAL FRACTION
|
||
CAIN C,'L' ;"L"?
|
||
JRST QUALL ;YES
|
||
CAIN C,'-' ;"^-" IS NOT
|
||
JRST QUALN
|
||
CAIE C,'D' ;"D"?
|
||
JRST NUMER1 ;NO, FLAG NUMERIC ERROR
|
||
ADDI AC2,2
|
||
QUAL8: ADDI AC2,6
|
||
QUAL2: ADDI AC2,2
|
||
PUSH P,FR ;[613] PUSH CURRENT FLAGS
|
||
PUSH P,CURADX ;[613] PUSH CURRENT RADIX
|
||
HRRM AC2,CURADX ;[613]
|
||
CALL CELLSF
|
||
POP P,CURADX ;[613] RESTORE TO ORIGINAL RADIX
|
||
QUAL2A: POP P,FR ;[613] RESTORE FLAGS
|
||
TLNN IO,NUMSW
|
||
JRST NUMER1
|
||
JRST GETDE1
|
||
|
||
QUALL: PUSH P,FR
|
||
CALL CELLSF
|
||
MOVE AC2,AC0
|
||
MOVEI AC0,^D36
|
||
SETZ RC, ;IN CASE ARG IS RELOCATABLE
|
||
JUMPE AC2,QUAL2A
|
||
LSH AC2,-1
|
||
SOJA AC0,.-2
|
||
|
||
QUALN:
|
||
SKIPN BSHFLG ;[1054] DOING B-SHIFT?
|
||
JRST QUALN1 ;[1054] NO, EVALUATE AT EXP-LEVEL
|
||
;[1054] THIS IS A KLUDGE TO ALLOW ^- TO INTERACT CORRECTLY WITH
|
||
;THE B-SHIFT OPERATOR. B-SHIFT OPERATIONS, UNLIKE UNDERSCORE-SHIFT
|
||
;OPERATIONS, MUST BE PERFORMED AT CELL-LEVEL (AS THEY ARE SEEN)
|
||
;SINCE NOT EVERY CASE CAN BE HANDLED AT EXPRESSION-EVALUATION
|
||
;LEVEL (E.G., ^F123.45B17, ^F123.45B17B35, <EXT##>B35,
|
||
;100B<EXT##>, ETC.). UNARY OPERATORS, HOWEVER, ARE SUPPOSED TO
|
||
;TAKE PRIORITY OVER SHIFT OPERATORS. THEREFORE, IF A UNARY
|
||
;OPERATOR IS SEEN DURING THE EVALUATION OF A B-SHIFT
|
||
;ARGUMENT, THE UNARY OPERATION MUST BE PERFORMED IMMEDIATELY.
|
||
PUSH P,FR ;[1054] YES, HAVE TO DO IT NOW
|
||
CALL CELLSF ;[1054] GET CELL
|
||
SETCA AC0, ;[1054] COMPLEMENT IT
|
||
JRST QUAL2A ;[1054] CONTINUE
|
||
QUALN1: MOVE CS,CSTATN ;[1054] GET CHARACTERISTICS FOR "^-"
|
||
JRST GETDE1 ;THEN GET DELIMITER
|
||
SUBTTL LITERAL PROCESSOR
|
||
|
||
SQBRK: PUSH P,LBLFLG ;[1074] SAVE PREVIOUS LABEL-IN-LIT FLAG
|
||
SETZM LBLFLG ;[1074] CLEAR CURRENT LABEL-IN-LIT FLAG
|
||
PUSH P,TAG ;[1074] SAVE CURRENT TAG
|
||
PUSH P,FR
|
||
PUSH P,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD
|
||
SETZM EXTPNT
|
||
PUSH P,INOPDF ;[1006] TO ALLOW LITERAL IN OPDEF DEFINITION
|
||
SETZM INOPDF ;[1006]
|
||
IFN FORMSW,< PUSH P,IOSEEN> ;SAVE I/O INSTRUCTION SEEN VALUE
|
||
IFN POLISH,< ;[560]
|
||
PUSH P,INANGL ;SAVE INANGL
|
||
SETZM INANGL
|
||
PUSH P,INASGN ;SAVE INASGN
|
||
SETZM INASGN
|
||
PUSH P,POLTYP ;SAVE AND INIT POLTYP
|
||
SETZM POLTYP
|
||
PUSH P,POLITS ;SAVE PTR TO LITS STILL TO FIXUP
|
||
SETZM POLITS ;START AFRESH
|
||
>
|
||
SKIPE LITLVL ;FIRST TIME IN LIT?
|
||
JRST SQB5 ;NO, ALREADY IN LIT, DOING NESTING
|
||
FORERR (C,LIT) ;YES, FIRST TIME, SAVE SEQNO AND PAGE
|
||
MOVE AC0,LITABX ;SAVE POINTER INTO LITERAL POOL
|
||
MOVEM AC0,SQBST ;AS THE START OF LITERAL TAG FIXUP
|
||
SQB5: AOS LITLVL ;BUMP NESTING OF LITERALS
|
||
IFN FTPSECT,< ;[1074]
|
||
AOS SGLITL ;[1074] BUMP 'ALL PSECT' NESTING LEVEL
|
||
> ;[1074]
|
||
PUSH P,STPX ;SAVE STATE OF BINARY BUFFER
|
||
PUSH P,STPY
|
||
PUSH P,LSTPY ;SAVE CURRENT LITERAL VARIABLES
|
||
MOVE AC0,STPX
|
||
MOVEM AC0,STPY
|
||
MOVEM AC0,LSTPY
|
||
PUSH P,[0] ;MAKE PLACE TO KEEP ERROR FLAG
|
||
HRRM ER,0(P) ;SAVE CURRENT ERROR FLAGS
|
||
TRZ ER,ERRF ;START WITH CLEAN SLATE
|
||
SQB3: CALL STMNT
|
||
TRNE ER,ERRORS+ERRF ;ANY ERRORS THIS WORD?
|
||
HRROS 0(P) ;YES, REMEMBER FOR STOLIT
|
||
TLO IO,IORPTC ;REPEAT TERMINATOR, UNLESS...
|
||
CAIN C,75 ;IT WAS A CLOSE BKT
|
||
TLZ IO,IORPTC
|
||
MOVEI AC1,0 ;SAY "]" NOT SEEN, UNLESS...
|
||
CAIE C,75 ;"]" TERMINATED STATMENT?
|
||
TLNE FR,MWLFLG ;OR NO MULTI-LINE LITS?
|
||
TRO AC1,1 ;YES, NOTE LITERAL TERMINATED
|
||
SKIPN LITLST ;NEW FORMAT LISTING?
|
||
JUMPN AC1,SQB2A ;NO, JUMP IF LITERAL DONE
|
||
SKIPE AC1 ;LITERAL TERMINATED?
|
||
SOS LITLVL ;YES, MUST NOT CONFUSE CHARAC
|
||
SQB4: CALL CHARAC ;BYPASS NON-SIGNIFICANT CHARS
|
||
CAIE C," " ;SPACE
|
||
CAIN C,HT ;TAB
|
||
JRST SQB4
|
||
CAIN C,";" ;COMMENT?
|
||
JRST SQB6 ;YES, IGNORE SQUARE BRACKETS
|
||
SQB4A: SKIPE AC1 ;LITLVL SOS'D ABOVE?
|
||
AOS LITLVL ;YES, PUT IT BACK
|
||
CAILE C,CR ;LOOK FOR END OF LINE
|
||
JRST [ JUMPN AC1,SQB2 ;JUMP IF SOMETHING AFTER "]"
|
||
CAIN C,"]" ;POSSIBLY A LITERAL TERM?
|
||
JRST SQB2A ;YES
|
||
TRO ER,ERRQ ;JUNK ON LINE, OTHER THAN "]"
|
||
JRST SQB4] ;SKIP IT AND LOOK FOR EOL
|
||
PUSH P,AC1 ;SAVE LITERAL TERMINATED FLAG
|
||
CALL OUTIML ;DUMP
|
||
SKIPN LITLVL ;[1134] NESTED IN PSECT WITH NO LITS?
|
||
JRST [ JUMP2 .+1 ;[1134] YES - ONLY DURING PASS 1
|
||
AOS CS,STPX ;[1134] NO. OF LOCATIONS STOWED
|
||
ADDM CS,LOCO ;[1134] UPDATE OUTPUT LOC
|
||
CALL STOWI ;[1134] INITIALIZE FOR NEXT STOW
|
||
JRST .+1] ;[1134]
|
||
POP P,AC1 ;RECOVER FLAG
|
||
JUMPN AC1,SQB1 ;JUMP IF LITERAL TERMINATED
|
||
CALL CHARAC ;GET ANOTHER CHAR.
|
||
SKIPGE LIMBO ;[1003] IF CRLF, CHECK FOR FF
|
||
CALL [ CALL CHARAC ;[1003]
|
||
CAIN C,FF ;[1003]
|
||
JRST OUTFF3 ;[1003]
|
||
RET] ;[1003]
|
||
TLO IO,IORPTC ;[1003] SET REPEAT
|
||
JRST SQB3
|
||
|
||
SQB6: CALL CHARAC ;GET A CHARACTER
|
||
CAIG C,CR
|
||
CAIN C,HT ;LOOK FOR END OF LINE CHAR.
|
||
JRST SQB6 ;NOT YET
|
||
JRST SQB4A ;GOT IT
|
||
|
||
SQB1: TLNE IO,IOSALL ;SALL AND IN MACRO?
|
||
JUMPN MRP,SQB2 ;IF SO, DON'T REPEAT TERMINATOR
|
||
HRRZ C,LIMBO ;GET TERMINATOR
|
||
SOSG CPL ;PUT IT IN IMAGE BUFFER
|
||
CALL RSW5
|
||
IDPB C,LBUFP
|
||
SQB2: TLO IO,IORPTC ;REPEAT TERMINATOR
|
||
SQB2A: SKIPGE 0(P) ;ERROR ANYWHERE IN LITERAL?
|
||
TRO ER,ERRF ;YES, PREVENT COMPRESSION
|
||
MOVE AC1,LITNUM ;SAVE LITNUM BEFORE UPDATED IN
|
||
MOVEM AC1,LITN ;STOLIT IN CASE NEEDED FOR SQBTGS
|
||
CALL STOLIT
|
||
SKIPE LBLPNT ;ANY TAGS IN LITERAL TO FIX UP?
|
||
CALL SQBTGS ;YES, (ONLY ON PASS2)
|
||
POP P,AC1 ;RECOVER ER AS BEFORE LIT
|
||
TRNE AC1,ERRORS+ERRF ;ANY ERRORS?
|
||
TRO ER,ERRF ;YES, KEEP ONLY ERRF
|
||
POP P,LSTPY ;RESTORE LITERAL VARIABLES
|
||
POP P,STPY ;RESTORE PREVIOUS STATE OF CODE BUFFER
|
||
POP P,STPX
|
||
SOS LITLVL ;ONE LESS NESTING OF LITERALS
|
||
IFN FTPSECT,< ;[1074]
|
||
SOS SGLITL ;[1074] ONE LESS 'ALL PSECT' LIT LEVEL
|
||
> ;[1074]
|
||
IFN POLISH,<
|
||
SKIPE POLITS ;NEED TO FIXUP ANY POLISH?
|
||
CALL SQBPOL ;YES
|
||
POP P,POLITS ;RESTORE NEXT LEVEL PTR
|
||
POP P,POLTYP ;RESTORE POLTYP
|
||
POP P,INASGN ;RESTORE NEXT LEVEL INASGN
|
||
POP P,INANGL ;RESTORE NEXT LEVEL INANGL
|
||
> ;[560]
|
||
IFN FORMSW,< POP P,IOSEEN> ;RESTORE IOSEEN FOR LISTING
|
||
POP P,INOPDF ;[1006] RESTORE INOPDF SETTING
|
||
POP P,EXTPNT
|
||
POP P,FR
|
||
POP P,TAG ;AND LABEL
|
||
POP P,LBLFLG ;[1074] AND LABEL-IN-LITERAL FLAG
|
||
SKIPE LITLVL ;WERE WE NESTED?
|
||
JUMP1 SQB2F ;YES, FORCE ERROR IF PASS 1
|
||
JUMP2 GETDEL ;USE VALUE GIVEN IF PASS 2
|
||
TRO ER,ERRU ;VALUE IS UNDEFINED ON PASS 1
|
||
TDZA AC0,AC0 ;SO SET IT TO 0
|
||
SQB2F: TRO ER,ERRF ;SET FAKE ERROR FLAG
|
||
JRST GETDEL
|
||
;HERE DURING PASS2 TO STORE REAL VALUES FOR TAGS IN LITERAL.
|
||
;IF NO REFERRENCES YET, THE TAG IS INSERTED INTO SYMTAB WITH REAL-V.
|
||
;IF THERE ARE FORWARD REFERENCES, A POINTER TO A 2-WORD LOCAL BLOCK
|
||
;REPLACES THE EXTERNAL NAME OF THE ORIGINAL 2WORD PAIR. LOCAL BLOCKS
|
||
;ARE CHAINED IN CHNLOC ROUTINE AT THE END OF PASS2,
|
||
;AND HAS THE FOLLOWING FORMAT WHEN IT IS FIRST CREATED HERE:
|
||
;
|
||
; TAG-REAL-VALUE,,TAG-FLAGS
|
||
; TAG-RELOCATION..0
|
||
;
|
||
;ALL MEMORY LOCATIONS RELATED TO THE PROCESSING OF TAGS IN LITERALS
|
||
;ARE CLEARED WHEN THE OUTER MOST (LEVEL 1) LITERAL IS BEING CLOSED.
|
||
;
|
||
SQBTGS: PUSH P,RC ;SAVE BUNCH OF ACS THAT WE NEED
|
||
PUSH P,V
|
||
PUSH P,AC0
|
||
PUSH P,AC1
|
||
PUSH P,ARG
|
||
PUSH P,SX
|
||
MOVE AC2,LITHDX ;GET HEADER BLOCK
|
||
HLRZ RC,-1(AC2) ;GET BLOCK RELOCATION
|
||
MOVEM RC,LITRC ;SAVE IT
|
||
HRRZ AC0,-1(AC2)
|
||
ADD AC0,LITN ;COMPUTE ACTUAL LOCATION
|
||
MOVEM AC0,LITV ;ACTUAL START LOCATION OF THIS LITERAL
|
||
MOVE AC1,LBLPNT ;GET START OF LITERAL TAG CHAIN
|
||
SQBTG1: HRRZ AC0,(AC1)
|
||
MOVEM AC0,LBLNXT ;ADDRESS OF NEXT BLOCK IN CHAIN
|
||
HLRZ AC0,(AC1) ;GET LIT LEVEL
|
||
CAME AC0,LITLVL ;SAME AS THE LITERAL BEING CLOSED?
|
||
JRST [ MOVEM AC1,LBLPNT ;NO, UPDATE CHAINS STARTING ADDR
|
||
JRST SQBTG3] ;GO RESTORE ACS AND RETURN
|
||
MOVE AC0,1(AC1) ;YES, GET TAG NAME
|
||
PUSH P,AC1 ;SSRCH USES AC1
|
||
CALL SSRCH ;SETUP POINTER INTO SYMBOL TABLE
|
||
JFCL ;[740]
|
||
SQBTG5: POP P,AC1
|
||
HRRZ V,2(AC1) ;GET OFFSET
|
||
ADD V,LITV ;ADD IN THE START LOCATION
|
||
MOVEI RC,-1 ;PUT -1 AS LIT LEVEL
|
||
HRLM RC,(AC1) ;TO FLAG THIS TAG HAS BEEN PROCESSED
|
||
MOVE RC,LITRC ;GET BLOCK RELOCATION
|
||
TLZE ARG,TREF ;[740] WAS IT REFERENCED? CLEAR FLAG
|
||
JRST [ PUSH P,AC2 ;[735] NEED AN AC FOR A WHILE
|
||
MOVEI AC2,2 ;[735] GET 2 WORDS
|
||
ADDB AC2,FREE ;[735] FROM FREE SPACE
|
||
CAML AC2,SYMBOL ;[735] CHECK TO SEE IF ENOUGH
|
||
CALL XCEEDS ;[735]
|
||
SUBI AC2,2 ;[735]
|
||
HRRZM AC2,1(ARG) ;[735] MAKE 2ND WORD POINT TO IT
|
||
HLL V,2(AC1) ;[735] GET SYMBOL FLGS OF THE TAG
|
||
MOVSM V,0(AC2) ;[735] STORE IN 1ST WORD OF NEW PAIR
|
||
MOVE V,LITRC ;[735] GET RELOCATION OF TAG
|
||
MOVSM V,1(AC2) ;[735] STORE IN 2ND WORD OF NEW PAIR
|
||
POP P,AC2 ;[735] RESTURE AC2
|
||
JRST SQBTG2] ;[735]
|
||
HLLZ ARG,2(AC1) ;[735] NO REFERRENCES, GET FLAGS
|
||
TLZ ARG,EXTF+PNTF ;[740] MAKE SURE THEY ARE OFF
|
||
CALL INSERT ;[735] JUST ADD TO SYMBOL TABLE
|
||
SQBTG2: SKIPE AC1,LBLNXT ;ARE THERE ANY MORE TAGS TO FIXUP?
|
||
JRST SQBTG1 ;YES,
|
||
SQBTG3: MOVE SX,LITLVL ;OUTERMOST LITERAL BEING CLOSED?
|
||
SOJG SX,SQBTG4 ;NO, JUMP
|
||
SETZM LBLPNT ;YES, CLEAR MEMORY LOCATIONS
|
||
SETZM LBLNXT
|
||
SETZM LITV
|
||
SQBTG4: POP P,SX ;NO, RESTORE ACS
|
||
POP P,ARG
|
||
POP P,AC1
|
||
POP P,AC0
|
||
POP P,V
|
||
POP P,RC
|
||
RET
|
||
|
||
IFN POLISH,<
|
||
;HERE TO FIXUP POLISH EXPRESSIONS INSIDE CURRENT LIT
|
||
;AS EACH ONE IS FIXED MOVE IT TO POLIST
|
||
SQBPOL: PUSH P,CS ;GET SOME FREE ACCS
|
||
SKIPE PHALVL ;[1166] INSIDE PHASED CODE?
|
||
JRST [MOVE CS,LITHDX ;[1166] YES, GET PTR TO BLOCK INFO
|
||
PUSH P,-2(CS) ;[1166] GET MODO & LOCO OF LITERAL ADDR
|
||
HLRZ RC,0(P) ;[1166] SET UP THE RELOCATION
|
||
POP P,AC0 ;[1166] AND THE LOCATION
|
||
HRRZS AC0 ;[1166]
|
||
JRST .+1] ;[1166]
|
||
PUSH P,AC0 ;SAVE LOC
|
||
SQBPL1: MOVE CS,@POLITS ;GET A BLOCK POINTER
|
||
EXCH CS,POLITS ;SET FOR NEXT TIME
|
||
MOVE AC0,CS ;GET A COPY
|
||
EXCH AC0,POLIST ;STORE IN LIST OF "GOOD" POLISH
|
||
MOVEM AC0,(CS) ;LINK IN
|
||
AOJ CS, ;[1161] SKIP OVER COUNT
|
||
SQBPL2: ADDI CS,1 ;FIRST WORD
|
||
MOVE AC0,(CS) ;GET SOMETHING
|
||
JUMPL AC0,SQBPL5 ;THIS IS AN OPERATOR
|
||
JUMPE AC0,SQBPL4 ;18 BIT VALUE
|
||
SOJE AC0,SQBPL3 ;36 BIT VALUE
|
||
AOJA CS,SQBPL2 ;SYMBOL
|
||
|
||
SQBPL3: ADDI CS,1 ;SKIP OVER 2 WORDS
|
||
SQBPL4: AOJA CS,SQBPL2 ;GET NEXT
|
||
|
||
SQBPL5: HRRZ AC0,AC0 ;GET OPERATOR ONLY
|
||
CAIGE AC0,-6 ;CHECK FOR STORE OP
|
||
JRST SQBPL2 ;ITS NOT
|
||
MOVE AC0,0(P) ;GET ADDRESS
|
||
ADDM AC0,1(CS) ;ADD TO OFFSET
|
||
HRLM RC,1(CS) ;SET RELOCATION
|
||
SKIPE POLITS ;MORE TO DO?
|
||
JRST SQBPL1 ;YES
|
||
POP P,AC0 ;RESTORE LOC
|
||
SKIPE PHALVL ;[1166] INSIDE PHASED CODE?
|
||
JRST [MOVE CS,LITHDX ;[1166] YES, RETURN ORIGINAL VALUES
|
||
HRRZ AC0,-1(CS) ;[1166] OF AC0 AND RC
|
||
HLRZ RC,-1(CS) ;[1166]
|
||
JRST .+1] ;[1166]
|
||
POP P,CS ;AND SAVED AC
|
||
RET
|
||
>
|
||
SUBTTL NUMBER PROCESSOR
|
||
|
||
ANGLB: IFN POLISH,<
|
||
PUSH P,XWDANG ;[706] PUSH PTR TO LH POL
|
||
SETZM XWDANG ;[706] ZERO LH POL
|
||
PUSH P,INANGL ;PUSH CURRENT STACK PTR OR MARKER
|
||
SETOM INANGL ;NOTE STARTING ANG BKTS
|
||
SETOM .IFANG ;[1056] SET FLAG FOR .IF(N)
|
||
PUSH P,INXWD ;[1010] SAVE XWD SETTING
|
||
SETZM INXWD ;[1010] AND CLEAR
|
||
PUSH P,POLTYP ;[634] PUSH CURRENT POLISH FIXUP TYPE
|
||
>
|
||
PUSH P,INOPDF ;[1011] SAVE DOING OPDEF SETTING
|
||
SETZM INOPDF ;[1011]
|
||
SETZM BSHFLG ;[1054] CLEAR FLAG FOR QUALN
|
||
PUSH P,FR
|
||
TLZ FR,INDSW+POLSW
|
||
TLZ IO,FLDSW ;[1234] ALLOW OPCODE PROCESSING AGAIN
|
||
CALL ATOM
|
||
SKIPN .IFFLG ;[1112] DOING .IF/.IFN?
|
||
JRST ANGLB7 ;[1112] NO
|
||
SKIPN .IFNAM ;[1112] STILL LOOKING AT RADIX50 NAME?
|
||
JRST ANGLB7 ;[1112] NO
|
||
CAIE C,'>' ;[1112] MUST HAVE CLOSE BRACKET NEXT
|
||
JRST ANGLB6 ;[1112] DON'T - NOT A "NAME"
|
||
SKIPG .IFNAM ;[1112] NESTED ANGLE BRACKETS?
|
||
JRST ANGLB5 ;[1112] NO - FIRST SET
|
||
SKIPN AC0 ;[1112] "NAME" MUST BE THE ONLY ATOM
|
||
JRST ANGLB7 ;[1112] IT IS - CONTINUE
|
||
JRST ANGLB6 ;[1112] NOT JUST "NAME"
|
||
ANGLB5: SKIPN AC0 ;[1112] MUST HAVE ATOM FOR "NAME"
|
||
JRST ANGLB6 ;[1112] DON'T
|
||
MOVNS .IFNAM ;[1112] "NAME" FOUND IN ANGLE BRACKETS
|
||
SKIPA ;[1112] SKIP CLEAR
|
||
ANGLB6: SETZM .IFNAM ;[1112] ELSE CAN'T BE A SIMPLE RADIX50 NAME
|
||
ANGLB7: ;[1112]
|
||
TLNN IO,NUMSW
|
||
CAIE C,35 ;=
|
||
JRST ANGLB1
|
||
PUSH P,INASGN ;[1153] SAVE ORIGINAL VALUES OF INASGN
|
||
PUSH P,EXTPNT ;[1153] AND EXTPNT AROUND CALL TO ASSIG1
|
||
CALL ASSIG1
|
||
POP P,EXTPNT ;[1153] RESTORE THE VALUES OF EXTPNT
|
||
POP P,INASGN ;[1153] AND INASGN
|
||
MOVE AC0,V
|
||
JRST ANGLB2
|
||
|
||
ANGLB1: CALL EVALHA
|
||
ANGLB2: POP P,FR
|
||
IFN POLISH,<
|
||
JUMP1 [TDNN RC,[-2,,-2] ;[1215] CHECK FOR EXTERNAL
|
||
JRST ANGLB4 ;[1215] BECAUSE IT WILL GO POLISH
|
||
SKIPE LITLVL ;[1215] IF IN LITERAL
|
||
TRO ER,ERRF ;[1215] PREVENT FOLDING IN PASS 1
|
||
JRST ANGLB4] ;[1215] SINCE IT CANNOT FOLD IN PASS 2
|
||
TRNE FRR,NOPSW ;[771] DOING NO POLISH?
|
||
JRST ANGLB4 ;[771] YES, JUMP OVER
|
||
PUSH P,[0,,POLFWF] ;[706] SET POLTYP
|
||
POP P,POLTYP ;[706]
|
||
SETCM AC1,INANGL ;GET FLAG
|
||
JUMPN AC1,[CALL ANGPOL ;[773] JUMP IF POLISH
|
||
JRST ANGNEG] ;[773]
|
||
TDNN RC,[-2,,-2] ;[747] NO POLISH, BUT ANY EXTERNALS?
|
||
JRST ANGLB4 ;[747] NO EXTERNALS EITHER, JUMP
|
||
CALL ANGEXT ;[773] NO POLISH BUT HAVE EXTERNALS
|
||
ANGNEG: TLZN FR,NEGSW ;[747] NEGATIVE?
|
||
JRST ANGLB3 ;[1105][727] NO, JUMP
|
||
CALL FNEGP ;[727] YES, DO IT
|
||
MOVE RC,INANGL ;[727]
|
||
CALL MOVSTK ;[727]
|
||
SETZM INANGL ;[727]
|
||
TLO FR,POLSW ;[727]
|
||
ANGLB3: TRZ FRR,FWPSW ;[1105] CLEAR FULLWORD FIXUP
|
||
ANGLB4: POP P,INOPDF ;[1011] RESTORE
|
||
POP P,POLTYP ;[727] RESTORE POLISH FIXUP TYPE TO BEFORE
|
||
POP P,INXWD ;[1010] RESTORE XWD SETTING TO BEFORE
|
||
POP P,INANGL ;GET CURRENT STATUS
|
||
POP P,XWDANG ;[706] RESTORE PTR TO LH POL
|
||
>
|
||
CAIE C,36 ;CLOSE ANGBKT?
|
||
JRST [ TRO ER,ERRN ;[1142] FLAG ERROR
|
||
CAIN C,EOL ;[1142] END OF LINE SEEN?
|
||
TLO IO,IORPTC ;[1142] YES - DO NOT DISCARD
|
||
JRST .+1] ;[1142]
|
||
JRST GETDEL
|
||
|
||
|
||
|
||
|
||
|
||
;HERE IF WE HAVE POLISH IN ANGLE BRACKETS-- MUST DECIDE WHICH CASE
|
||
;WE HAVE AND SETUP XWDLRC, XWDRRC, XWDLV, XWDRV:
|
||
;
|
||
; CASES RC XWDANG INANGL
|
||
; ----- -- ------ ------
|
||
; <POL> 0 0 POL
|
||
; INXWD/0 DIFFERENCIATE FROM <0,,POL>
|
||
; <POL1,,POL2> 0,,0 POL1 POL2
|
||
; <POL1,,POL1> 0,,0 POL1 POL1
|
||
; XWDRRC/POL1 TO DIFFERENTCIATE FROM <POL1,,0>
|
||
; <POL1,,EXT> 0,,EXT POL1 POL1
|
||
; <POL1,,K> 0,,0 POL1 POL1
|
||
; <POL1,,REL> 0,,1 POL1 POL1
|
||
; <EXT,,POL2> EXT,,0 0 POL2
|
||
; <K,,POL2> 0,,0 0 POL2
|
||
; <REL,,POL2> 1,,0 0 POL2
|
||
|
||
IFN POLISH,<
|
||
ANGPOL: JUMPN CV,.+4 ;[1026] JUMP IF CURRENT VALUE NOT ZERO
|
||
SKIPN INXWD ;[1010] DOING XWD?
|
||
JRST ANGFW ;[1010] NO, JUMP
|
||
SETZM INXWD ;[1010] YES, CLEAR FLAG FIRST AND PROCESS
|
||
MOVEM CV,XWDRV ;[773] STORE RIGHT VALUE
|
||
MOVEM CV,XWDLV ;[773] STORE LEFT VALUE
|
||
PUSH P,RC ;[773] NEED AN AC TO WORK
|
||
SKIPN RC,XWDANG ;[773] DO WE HAVE <POL,,..>?
|
||
JRST [ POP P,RC ;[773] RESTORE ORIGINAL RC
|
||
PUSH P,INANGL ;[773] SAVE RIGHT PTR
|
||
CALL ANGEXL ;[773] GO CHECK LEFT EXTERNAL
|
||
POP P,RC ;[773] GET RIGHT PTR
|
||
JRST ANGPO1] ;[773]
|
||
MOVEM RC,SAVRC ;[1013][773]
|
||
MOVEM RC,SAVCV ;[773]
|
||
PUSH P,INANGL ;[773] SAV RT PTR
|
||
PUSH P,XWDRRC ;[773] SAVE ORIGINAL XWDRRC
|
||
CALL ANGFPL ;[773] DO LEFT SHIFT POLISH
|
||
POP P,XWDRRC ;[773]
|
||
MOVEM RC,XWDLRC ;[773] TO FREE SPACE & UPDATE LEFT RC
|
||
MOVEM RC,XWDLV ;[773] AND LEFT VALUE
|
||
POP P,RC ;[773] GET INANGLE INTO RC
|
||
CAMN RC,XWDANG ;[773] INANGLE = XWDANG?
|
||
JRST [ CAMN RC,XWDRRC ;[773] YES, IS IT <POL,,POL> WHERE LEFT POL=RIGHT POL?
|
||
JRST [ POP P,0(P) ;[773] YES,
|
||
JRST ANGPO1+1] ;[773]
|
||
POP P,RC ;[773] NO, THEN THERE IS NO RIGHT POL
|
||
CALL ANGEXR ;[773] RESTORE RC & GO CHECK RIGHT EXT
|
||
CALL ANGFPB ;[773] ADDING BOTH HALVES
|
||
JRST ANGEND] ;[773] RETURN
|
||
POP P,0(P) ;[773] NO, FIXUP STK PTR
|
||
ANGPO1: CALL MOVSTK ;[773] WE HAVE <POL1,,POL2> RC/RT PTR
|
||
MOVEM RC,SAVRC ;[773]
|
||
MOVEM RC,SAVCV ;[773]
|
||
CALL ANGFPR ;[773] DO AND RIGHT HALF POLISH
|
||
MOVEM RC,XWDRV ;[773] UPDATE RT V
|
||
MOVEM RC,XWDRRC ;[773] UPDATE RT RC
|
||
CALL ANGFPB ;[773] GO ADD
|
||
JRST ANGEND ;[773]
|
||
|
||
|
||
;HERE IF NO POLISH IN ANGLE BRACKETS, BUT EXTERNALS--
|
||
;MUST ALSO SETUP XWDLRC, XWDRRC, XWDLV, XWDRV:
|
||
;THE CASES THAT COME THRU HERE ARE:
|
||
;
|
||
; <EXT1,,EXT2>
|
||
; <EXT1,,K> <K,,EXT2>
|
||
; <EXT1,,REL> <REL,,EXT2>
|
||
|
||
ANGEXT: TLNN RC,-1 ;[773] DO WE HAVE <0,,EXT>?
|
||
JUMPE CV,CPOPJ ;[773] YES, RETURN
|
||
MOVEM CV,XWDLV ;[773] LEFT VALUE
|
||
MOVEM CV,XWDRV ;[773] RIGHT VALUE
|
||
PUSH P,RC ;[773]
|
||
CALL ANGEXL ;[773] GO CHECK LEFT EXTERNAL
|
||
POP P,RC ;[773]
|
||
CALL ANGEXR ;[773] GO CHECK RIGHT EXTERNAL
|
||
CALL ANGFPB ;[773] GO ADD
|
||
|
||
ANGEND: SETZM XWDLRC ;[773] ALL ANGXXX ROUTINE RETURN THRU HERE
|
||
SETZM XWDLV ;[773] ZERO ALL WORKING ADDRS
|
||
SETZM XWDRRC ;[773]
|
||
SETZM XWDRV ;[773]
|
||
SETZM SAVRC ;[773]
|
||
SETZM SAVCV ;[773]
|
||
RET ;[773]
|
||
|
||
|
||
ANGEXL: TLNN RC,-2 ;[773]
|
||
JRST [ HLLZM RC,XWDLRC ;[773] JUMP IF LEFT NOT EXTERNAL
|
||
RET] ;[773]
|
||
HLRZM RC,SAVRC ;[773]
|
||
SETZM SAVCV ;[773]
|
||
CALL ANGFPL ;[773] FORCE LEFT POLISH
|
||
MOVEM RC,XWDLV ;[773] UPDATE LEFT VALUE
|
||
MOVEM RC,XWDLRC ;[773] SET UP LEFT RD
|
||
RET ;[773]
|
||
|
||
|
||
ANGEXR: TRNN RC,-2 ;[773]
|
||
JRST [ HRRZM RC,XWDRRC ;[773] JUMP IF RIGHT NOT EXTERNAL
|
||
RET] ;[773]
|
||
HRRZM RC,SAVRC ;[773]
|
||
SETZM SAVCV ;[773]
|
||
CALL ANGFPR ;[773] GO FORCE RIGHT POLISH
|
||
MOVEM RC,XWDRV ;[773] UPDATE RIGHT VALUE
|
||
MOVEM RC,XWDRRC ;[773] SET UP RIGHT RC
|
||
RET ;[773]
|
||
|
||
|
||
;HERE ARE ROUTINES TO DO FORCED POLISH FOR
|
||
;RIGHT HALF, LEFT HALF, AND ADDING BOTH HALVES:
|
||
|
||
|
||
ANGFPL: TLO FR,POLSW ;[773] DOING POLISH
|
||
MOVEI CV,^D18 ;[773] OPERAND2
|
||
SETZ RC, ;[773]
|
||
MOVE PS,CSTAT+'_' ;[773] SHIFT OPERATOR
|
||
PJRST ANGLFP ;[773]
|
||
|
||
ANGFPR: TLO FR,POLSW ;[1071][773] DOING POLISH
|
||
HRRZI CV,-1 ;[773] OPERAND2
|
||
SETZ RC, ;[773]
|
||
MOVE PS,CSTAT+'&' ;[706] FORCE AND WITH EXISTING
|
||
PJRST ANGLFP ;[706]
|
||
|
||
ANGFPB: PUSH P,XWDRRC ;[773] RIGHT RC
|
||
POP P,SAVRC ;[773] IN SAVRC
|
||
PUSH P,XWDRV ;[773] GET RIGHT VALUE
|
||
POP P,SAVCV ;[773] IN SAVCV
|
||
MOVE CV,XWDLV ;[773] LEFT VALUE IN CV
|
||
MOVE RC,XWDLRC ;[773] LEFT RC IN RC
|
||
MOVE PS,CSTAT+'+' ;[706] FORCE ADD
|
||
|
||
ANGLFP: PUSH P,CS ;[773]
|
||
CALL FORCPP ;[773]
|
||
POP P,CS ;[773]
|
||
ANGFW: TLO FR,POLSW ;[1010][773] FLAG POLISH
|
||
MOVE RC,INANGL ;[706]
|
||
PJRST MOVSTK ;[706] FORCE FIXUP, EXIT THRU MOVSTK
|
||
|
||
> ;[706] END IFN POLISH
|
||
|
||
PERIOD: CALL GETCHR ;LOOK AT NEXT CHARACTER
|
||
TLNN CS,2 ;ALPHABETIC?
|
||
JRST PERNUM ;NO, TEST NUMERIC
|
||
MOVSI AC0,'. ' ;YES, PUT PERIOD IN AC0
|
||
MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER
|
||
JRST LETTE2 ;AND TREAT AS SYMBOL
|
||
|
||
PERNUM: SETZM .IFNAM ;[1112] NOT SIMPLE RADIX50 NAME
|
||
TLNE CS,4 ;IS IT A NUMBER
|
||
JRST NUM32 ;YES
|
||
MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)
|
||
MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE
|
||
JRST GETDE1 ;GET DELIMITER
|
||
NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG
|
||
NUM: CALL GETCHR ;GET A CHARACTER
|
||
TLNN CS,4 ;NUMERIC?
|
||
JRST NUM10 ;NO
|
||
NUM1: SETOM .IFNUM ;[1056] FLAG NUMBER SEEN FOR .IF(N)
|
||
SUBI C,20 ;CONVERT TO OCTAL
|
||
PUSH P,C ;STACK FOR FLOATING POINT
|
||
SKIPE AC0 ;ARE WE ABOUT TO LOSE SOME DATA?
|
||
HRROS AC2 ;[1212] YES, WARN USER IF INTEGER
|
||
MOVE AC0,AC1
|
||
MUL AC0,CURADX ;[613]
|
||
ADD AC1,C ;ADD IN LAST VALUE
|
||
CAML C,CURADX ;[613] IS NUMBER LESS THAN CURRENT RADIX?
|
||
TLO FR,RADXSW ;NO, SET FLAG
|
||
AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES
|
||
|
||
NUM10: CAIE C,'.' ;PERIOD?
|
||
TLNE FR,DCFSW ;OR DECIMAL FRACTION?
|
||
JRST NUM30 ;YES, PROCESS FLOATING POINT
|
||
TLZE AC1,400000 ;[1212] DID THE ADD OVERFLOW?
|
||
AOS AC0 ;[1212] YES, CARRY INTO AC0
|
||
TLZN AC2,-1 ;[1212] WAS THERE AN OVERFLOW
|
||
TDNE AC0,[777777,,777776] ;[1212] OR MORE THAN 36 BITS?
|
||
TRO ER,ERRQ ;[1212] YES, WARN USER
|
||
SETZ CS, ;AND CLEAR IT
|
||
CAIN C,'K' ;SEE IF SUFFIX THERE
|
||
MOVEI CS,3
|
||
CAIN C,'M'
|
||
MOVEI CS,6
|
||
CAIN C,'G'
|
||
MOVEI CS,9
|
||
JUMPE CS,NUM12 ;NO SUFFIX?
|
||
NUM11: MOVE AC0,AC1 ;[1212] SCALE THE NUMBER
|
||
MUL AC0,CURADX ;[613]
|
||
TDNE AC0,[777777,,777776] ;[1212] MORE THAN 36 BITS?
|
||
TRO ER,ERRQ ;[1212] YES, WARN USER
|
||
SOJG CS,NUM11 ;[1212] REPEAT
|
||
CALL GETCHR ;SKIP THE SUFFIX
|
||
NUM12: MOVE CS,CSTAT(C) ;RESTORE STATUS
|
||
LSH AC1,1 ;NO, CLEAR THE SIGN BIT
|
||
LSHC AC0,^D35 ;AND SHIFT INTO AC0
|
||
MOVE P,PPTEMP ;RESTORE P
|
||
SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT
|
||
TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?
|
||
TRO ER,ERRN ;YES, FLAG N ERROR
|
||
JRST GETDE1
|
||
|
||
NUM30: HRRZS AC2 ;[1212] RESET POSSIBLE INTEGER OVERFLOW
|
||
CAIE C,'B' ;[1212] IF "B" THEN MISSING "."
|
||
NUM31: CALL GETCHR
|
||
TLNN CS,4 ;NUMERIC?
|
||
JRST NUM40 ;NO
|
||
NUM32: SUBI C,20
|
||
PUSH P,C
|
||
JRST NUM31
|
||
|
||
NUM40: PUSH P,CURADX ;[613] STACK VALUES
|
||
PUSH P,FR ;[640]
|
||
PUSH P,AC2
|
||
HRRI AC2,^D10 ;[613]
|
||
HRRZM AC2,CURADX ;[613]
|
||
PUSH P,PPTEMP
|
||
CAIE C,45 ;[1034] 'E'?
|
||
JRST [MOVEI AC0,0 ;[1034] NO, ZERO EXPONENT
|
||
JRST NUM41] ;[1034]
|
||
CALL PEEK ;[1034] YES, GET NEXT CHAR
|
||
PUSH P,C ;[1034] SAVE NEXT CHAR
|
||
CALL CELL ;[1034] GET EXPONENT
|
||
POP P,C ;[1034] RESTORE FIRST CHAR AFTER E
|
||
CAIE V,4 ;[1034] MUST HAVE NUMERIC STATUS
|
||
CAIN C,"<" ;[1034] ALLOW <EXP>
|
||
JRST NUM41 ;[1034]
|
||
SKIPN AC0 ;[1034] ERROR IF NON-ZERO EXPRESSION
|
||
TROA ER,ERRQ ;[1034] ALLOW E+,E-
|
||
SETOM RC ;[1034] FORCE NUMERICAL ERROR
|
||
NUM41: POP P,PPTEMP ;[1034] UNSTACK VALUES
|
||
POP P,SX
|
||
POP P,FR ;[640]
|
||
POP P,CURADX ;[613]
|
||
HRRZ V,P
|
||
MOVE P,PPTEMP
|
||
JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE
|
||
ADD SX,AC0
|
||
HRRZ ARG,P
|
||
ADD SX,ARG
|
||
SETZB AC0,AC2
|
||
TLNE FR,DCFSW
|
||
JRST NUM60
|
||
JOV NUM50 ;CLEAR OVERFLOW FLAG
|
||
|
||
NUM50: JSP SDEL,NUMUP ;FLOATING POINT
|
||
JRST NUM52 ;END OF WHOLE NUMBERS
|
||
FMPR AC0,[10.0] ;MULTIPLY BY 10
|
||
TLO AC1,233000 ;CONVERT TO FLOATING POINT
|
||
FADR AC0,AC1 ;ADD IT IN
|
||
JRST NUM50
|
||
|
||
NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION
|
||
FADR AC0,AC2
|
||
JOV NUMER1 ;TEST FOR OVERFLOW
|
||
JRST GETDE1
|
||
|
||
TLO AC1,233000
|
||
TRNE AC1,-1
|
||
FADR AC2,AC1 ;ACCUMULATE FRACTION
|
||
FDVR AC2,[10.0]
|
||
JRST NUM52
|
||
|
||
NUM60: JSP SDEL,NUMUP
|
||
JRST NUM62
|
||
IMULI AC0,^D10
|
||
ADD AC0,AC1
|
||
JRST NUM60
|
||
|
||
NUM62: LSHC AC1,-^D36
|
||
JSP SDEL,NUMDN
|
||
LSHC AC1,^D37
|
||
CALL BYPAS2
|
||
JRST GETDE3
|
||
|
||
DIVI AC1,^D10
|
||
JRST NUM62
|
||
|
||
NUMUP: MOVEI AC1,0
|
||
CAML ARG,SX
|
||
JRST 0(SDEL)
|
||
CAMGE ARG,V
|
||
MOVE AC1,1(ARG)
|
||
AOJA ARG,1(SDEL)
|
||
|
||
NUMDN: MOVEI AC1,0
|
||
CAMG V,SX
|
||
JRST 0(SDEL)
|
||
CAMLE V,ARG
|
||
MOVE AC1,0(V)
|
||
SOJA V,3(SDEL)
|
||
SUBTTL GETSYM
|
||
|
||
GETSYM: CALL BYPASS ;[664][572] SKIP LEADING BLANKS
|
||
GETSY0: MOVEI AC0,0 ;CLEAR AC0
|
||
MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1
|
||
TLNN CS,2 ;ALPHABETIC?
|
||
JRST GETSY1 ;NO, ERROR
|
||
CAIE C,16 ;PERIOD?
|
||
JRST GETSY2 ;NO, A VALID SYMBOL
|
||
IDPB C,AC1 ;STORE THE CHARACTER
|
||
CALL GETCHR ;YES, TEST NEXT CHARACTER
|
||
TLNN CS,2 ;ALPHABETIC?
|
||
GETSY1: TROA ER,ERRA
|
||
GETSY2: AOS 0(P) ;YES, SET SKIP EXIT
|
||
GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?
|
||
JRST GETSY4 ;NO
|
||
TLNE AC1,770000 ;YES, HAVE WE STORED SIX?
|
||
IDPB C,AC1 ;NO, STORE IT
|
||
CALL GETCHR
|
||
JRST GETSY3
|
||
|
||
CALL GETCHR ;TRY AGAIN FOR TERMINATOR
|
||
GETSY4: JUMPE C,.-1 ;BYPASS TRAILING TAB/SP
|
||
TLNE CS,6 ;ALPHANUMERIC?
|
||
TLO IO,IORPTC ;YES, PUT IT BACK
|
||
RET
|
||
SUBTTL EXPRESSION EVALUATOR
|
||
|
||
CV==AC0 ;CURRENT VALUE
|
||
PV==AC1 ;PREVIOUS VALUE
|
||
RC=RC ;CURRENT RELOCATABILITY
|
||
PR==AC2 ;PREVIOUS RELOCATABILITY
|
||
CS=CS ;CURRENT STATUS
|
||
PS==SDEL ;PREVIOUS STATUS
|
||
|
||
EVALHA: TLO FR,TMPSW
|
||
EVALCM: CALL EVALEX ;EVALUATE FIRST EXPRESSION
|
||
JUMPCM EVALC3 ;[625] JUMP IF COMMA
|
||
IFN POLISH,<
|
||
JUMPOC EVALC2 ;[625] SKIP FULL WORD TEST IF IN OP FIELD
|
||
JUMPL RC,EVALC2 ;[625] JUMP IF ALREADY POLISH
|
||
CAIE C,']' ;[1145] CURRENTLY AT END OF LITERAL?
|
||
CAIN C,EOL ;[1145] OR END OF LINE?
|
||
SKIPA ;[1145] YES - TRY FULLWORD FIXUP
|
||
JRST EVALC2 ;[1135] NO - MAY BE OPCODE, PROCESS IN OP
|
||
TLNN RC,-1 ;[1106] IS LEFT HALF ABSOLUTE
|
||
TRNN RC,-2 ;[1106] AND RIGHT HALF EXTERNAL
|
||
JRST EVALC2 ;[1106] NO, DON'T WANT FULLWORD
|
||
TLNE AC0,-1 ;[1106] IS LEFT HALF ABSOLUTE 0?
|
||
JRST EVALC2 ;[630] NO, JUMP
|
||
SKIPN INASGN ;[630] IF DOING EITHER ASSIGNMENT
|
||
SKIPE INANGL ;[630] OR IN ANGLE BRACKETS
|
||
JRST EVALC2 ;[630] JUMP
|
||
TRZN FRR,LTGSW ;[735] DON'T DO FWF IF GOT A TAG IN LIT
|
||
SKIPE INOPDF ;[637] IN OPDEF?
|
||
JRST EVALC2 ;[637] YES,
|
||
TLNN FR,INDSW ;[630] IF DOING INDIRECT OR
|
||
CAIN C,'(' ;[630] INDEXING
|
||
JRST EVALC2 ;[630] JUMP
|
||
TRNN FRR,NOPSW ;[1240] CHECK FOR POLISH NOT ALLOWED
|
||
TRNE FRR,PIDXSW ;[1104] IF DOING POLISH INDEXING
|
||
JRST EVALC2 ;[1104] JUMP
|
||
TRNE FRR,IDXSW ;[1107] DOING OP INDEXING?
|
||
JRST EVALC2 ;[1107] YES - JUMP
|
||
PUSH P,[POLFWF] ;[630] PASS ALL TESTS, MAKE IT FWF
|
||
POP P,POLTYP ;[625] INPOLTYP
|
||
CALL OCTFW ;[625] AS IF WE DID A EXP
|
||
SETZM POLTYP ;[630] CLEAR IT AFTERWARDS
|
||
EVALC2:
|
||
>
|
||
PUSH P,[0] ;MARK PDL
|
||
TLO IO,IORPTC ;IT'S NOT,SO REPEAT
|
||
JRST OP ;PROCESS IN OP
|
||
|
||
EVALC3: PUSH P,[0] ;[625] MARK PDL
|
||
IFN POLISH,<
|
||
TLNN FR,POLSW ;POLISH FIXUP SEEN?
|
||
JRST EVALC4 ;NO
|
||
SETOM POLTYP ;REST MUST BE RIGHT HALF
|
||
TRZ FRR,FWPSW ;[614]
|
||
TRO FRR,LHPSW ;[614]
|
||
SKIPN INASGN ;[1227] DOING ASSIGNMENT?
|
||
SKIPE INOPDF ;[1227] OR OPDEF?
|
||
JRST EVALC4 ;[1227] YES - NOTHING STORED YET
|
||
MOVNI AC2,2 ;CHANGE THIS TO LEFT HALF
|
||
MOVEM AC2,@LSTOPR
|
||
EVALC4:>
|
||
IFN FORMSW,<PUSH P,INFORM> ;PUT FORM WORD ON STACK
|
||
PUSH P,[0] ;STORE ZERO'S ON PDL
|
||
PUSH P,[0] ;.......
|
||
MOVSI AC2,(POINT 4,(P),12)
|
||
JRST OP1B ;PROCESS IN OP
|
||
|
||
EVALEX: ;[634]
|
||
IFN POLISH,<
|
||
TLNN FR,TMPSW ;UNLESS FIRST ATOM ALREADY READ,
|
||
TLZ FR,POLSW ;CLEAR EVALUATING POLISH FLAG
|
||
>
|
||
PUSH P,[TNODE,,0] ;MARK THE LIST 200000,,0
|
||
TLZN FR,TMPSW
|
||
EVATOM: CALL ATOM ;GET THE NEXT ATOM
|
||
JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO
|
||
TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?
|
||
JRST EVGETD ;[1217] YES, TREAT ACCORDINGLY
|
||
CALL SEARCH ;SEARCH FOR MACRO OR SYMBOL
|
||
JRST EVOP ;NOT FOUND, TRY FOR OP-CODE
|
||
JUMPGE ARG,EVAS1 ;JUMP IF HAVE OPERATOR
|
||
CAME AC0,1(SX) ;HAVE SYMBOL, OPERATOR ALSO DEFINED?
|
||
JRST [TLO IO,FLDSW ;[1234] NO, NOW IN ADDRESS FIELD
|
||
JRST EVAS2] ;[1234] USE WHAT WE HAVE
|
||
ADDI SX,2 ;CHECK OPERATOR FIRST
|
||
CALL SRCH5 ;LOAD REGISTERS
|
||
EVAS1: SKIPN MACPRF ;MACRO DEF PREFERRED?
|
||
JRST EVAS3 ;NO
|
||
TLNE ARG,MACF+SYNF ;MACRO OR SYN?
|
||
JRST [ TLO IO,FLDSW ;[634] YES, USE IT AND SET FLAG
|
||
JRST EVAS2] ;[634]
|
||
EVAS3: CAME AC0,-3(SX) ;NO, PROBABLY OPDEF. SYMBOL ALSO DEFINED?
|
||
JRST [ TLNE ARG,MACF+SYNF ;[1147] NO, USE WHAT WE HAVE
|
||
TLO IO,FLDSW ;[634][1147] AND SET FLAG FOR
|
||
JRST EVAS2] ;[634][1147] MACROS AND SYNS
|
||
SUBI SX,2 ;YES, SYMBOL BEFORE OPDEFS HERE
|
||
CALL SRCH5 ;LOAD REGISTERS
|
||
PUSH P,SX ;[1155] SAVE SX ON STACK
|
||
HRRZ SX,SGNCUR ;[1205] GET CURRENT PSECT NUMBER
|
||
CAMN SX,SGWFND ;[1155] SYMBOL FOUND IN CURRENT PSECT?
|
||
JRST EVAS3A ;[1155] YES, CONTINUE
|
||
TLNE ARG,LELF!RELF ;[1155] NO, RELOCATION BITS ON?
|
||
TLO IO,RSASSW ;[1155] YES, SET INTER-PSECT REF BIT
|
||
EVAS3A: POP P,SX ;[1155] RESTORE SX
|
||
EVAS2: SKIPE .IFFLG ;[1056] DOING .IF(N)?
|
||
IORM ARG,IFSRCH ;[1056] MERGE ARG BITS WITH PREVIOUS
|
||
CALL QSRCH ;CREF WHAT WE FOUND
|
||
IFN POLISH,<
|
||
JUMPL RC,[TRNN FRR,NOPSW ;[705] IF A FIXUP, FLAG IT UNLESS NOPSW
|
||
TLO FR,POLSW ;[705]
|
||
JRST .+1] ;[705]
|
||
>
|
||
JUMPG ARG,EVMAC ;BRANCH IF OPERATOR
|
||
MOVE AC0,V ;SYMBOL, SET VALUE
|
||
JRST EVTSTS ;TEST STATUS
|
||
|
||
EVMAC: TLNE FR,NEGSW ;UNARY MINUS?
|
||
JRST EVERRZ ;YES, INVALID BEFORE OPERATOR
|
||
LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF
|
||
SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS
|
||
SKIPE C ;[664] NON-BLANK?
|
||
TLO IO,IORPTC ;YES, REPEAT CHARACTER
|
||
SOJE SDEL,EVMAC1 ;MACRO IF 2
|
||
JUMPG SDEL,EVOPS ;SYNONYM IF 4
|
||
MOVE AC0,V ;OPDEF
|
||
MOVEI V,OP ;SET TRANSFER VECTOR
|
||
JRST EVOPD
|
||
|
||
EVMAC1: SKIPE .IFFLG ;[1056] DOING .IF(N)?
|
||
JRST EVGETD ;[1056] YES, DON'T ALLOW EXPANSION
|
||
SKIPL MACENL ;ALREADY IN CALLM?
|
||
JRST CALLM ;NO, EVALUATE MACRO
|
||
SETZB RC,AC0 ;ZERO VALUE
|
||
TRO ER,ERRA ;SET "A" ERROR
|
||
JRST EVGETD ;CONTINUE EVALUATION
|
||
|
||
EVOP: CALL OPTSCH ;SEARCH OP TABLE
|
||
JRST EVOPX ;NOT FOUND
|
||
TLNE FR,NEGSW ;OPCODE, UNARY MINUS?
|
||
JRST EVERRZ ;YES, ERROR
|
||
EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG
|
||
TRZE V,ADDF ;SYNONYM
|
||
JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS
|
||
HLLZ AC0,V
|
||
EVOPD: TRNE FRR,IDXSW ;[1200] ARE WE IN THE INDEX FIELD?
|
||
JRST EVOPD1 ;[1200] YES, SKIP THIS TEST
|
||
JUMPCM .+3 ;[1113] TERMINATED WITH COMMA OR
|
||
TLNN IO,FLDSW ;[1113] PART OF ADDRESS FIELD OR
|
||
EVOPD1: TLNE CS,(17B5) ;[1200] TERMINATED WITH OPERATOR? (+,-,ETC.)
|
||
JRST [ HRRZ AC1,V ;YES
|
||
CAIE AC1,OP ;REGULAR OP?
|
||
JRST .+1 ;NO, MUST EXECUTE IT
|
||
TLZ IO,IORPTC ;[1113] TERMINATOR HAS BEEN USED
|
||
JRST EVTSTS] ;YES, TREAT AS SYMBOL
|
||
TLO IO,FLDSW ;[1147] REST IS ADDRESS
|
||
SKIPE C ;NON-BLANK DELIMITER?
|
||
TLO IO,IORPTC ;YES, REPEAT CHARACTER
|
||
PUSH P,LOCA ;SAVE CURRENT LOCATION
|
||
PUSH P,STPX ;SAVE CURRENT CODE BUFFER STATE
|
||
PUSH P,STPY
|
||
MOVE AC1,STPX
|
||
MOVEM AC1,STPY
|
||
CALL 0(V) ;DO OP
|
||
MOVE AC2,STPX ;SEE HOW MANY WORDS GENERATED
|
||
SUB AC2,STPY
|
||
;AFTER EDIT 1035, THIS CHECK CAN PROBABLY BE REENABLED AS CAILE AC2,1.
|
||
; CAIE AC2,1 ;SHOULD BE ONE, BUT MANY PROGRAMS
|
||
; TRO ER,ERRQ ;USE <> TO TRUNCATE, E.G. ASCII
|
||
JUMPE AC2,[SETZ AC0, ;[1023] SKIP IF NOTHING WAS GENERATED
|
||
JRST .+3] ;[1023][1107]
|
||
CALL DSTOW ;AC0 = WORD OF CODE GENERATED
|
||
IFN POLISH,< ;[1220]
|
||
TLNN FR,P1 ;[1220] SKIP IF PASS 1
|
||
CALL DSTWRC ;[1220] FIX POLISH RELOCATION
|
||
>; END IFN POLISH ;[1220]
|
||
TLO FR,FSNSW ;[1107] SET FIELD SEEN FLAG
|
||
POP P,STPY ;RESTORE CODE BUFFER
|
||
POP P,STPX
|
||
POP P,LOCA ;RESTORE CURRENT LOCATION
|
||
TRNE RC,-2
|
||
HRRM RC,EXTPNT
|
||
TLNE RC,-2
|
||
HLLM RC,EXTPNT
|
||
JRST EVNUM
|
||
|
||
EVOPX: MOVSI ARG,SYMF!UNDF
|
||
CALL INSERZ
|
||
TLO IO,FLDSW ;[1234] DEFAULT TO ADDRESS FIELD
|
||
EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION
|
||
EVERRU: TRO ER,ERRU
|
||
JRST EVGETD
|
||
|
||
EVTSTS: TLNN ARG,UNDF ;[740]
|
||
JRST EVTST1 ;[740]
|
||
TLC ARG,LTAGF ;[740] IS IT A TAG IN LIT?
|
||
TLCE ARG,LTAGF ;[740]
|
||
TROA ER,ERRU ;[740] NO, UNDEFINED
|
||
JRST [ TRO FRR,LTGSW ;[740] YES, FLAG IT
|
||
JUMP1 EVGETD ;[740] TREAT AS UNDF ON PASS1
|
||
TLO ARG,TREF ;[740] FLAG IT REFERENCED
|
||
HLLM ARG,(SX) ;[740] UPDATE SYMBOL TABLE AS REF'ED
|
||
JRST EVTST1] ;[740]
|
||
JUMP1 EVGETD ;TREAT AS UNDF ON PASS1
|
||
EVTST1: TLNN ARG,EXTF ;[740]
|
||
JRST EVTSTR
|
||
HRRZ RC,ARG ;GET ADRES WFW
|
||
HRRZ ARG,EXTPNT ;SAVE IT WFW
|
||
HRRM RC,EXTPNT ;WFW
|
||
IFE POLISH,< ;NOT NEEDED SINCE POLISH WILL TAKE CARE OF EXTERNS
|
||
TRNE ARG,-1 ;WFW
|
||
TRO ER,ERRE
|
||
>
|
||
SETZB AC0,ARG
|
||
|
||
EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?
|
||
TRO ER,ERRD ;YES, FLAG IT
|
||
EVGETD: TLNN FR,NEGSW ;[1217] NEGATIVE ATOM?
|
||
JRST EVGETP ;NO
|
||
IFN POLISH,< JUMPN RC,NEGEXT> ;UNARY MINUS, JUMP IF NOT ABS
|
||
CALL GETDE2 ;NO, JUST NEGATE
|
||
EVGETP: TLNE IO,NUMSW ;[1217] NON BLANK FIELD
|
||
TLO FR,FSNSW ;YES,SET FLAG
|
||
CALL BYPAS2
|
||
TLNE CS,6 ;ALPHA-NUMERIC?
|
||
TLO IO,IORPTC ;YES, REPEAT IT
|
||
CAIN C,'^' ;IS THIS THE SPECIAL ESCAPE CHAR?
|
||
JRST EVUPAR ;YES, SEE WHAT FOLLOWS
|
||
|
||
EVUPAT: ;LABEL FOR RETURN FROM ^
|
||
IFN FTPSECT,< ;[575]
|
||
TLZN IO,RSASSW ;INTER-PSECT REFERENCE?
|
||
JRST EVNUM ;NO
|
||
PUSH P,SGWFND ;INX OF PSECT REFERRED TO
|
||
PUSH P,[-2] ;[613] DUMMY RELOCATION, DON'T USE -1
|
||
PUSH P,CSTATP> ;ADDITIVE PSECT OPERATION
|
||
EVNUM: POP P,PS ;POP THE PREVIOUS DELIMITER/TNODE
|
||
TLO PS,4000
|
||
IFN POLISH,<
|
||
TLC PS,110000 ;TEST FOR BITS 2 AND 5
|
||
TLCN PS,110000 ;BOTH ON - MEANS ADDITIVE
|
||
JRST EVXCT> ;PSECT OPERATION
|
||
CAMGE PS,CS ;OPERATION REQUIRED?
|
||
JRST EVPUSH ;NO, PUT VALUES BACK ON STACK
|
||
TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?
|
||
JRST EVXCT ;NO, EXECUTION REQUIRED
|
||
TLNE CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)
|
||
JRST EVPUSH ;NO,FALL INTO EVPUSH
|
||
IFN POLISH,<
|
||
TLNE FR,POLSW ;BEEN RESOLVING POLISH?
|
||
JUMPA POLPOP ;[1154][610] YES, OUTPUT IT IN PASS2
|
||
>
|
||
RET ;NO, EXIT
|
||
|
||
;HERE TO HANDLE "^!"
|
||
EVUPAR: SETZM UPARRO ;CLEAR ^ COUNTER ONCE IN A WHILE
|
||
CALL PEEK ;SEE WHAT CHARACTER AFTER ^ IS
|
||
SETZ CS, ;AND CHECK FOR ! AFTER IT
|
||
CAIN C,"!" ;IS IT ! FOR ^!
|
||
SKIPA CS,CSTATX ;YES, GET SPECIAL POINTER
|
||
JRST EVUPAN ;NOT ^!
|
||
TLZ IO,IORPTC ;CLEAR REREAD
|
||
JUMPE MRP,EVUPA1 ;[1157] IF IN A MACRO
|
||
PUSH P,CS ;[1157] SAVE CS ON THE STACK
|
||
CALL MREAD ;BETTER DO THIS
|
||
POP P,CS ;[1157] RESTORE CS
|
||
EVUPA1: SUBI C,40 ;[1157] YES, CHANGE TO SIXBIT
|
||
JRST EVNUM ;AND EVALUATE
|
||
|
||
EVUPAN: CAIN C,"-" ;WAS IT ^-
|
||
TRO ER,ERRQ ;GIVE A Q ERROR IF ^- IS USED AS BINARY OPTR
|
||
MOVEI C,'^' ;RESTORE C
|
||
MOVE CS,CSTAT(C) ;AND CS
|
||
SETOM UPARRO ;SET FLAG FOR CELL1 TO RE-EAT ^
|
||
JRST EVUPAT ;AND CONTINUE FROM ^
|
||
|
||
EVPUSH: ;[1225]
|
||
IFN POLISH,< ;[1225]
|
||
TLNE FR,POLSW ;[1225] GONE POLISH?
|
||
CALL MOVSTK ;[1225] PROTECT TEMP POLISH STACK
|
||
>; END IFN POLISH ;[1225]
|
||
PUSH P,PS ;[1225] STACK VALUES
|
||
PUSH P,CV
|
||
PUSH P,RC
|
||
PUSH P,CS
|
||
JRST EVATOM ;GET NEXT ATOM
|
||
|
||
EVXCT: POP P,PR ;POP PREVIOUS RELOCATABILITY
|
||
POP P,PV ;AND PREVIOUS VALUE
|
||
LDB PS,[POINT 4,PS,29] ;TYPE OF OPERATION TO PS
|
||
IFE POLISH,<
|
||
XCT EVTAB(PS) ;PERFORM PROPER OPERATION
|
||
JUMPN RC,.+2 ;COMMON RELOCATION TEST
|
||
EVXCT1: JUMPE PR,EVNUM
|
||
TRO ER,ERRR ;BOTH MUST BE FIXED
|
||
JRST EVNUM ;GO TRY AGAIN
|
||
|
||
EVTAB: JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN
|
||
JRST XMUL ;1;
|
||
JRST XDIV ;2;
|
||
JRST XADD ;3;
|
||
JRST XSUB ;4;
|
||
JRST XLRW ;5; "_"
|
||
IOR CV,PV ;6; MERGE PV INTO CV
|
||
AND CV,PV ;7; AND PV INTO CV
|
||
XOR CV,PV ;10; XOR PV INTO CV
|
||
SETCM CV,CV ;11; NOT (ONE'S COMPLIMENT)
|
||
REPEAT 6,<CALL EVXERR> ;12-17; JUST IN CASE
|
||
>
|
||
IFN POLISH,<
|
||
TRNE FRR,NOPSW ;[603] WANT POLISH?
|
||
JRST EVXCT1 ;[603] NO,
|
||
CAILE PS,11 ;OPS 12 AND 13
|
||
JRST POLPSH ; REQUIRE POLISH FIXUPS
|
||
TDNN RC,[777700,,777700] ;CHECK FOR EXTERNALS IN EITHER
|
||
TDNE PR,[777700,,777700] ;OPERAND -- .LE. 100 ALLOWED
|
||
JRST [ SKIPN UWVER ;[603] WRITING UNV FILE?
|
||
JRST POLPSH ;[603] NO,
|
||
BITON UPOL,UWVER ;[603] YES, SET FLAG FIRST
|
||
JRST POLPSH] ;[603]
|
||
XCT PRTAB(PS) ;TEST PREVIOUS RELOCATION
|
||
JUMPN RC,POLPSH ;GO POLISH IF BOTH OPERANDS RELOC'L
|
||
|
||
EVXCT1: JFCL 17,.+1 ;CLEAR OVERFLOW FOR * AND /
|
||
XCT EVTAB(PS) ;PERFORM PROPER OPERATION
|
||
SKIPL OKOVFL ;OVERFLOW OK?
|
||
JOV .+2 ;SKIP IF * OR / OVERFLOWED
|
||
SKIPA ;IT'S OK
|
||
TRO ER,ERRN ;SET N ERROR FOR OVERFLOW
|
||
JRST EVNUM ;GO TRY AGAIN
|
||
|
||
EVTAB: JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN
|
||
IMULM PV,CV ;1; MUL
|
||
IDIVM PV,CV ;2; DIV
|
||
JRST XADD ;3;
|
||
JRST XSUB ;4;
|
||
CALL XLRW ;5; "_"
|
||
IOR CV,PV ;6; MERGE PV INTO CV
|
||
AND CV,PV ;7; AND PV INTO CV
|
||
XOR CV,PV ;10; XOR PV INTO CV
|
||
SETCM CV,CV ;11; NOT (ONE'S COMPLIMENT)
|
||
MOVN CV,CV ;12; NEGATE (TWO'S COMPLEMENT)
|
||
JFCL ;13; ADDITIVE PSECT OPERATION
|
||
REPEAT 4,<CALL EVXERR> ;14-17; JUST IN CASE
|
||
|
||
EVXCTP: XCT EVPTAB(PS) ;[1222] MARK PASS1 POLISH RELOCATIONS
|
||
JRST EVXCT1 ;[1222] OR CONTINUE WITH NORMAL OPERATION
|
||
EVPTAB: ;[1222]
|
||
REPEAT 3,< JFCL ;[1222] 0-2;>
|
||
JRST XPADD ;[1222] 3; ADD
|
||
JRST XPSUB ;[1222] 4; SUB
|
||
REPEAT 5,<JFCL ;[1222] 5-11;>
|
||
JRST XPSET ;[1222] 12; NEGATE
|
||
JFCL ;[1222] 13; ADDITIVE PSECT OPERATION
|
||
REPEAT 4,<JFCL ;[1222] 14-17;>
|
||
|
||
XPADD: JUMPE RC,EVXCT1 ;[1222] CURR RELOC ABS - ADD OK
|
||
JUMPE PR,EVXCT1 ;[1222] PREV RELOC ABS - ADD OK
|
||
TRNE RC,-1 ;[1222] CURR RELOC ?,,ABS
|
||
JRST XPADD1 ;[1222] NO - CHECK OTHERS
|
||
TLNN PR,-1 ;[1222] AND PREV RELOC ABS,,?
|
||
JRST EVXCT1 ;[1222] YES - ADDITIVE OK
|
||
XPADD1: TLNE RC,-1 ;[1222] CURR RELOC ABS,,?
|
||
JRST XPSET ;[1222] NO - POLISH
|
||
TRNN PR,-1 ;[1222] AND PREV RELOC ?,,ABS
|
||
JRST EVXCT1 ;[1222] YES - ADDITIVE OK
|
||
JRST XPSET ;[1222] GO POLISH
|
||
XPSUB: JUMPE RC,EVXCT1 ;[1222] CURR RELOC ABS - SUB OK
|
||
CAIE RC,1 ;[1222] CURR RELOC ABS,,REL
|
||
JRST XPSUB1 ;[1222] NO - CHECK MORE
|
||
CAIN RC,(PR) ;[1222] AND PREV RELOC ?,,REL
|
||
JRST EVXCT1 ;[1222] YES - SUBTRACTIVE OK
|
||
XPSUB1: MOVSS RC ;[1222] FLIP CURR RELOC
|
||
MOVSS PR ;[1222] FLOP PREV RELOC
|
||
CAIE RC,1 ;[1222] CURR RELOC REL,,ABS
|
||
JRST XPSUB2 ;[1222] NO - CHECK OTHER
|
||
CAIN RC,(PR) ;[1222] AND PREV RELOC REL,,?
|
||
MOVSS RC ;[1222] YES - FLIP BACK CURR RELOC
|
||
MOVSS PR ;[1222] AND PREV RELOC
|
||
JRST EVXCT1 ;[1222] SUBTRACTIVE OK
|
||
XPSUB2: CAME RC,[1,,1] ;[1233] CURR RELOC REL,,REL
|
||
JRST XPSET ;[1222] NO - POLISH
|
||
CAMN RC,PR ;[1222] AND PREV RELOC REL,,REL
|
||
JRST EVXCT1 ;[1222] YES - SUBTRACTIVE OK
|
||
XPSET: SETZB CV,PV ;[1222] PASS 1 POLISH - VALUES WORTHLESS
|
||
SETZ PR, ;[1222] AS IS PREV RELOC
|
||
MOVEI RC,377777 ;[1222] IMPOSSIBLE CURRENT RELOC
|
||
HRRM RC,EXTPNT ;[1222] AND EXTERNAL VALUES
|
||
JRST EVNUM ;[1222]
|
||
|
||
NEGEXT: MOVSI PS,4000 ;FAKE UP EVPUSH OF
|
||
ADDM PS,(P) ; PS
|
||
PUSH P,[0] ; CV
|
||
PUSH P,[0] ; RC
|
||
PUSH P,CSTATM ; CS
|
||
TLZ FR,NEGSW ;CLEAR FLAG
|
||
JRST EVGETD ;NOW EVALUATE
|
||
|
||
PRTAB: JFCL ;0
|
||
JRST CHKPR ;1 MUL
|
||
JRST CHKPRD ;2 DIV
|
||
JRST CHKADD ;[1044] 3 ADD
|
||
JUMPN PR,CHKSUB ;[734] 4 SUB
|
||
JRST CHKPRD ;5 SHIFT
|
||
JRST CHKIOR ;6 IOR
|
||
JUMPN PR,POLPSH ;[662] 7 AND
|
||
JUMPN PR,POLPSH ;[662] 10 XOR
|
||
JFCL ;[662] 11 NOT
|
||
|
||
;CHECK RELOCATION WHERE SECOND OPERAND MUST BE ABSOLUTE
|
||
CHKPRD: JUMPN RC,POLPSH ;GO POLISH IF SECOND ARG NOT ABSOLUTE
|
||
|
||
;CHECK RELOCATION FOR MULTIPLICATIVE OPERATORS
|
||
CHKPR: SKIPN PR ;FIRST OPERAND RELOCATABLE?
|
||
JRST [ JUMPE RC,EVXCT1 ;NO, JUMP IF SECOND ALSO NOT RELOC
|
||
PUSH P,PV ;SAVE VALUES
|
||
PUSH P,CV
|
||
SETZ CV, ;CONSTRUCT EQUIVALENT RELOCATABLE VALUE
|
||
TRNE RC,-1 ;RH?
|
||
HRRI CV,-1 ;YES
|
||
TLNE RC,-1 ;LH?
|
||
HRLI CV,-1 ;YES
|
||
JRST CHKPR2] ;DO OPERATION AND TEST RESULTS
|
||
JUMPN RC,POLPSH ;POLISH REQUIRED IF BOTH RELOCATABLE
|
||
PUSH P,PV ;SAVE VALUES
|
||
PUSH P,CV
|
||
SETZ PV, ;CONSTRUCT EQUIVALENT RELOCATABLE VALUE
|
||
TRNE PR,-1 ;RH?
|
||
HRRI PV,-1 ;YES
|
||
TLNE PR,-1 ;LH?
|
||
HRLI PV,-1 ;YES
|
||
CHKPR2: XCT EVTAB(PS) ;DO OPERATION ON RELOCATION EQUIVALENT
|
||
SETO RC, ;FIGURE OUT WHAT HAPPENED...
|
||
TLCN CV,-1 ;LH 0?
|
||
HRLI RC,0 ;YES
|
||
TLCN CV,-1 ;LH 1?
|
||
HRLI RC,1 ;YES
|
||
TRCN CV,-1 ;RH 0?
|
||
HRRI RC,0 ;YES
|
||
TRCN CV,-1 ;RH 1?
|
||
HRRI RC,1 ;YES
|
||
POP P,CV ;RECOVER VALUES
|
||
POP P,PV
|
||
TDNN RC,[-2,,-2] ;RELOC COUNTS OTHER THAN 0 OR 1?
|
||
JRST EVXCT1 ;ALL IS WELL, DO OPERATION
|
||
SETZ RC, ;YES, GO POLISH
|
||
JRST POLPSH
|
||
|
||
;CHECK RELOCATION FOR IOR
|
||
CHKIOR: TDNE RC,PR ;ANY HALFWORDS IN COMMON?
|
||
JRST POLPSH ;YES, GO POLISH
|
||
|
||
;CHECK EACH HALFWORD AGAINST THE RELOCATION COUNT IN THAT HALFWORD
|
||
;FOR THE OTHER OPERAND
|
||
DEFINE TST (OP,RR,VV)<
|
||
OP RR,-1 ;;RELOCATION NON-0?
|
||
JRST [ OP VV,-1 ;;YES, VALUE NON-0?
|
||
JRST POLPSH ;;YES, GO POLISH
|
||
JRST .+1]> ;;NO, CONTINUE
|
||
|
||
TST TRNE,RC,PV
|
||
TST TLNE,RC,PV
|
||
TST TRNE,PR,CV
|
||
TST TLNE,PR,CV
|
||
IOR RC,PR ;[710] GET RELOCATION
|
||
JRST EVXCT1 ;PASSED ALL TESTS, DO OPERATION
|
||
|
||
XLRW: EXCH PV,CV
|
||
LSH CV,0(PV)
|
||
RET
|
||
|
||
;HERE TO SEE IF POLISH IS REQUIRED FOR PROPER LOAD-TIME
|
||
;RELOCATION OF REL+ABS,REL+REL OR ABS+REL
|
||
|
||
CHKADD: JUMPN PR,[ JUMPN RC,POLPSH ;[1103] REL+REL - GOES POLISH
|
||
CALL CHKAD0 ;[1103] REL+ABS - POLISH NEEDED?
|
||
JRST EVXCT1 ;[1103] NO
|
||
JRST POLPSH] ;[1103] YES
|
||
JUMPE RC,EVXCT1 ;[1103] ABS+ABS - NO POLISH
|
||
EXCH PV,CV ;[1103] ABS+REL SWAP VALUES
|
||
EXCH PR,RC ;[1103] AND RELOCATIONS
|
||
CALL CHKAD0 ;[1103] REL+ABS - POLISH NEEDED?
|
||
JRST [ EXCH PV,CV ;[1103] NO - SWAP BACK VALUES
|
||
EXCH PR,RC ;[1103] RELOCATIONS...
|
||
JRST EVXCT1] ;[1103] NO POLISH
|
||
EXCH PV,CV ;[1103] POLISH - SWAP BACK VALUES
|
||
EXCH PR,RC ;[1103] RELOCATIONS...
|
||
JRST POLPSH ;[1103] GO POLISH
|
||
|
||
;[1103] ROUTINE TO SEE IF REL+ABS REQUIRES POLISH
|
||
;[1103] EXPECTS VALUE OF REL IN PV, VALUE OF ABS IN CV
|
||
;[1103] RETURNS +1 FOR NO POLISH, +2 FOR POLISH REQUIRED
|
||
|
||
CHKAD0: JUMPL CV,[ MOVNS CV ;[1103] NEGATIVE ABS, NEGATE
|
||
CALL CHKSB1 ;[1103] AND SEE IF REL-ABS NEEDS POLISH
|
||
SKIPA ;[1103] NO
|
||
AOS (P) ;[1103] YES - SKIP RETURN
|
||
MOVNS CV ;[1103] RESTORE ABS
|
||
RET] ;[1103]
|
||
|
||
;[1103] CHECKS REL+ABS, ENTRY FOR REL-(-ABS)
|
||
CHKAD1: SKIPN HMIN ;[1103] TWOSEG PROG?
|
||
RET ;[1103] NO - FORGET POLISH
|
||
TLNE PR,1 ;[1111] YES - IS REL IN LH?
|
||
JRST CPOPJ1 ;[1111] YES - GO POLISH TO BE SURE
|
||
JUMPGE PV,.+3 ;[1111] DOES REL APPEAR TO BE NEGATIVE
|
||
CAMLE PV,[-1,,0] ;[1111] IN RANGE -1 TO -262143
|
||
JRST CPOPJ1 ;[1111] YES - GO POLISH TO BE SURE
|
||
CALL SRHMIN ;[1111] SETUP HMIN-400 BOUND
|
||
PUSH P,PV ;[1103] SAVE REL VALUE
|
||
PUSH P,CV ;[1103] AND ABS VALUE
|
||
HRRZS PV ;[1103] GUARANTEE ONLY RH REL
|
||
HRRZS CV ;[1103] ONLY RH ABS IS USEFUL
|
||
CAMGE PV,RLHMIN ;[1111] IS REL HISEG OR LOWSEG?
|
||
JRST [ ADD PV,CV ;[1111] LOW - NEED POLISH WHEN REL+ABS
|
||
CAMGE PV,RLHMIN ;[1111] IS .GE. HISEG ORIGIN-400
|
||
JRST CHKAD3 ;[1103] FORGET POLISH
|
||
JRST CHKAD2] ;[1103] POLISH NEEDED
|
||
ADD PV,CV ;[1103] HISEG - NEED POLISH
|
||
TLNE PV,1 ;[1103] WHEN REL+ABS .GT. 777777
|
||
CHKAD2: AOS -2(P) ;[1103] POLISH - SKIP RETURN
|
||
CHKAD3: POP P,CV ;[1103] RESTORE ABS
|
||
POP P,PV ;[1103] AND REL
|
||
RET ;[1103]
|
||
|
||
;[1103] HERE TO SEE IF POLISH IS REQUIRED FOR PROPER LOAD-TIME
|
||
;[1103] RELOCATION OF REL-ABS
|
||
|
||
CHKSUB: JUMPN RC,CHKSB4 ;[1103] REL-REL - SPECIAL CHECKS
|
||
JUMPGE CV,[ CALL CHKSB1 ;[1103] REL-(+ABS) - NEED POLISH?
|
||
JRST EVXCT1 ;[1103] NO
|
||
JRST POLPSH] ;[1103] YES
|
||
MOVNS CV ;[1103] -ABS, NEGATE
|
||
CALL CHKAD1 ;[1103] SEE IF REL+ABS NEEDS POLISH
|
||
JRST [ MOVNS CV ;[1103] NO - RESTORE ABS
|
||
JRST EVXCT1] ;[1103] FORGET POLISH
|
||
MOVNS CV ;[1103] POLISH - RESTORE ABS
|
||
JRST POLPSH ;[1103] GO POLISH
|
||
|
||
;[1103] ROUTINE TO SEE IF REL-ABS REQUIRES POLISH
|
||
;[1103] EXPECTS VALUE OF REL IN PV, VALUE OF ABS IN CV
|
||
;[1103] RETURNS +1 FOR NO POLISH, +2 FOR POLISH REQUIRED
|
||
|
||
CHKSB1: SKIPN HMIN ;[1103] TWOSEG PROG?
|
||
JRST [ SKIPN HISNSW ;[1103] NO - HISEG OR
|
||
SKIPE SGNMAX ;[1103] PSECT PROG
|
||
JRST .+1 ;[1103] YES - CHECK FURTHER
|
||
RET] ;[1103] NO - FORGET POLISH
|
||
TLNE PR,1 ;[1111] IS REL IN LH?
|
||
JRST CPOPJ1 ;[1111] YES - GO POLISH TO BE SURE
|
||
JUMPGE PV,.+3 ;[1111] DOES REL APPEAR TO BE NEGATIVE
|
||
CAMLE PV,[-1,,0] ;[1111] IN RANGE -1 TO -262143
|
||
JRST CPOPJ1 ;[1111] YES - GO POLISH TO BE SURE
|
||
CALL SRHMIN ;[1111] SETUP HMIN-400 BOUND
|
||
PUSH P,PV ;[1103] SAVE REL
|
||
HRRZS PV ;[1103] ASSURE ONLY RH REL
|
||
SKIPE HMIN ;[1103] TWOSEG PROG?
|
||
CAMGE PV,RLHMIN ;[1111] YES - HISEG OR LOWSEG?
|
||
JRST [ SKIPN HISNSW ;[1103] LOWSEG, OR NOT TWOSEG, IS
|
||
SKIPE SGNMAX ;[1103] IT A HISEG OR PSECT PROG?
|
||
CAMGE PV,CV ;[1103] YES - IS REL .GE. ABS
|
||
AOS -1(P) ;[1103] NO - NEED POLISH SKIP RETURN
|
||
POP P,PV ;[1103] RESTORE REL
|
||
RET] ;[1103]
|
||
SUB PV,CV ;[1111] HISEG - NEED POLISH WHEN REL-ABS
|
||
CAMGE PV,RLHMIN ;[1111] IS .LT. HISEG ORIGIN-400
|
||
AOS -1(P) ;[1103] YES - POLISH NEEDED
|
||
POP P,PV ;[1103] RESTORE REL
|
||
RET ;[1103]
|
||
|
||
;[1103] ROUTINE TO SEE IF REL-REL REQUIRES POLISH
|
||
|
||
CHKSB4: SKIPN HMIN ;[1103] TWOSEG PROG?
|
||
JRST EVXCT1 ;[1103] NO - FORGET POLISH
|
||
TLNN PR,1 ;[1103] DOES EITHER REL APPEAR IN THE
|
||
TLNE RC,1 ;[1103] LH, OR AS LH,,RH?
|
||
JRST POLPSH ;[1103] YES - GO POLISH TO BE SURE
|
||
JUMPGE PV,.+3 ;[1111] DOES REL APPEAR TO BE NEGATIVE
|
||
CAMLE PV,[-1,,0] ;[1111] IN RANGE -1 TO -262143
|
||
JRST POLPSH ;[1111] YES - GO POLISH TO BE SURE
|
||
JUMPGE CV,.+3 ;[1111] DOES REL APPEAR NEG.
|
||
CAMLE CV,[-1,,0] ;[1111] RANGE -1 TO -262143
|
||
JRST POLPSH ;[1111] YES - GO POLISH
|
||
CALL SRHMIN ;[1111] SETUP HMIN-400 BOUND
|
||
PUSH P,PV ;[1103] SAVE BOTH RELS
|
||
PUSH P,CV ;[1103] ...
|
||
HRRZS PV ;[1103] GUARANTEE RH ONLY
|
||
HRRZS CV ;[1103] ...
|
||
CAMGE PV,RLHMIN ;[1111] IS FIRST REL HISEG OR LOWSEG?
|
||
JRST [ CAMGE CV,RLHMIN ;[1111] ARE BOTH RELS IN LOWSEG?
|
||
JRST CHKSB5 ;[1103] YES - FORGET POLISH
|
||
JRST CHKSB6] ;[1103] NO - POLISH NEEDED
|
||
CAML CV,RLHMIN ;[1111] ARE BOTH RELS IN HISEG?
|
||
CHKSB5: JRST [ POP P,CV ;[1103] BOTH RELS IN SAME SEGMENT
|
||
POP P,PV ;[1103] RESTORE RELS
|
||
JRST EVXCT1] ;[1103] FORGET POLISH
|
||
CHKSB6: POP P,CV ;[1103] RELS IN DIFFERENT SEGMENTS
|
||
POP P,PV ;[1103] RESTORE RELS
|
||
JRST POLPSH ;[1103] GO POLISH
|
||
|
||
;[1111] ROUTINE TO SETUP HMIN-400 PRIOR TO CHECKING REL+ABS, REL-ABS,
|
||
;[1111] AND REL-REL TO SEE IF POLISH IS NEEDED
|
||
SRHMIN: PUSH P,CV ;[1111] SAVE AC
|
||
MOVE CV,HMIN ;[1111] GET HI SEG ORIGIN
|
||
SUBI CV,400 ;[1111] REDUCE TO LOWEST BOUND
|
||
MOVEM CV,RLHMIN ;[1111] SAVE FOR COMPARES
|
||
POP P,CV ;[1111] RESTORE
|
||
RET ;[1111]
|
||
>
|
||
|
||
;HERE IF THERE IS PROBLEM WITH EXPRESSION PARSING AND EVALUATION
|
||
;GETTING ILLEGAL OPERATORS
|
||
EVXERR: PUSH P,['MCREPP'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT/ EXPRESSION PARSING PROBLEM@/] ;[1066]
|
||
JRST ERRNE4 ;[702] GIVE FATAL ERROR, CONTINUE
|
||
|
||
XSUB: SUBM PV,CV
|
||
SUBM PR,RC
|
||
JRST EVNUM
|
||
|
||
XADD: ADDM PV,CV
|
||
ADDM PR,RC
|
||
JRST EVNUM
|
||
|
||
IFE POLISH,<
|
||
XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY
|
||
JFCL 17,.+1 ;CLEAR OVERFLOW
|
||
IDIVM PV,CV
|
||
SKIPL OKOVFL ;SKIP IF OVERFLOW OK
|
||
JOV .+2 ;SEE IF OVERFLOWED
|
||
SKIPA ;NO
|
||
TRO ER,ERRN ;YES, SET N ERROR
|
||
XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR
|
||
JRST EVXCT1
|
||
|
||
XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND
|
||
JUMPE RC,XMUL1 ;MUST BE FIXED
|
||
TRO ER,ERRR
|
||
XMUL1: IORM PR,RC ;GET RELOCATION TO RC
|
||
CAMGE PV,CV ;FIND THE GREATER
|
||
EXCH PV,CV ;FIX IN CASE CV=0,OR 1
|
||
IMULM PV,RC
|
||
JFCL 17,.+1 ;CLEAR OVERFLOW
|
||
IMULM PV,CV
|
||
SKIPL OKOVFL ;SKIP IF OVERFLOW OK
|
||
JOV .+2 ;SEE IF OVERFLOW
|
||
SKIPA ;NO
|
||
TRO ER,ERRN ;YES, SET N ERROR
|
||
JRST EVNUM
|
||
|
||
XLRW: EXCH PV,CV
|
||
LSH CV,0(PV)
|
||
LSH PR,0(PV)
|
||
JRST XDIV1
|
||
>
|
||
|
||
;HERE FOR EXTERNAL ARITHMETIC
|
||
;CONVERS TO POLISH BLOCK TYPE 11
|
||
IFN POLISH,<
|
||
POLPSH: JUMP1 [SKIPE LITLVL ;ONLY SAVE POLISH ON PASS2
|
||
TRO ER,ERRF ;SET FAKE FLAG IF IN LITERAL
|
||
JRST EVXCTP] ;[1222] NO POLISH
|
||
SKIPE INBYTE ;[762] DOING BYTE?
|
||
JRST [ TRO ER,ERRE ;[762] YES,
|
||
JRST EVXCT1] ;[762] CAN'T HANDLE POLISH
|
||
TRNE FRR,LTGSW ;[735] DOING POLISH WITH LIT-TAG?
|
||
TRO ER,ERRA ;[735] YES, A-ERROR
|
||
TLO FR,POLSW ;SIGNAL STORING POLISH
|
||
CAMN PR,[-1] ;DO WE HAVE A -1 RELOCATION?
|
||
CALL POLPPR ;YES,
|
||
CAMN RC,[-1] ;HOW ABOUT THE OTHER OPERAND?
|
||
CALL POLPRC ;YES,
|
||
JUMPL PR,[CAMN PR,[-2] ;[1040] PREVIOUS VALUE WAS A POLISH?
|
||
JRST .+1 ;[1040] NO INTER-PSECT DUMMY RELOCATION
|
||
PUSH P,RC ;[1040] YES, MOVE PV & PR INTO CV AND RC
|
||
PUSH P,CV ;[1040] FOR MOVING THE ENBEDDED POLISH
|
||
MOVE RC,PR ;[1040] INTO FREE SPACE
|
||
MOVE CV,PV ;[1040] VIA MOVSTK
|
||
CALL MOVSTK ;[1040]
|
||
MOVE PR,RC ;[1040] THE NEW RC INTO FREE SPACE
|
||
MOVE PV,RC ;[1040] BECOMES PR & PV
|
||
POP P,CV ;[1040] RESTORE REAL CV & RC
|
||
POP P,RC ;[1040]
|
||
JRST .+1] ;[1040]
|
||
JUMPL RC,[CAMN RC,[-2] ;[1040]
|
||
JRST .+1 ;[1040]
|
||
CALL MOVSTK ;[1040]
|
||
JRST .+1] ;[1040]
|
||
SKIPE SGNMAX ;[1101] IF NO PSECTS
|
||
CAMN PR,[-2] ;[1101] OR DOING SIMPLE INTER-PSECT REF
|
||
JRST POLPS2 ;[1101] SKIP RELOCATABLE CHECKS
|
||
TDNN PR,[-2,,-2] ;[1101] IF PREVIOUS IS EXTERNAL
|
||
SKIPN PR ;[1101] OR NOT RELOCATABLE
|
||
JRST POLPS1 ;[1101] GO CHECK CURRENT
|
||
PUSH P,CV ;[1101] PREVIOUS IS RELOCATABLE, SAVE ACS
|
||
PUSH P,RC ;[1101] .....
|
||
MOVE CV,PV ;[1101] MAKE PREVIOUS CURRENT
|
||
MOVE RC,PR ;[1101] ....
|
||
CALL POLROR ;[1101] CREATE POLISH WITH PSECT OF ORIGIN
|
||
MOVE PV,CV ;[1101] STORE NEW PREVIOUS
|
||
MOVE PR,RC ;[1101] ....
|
||
POP P,RC ;[1101] RESTORE CURRENT
|
||
POP P,CV ;[1101] ....
|
||
POLPS1: TDNN RC,[-2,,-2] ;[1101] IF CURRENT IS EXTERNAL
|
||
SKIPN RC ;[1101] OR NOT RELOCATABLE
|
||
SKIPA ;[1101] CONTINUE WITH POLISH GENERATION
|
||
CALL POLROR ;[1101] ELSE CREATE POLISH WITH PSECT OF ORIGIN
|
||
POLPS2: ;[1101]
|
||
PUSH P,POLSTK ;[1040] SAVE STACK POINTER
|
||
EXCH P,POLSTK ;[1040] SAVE P AND SET UP POLISH STACK
|
||
PUSH P,POLTBL-1(PS) ;STACK OPERATOR
|
||
PUSH P,PR ;STACK PREVIOUS RELOCATION
|
||
PUSH P,PV ;AND VALUE
|
||
PUSH P,RC ;STACK CURRENT
|
||
PUSH P,CV
|
||
EXCH P,POLSTK ;GET P BACK
|
||
POP P,CV ;USE STACK POINTER FOR VALUE
|
||
MOVE RC,CV ;AND RELOCATION (ENSURES EXTERNAL)
|
||
CAILE PS,11 ;[1101] WAS THIS A FORCED POLISH OPERATION?
|
||
CALL MOVSTK ;[1101] YES - MOVE POLISH TO SAFE PLACE
|
||
JRST EVNUM
|
||
|
||
POLPPR: CAIE PS,3 ;DOING +?
|
||
JRST [ CAIN PS,4 ;NO, DOING -?
|
||
MOVEI PS,3 ;YES, MAKE IT +
|
||
JRST .+2] ;GO NEGATE THE VALUE
|
||
MOVEI PS,4 ;ITS +, MAKE IT -
|
||
MOVEI PR,1 ;MAKE RELOCATION 1
|
||
MOVNS PV,PV ;NEGATE VALUE
|
||
RET
|
||
|
||
POLPRC: CAIE PS,3 ;DOING +?
|
||
JRST [ CAIN PS,4 ;NO, DOING -?
|
||
MOVEI PS,3 ;YES, MAKE IT +
|
||
JRST .+2] ;GO NEGATE THE VALUE
|
||
MOVEI PS,4 ;ITS +, MAKE IT -
|
||
MOVEI RC,1 ;MAKE RELOCATION 1
|
||
MOVNS CV,CV ;NEGATE VALUE
|
||
RET
|
||
|
||
|
||
;[1101] HERE TO CREATE A POLISH BLOCK FOR THE CURRENT RELOCATABLE ATOM
|
||
;[1101] CONTAINING ITS PSECT OF ORIGIN - IN CASE THIS RELOCATABLE IS EVER
|
||
;[1101] IMBEDDED WITHIN POLISH DURING AN INTER-PSECT REFERENCE.
|
||
POLROR: PUSH P,POLSTK ;[1101] SAVE STACK POINTER
|
||
EXCH P,POLSTK ;[1101] SETUP POLISH STACK, SAVE P
|
||
PUSH P,[15] ;[1101] OPERATOR IS PSECT OPERATOR
|
||
PUSH P,[-2] ;[1101] INTER-PSECT DUMMY RELOC
|
||
PUSH P,SGNCUR ;[1101] PSECT OF ORIGIN
|
||
PUSH P,RC ;[1101] CURRENT RELOC
|
||
PUSH P,CV ;[1101] AND VALUE
|
||
EXCH P,POLSTK ;[1101] RESTORE P, SAVE POLISH STACK PTR
|
||
POP P,RC ;[1101] NEW RELOC - POLISH
|
||
CALL MOVSTK ;[1101] PUT POLISH BLOCK IN SAFE PLACE
|
||
MOVE CV,RC ;[1101] USE STACK POINTER FOR VALUE
|
||
RET ;[1101]
|
||
|
||
;TRY NEXT ITEM
|
||
;HERE TO STORE THE POLISH LIST
|
||
;RC (AND CV) HAVE POINTER TO TOP ITEM IN PUSHDOWN STACK
|
||
POLPOP: JUMP1 [ SKIPE LITLVL ;[1154] INSIDE A LITERAL?
|
||
TRO ER,ERRF ;[1154] YES, PREVENT COLLAPSING
|
||
RET] ;[1154]
|
||
CALL POLFRR ;[636] SET UP FRR POLISH FLAGS
|
||
SKIPE INBYTE ;[1077] DOING BYTE?
|
||
JRST [ TRO ER,ERRE ;[1077] YES - CAN'T BE POLISH
|
||
RET] ;[1077]
|
||
SKIPE BYTESW ;[1114] DOING BYTE PSEUDO-OP?
|
||
TRNE FRR,FWPSW ;[1114] YES - SKIP IF NOT FULLWORD FIXUP
|
||
TRNN FRR,FWPSW!RHPSW ;[1114] FULL OR RIGHT HALF POLISH FIXUP?
|
||
JRST POLPO1 ;[636] NO,
|
||
CAIN C,'(' ;[636] DOING INDEXING?
|
||
JRST POLIDX ;[636] YES, JUMP
|
||
CAIN C,')' ;[636] A CLOSE PARENT?
|
||
JRST [ TRZE FRR,PIDXSW ;[636] YES, FINISHING UP INDEX CALC?
|
||
CALL GETCHR ;[636] YES,
|
||
JRST .+1] ;[636]
|
||
TRNE FRR,RHPSW ;[1114] RIGHT HALF FIXUP?
|
||
JRST POLPO1 ;[1114] YES - DO IT IN OP
|
||
TLZE FR,INDSW ;INDIRECT?
|
||
JRST POLIND ;YES,
|
||
POLPO1: SKIPE BSHIFT ;[1164] DOING BSHIFT?
|
||
RET ;[1164] YES, JUST RETURN
|
||
SKIPE INANGL ;STILL IN EVALUATION?
|
||
JRST [ CAMN RC,XWDANG ;[773] WE HAVE LEFT POL, SUCH THAT LEFT POL=RIGHT POL?
|
||
MOVEM RC,XWDRRC ;[773] FLAG IT
|
||
MOVEM RC,INANGL ;YES, MARK STACK
|
||
SETZB RC,CV ;0 SO OP NOT CONFUSED
|
||
SETZM EXTPNT
|
||
TLZ FR,POLSW
|
||
RET] ;WILL MOVE LATER
|
||
TRNE FRR,IDXSW ;[1107] DOING OP INDEXING?
|
||
JRST [ SETZB RC,CV ;[1107] YES - CLEAR VALUE AND RELOC
|
||
SETZM EXTPNT ;[1107] CLEAR ANY EXTERNALS
|
||
TLZ FR,POLSW ;[1107] ....
|
||
RET] ;[1107] RETURN WITH FRR FLAGS
|
||
SKIPE INIOWD ;[730] DOING IOWD?
|
||
RET ;[730] YES, RETURN
|
||
SKIPN INASGN ;[624] IF DEFINING A SYMBOL JUST SAVE
|
||
SKIPE INOPDF ;[624] DOING OPDEF?
|
||
JRST POLASG ;[624]
|
||
POLSYM: PUSH P,MWP ;[1161] SAVE MWP ON THE STACK
|
||
SETZ MWP, ;[1161] AND CLEAR IT
|
||
MOVE PV,FREE ;GET NEXT FREE LOCATION
|
||
EXCH PV,POLIST ;SWAP STACK POINTER
|
||
CALL POLSTR ;STORE POINTER TO NEXT POLISH BLOCK
|
||
SETO PV, ;[1161] SET PV TO ONES
|
||
CALL POLSTR ;[1161] STORE PV AS PLACE HOLDER FOR COUNT OF WORDS NEEDED
|
||
CALL POLOPF ;STORE FIRST OPERATOR
|
||
CALL POLFST ;STORE FIRST PART
|
||
CALL POLSND ;STORE SECOND PART
|
||
POLOCT: CALL POLFRR ;[644][636] SET UP FRR POLISH FLAGS
|
||
XCT 3+[SETZM EXTPNT ;FULL WORD
|
||
HRRZS EXTPNT ;LEFT HALF
|
||
HLLZS EXTPNT](PV) ;RIGHT HALF
|
||
SKIPN INASGN ;[624] DEFINING A SYMBOL?
|
||
SKIPE INOPDF ;[624] OPDEF?
|
||
JRST POLSTS ;YES
|
||
ADDI MWP,2 ;[1161] ADD 2 TO COUNT FOR STORE OP
|
||
CALL POLSTO ;STORE IT
|
||
SKIPE PHALVL ;INSIDE PHASE?
|
||
JRST [ MOVE PV,LOCO ;YES, USE ORIGINAL LOC
|
||
HRL PV,MODO ;AND MODE
|
||
JRST POLOC1]
|
||
MOVE PV,LOCA ;LOCATION
|
||
HRL PV,MODA ;AND MODE
|
||
POLOC1: SKIPN LITLVL ;HOWEVER IF IN A LITERAL
|
||
JRST POLPOR
|
||
AOJ MWP, ;[1161] INCREMENT COUNT OF WORDS NEEDED
|
||
ASH MWP,-1 ;[1161] DIVIDE BY TWO
|
||
PUSH P,AC0 ;[1161] SAVE AC0 ON THE STACK
|
||
MOVEI AC0,@POLIST ;[1161] GET STARTING ADDRESS OF THE POLISH
|
||
AOJ AC0, ;[1161] WE WANT THE SECOND WORD OF THE POLISH
|
||
MOVEM MWP,@AC0 ;[1161] STORE THE COUNT HERE
|
||
POP P,AC0 ;[1161] RESTORE AC0
|
||
POP P,MWP ;[1161] RESTORE MWP
|
||
MOVE PV,POLIST ;WE CAN NOT SUPPLY THE STORE ADDRESS YET
|
||
MOVE CV,(PV) ;SO PUT IN A SPECIAL LIST
|
||
MOVEM CV,POLIST ;REMOVE FROM REGULAR LIST
|
||
EXCH PV,POLITS ;STORE IN POLIST LIT LIST
|
||
MOVEM PV,@POLITS ;LINK TOGETHER
|
||
MOVE PV,STPX ;STORE DEPTH IN THIS LIT
|
||
SUB PV,STPY ;WITH NO RELOCATION YET
|
||
TRO ER,ERRF ;SET FAKE FLAG
|
||
CALL POLSTR ;[1161] STORE RELOCATION AND MODE
|
||
SETZB RC,CV ;[1161] USE ZERO VALUE AND RELOCATION
|
||
JRST POLAS1 ;[1161] GO RESET POLISH POINTER
|
||
POLPOR: CALL POLSTR
|
||
SETZB RC,CV ;USE ZERO VALUE AND RELOCATION
|
||
POLRET: MOVE PV,POLPTR ;RESET INITIAL POLISH POINTER
|
||
MOVEM PV,POLSTK
|
||
AOJ MWP, ;[1161] INCREMENT COUNT OF WORDS NEEDED
|
||
ASH MWP,-1 ;[1161] DIVIDE BY TWO
|
||
PUSH P,AC0 ;[1161] SAVE AC0 ON THE STACK
|
||
MOVEI AC0,@POLIST ;[1161] GET STARTING ADDRESS OF THE POLISH
|
||
AOJ AC0, ;[1161] WE WANT THE SECOND WORD OF THE POLISH
|
||
MOVEM MWP,@AC0 ;[1161] STORE THE COUNT HERE
|
||
POP P,AC0 ;[1161] RESTORE AC0
|
||
POP P,MWP ;[1161] RESTORE MWP
|
||
RET ;RETURN
|
||
;HERE FOR POLISH SYMBOL FIXUPS
|
||
POLSTS: SUBI PV,3 ;DIFFERENT STORE OPERATOR
|
||
CALL POLSTO ;STORE IT
|
||
SKIPE INASGN ;[624]
|
||
MOVE PV,INASGN ;GET RADIX-50 SYMBOL
|
||
MOVE AC0,POLIST ;GET BLOCK
|
||
ADDI MWP,5 ;[1161] ADD 5 TO COUNT FOR SYMBOL FIXUP
|
||
JRST POLPOR ;STORE IT
|
||
|
||
;[636] HERE TO MOVE POLTYP INTO AC PV AND SET APPROPRIATE FLAGS IN FRR
|
||
POLFRR: SKIPE PV,POLTYP ;USE PRESET TYPE
|
||
JRST [JUMPL PV,POLFR1 ;SET AND PERMANENT
|
||
HRRO PV,PV ;COMPLETE OPERATOR
|
||
JRST POLFR1] ;FINALLY
|
||
HRREI PV,POLRHF ;ASSUME RH FIXUP
|
||
JUMPNC POLFR1 ;COMMA?
|
||
HRREI PV,POLLHF ;YES, LH FIXUP
|
||
POLFR1: XCT 3+[TRO FRR,FWPSW ;[614] FULL FOWRD
|
||
TRO FRR,LHPSW ;[614] LEFT HALF
|
||
TRO FRR,RHPSW](PV) ;[614] RIGHT HALF
|
||
RET ;[636]
|
||
|
||
;HERE TO DO FULL WORD FIXUP OF POLISH AND INDIRECT
|
||
POLIND: ;[750]
|
||
SETZ AC0, ;ZERO VALUE
|
||
TLO AC0,(Z @) ;TURN ON INDIRECT BIT
|
||
MOVE PS,CSTAT+'!' ;FORCE IOR
|
||
JRST FORCEP ;GO DO IT
|
||
|
||
;HERE TO DO FULL WORD FIXUP OF POLISH AND INDEX
|
||
POLIDX: ;[750]
|
||
TRO FRR,PIDXSW ;[636] FLAG IT
|
||
TLZE FR,INDSW ;[1114] IF INDIRECTION, CLEAR FOR NOW
|
||
SETOM PINDFL ;[1114] BUT REMEMBER IT FOR LATER
|
||
PUSH P,RC ;[636] STORE AWAY RC FOR WHILE
|
||
PUSH P,EXTPNT ;[1073] ALONG WITH EXTERNAL POINTERS
|
||
SETZM EXTPNT ;[1073] CLEAR RELOC
|
||
TRO FRR,NOPSW ;[1107] DO NOT ALLOW POLISH
|
||
CALL EVALCM ;[636] GO DO INDEX CALCULATION
|
||
TRZ FRR,NOPSW ;[1107] ALLOW POLISH AGAIN
|
||
TRNN FRR,RHPSW ;[1114] RIGHT HALF POLISH FIXUP
|
||
JRST POLID1 ;[1114] NO - DO FULL WORD
|
||
SETOM PLHIDX ;[1114] INDICATE LH INDEX FROM POLISH
|
||
HRRZM AC0,PIDXVL ;[1114] SAVE SWAPPED LH OF INDEX
|
||
HLLZS AC0 ;[1114] KEEP RH
|
||
HRRZM RC,PIDXRC ;[1114] SAVE SWAPPED RC OF LH
|
||
HLLZS RC ;[1114] KEEP RH
|
||
JRST POLID2 ;[1114] AND CONTINUE
|
||
POLID1: PUSH P,[0,,POLFWF] ;[1114] MAKE SURE ITS FWF
|
||
POP P,POLTYP ;[1114] ...
|
||
POLID2: SKIPE PINDFL ;[1114] INDIRECTION SAVED?
|
||
JRST [ TLO FR,INDSW ;[1114] YES - REPLACE IT
|
||
SETZM PINDFL ;[1114] AND CLEAR FLAG
|
||
JRST .+1] ;[1114]
|
||
SKIPE RC ;[636] DO WE HAVE ABS VALUE?
|
||
TRO ER,ERRR ;[636] NO, RELOCATION ERROR
|
||
TLNE AC0,-1 ;[1107] IS THERE A LEFT HALF?
|
||
TRO ER,ERRQ ;[1107] YES - FLAG ERROR
|
||
MOVSS AC0 ;[1114] SWAP VALUE
|
||
POP P,EXTPNT ;[1073] RESTORE EXTERNAL RELOC
|
||
POP P,RC ;[636] GET BACK RC WHICH HAS POLISH PTR
|
||
MOVE PS,CSTAT+'+' ;[1114] FORCE ADDITIONAL ADD
|
||
JRST FORCEP ;[636] GO DO IT
|
||
|
||
;HERE TO STORE CURRENT POLISH STACK
|
||
;WE MUST MOVE IT TO A SAFE PLACE
|
||
POLASG: CALL MOVSTK ;MOVE STACK
|
||
POLAS1: MOVE PV,POLPTR ;[1161] RESET INITIAL POLISH POINTER
|
||
MOVEM PV,POLSTK ;[1161]
|
||
RET ;[1161]
|
||
|
||
MOVSTK: JUMPGE RC,CPOPJ ;[1010] RETURN IF NOT POLISH
|
||
PUSH P,SDEL ;SAVE ACC
|
||
PUSH P,AC1 ;...
|
||
HRRZ AC1,POLSTK ;GET TOP OF STACK
|
||
HRRZ SDEL,POLPTR ;[1225] GET ORIGIN OF STACK
|
||
CAMN AC1,SDEL ;[1225] ANY CHANGE?
|
||
JRST MOVNOT ;[1225] NO - GET OUT
|
||
HRRZ SDEL,RC ;GET RH OF RC
|
||
CAMLE SDEL,AC1 ;RH(RC) .LE. RH(POLSTK)?
|
||
JRST MOVNOT ;NO, JUMP, SINCE ADDITIONAL POLISH
|
||
CAME RC,POLPTR ;[623] POLISH OF POLISH?
|
||
HRRM AC1,POLPTR ;[623] YES, READ JUST BEGINNING POINTER
|
||
SUBI AC1,(RC) ;GET + LENGTH - 1
|
||
HRRZI SDEL,1(AC1) ;+ LENGTH
|
||
ADD SDEL,FREE ;NEW TOP
|
||
CAML SDEL,SYMBOL ;WILL IT FIT
|
||
CALL XCEED ;NOT YET
|
||
EXCH SDEL,FREE ;BASE IN SDEL
|
||
HRL SDEL,RC ;FROM
|
||
HRR RC,SDEL ;NEW RELOC PTR
|
||
MOVE CV,AC1 ;COPY LENGTH
|
||
HRL CV,CV ;INTO BOTH HALVES
|
||
MOVE AC1,FREE ;TOP +1
|
||
BLT SDEL,-1(AC1) ;MOVE IT
|
||
MOVE AC1,POLSTK ;GET STACK PTR
|
||
SUB AC1,CV ;BACKUP
|
||
MOVEM AC1,POLSTK
|
||
SETZ CV, ;[730] SET CURRENT VALUE TO 0
|
||
MOVNOT: POP P,AC1 ;RESTORE
|
||
POP P,SDEL ;...
|
||
RET
|
||
|
||
|
||
;THIS IS A KLUDGE TO PRODUCE ADDITIVE GLOBALS FOR THE FEW CASES THAT THEY
|
||
;CAN HANDLE. I.E. K+GLOBAL, GLOBAL+K, GLOBAL-K
|
||
;SO THAT OLD PROGRAMS WILL COMPIL THE SAME WAY AND LOAD WITH THE
|
||
;OLD LOADER WITHOUT THE FAILSW CODE
|
||
;APART FROM ADDITIVE SYMBOL FIXUPS POLISH BLOCKS ARE MORE POWERFUL
|
||
;***** REMOVE SOMEDAY
|
||
POLOPF: SKIPE POLTYP ;IF ALREADY SETUP THEN
|
||
JRST POLOPX ;WE MUST USE POLISH (EXP OR OCT)
|
||
JUMPL RC,POLOPX ;TOO COMPLEX IF ALREADY A POINTER
|
||
HRRZ PS,1(RC) ;GET FIRST OPERATOR
|
||
CAIE PS,3 ;CAN ONLY HANDLE ADD
|
||
CAIN PS,4 ;AND SUBTRACT
|
||
JRST POLOP2 ;ITS ONE OF THOSE GIVE IT A TRY
|
||
;*****
|
||
POLOPX: ;[575]
|
||
IFN FTPSECT,< ;[575]
|
||
SKIPN SGNMAX ;PSECTS USED?
|
||
JRST POLOPR ;NO
|
||
PUSH P,PV ;SAVE FIRST OP
|
||
HRRO PV,SGNCUR ;GET CUR PSECT INX
|
||
TRO PV,400000 ;MAKE POLISH OP
|
||
CALL POLSTR ;STORE IT
|
||
AOJ MWP, ;[1161] INCR COUNT FOR PSECT INDEX
|
||
POP P,PV ;GET FIRST OP
|
||
> ;END IFN FTPSECT
|
||
POLOPR: HRRZ PV,RC ;[1051] GET RH OF RC
|
||
CAMLE PV,.JBREL ;[1051] ABOUT TO ILL MEM REF?
|
||
JRST [ TLO FR,LOADSW ;[1051]
|
||
CALL EVXERR ;[1051][1007] YES, THIS SHOULDN'T HAPPEN. GIVE MSG.
|
||
TLZ FR,LOADSW ;[1051] LOADSW ENSURED THAT WE RETURNED
|
||
SETZB AC0,RC ;[1007] MUST HAVE TYPOS.. CLEAR AC'S
|
||
JRST POLRET] ;[1007] JUST RETURN.
|
||
HRRZ PV,1(RC) ;GET OPERATOR
|
||
CAIL PV,OTLEN ;A VALID OPERATOR INDEX?
|
||
JRST EVXERR ;NO, GIVE ERROR
|
||
CAIE PV,15 ;[1241] IS IT PSECT (NOT REAL OP?)
|
||
AOJ MWP, ;[1161] INCR COUNT FOR OP
|
||
CAIGE PV,-6 ;[1161] STORE OP?
|
||
JRST POLOPA ;[1161] NO
|
||
CAIGE PV,-3 ;[1161] SYMBOL FIXUP?
|
||
ADDI PV,3 ;[1161] ITS A SYMBOL FIXUP, ADD 3 THEN ADD 1
|
||
AOJ MWP, ;[1161] ADD ONE FOR STORE OP
|
||
POLOPA: XCT OPRTBL-3(PV) ;[1161]ANYTHING SPECIAL?
|
||
HRRO PV,1(RC) ;GET OPERATOR AND FLAG IT
|
||
JRST POLSTR ;STORE IT AND EXIT
|
||
|
||
POLAPO: AOS 0(P) ;SKIP FIRST OPERAND
|
||
MOVE PV,3(RC) ;[1101] GET PSECT INDEX
|
||
CAMN PV,SGNCUR ;[1101] SAME AS CURRENT (GLOBAL) PSECT?
|
||
RET ;[1101] YES - NO NEED TO STORE IT
|
||
TDO PV,[-1,,400000] ;[1101] NO - MAKE POLISH OP
|
||
AOJ MWP, ;[1161] INCR COUNT FOR PSECT INDEX
|
||
JRST POLSTR ;STORE AND EXIT
|
||
|
||
;***** MORE OF THIS KLUDGE
|
||
POLOP2: SUBI PS,3 ;MAKES LIFE EASIER
|
||
MOVE CV,4(RC) ;GET 2ND OPERAND
|
||
JUMPL CV,POLOPX ;ITS A POINTER, THEREFORE TOO COMPLEX
|
||
MOVE PV,2(RC) ;AND 1ST OPERAND
|
||
JUMPL PV,POLOPX ;THIS IS A POINTER
|
||
TDNN CV,[-2,,-2] ;TEST FOR EXTERN
|
||
JRST [TRNE CV,1 ;TEST FOR BOTH RELOCATABLE
|
||
TRNN PV,1
|
||
JRST POLOP3 ;THIS IS NOT EXTERN SO OTHER CAN BE
|
||
JRST POLOPX] ;CANNOT HANDLE HERE, USE POLISH
|
||
JUMPN PS,POLOPX ;CAN NOT HANDLE -GLOBAL
|
||
TDNE PV,[-2,,-2] ;TEST FOR EXTERN HERE
|
||
JRST POLOPX ;GLOBAL+GLOBAL TOO COMPLEX
|
||
POLOP3: SOS FREE ;BACKUP FREE COUNTER
|
||
MOVE PV,@FREE ;GET LAST POINTER
|
||
MOVEM PV,POLIST ;SET POINTER BACK
|
||
POP P,PV ;POP RETURN OFF STACK
|
||
TLZ FR,POLSW ;CLEAR FLAG JUST IN CASE
|
||
;RELOAD RC, CV, PV, AND PR FROM STACK
|
||
;AND EXECUTE OPERATOR
|
||
MOVE PR,2(RC)
|
||
MOVE PV,3(RC)
|
||
MOVE CV,5(RC)
|
||
MOVE RC,4(RC) ;THIS ONE LAST OF COURSE
|
||
JUMPN PS,POLOP5 ;DO MINUS
|
||
ADDM PV,CV
|
||
ADDM PR,RC
|
||
JRST POLRET ;RESTORE STACK AND RETURN
|
||
|
||
POLOP5: SUBM PV,CV
|
||
SUBM PR,RC
|
||
JRST POLRET
|
||
;***** END OF THIS KLUDGE
|
||
|
||
;HERE TO HANDLE FIRST OPERAND
|
||
;HIGHLY RECURSIVE
|
||
POLFST: SKIPGE PV,2(RC) ;GET RELOCATION
|
||
JRST POLFSR ;THIS IS ANOTHER POINTER
|
||
TDNE PV,[-2,,-2] ;IS IT EXTERNAL?
|
||
JRST [SKIPN 3(RC) ;[703] IF VALUE.NE.0, FUDGE IN CONSTANT
|
||
JRST POLFS2 ;[703]
|
||
HRRZ CV,3(RC) ;[703] GET VALUE
|
||
HRROI PV,3 ;[703]
|
||
AOJ MWP, ;[1161] INCR COUNT FOR OPERATOR
|
||
CALL POLSTR ;[703] STORE
|
||
CALL POLFS3 ;[703] USE COMMON CODE
|
||
MOVE PV,2(RC) ;[703] GET BACK RELOCATION
|
||
JRST POLFS2] ;[703]
|
||
MOVE CV,3(RC) ;GET VALUE
|
||
POLFS4: TLNN PV,-1 ;CHECK FOR LEFT HALF VALUE
|
||
TLNE CV,-1
|
||
JRST POLFS1 ;YES, NEED FULL WORD
|
||
HRL CV,PV ;XWD RELOC ,, VALUE
|
||
POLFS3: SETZ PV, ;[703] OPERAND IS 0 FOR 18 BIT VALUE
|
||
CALL POLSTR
|
||
MOVE PV,CV
|
||
ADDI MWP,2 ;[1161] ADD 2 TO COUNT FOR 0 AND HALF WORD
|
||
JRST POLSTR ;STORE AND EXIT
|
||
|
||
POLFS1: MOVEI PV,1 ;OPERAND IS 1 FOR 36 BIT VALUE
|
||
CALL POLSTR
|
||
MOVE PV,2(RC) ;RELOCATION
|
||
CALL POLSTR
|
||
MOVE PV,CV ;VALUE
|
||
ADDI MWP,3 ;[1161] ADD 3 TO COUNT FOR 1 AND FULL WORD VALUE
|
||
JRST POLSTR
|
||
|
||
POLSN2:
|
||
POLFS2: MOVE CV,1(PV) ;GET SIXBIT SYMBOL INTO AC0
|
||
MOVEI PV,2 ;OPERAND IN 2 FOR SYMBOL
|
||
CALL POLSTR
|
||
MOVEI ARG,4 ;MAKE GLOBAL REQUEST
|
||
CALL SQOZE ;TO RADIX-50
|
||
MOVE PV,CV ;PUT IN RIGHT ACC
|
||
ADDI MWP,3 ;[1161] ADD 3 TO COUNT FOR 2 AND SYMBOL
|
||
JRST POLSTR ;STORE IT
|
||
|
||
POLFSR:; CAME PV,3(RC) ;CHECK TO MAKE SURE IT REALLY IS A POINTER
|
||
; JRST POLFSN ;NO, ITS A NEGATIVE GLOBAL
|
||
PUSH P,RC ;SAVE THIS POINTER
|
||
MOVE RC,PV ;GET NEXT POINTER
|
||
CALL POLOPR ;GET OPERATOR
|
||
CALL POLFST ;GET FIRST OPERAND
|
||
CALL POLSND ;GET SECOND OPERAND
|
||
POP P,RC ;GET BACK PREVIOUS POINTER
|
||
RET ;RETURN TO PREVIOUS LEVEL
|
||
|
||
POLFSN: HRROI PV,14 ;TWO'S COMPLIMENT NEGATIVE
|
||
AOJ MWP, ;[1161] INCR COUNT FOR OPERATOR
|
||
CALL POLSTR ;STORE OPERATOR
|
||
MOVN PV,2(RC) ;GET RELOCATION
|
||
TDNE PV,[-2,,-2] ;CHECK FOR EXTERN
|
||
JRST POLFS2 ;IT IS, CONVERT TO RADIX-50
|
||
MOVN CV,3(RC) ;GET VALUE
|
||
JRST POLFS4 ;AND STORE IT
|
||
|
||
;HERE TO HANDLE 2ND OPERAND, ALSO RECURSIVE
|
||
POLSNR:; CAME PV,5(RC) ;MAKE SURE IT REALLY IS
|
||
; JRST POLSNN ;ITS A NEGATIVE GLOBAL
|
||
MOVE RC,PV ;GET NEXT POINTER
|
||
CALL POLOPR ;STORE OPERATOR
|
||
CALL POLFST ;GET 1ST OPERAND, THEN ON TO 2ND
|
||
|
||
POLSND: SKIPGE PV,4(RC) ;GET RELOCATION
|
||
JRST POLSNR ;THIS IS A POINTER
|
||
TDNE PV,[-2,,-2] ;IS IT EXTERNAL?
|
||
JRST [SKIPN 5(RC) ;[1110] IF VALUE.NE.0, FUDGE IN CONSTANT
|
||
JRST POLSN2 ;[1110]
|
||
HRRZ CV,5(RC) ;[1110] GET VALUE
|
||
HRROI PV,3 ;[1110]
|
||
AOJ MWP, ;[1161] INCR COUNT FOR OPERATOR
|
||
CALL POLSTR ;[1110] STORE
|
||
CALL POLSN3 ;[1110] USE COMMON CODE
|
||
MOVE PV,4(RC) ;[1110] GET BACK RELOCATION
|
||
JRST POLSN2] ;[1110]
|
||
MOVE CV,5(RC) ;GET VALUE
|
||
POLSN4: TLNN PV,-1 ;CHECK FOR LEFT HALF VALUE
|
||
TLNE CV,-1
|
||
JRST POLSN1 ;YES, NEED FULL WORD
|
||
HRL CV,PV ;XWD RELOC ,, VALUE
|
||
POLSN3: SETZ PV, ;[1110] OPERAND IS 0 FOR 18 BIT VALUE
|
||
CALL POLSTR
|
||
MOVE PV,CV
|
||
ADDI MWP,2 ;[1161] ADD 2 TO COUNT FOR 0 AND HALF WORD VALUE
|
||
JRST POLSTR ;STORE AND EXIT
|
||
|
||
POLSNN: HRROI PV,14 ;TWO'S COMPLIMENT NEGATIVE
|
||
AOJ MWP, ;[1161] INCR COUNT FOR OPERATOR
|
||
CALL POLSTR ;STORE OPERATOR
|
||
MOVN PV,4(RC) ;GET RELOCATION
|
||
TDNE PV,[-2,,-2] ;CHECK FOR EXTERN
|
||
JRST POLSN2 ;IT IS, CONVERT TO RADIX-50
|
||
MOVN CV,5(RC) ;GET VALUE
|
||
JRST POLSN4 ;AND STORE IT
|
||
|
||
POLSN1: MOVEI PV,1 ;OPERAND IS 1 FOR 36 BIT VALUE
|
||
CALL POLSTR
|
||
MOVE PV,4(RC) ;RELOCATION
|
||
CALL POLSTR
|
||
MOVE PV,CV ;VALUE
|
||
ADDI MWP,3 ;[1161] ADD 3 TO COUNT FOR 1 AND FULL WORD VALUE
|
||
JRST POLSTR
|
||
|
||
POLSTO: MOVE SDEL,FREE ;GET NEXT FREE WORD
|
||
MOVEM SDEL,LSTOPR ;STORE POINTER TO STORE OP
|
||
POLSTR: AOS SDEL,FREE ;GET A FREE WORD
|
||
CAML SDEL,SYMBOL ;ENOUGH?
|
||
CALL XCEED ;NO
|
||
MOVEM PV,-1(SDEL) ;STORE ONE WORD
|
||
RET
|
||
|
||
;TABLE OF CORRESPONDENCE BETWEEN MACRO-10 OPERATORS AND BLOCK 11 OPERATORS
|
||
POLTBL: ;POLISH VALUE MACRO-10 OPERATOR
|
||
5 ;1 MULTIPLY
|
||
6 ;2 DIVIDE
|
||
3 ;3 ADD
|
||
4 ;4 SUBTRACT
|
||
11 ;5 LEFT SHIFT
|
||
10 ;6 LOGICAL IOR
|
||
7 ;7 LOGICAL AND
|
||
12 ;10 LOGICAL XOR
|
||
13 ;11 NOT
|
||
14 ;12 NEGATE
|
||
15 ;13 ADDITIVE PSECT OPERATION
|
||
REPEAT 3,<CALL EVXERR> ;IN CASE OF BAD OPERATOR
|
||
|
||
OPRTBL:
|
||
JFCL ;3 ADD
|
||
JFCL ;4 SUBTRACT
|
||
JFCL ;5 MULTIPLY
|
||
JFCL ;6 DIVIDE
|
||
JFCL ;7 LOGICAL AND
|
||
JFCL ;10 LOGICAL IOR
|
||
JFCL ;11 LEFT SHIFT
|
||
JFCL ;12 LOGICAL XOR
|
||
AOS (P) ;13 NOT
|
||
AOS (P) ;14 NEGATE
|
||
JRST POLAPO ;15 ADDITIVE PSECT OPERATION
|
||
OTLEN==.-OPRTBL+3 ;LENGTH OF THIS TABLE + 3
|
||
>;END OF IFN POLISH
|
||
SUBTTL LITERAL STORAGE HANDLER
|
||
|
||
STOLER:
|
||
IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED
|
||
CALL STOW> ;STOW ZERO
|
||
IFN FORMSW,< MOVEI AC0,0
|
||
CALL STOWZ1>
|
||
TRO ER,ERRL ;AND FLAG THE ERROR
|
||
|
||
STOLIT: MOVE SDEL,STPX
|
||
SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS
|
||
JUMPE SDEL,STOLER ;ERROR IF NONE STORED
|
||
TRNN ER,ERRORS!ERRF ;ANY ERRORS?
|
||
JRST STOL06 ;NO
|
||
TRNN ER,ERRORS-ERRU ;ONLY ERRF!ERRU, THEN BRANCH
|
||
JRST STOL22
|
||
JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2
|
||
ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT
|
||
TRZ ER,ERRF ;CLEAR FAKE FLAG
|
||
JRST STOWI ;INITIALIZE STOW
|
||
|
||
STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH
|
||
MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD
|
||
HRL ARG,STPY
|
||
MOVE AC2,LITNUM
|
||
MOVEI SDEL,0
|
||
STOL08: CALL DSTOW ;GET VALUE WFW
|
||
|
||
STOL10: SOJL AC2,STOL24 ;TEST FOR END
|
||
MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL
|
||
MOVE V,-1(SX) ;GET RELOCATION BITS WFW
|
||
CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW
|
||
CAME RC,V ;YES, HOW ABOUT RELOCATION?
|
||
AOJA SDEL,STOL10 ;NO, TRY AGAIN
|
||
SKIPGE STPX ;YES, MULTI-WORD?
|
||
JRST STOL13 ;NO, JUST RETURN LOCATION
|
||
MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO
|
||
MOVEM SX,SAVBLK+SX
|
||
|
||
STOL12: SOJL AC2,STOL23 ;TEST FOR END
|
||
CALL DSTOW ;GET NEXT WORD WFW
|
||
MOVE SX,0(SX) ;UPDATE POINTER
|
||
MOVE V,-1(SX) ;GET RELOCATION WFW
|
||
CAMN AC0,-2(SX) ;COMPARE VALUE WFW
|
||
CAME RC,V ;AND RELOCATION
|
||
JRST STOL14 ;NO MATCH, TRY AGAIN
|
||
SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?
|
||
JRST STOL12 ;NO, TRY NEXT WORD
|
||
STOL13: ;YES, RETURN LOCATION
|
||
IFN POLISH,<
|
||
SETZM POLITS ;CLEAR ANY POLISH PENDING
|
||
>
|
||
JRST STOL26
|
||
|
||
STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS
|
||
MOVE SX,SAVBLK+SX
|
||
HRREM ARG,STPX
|
||
HLREM ARG,STPY
|
||
AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME
|
||
|
||
STOL22: MOVE SDEL,LITNUM
|
||
STOL23: CALL DSTOW ;DSTOW AND CONVERT
|
||
STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE
|
||
CALL GETTOP ;GET NEXT CELL
|
||
MOVEM AC0,-2(SX) ;STORE CODE WFW
|
||
IFN POLISH,<
|
||
HRRZ AC0,RC ;[1222] RIGHT RELOC
|
||
CAIN AC0,377777 ;[1222] PASS1 ONLY POLISH?
|
||
JRST STOL2P ;[1222] YES - USE FAKE RC
|
||
HLRZ AC0,RC ;[1222] LEFT RELOC
|
||
CAIN AC0,377777 ;[1222] PASS1 ONLY POLISH?
|
||
JRST STOL2P ;[1222] YES - FAKE RC
|
||
JUMPN RC,STOL25 ;[1031] JUMP IF NOT ABS
|
||
TRNN ER,ERRF ;[1031] FAKE ERROR FOR POLISH?
|
||
JRST STOL25 ;[1031] NO, JUMP
|
||
STOL2P: MOVSI AC0,(1B0) ;[1222][1031] FIX RC SO WE CAN TELL FROM [0]
|
||
MOVEM AC0,-1(SX) ;[1031] USE AC0 TO KEEP AC RC AS IS
|
||
JRST STOL25+1 ;[1031]
|
||
STOL25: ;[1031]
|
||
>
|
||
MOVEM RC,-1(SX) ;WFW
|
||
IFN FORMSW,<
|
||
MOVE AC0,FORM
|
||
MOVEM AC0,-3(SX)>
|
||
MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL
|
||
AOS LITNUM ;INCREMENT NUMBER STORED
|
||
AOS LITCNT ;INCREMENT NUMBER RESERVED
|
||
SKIPL STPX ;ANY MORE CODE?
|
||
JRST STOL23 ;YES
|
||
STOL26: TRZ ER,ERRF ;CLEAR FAKE FLAG
|
||
JUMP1 CPOPJ ;[664] EXIT IF PASS ONE
|
||
MOVE SX,LITHDX ;GET HEADER BLOCK
|
||
HLRZ RC,-1(SX) ;GET BLOCK RELOCATION
|
||
HRRZ AC0,-1(SX)
|
||
ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION
|
||
RET ;EXIT
|
||
SUBTTL INPUT ROUTINES
|
||
|
||
GETCHR: PUSH P,V ;[731] V IS USED IN MREAD -> DSEND
|
||
CALL CHARAC ;GET ASCII CHARACTER
|
||
IFN STANSW,<
|
||
CAIN C,32
|
||
MOVEI C,136 ;^
|
||
CAIN C,30
|
||
MOVEI C,137 ;_
|
||
CAIN C,176
|
||
MOVEI C,134 ;~
|
||
CAIN C,140
|
||
MOVEI C,100> ;@
|
||
SUBI C,40 ;CONVERT TO SIXBIT
|
||
CAIG C,77 ;CHAR GREATER THAN SIXBIT?
|
||
JUMPGE C,GETCS ;TEST FOR VALID SIXBIT
|
||
CAIL C,"A" ;[664] RETURN LOWERCASE AS SIXBIT
|
||
CAILE C,"Z" ;[664]
|
||
JRST GETCS3 ;[664] OTHERWISE SPECIAL HANDLING
|
||
SUBI C,40 ;[664]
|
||
JRST GETCS ;[664]
|
||
|
||
GETCS3: ADDI C,40 ;[664] BACK TO ASCII
|
||
CAIN C,HT ;CHECK FOR TAB
|
||
JRST GETCS2 ;MAKE IT LOOK LIKE SPACE
|
||
CAIG C,CR ;GREATER THAN CR
|
||
CAIG C,HT ;GREATER THAN TAB
|
||
JRST GETCS1 ;IS NOT FF,VT,LF OR CR
|
||
MOVEI C,EOL ;LINE OR FORM FEED OR V TAB
|
||
TLOA IO,IORPTC ;REPEAT CHARACTER
|
||
GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK
|
||
|
||
GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS
|
||
POP P,V ;[731] RESTORE TO ORIGINAL VALUE
|
||
RET ;EXIT
|
||
|
||
GETCS1: JUMPE C,GETCS ;IGNORE NULS
|
||
SKIPE INRMRK ;[1177] COME FROM REMAR0?
|
||
JRST GETCHR+1 ;[1177] YES, DO NOT COMPLAIN
|
||
TRC C,100 ;MAKE CHAR. VISIBLE
|
||
MOVEI CS,"^"
|
||
DPB CS,LBUFP ;PUT ^ IN OUTPUT
|
||
CALL RSW2 ;ALSO MODIFIED CHAR.
|
||
TRO ER,ERRQ ;FLAG Q ERROR
|
||
JRST GETCHR+1 ;[731] BUT IGNORE CHAR.
|
||
|
||
CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?
|
||
JRST [HRRZ C,LIMBO ;[664] GET LAST CHARACTER
|
||
RET] ;[664] EXIT
|
||
RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET
|
||
CALL READ
|
||
RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?
|
||
JRST REPO1 ;YES
|
||
RSW2: CAIN C,LF ;LF?
|
||
JRST [MOVE CS,LIMBO ;[664] YES, GET LAST CHAR
|
||
CAIE CS,CR ;[664] CR?
|
||
JRST .+1 ;[664] NO
|
||
HRROM C,LIMBO ;[664] YES, FLAG
|
||
RET] ;[664] AND EXIT
|
||
MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC
|
||
RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?
|
||
JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO
|
||
JUMPE C,CPOPJ ;[1122] DO NOT COPY NULS TO LINE BUFFER
|
||
SKIPG CPL ;[1133] ANY ROOM IN THE IMAGE BUFFER?
|
||
CALL RSW5 ;NO, BUT SEE IF ANY EXCESS WE CAN USE
|
||
IDPB C,LBUFP ;YES, STORE IN PRINT AREA
|
||
SOS CPL ;[1133] UPDATE BUFFER COUNT
|
||
CAIE C,HT ;TAB?
|
||
RET ;NO, EXIT
|
||
MOVEI CS,7 ;TAB COUNT MASK
|
||
ANDCAM CS,CPL ;MASK TO TAB STOP
|
||
RET
|
||
|
||
RSW5: CAIN C,HT ;[1133] TAB?
|
||
JRST RSW6 ;[1133] YES - NOT ENOUGH ROOM
|
||
MOVNI CS,.CPLX ;[1133][664] GET EXCESS SPACE
|
||
CAMGE CS,CPL ;[664] ANY ROOM?
|
||
RET ;[664] YES, JUST RETURN
|
||
RSW6: SKIPN LITLVL ;[1133][664] IF IN LITERAL
|
||
SKIPL STPX ;[664] OR CODE GENERATED
|
||
JRST OUTIM ;[664] JUST OUTPUT THE IMAGE
|
||
SKIPN ASGBLK ;[760]ASSIGNMENT
|
||
SKIPE LOCBLK ;[760] OR A BLOCK RESERVATION?
|
||
JRST .+2 ;[760] YES, GO OUTPUT BINARY
|
||
JRST OUTIM ;[664] OTHERWISE OUTPUT IMAGE
|
||
CALL SAVEXS ;[760] SAVE AC0 AND C
|
||
MOVEI C,CR ;[664]
|
||
IDPB C,LBUFP ;[664]
|
||
CALL OUTLIN ;[664] OUTPUT PARTIAL LINE
|
||
CALL RSTRXS ;[664] RESTORE ACS
|
||
JRST OUTLI2 ;[664] INITIALIZE REST OF LINE
|
||
|
||
CHARL: CALL CHARAC ;GET AND TEST 7-BIT ASCII
|
||
CAIG C,FF ;LINE OR FORM FEED OR VT?
|
||
CAIGE C,LF
|
||
RET ;NO,EXIT
|
||
CHARL1: CALL SAVEXS ;[667] SAVE REGISTERS
|
||
SKIPE LITLVL ;[661] IN LITERAL?
|
||
JRST [CALL OUTIML ;[667] YES
|
||
JRST RSTRXS] ;[667] RESTORE ACS AND EXIT
|
||
CALL OUTLIN ;NO, DUMP THE LINE
|
||
JRST RSTRXS ;RESTORE REGISTERS AND EXIT
|
||
|
||
;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
|
||
;UNTIL A LINE TERMINATOR IS SEEN.
|
||
STOUTS: TLOA IO,IOENDL!IORPTC
|
||
STOUT: TLO IO,IORPTC
|
||
CALL BYPASS ;[664]
|
||
CAIE C,EOL ;MOST LIKELY A ; OR EOL CH
|
||
JRST STOUT2 ;IT WASN'T, SEE WHY!
|
||
HRRZ C,LIMBO ;GET CHARACTER IN CASE EOL
|
||
TLZE IO,IORPTC ;[1075] IF EOL
|
||
JRST STOUT4 ;[1075] SKIP NEXT GET
|
||
STOUT1: SKIPN MRP ;[1075] STILL IN A MACRO?
|
||
TLZ IO,IOMAC ;[1075] NO - CLEAR OUTPUT SUPPRESSION
|
||
CALL RSW0 ;[1075]
|
||
STOUT4: CAIN C,CR ;[1075] NEED SPECIAL TEST FOR CR
|
||
JRST STOUT3 ;IN CASE NOT FOLLOWED BY LF
|
||
CAIG C,FF
|
||
CAIGE C,LF
|
||
JRST STOUT1
|
||
JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)
|
||
|
||
STOUT2: CAIN C,14 ;COMMA?
|
||
SKIPL STPX ;YES, ERROR IF CODE STORED
|
||
TRO ER,ERRQ
|
||
JRST STOUT1 ;PASS OUT TIL END OF LINE
|
||
|
||
STOUT3: CALL RSW0 ;GET NEXT CHAR.
|
||
CAIG C,FF ;GENUINE EOL CHARACTER?
|
||
CAIGE C,LF
|
||
TLOA IO,IORPTC ;NO, SO REPEAT IT
|
||
JRST OUTLIN ;AND DUMP LINE IN ANY CASE
|
||
REPEAT 0,< ;DON'T FLAG IT
|
||
TRO ER,ERRQ ;FLAG EXTRA <CR> WITH "Q" ERROR
|
||
>
|
||
SETZ C,
|
||
DPB C,LBUFP ;CLEAR LOOK-AHEAD CHAR OUT OF BUFFER
|
||
CALL OUTLIN ;DUMP UPTO CR AS LINE
|
||
HRRZ C,LIMBO ;GET C BACK
|
||
JRST RSW3 ;AND PUT CHAR IN NEW BUFFER
|
||
SUBTTL CHARACTER STATUS TABLE
|
||
|
||
DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
|
||
<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>
|
||
;OPLVL PRIORITY OF BINARY OPERATORS
|
||
;ATOM INDEX TO JUMP TABLE AT CELL1
|
||
;AN TYPE OF CHARACTER
|
||
; 1=OTHER, 2=ALPHA, 4=NUMERIC
|
||
;SQUOZ VALUE IN RADIX 50
|
||
;OPTYPE INDEX TO JUMP TABLE AT EVXCT
|
||
;SEQNO VALUE IN SIXBIT
|
||
|
||
CSTAT:
|
||
GENCS 00,00,1,00,00,00 ;' '
|
||
GENCS 04,12,1,00,06,01 ;'!'
|
||
GENCS 00,07,1,00,00,02 ;'"'
|
||
GENCS 00,12,1,00,00,03 ;'#'
|
||
GENCS 00,01,2,46,00,04 ;'$'
|
||
GENCS 00,01,2,47,00,05 ;'%'
|
||
GENCS 04,12,1,00,07,06 ;'&'
|
||
GENCS 00,07,1,00,00,07 ;'''
|
||
|
||
GENCS 00,01,1,00,00,10 ;'('
|
||
GENCS 00,01,1,00,00,11 ;')'
|
||
GENCS 02,12,1,00,01,12 ;'*'
|
||
GENCS 01,00,1,00,03,13 ;'+'
|
||
GENCS 40,01,1,00,00,14 ;','
|
||
GENCS 01,02,1,00,04,15 ;'-'
|
||
GENCS 00,11,2,45,00,16 ;'.'
|
||
GENCS 02,12,1,00,02,17 ;'/'
|
||
|
||
GENCS 00,04,4,01,00,20 ;'0'
|
||
GENCS 00,04,4,02,00,21 ;'1'
|
||
GENCS 00,04,4,03,00,22 ;'2'
|
||
GENCS 00,04,4,04,00,23 ;'3'
|
||
GENCS 00,04,4,05,00,24 ;'4'
|
||
GENCS 00,04,4,06,00,25 ;'5'
|
||
GENCS 00,04,4,07,00,26 ;'6'
|
||
GENCS 00,04,4,10,00,27 ;'7'
|
||
|
||
GENCS 00,04,4,11,00,30 ;'8'
|
||
GENCS 00,04,4,12,00,31 ;'9'
|
||
GENCS 00,12,1,00,00,32 ;':'
|
||
GENCS 00,01,1,00,00,33 ;';'
|
||
GENCS 00,05,1,00,00,34 ;'<'
|
||
GENCS 00,12,1,00,00,35 ;'='
|
||
GENCS 00,01,1,00,00,36 ;'>'
|
||
GENCS 00,12,1,00,00,37 ;'?'
|
||
|
||
GENCS 00,03,1,00,00,40 ;'@'
|
||
GENCS 00,01,2,13,00,41 ;'A'
|
||
GENCS 00,01,2,14,00,42 ;'B'
|
||
GENCS 00,01,2,15,00,43 ;'C'
|
||
GENCS 00,01,2,16,00,44 ;'D'
|
||
GENCS 00,01,2,17,00,45 ;'E'
|
||
GENCS 00,01,2,20,00,46 ;'F'
|
||
GENCS 00,01,2,21,00,47 ;'G'
|
||
|
||
GENCS 00,01,2,22,00,50 ;'H'
|
||
GENCS 00,01,2,23,00,51 ;'I'
|
||
GENCS 00,01,2,24,00,52 ;'J'
|
||
GENCS 00,01,2,25,00,53 ;'K'
|
||
GENCS 00,01,2,26,00,54 ;'L'
|
||
GENCS 00,01,2,27,00,55 ;'M'
|
||
GENCS 00,01,2,30,00,56 ;'N'
|
||
GENCS 00,01,2,31,00,57 ;'O'
|
||
|
||
GENCS 00,01,2,32,00,60 ;'P'
|
||
GENCS 00,01,2,33,00,61 ;'Q'
|
||
GENCS 00,01,2,34,00,62 ;'R'
|
||
GENCS 00,01,2,35,00,63 ;'S'
|
||
GENCS 00,01,2,36,00,64 ;'T'
|
||
GENCS 00,01,2,37,00,65 ;'U'
|
||
GENCS 00,01,2,40,00,66 ;'V'
|
||
GENCS 00,01,2,41,00,67 ;'W'
|
||
|
||
GENCS 00,01,2,42,00,70 ;'X'
|
||
GENCS 00,01,2,43,00,71 ;'Y'
|
||
GENCS 00,01,2,44,00,72 ;'Z'
|
||
GENCS 00,06,1,00,00,73 ;'['
|
||
GENCS 00,12,1,00,00,74 ;'\'
|
||
GENCS 00,01,1,00,00,75 ;']'
|
||
GENCS 00,10,1,00,00,76 ;'^'
|
||
GENCS 06,12,1,00,05,77 ;[1054] '_'
|
||
|
||
CSTATX: GENCS 04,12,1,00,10,01 ;'^!'
|
||
CSTATN: GENCS 10,12,1,00,11,15 ;[1054] '^-'
|
||
IFN POLISH,<
|
||
CSTATM: GENCS 10,12,1,00,12,15 ;[1054] UNARY MINUS
|
||
> ;END IFN POLISH
|
||
IFN FTPSECT,< ;[575]
|
||
CSTATP: GENCS 11,12,1,00,13,13 ;ADDITIVE PSECT OPERATION
|
||
>
|
||
SUBTTL LISTING ROUTINES
|
||
|
||
OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?
|
||
TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?
|
||
TRZ ER,ERRQ ;YES, ZERO THE Q ERROR
|
||
HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT
|
||
TLZ AC0,ERRF ;CLEAR FAKE FLAG
|
||
TDZ ER,TYPERR
|
||
JUMP1 OUTL30 ;BRANCH IF PASS ONE
|
||
TLNE FR,IOSCR ;[663] GCHAR ERROR TYPEOUT?
|
||
JRST OUTL02 ;[663] YES, FORCE PRINTING
|
||
SKIPE LITLVL ;WITHIN NOLIST LITERAL?
|
||
SKIPE LITLST
|
||
JRST OUTL04 ;NO
|
||
TLNE IO,IOSALL ;YES, SALL MODE?
|
||
JUMPN MRP,OUTLI5 ;[1065] YES, EXIT IF IN MACRO EXPANSION
|
||
OUTL04: JUMPN AC0,OUTL02 ;IF ANY ERRORS, FORCE PRINTING
|
||
MOVE AC1,STPX
|
||
CAME AC1,STPY ;ANY CODE GENERATED?
|
||
JRST OUTL01 ;YES
|
||
TLNN IO,IOSALL ;YES,SUPPRESS ALL?
|
||
JRST OUTL03 ;NO
|
||
MOVE AC1,IOFLGS ;[1150] IF SETTING XLIST AFTER OUTPUT
|
||
TLNN IO,IOMAC ;[1160] HAS LINE ALREADY BEEN LISTED?
|
||
TLNN AC1,IOPROG ;[1150] FORCE THE LINE OUT
|
||
JUMPN MRP,OUTLI5 ;[1065] YES,EXIT IF IN MACRO
|
||
LDB C,[XWD 350700,LBUF]
|
||
CAIE C,CR ;FIRST CHAR CR?
|
||
OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING
|
||
OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC
|
||
OUTL02: IOR ER,OUTSW ;FORCE IT.
|
||
IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE
|
||
TSO ER,AC0 ;RE-FLAG THE ERRORS FOR %....X
|
||
TLNN FR,CREFSW ;CREF?
|
||
CALL CLSCRF ;YES, WRITE END OF CREF DATA (177,003)
|
||
MOVE C,TYPERR ;NOW RESTORE FLAGS AS
|
||
ANDI C,ERRORS ;THEY WERE SO TTY LISTING IS
|
||
TDZ ER,C ;WHAT THEY ASKED FOR
|
||
JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS
|
||
TLZE AC0,ERRM ;M ERROR?
|
||
TLO AC0,ERRP ;M ERROR SET - SET P ERROR.
|
||
CALL OUTLER ;PROCESS ERRORS
|
||
|
||
OUTL20: TLNE FR,IOSCR ;[663] GCHAR ERROR TYPEOUT?
|
||
JRST OUTL28 ;[663] YES, SKIP BINARY
|
||
MOVE AC1,STPX
|
||
SKIPN C,ASGBLK
|
||
SKIPE CS,LOCBLK
|
||
CAME AC1,STPY ;ANY CODE GENERATED?
|
||
JRST OUTL23 ;YES, JUMP
|
||
JUMPE C,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS
|
||
ILDB C,TABP ;ASSIGNMENT FALLS THROUGH
|
||
CALL OUTL ;OUTPUT A TAB.
|
||
ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD
|
||
CALL OUTC ;NEXT IS BINARY LISTING FIELD
|
||
IFN FTPSECT,< ;[647]
|
||
SKIPE SGNMAX ;[647] DOING PSECTS?
|
||
JRST [ MOVEI C," " ;[647] DO SPACES INSTEAD
|
||
CALL OUTC ;[647]
|
||
CALL OUTC ;[647]
|
||
CALL OUTC ;[647]
|
||
JRST .+1] ;[647]
|
||
> ;[647]
|
||
IFN POLISH,<
|
||
JUMPL RC,[IBP TABP ;[647] FIX FOR OFF-CENTER FIXUP LISTING
|
||
HRRZI CS,-1 ;[633] OUTPUT 6 ZEROS
|
||
CALL ONC1 ;[633]
|
||
HRRZI CS,-5 ;[633] NO TAB, 6 MORE ZEROS AND #
|
||
CALL ONC1 ;[633]
|
||
JRST OUTL33] ;[717] SKIP SINGLE QUOTE TEST
|
||
>
|
||
HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE
|
||
HLR C,ASGBLK ;[633] GET LEFT HALF RELOCATION
|
||
SKIPL ASGBLK ;SKIP IF LEFT HALF IS NOT RELOC
|
||
TRZA CS,0(C) ;[633]
|
||
TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE
|
||
JRST [ CALL ONC1 ;[647] PRINT LH OF A 36 BIT VALUE IN CS
|
||
IFN FTPSECT,< ;[717]
|
||
SKIPE SGNMAX ;[717]
|
||
IBP TABP ;[717]
|
||
> ;[717]
|
||
JRST OUTL2A] ;[647]
|
||
IFN FTPSECT,< ;[647]
|
||
SKIPN SGNMAX ;[647] DOING PSECT?
|
||
JRST OUTL2A ;[647] NO,
|
||
ILDB C,TABP ;[647] YES, EXTRA TAB
|
||
CALL OUTC ;[647]
|
||
MOVEI C," " ;[647]
|
||
CALL OUTC ;[647]
|
||
> ;[647]
|
||
OUTL2A: HRLO CS,LOCBLK ;[647] PICK UP THE RIGHT (18BIT VALUE)
|
||
MOVE C,ASGBLK ;GET RIGHT HALF RELOCATION
|
||
TRZ CS,0(C)
|
||
CALL ONC ;PRINT IT
|
||
JRST OUTL23 ;SKIP SINGLE QUOTE TEST
|
||
|
||
OUTL22:
|
||
IFN FTPSECT,< ;[717]
|
||
SKIPE SGNMAX ;[717]
|
||
JRST [ ILDB C,TABP ;[717]
|
||
CALL OUTL ;[717]
|
||
CALL ONC1 ;[717]
|
||
JRST .+2] ;[774]
|
||
> ;[717]
|
||
CALL ONC ;TAB TO RH AND PRINT IT
|
||
CALL OUTCSQ ;[717] GO OUTPUT "'"
|
||
OUTL33: ;[717]
|
||
IFN FTPSECT,< ;[717]
|
||
SKIPE SGNMAX ;[717]
|
||
IBP TABP ;[717]
|
||
> ;[717]
|
||
OUTL23:
|
||
MOVE AC1,STPX ;ANY BINARY
|
||
CAMG AC1,STPY
|
||
JRST [ MOVE AC1,NOTFL ;NO,
|
||
CAMN AC1,[-2] ;LAST LINE?
|
||
SETZM NOTFL ;YES, RE-SET TO FIRST
|
||
JRST OUTL29]
|
||
SKIPE INASGN ;[661] SKIP BINARY IF IN ASSIGNMENT
|
||
JRST OUTL29 ;[661]
|
||
MOVSI AC1,(BLOFF)
|
||
ANDCAM AC1,BLSW ;ASSUME WE WANT BINARY LISTING
|
||
SKIPE LITLVL ;IN LITERAL?
|
||
JRST [ SKIPN LITLST ;YES, IS LITLST REQUESTED
|
||
JRST OUTL21 ;NO, GO SUPPRESS BINARY LISTING
|
||
JRST .+1] ;YES,
|
||
SKIPL NOTFL ;NOT THE FIRST LINE?
|
||
JRST OUTL27 ;FIRST LINE, GO OUTPUT BINARY
|
||
MOVE AC1,NOTFL ;NOT FIRST,
|
||
CAMN AC1,[-2] ;LAST LINE?
|
||
SETZM NOTFL ;YES, RE-SET TO FIRST
|
||
MOVSI AC1,(FLBLST) ;NOT FIRST LINE,
|
||
TDNN AC1,BLSW ;FIRST LINE BINARY ONLY REQUESTED?
|
||
JRST OUTL27 ;NO, FLBLST NOT REQUESTED
|
||
OUTL21: MOVSI AC1,(BLOFF) ;YES
|
||
IORM AC1,BLSW ;SUPPRESS BINARY LISTING
|
||
OUTL27: CALL BOUT ;OUTPUT BINARY
|
||
OUTL29: MOVE CS,[POINT 7,LBUF]
|
||
OUTL24: ILDB C,CS
|
||
CAILE C," "
|
||
JRST OUTL28 ;FOUND A PRINTING CHARACTER
|
||
JUMPN C,OUTL24 ;TRY AGAIN UNLESS TERMINAL 0
|
||
SKIPN SEQNO ;SEQUENCE NO. ARE WORTH PRINTING
|
||
JRST OUTL25 ;BUT JUST TABS AREN'T
|
||
OUTL28: MOVE CS,TABP
|
||
CALL OUTASC ;OUTPUT TABS & SEQ. NO.
|
||
OUTL25: MOVEI CS,LBUF
|
||
CALL OUTAS0 ;DUMP THE LINE
|
||
TLNE IO,IOSALL ;SUPPRESSING ALL
|
||
JUMPN MRP,[CALL OUTCR ;YES, CR NOT OTHERWISE PROVIDED
|
||
JRST .+1]
|
||
TLNE FR,IOSCR ;[663] GCHAR ERROR TYPEOUT?
|
||
JRST OUTLI1 ;[663] YES, READY TO CLEAN UP
|
||
SKIPE INASGN ;[774] SKIP BINARY IF IN ASSIGNMENT
|
||
JRST OUTLI ;[774]
|
||
SKIPE LITLVL ;[774] IN NON-LITLSTED LITERAL?
|
||
SKIPE LITLST ;[774]
|
||
JRST .+2 ;[774] NO,
|
||
JRST OUTLI ;[774] YES, CLEAN UP AND EXIT
|
||
OUTL26: MOVE AC1,STPX ;[774] ANY BINARY?
|
||
CAMG AC1,STPY
|
||
JRST OUTLI ;NO, CLEAN UP AND EXIT
|
||
MOVSI AC1,(FLBLST)
|
||
TDNE AC1,BLSW ;FIRST LINE BINARY ONLY?
|
||
JRST [ MOVSI AC1,(BLOFF)
|
||
IORM AC1,BLSW ;YES, SWITCH OFF BINARY
|
||
CALL BOUT ;OUTPUT TO REL ONLY
|
||
JRST OUTL26]
|
||
CALL OUTLI2 ;YES, INITIALIZE FOR NEXT LINE
|
||
TLNN FR,CREFSW ;CREF REQUESTED?
|
||
TLNE IO,IOPROG ;YES, THEN IS XLIST ON?
|
||
JRST .+2 ;CREF NOT BEING PRINTED
|
||
CALL CLSCRF ;CLOSE OUT THIS CREF LINE
|
||
CALL BOUT ;YES, DUMP IT
|
||
CALL OUTCR ;OUTPUT CARRIAGE RETURN
|
||
JRST OUTL26 ;TEST FOR MORE BINARY
|
||
|
||
;HERE ON PASS 1 ONLY
|
||
|
||
OUTL30: CAIN C,FF ;[1004] FORM-FEED?
|
||
CALL OUTFF2 ;[1004] YES, COUNT PAGES FOR PASS1 ERROR
|
||
TLNN FR,IOSCR ;[663] SKIP BOOKKEEPING IF FROM GCHAR
|
||
CALL [AOS CS,STPX ;[663] PASS ONE
|
||
ADDM CS,LOCO ;[663] INCREMENT OUTPUT LOCATION
|
||
JRST STOWI] ;[663] INITIALIZE STOW AND CONTINUE
|
||
TLZ AC0,ERRORS-ERROR1
|
||
JUMPN AC0,OUTL32 ;JUMP IF ERRORS
|
||
OUTL31: TLNE IO,IOSALL ;SUPPRESSING ALL
|
||
JUMPN MRP,CPOPJ ;YES,EXIT
|
||
JRST OUTLI1 ;NO,INIT LINE
|
||
|
||
OUTL32: IDPB AC0,LBUFP ;ZERO TERMINATOR
|
||
IOR ER,OUTSW ;LIST ERRORS
|
||
CALL OUTLER ;OUTPUT TAG AND FLAGS
|
||
CALL OUTTAB
|
||
MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.
|
||
SKIPE SEQNO ;FILE NOT SEQUENCED
|
||
CALL OUTAS0 ;OUTPUT IT
|
||
JRST OUTL25 ;OUTPUT BASIC LINE
|
||
|
||
;OUTPUT ERROR HEADER AND SETUP ERROR FLAG LETTERS
|
||
; AC0/ ERROR FLAGS IN LH (NOTE: NOT RH LIKE ER)
|
||
|
||
OUTLER: PUSH P,ER ;SAVE LISTING SWITCHES FOR LATER
|
||
TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY
|
||
TRZ ER,ERRORS ;SO SUPPRESS ON TTY
|
||
TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY
|
||
MOVE CS,TAG
|
||
CALL OUTSY1
|
||
MOVEI C,"+"
|
||
CALL OUTL
|
||
HRRZ C,TAGINC ;[774] GET OFFSET
|
||
SKIPE LBLFLG ;[774] HAVE WE SEEN LABEL IN LIT?
|
||
SUB C,LTGINC ;[774] YES, GET CORRECT OFFSET FROM IT
|
||
CALL DNC ;[666][576] CONVERT INCREMENT TO DECIMAL
|
||
CALL OUTTAB ;OUTPUT TAB
|
||
MOVE CS,INDIR ;GET FILE NAME
|
||
CAME CS,LSTFIL ;AND SEE IF SAME
|
||
SETOM LSTPGN ;ISN'T, GET IT TYPED
|
||
MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER
|
||
CAMN CS,LSTPGN ;SAME?
|
||
JRST OUTLE8 ;YES, DON'T PRINT AGAIN
|
||
MOVE CS,INDIR ;REMEMBER LAST FILE
|
||
MOVEM CS,LSTFIL
|
||
MOVEI CS,LSTFIL
|
||
CALL OUTSIX ;TYPE FILE NAME
|
||
MOVEI C," "
|
||
CALL OUTL
|
||
MOVE CS,PAGENO ;REMEMBER LAST PAGE NUMBER
|
||
MOVEM CS,LSTPGN
|
||
MOVEI CS,[ASCIZ /PAGE /]
|
||
CALL OUTAS0
|
||
MOVE C,PAGENO
|
||
CALL DNC ;TYPE PAGE NUMBER
|
||
OUTLE8: CALL OUTCR ;CR AFTER TAG AND PAGE
|
||
HLLM ER,(P) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)
|
||
POP P,ER
|
||
MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEMS/]]
|
||
OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC
|
||
JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED
|
||
CAIN C,"Q" ;"Q" ERROR?
|
||
AOSA QERRS ;YES, JUST COUNT AS WARNING
|
||
AOS ERRCNT ;INCREMENT ERROR COUNT
|
||
CALL OUTL ;OUTPUT THE CHARACTER
|
||
OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT
|
||
JUMPN AC0,OUTLE2 ;TEST FOR END
|
||
RET ;EXIT
|
||
|
||
OUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE
|
||
OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE
|
||
TLNE IO,IOSALL ;SUPPRESSING ALL?
|
||
JUMPN MRP,[TLZ FR,IOSCR ;[663] YES, EXIT IF IN MACRO
|
||
PJRST OUTLI5] ;[1065]
|
||
JUMP1 [ CAIN C,FF ;[1004] FORM-FEED?
|
||
CALL OUTFF2 ;[1004] COUNT FOR PASS1 ERROR
|
||
JRST OUTLI1] ;[1004] BYPASS IF PASS ONE
|
||
PUSH P,ER
|
||
TDZ ER,TYPERR
|
||
TLNN IO,IOMSTR!IOPROG!IOMAC
|
||
IOR ER,OUTSW
|
||
PUSH P,C ;OUTPUT IMAGE
|
||
TLNN FR,CREFSW
|
||
CALL CLSCRF
|
||
MOVE CS,TABP
|
||
CALL OUTASC ;OUTPUT TABS
|
||
IDPB C,LBUFP ;STORE ZERO TERMINATOR
|
||
MOVEI CS,LBUF
|
||
CALL OUTAS0 ;OUTPUT THE IMAGE
|
||
TLZN FR,IOSCR ;CRLF SUPPRESS?
|
||
CALL OUTCR ;NO,OUTPUT
|
||
POP P,C
|
||
HLLM ER,0(P)
|
||
POP P,ER
|
||
JRST OUTLI4 ;[774] GO INCREMENT LINE COUNT
|
||
|
||
OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL
|
||
JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO
|
||
TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?
|
||
SKIPN MACLVL ;YES, ARE WE IN MACRO?
|
||
TLZA IO,IOMAC ;NO, CLEAR MAC FLAG
|
||
OUTLI3: TLO IO,IOMAC ;YES, SET FLAG
|
||
|
||
OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW
|
||
TLZ FR,IOSCR ;[663] ZERO IMAGE/CRLF FLAG
|
||
OUTLI4: SKIPN MRP ;[1001] IF EXPANDING, DON'T BUMP OFFSET
|
||
AOS TAGINC ;[774] BUMP OFFSET
|
||
OUTLI2: SKIPE IOFLGS ;[1065] LISTING FLAG TO SET?
|
||
CALL OUTLI5 ;[1065] YES
|
||
MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS
|
||
MOVEM CS,LBUFP
|
||
IFN FORMSW,<MOVE CS,[POINT 7,TABI]
|
||
MOVSS HWFMT ;PUT FLAG IN LEFT HALF
|
||
SKIPGE HWFMT> ;BUT IF ONLY HALF-WORD FORMAT
|
||
MOVE CS,[POINT 7,TABI,6]
|
||
MOVEM CS,TABP
|
||
MOVEI CS,.CPL
|
||
IFN FORMSW,<SKIPL HWFMT ;IF MULTI-FORMAT
|
||
SUBI CS,8 ;LINE IS ONE TAB SHORTER
|
||
MOVSS HWFMT> ;BACK AS IT WAS
|
||
SKIPE SEQNO ;A SEQUENCED FILE?
|
||
SUBI CS,8 ;YES, SEQ NO TAKES UP SPACE
|
||
MOVEM CS,CPLSAV ;[1003] SAVE VALUE FOR FF CHECK
|
||
MOVEM CS,CPL
|
||
MOVSI CS,(ASCII / /)
|
||
SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?
|
||
MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO
|
||
MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR
|
||
SETZM ASGBLK
|
||
SETZM LOCBLK
|
||
RET
|
||
|
||
OUTLI5: JUMP1 CPOPJ ;[1065]
|
||
SKIPGE IOFLGS ;[1065] SETTING LALL UNDER SALL?
|
||
JRST [TLZ IO,IOMAC!IOPALL!IOSALL ;[1065] YES, "SET" FLAGS
|
||
SETZM IOFLGS ;[1065]
|
||
SKIPN CRLFSN ;[1065] NEED CRLF STILL?
|
||
PJRST OUTIM ;[1065] YES
|
||
RET] ;[1065]
|
||
TDO IO,IOFLGS ;[1065] NO, XALL,XLIST,SALL (OR NULL)
|
||
SETZM IOFLGS ;[1065]
|
||
RET ;[1065]
|
||
|
||
OUTIML: JUMP2 [ PUSH P,STPX ;SAVE CURRENT BUFFER VARIABLES
|
||
PUSH P,EXTPNT ;..
|
||
PUSH P,STPY ;..
|
||
MOVE AC0,STPX ;PRINT ONLY LITERALS SINCE
|
||
EXCH AC0,LSTPY ;LAST TIME
|
||
MOVEM AC0,STPY ;..
|
||
CALL OUTLIN ;LIST THE LINE
|
||
POP P,STPY ;RESTORE CURRENT BUFFER VARIABLES
|
||
POP P,EXTPNT ;..
|
||
POP P,STPX ;..
|
||
RET]
|
||
TRNN ER,ERRORS-ERRQ
|
||
TLNE FR,ERRQSW
|
||
TRZ ER,ERRQ
|
||
HRLZ AC0,ER
|
||
TLZ AC0,ERRORS-ERROR1-ERRL+ERRF ;ANY ERRORS TO PRINT ON PASS1?
|
||
CAIN C,FF ;[1004] FORM-FEED?
|
||
CALL OUTFF2 ;[1004] COUNT FOR PASS1 ERROR
|
||
JUMPE AC0,OUTL31 ;[664] NONE
|
||
PUSH P,ER ;SAVE
|
||
PUSH P,C ;SAVE THIS
|
||
TDZ ER,TYPERR
|
||
IOR ER,OUTSW
|
||
CALL OUTLER ;DO NOT FORGET ERRORS
|
||
CALL OUTTAB
|
||
SETZ AC0, ;SET A ZERO TERMINATOR
|
||
IDPB AC0,LBUFP ;IN THE OUTPUT BUFFER
|
||
MOVEI CS,LBUF ;PRINT REST OF LINE
|
||
CALL OUTCR0 ;[664]
|
||
POP P,C
|
||
POP P,ER
|
||
JRST OUTLI1
|
||
SUBTTL OUTPUT ROUTINES
|
||
|
||
UOUT: SETZM UNDCNT ;CLEAR UNDEFINED SYMBOL COUNT
|
||
CALL LOOKUP ;SET FOR TABLE SCAN
|
||
JUMP2 UOUT13 ;[735] GO CHECK FOR TAGS IN LIT
|
||
TRNE ARG,PNTF ;[1222] PNTF SET ON PASS1?
|
||
RET ;[1222] YES - RECYCLE
|
||
UOUT0: TRNE ARG,UNDF ;[1222][735] UNDEFINED
|
||
JRST UOUT0A ;[1222] YES - CHECK FURTHER
|
||
IFN POLISH,< ;[1222]
|
||
JUMP1 UOUT16 ;[1222] MARK PASS1 POLISH AS UNDEFINED
|
||
>; END IFN POLISH ;[1222]
|
||
RET ;[1222] PASS2 AND DEFINED - NEXT
|
||
UOUT0A: JUMP2 UOUT10 ;[1222]
|
||
TLNN IO,IOIOPF ;ANY IOP'S SEEN
|
||
JRST UOUT12 ;NO,MAKE EXTERNAL
|
||
MOVSI CS,PRMTBL-PRMEND ;YES LOOKUP IN TABLE
|
||
UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?
|
||
AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP
|
||
MOVE ARG,PRMTBL+1(CS) ;YES,GET VALUE
|
||
MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE
|
||
RET ;EXIT
|
||
|
||
UOUT2: AOBJN CS,UOUT1 ;TEST FOR END
|
||
UOUT12: TRNE ARG,ENTF ;[735] SEE IF FORWARD DEFINED?
|
||
RET ;[617] YES, DON'T MAKE IT EXTERNAL
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
TRC ARG,LTAGF ;[735] TAG IN LIT?
|
||
TRCN ARG,LTAGF ;[735]
|
||
JRST [ PUSH P,ARG ;[735] YES, SAVE ARG
|
||
CALL EXTRN1 ;[735] SETUP AS IF EXTERNAL
|
||
CALL EXTRN2 ;[735]
|
||
POP P,ARG ;[735]
|
||
MOVSS ARG,ARG ;[735] EXCEPT FLAGS NEED TO BE ADJUSTED
|
||
IORM ARG,(SX) ;[735]
|
||
TRZ FRR,NOUNVS ;[735] CAN SEARCH UNVS AGAIN
|
||
RET] ;[735]
|
||
CALL EXTRN1 ;[1070] SET UP EXTERN
|
||
CALL EXTRN2 ;[1070] INSERT/UPDATE IT
|
||
TRZ FRR,NOUNVS ;[1070] SEARCH UNIVERSALS AGAIN
|
||
MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON
|
||
IORM ARG,(SX) ;SO MESSAGE WILL COME OUT
|
||
RET ;GET NEXT SYMBOL
|
||
|
||
UOUT10: AOS UNDCNT ;INCREMENT UNDEFINED SYMBOL COUNT
|
||
CALL OUTSYM ;OUTPUT THE SYMBOL
|
||
CALL OUTTAB ;THEN A TAB
|
||
MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL@/]
|
||
TRC ARG,P1PF ;[1222] BUT IS IT PASS 1 POLISH?
|
||
TRCN ARG,P1PF ;[1222] INSTEAD OF REGULAR UNDEFINED?
|
||
MOVEI CS,[SIXBIT /NOT FULLY DEFINED IN PASS 1, DEFINED AS IF EXTERNAL@/] ;[1222] YES
|
||
CALL OUTSIX
|
||
JRST OUTCR ;POPJ FOR NEXT SYMBOL
|
||
|
||
;HERE TO UPDATE SYMBOL TABLE TO THE ACTUAL VALUE FOR TAGS IN LITERALS
|
||
;AND CHAIN LOCAL BLOCKS INTO A LIST. A LOCAL BLOCK FORMAT IS CONVERTED:
|
||
|
||
;
|
||
; FROM: VALUE,,FLAGS TO: VALUE,,CHAIN
|
||
; RELOC,,0 JOIN-RELOC,,NXT-LOCAL
|
||
;
|
||
; WHERE JOIN-RELOC IS:
|
||
; BIT16 - RELOC OF CHAIN
|
||
; BIT17 - RELOC OF VALUE
|
||
;
|
||
|
||
UOUT13:
|
||
CHNLOC: TRC ARG,LTAGF ;[735] TAG IN LIT?
|
||
TRCE ARG,LTAGF ;[735]
|
||
JRST UOUT0 ;[735] NO,
|
||
HRRZ V,(SX) ;[735] GET VALUE(PTR TO FIRST PAIR)
|
||
MOVE AC1,1(V) ;[735] GET PTR TO CURRENT LOCAL BLOCK
|
||
TLNE AC1,-1 ;[735] ANYTHING IN LH?
|
||
JRST UOUT0 ;[735] YESILL UNRESOLVED
|
||
IFE FTPSECT,< ;[735]
|
||
SETZ ARG, ;[735] CLEAR INDEX AC
|
||
>
|
||
IFN FTPSECT,< ;[735]
|
||
SKIPN ARG,SGNMAX ;[735] DOING PSECTS?
|
||
JRST UOUT15 ;[735] NO, JUMP
|
||
MOVE ARG,SGNCUR ;[735]
|
||
UOUT14: MOVEM ARG,SGNCUR ;[735]
|
||
CALL SRCHI ;[735] GET PSECT SYMTAB BOUNDARY
|
||
CAMG SX,SGSTOP ;[735] IN THE RANGE?
|
||
CAMGE SX,SGSBOT ;[735]
|
||
AOJA ARG,UOUT14 ;[735] NO, NEXT PSECT SYMTAB
|
||
> ;[735]
|
||
HRRZ AC1,1(V) ;[735] GET LOCAL BLOCK PTR AGAIN
|
||
UOUT15: HLLZ AC2,0(V) ;[735] CHAIN-RELOC IN LH
|
||
LSH AC2,1 ;[735] SHIFT TO LEFT BY 1 ON BIT16
|
||
MOVS AC0,0(AC1) ;[735] GET FLG,,VALUE
|
||
IOR AC0,1(AC1) ;[735] OR IN RELOC WITH FLG,,VALUE
|
||
MOVEM AC0,(SX) ;[735] UPDATE SYMTAB WITH REAL FLG,,V
|
||
HRL AC0,0(V) ;[735] GET CHAIN,,V
|
||
MOVSM AC0,0(AC1) ;[735] SWAP HALVES AND STORE IN WORD1
|
||
HRR AC2,LOCAL(ARG) ;[735] PTR OF PREVIOUS LOCAL IN RH
|
||
ADDM AC2,1(AC1) ;[735] JOIN-RELOC,,NEXT-LOCAL IN WORD2
|
||
MOVEM AC1,LOCAL(ARG) ;[735] UPDATE LOCAL TO CURRENT PAIR
|
||
HLRZ ARG,0(SX) ;[735] REAL FLAGS IN RH
|
||
RET ;[735]
|
||
|
||
IFN POLISH,< ;[1222]
|
||
UOUT16: TRNN ARG,SYMF!OPDF ;[1222] SYMBOL OR OPDEF?
|
||
RET ;[1222] NO - NEXT
|
||
HLRZ CS,RC ;[1222] GET LEFT HAND RELOC
|
||
CAIN CS,377777 ;[1222] PASS1 ONLY POLISH?
|
||
JRST UOUT17 ;[1222] YES - CONVERT TO UNDEFINED
|
||
HRRZ CS,RC ;[1222] RIGHT HAND RELOC
|
||
CAIE CS,377777 ;[1222] PASS1 POLISH?
|
||
RET ;[1222] NO - NEXT SYMBOL
|
||
UOUT17: MOVSI ARG,SPTR ;[1222] CLEAR SPECIAL POINTER
|
||
ANDCAM ARG,(SX) ;[1222] FROM SYMBOL TABLE
|
||
MOVSI ARG,P1PF ;[1222] MARK AS PASS1 ONLY POLISH
|
||
IORM ARG,(SX) ;[1222] UNDF+PNTF+EXTF+MDFF
|
||
HRRZ AC1,(SX) ;[1222] NEW POINTER TO EXTERNAL VALUE
|
||
MOVE ARG,-1(SX) ;[1222] GET SYMBOL NAME
|
||
MOVEM ARG,1(AC1) ;[1222] STORE FOR GLOBAL FIXUPS
|
||
SETZM (AC1) ;[1222] ZERO COUNT
|
||
RET ;[1222] NEXT SYMBOL
|
||
>; END IFN POLISH ;[1222]
|
||
|
||
;OUTPUT THE ENTRIES
|
||
|
||
EOUT: MOVEI C,0 ;INITIALIZE THE COUNT
|
||
MOVE SX,SYMBOL
|
||
MOVE SDEL,0(SX)
|
||
EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END
|
||
ADDI SX,2
|
||
HLRZ ARG,0(SX)
|
||
TRNE ARG,EXTF!SYNF ;[733] DON'T COUNT ILLEGAL ENTRY
|
||
JRST EOUT1 ;[733]
|
||
ANDCAI ARG,SYMF!INTF!ENTF
|
||
JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT
|
||
AOJA C,EOUT1 ;BUMP COUNT
|
||
|
||
EOUT2:
|
||
;(REMOVED) JUMPE C,CPOPJ ;[765] DON'T GENERATE EMPTY ENTRY BLOCK
|
||
HRLI C,4 ;BLOCK TYPE 4
|
||
CALL OUTBIN
|
||
SETZB C,ARG
|
||
CALL OUTBIN
|
||
MOVE SX,SYMBOL
|
||
MOVE SDEL,0(SX)
|
||
MOVEI V,^D18
|
||
|
||
EOUT3: SOJL SDEL,CPOPJ ;[664]
|
||
ADDI SX,2
|
||
HLRZ C,0(SX)
|
||
TRNE C,EXTF!SYNF ;[761][733] DON'T OUTPUT ILLEGAL ENTRY
|
||
JRST EOUT3 ;[733]
|
||
ANDCAI C,SYMF!INTF!ENTF
|
||
JUMPN C,EOUT3
|
||
SOJGE V,EOUT4 ;TEST END OF BLOCK
|
||
CALL OUTBIN
|
||
MOVEI V,^D17 ;WFW
|
||
EOUT4: MOVE AC0,-1(SX)
|
||
CALL SQOZE
|
||
MOVE C,AC0
|
||
CALL OUTBIN
|
||
JRST EOUT3
|
||
|
||
;HERE TO GENERATE BLOCK-10 FROM CHAIN LOCAL BLOCKS HAVING THE FORMAT:
|
||
;
|
||
; VALUE,,CHAIN-VALUE
|
||
; JOIN-RELOC,,NXT-LOCAL
|
||
;
|
||
LSOUT:
|
||
IFE FTPSECT,< ;[735]
|
||
SETZ AC1, ;[735] CLEAR INDEX AC
|
||
> ;[735]
|
||
IFN FTPSECT,< ;[735]
|
||
MOVE AC1,SGNCUR ;[735] ONLY FOR CURRENT PSECT
|
||
> ;[735]
|
||
SKIPN C,LOCAL(AC1) ;[725] ANY LOCAL FIXUPS REQUIRED?
|
||
RET ;NO
|
||
MOVS AC0,(C) ;GET VALUE RIGHT WAY ROUND
|
||
MOVS RC,1(C) ;AND RELOCATION
|
||
HLRZM RC,LOCAL(AC1) ;[735] STORE NEXT POINTER
|
||
CALL COUT ;OUTPUT THIS WORD
|
||
JRST LSOUT ;LOOK FOR MORE
|
||
|
||
;OUTPUT THE SYMBOLS
|
||
SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN
|
||
TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?
|
||
JRST SOUT2 ;NO
|
||
MOVEI [ASCIZ /SYMBOL TABLE/]
|
||
HRRM SUBTTX ;SET NEW SUB-TITLE
|
||
MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE
|
||
TRNE ER,TTYSW ;IS TTY LISTING DEVICE?
|
||
MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS
|
||
MOVEM ARG,NCOLLS ;STORE ANSWER
|
||
IFE FTPSECT,< ;[575]
|
||
MOVE SX,SYMBOL ;START OF TABLE
|
||
MOVE SDEL,(SX) ;COUNT OF SYMBOLS
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE SX,SGSBOT ;START OF TABLE
|
||
MOVE SDEL,SGNCUR ;CUR PSECT INX
|
||
JUMPE SDEL,SOUTBS ;IS THIS THE BLANK PSECT?
|
||
MOVE ARG,[XWD SGTTLB,SGLIST]
|
||
BLT ARG,SGTTLE-SGTTLB+SGLIST-1 ;MOVE SUBTTL
|
||
MOVE AC1,SGTTLE ;'TO' POINTER
|
||
MOVE AC2,SGTTLF ;'FROM' POINTER
|
||
SGTTLL: ILDB AC0,AC2 ;GET A SIXBIT CHAR
|
||
ADDI AC0,40 ;FORM ASCII
|
||
IDPB AC0,AC1 ;PUT IN SUBTTL
|
||
TLNE AC2,770000 ;DONE SIX CHARS?
|
||
JRST SGTTLL ;NOT DONE YET
|
||
SETZ AC0, ;TERMINATE SUBTTL
|
||
IDPB AC0,AC1 ;WITH NULL BYTE
|
||
MOVEI AC0,SGLIST ;POINTER TO
|
||
HRRM AC0,SUBTTX ;NEW SUBTTL
|
||
SOUTBS: HRRZ SDEL,SGSCNT(SDEL) ;COUNT OF SYMBOLS
|
||
> ;END OF FTPSECT
|
||
ADDI SX,2 ;SKIP COUNT
|
||
MOVEM SX,SXSV ;SAVE PLACE
|
||
MOVEM SDEL,SDELSV
|
||
MOVE SX,PAGEN. ;GET LAST PAGE-OFFSET
|
||
MOVEM SX,SPAGN. ;AND SAVE IN CASE PRGEND
|
||
MOVE SX,SPAGNO ;GET LAST SYMBOL PAGE NUMBER
|
||
EXCH SX,PAGENO ;SWAP WITH OUTPUT PAGE NUMBER
|
||
MOVEM SX,SPAGNO ;AND STORE IT
|
||
MOVE SX,[BYTE (7) 0,0,<"S">,<"-">,0]
|
||
IORM SX,DBUF+4 ;FIXUP TITLE
|
||
|
||
SOUT0: CALL SOUTP ;GET PAGE SET UP
|
||
JRST SOUT1 ;NOTHING TO OUTPUT
|
||
CALL SOUTF ;DUMP ONE PAGE
|
||
JRST SOUT1 ;DIDN'T FILL PAGE-DONE
|
||
JRST SOUT0
|
||
|
||
IFN FTPSECT,< ;[575]
|
||
SGTTLB: ASCII /SYMBOL TABLE FOR PSECT /
|
||
SGTTLE: POINT 7,SGTTLE-SGTTLB+SGLIST
|
||
SGTTLF: POINT 6,SGNAME(SDEL)
|
||
>
|
||
|
||
SOUTT: MOVE ARG,(SX) ;GET FLAGS
|
||
TLNE ARG,SUPRBT ;SURPRESSED?
|
||
RET ;YES
|
||
TLNN ARG,SYMF ;SYMBOL IS OK
|
||
TLNN ARG,SYNF!MACF ;BUT MACRO OR SYNONYM AREN'T
|
||
AOS (P)
|
||
RET
|
||
SOUTP: MOVE AC1,NCOLLS ;GET COLUMN COUNT
|
||
MOVE SX,SXSV ;GET POSITION
|
||
MOVE SDEL,SDELSV ;AND COUNT
|
||
|
||
SOUTP0: MOVEM SX,SYMBLK(AC1)
|
||
HRLM SDEL,SYMBLK(AC1) ;SAVE IN TABLE
|
||
MOVE AC0,..LPP ;LINE COUNT
|
||
|
||
SOUTP1: JUMPE SDEL,SOUTP2 ;IF NONE LEFT, GO ELSEWHERE
|
||
CALL SOUTT ;SYMBOL OK?
|
||
TDZA RC,RC ;NO
|
||
SETO RC, ;YES
|
||
ADDI SX,2 ;SET UP FOR NEXT NOW
|
||
SUBI SDEL,1
|
||
JUMPGE RC,SOUTP1 ;SKIP SYMBOL
|
||
SOJG AC0,SOUTP1 ;COUNT IN SYMBOL
|
||
SOJG AC1,SOUTP0 ;START NEXT COLUMN
|
||
MOVEM SX,SXSV ;SAVE POSITION
|
||
MOVEM SDEL,SDELSV
|
||
JRST CPOPJ1 ;[664] SKIP EXIT
|
||
|
||
SOUTP2: CLEARM SDELSV ;FLAG DONE
|
||
CAME AC1,NCOLLS ;IF ON 1ST COLUMN
|
||
JRST .+3
|
||
CAMN AC0,..LPP ;AND FIRST LINE
|
||
RET ;THEN SKIP PRINTING
|
||
SOJLE AC1,CPOPJ1 ;ALREADY GOT THIS LINE
|
||
CLEARM SYMBLK(AC1)
|
||
SOJG AC1,.-1 ;ZERO ALL OTHERS
|
||
JRST CPOPJ1
|
||
SOUTF: CALL OUTFF ;GET TO TOP OF PAGE
|
||
MOVE AC1,..LPP
|
||
MOVEM AC1,COLSIZ
|
||
|
||
SOUTF1: CALL SOUTL ;DUMP ONE LINE
|
||
RET ;WAS BLANK
|
||
SOSLE COLSIZ ;ONE MORE DONE
|
||
JRST SOUTF1 ;MORE TO GO
|
||
SOUTF2: JRST CPOPJ1
|
||
|
||
SOUTL: MOVE AC1,NCOLLS ;SET COLUME COUNT
|
||
SOUTL0: HRRZ SX,SYMBLK(AC1)
|
||
HLRZ SDEL,SYMBLK(AC1);GET POSITION IN TABLE
|
||
JUMPE SDEL,SOUTL3 ;NOTHING THERE
|
||
|
||
SOUTL1: CALL SOUTT ;SYMBLE PRINTABLE?
|
||
JRST SOUTL2 ;CENCOR!!
|
||
CALL SOUTE ;DUMP OUT ENTRY
|
||
ADDI SX,2
|
||
SUBI SDEL,1 ;UP TP NEXT ONE
|
||
HRL SX,SDEL ;SAVE OUR PLACE
|
||
MOVEM SX,SYMBLK(AC1)
|
||
SOJG AC1,SOUTL0 ;NEXT!
|
||
AOS (P)
|
||
JRST OUTCR ;POLISH OFF LINE
|
||
|
||
SOUTL2: ADDI SX,2
|
||
SOJG SDEL,SOUTL1 ;KEEP SEARCHING
|
||
SOUTL3: CAME AC1,NCOLLS ;BLANK LINE?
|
||
AOS (P) ;NO
|
||
JRST OUTCR
|
||
SOUTE: MOVE AC0,-1(SX)
|
||
CALL OUTSYM ;DUMP SYMBOL OUT
|
||
CALL OUTTAB ;THEN A TAB
|
||
CALL SRCH7 ;GET VALUE
|
||
JUMPL RC,[HRRZI CS,-1 ;[633] IF POLISH, OUTPUT 6 ZEROS
|
||
CALL ONC1 ;[633]
|
||
HRRZI CS,-5 ;[633] NO TAB, 6 MORE ZEROS, AND #
|
||
CALL ONC1 ;[633]
|
||
CALL OUTTAB ;[633] A TAB
|
||
MOVEI CS,[ASCII\pol\] ;[633] SYMBOL TYPE
|
||
CALL OUTAS0 ;[633]
|
||
JRST OUTTAB] ;[633] LAST TAB
|
||
TLNN ARG,EXTF ;EXTERNAL?
|
||
JRST .+5
|
||
HLRZ RC,V ;YES, NEED FIXUP
|
||
TRNE RC,-2
|
||
MOVS RC,(RC)
|
||
HLL V,RC
|
||
|
||
HLLO CS,V
|
||
TLNE RC,-1
|
||
TRZ CS,1
|
||
TLNE RC,-2
|
||
TRZ CS,EXTF
|
||
TLNN V,-1
|
||
TLNE RC,-1
|
||
CALL ONC1
|
||
CALL OUTTAB
|
||
HRLO CS,V
|
||
TRNE RC,-1
|
||
TRZ CS,1
|
||
TRNE RC,-2
|
||
TRZ CS,EXTF
|
||
CALL ONC1
|
||
CALL OUTTAB ;AND TAB, OF COURSE
|
||
CALL SOUTE8 ;ABBREVIATION FOR TYPE
|
||
JRST OUTTAB ;FINAL TAB
|
||
|
||
SOUTE8: TLNN ARG,INTF!EXTF!ENTF!UNDF!NOOUTF
|
||
RET ;SKIP JUNK FOR SIMPLE STUFF
|
||
SETZ CS,
|
||
TLNE ARG,INTF ;INTERNAL
|
||
MOVEI CS,1
|
||
TLNE ARG,EXTF ;EXTERNAL
|
||
MOVEI CS,-1
|
||
TLNE ARG,ENTF ;ENTRY
|
||
MOVEI CS,-5
|
||
TLNE ARG,NOOUTF ;DDT SURPRESSED
|
||
ADDI CS,3
|
||
TLNE ARG,UNDF ;UNDEFINED
|
||
MOVEI CS,-3 ;SET FOR UDF
|
||
MOVEI CS,SOUTC(CS) ;GET ABREVIATION
|
||
JRST OUTAS0
|
||
|
||
SOUT1: MOVE SX,PAGENO ;GET LAST SYMBOL PAGE NUMBER
|
||
EXCH SX,SPAGNO ;SWAP WITH OUTPUT PAGE NUMBER
|
||
MOVEM SX,PAGENO ;AND STORE IT
|
||
MOVE SX,[BYTE (7) 0,0,<"S">,<"-">,0]
|
||
ANDCAM SX,DBUF+4 ;FIXUP TITLE
|
||
SOUT2: CALL SGLKUP ;SET FOR TABLE SCAN
|
||
TRNN ARG,SYMF
|
||
TRNN ARG,MACF!SYNF
|
||
TDZA MRP,MRP ;SKIP AND CLEAR MRP
|
||
RET ;NO, TRY AGAIN
|
||
TRNE ARG,INTF
|
||
MOVEI MRP,1
|
||
TRNE ARG,EXTF
|
||
MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
|
||
TRNE ARG,SYNF ;SYNONYM?
|
||
JUMPL MRP,CPOPJ ;[664] YES, DON'T OUTPUT IF EXTERNAL
|
||
TRNE ARG,SUPRBT ;IF SUPRESSED
|
||
RET ;DO NOT OUTPUT
|
||
JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL
|
||
HLRZ RC,V ;PUT POINTER/FLAGS IN RC
|
||
TRNE RC,-2 ;POINTER?
|
||
MOVS RC,0(RC) ;YES
|
||
HLL V,RC ;STORE LEFT VALUE
|
||
|
||
SOUT10: PUSH P,RC ;SAVE FOR LATER
|
||
MOVEI AC1,0
|
||
JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF INTERN=EXTERN
|
||
IFN POLISH,<
|
||
JUMPL RC,SOUT11 ;[1226] IF POLISH, ONLY SET RHS FIXUP FLAG
|
||
>; END IFN POLISH ;[1226]
|
||
TLNE RC,-2 ;[1226] LEFT HALF FIXUP?
|
||
IORI AC1,30 ;[1226] SET NEW BITS
|
||
SOUT11: TRNE RC,-2 ;[1226] RIGHT HALF FIXUP?
|
||
IORI AC1,24 ;[1226] YES - NEW BITS
|
||
SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
|
||
HRRZS RC
|
||
TRNE RC,-2
|
||
HLLZS RC
|
||
TLZE RC,-1
|
||
TRO RC,2
|
||
HRL MRP,RC
|
||
MOVEI RC,0
|
||
TRNE ARG,UNDF ;[1226] UNDEFINED?
|
||
JRST [HRRI MRP,2 ;[1226] YES - PICK OFFSET
|
||
JRST SOUT16] ;[1226] SKIP AHEAD
|
||
JUMPN AC1,[TRNE ARG,NOOUTF ;[1226] INTERN=EXTERN - CHECK DDT SUPPRESS
|
||
IORI AC1,40 ;[1226] SET ONE MORE BIT
|
||
JRST SOUT17] ;[1226] AND FORGET TABLE BITS
|
||
TRNE ARG,ENTF ;ENTRY DMN
|
||
HRRI MRP,-5
|
||
TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
|
||
JRST [PUSH P,MRP ;[1174] SAVE WHAT WE HAVE SO FAR
|
||
ADDI MRP,3 ;[1174] YES WFW
|
||
HLL MRP,0(P) ;[1174] GET THE RELOC BITS BACK
|
||
POP P,0(P) ;[1174] GET JUNK OFF THE STACK
|
||
JRST .+1] ;[1174] AND CONTINUE
|
||
SOUT16: IOR AC1,SOUTC(MRP) ;[1226] GET BITS FROM TABLE
|
||
SOUT17: MOVE ARG,AC1 ;[1226] MOVE BITS FOR SQUOZE
|
||
CALL NOUT2 ;SQUOZE AND DUMP THE SYMBOL
|
||
MOVEM AC0,SVSYM ;SAVE IT
|
||
MOVE AC0,V ;GET THE VALUE
|
||
HLRZ RC,MRP ;AND THE RELOCATION
|
||
CALL COUT
|
||
POP P,RC ;GET BACK RELOC AND CHECK EXTERNAL
|
||
TRNN RC,-2 ;IS IT?
|
||
JRST SOUT50 ;NO
|
||
IFN POLISH,<
|
||
JUMPL RC,SOUT70 ;SPECIAL POLISH SYMBOL FIXUP
|
||
>
|
||
MOVE AC0,1(RC) ;GET NAME
|
||
MOVEI ARG,60 ;EXTERNAL REQ
|
||
CALL SQOZE
|
||
HLLZS RC ;NO RELOC
|
||
CALL COUT ;OUTPUT IT
|
||
MOVE AC0,SVSYM ;GET SYMBOL NAME
|
||
TLO AC0,500000 ;SET AS ADDITIVE SYMBOL
|
||
TLZ AC0,240000 ;[1226] BUT NOT LEFT HALF ETC
|
||
CALL COUT
|
||
SOUT50: MOVSS RC ;CHECK LEFT HALF
|
||
TRNN RC,-2
|
||
RET
|
||
MOVE AC0,1(RC)
|
||
MOVEI ARG,60
|
||
CALL SQOZE
|
||
MOVEI RC,0
|
||
CALL COUT
|
||
MOVE AC0,SVSYM
|
||
TLO AC0,700000
|
||
TLZ AC0,040000 ;[1226] CLEAR EXTRA BIT
|
||
JRST COUT
|
||
|
||
IFN POLISH,<
|
||
SOUT70: CALL COUTD ;DUMP CURRENT BLOCK
|
||
PUSH P,SYMBOL ;SAVE CURRENT SYMBOL TABLE ORIGIN
|
||
PUSH P,FREE ;SAVE FREE STORAGE ORIGIN
|
||
PUSH P,BLKTYP ;SAVE CURRENT BLOCK TYPE
|
||
MOVEI AC0,11 ;SET TO POLISH
|
||
MOVEM AC0,BLKTYP
|
||
PUSH P,POLIST ;SAVE REAL LIST
|
||
SETZM POLIST ;INITIALIZE
|
||
SKIPE (RC)
|
||
JFCL
|
||
MOVNI AC0,3 ;ASSUME FULL WORD FIXUP
|
||
MOVEM AC0,POLTYP
|
||
MOVE AC0,SVSYM ;RADIX-50 SYMBOL
|
||
TLZ AC0,740000 ;CLEAR CODE BITS
|
||
MOVEM AC0,INASGN ;FLAG SYMBOL FIXUP
|
||
CALL POLSYM ;NOW CONVERT
|
||
CALL POUT ;DUMP THIS BLOCK
|
||
CALL COUTD ;FORCE BLOCK OUT
|
||
MOVSI AC0,(POINT 2) ;RESET BYTE FIELD
|
||
HLLM AC0,COUTP
|
||
POP P,POLIST ;PUT LIST BACK
|
||
POP P,BLKTYP ;PREVIOUS BLOCK TYPE
|
||
POP P,FREE ;GIVE BACK FREE STG USED BY POLSYM
|
||
POP P,AC0 ;RECOVER SYMTAB ORIGIN
|
||
SUB AC0,SYMBOL ;COMPUTE DIFFERENCE IN CASE SYMTAB MOVED
|
||
SUB SX,AC0 ;ADJUST LOCAL PTR ACCORDINGLY
|
||
RET
|
||
>
|
||
|
||
<ASCII /ent/>!04 ;DMN
|
||
0
|
||
<ASCII /udf/>!60 ;UNDEFINED EXTERNAL
|
||
<ASCII /sen/>!44 ;SUPRESSED ENTRY
|
||
<ASCII /ext/>!60
|
||
SOUTC: EXP 10
|
||
<ASCII /int/>!04
|
||
<ASCII /sex/>!60 ;SUPPRESSED EXTERNAL (NOT USED YET)
|
||
<ASCII /spd/>!50
|
||
<ASCII /sin/>!44 ;DMN
|
||
|
||
;OUTPUT THE BINARY
|
||
BOUT: HRRZ CS,LOCA ;PICKUP THE LOCATION
|
||
SUB CS,STPX ;MINUS START
|
||
ADD CS,STPY ;PLUS END
|
||
HRLO CS,CS ;TO GET ASSEMBLY LOCATION
|
||
SKIPGE BLSW ;BINARY LISTING OFF?
|
||
JRST BOUT1 ;YES
|
||
ILDB C,TABP ;DO A TAB
|
||
CALL OUTL
|
||
SKIPLE LITLVL ;IN LITERAL?
|
||
JRST BOUT1 ;YES, DON'T LIST LOCATION
|
||
CALL ONC1 ;OUTPUT IT TO THE LISTING FILE
|
||
CALL OUTCSQ ;[717] GO OUTPUT "'"
|
||
BOUT1: CALL DSTOW ;GET THE CODE
|
||
IFN POLISH,<
|
||
CALL DSTWRC ;[1220] FIX POLISH RELOCATION
|
||
JUMPL RC,[SETZ RC, ;[1220] CLEAR IF STILL POLISH
|
||
TRO FRR,FWPSW ;[1220] MUST BE FULLWORD
|
||
JRST .+1] ;[1220]
|
||
TRNE FRR,LHPSW!RHPSW!FWPSW ;[1220] LISTING TO SHOW POLISH?
|
||
TLO FR,POLSW ;[1220] YES
|
||
TRNE FRR,FWPSW ;[1220] FULLWORD MEANS
|
||
TRO FRR,LHPSW!RHPSW ;[1220] BOTH HALFWORDS
|
||
>
|
||
PUSH P,RC ;SAVE RELOC
|
||
PUSH P,RC ;AND AGAIN
|
||
TLNE RC,-2 ;CHECK LEFT EXTERNAL
|
||
HRRZS RC ;MAKE LEFT NON-RELOC
|
||
SKIPG LITLVL ;NOT IN LITERAL?
|
||
TRNN RC,-2 ;RIGHT EXT?
|
||
JRST BOUT30 ;NO
|
||
HRRZ AC1,AC0 ;YES
|
||
JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE
|
||
HLLZS RC ;MAKE NON-RELOC
|
||
JRST BOUT30 ;PROCESS
|
||
|
||
|
||
BOUT20: HRRM AC1,-1(P) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
|
||
HRR AC0,0(RC) ;NO, SET ADDRESS LINK
|
||
MOVE AC1,LOCO ;GET CURRENT LOCATION
|
||
HRRM AC1,0(RC) ;SET NEW LINK
|
||
HLRZ AC1,0(RC) ;GET FLAGS/POINTER
|
||
;[604] TRNN AC1,-2 ;POINTER?
|
||
HRR AC1,RC ;NO, SET TO FLAGS
|
||
HLR RC,0(AC1) ;PUT FLAGS IN RC
|
||
HRL AC1,MODO ;GET CURRENT MODE
|
||
TRZE RC,-2 ;LEFT HALF RELOCATABLE+
|
||
TLO AC1,2 ;YES, SET FLAG
|
||
HLLM AC1,0(AC1) ;STORE NEW FLAGS
|
||
BOUT30: HLLO CS,AC0
|
||
TLZE RC,1 ;PACK RELOCATION BITS
|
||
TRO RC,2
|
||
TRNE RC,2 ;LEFT HALF RELOCATABLE?
|
||
TRZ CS,1 ;YES, RESET BIT
|
||
SKIPGE BLSW ;BINARY LISTING OFF?
|
||
JRST BOUT3I ;YES
|
||
PUSH P,AC0 ;NEED AN AC
|
||
HLRZ AC0,-1(P) ;AC0 = LEFT RELOCATION
|
||
CAILE AC0,1 ;EXTERNAL?
|
||
XORI CS,EXTF!1 ;YES, SET SWITCH
|
||
|
||
IFN FORMSW,<
|
||
OR AC0,HWFMT
|
||
JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0
|
||
MOVE AC0,FORM ;GET FORM WORD
|
||
MOVEI C,0 ;ZERO FIELD SIZE
|
||
IFN FTPSECT,< ;[1207]
|
||
SKIPE SGNMAX ;[1207] LISTING WITH PSECTS?
|
||
MOVEI C,3 ;[1207] YES - ACCOUNT FOR EXTRA CHARACTERS
|
||
> ;[1207]
|
||
BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1
|
||
JRST BOUT3C ;NO FIELDS LEFT, JUMP
|
||
BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
|
||
MOVEI AC1,6(AC1)
|
||
IDIVI AC1,3 ;AC1 = COLUMNS USED + 1
|
||
ADDI C,(AC1) ;INCREMENT FIELD SIZE
|
||
CAIG C,^D23 ;IS FIELD SIZE GTR 23?
|
||
JRST BOUT3A ;NO. CONTINUE
|
||
MOVE AC1,HWFORM ;USE STANDARD FORM
|
||
MOVEM AC1,FORM
|
||
MOVEI C,^D13 ;SET FIELD SIZE TO 13
|
||
BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE
|
||
MOVE AC0,FORM ;AC0 = FORM WORD
|
||
TRNN RC,2 ;IS LEFT HALF RELOCATED?
|
||
CAMN AC0,HWFORM ;NO. IS FORM HALF WORD?
|
||
JRST BOUT3H ;YES. EDIT IN OLD WAY
|
||
IBP TABP
|
||
CAIL C,^D16
|
||
IBP TABP
|
||
IFN FTPSECT,< ;[647]
|
||
SKIPE SGNMAX ;[647] DOING PSECTS?
|
||
JRST [ CAIL C,^D24 ;[1207]
|
||
IBP TABP ;[717]
|
||
MOVEI C," " ;[647] USE 2 SPACES INSTEAD OF A TAB
|
||
CALL OUTC ;[647]
|
||
CALL OUTC ;[647]
|
||
IBP TABP ;[647]
|
||
JRST BOUT01] ;[647]
|
||
> ;[647]
|
||
ILDB C,TABP ;GET A TAB
|
||
CALL OUTL ;OUTPUT IT
|
||
BOUT01: MOVE AC2,(P) ;[647] AC2 = INFO TO BE EDITED
|
||
PUSH P,CS ;SAVE CS = C+1
|
||
BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1
|
||
BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
|
||
MOVEI C,3(AC1)
|
||
MOVEI AC1,0
|
||
LSHC AC1,-2(C) ;AC1 = FIELD INFO
|
||
IDIVI C,3 ;C = # OF OCTAL DIGITS
|
||
MOVE C+1,AC0 ;SAVE AC0
|
||
SKIPE IOSEEN ;IS THIS A I/O INST.
|
||
CALL BOUT3J ;YES,SET FIELDS CORRECTLY
|
||
MOVNS C
|
||
ROT AC1,(C)
|
||
ROT AC1,(C)
|
||
ROT AC1,(C)
|
||
MOVNS C
|
||
BOUT3F: MOVEI AC0,6 ;EDIT A DIGIT
|
||
LSHC AC0,3
|
||
EXCH AC0,C
|
||
CALL OUTC ;OUTPUT IT
|
||
MOVE C,AC0
|
||
SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK
|
||
JUMPE C+1,BOUT3G ;JUMP IF END OF WORD
|
||
MOVE AC0,C+1 ;RESTORE AC0
|
||
MOVEI C," "
|
||
CALL OUTC ;OUTPUT A SPACE
|
||
JRST BOUT3D ;PROCESS NEXT FIELD
|
||
|
||
|
||
BOUT3G: POP P,CS ;RESTORE CS = C+1
|
||
MOVEI C," "
|
||
TRNE RC,1 ;RELOCATABLE?
|
||
MOVEI C,"'" ;YES
|
||
HRRZ AC0,-1(P) ;AC0 = RIGHT RELOCATION
|
||
CAILE AC0,1 ;EXTERNAL?
|
||
MOVEI C,"*" ;YES
|
||
TLNE FR,POLSW ;POLISH?
|
||
MOVEI C,"#" ;YES,
|
||
CALL ONC2 ;STORE POSSIBLE INDICATOR
|
||
POP P,AC0
|
||
JRST BOUT3I ;CONTINUE
|
||
|
||
BOUT3H:
|
||
IFN FTPSECT,< ;[717]
|
||
SKIPE SGNMAX ;[717]
|
||
IBP TABP ;[717]
|
||
> ;[717]
|
||
MOVEI C,^D15 ;SET SIZE TO 15
|
||
MOVEM C,FLDSIZ
|
||
SETZM IOSEEN ;CLEAR IN CASE HWFMT WAS SET
|
||
>
|
||
POP P,AC0 ;RESTORE
|
||
IFN POLISH,<
|
||
TRZE FRR,LHPSW ;[614] LEFT HALF POLISH?
|
||
HRRI CS,-5 ;[614] YES, WE WANT A "#"
|
||
>
|
||
CALL ONC
|
||
HRLO CS,AC0
|
||
TDZ CS,RC ;SET RELOCATION
|
||
HRRZ C,(P) ;C = RIGHT RELOCATION
|
||
CAILE C,1 ;EXTERNAL
|
||
XORI CS,EXTF!1 ;YES, SET SWITCH
|
||
IFN POLISH,<
|
||
TRZE FRR,RHPSW ;[614] RIGHT HALF POLISH?
|
||
HRRI CS,-5 ;[614] YES, MAKE SURE WE GET "#"
|
||
>
|
||
CALL ONC
|
||
BOUT3I: POP P,CS ;GET RID OF ENTRY ON STACK
|
||
SKIPLE LITLVL ;IN LITERAL?
|
||
JRST [ POP P,RC ;YES, CLEAR STACK
|
||
RET] ;DON'T OUTPUT TO REL
|
||
HRRZ CS,LOCO
|
||
TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?
|
||
JRST ROUT ;YES, GO PROCESS
|
||
HRL CS,MODO
|
||
CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?
|
||
CALL COUTD ;YES, DUMP THE BUFFER
|
||
SKIPL COUTX ;NEW BUFFER?
|
||
JRST BOUT40 ;NO, STORE CODE AND EXIT
|
||
MOVEM CS,MODLOC ;YES, STORE NEW VALUES
|
||
EXCH AC0,LOCO
|
||
EXCH RC,MODO
|
||
CALL COUT ;STORE BLOCK LOCATION AND MODE
|
||
EXCH RC,MODO ;RESTORE CURRENT VALUES
|
||
EXCH AC0,LOCO
|
||
|
||
BOUT40: CALL COUT ;EMIT CODE
|
||
POP P,RC ;RETRIEVE EXTERNAL BITS
|
||
TRNN RC,-2 ;RIGHT EXTERNAL?
|
||
JRST BOUT50 ;TRY FOR LEFT
|
||
CALL COUTD
|
||
PUSH P,BLKTYP ;TERMINATE TYPE AND SAVE
|
||
MOVEI AC0,2 ;BLOCK TYPE 2
|
||
MOVEM AC0,BLKTYP
|
||
MOVE AC0,1(RC) ;GET SYMBOL
|
||
MOVEI ARG,60 ;CODE BITS
|
||
CALL SQOZE ;CONVERT TO RADIX 50
|
||
HLLZS RC ;SYMBOL HAS NO RELOCATION
|
||
CALL COUT ;EMIT
|
||
MOVE AC0,LOCO ;GET CURRENT LOC
|
||
HRLI AC0,400000 ;ADDITIVE REQ
|
||
HRR RC,MODO ;CURRENT MODE
|
||
CALL COUT ;EMIT
|
||
MOVSS RC ;NOW FOR LEFT
|
||
TRNN RC,-2
|
||
JRST BOUT60
|
||
JRST BOUT70
|
||
|
||
BOUT50: MOVSS RC ;CHECK OTHER HALF
|
||
TRNN RC,-2 ;LEFT HALF EXTERNAL?
|
||
JRST BOUT80 ;NO, FALSE ALARM
|
||
CALL COUTD ;CHANGE MODE
|
||
PUSH P,BLKTYP
|
||
MOVEI AC0,2
|
||
MOVEM AC0,BLKTYP
|
||
BOUT70: MOVE AC0,1(RC)
|
||
TLNN AC0,-1 ;[735] EXTERNAL NAME?
|
||
JRST [ MOVEI AC0,10 ;[735] NO, LH=0 MUST BE PTR TO LOCAL BLK
|
||
MOVEM AC0,BLKTYP ;[735] GENERATE A BLOCK 10
|
||
MOVE ARG,RC ;[735]
|
||
SETZ RC, ;[735]
|
||
SETO AC0, ;[735]
|
||
CALL COUT ;[735] OUTPUT -1 FOR LEFT
|
||
MOVE AC1,1(ARG) ;[735] GET LOCAL BLK PTR
|
||
HLRZ AC0,0(AC1) ;[735] VALUE IN RH
|
||
HRL AC0,LOCO ;[735] FIXUP ADDR IN LH
|
||
MOVE RC,MODO ;[735] FIXUP RELOC
|
||
LSH RC,1 ;[735] SHIFT ONE
|
||
MOVS ARG,1(AC1) ;[735] GET RELOC IN RH
|
||
ADD RC,ARG ;[735] MAKE IT JOIN-RELOC
|
||
CALL COUT ;[735] EMIT
|
||
JRST BOUT60] ;[735]
|
||
MOVEI ARG,60
|
||
CALL SQOZE
|
||
HLLZS RC
|
||
CALL COUT
|
||
MOVE AC0,LOCO
|
||
HRLI AC0,600000 ;LEFT HALF ADD
|
||
HRR RC,MODO
|
||
CALL COUT ;EMIT
|
||
BOUT60: CALL COUTD ;CHANGE MODE
|
||
POP P,BLKTYP ;TO OLD ONE
|
||
BOUT80: AOS LOCO
|
||
AOS MODLOC
|
||
IFN POLISH,< TLZ FR,POLSW ;[761]
|
||
TRZ FRR,LTGSW!LHPSW!RHPSW!FWPSW> ;[761]
|
||
RET
|
||
|
||
IFN FORMSW,<
|
||
BOUT3J: MOVSS IOSEEN ;SWAP
|
||
SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD
|
||
JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF
|
||
RET] ;AND RETURN
|
||
MOVSS IOSEEN ;SWAP BACK
|
||
LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE
|
||
CAIE C,1 ;IS IT OP CODE?
|
||
RET ;NO,JUST RETURN
|
||
MOVEI C,2 ;TWO CHAR. WIDE NOW
|
||
SETZM IOSEEN ;DON'T COME AGAIN
|
||
IFN FTPSECT,< ;[1207]
|
||
SKIPE SGNMAX ;[1207] LISTING PSECTS?
|
||
IBP TABP ;[1207] YES, AVOID TAB
|
||
> ;[1207]
|
||
RET ;RETURN
|
||
>
|
||
|
||
;HERE TO OUTPUT "'" FOR RELOCATABLE ADDRESSES
|
||
|
||
OUTCSQ: MOVEI C,"'" ;[717]
|
||
IFN FTPSECT,< ;[717]
|
||
SKIPE SGNMAX ;[717]
|
||
JRST OUTIDX ;[717]
|
||
>
|
||
SKIPE MODA ;[717] SKIP IF ABSOLUTE
|
||
PJRST OUTC ;[717] NO
|
||
RET ;[717]
|
||
|
||
;HERE TO OUTPUT PSECT INDES
|
||
|
||
IFN FTPSECT,<
|
||
OUTIDX: SKIPN MODA ;[717] ABSOLUTE?
|
||
JRST [ MOVEI C,40 ;[717] YES,
|
||
CALL OUTC ;[717] 3 SPACES INSTEAD
|
||
CALL OUTC ;[717]
|
||
PJRST OUTC] ;[717]
|
||
CALL OUTC ;[717] OUT WITH "'"
|
||
MOVE C,SGNCUR ;[647] GET CURRENT PSECT INDES
|
||
CAIL C,100 ;[647] DO WE HAVE A 3-DIGIT INDEX#?
|
||
PJRST OUTOCT ;[647] YES, USE OUTOCT
|
||
MOVE CS,[POINT 3,SGNCUR,29] ;[647] NO, LESS
|
||
ILDB C,CS ;[647] PICK UP FIRST DIGIT
|
||
ADDI C,"0" ;[647] CONVERT TO ASCII
|
||
CALL OUTC ;[647] AND OUTPUT IT
|
||
ILDB C,CS ;[647] SECOND DIGIT
|
||
ADDI C,"0" ;[647]
|
||
PJRST OUTC ;[647]
|
||
>
|
||
|
||
NOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE
|
||
MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0
|
||
SETZB ARG,AC0
|
||
NOUT1: ILDB C,V ;GET ASCII
|
||
CAIL C,"A"+40
|
||
CAILE C,"Z"+40
|
||
JRST .+2
|
||
TRZA C,100 ;LOWER CASE TO SIXBIT
|
||
SUBI C,40 ;CONVERT TO SIXBIT
|
||
JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT
|
||
CAILE C,77 ;AND NOT GREATER THAN SIXBIT
|
||
JRST NOUT3 ;...
|
||
LDB AC1,[POINT 6,CSTAT(C),23] ;INDEX TO CSTAT
|
||
SKIPN AC1 ;RADIX 50?
|
||
JRST NOUT3 ;NO, ASSUME TERMINATOR
|
||
IDPB C,CS ;DEPOSIT IN AC0
|
||
TLNE CS,770000 ;TEST FOR SIX CHARACTERS
|
||
JRST NOUT1 ;NO, GET ANOTHER
|
||
NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG
|
||
RET ;RETURN TO PUT IT IN THE TABLE
|
||
|
||
CALL NOUT2 ;DUMP NAME
|
||
MOVSI AC0,11 ;TYPE MARKER
|
||
IOR AC0,CPUTYP ;CPU TYPE
|
||
PJRST COUT ;DUMP AND EXIT
|
||
|
||
NOUT2: CALL SQOZE ;CONVERT TO SIXBIT
|
||
JRST COUT ;DUMP AND EXIT
|
||
|
||
HOUT:
|
||
IFN FTPSECT,< ;[575]
|
||
SETZB AC0,SGNCUR ;[642] FORCE TO PSECT 0
|
||
SKIPE SGNMAX ;NO PSECTS
|
||
CALL SGOUTN ;PUT IT OUT
|
||
>
|
||
MOVEI RC,1 ;RELOCATABLE
|
||
MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS
|
||
JUMPE AC0,.+2 ;NOT TWO SEGMENTS
|
||
CALL COUT ;OUTPUT IT
|
||
MOVE AC0,SGATTR
|
||
SKIPE HHIGH ;ANY TWOSEG HIGH STUFF
|
||
JRST COUT ;YES,SO NO ABS.
|
||
CALL COUT ;OUTPUT THE HIGHEST LOCATION
|
||
MOVE AC0,ABSHI
|
||
;PUT OUT ABS PORTION OF PROGRAM BREAK
|
||
SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT
|
||
|
||
IFN POLISH,<
|
||
;HERE TO OUTPUT BLOCK TYPE 11
|
||
POUT: SKIPN POLIST ;ANY POLISH TO OUTPUT?
|
||
RET ;NO
|
||
TLO FR,POLSW ;SET FLAG
|
||
CALL COUTD ;DUMP BUFFER UNLESS EMPTY
|
||
MOVE CS,@POLIST ;GET A BLOCK POINTER
|
||
EXCH CS,POLIST ;SET FOR NEXT TIME
|
||
AOJ CS, ;[1161] POINT TO THE WORD COUNT
|
||
MOVE AC0,(CS) ;[1161] GET IT
|
||
MOVEM AC0,POLWRD ;[1161] SAVE IT IN POLWRD
|
||
SKIPE SGNMAX ;[1060] ANY PSECTS?
|
||
JRST [HRRZ AC0,1(CS) ;[1060] YES, SAVE INDEX OF CURRENT
|
||
TRZ AC0,400000 ;[1060] (SEE POLOPF:)
|
||
MOVEM AC0,POLPS0 ;[1060]
|
||
JRST .+1] ;[1060]
|
||
POUTA: ADDI CS,1 ;FIRST WORD
|
||
MOVE AC0,(CS) ;GET SOMETHING
|
||
SETZ RC, ;CLEAR RELOCATION
|
||
JUMPL AC0,POUTOP ;THIS IS AN OPERATOR
|
||
CALL PCOUT ;STORE THIS HALF WORD
|
||
JUMPE AC0,POUT0 ;18 BIT VALUE
|
||
SOJE AC0,POUT1 ;36 BIT VALUE
|
||
HLRZ AC0,1(CS) ;GET HALF OF SYMBOL
|
||
CALL PCOUT
|
||
HRRZ AC0,1(CS) ;GET OTHER HALF
|
||
CALL PCOUT
|
||
AOJA CS,POUTA
|
||
|
||
POUT0: HLRZ RC,1(CS) ;GET RELOCATION
|
||
HRRZ AC0,1(CS) ;AND VALUE
|
||
CALL PCOUT
|
||
AOJA CS,POUTA ;GET NEXT
|
||
|
||
POUT1: HLRZ RC,1(CS) ;GET LEFT HALF
|
||
HLRZ AC0,2(CS)
|
||
CALL PCOUT
|
||
HRRZ RC,1(CS) ;RIGHT HALF
|
||
HRRZ AC0,2(CS)
|
||
CALL PCOUT
|
||
ADDI CS,2 ;SKIP OVER 2 WORDS
|
||
JRST POUTA
|
||
|
||
POUTOP: HRRZ AC0,AC0 ;GET OPERATOR ONLY
|
||
CALL PCOUT ;OUTPUT
|
||
CAIGE AC0,-6 ;CHECK FOR STORE OP
|
||
JRST POUTA ;ITS NOT
|
||
CAIGE AC0,-3 ;CHECK FOR SYMBOL FIXUP
|
||
JRST POUTSY ;IT IS
|
||
HLRZ RC,1(CS) ;GET RELOCATION
|
||
HRRZ AC0,1(CS) ;AND STORE ADDRESS
|
||
HRLM RC,POLAD0 ;[1060] SAVE ADDR AND RELOCATION
|
||
HRRM AC0,POLAD0 ;[1060] IN CASE ERROR
|
||
POUTOQ: CALL PCOUT
|
||
REPEAT 0,< ;[1161]
|
||
SKIPE POLERR ;[1161][1060] PROCESSING ERROR?
|
||
CALL [MOVEI C,POLLIM ;[1161][1060] YES, FORCE TERMINATION IN
|
||
MOVEM C,POLERR ;[1161][1060] CASE WE HAVE GARBAGE
|
||
PJRST POLER4] ;[1161][1060] GIVE MESSAGE AND RETURN
|
||
> ;[1161]
|
||
POUTQ1: TLZ FR,POLSW ;[1060] CLEAR FLAG IN CASE END
|
||
SETZM POLAD0 ;[1060] CLEAR ERROR INFO
|
||
SETZM POLSY0 ;[1060]
|
||
SKIPLE POLWRD ;[1161] HAVE WE WRITTEN MORE THAN 18 WORDS?
|
||
JRST POUTQ2 ;[1161] NO
|
||
AOS COUTX ;[1161] YES, INCR COUTX
|
||
CALL COUTT1 ;[1161] WRITE THE REST OF THE POLISH
|
||
POUTQ2: SETZM POLWRD ;[1161] CLEAR THE POLISH COUNT
|
||
JRST POUT ;SEE IF MORE TO GO
|
||
|
||
POUTSY: PUSH P,1(CS) ;[1060] SAVE SYMBOL NAME IN
|
||
POP P,POLSY0 ;[1060] CASE OF ERROR
|
||
HLRZ AC0,1(CS) ;GET LHS SYMBOL
|
||
SETZ RC, ;NO RELOCATION
|
||
CALL PCOUT ;OUTPUT IT
|
||
HRRZ AC0,1(CS) ;GET RHS
|
||
CALL PCOUT
|
||
SETZ AC0, ;FOLLOW WITH 0 FOR BLOCK LEVEL (FAIL COMPATIBLE)
|
||
CALL PCOUT ;LHS
|
||
PJRST POUTOQ ;RHS
|
||
|
||
PCOUT: MOVE C,COUTP ;GET POINTER
|
||
TLNE C,010000 ;LEFT OR RIGHT HALF?
|
||
JRST PCOUTR ;JUST THE RIGHT HALF
|
||
AOS C,COUTX ;INCREMENT INDEX
|
||
HRLZM AC0,COUTDB(C) ;STORE LEFT HALF
|
||
IDPB RC,COUTP ;AND RELOCATION
|
||
RET
|
||
|
||
PCOUTR: MOVE C,COUTX ;GET CURRENT INDEX
|
||
HRRM AC0,COUTDB(C) ;STORE RIGHT HALF
|
||
IDPB RC,COUTP ;AND RELOCATION
|
||
CAIE C,^D17 ;IS THE BUFFER FULL
|
||
RET ;NO
|
||
POLTST: SKIPLE POLWRD ;[1161] HAVE WE WRITTEN THE FIRST 18 WORDS?
|
||
JRST POLT1 ;[1161] NO
|
||
AOS COUTX ;[1161] YES, INCR COUTX
|
||
CALL COUTT1 ;[1161] WRITE SOME POLISH
|
||
SETZ C, ;[1161] CLEAR C
|
||
RET ;[1161] RETURN
|
||
POLT1: HRRZ C,POLWRD ;[1161] GET THE WORD COUNT INTO C
|
||
AOS COUTX ;[1161] INCR COUTX
|
||
CAIE C,22 ;[1161] WRITING OUT EXACTLY 22 WORDS?
|
||
SETOM POLWRD ;[1161] WE HAVE WRITTEN THE FIRST 18 WORDS
|
||
CALL COUTD1 ;[1161] WRITE THE AND SOME POLISH
|
||
SETZ C, ;[1161] CLEAR C
|
||
RET ;[1161] RETURN
|
||
REPEAT 0,< ;[1161]
|
||
;[1161]HERE TO GIVE BEST ERROR MESSAGE POSSIBLE FOR POLISH BLOCK
|
||
;[1161]EXCEEDING 18 WORDS (OR CURRENT LIMIT)
|
||
POLLIM==1 ;[1161][1060] THIS VALUE DENOTES THE NUMBER OF 18-WORD
|
||
;[1161][1060] BLOCKS (BEYOND THE FIRST) WE ARE WILLING
|
||
;[1161][1060] TO PERUSE FOR A FIXUP TYPE;
|
||
;[1161][1060] CAN BE CHANGED FOR DEBUGGING PURPOSES.
|
||
POLER4: SKIPN POLERR ;[1161][1066] FIRST TIME THROUGH?
|
||
JRST [PUSH P,['MCRPTC'] ;[1161][1066] YES, SET PREFIX
|
||
POP P,PREFIX ;[1161][1066]
|
||
SETZ RC, ;[1161][1066] ZERO RC FOR TEST AFTER CALL
|
||
PUSH P,CS ;[1161][1066] SAVE PTR TO LIST
|
||
CALL EFATAL ;[1161][1066] FATAL ERROR
|
||
POP P,CS ;[1161][1066] RESTORE CS
|
||
CAMN RC,[-1] ;[1161][1066] TEXT TO BE SUPPRESSED?
|
||
PJRST POLER6 ;[1161][1066] YES, GIVE CRLF AND EXIT
|
||
JRST .+1] ;[1161][1066] NO, CONTINUE
|
||
SKIPE POLAD0 ;[1161][1060] LOCATION FIXUP?
|
||
JRST POLER1 ;[1161][1060] YES, GIVE APPROPRIATE MESSAGE
|
||
SKIPE POLSY0 ;[1161][1060] SYMBOL FIXUP?
|
||
JRST POLER2 ;[1161][1060] GIVE APPROPRIATE MESSAGE
|
||
MOVE C,POLERR ;[1161][1060] WE DON'T KNOW FIXUP TYPE YET,
|
||
CAIL C,POLLIM ;[1161][1060] CAN WE LOOK FURTHER?
|
||
JRST POLER5 ;[1161][1060] NO, GIVE UP
|
||
AOS POLERR ;[1161][1060] YES, INITIALIZE FOR NEXT BLOCK
|
||
PJRST COUTI ;[1161][1060] AND LOOK FOR FIXUP TYPE
|
||
POLER5: HRROI RC,[SIXBIT / POLISH TOO COMPLEX@/] ;[1161][1066][1060]
|
||
CALL TYPMSG ;[1161]PRINT MESSAGE
|
||
POLER0: SUB P,[1,,1] ;[1161][1060][654] ADJUST STACK POINTER AND
|
||
SETZM POLERR ;[1161][1060] CLEAR ERROR-PROCESSING COUNT
|
||
SETOM COUTX ;[1161][1060] RE-INIT WORD COUNT
|
||
JRST POUTQ1 ;[1161][1060] FORGET ABOUT THIS BLOCK
|
||
|
||
POLER1: HRRZI CS,[SIXBIT / POLISH TOO COMPLEX FOR LOCATION@/] ;[1161][1066]
|
||
CALL TYPM2 ;[1161][1060]
|
||
HRRZ AC0,POLAD0 ;[1161][1060] TYPE OUT ADDRESS
|
||
CALL TYPOCT ;[1161][1060]
|
||
HLRZ C,POLAD0 ;[1161][1060] GET RELOCATION
|
||
CAIN C,1 ;[1161][1060] APPEND "'" IF NECESSARY
|
||
CALL [MOVEI C,"'" ;[1161][1060]
|
||
CALL TYO ;[1161][1060]
|
||
MOVE AC0,POLPS0 ;[1161][1060] APPEND PSECT INDEX IF
|
||
JUMPE AC0,CPOPJ ;[1161][1060] NECESSARY
|
||
CAIL AC0,10 ;[1161][1060]
|
||
PJRST TYPOCT ;[1161][1060]
|
||
MOVEI C,"0" ;[1161][1060]
|
||
CALL TYO ;[1161][1060]
|
||
MOVE C,POLPS0 ;[1161][1060]
|
||
ADDI C,"0" ;[1161][1060]
|
||
PJRST TYO] ;[1161][1060]
|
||
POLER6: CALL CRLF ;[1161][1066][1060] AND CRLF
|
||
JRST POLER0 ;[1161][1060] COMMON EXIT
|
||
|
||
DEFINE R50CHR(CHR),<IRPC CHR,<"CHR"-40 ;[1161]
|
||
>> ;[1161]
|
||
R50TAB: R50CHR( 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.$% ) ;[1161]
|
||
POLER2: HRRZI CS,[SIXBIT / POLISH TOO COMPLEX FOR SYMBOL@/] ;[1161][1066]
|
||
CALL TYPM2 ;[1161][1060]
|
||
MOVE C,POLSY0 ;[1161][1060] GET RADIX-50 OF SYMBOL
|
||
TLZ C,740000 ;[1161][1060] CLEAR 4-BIT SYMBOL CODE
|
||
SETZ RC, ;[1161][1060] CLEAR RELOCATION
|
||
MOVEI AC0,5 ;[1161][1060] SET ITERATION COUNT
|
||
POLER3: IDIVI C,50 ;[1161][1060] CONVERT TO SIXBIT
|
||
SKIPE CS,R50TAB(CS) ;[1161][1060]
|
||
LSHC CS,-6 ;[1161][1060]
|
||
CAILE C,50 ;[1161][1060]
|
||
SOJG AC0,POLER3 ;[1161][1060] LOOP BACK IF MORE
|
||
SKIPE CS,R50TAB(C) ;[1161][1060]
|
||
LSHC CS,-6 ;[1161][1060] LAST CHAR
|
||
MOVE CS,RC ;[1161][1060] TYPE RESULT
|
||
CALL TYPSYM ;[1161][1060]
|
||
PJRST POLER6 ;[1161][1066]
|
||
> ;[1161] END OF REPEAT 0
|
||
> ;END IFN POLISH
|
||
|
||
IFN FTPSECT,< ;[575]
|
||
;HERE TO OUTPUT BLOCK TYPE 24 - PSECT NAME, ATTRIBUTE AND ORIGIN
|
||
SGOUTN: CALL COUTD ;FINISH OFF CURRENT BLOCK
|
||
PUSH P,BLKTYP ;SAVE CURRENT BLOCK TYPE
|
||
SKIPL BLK24 ;[1020] FIRST TIME?
|
||
JRST SGOUTS ;[1020] NO, OUTPUT BLOCK 22
|
||
SETZM BLK24 ;[1020] CLEAR BLOCK 24 FLAG
|
||
MOVEI AC0,24 ;BLOCK TYPE 22 IS A
|
||
MOVEM AC0,BLKTYP ;PSECT NAME
|
||
MOVE C,SGNCUR ;GET CUR PSECT INX
|
||
MOVE AC0,SGNAME(C) ;GET PSECT NAME
|
||
SETZ RC, ;CLEAR RELOCATION
|
||
CALL COUT ;OUTPUT THE BLOCK
|
||
MOVE C,SGNCUR ;[1020] GET CURRENT PSECT INDEX
|
||
HLLZ AC0,SGATTR(C) ;[1020] GET ATTRIBUTE
|
||
HRR AC0,C ;[1020] PSECT INDEX IN RIGHT HALF
|
||
SETZ RC, ;[1020] CLEAR RELOCATION
|
||
SKIPGE AC0 ;[1020] RELOCATABLE PSECT?
|
||
JRST SGOUT1 ;[1020] YES, DON'T BOTHER WITH ORIGIN
|
||
CALL COUT ;[1020] OUTPUT ATTRIBUTE
|
||
MOVE C,SGNCUR ;INDEX AGAIN
|
||
MOVE AC0,SGFWOR(C) ;[1235] GET ORIGIN IF SPECIFIED
|
||
SGOUT1: CALL COUT ;[1020]
|
||
CALL COUTD ;FINISH IT OFF
|
||
POP P,BLKTYP ;RESTORE CURRENT BLOCK TYPE
|
||
RET ;RETURN
|
||
|
||
;HERE TO OUTPUT BLOCK TYPE 22 - SWITCH CURRENT RELOC COUNTER TO THE PSECT
|
||
SGOUTS: MOVEI AC0,22 ;[1020] BLOCK 24
|
||
MOVEM AC0,BLKTYP ;[1020]
|
||
MOVE AC0,SGNCUR ;[1020] CURRENT PSECT INDEX
|
||
SETZ RC, ;[1020] CLEAR RELOCATION
|
||
JRST SGOUT1 ;[1020] THAT'S IT
|
||
|
||
;HERE TO OUTPUT BLOCK TYPE 23 - PSECT LENGTH
|
||
SGOUTL: CALL COUTD ;FINISH OFF CURRENT BLOCK
|
||
PUSH P,BLKTYP ;SAVE CURRENT BLOCK TYPE
|
||
MOVEI AC0,23 ;BLOCK TYPE 23 IS A
|
||
MOVEM AC0,BLKTYP ;PSECT LENGTH
|
||
MOVE RC,SGNCUR ;GET CUR PSECT INX
|
||
SKIPN RC ;[1165] LOOKING AT BLANK PSECT?
|
||
JRST SGOUTA ;[1165] YES, DO NOT NEED TO OUTPUT THIS BLOCK
|
||
MOVE AC0,SGNAME(RC) ;GET PSECT NAME
|
||
SETZ RC, ;CLEAR RELOCATION
|
||
CALL COUT ;OUTPUT THE NAME
|
||
MOVE RC,SGNCUR ;GET CUR PSECT INX
|
||
HRRZ AC0,SGATTR(RC) ;GET PSECT LENGTH
|
||
MOVEI RC,1 ;BREAK IS RELOCATED
|
||
CALL COUT ;OUTPUT THE LENGTH AND ATTRS
|
||
CALL COUTD ;FINISH IT OFF
|
||
SGOUTA: POP P,BLKTYP ;[1165] RESTORE CURRENT BLOCK TYPE
|
||
RET ;RETURN
|
||
>
|
||
|
||
HSOUT: SETZM HISNSW ;CLEAR FOR PASS2
|
||
MOVE AC0,SVTYP3 ;GET HISEG ARG
|
||
JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG
|
||
HRL AC0,HIGH1 ;GET BREAK FROM PASS 1
|
||
JUMPL AC0,.+2 ;OK IF GREATER THAN 400000
|
||
HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER
|
||
MOVEI RC,1 ;ASSUME RELOCATABLE
|
||
JRST COUT ;OUTPUT THE WORD
|
||
|
||
VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?
|
||
SKIPE VECTOR ;ALSO CHECK RELOCATION
|
||
JRST .+3
|
||
SKIPN VECSYM ;SEE IF SYMBOLIC
|
||
RET ;YES, EXIT
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC0,VECFND ;GET START ADR PSECT INX
|
||
MOVEM AC0,SGNCUR ;POINT CUR PSECT THERE
|
||
SKIPE SGNMAX ;IF PSECTS WERE USED
|
||
CALL SGOUTN ;THEN PUT OUT PSECT BLOCK
|
||
MOVE RC,VECREL> ;GET RELOCATION
|
||
MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS
|
||
SKIPN VECSYM ;2 WORDS IF SYMBOLIC
|
||
JRST COUT
|
||
CALL COUT ;OUTPUT CONSTANT
|
||
MOVE AC0,VECSYM ;GET SYMBOL
|
||
MOVEI ARG,60 ;MAKE REQUEST
|
||
CALL SQOZE ;IN RADIX-50
|
||
SETZ RC,
|
||
|
||
COUT: AOS C,COUTX ;INCREMENT INDEX
|
||
MOVEM AC0,COUTDB(C) ;STORE CODE
|
||
IDPB RC,COUTP ;STORE RELOCATION BITS
|
||
CAIE C,^D17 ;IS THE BUFFER FULL?
|
||
RET ;NO, EXIT
|
||
|
||
COUTD: AOSG C,COUTX ;DUMP THE BUFFER
|
||
JRST COUTI ;BUFFER WAS EMPTY
|
||
COUTD1: HRL C,BLKTYP ;SET BLOCK TYPE
|
||
COUTT: ;ENTER FROM .TEXT PSEUDO-OP
|
||
CALL OUTBIN ;OUTPUT COUNT AND TYPE
|
||
COUTT1: SETOB C,COUTY ;INITIALIZE INDEX
|
||
|
||
COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE
|
||
CAMN SDEL,[XWD 440000,0] ;IF .TEXT, ONLY OUTPUT THE RELOCATION
|
||
TRZN C,1 ;WORD IF HAS DATA OR NEEDED FOR NULL STR TERMINATOR
|
||
CALL OUTBIN ;DUMP IT
|
||
AOS C,COUTY ;INCREMENT INDEX
|
||
CAMGE C,COUTX ;TEST FOR END
|
||
JRST COUTD2 ;NO, GET NEXT WORD
|
||
|
||
COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX
|
||
SETZM COUTRB ;ZERO RELOCATION BITS
|
||
IFN POLISH,<
|
||
HRRZ C,BLKTYP ;IF WE ARE OUTPUTING
|
||
CAIN C,11 ;POLISH BLOCK TYPE 11
|
||
SKIPA C,[POINT 1,COUTRB] ; USE HALF WORDS
|
||
>
|
||
MOVE C,[POINT 2,COUTRB]
|
||
MOVEM C,COUTP ;INITIALIZE BIT POINTER
|
||
RET ;EXIT
|
||
|
||
STOWZ1:
|
||
IFN FORMSW,< MOVE AC1,HWFORM> ;USE STANDARD FORM
|
||
STOWZ: MOVEI RC,0
|
||
STOW:
|
||
IFN FORMSW,< MOVEM AC1,FORM> ;STORE FORM WORD
|
||
IFN TSTCD,<
|
||
SKIPE TCDFLG ;TESTING NEW LINK CODES?
|
||
JRST STOWTC ;YES.
|
||
>
|
||
JUMP1 STOW20 ;SKIP TEST IF PASS ONE
|
||
IFN POLISH,<
|
||
PUSH P,RC ;[1221] SAVE RC
|
||
HLRZS RC ;[1221] ISOLATE LEFT HALF
|
||
CAIN RC,-2 ;[1221] FAKE LEFT HALF POLISH?
|
||
JRST [POP P,RC ;[1221] YES - RESTORE RELOC
|
||
JRST STOW05] ;[1221] DO HALFWORD TESTS
|
||
POP P,RC ;[1221] RESTORE
|
||
JUMPL RC,STOW20 ;[1221][624] JUMP IF FULLWORD POLISH
|
||
STOW05: ;[1221]
|
||
>
|
||
TRNE RC,-2 ;RIGHT HALF ZERO OR 1?
|
||
CALL STOWT ;NO, HANDLE EXTERNAL
|
||
TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW
|
||
JRST STOW10 ;YES, SKIP TEST
|
||
MOVSS RC ;SWAP HALVES
|
||
CALL STOWT1 ;HANDLE EXTERNAL WFW
|
||
MOVSS RC ;RESTORE VALUES
|
||
|
||
STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?
|
||
TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG
|
||
|
||
STOW20: SKIPN INOPDF ;[1035] OPDEF OR ASSIGN?
|
||
SKIPE INASGN ;[1035]
|
||
JRST [MOVE AC1,STPX ;[1035] YES, STOW FIRST WORD ONLY
|
||
SUB AC1,STPY ;[1035]
|
||
JUMPLE AC1,.+1 ;[1035] KEEP FIRST
|
||
RET] ;[1035] IGNORE REST
|
||
AOS AC1,STPX ;[667][661] OTHERWISE INCREMENT POINTER
|
||
MOVEM AC0,STCODE(AC1) ;STOW CODE
|
||
IFN POLISH,<
|
||
TRNN FRR,PIDXSW ;[1073] DOING POLISH INDEXING OR
|
||
SKIPE INANGL ;[751] STILL IN EXP EVALUATION?
|
||
JRST STOW23 ;[751] YES, NOT FINAL STOW, SO JUMP
|
||
TLZ FR,POLSW ;[1220] DONE WITH POLISH
|
||
JUMP1 STOWP3 ;[1221] SKIP IN PASS 1
|
||
JUMPE AC0,STOWP3 ;[1221] SKIP IF NO VALUE
|
||
PUSH P,RC ;[1221] SAVE RC
|
||
HLRZS RC ;[1221] ISOLATE LEFT HALF
|
||
CAIN RC,-2 ;[1221] FAKE LEFT HALF POLISH?
|
||
JRST [POP P,RC ;[1221] YES - RESTORE RC
|
||
JRST STOWP3] ;[1221] HALFWORD CHECKS ALREADY DONE
|
||
POP P,RC ;[1221] RESTORE
|
||
JUMPL RC,STOWP2 ;[1221] VALUE AND POLISH IS ERROR
|
||
TRNE FRR,FWPSW ;[1221] CHECK FULLWORD POLISH
|
||
JRST STOWP2 ;[1221] STILL ERROR
|
||
TLNN AC0,-1 ;[1221] LEFT HALF VALUE
|
||
JRST STOWP1 ;[1221] NO
|
||
TRNE FRR,LHPSW ;[1221] AND LEFT HAND POLISH?
|
||
JRST STOWP2 ;[1221] ERROR
|
||
STOWP1: TRNN AC0,-1 ;[1221] RIGHT HALF VALUE?
|
||
JRST STOWP3 ;[1221] NO
|
||
TRNE FRR,RHPSW ;[1221] AND RIGHT HAND POLISH?
|
||
STOWP2: CALL QPOL ;[1221] YES - FLAG ERROR
|
||
STOWP3: ;[1221]
|
||
TLNE RC,-1 ;[614] ONLY IF LH(RC)=0
|
||
JRST STOW2R ;[614] OTHERWISE, JUMP
|
||
TRZE FRR,LHPSW ;[614] CHECK FOR LEFT HALF FIXUP
|
||
HRLI RC,-2 ;[614] STORE -2 FOR RELOC
|
||
STOW2R: TRNE RC,-1 ;[614] ONLY IF RH(RC)=0
|
||
JRST STOW2F ;[614] OTHERWISE, JUMP
|
||
TRZE FRR,RHPSW ;[614] CHECK FOR RIGHT HALF FIXUP
|
||
HRRI RC,-2 ;[614] STORE -2 FOR RELOC
|
||
STOW2F: JUMPN RC,STOW23 ;[614] RC=0? , JUMP IF NOT
|
||
TRZN FRR,FWPSW ;[614] FULL WORD FIXUP?
|
||
JRST STOW23 ;[614] NO, FINISH CHECKING
|
||
HRREI RC,-2 ;[1220][614] -2 FOR RELOCATION
|
||
SETZM STFORM(AC1) ;[614]
|
||
AOS STFORM(AC1) ;[614]
|
||
MOVEM RC,STOWRC(AC1) ;[614]
|
||
SETZ RC, ;[614]
|
||
JRST STOW22 ;[614]
|
||
>
|
||
|
||
STOW23: MOVEM RC,STOWRC(AC1) ;[614] STOW RELOCATION BITS
|
||
IFN FORMSW,<
|
||
PUSH P,FORM
|
||
POP P,STFORM(AC1) ;STORE FORM WORD
|
||
>
|
||
STOW22: SKIPN LITLVL ;[614] ARE WE IN LITERAL?
|
||
JRST [AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION
|
||
SKIPN INASGN ;[1232] IF IN ASSIGN
|
||
SKIPE INOPDF ;[1232] OR IN OPDEF
|
||
JRST .+1 ;[1232] NO CODE ACTUALLY STORED
|
||
SETOM BNSN ;[1232] FLAG CODE STORED
|
||
JRST .+1] ;[555]
|
||
CAIGE AC1,.STP-1 ;OVERFLOW?
|
||
RET ;NO, EXIT
|
||
|
||
SKIPN LITLVL ;[726] ARE WE IN A LITERAL?
|
||
JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER
|
||
PUSH P,['MCRLTL'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / LITERAL TOO LONG@/] ;[1066][726] YES, ERROR
|
||
CALL ERRNE4 ;[726] DON'T DUMP THE BUFFER
|
||
JRST STOWI ;INITIALIZE BUFFER
|
||
|
||
;GET ONE WORD FROM CODE BUFFER
|
||
DSTOW: AOS AC1,STPY ;INCREMENT POINTER
|
||
MOVE AC0,STCODE(AC1) ;FETCH CODE
|
||
MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS
|
||
IFN FORMSW,<
|
||
PUSH P,STFORM(AC1)
|
||
POP P,FORM ;GET FORM WORD
|
||
>
|
||
CAMGE AC1,STPX ;IS THIS THE END?
|
||
RET ;NO, EXIT
|
||
|
||
STOWI: SETOM STPX ;INITIALIZE FOR INPUT
|
||
SETOM STPY ;INITIALIZE FOR OUTPUT
|
||
SETZM EXTPNT
|
||
RET ;EXIT
|
||
|
||
IFN POLISH,< ;[1220]
|
||
;[1220]DSTOW FAKE POLISH RELOCATION BACK TO LISTING FLAGS
|
||
DSTWRC: TRZ FRR,LHPSW!RHPSW!FWPSW ;[1220] CLEAR LISTING FLAGS
|
||
CAMN RC,[-2] ;[1220] FULLWORD POLISH?
|
||
JRST [TRO FRR,FWPSW ;[1220] YES
|
||
SETZ RC, ;[1220] FIX RELOCATION
|
||
JRST DSTWR1] ;[1220] DONE
|
||
PUSH P,RC ;[1220] SAVE FINAL RELOCATION
|
||
HLRZS RC ;[1220] LEFT HALF POLISH?
|
||
CAIN RC,-2 ;[1220]
|
||
JRST [TRO FRR,LHPSW ;[1220] YES
|
||
HRRZS 0(P) ;[1220] FIX RELOCATION
|
||
JRST .+1] ;[1220]
|
||
HRRZ RC,0(P) ;[1220] RIGHT HALF POLISH?
|
||
CAIN RC,-2 ;[1220]
|
||
JRST [TRO FRR,RHPSW ;[1220] YES
|
||
HLLZS 0(P) ;[1220] FIX
|
||
JRST .+1] ;[1220]
|
||
POP P,RC ;[1220] RESTORE RELOCATION
|
||
SKIPGE RC ;[1220] STILL POLISH?
|
||
TRO FRR,FWPSW ;[1220] YES - MUST BE FULLWORD
|
||
DSTWR1: RET ;[1220] RELOCATION/FLAGS RESTORED
|
||
>; END IFN POLISH ;[1220]
|
||
|
||
;EXTERNAL RIGHT
|
||
STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER
|
||
IFN POLISH,< ;[1221]
|
||
CAIN AC1,-2 ;[1221] FAKE POLISH?
|
||
TRNN AC0,-1 ;[1221] ERROR IF RIGHT HALF VALUE
|
||
>; END IFN POLISH ;[1221]
|
||
CAIE AC1,(RC) ;DOES IT MATCH
|
||
CALL QEXT ;EXTERNAL OR RELOCATION ERROR
|
||
HLLZS EXTPNT
|
||
RET ;EXIT
|
||
|
||
;EXTERNAL LEFT
|
||
STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF
|
||
IFN POLISH,< ;[1221]
|
||
CAIN AC1,-2 ;[1221] FAKE POLISH?
|
||
TLNN AC0,-1 ;[1221] ERROR IF LEFT HALF VALUE
|
||
>; END IFN POLISH ;[1221]
|
||
CAIE AC1,(RC) ;SEE ABOVE
|
||
CALL QEXT
|
||
HRRZS EXTPNT
|
||
RET ;EXIT
|
||
|
||
|
||
IFN TSTCD,<
|
||
STOWTC:
|
||
SKIPE RC ;RELOCATABLE OR EXTERNAL?
|
||
CALL QEXT ;YES, FLAG ERROR
|
||
JUMP1 CPOPJ ;IF PASS 1, RETURN
|
||
MOVE C,AC0 ;GET VALUE
|
||
JRST OUTBIN ;DEPOSIT INTO REL FILE AND RETURN
|
||
>
|
||
|
||
ONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER
|
||
IFN FTPSECT,< ;[647]
|
||
SKIPE SGNMAX ;[647] DOING PSECTS?
|
||
JRST [ MOVEI C," " ;[647] YES, 2 SPACES INSTEAD OF A TAB
|
||
CALL OUTC ;[647]
|
||
CALL OUTC ;[647]
|
||
JRST ONC1] ;[647]
|
||
>
|
||
CALL OUTL ;OUTPUT A TAB
|
||
;OUTPUT 6 OCT NUMBERS FROM CS LEFT
|
||
ONC1: MOVEI C,6 ;CONVERT TO ASCII
|
||
LSHC C,3 ;SHIFT IN OCTAL
|
||
CALL OUTL ;OUTPUT ASCII FROM C
|
||
TRNE CS,-1 ;ARE WE THROUGH?
|
||
JRST ONC1 ;NO, GET ANOTHER
|
||
MOVEI C,0 ;CLEAR C
|
||
TLNN CS,1 ;RELOCATABLE?
|
||
MOVEI C,"'" ;YES
|
||
TLNN CS,EXTF ;OR EXTERNAL
|
||
MOVEI C,"*" ;YES
|
||
IFN POLISH,<
|
||
TLNN CS,4 ;[614] POLISH?
|
||
MOVEI C,"#" ;[614] YES
|
||
>
|
||
ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE
|
||
IFN FORMSW,< SOS FLDSIZ> ;DECREMENT FIELD SIZE
|
||
RET ;EXIT
|
||
|
||
DNC: IDIVI C,^D10
|
||
HRLM CS,0(P)
|
||
JUMPE C,.+2
|
||
CALL DNC ;RECURSE IF NON-ZERO
|
||
HLRZ C,0(P)
|
||
ADDI C,"0" ;FORM ASCII
|
||
JRST PRINT ;DUMP AND TEST FOR END
|
||
|
||
;OCTAL OUTPUT FROM C
|
||
OUTOCT: IDIVI C,^D8
|
||
HRLM CS,0(P)
|
||
SKIPE C
|
||
CALL OUTOCT ;RECURSE UNTIL QUOTIENT 0
|
||
HLRZ C,0(P)
|
||
ADDI C,"0" ;CONVERT TO ASCII
|
||
JRST PRINT
|
||
|
||
OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER
|
||
OUTASC: ILDB C,CS ;GET NEXT BYTE
|
||
JUMPE C,CPOPJ ;[664] EXIT ON ZERO DELIMITER
|
||
CALL PRINT
|
||
JRST OUTASC
|
||
|
||
OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT
|
||
ILDB C,CS ;GET SIXBIT
|
||
CAIN C,40 ;"@" DELIMITER?
|
||
RET ;YES, EXIT
|
||
ADDI C,40 ;NO, FORM ASCII
|
||
CALL OUTL ;OUTPUT ASCII CHAR FROM C
|
||
JRST OUTSIX+1
|
||
|
||
OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS
|
||
OUTSY1: MOVEI C,0 ;CLEAR C
|
||
LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
|
||
JUMPE C,CPOPJ ;TEST FOR END
|
||
ADDI C,40 ;CONVERT TO ASCII
|
||
CALL OUTL ;OUTPUT
|
||
JRST OUTSY1 ;LOOP
|
||
|
||
OUTSET: AOS SX,0(P) ;GET RETURN LOCATION
|
||
MOVE SX,-1(SX) ;GET XWD CODE
|
||
HLRM SX,BLKTYP ;SET BLOCK TYPE
|
||
SETZB ARG,RC
|
||
CALL 0(SX) ;GO TO PRESCRIBED ROUTINE
|
||
JRST COUTD ;TERMINATE BLOCK AND EXIT
|
||
|
||
;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE
|
||
LOOKUP: POP P,LOOKX ;INTERCEPT RETURN POP
|
||
MOVE SX,SYMBOL
|
||
PUSH P,0(SX) ;SET FOR TABLE SCAN
|
||
LOOKL: SOSGE 0(P) ;TEST FOR END
|
||
JRST [POP P,AC0 ;DONE, EXIT
|
||
RET] ;[575]
|
||
ADDI SX,2
|
||
MOVE AC0,-1(SX)
|
||
CALL SRCH7 ;LOAD REGISTERS
|
||
HLRZS ARG
|
||
CALL @LOOKX ;RETURN TO CALLING ROUTINE
|
||
JRST LOOKL ;TRY AGAIN
|
||
|
||
IFE FTPSECT,<SYN LOOKUP,SGLKUP> ;[575]
|
||
IFN FTPSECT,< ;[575]
|
||
SGLKUP: POP P,LOOKX ;INTERCEPT RETURN POP
|
||
MOVE SX,SGNCUR ;GET CUR PSECT INX
|
||
PUSH P,SGSCNT(SX) ;SAVE SYM CNT
|
||
HRRZS 0(P) ;DON'T WANT LEFT HALF
|
||
MOVE SX,SGSBOT ;GET INIT SYM TAB PTR
|
||
JRST LOOKL ;REST IS SAME AS FOR FULL CASE
|
||
>
|
||
SUBTTL END ROUTINES
|
||
|
||
END0:
|
||
IFN FTPSECT,< ;[575]
|
||
SKIPE SGLITL ;[1074] ANY LITERALS UNTERMINATED IN ANY PSECT?
|
||
RET ;[1074] YES - ILLEGAL IN ANY LITERAL
|
||
HRROS SGNCUR ;FORCE EVALUATION IN ITS OWN PSECT
|
||
>
|
||
IFN POLISH,<TRO FRR,NOPSW> ;[1240] DO NOT ALLOW POLISH
|
||
CALL EVALCM ;GET A WORD
|
||
IFN POLISH,<TRZ FRR,NOPSW> ;[1240] ALLOW POLISH AGAIN
|
||
IFN FTPSECT,< ;[575]
|
||
HRRZS SGNCUR ;BACK TO NORMAL
|
||
>
|
||
SKIPN V,AC0 ;NON-ZERO?
|
||
JUMPE RC,.+2 ;OR RELOC?
|
||
CALL ASSIG7 ;YES, LIST THE VALUE
|
||
SETZM VECSYM ;IN CASE NOT SYMBOLIC
|
||
SKIPN EXTPNT ;EXTERNAL?
|
||
JRST END00 ;NO
|
||
CAME RC,EXTPNT ;MAKE SURE SAME
|
||
JRST [SETZB AC0,VECSYM ;NO, CLEAR
|
||
TRO ER,ERRE ;FLAG ERROR
|
||
JRST .+3]
|
||
MOVE RC,1(RC) ;GET SIXBIT NAME
|
||
MOVEM RC,VECSYM ;STORE SYMBOL NAME
|
||
SETZB RC,EXTPNT ;AND CLEAR RELOC
|
||
END00: MOVEM AC0,VECTOR
|
||
MOVEM RC,VECREL
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC1,SGWFND ;GET START ADR PSECT INX
|
||
MOVEM AC1,VECFND ;SAVE IT
|
||
>
|
||
SKIPN LITNUM ;LITERALS TO FOLLOW?
|
||
CALL VARP ;NO, DO EARLY CHECK FOR VAR AREA
|
||
SETOM ENDSN ;FLAG BEEN HERE AND
|
||
CALL STOUTS ;DUMP THE LINE
|
||
END01: TLZ IO,IOPROG ;[754] SHOULDN'T BE XLISTED AND
|
||
SETZ MRP, ;SHOULDN'T BE IN A MACRO BY NOW
|
||
MOVE MP,SAVERP ;[1120] GET SAVED MACRO CALL PTR.
|
||
MOVEM MP,RP ;[1120] RESET RP
|
||
MOVE MP,SAVEMP ;[1120] RESET REPEAT PTR. ALSO
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC1,SGNMAX ;GET HIGHEST PSECT USED
|
||
PUSH P,AC1 ;SAVE IT
|
||
CAME AC1,SGNCUR ;[715] IF NOT CURRENT
|
||
END02: CALL %SWSEG ;[715] SWAP IT
|
||
>
|
||
SKIPE ENDSN ;HAVE WE CHECKED VAR AREA
|
||
SKIPE LITNUM ;PHASE ERRORS?
|
||
CALL VARP ;NO, DO SO
|
||
CALL VARA ;FILL OUT SELF-DEFINED VARIABLES
|
||
SETZM ENDSN ;RESET ENDSN
|
||
IFE IIISW,<PUSH P,IO ;SAVE FLAGS
|
||
TLO IO,IOPROG> ;XLIST LITS
|
||
CALL LIT1 ;RETURN VALUE IN AC2
|
||
IFE IIISW,<POP P,IO> ;GET FLAG BACK
|
||
IFN FTPSECT,< ;[575]
|
||
SOSL AC1,0(P) ;DONE YET?
|
||
JRST END02 ;NO
|
||
POP P,AC1 ;GET JUNK OFF STACK
|
||
>
|
||
JUMP2 ENDP2
|
||
|
||
MOVE HHIGH ;GET HIGH SEG BREAK
|
||
MOVEM HIGH1 ;SAVE FOR TWOSEG/HISEG BLOCK TYPE 3
|
||
CALL UOUT ;[1042]
|
||
TLNN IO,MFLSW ;SKIP IF ONLY PSEND
|
||
CALL REC2
|
||
MOVE INDIR ;SET UP FIRST AS LAST
|
||
MOVEM LSTFIL ;PRINTED
|
||
SETZM LSTPGN
|
||
SETZ AC1, ;[1231] MY JOB
|
||
RUNTIM AC1, ;[1231] CURRENT RUNTIME
|
||
SUB AC1,RTIME ;[1231] USED SO FAR
|
||
MOVEM AC1,R1TIME ;[1231] PASS1 RUNTIME
|
||
CALL INZ ;[1231] RESET FOR NEXT PROG
|
||
SKIPN TTLFND ;[1123] HAVE WE SEEN A TITLE YET?
|
||
CALL PRNAM ;[1123] NO - PRINT DEFAULT TITLE
|
||
SETZM TTLFND ;[1123] CLEAR TITLE SPECIFIED FLAG
|
||
TLNE IO,MFLSW ;IF PSEND
|
||
RET ;BACK TO PSEND0
|
||
SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN
|
||
CALL PSEND3 ;YES,GO SET UP AGAIN
|
||
|
||
PASS20: SETZM CTLSAV
|
||
CALL COUTI
|
||
CALL EOUT ;OUTPUT THE ENTRIES
|
||
CALL OUTSET
|
||
XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)
|
||
SKIPN HISNSW ;PUT OUT BLOCK TYPE 3?
|
||
JRST PASS21 ;NO
|
||
CALL OUTSET
|
||
XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK
|
||
PASS21:
|
||
IFN FTPSECT,<
|
||
SETZM SGNCUR ;[1020]
|
||
SKIPN SGNMAX ;[1020] DOING PSECTS
|
||
JRST PASS22 ;[1020] NO, JUMP
|
||
PASS23: SETOM BLK24 ;[1020] GENERATE A SET OF BLOCK 24'S
|
||
AOS SX,SGNCUR ;[1020] SKIP BLANK PSECT
|
||
CALL SGOUTN ;[1020]
|
||
CAMGE SX,SGNMAX ;[1020] FINISHED?
|
||
JRST PASS23 ;[1020] NO, LOOP
|
||
SETZM SGNCUR ;[1020] RESET PSECT TO 0
|
||
PASS22:
|
||
>
|
||
MOVEI 1
|
||
HRRM BLKTYP ;SET FOR TYPE 1 BLOCK
|
||
TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG
|
||
TLO IO,IOPALL ;PUT THESE BACK
|
||
TLZ IO,IOPROG!IOCREF!DEFCRS!IONCRF ; SO LISTINGS WILL BE THE WAY THEY SHOULD
|
||
TLNN FR,R1BSW
|
||
JRST STOWI
|
||
MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]
|
||
MOVE C,0(CS)
|
||
CALL PTPBIN
|
||
AOBJN CS,.-2
|
||
CALL R1BI
|
||
JRST STOWI
|
||
|
||
ENDP2: CALL COUTD ;DUMP THE BUFFER
|
||
MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED
|
||
SKIPN MODO ;AND USE SMALLER SINCE AT END
|
||
JRST [CAMN AC0,ABSHI
|
||
HRRZM AC2,ABSHI
|
||
JRST ENDP2W]
|
||
SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS
|
||
JRST [CAMN AC0,HHIGH
|
||
HRRZM AC2,HHIGH
|
||
JRST ENDP2W]
|
||
ENDP2W:
|
||
IFE FTPSECT,< ;[575]
|
||
CAMN AC0,HIGH
|
||
HRRZM AC2,HIGH
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC1,SGNCUR
|
||
CAMN AC0,HIGH
|
||
HRRM AC2,SGATTR(AC1)
|
||
>
|
||
REPEAT 1,<TLNE IO,IOCREF> ;CLOSE CREF IF NECESSARY
|
||
REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING
|
||
JRST ENDP2Q
|
||
MOVEI SDEL,0
|
||
PUSH P,DBUF+3 ;SO NO PAGE INFO
|
||
DPB SDEL,[POINT 7,DBUF+3,13]
|
||
IOR ER,OUTSW ;MAKE SURE OF OUTPUT
|
||
CALL CREF
|
||
MOVEI C,20 ;CODE FOR TITLE
|
||
CALL OUTLST
|
||
PUSH P,IO ;SAVE THIS
|
||
TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE
|
||
MOVEI CS,TBUF
|
||
CALL OUTAS0
|
||
MOVEI CS,VBUF
|
||
CALL OUTAS0
|
||
POP P,IO ;RESTORE THE IO WORD
|
||
POP P,DBUF+3> ;NEEDS FIX TO CREF
|
||
CALL CLSCR2 ;CLOSE IT UP
|
||
ENDP2Q: HRR ER,OUTSW ;[1042] SET OUTPUT SWITCH
|
||
SKIPN TYPERR ;[1042]
|
||
TRO ER,TTYSW ;[1042]
|
||
CALL UOUT ;[1042] OUTPUT UNDEFINEDS
|
||
TRO ER,TTYSW
|
||
MOVE C,CTOBUF+2 ;SKIP OUTPUT IF BUFFER EMPTY
|
||
CAIE C,120 ;[565]
|
||
OUTPUT CTL, ;CLEAR JUNK OUT OF BUFFER
|
||
SKPINC C ;SEE IF WE CAN INPUT A CHAR.
|
||
JFCL ;BUT ONLY TO DEFEAT ^O
|
||
SKIPG C,QERRS ;ANY Q ERRORS SEEN?
|
||
JRST ENDPER ;NO, TRY REAL ERRORS
|
||
CALL OUTCR ;NEW LINE
|
||
MOVEI C,"%" ;WARNING CHARACTER
|
||
CALL OUTL
|
||
MOVE C,QERRS ;GET COUNT
|
||
CAIN C,1 ;1 IS SPECIAL
|
||
JRST ONERQ
|
||
CALL DNC ;OUTPUT IT
|
||
SKIPA CS,[EXP ERRMQ2]
|
||
ONERQ: MOVEI CS,ERRMQ1
|
||
CALL OUTSIX
|
||
ENDPER: MOVE C,ERRCNT ;GET ERROR COUNT
|
||
CAMGE C,UNDCNT ;.GE. UNDEFINED SYMBOL COUNT?
|
||
MOVE C,UNDCNT ;USE UND SYMBOL COUNT INSTEAD
|
||
JUMPE C,NOERW ;ZERO COUNT, PRINT NO ERR MSG
|
||
IFN CCLSW,<ADDM C,.JBERR> ;REMEMBER ERROR COUNT FOR EXECUTION DELETION
|
||
PUSH P,C ;STORE ERROR COUNT FOR A WHILE
|
||
CALL OUTCR
|
||
MOVEI C,"?" ;? FOR BATCH
|
||
CALL OUTL ;...
|
||
POP P,C ;RESTORE ERROR COUNT FROM STACK
|
||
CAIN C,1 ;1 IS A SPECIAL CASE
|
||
JRST ONERW ;PRINT MESSAGE
|
||
CALL DNC
|
||
SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT
|
||
ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED
|
||
ONERW1: CALL OUTSIX ;PRINT
|
||
JRST ENDP2A
|
||
|
||
NOERW: SKIPE QERRS ;IF "Q" ERRORS
|
||
CALL OUTCR ;CLOSE LINE NOW
|
||
MOVEI CS,ERRMS3
|
||
IFN CCLSW,< ;[1141]
|
||
TLNE IO,CRPGSW ;[1141] IF RPG
|
||
TRZ ER,TTYSW ;[1141] NO TTY OUTPUT
|
||
> ;[1141]
|
||
IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING
|
||
SKIPN QERRS ;ALREADY DONE
|
||
CALL OUTCR
|
||
JRST ONERW1
|
||
|
||
ENDP2A: CALL OUTCR
|
||
IFN CCLSW,< ;[1141]
|
||
TLNE IO,CRPGSW ;[1141] ONLY IF RPG
|
||
JRST [ MOVE C,QERRS ;[1141] TOTAL UP
|
||
ADD C,ERRCNT ;[1141] ANY ERRORS THAT
|
||
ADD C,UNDCNT ;[1141] WERE FOUND
|
||
JUMPE C,ENDP2D ;[1141] IF NONE - SUPPRESS PROGRAM NAME
|
||
JRST .+1] ;[1141] ELSE OK TO TYPE IT
|
||
> ;[1141]
|
||
SKIPE PGENDF ;[1141] HAVE WE SEEN ANY PRGENDS?
|
||
JRST [ MOVE C,OUTSW ;[1141] YES - GET OUTPUT SWITCHS
|
||
CAIN C,TTYSW ;[1141] LISTING GOING TO TTY?
|
||
JRST .+1 ;[1141] YES - NO NEED TO PRINT PROGRAM NAME
|
||
PUSH P,OUTSW ;[1141] SAVE OUTPUT SWITCHS
|
||
PUSH P,ER ;[1141] AND CURRENT OUTPUT SETTING
|
||
TLZ IO,IOPAGE ;[1231] SUPPRESS POSSIBLE NEW PAGE
|
||
HRRI ER,TTYSW ;[1141] OUTPUT TO TTY ONLY
|
||
HRRM ER,OUTSW ;[1141] IN ALL CASES
|
||
MOVEI CS,[ASCIZ /PROGRAM /] ;[1141]
|
||
CALL OUTAS0 ;[1141] TYPE PREFIX
|
||
MOVEI CS,TBUF ;[1141] TITLE BUFFER
|
||
CALL OUTAS0 ;[1141] TYPE IT
|
||
CALL OUTCR ;[1141] END LINE
|
||
POP P,ER ;[1141] RESTORE ERROR AND OUTPUT SETTINGS
|
||
POP P,OUTSW ;[1141] RESTORE OUTPUT SWITCHS
|
||
JRST .+1] ;[1141]
|
||
ENDP2D:
|
||
IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK
|
||
TRZ ER,TTYSW> ;...
|
||
IFE CCLSW,< SKIPA> ;SO PRGEND CODE CAN WORK
|
||
IOR ER,OUTSW ;...
|
||
CALL OUTCR
|
||
MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/]
|
||
SKIPN HHIGH ;DON'T PRINT IF ZERO
|
||
JRST ENDP2C ;IT WAS
|
||
CALL OUTSIX
|
||
HRLO CS,HHIGH ;GET THE BREAK
|
||
CALL ONC1
|
||
CALL OUTCR
|
||
ENDP2C: MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]
|
||
CALL OUTSIX ;OUTPUT PROGRAM BREAK
|
||
HRLO CS,SGATTR ;GET PROGRAM BREAK
|
||
CALL ONC1
|
||
CALL OUTCR
|
||
IFN FTPSEC,<
|
||
SKIPN AC1,SGNMAX ;GET PSECT CNT
|
||
JRST ENDP2E ;PSECTS NOT USED?
|
||
MOVEI AC2,1
|
||
ENDP2F: MOVEI CS,[SIXBIT /PSECT @/] ;[647]
|
||
CALL OUTSIX ;OUTPUT PSECT BREAK
|
||
MOVE C,AC2 ;[647] GET PSECT INDEX
|
||
CALL OUTOCT ;[647] OUTPUT IT
|
||
MOVEI CS,[SIXBIT / BREAK IS @/] ;[647]
|
||
CALL OUTSIX ;[647]
|
||
HRLO CS,SGATTR(AC2) ;GET PSECT BRK
|
||
CALL ONC1
|
||
MOVE CS,[SIXBIT / FOR /]
|
||
MOVEM CS,SGLIST
|
||
MOVE CS,SGNAME(AC2) ;GET PSECT NAME
|
||
MOVEM CS,SGLIST+1
|
||
MOVSI CS,SIXBIT/ @ /
|
||
MOVEM CS,SGLIST+2
|
||
MOVEI CS,SGLIST
|
||
CALL OUTSIX
|
||
CALL OUTCR
|
||
AOS AC2
|
||
SOJG AC1,ENDP2F ;LOOP THRU PSECT.S
|
||
ENDP2E:>
|
||
HRRZ CS,ABSHI ;GET ABS. BREAK
|
||
CAIG CS,140 ;ANY ABS. CODE
|
||
JRST ENDP2B ;NO, SO DON'T PRINT
|
||
MOVEI CS,[SIXBIT /ABSOLUTE BREAK IS @/]
|
||
CALL OUTSIX
|
||
HRLO CS,ABSHI
|
||
CALL ONC1
|
||
CALL OUTCR
|
||
ENDP2B: MOVEI CS,[SIXBIT /CPU TIME USED @/]
|
||
CALL OUTSIX ;PRINT THE TIME IT TOOK TO ASSEMBLE
|
||
SETZ C, ;SO AS TO GET THE RIGHT TIME
|
||
RUNTIM C, ;GET THE TIME NOW
|
||
SUB C,RTIME ;MINUS TIME WHEN STARTED
|
||
ADD C,R1TIME ;[1231] PLUS PASS1 TIME
|
||
IDIVI C,^D1000 ;GET MS.
|
||
PUSH P,C+1 ;SAVE
|
||
IDIVI C,^D60 ;GET SEC. IN C+1, MIN. IN C
|
||
PUSH P,C+1 ;SAVE SECONDS
|
||
IDIVI C,^D60 ;GET HOURS IN C, MINS. IN C+1
|
||
PUSH P,C+1 ;SAVE MINS
|
||
JUMPE C,NOHOUR ;SKIP IF LESS THAN 1 HOUR
|
||
CALL DNC ;PRINT HOURS
|
||
MOVEI C,":" ;SEPARATOR
|
||
CALL OUTC
|
||
NOHOUR: POP P,CS ;GET MINS
|
||
CALL DECPT2 ;PRINT THEM
|
||
MOVEI C,":"
|
||
CALL OUTC
|
||
POP P,CS ;A LITTLE DIFFERENT FOR MS
|
||
CALL DECPT2 ;PRINT SECONDS
|
||
MOVEI C,"." ;A POINT FOR MS.
|
||
CALL OUTC
|
||
POP P,CS ;GET MS.
|
||
CALL DECPT3 ;PRINT MS.
|
||
CALL OUTCR ;AND A CRLF
|
||
TLNE FR,RIMSW!R1BSW ;RIM MODE?
|
||
CALL RIMFIN ;YES, FINISH IT
|
||
IFN CCLSW,<TLNN IO,CRPGSW> ;[1141] IF NOT IN CCL MODE
|
||
TRO ER,TTYSW ;PRINT SIZE
|
||
CALL OUTCR
|
||
MOVE C,CPUV ;[775] GET CPU VALUE
|
||
CAIGE C,3 ;[775] KI-10 = 3
|
||
JRST [ MOVE C,.JBREL ;[775]
|
||
LSH C,-^D10 ;[775]
|
||
ADDI C,1 ;[775]
|
||
CALL DNC ;[775]
|
||
MOVEI CS,[SIXBIT /K CORE USED@/] ;[775]
|
||
JRST CORSIZ] ;[775]
|
||
MOVE C,.JBREL
|
||
LSH C,-^D9 ;[615]
|
||
ADDI C,1
|
||
CALL DNC
|
||
MOVEI CS,[SIXBIT /P CORE USED@/] ;[615]
|
||
CORSIZ: CALL OUTSIX ;[775]
|
||
CALL OUTCR
|
||
HRR ER,OUTSW
|
||
IFN FTPSECT,< ;[575]
|
||
SETZM SGNCUR ;SET TO BLANK PSECT
|
||
SKIPN SGNMAX ;WERE PSECTS USED?
|
||
JRST ENDP2H ;NO
|
||
ENDP23: CALL SGOUTL ;[631] OUTPUT A SET OF BLOCK 23'S FIRST
|
||
AOS SX,SGNCUR ;[631] NEXT ONE
|
||
CAMG SX,SGNMAX ;[631] ALL DONE?
|
||
JRST ENDP23 ;[631] NO, LOOP
|
||
SETZM SGNCUR ;[631] YES, RESET TO BLANK PSECT
|
||
ENDP2G: CALL SRCHI ;SET UP SRCHX,SGSBOT,SGSTOP
|
||
CALL SGOUTN ;[762] BLOCK-24 BEFORE ITS SYMBOLS
|
||
ENDP2H:
|
||
>
|
||
CALL OUTSET ;[735] BLOCK-10 FOR EACH PSECT
|
||
XWD 10,LSOUT ;[735] OUTPUT THE LOCALS (..-10)
|
||
CALL OUTSET
|
||
XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)
|
||
IFN FTPSECT,< ;[575]
|
||
AOS SX,SGNCUR ;INCR PSECT INX
|
||
CAMG SX,SGNMAX ;LAST PSECT DONE?
|
||
JRST ENDP2G ;NO, DO NEXT PSECT
|
||
SETZM SGNCUR ;SET TO BLANK PSECT
|
||
> ;[575]
|
||
IFN POLISH,< ;[575]
|
||
CALL OUTSET
|
||
XWD 11,POUT ;OUTPUT THE POLISH (..-11)
|
||
MOVSI SX,(POINT 2) ;RESET BYTE COUNT
|
||
HLLM SX,COUTP ;AFTER END OF POLISH
|
||
>
|
||
CALL OUTSET
|
||
XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)
|
||
CALL OUTSET
|
||
XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)
|
||
CALL COUTD
|
||
TLNN IO,MFLSW ;IS IT PRGEND?
|
||
JRST FINIS ;ALAS, FINISHED
|
||
MOVEI CS,SBUF ;RESET SBUF POINTER
|
||
HRRM CS,SUBTTX ;TO SUBTTL
|
||
SETZM PASS2I ;CLEAR PASS2 VARIABLES
|
||
MOVE [XWD PASS2I,PASS2I+1]
|
||
PUSH P,PAGENO ;SAVE PAGE NUMBER IN CASE PRGEND
|
||
BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES
|
||
POP P,PAGENO ;RESTORE IT
|
||
MOVE CS,[SIXBIT/.LOW./] ;[1165] GET NAME OF BLANK PSECT
|
||
MOVEM CS,SGNAME ;[1165] RESET SGNAME
|
||
MOVEM CS,SGLIST ;[1165] AND SGLIST FOR BLANK PSECT
|
||
MOVE CS,SPAGN. ;RESTORE PAGE OFFSET
|
||
MOVEM CS,PAGEN. ;[562]
|
||
; JRST INZ ;RE-INITIALIZE FOR NEXT PROG
|
||
;FALL THROUGH
|
||
SUBTTL PASS INITIALIZE
|
||
|
||
INZ: SETZ C, ;GET CURRENT JOB NUMBER
|
||
RUNTIM C, ;GET RUNTIME FOR LATER
|
||
MOVEM C,RTIME ;SAVE
|
||
INZ1: MOVEI AC1,1 ;[1130] RELOCATABLE MODE IS 1
|
||
MOVEM AC1,MODA ;[1130] RESET ADDRESS MODE
|
||
MOVEM AC1,MODO ;[1130] AND OUTPUT MODE
|
||
IFN FTPSECT,< ;[575]
|
||
TLNE IO,MFLSW ;[1151] IF RESETTING FOR PRGEND
|
||
JUMP2 INZ2A ;[1167][1151] DURING PASS2 - SKIP PSECT INIT
|
||
MOVE AC1,SGNMAX
|
||
MOVSI AC0,1
|
||
MOVEM AC0,SGRELC(AC1)
|
||
SOJGE AC1,.-1
|
||
MOVE AC1,SGNMAX ;GET HIGHEST PSECT USED
|
||
PUSH P,AC1 ;SAVE IT
|
||
INZ2: CAME AC1,SGNCUR ;IF NOT CURRENT
|
||
CALL %SWSEG ;SWAP IT
|
||
INZ2A: ;[1167]
|
||
>
|
||
MOVEI VARHD
|
||
MOVEM VARHDX
|
||
MOVEI LITHD
|
||
MOVEM LITHDX
|
||
CALL LITI
|
||
IFN FTPSECT,< ;[575]
|
||
TLNE IO,MFLSW ;[1167] DOING PRGEND?
|
||
JUMP2 INZ3 ;[1167] YES, SKIP PSECT INIT
|
||
SOSL AC1,0(P) ;DONE YET?
|
||
JRST INZ2 ;NO
|
||
POP P,AC1 ;GET JUNK OFF STACK
|
||
INZ3: ;[1151]
|
||
>
|
||
MOVEI AC1,RELLOC ;[716] RESET POINTER
|
||
MOVEM AC1,REL1P+1 ;[716]
|
||
SETZM SEQNO
|
||
PUSH P,[^D8] ;[613] INIT TO DEFAULT RADIX
|
||
POP P,CURADX ;[613]
|
||
CALL STOWI
|
||
IFN FORMSW,<
|
||
SETZM IOSEEN ;[717] CLEAR IO FORMAT SWITCH
|
||
HRRES HWFMT> ;SET DEFAULT VALUE BACK
|
||
CALL OUTLI ;[774] INIT NEW LINE
|
||
SETZM LBLFLG ;[1074] CLEAR LABEL-IN-LITERAL FLAG
|
||
SETZM TAGINC ;[774] REINIT TAG OFFSET
|
||
RET ;[774]
|
||
|
||
; ROUTINE TO PRINT CPU TIME USED
|
||
DECPT3: MOVEI C,"0" ;FILL WITH ZERO
|
||
CAIG CS,^D99 ;3 DIGITS?
|
||
CALL OUTC ;NO
|
||
DECPT2: MOVEI C,"0" ;FILL WITH ZERO
|
||
CAIG CS,^D9 ;2 DIGITS?
|
||
CALL OUTC ;NO
|
||
MOVE C,CS ;GET VALUE
|
||
PJRST DNC ;OUTPUT IN DECIMAL AND RETURN
|
||
|
||
RIMFIN: TLNE FR,R1BSW
|
||
CALL R1BDMP
|
||
SKIPN C,VECTOR
|
||
MOVSI C,(JRST 4,)
|
||
TLNN C,777000
|
||
TLO C,(JRST)
|
||
CALL PTPBIN
|
||
MOVEI C,0
|
||
JRST PTPBIN
|
||
SUBTTL PSEUDO-OP HANDLERS
|
||
|
||
TAPE0: CALL STOUTS ;FINISH THIS LINE
|
||
SETZM EOFFLG ;CLEAR END OF FILE FLAG
|
||
CALL PEEK ;LOOK AT NEXT CHARACTER
|
||
CAIE C,VT ;PRINT IF V TAB
|
||
CAIN C,FF ;OR FORM FEED
|
||
CALL STOUTS
|
||
SKIPE EOFFLG ;EOF SEEN DURING PEEKING?
|
||
RET ;YES
|
||
TLZ IO,IORPTC ;NO, CLEAR CHARACTER FROM LOOK-AHEAD
|
||
CALL OUTLI2 ;AND FROM LINE BUFFER
|
||
JRST GOTEND ;IGNORE THE REST OF THIS FILE
|
||
|
||
%NOBIN: TLZE FR,PNCHSW ;IS REL FILE OPEN?
|
||
CLOSE BIN,40 ;YES, GET RID OF IT
|
||
RET
|
||
|
||
RADIX0: CALL EVAL10 ;EVALUATE RADIX D10
|
||
CAIG AC0,^D10 ;IF GREATER THAN 10
|
||
CAIG AC0,1 ;OR LESS THAN 2,
|
||
ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP
|
||
HRRZM AC0,CURADX ;[613] SET NEW RADIX
|
||
RET
|
||
|
||
XALL0: JUMP1 CPOPJ ;[664] IGNORE ON PASS 1
|
||
TLZN IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL
|
||
JRST IOSET ;NOT SALL ON SO NOTHING TO WORRY ABOUT
|
||
CAIE C,EOL ;END OF LINE SEEN?
|
||
JRST IOSET ;[1150] NO
|
||
LDB C,LBUFP ;GET LAST CHARACTER
|
||
CAIN C,CR ;UNDER SPECIAL CIRCUMSTANCES IT GETS REMOVED
|
||
JRST IOSET ;[1150] NO, ALL IS WELL
|
||
SOSG CPL ;ANY ROOM?
|
||
CALL RSW5 ;NO, SEE IF ANY EXCESS IN IT
|
||
MOVEI C,CR ;NOW FOR TERMINATOR
|
||
IDPB C,LBUFP ;WILL GET REMOVED LATER
|
||
|
||
IOSET: JUMP1 .+2 ;[1065] EXIT IN PASS1
|
||
HLLZM AC0,IOFLGS ;[1065] SAVE FLAGS FOR OUTLI5
|
||
RET ;[1065] OUTPUT LINE BEFORE SETTING FLAGS
|
||
|
||
IOLSET: JUMP1 CPOPJ ;[664] SPECIAL FOR LALL, TO SEE IF IN MACRO UNDER SALL
|
||
TLNE IO,IOSALL ;SEE IF SALL
|
||
JUMPN MRP,IOLSE1 ;AND IN MACRO
|
||
IORSET: TDZ IO,AC0 ;NO, SET FLAG
|
||
RET ;AND RETURN
|
||
|
||
IOLSE1: SKIPE CRLFSN ;[1065] HAVE WE SEEN A CRLF?
|
||
TLZA IO,IOPALL!IOSALL ;[1065] YES, SET FLAGS AND EXIT
|
||
SETOM IOFLGS ;[1065] WAIT TO SET LALL TILL
|
||
RET ;[1065] LINE IS OUTPUT
|
||
|
||
BLOCK0: CALL HIGHQ
|
||
IFN POLISH,< TRO FRR,NOPSW> ;[616] DON'T ALLOW POLISH
|
||
CALL EVALEX ;EVALUATE
|
||
IFN POLISH,< TRZ FRR,NOPSW> ;[616] UNDO NO POLISH SWITCH
|
||
TLNE AC0,-1 ;SEE IF VALID ARG TYPE
|
||
JRST ERRAX ;NO, GIVE ERROR
|
||
TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?
|
||
CALL QEXT ;YES, DETERMINE TYPE
|
||
ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION
|
||
BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK
|
||
ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION
|
||
BLOCK2: HRLOM AC0,LOCBLK
|
||
JUMP2 CPOPJ ;[664]
|
||
TRNE ER,ERRU
|
||
TRO ER,ERRV
|
||
RET
|
||
|
||
PRNTX0: CALL BYPASS ;[664] GET FIRST CHAR.
|
||
TLOA IO,IORPTC ;REPEAT IT AND SKIP
|
||
PRNTX4: CALL PRINT ;PRINT THE CHAR.
|
||
TRZ ER,TTYSW!LPTSW ;[723] IN CASE OF LONG LINE
|
||
CALL CHARAC ;GET ASCII CHAR.
|
||
TRO ER,TTYSW ;[723] SET OUTPUT TO TTY
|
||
JUMP2 .+2 ;[723] BUT NOT ON PASS2 IF LSTDEV=TTY
|
||
TDOA ER,OUTSW ;[723] SET OUTPUT TO LSTDEV
|
||
ANDCM ER,OUTSW ;[723]
|
||
CAIG C,CR ;IF GREATER THAN CR
|
||
CAIG C,HT ;OR LESS THAN LF
|
||
JRST PRNTX4 ;THEN CONTINUE
|
||
CALL OUTCR ;OUTPUT A CRLF
|
||
TRZ ER,TTYSW!LPTSW ;[664] TURN OFF OUTPUT
|
||
RET ;[664] EXIT
|
||
|
||
REMAR0: SETOM INRMRK ;[1177] REMARK IN PROGRESS
|
||
CALL GETCHR ;GET A CHARACTER
|
||
REMAR1: CAIE C,EOL
|
||
JRST REMAR0+1 ;[1177]
|
||
SETZM INRMRK ;[1177] ALL DONE
|
||
RET ;EXIT
|
||
|
||
PAGE0: CALL STOUTS ;PAGE PSEUDO-OP
|
||
PAGE1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?
|
||
TLNE IO,IOPROG ;AND NOT XLISTED?
|
||
JRST PAGE2 ;NO
|
||
HRR ER,OUTSW
|
||
CALL CLSCRF
|
||
CALL OUTCR
|
||
HRRI ER,0
|
||
PAGE2: TLO IO,IOPAGE
|
||
RET
|
||
|
||
LIT0: CALL BLOCK1
|
||
CALL STOUTS
|
||
LIT1: JUMP2 LIT20
|
||
IFN FTPSECT,< ;[707]
|
||
SKIPN SGNMAX ;[707] DOING PSECTS?
|
||
JRST LIT2 ;[707] NO, JUMP
|
||
MOVE V,HIGH ;[707] CHECK PC WITH HIGHEST ADDR
|
||
CAMG V,LOCA ;[707] HIGH IS LARGER?
|
||
JRST LIT2 ;[707] NO, JUMP
|
||
MOVEM V,LOCA ;[707] YES, UPDATE PC
|
||
MOVEM V,LOCO ;[707]
|
||
LIT2: ;[707]
|
||
>
|
||
|
||
;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR
|
||
MOVE AC0,LITCNT
|
||
MOVE SX,LITHDX
|
||
HRLM AC0,0(SX)
|
||
MOVE V,LOCA
|
||
HRL V,MODA
|
||
MOVEM V,-1(SX)
|
||
MOVE V,LOCO ;[1166] GET THE OUTPUT LOCATION
|
||
HRL V,MODO ;[1166] AND RELOCATION
|
||
MOVEM V,-2(SX) ;[1166] SAVE IN BLOCK INFO
|
||
JRST LIT24
|
||
|
||
LIT20: PUSH P,LOCA
|
||
PUSH P,LOCO
|
||
SKIPN LITNUM
|
||
JRST LIT20A
|
||
MOVE SX,LITHDX
|
||
HRRZ AC0,-1(SX)
|
||
CAME AC0,LOCA
|
||
TRO ER,ERRP
|
||
LIT20A: MOVE SX,LITAB
|
||
LIT21: SOSGE LITNUM
|
||
JRST LIT22
|
||
IFN FORMSW,<
|
||
MOVE AC0,-3(SX)
|
||
MOVEM AC0,FORM
|
||
>
|
||
MOVE AC0,-2(SX) ;WFW
|
||
MOVE RC,-1(SX) ;WFW
|
||
IFN POLISH,<
|
||
CAMN RC,[1B0] ;SPECIAL FAKE RELOC?
|
||
SETZ RC, ;YES
|
||
>
|
||
MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT
|
||
CALL STOW20 ;STOW CODE
|
||
TLNE IO,IOSALL ;[1062] IF IN SALL MACRO, FORGET
|
||
JUMPN MRP,.+3 ;[1062] LINE-FEED (SEE OUTL25+2)
|
||
MOVEI C,12 ;SET LINE FEED
|
||
IDPB C,LBUFP
|
||
CALL OUTLIN ;OUTPUT THE LINE
|
||
JRST LIT21
|
||
|
||
LIT22: HRRZ AC2,LOCO
|
||
POP P,LOCO
|
||
POP P,LOCA
|
||
MOVE SX,LITHDX
|
||
HLRZ AC0,0(SX)
|
||
SUB AC2,LOCO ;COMPUTE LENGTH USED
|
||
CAMGE AC0,AC2 ;USE LARGER
|
||
MOVE AC0,AC2
|
||
ADD AC2,LOCO
|
||
LIT24: ADDM AC0,LOCA
|
||
ADDM AC0,LOCO
|
||
CALL GETTOP
|
||
HRRM SX,LITHDX
|
||
LITI: SETZM LITCNT
|
||
SETZM LITNUM
|
||
MOVEI LITAB
|
||
MOVEM LITABX
|
||
JRST HIGHQ
|
||
|
||
GETTOP: HRRZ AC1,SX ;VARHD
|
||
HRRZ SX,0(SX)
|
||
JUMPN SX,CPOPJ ;[664]
|
||
IFE FORMSW,< MOVEI SX,3> ;WFW
|
||
IFN FORMSW,< MOVEI SX,4> ;ICC
|
||
ADDB SX,FREE
|
||
CAML SX,SYMBOL
|
||
CALL XCEED
|
||
SUBI SX,1 ;MAKE SX POINT TO LINK
|
||
SETZM 0(SX) ;CLEAR FORWARD LINK
|
||
HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK
|
||
RET
|
||
|
||
VAR0: CALL BLOCK1 ;PRINT LOCATION
|
||
CALL VARP ;CHECK VAR AREA FOR PHASE ERROR
|
||
CALL VARA
|
||
JRST STOUTS
|
||
|
||
VARP: JUMP1 CPOPJ ;[664] DO NOT CHECK START ON PASS1
|
||
SKIPN VARCNT ;ANY VARIABLE?
|
||
RET ;NO, RETURN
|
||
MOVE SX,VARHDX
|
||
MOVE AC0,LOCA ;GET LOCATION FOR CHECK
|
||
CAMN AC0,-1(SX) ;SAME START FOR BOTH PASSES?
|
||
RET ;YES,
|
||
CAML AC0,-1(SX) ;NO,BIGGER IN PASS2
|
||
JRST [ TRO ER,ERRP ;GIVE P ERROR
|
||
RET]
|
||
HLRZ AC0,0(SX) ;SMALLER ON PASS2
|
||
JUMPE AC0,CPOPJ ;[664] RETURN IF NO VAR
|
||
MOVE AC0,-1(SX) ;OTHERWISE, ADJUST LOCA & LOCO
|
||
MOVEM AC0,LOCA ;TO PASS1 VALUES
|
||
MOVEM AC0,LOCO
|
||
RET ;AND RETURN
|
||
|
||
VARA: MOVE SX,VARHDX
|
||
MOVE AC0,LOCA ;GET LOCATION FOR CHECK
|
||
MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2
|
||
HLRZ AC0,0(SX)
|
||
ADDM AC0,LOCA
|
||
ADDM AC0,LOCO
|
||
CALL GETTOP
|
||
HRRM SX,VARHDX
|
||
JUMP2 CPOPJ ;[664]
|
||
SETZM VARCNT ;CLEAR VARIABLE COUNTER
|
||
IFN FTPSECT,< ;[715]
|
||
SKIPE SGNMAX ;[715] DOING PSECTS?
|
||
JRST [ CALL SGLKUP ;[715] YES, LOOKUP ONLY CURRENT TABLE
|
||
TRNN ARG,VARF ;[715] GOT A VARIABLE?
|
||
RET ;[715] NO, EXIT
|
||
JRST VARA2] ;[715] MAYBE, CHECK MORE
|
||
> ;[715]
|
||
CALL LOOKUP ;SET FOR TABLE SCAN
|
||
TRNN ARG,VARF ;GOT A VARIABLE?
|
||
RET ;NO, E EXIT
|
||
VARA2: TRC ARG,LTAGF ;[742] MAKE SURE NOT USED WITH LTAGF
|
||
TRCN ARG,LTAGF ;[742]
|
||
RET ;[742]
|
||
TRC ARG,SIXF ;MAKE SURE VARF IS NOT PART OF SIXF
|
||
TRCN ARG,SIXF
|
||
RET ;IT'S SIXF, SO IGNORE THIS ONE
|
||
AOS VARCNT ;INCREMENT VARIABLE COUNTER
|
||
TRZ ARG,UNDF+VARF ;TURN OFF FLAGS NOW
|
||
MOVSI AC0,1(V) ;NUMBER TO ADD TO
|
||
ADDM AC0,0(AC1) ;UPDATE COUNT
|
||
VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK
|
||
ADDM V,LOCO
|
||
EXCH V,LOCA
|
||
ADDM V,LOCA
|
||
HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS
|
||
IOR ARG,MODA ;SET TO ASSEMBLY MODE
|
||
MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY
|
||
JRST HIGHQ1
|
||
|
||
IF: PUSH P,AC0 ;SAVE AC0
|
||
PUSH P,IO
|
||
IFN POLISH,< TRO FRR,NOPSW> ;[613] DON'T WANT POLISH HERE
|
||
CALL EVALXQ ;EVALUATE AND TEST EXTERNAL
|
||
POP P,AC1
|
||
JUMP2 .+2 ;[743]
|
||
TRZ ER,ERRV ;[743] SUPRESS V-ERROR IF PASS1
|
||
IORI ER,(AC1) ;RESTORE PREVIOUS ERROR FLAGS
|
||
JUMPL AC1,IFPOP
|
||
TLZ IO,FLDSW
|
||
IFPOP: POP P,AC1 ;RETRIEVE SKIP INSTRUCTION
|
||
IFSET: TLO IO,IORPTC ;REPEAT CHARACTER
|
||
IFXCT: XCT AC1 ;[660] EXECUTE INSTRUCTION
|
||
IFXF: TDZA AC0,AC0 ;FALSE
|
||
IFXT: MOVEI AC0,1 ;TRUE
|
||
IFEXIT: SETZM EXTPNT ;JUST IN CASE
|
||
IFN POLISH,< TRZ FRR,NOPSW> ;[613] UNDO NO-POLISH SWITCH
|
||
IFN FTPSECT,< TLZ IO,RSASSW> ;[575]
|
||
JUMPAD IFEX1 ;[664] BRANCH IF IN ADDRESS FIELD
|
||
IFDO: CALL BYPASS ;[664] GET NEXT NON-BLANK
|
||
CAIN C,EOL ;AT EOL?
|
||
JRST REPEA1 ;YES, USE OLD METHOD
|
||
CAIE C,',' ;ARE WE AT THE COMMA?
|
||
CAIN C,'<' ;OR START OF CONDITIONAL?
|
||
CAIA ;YES
|
||
JRST IFDO ;NOT YET AT COMMA OR ANGLE BRKT
|
||
CAIN C,',' ;IGNORE THE COMMA
|
||
CALL BYPASS ;[664] AND GET SOMETHING ELSE
|
||
TLO IO,IORPTC ;REPEAT LAST CHAR.
|
||
CAIE C,'<' ;OLD METHOD USED ANGLES
|
||
CAIN C,EOL ;ALSO OLD IF NEW LINE SEEN
|
||
JRST REPEA1 ;ASSEMBLE CODE BETWEEN ANGLES
|
||
JUMPLE AC0,REMAR0 ;FALSE, TREAT AS COMMENT
|
||
JRST STMNT ;TRUE, ASSEMBLE IT
|
||
|
||
IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1
|
||
MOVE AC1,AC0 ;PLACE IT IN AC1
|
||
JRST IFSET ;EXECUTE INSTRUCTION
|
||
|
||
IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION
|
||
IFB1: CALL CHARL ;GET FIRST NON-BLANK
|
||
CAIE C," "
|
||
CAIN C,HT
|
||
JRST IFB1 ;SKIP BLANKS AND TABS
|
||
CAIG C,CR ;CHECK FOR CARRET AS DELIM.
|
||
CAIGE C,LF
|
||
CAIA
|
||
JRST ERRAX
|
||
FORERR (SX,CND)
|
||
SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS
|
||
CAIN C,"<" ;LEFT BRACKET?
|
||
SETZB C,RC ;YES, PREPARE FOR OLD FORMAT
|
||
SKIPA SX,C ;SAVE FOR COMPARISON
|
||
IFB3: TRO AC0,1 ;SET FLAG
|
||
IFB2: CALL CHARL ;GET ASCII CHARACTER AND LIST
|
||
CAMN C,SX ;TEST FOR DELIMITER
|
||
JRST IFXCT ;FOUND
|
||
CAIE C," " ;BLANK?
|
||
CAIN C,HT ;OR TAB?
|
||
JRST IFB2 ;YES
|
||
JUMPN SX,IFB3 ;JUMP IF NEW FORMAT
|
||
CAIN C,"<" ;<?
|
||
AOJA RC,IFB2 ;YES, INCREMENT COUNT
|
||
CAIN C,">" ;>?
|
||
SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE
|
||
JRST IFB3 ;GET NEXT CHARACTER
|
||
|
||
IFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF
|
||
PUSH P,AC0 ;STACK IT
|
||
IFN FTPSECT,< ;[575]
|
||
HRROS SGNCUR ;DON'T COPY IF FOUND
|
||
>
|
||
CALL GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL
|
||
TROA ER,ERRA ;ILLEGAL!
|
||
CALL SEARCH ;ANYTHING IN THE SYMBOL TABLE?
|
||
JRST [CALL OPTSCH ;NO, HOW ABOUT OP TABLE?
|
||
TLO ARG,UNDF
|
||
JRST IFDEF1] ;[764] FINISH CHECKING
|
||
JUMPG ARG,[CAME AC0,-3(SX) ;[764] IF OPDEF, GO CHECK FOR SYMBOL
|
||
JRST IFDEF1 ;[764] NO SYMBOL
|
||
SUBI SX,2 ;[764] SYMBOL ALSO
|
||
CALL SRCH5 ;[764] SYMBOL PREFERRED, SO POINT TO SYMBOL
|
||
JRST .+1] ;[764]
|
||
TLNE ARG,UNDF ;[764] UNDEFINED SYMBOL?
|
||
CAME AC0,1(SX) ;[764] YES, WAS IT AN OPDEF TOO?
|
||
JRST IFDEF1 ;[764] NO, FINISH CHECKING
|
||
ADDI SX,2 ;[764] HERE IF BOTH OPDEF AND UNDEFINED SYMBOL
|
||
CALL SRCH5 ;[764] IN THIS CASE, OPDEF IS PREFERED
|
||
TLNE ARG,UNDF ;[764] BUT WAS IT UNDEFINED OPDEF?
|
||
CALL [ SUBI SX,2 ;[764] UNDEFINED OPDEF & UNDEFINED SYMBOL
|
||
PJRST SRCH5] ;[764] THEN POINT TO UNDEFINED SYMBOL
|
||
IFDEF1: ;[664]
|
||
IFN FTPSECT,< ;[575]
|
||
HRRZS SGNCUR ;CLEAR FLAG
|
||
>
|
||
CALL SSRCH3 ;EMIT TO CREF ANYWAY
|
||
JRST IFPOP ;POP AND EXECUTE INSTRUCTION
|
||
|
||
IFIDN0: HLRZS AC0
|
||
MOVEI V,2*.IFBLK-1
|
||
SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK
|
||
SOJGE V,.-1
|
||
SETZM .TEMP ;CLEAR STORED DELIMETER
|
||
MOVEI RC,IFBLK ;SET FOR FIRST BLOCK
|
||
CALL IFCL ;GET FIRST STRING
|
||
MOVEI RC,IFBLKA
|
||
CALL IFCL ;GET SECOND STRING
|
||
MOVEI V,.IFBLK-1
|
||
MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING
|
||
CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING
|
||
SOJGE V,.-2 ;EQUAL, TRY NEXT WORD
|
||
JUMPL V,IFEXIT ;DID WE FINISH STRING
|
||
XORI AC0,1 ;NO, TOGGLE REQUEST
|
||
JRST IFEXIT ;DO NOT TURN ON IORPTC WFW
|
||
|
||
IFCL: CALL CHARAC ;GET AND LIST CHARACTER
|
||
CAIE C," " ;SKIP SPACES
|
||
CAIG C,CR ;ALSO SKIP CR-LF
|
||
CAIGE C,HT ;AND TAB
|
||
JRST .+2 ;NOT ONE OF THEM
|
||
JRST IFCL ;SO LONG COMPARISONS WILL WORK
|
||
;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***
|
||
CAIE C,"," ;IS IT A COMMA?
|
||
JRST .+3 ;NO
|
||
SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?
|
||
JRST IFCL ;YES, IGNORE COMMA AND SPACES
|
||
; ***
|
||
CAIN C,"<" ;WAS IT LEFT BRACKET?
|
||
SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET
|
||
MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON
|
||
MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH
|
||
HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC
|
||
IFCLR: CALL CHARAC
|
||
SKIPLE .TEMP ;NEW METHOD?
|
||
JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING
|
||
CAIN C,"<" ;ANOTHER LEFT ANGLE?
|
||
SOS .TEMP ;YES, KEEP COUNT
|
||
CAIN C,">" ;CLOSING ANGLE
|
||
AOSGE .TEMP ;MATCHING COUNT?
|
||
IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER
|
||
RET ;EXIT ON RIGHT DELIMITER
|
||
SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?
|
||
TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING
|
||
IDPB C,RC ;DEPOSIT BYTE
|
||
JRST IFCLR
|
||
IFEX1: CALL GETCHR ;SEARCH FOR "<"
|
||
CAIN C,EOL ;ERROR IF END OF LINE
|
||
JRST ERRAX
|
||
CAIE C,'<'
|
||
JRST IFEX1
|
||
JUMPE AC0,IFEX2 ;TEST FOR 0
|
||
TLO IO,IORPTC ;NO, PROCESS AS CELL
|
||
CALL CELL
|
||
IFN FORMSW,<MOVE AC1,HWFORM> ;USE STANDARD FORM
|
||
SETZM INCND ;NOT ANY MORE
|
||
JRST STOW ;STOW CODE AND EXIT
|
||
|
||
IFEX2: CALL GETCHR
|
||
CAIN C,34 ;"<"?
|
||
AOJA AC0,IFEX2 ;YES, INCREMENT COUNT
|
||
CAIE C,36 ;">"?
|
||
JRST IFEX2 ;NO, TRY AGAIN
|
||
SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH
|
||
CALL BYPASS ;[664] YES, MOVE TO NEXT DELIMITER
|
||
SETZM INCND ;OUT OF CONDITIONAL NOW
|
||
AOJA AC0,STOWZ1 ;STOW ZERO
|
||
INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS
|
||
INTER1: CALL GETSYM ;GET A SYMBOL
|
||
JRST INTER3 ;INVALID, SKIP
|
||
JUMP1 INTER2 ;[675] IF PASS1 INSERT AS UNDF SYM
|
||
MOVE AC1,INTENT ;[675] GET INTF/ENTF FLAGS
|
||
TLNE AC1,ENTF ;[675] CAN'T "ENTRY" OPDEF
|
||
JRST INTER2 ;[675]
|
||
CALL SSRCH ;[675] IN SYMBOL TABLE?
|
||
JRST [CALL MSRCH ;[675] NO, CHECK OPDEF IN CASE NO PASS1
|
||
SKIPA ;[675] ELSE FLAG AS UNDF SYM
|
||
TLNN ARG,OPDF ;[675]
|
||
MOVSI ARG,SYMF!UNDF ;[675]
|
||
JRST INTER4] ;[675]
|
||
TLNN ARG,UNDF ;[675] YES, UNDEFINED?
|
||
JRST INTER4 ;[675] NO, ALL IS FINE
|
||
PUSH P,SX ;[675] UHOH, SAVE SX FOR REMOVE
|
||
CALL MSRCH ;[675] IF OPDEF, PHYSICALLY REMOVE UNDF SYM
|
||
JRST INTER5 ;[675]
|
||
TLNN ARG,OPDF ;[675]
|
||
JRST INTER5 ;[675]
|
||
EXCH SX,(P) ;[675] GET OLD SX, SAVE NEW FOR CONTINUE
|
||
PUSH P,AC0 ;[675] SAVE NAME
|
||
CALL REMOVE ;[675] REMOVE UNDF SYM
|
||
POP P,AC0 ;[675]
|
||
INTER5: POP P,SX ;[675] RESTORE OPDEF TABLE PTR
|
||
INTER4: CALL SUPSYM ;[675] SEE IF "!" SEEN
|
||
TLNN ARG,UNDF ;ALLOW FORWARD REFERENCE
|
||
JRST [TLNN ARG,SYNF!EXTF ;[1070][733] GIVE ERROR IF ARG IS EXTERN
|
||
JRST .+1 ;[733] OR SYN
|
||
MOVE AC1,INTENT ;[733]
|
||
TLNN AC1,ENTF ;[733]
|
||
JRST INTER8 ;[1070][733] ERROR
|
||
TRO ER,ERRA ;[733]
|
||
JUMP1 .+1 ;[733] IF ENTRY, SET ENTF IN CASE FIXED UP LATER
|
||
TDZ ARG,INTENT ;[733] ON PASS2, TURN OFF ENTF IF ILLEGAL
|
||
JRST INTER6] ;[733] UPDATE SYMTAB
|
||
TDO ARG,INTENT ;[1014] SET APPROPRIATE FLAGS
|
||
IFN FTPSECT,<
|
||
INTER6: SKIPE SGNMAX ;[1014] DOING PSECTS?
|
||
TLNE ARG,UNDF!VARF ;[1024][1014] UNDEFINED?
|
||
JRST [ CALL INSERQ ;[1014] NOT DOING PSECT, OR SYMBOL UNDEFINED
|
||
JRST INTER7] ;[1014] NEXT SYMBOL
|
||
PUSH P,SGNCUR ;[1014] DEFINED AND DOING PSECTS
|
||
MOVE AC1,SGWFND ;[1014] MAKE PSECT OF THE LABEL CURRENT PSECT
|
||
MOVEM AC1,SGNCUR ;[1014] SO, THE SYMBOL WON'T CHANGE PSECT
|
||
CALL INSERQ ;[1024][1014] JUST FOR INSERT/UPDATE
|
||
POP P,SGNCUR ;[1014] RECOVER THE REAL CURRENT PSECT
|
||
>
|
||
IFE FTPSECT,<
|
||
INTER6: CALL INSERQ ;[1014] INSERT/UPDATE
|
||
>
|
||
INTER7: JUMPCM INTER1 ;[1014] LOOP BACK
|
||
SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD
|
||
IFN FTPSECT,< ;[575]
|
||
TLZ IO,RSASSW ;...
|
||
>
|
||
RET ;NO, EXIT
|
||
|
||
INTER2: CALL SSRCH ;[675] SEE IF IN SYM TAB
|
||
MOVSI ARG,SYMF!UNDF!INTF ;[675] ELSE FLAG AS UNDF
|
||
JRST INTER4 ;[675]
|
||
|
||
INTER8: TLNE ARG,EXTF ;[1070] DEFINED AS EXTERNAL?
|
||
TROA ER,ERRE ;[1070] YES - GIVE E-ERROR INSTEAD
|
||
INTER3: TRO ER,ERRA ;[1014] FLAG ARG EROR AND SKIP
|
||
JRST INTER7 ;[1014] GO CHECK FOR NEXT SYMBOL
|
||
|
||
;.IF/.IFN SYMBOL ATTRIBUTE
|
||
NUMF==1B18 ;LOCAL FLAG - ATOM IS A NUMBER
|
||
OPCF==1B19 ;LOCAL FLAG - ATOM IS AN OPCODE
|
||
NOTF==1B20 ;[621] NOT FOUND IN SYMBOL TABLE
|
||
|
||
%IF: TDZA AC0,AC0 ;.IF = 0
|
||
%IFN: MOVEI AC0,1 ;.IFN = 1
|
||
PUSH P,AC0 ;STORE WHICH
|
||
PUSH P,IO ;SAVE CURRENT FLAGS
|
||
TRZ ER,ERRORS ;RESET ERROR FLAGS
|
||
SETOM .IFFLG ;[1056] FLAG "EVALUATING .IF(N) ARG"
|
||
SETZM .IFNUM ;[1056] ZERO APPROPRIATE FLAGS
|
||
SETZM IFSRCH ;[1056]
|
||
SETZM .IFANG ;[1056]
|
||
SETOM .IFNAM ;[1112] ASSUME THIS IS A SIMPLE RADIX50 NAME
|
||
CALL ATOM ;GET THE ATOM TO BE TESTED
|
||
SETZM .IFFLG ;[1056] CLEAR ".IF(N)" FLAG
|
||
MOVE AC1,IO ;GET FLAGS FOR THE ATOM
|
||
POP P,IO ;RESTORE PREVIOUS FLAGS
|
||
TLNE AC1,IORPTC ;[1056] ALLOW .IF<EXP>,...
|
||
TLO IO,IORPTC ;[1056]
|
||
JUMPNC IFERRA ;MAKE SURE TERMINATOR WAS A COMMA
|
||
TLNE AC1,NUMSW ;WAS IT A NUMBER?
|
||
JRST %IF2 ;[1056] DO NUMERIC CHECKS
|
||
CALL SEARCH ;GENERAL SEARCH
|
||
JRST [CALL OPTSCH ;NOT SYMBOL, SEE IF OPCODE
|
||
SKIPA ARG,[UNDF+NOTF] ;[621] NOT OPCODE, ATOM UNDEFINED
|
||
MOVE ARG,[SYMF,,OPCF] ;OPCODE, IS ALSO SYMBOL
|
||
JRST %IF1] ;GO GET TYPE AND TEST
|
||
JUMPL ARG,IFS1 ;JUMP IF HAVE SYMBOL DEFINITION
|
||
CAME AC0,-3(SX) ;HAVE OPDEF, SYMBOL ALSO PRESENT?
|
||
JRST IFS2 ;NO
|
||
SUBI SX,2 ;YES, POINT TO IT
|
||
CALL SRCH5 ;RESET REGISTERS
|
||
IFS1: CAMN AC0,1(SX) ;HAVE SYMBOL, OPDEF ALSO PRESENT?
|
||
IOR ARG,2(SX) ;YES, MERGE FLAGS
|
||
IFS2: HRRI ARG,0 ;NO RH LOCAL FLAGS IF SYMBOL
|
||
%IF1: CALL GETSYM ;GET ATTRIBUTE
|
||
JRST IFERRA ;MUST BE A SYMBOL
|
||
CAIE C,'<' ;[677] IF "<", SET REPEAT AND CONTINUE
|
||
JUMPNC IFERRA ;[677] ELSE TERMINATE WITH COMMA
|
||
TLO IO,IORPTC ;[677]
|
||
CALL %IFSTM ;SETUP MASK
|
||
MOVSI AC2,-IFLEN ;AOBJN PTR
|
||
IFLOOP: MOVE SDEL,IFATAB(AC2) ;GET NAME
|
||
ANDCM SDEL,AC1 ;MASK
|
||
CAMN AC0,SDEL ;MATCH
|
||
JRST IFOUND ;GOT IT
|
||
AOBJN AC2,IFLOOP ;LOOP
|
||
JRST IFERRA ;[611] NOT FOUND, A-ERROR
|
||
|
||
;SETUP MASK TO LOOK AT ONLY AS MANY LETTERS AS USER TYPED. ALLOWS
|
||
;ATTRIBUTE TO BE UNIQUELY ABBREVIATED.
|
||
%IFSTM: SETO AC1, ;START WITH ALL
|
||
TDNE AC0,AC1 ;STILL SEEING USERS CHARS?
|
||
JRST [LSH AC1,-6 ;YES, SHIFT OUT ONE SIXBIT CHAR
|
||
JRST .-1] ;TRY AGAIN
|
||
RET ;MASK NOW IN AC1
|
||
|
||
;ANY DETECTED ERROR IN THIS PSEUDOOP GIVES "A" ERROR
|
||
IFERRA: POP P,AC0 ;CLEAR STACK
|
||
JRST ERRAX ;ERROR "A"
|
||
|
||
IFOUND: MOVE SDEL,IFATAB+1(AC2) ;[611] CHECK NEXT ENTRY IN TABLE
|
||
ANDCM SDEL,AC1 ;[611] MASK
|
||
CAMN AC0,SDEL ;[611] MATCH?
|
||
JRST IFERRA ;[611] YES, ABBR. NOT UNIQUE, A-ERROR
|
||
POP P,AC0 ;[611] GET WHICH
|
||
JUMPN AC0,IFNTST ;[611] .IFN
|
||
; JRST IFTST ;[611] .IF
|
||
|
||
IFTST: XCT IFJTAB(AC2) ;MAKE TEST
|
||
JRST IFXF ;FALSE
|
||
JRST IFXT ;TRUE
|
||
|
||
IFNTST: XCT IFJTAB(AC2) ;MAKE TEST
|
||
JRST IFXT ;TRUE
|
||
JRST IFXF ;FALSE
|
||
|
||
%IF2: TRNE AC1,ERRORS ;[1056] ERRORS IN ATOM?
|
||
JRST [MOVEI ARG,UNDF+NOTF ;[1056]
|
||
JRST %IF1] ;[1056] SKIP SEARCH
|
||
SKIPN IFSRCH ;[1056] SEARCH PERFORMED ALREADY?
|
||
JRST [MOVEI ARG,NUMF ;[1056] NO, IT'S REALLY A NUMBER
|
||
JRST %IF1] ;[1056] SKIP SEARCH
|
||
HLLZ ARG,IFSRCH ;[1056] GET MERGED ARG BITS
|
||
SKIPE .IFNUM ;[1056] NUMBER SEEN TOO?
|
||
TRO ARG,NUMF ;[1056] YES, MERGE IT IN
|
||
TDNE RC,[-2,,-2] ;[1056] DO RELOCATION CHECKS
|
||
JRST [TLO ARG,EXTF ;[1056] ANY FIXUP RETURNS EXTERNAL
|
||
JRST %IF1] ;[1056] (ALONG WITH MERGED BITS)
|
||
TLNE RC,1 ;[1056] LH RELOCATABLE?
|
||
TLOA ARG,LELF ;[1056] SET FLAG
|
||
TLZ ARG,LELF ;[1056] ELSE FORCE FLAG OFF
|
||
TRNE RC,1 ;[1056] SAME TEST FOR RIGHT-HALF
|
||
TLOA ARG,RELF ;[1056]
|
||
TLZ ARG,RELF ;[1056]
|
||
JRST %IF1 ;[1056] GET ATTRIBUTE
|
||
|
||
;[611] KEEP ATTRIBUTE TABLE ALPHABETICAL
|
||
DEFINE IFATRIB <
|
||
XX ABSOLUTE,<TLNE ARG,LELF!RELF!SYNF!MACF!EXTF!UNDF!SPTR>
|
||
XX ASSIGNMENT
|
||
XX ENTRY,<TLNN ARG,ENTF>
|
||
XX EXPRESSION,<SKIPN .IFANG> ;;[1056] ANGLE-BRACKET SEEN?
|
||
XX EXTERNAL,<TLNN ARG,EXTF!SPTR>
|
||
XX GLOBAL,<TLNN ARG,ENTF!EXTF!INTF!SPTR>
|
||
XX INTERNAL,<TLNN ARG,INTF>
|
||
XX LABEL,<TLNN ARG,TAGF>
|
||
XX LOCAL
|
||
XX LRELOCATABLE,<TLNN ARG,LELF>
|
||
XX MACRO,<TLNN ARG,MACF>
|
||
XX NAME,<SKIPN .IFNAM> ;;[1112] SINGLE RADIX50 NAME SEEN?
|
||
XX NEEDED
|
||
XX NUMERIC,<TRNN ARG,NUMF>
|
||
XX OPCODE,<TRNN ARG,OPCF>
|
||
XX OPDEF,<TLNN ARG,OPDF>
|
||
XX REFERENCED
|
||
XX RELOCATABLE,<TLNN ARG,LELF!RELF>
|
||
XX RRELOCATABLE,<TLNN ARG,RELF>
|
||
XX SYMBOL,<TLNN ARG,SYMF>
|
||
XX SYNONYM,<TLNN ARG,SYNF>
|
||
>
|
||
|
||
DEFINE XX (A,B)<
|
||
<SIXBIT /A/>
|
||
>
|
||
IFATAB: IFATRIB
|
||
IFLEN==.-IFATAB
|
||
|
||
DEFINE XX (A,B)<
|
||
IFB <B>,<
|
||
CALL %IF'A
|
||
>
|
||
IFNB <B>,<
|
||
B
|
||
>>
|
||
IFJTAB: IFATRIB
|
||
|
||
%IFLOCAL:
|
||
TLNN ARG,EXTF!SPTR!UNDF!MACF!SYNF
|
||
TLNN ARG,SYMF ;NOT EXTERNAL, BUT MUST BE SYMBOL
|
||
RET
|
||
JRST CPOPJ1
|
||
|
||
%IFASSIGNMENT:
|
||
TLNE ARG,SYMF
|
||
TLNE ARG,TAGF!UNDF!MACF!SYNF
|
||
RET
|
||
JRST CPOPJ1
|
||
|
||
%IFREFERENCED:
|
||
CAMN ARG,[UNDF+NOTF] ;[621] NOT FOUND?
|
||
RET ;[621]
|
||
JRST CPOPJ1 ;[621]
|
||
|
||
%IFNEEDED:
|
||
CAME ARG,[UNDF+NOTF] ;[626] NOT FOUND?
|
||
TLNN ARG,UNDF ;[626] FOUND, BUT UNDEFINED?
|
||
RET ;[626]
|
||
JRST CPOPJ1 ;[626] CONDITION SATISFIED
|
||
|
||
;[1112] HERE FROM CELL LEVEL TO RULE OUT CASES WHERE THE CURRENT
|
||
;[1112] ATOM CANNOT BE A SIMPLE RADIX50 NAME (I.E. SYMBOL)
|
||
%IFCHK: CAIN C,' ' ;[1112] SPACE OR TAB?
|
||
JRST CELL1 ;[1112] KEEP SCANNING
|
||
CAIN C,'.' ;[1112] PERIOD
|
||
JRST PERIOD ;[1112] CHECK IT OUT
|
||
CAIE C,'$' ;[1112] DOLLAR SIGN
|
||
CAIN C,'%' ;[1112] OR PERCENT SIGN
|
||
JRST LETTER ;[1112] VALID NAME CHARACTER
|
||
CAIL C,'A' ;[1112] LETTERS ARE ALSO
|
||
CAILE C,'Z' ;[1112] VALID NAME CHARACTERS
|
||
SKIPA ;[1112] BUT OTHERS AREN'T
|
||
JRST LETTER ;[1112] HANDLE LETTERS
|
||
CAIN C,'<' ;[1112] NAME MAY BE BRACKETED
|
||
JRST ANGLB ;[1112] HANDLE EXPRESSIONS
|
||
CAIN C,'>' ;[1112] END OF EXPRESSION
|
||
JRST LETTER ;[1112] SCAN FURTHER
|
||
SETZM .IFNAM ;[1112] OTHER THAN RADIX50 NAME
|
||
JRST CELL1A ;[1112] CONTINUE USUAL DISPATCH
|
||
|
||
;ASSIGN PSEUDO-OP
|
||
;ASSIGN SYM1,SYM2,INCR
|
||
ASGN: CALL COUTD ;DUMP BUFFER
|
||
PUSH P,BLKTYP ;SAVE BLOCK TYPE
|
||
MOVEI AC0,100 ;ASSIGN BLOCK TYPE
|
||
MOVEM AC0,BLKTYP
|
||
CALL GETSYM ;HERE TO ASGN6 COPIED FROM EXTERN
|
||
JRST ASGN2
|
||
TLO IO,DEFCRS ;FLAG AS DEFINITION
|
||
CALL SSRCH
|
||
JRST ASGN1
|
||
TLNN ARG,EXTF!VARF!UNDF
|
||
JRST ASGN2
|
||
TLNE ARG,EXTF
|
||
JRST [JUMP1 ASGN6
|
||
TLZN ARG,UNDF
|
||
JRST ASGN6
|
||
ANDM ARG,(SX)
|
||
JRST ASGN1]
|
||
ASGN1: CALL EXTRN1 ;[664]
|
||
CALL EXTRN2 ;[664][712]
|
||
ASGN6: MOVE AC0,-1(SX)
|
||
SETZ ARG,
|
||
CALL SQOZE ;CONVERT TO SQUOZE
|
||
CALL COUT ;OUTPUT FIRST SYMBOL
|
||
JUMPNC ASGN2 ;MUST BE COMMA HERE
|
||
CALL GETSYM ;SECOND SYMBOL
|
||
JRST ASGN2
|
||
MOVEI SDEL,%SYM ;OUTPUT TO CREF
|
||
CALL CREF
|
||
SETZ ARG,
|
||
CALL SQOZE ;CONVERT TO SQUOZE
|
||
CALL COUT
|
||
JUMPNC ASGN3 ;COMMA?
|
||
CALL EVALXQ ;YES, EVALUATE INCREMENT
|
||
ASGN4: CALL COUT
|
||
JUMP1 ASGN7 ;DON'T OUTPUT IF PASS1
|
||
CALL COUTD ;OUTPUT 3 WORDS
|
||
ASGN5: POP P,BLKTYP ;RESTORE BLOCK TYPE
|
||
RET
|
||
|
||
ASGN3: MOVEI AC0,1 ;INCREMENT IS 1 IF NOT SPECIFIED
|
||
JRST ASGN4
|
||
|
||
ASGN2: TRO ER,ERRE ;INDICATE
|
||
ASGN7: CALL COUTI ;CLEAR OUTPUT BUFFER
|
||
JRST ASGN5
|
||
|
||
EXTER0: TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL GETSYM ;GET A SYMBOL
|
||
JRST [ TRO ER,ERRA ;[712] FLAG AS ERROR
|
||
JRST EXTERC] ;[1070][712]
|
||
EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION
|
||
EXTER5:
|
||
IFN FTPSECT,<
|
||
SETOM SGSRCH> ;[1245] LOOK ONLY IN SYMBOLS FOR THIS PSECT
|
||
CALL SSRCH ;OK, SEARCH SYMBOL TABLE
|
||
JRST EXTER2 ;NOT THERE, INSERT IT
|
||
IFN FTPSECT,<
|
||
SETZM SGSRCH> ;[1245] TURN OFF LOOK ONLY HERE FLAG
|
||
TLNN ARG,INTF ;[1070] PREVIOUSLY DEFINED AS INTERNAL
|
||
TLNN ARG,EXTF!VARF!UNDF ;[1070] BUT NOT EXTERNAL OR UNDEFINED
|
||
JRST [ TRO ER,ERRE ;[1070] FLAG ERROR
|
||
JRST EXTERC] ;[1070] AND BYPASS
|
||
TLNE ARG,EXTF ;VALID, ALREADY DEFINED?
|
||
JRST [JUMP1 EXTER3 ;YES, BYPASS
|
||
TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO
|
||
JRST EXTER3 ;CONTINUE
|
||
ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2
|
||
JRST EXTER2] ;SET UP EXTERNAL NOW
|
||
EXTER2:
|
||
IFN FTPSECT,<
|
||
SETZM SGSRCH> ;[1245] TURN OFF LOOK ONLY HERE FLAG
|
||
CALL EXTRN1 ;[664] SET UP EXTERNAL
|
||
CALL SUPSYM ;SEE IF "!" SEEN
|
||
CALL EXTRN2 ;[664] [712] INSERT/UPDATE IT
|
||
MOVE ARG,AC0 ;[712]
|
||
EXTER3: ;[1070]
|
||
IFN FTPSECT,< ;[575] IF PSECT MUST SEARCH FOR ALL OCCURANCES
|
||
SKIPN SGNMAX ;ANY PSECTS?
|
||
JRST EXTER9 ;NO
|
||
PUSH P,SGNCUR ;SAVE CURRENT PSECT
|
||
SETOM SGSRCH ;[1070] SEARCH ONLY CURRENT PSECT
|
||
SETZB AC1,SGNCUR ;[1070] START WITH BLANK PSECT
|
||
EXTER6: CAMN AC1,0(P) ;[1070] SAME AS CURRENT PSECT?
|
||
JRST EXTER7 ;[1070] YES - SKIP IT
|
||
CALL SSRCH ;LOOK FOR EXTERN
|
||
JRST EXTER7 ;[1070] NOT FOUND IN THIS PSECT
|
||
TLNE ARG,EXTF ;ALREADY EXTERN?
|
||
JRST [JUMP1 EXTER7 ;YES, BYPASS
|
||
TLZN ARG,UNDF ;UNDEF ALSO
|
||
JRST EXTER7 ;NO
|
||
ANDM ARG,(SX) ;YES, CLEAR FLAG
|
||
JRST .+1] ;AND SETUP AS EXTERN
|
||
CALL EXTRN1 ;[664] SET UP EXTERN
|
||
CALL EXTRN2 ;[664] INSERT/UPDATE IT
|
||
MOVE ARG,AC0 ;[712]
|
||
EXTER7: AOS AC1,SGNCUR ;NEXT PSECT
|
||
CAMG AC1,SGNMAX ;ALL DONE?
|
||
JRST EXTER6 ;NO
|
||
SETZM SGSRCH ;[1070] SEARCH ALL PSECTS
|
||
POP P,SGNCUR ;[1070] BACK TO NORMAL
|
||
EXTER9:> ;[575] END IFN FTPSECT
|
||
EXTERC: CALL SUPSYM ;[1070] SEE IF "!" SEEN
|
||
JUMPCM EXTER0
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
RET ;NO, EXIT
|
||
|
||
EXTRN1: MOVEI V,2 ;[664] GET 2 CELLS FROM TREE
|
||
ADDB V,FREE ;[664]
|
||
CAML V,SYMBOL ;[664] HAVE WE RUN OUT OF CORE
|
||
CALL XCEEDS ;[664] YES, TRY TO BORROW SOME MORE
|
||
SUBI V,2 ;[664] GET RIGHT CELL FOR POINTER
|
||
SETZB RC,0(V) ;[664] ALL SET, ZERO VALUES
|
||
MOVSI ARG,SYMF!EXTF ;[664]
|
||
RET ;[664] RETURN TO INSERT/UPDATE
|
||
|
||
EXTRN2: CALL INSERT ;[664] INSERT/UPDATE
|
||
MOVSI ARG,PNTF ;[664]
|
||
IORM ARG,0(SX) ;[664]
|
||
MOVE AC0,-1(SX) ;[712] GET THE SIXBIT FOR THE NAME
|
||
MOVEM AC0,1(V) ;[712] STORE IT FOR ADDITIVE GLOBAL FIXUPS
|
||
RET ;[664] RETURN TO GET SIXBIT
|
||
|
||
EVAL10: PUSH P,CURADX ;[613] PUSH CURRENT RADIX
|
||
PUSH P,[^D10] ;[613] MAKE IT RADIX 10
|
||
POP P,CURADX ;[613]
|
||
CALL EVALEX ;EVALUATE
|
||
POP P,CURADX ;[613] RESET RADIX
|
||
JUMPE RC,CPOPJ ;[664] EXIT IF ABSOLUTE
|
||
|
||
QEXT:
|
||
IFN POLISH,<
|
||
TLNE FR,POLSW ;ANY POLISH EXTERNAL EXPRESSIONS
|
||
JRST QPOL ;YES, REMOVE AND FLAG ERROR
|
||
>
|
||
SKIPE EXTPNT ;ANY POSSIBILITIES?
|
||
TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR
|
||
TRO ER,ERRR ;NO, FLAG RELOCATION ERROR
|
||
HLLZS RC ;CLEAR RELOCATION/EXTERNAL
|
||
RET
|
||
|
||
IFN POLISH,<
|
||
QPOL: TRO ER,ERRE ;FLAG EXTERNAL ERROR
|
||
PUSH P,AC1 ;GET AN AC
|
||
SKIPE LITLVL ;IN A LITERAL?
|
||
SKIPA AC1,POLITS ;YES, USE LAST LIT ITEM
|
||
MOVE AC1,POLIST ;GET LAST ITEM IN LIST
|
||
JUMPE AC1,QPOL1 ;IF ZERO, DON'T GO BACK
|
||
MOVEM AC1,FREE ;RESET FREE CORE POINTER
|
||
MOVE AC1,(AC1) ;GET PREVIOUS ITEM
|
||
SKIPE LITLVL ;IN A LITERAL?
|
||
JRST [MOVEM AC1,POLITS ;YES
|
||
JRST .+2]
|
||
MOVEM AC1,POLIST ;MAKE IT TOP OF LIST
|
||
QPOL1: POP P,AC1
|
||
RET
|
||
>
|
||
|
||
EVALXQ: PUSH P,IO ;SAVE ERROR STATUS
|
||
TRZ ER,-1 ;START AFRESH
|
||
CALL EVALQ ;EVALUATE EXPRESSION
|
||
TRNE ER,ERRU ;TEST FOR UNDEF
|
||
TRO ER,ERRV ;FLAG "V" ERROR
|
||
HLLM IO,(P) ;STORE STATUS FLAGS
|
||
IORM ER,(P) ;COMPOUND ERRORS
|
||
POP P,IO ;RESTORE THEM
|
||
RET
|
||
|
||
EVALQ: ;[1025]
|
||
IFN POLISH,< TRO FRR,NOPSW > ;[1025] DON'T ALLOW POLISH
|
||
CALL EVALEX ;EVALUATE EXPRESSION
|
||
IFN POLISH,< TRZ FRR,NOPSW > ;[1025] REST FLAG
|
||
TDZE RC,[-2,,-2] ;WAS AN EXTERNAL FOUND?
|
||
TRO ER,ERRE ;YES, FLAG ERROR
|
||
RET ;RETURN
|
||
|
||
OPDEF0: CALL GETSYM ;GET THE FIRST SYMBOL
|
||
RET ;ERROR IF INVALID SYMBOL
|
||
CAIE C,73 ;"["?
|
||
JRST ERRAX ;NO, ERROR
|
||
MOVEM AC0,INOPDF ;[624]
|
||
PUSH P,AC0 ;STACK MNEMONIC
|
||
AOS LITLVL ;SHORT OUT LOCATION INCREMENT
|
||
PUSH P,STPY ;[1035] SAVE CODE BUFFER SETTINGS AND
|
||
PUSH P,STPX ;[1035] POINT OUTPUT SETTING AT CURRENT
|
||
PUSH P,STPX ;[1035] INPUT SETTING
|
||
POP P,STPY ;[1035]
|
||
CALL STMNT ;EVALUATE STATEMENT
|
||
MOVE AC1,STPX ;[1035] MAKE SURE CODE WAS GENERATED
|
||
SUB AC1,STPY ;[1035]
|
||
SKIPG AC1 ;[1035]
|
||
TROA ER,ERRA ;[1035] ELSE FLAG ERROR
|
||
JRST [CALL DSTOW ;[1220][1035]
|
||
IFN POLISH,< ;[1220]
|
||
CALL DSTWRC ;[1220] CORRECT FAKE POLISH RELOCATIONS
|
||
>; END IFN POLISH ;[1220]
|
||
JRST .+1] ;[1220]
|
||
POP P,STPX ;[1035] RESTORE CODE BUFFER SETTINGS
|
||
POP P,STPY ;[1035]
|
||
SOS LITLVL
|
||
SETZM INOPDF ;[624]
|
||
EXCH AC0,0(P) ;EXCHANGE VALUE FOR MNEMONIC
|
||
PUSH P,RC ;STACK RELOCATION
|
||
TLO IO,DEFCRS ;SAY WE ARE DEFINING IT
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL SSRCH ;[752] SEE IF FORW-REFED
|
||
JRST OPDEF1 ;[752] NO, JUMP
|
||
TLNN ARG,UNDF ;[752]
|
||
JRST OPDEF1 ;[752]
|
||
TLNN ARG,INTF ;[752]
|
||
CALL OPCFX1 ;[752]
|
||
OPDEF1: ;[752]
|
||
CALL MSRCH ;SEARCH SYMBOL TABLE
|
||
MOVSI ARG,OPDF ;[675] OPDEF
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
TLC ARG,P1PF ;[1222] PASS1 POLISH DEFINITION?
|
||
TLCN ARG,P1PF ;[1222]
|
||
JRST [TLZ ARG,P1PF ;[1222] YES - REMOVE PASS1 DEFINITION
|
||
TLO ARG,SPTR ;[1222] ALLOW USE OF 2 WORD BLOCK IF NEEDED
|
||
JRST .+1] ;[1222]
|
||
POP P,RC ;RESTORE VALUES
|
||
POP P,V
|
||
TLNE ARG,SYNF!MACF
|
||
TRO ER,ERRA ;YES "A" ERROR
|
||
TRNN ER,ERRA ;ERROR?
|
||
CALL INSERT ;NO, INSERT/UPDATE
|
||
CALL ASSIGL ;LIST VALUE LIKE =
|
||
TLZ IO,DEFCRS ;JUST IN CASE
|
||
CALL BYPASS ;[664]
|
||
SETZM EXTPNT ;[1000] CLEAR EXTERNAL POINTER
|
||
RET ;[1000] NO LONGER NEEDED TO RESET STOW
|
||
|
||
OPCFIX: CALL SSRCH ;[736] SEE IF WAS FORW-REF'ED
|
||
RET ;[736] NO, CONTINUE
|
||
TLNN ARG,UNDF ;[736]
|
||
RET ;[736] NO, CONTINUE
|
||
OPCFX1: PUSH P,AC0 ;[752] YES, IT WAS UNDEFINED, DO REMOVE
|
||
CALL REMOVE ;[736]
|
||
POP P,AC0 ;[736]
|
||
RET ;[736] CONTINUE WITH NAME IN AC0
|
||
|
||
|
||
DEPHA0: SETZM PHALVL ;NOT IN PHASE
|
||
MOVE AC0,LOCO
|
||
MOVE RC,MODO ;SET TO OUTPUT VALUES AND SKIP
|
||
JRST PHASE1
|
||
|
||
PHASE0: SETOM PHALVL ;IN PHASE
|
||
CALL EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL
|
||
PHASE1: MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER
|
||
MOVEM RC,MODA
|
||
JRST BLOCK2
|
||
|
||
ASSIGN: JUMPAD ERRAX ;NO, ERROR
|
||
JUMPE AC0,ERRAX ;NO SYMBOL ON THE LEFT OF=
|
||
CALL ASSIG1
|
||
ASSIGL: TLNE IO,IOSALL ;SUPPRESS ALL?
|
||
JUMPN MRP,CPOPJ ;IF IN MACRO
|
||
ASSIG7: MOVEM RC,ASGBLK
|
||
JUMP1 CPOPJ ;[633] DON'T NEED THIS FOR PASS1
|
||
IFN POLISH,<
|
||
JUMPL RC,CPOPJ ;[633] DON'T NEED THIS FOR POLISH ASSIGN
|
||
>
|
||
PUSH P,AC0 ;[633] NEED AN AC FOR A WHILE
|
||
MOVEI AC0,EXTF ;[633] EXTERNAL FLAG
|
||
TRNE RC,-2 ;[633] RIGHT HALF EXTERNAL?
|
||
HRRM AC0,ASGBLK ;[633] YES, USE THE FLAG
|
||
TLNE RC,1 ;[633] LEFT HALF NOT RELOC?
|
||
JRST [ TLNE RC,-2 ;[633] NO, EXTERNAL?
|
||
HRLM AC0,ASGBLK ;[633] YES, SET FLAG
|
||
JRST .+2] ;[633] SKIP RETURN
|
||
HRROS ASGBLK ;[633] LEFT HALF NOT RELOC, MAKT IT -1
|
||
POP P,AC0 ;[633] RESTORE AC
|
||
MOVEM V,LOCBLK
|
||
RET
|
||
|
||
ASSIG1: PUSH P,AC0 ;SAVE SYMBOL
|
||
IFN POLISH,<
|
||
MOVEM AC0,INASGN ;IN CASE POLISH FIXUP REQUIRED
|
||
>
|
||
SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW
|
||
ASSIG4: CALL PEEK ;IS THE NEXT ON =
|
||
CAIE C,"="
|
||
CAIN C,"!"
|
||
CAIA ;WANT TO SUPRESS SYMBOL
|
||
JRST ASSIG5 ;NOT "=" OR "!", SO SEE IF COLON
|
||
TLOE AC0,NOOUTF ;TURN ON "NO-OUTPUT" FLAG
|
||
TRO ER,ERRQ ;IF ALREADY ON, GIVE ERROR
|
||
CALL GETCHR ;PROCESS THE CHAR.
|
||
CALL PEEK ;CHECK FOR ==: DMN
|
||
ASSIG5: CAIE C,":" ;IS IT
|
||
JRST ASSIG6 ;NO
|
||
TLOE AC0,INTF ;FLAG AS INTERNAL
|
||
TRO ER,ERRQ ;IF ALREADY ON, ITS AN ERROR
|
||
CALL GETCHR ;REPEAT IT
|
||
JRST ASSIG4 ;TRY AGAIN (MIGHT BE =:!)
|
||
|
||
ASSIG6: PUSH P,AC0 ;[1045] SAVE SYMTAB BITS ACROSS CALL
|
||
IFN POLISH,<
|
||
HRREI AC0,POLFWF ;ASSUME FULL WORD FIXUP
|
||
MOVEM AC0,POLTYP ;UNLESS OTHERWISE SPECIFIED
|
||
>
|
||
CALL EVALCM ;EVALUATE EXPRESSION
|
||
POP P,HDAS ;[1045] RESTORE SYMTAB BITS FOR LATER MERGE
|
||
TRNE FRR,LTGSW ;[1126] ASSIGNMENT INVOLVING LABEL IN LITERAL?
|
||
TRO ER,ERRL ;[1126] YES - FLAG ERROR SINCE MAY BE UNDEFINED
|
||
TDNN RC,[-2,,-2] ;RC IS 0 OR 1?
|
||
JRST ASSIG0 ;YES,
|
||
CAIGE RC,100 ;NO, RC HAVING VALUES BETWEEN -100 AND
|
||
CAMG RC,[-100] ;100 GETS R ERROR
|
||
SKIPA ;SINCE IT IS NOT PART OF A LARGER EXP
|
||
TRO ER,ERRR ;GIVE R ERROR
|
||
ASSIG0: EXCH AC0,0(P) ;SWAP VALUE FOR SYMBOL
|
||
PUSH P,RC
|
||
IFN POLISH,<
|
||
JUMPL RC,ASSIG3 ;POLISH, BYPASS EXTERN TESTS
|
||
>
|
||
TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT
|
||
JRST ASSIG2
|
||
HRRZS RC
|
||
HRRZ ARG,EXTPNT
|
||
CAME RC,ARG
|
||
CALL QEXT ;EXTERNAL OR RELOCATION ERROR
|
||
ASSIG2: HLRZ RC,(P)
|
||
TRNN RC,-2
|
||
JRST ASSIG3
|
||
HLRZ ARG,EXTPNT
|
||
CAME RC,ARG
|
||
CALL QEXT
|
||
ASSIG3: TLO IO,DEFCRS
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL SSRCH
|
||
MOVSI ARG,SYMF
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
TLC ARG,P1PF ;[1222] PREVIOUSLY PASS1 POLISH?
|
||
TLCN ARG,P1PF ;[1222] UNDF+PNTF+EXTF+MDFF
|
||
JRST [TLZ ARG,P1PF ;[1222] YES - NOT ANY MORE
|
||
TLO ARG,SPTR ;[1222] ALLOW USE OF 2 WORD BLOCK IF NEEDED
|
||
JRST .+1] ;[1222]
|
||
TLC ARG,EXTF+PNTF ;[606] REAL EXTERNAL UP TIL NOW?
|
||
TLCE ARG,EXTF+PNTF ;[606]
|
||
SKIPA ;[606] NO,
|
||
JRST [ TLNN ARG,UNDF ;[606] NOT BECAUSE UNDEFINED?
|
||
TRO ER,ERRE ;[606] YES, E-ERROR, CAN'T DO FOO##=
|
||
JRST .+1] ;[606] UNDEFINED
|
||
TLZ ARG,^-<SYMF!TAGF!NOOUTF!INTF!ENTF!NCRF!MDFF!SUPRBT!SPTR> ;[745] KEEP THESE
|
||
IOR ARG,HDAS ;SET BITS DETERMINED ABOVE
|
||
SETZM EXTPNT ;FOR REST OF WORLD
|
||
IFN POLISH,<
|
||
SETZM INASGN ;FINISHED WITH POLISH BY NOW
|
||
SETZM POLTYP
|
||
> ;[575]
|
||
IFN FTPSECT,< ;[575]
|
||
TLZ IO,RSASSW ;...
|
||
>
|
||
POP P,RC
|
||
TRNE ER,ERRORS-ERRQ-ERRU ;[1005]
|
||
SETZ RC, ;CLEAR RELOCATION
|
||
POP P,V
|
||
JUMP2 .+3 ;[1017] DON'T CARRY UNDF ACROSS IN PASS 2
|
||
TRNE ER,ERRU ;WAS VALUE UNDEFINED?
|
||
TLO ARG,UNDF ;YES,SO TURN UNDF ON
|
||
TLNE ARG,TAGF
|
||
JRST ERRAX
|
||
TLNN ARG,SPTR ;[745] WAS SPTR ON?
|
||
JRST INSERT ;[745] NO,
|
||
JUMPL RC,INSERT ;[745] YES, AND STILL GOOD
|
||
TLZ ARG,SPTR ;[745] NO LONGER NEEDED
|
||
JRST INSERT
|
||
|
||
;LOC, RELOC, AND ORG COME HERE
|
||
|
||
%ORG: MOVEM AC0,MODN ;SAVE TYPE
|
||
CALL HIGHQ ;GET LATEST PC
|
||
CALL BYPASS ;[664] SKIP BLANKS
|
||
TLO IO,IORPTC ;REPEAT LAST
|
||
CAIN C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT
|
||
JRST [HRRZ AC0,ORGMOD ;GET PREV MODE IN CASE ORG
|
||
SKIPGE MODN ;ORG?
|
||
HRLM AC0,MODN ;YES, SAVE IT
|
||
HLRZ AC1,MODN ;NEW MODE
|
||
MOVE AC0,@REL1P(AC1) ;GET PREV VALUE
|
||
JRST ORG01] ;[573]
|
||
IFN POLISH,< TRO FRR,NOPSW> ;[616] DON'T ALLOW POLISH
|
||
CALL EVALXQ ;GET EXPRESSION AND TEST EXTERNAL
|
||
IFN POLISH,< TRZ FRR,NOPSW> ;[616] UNDO NO-POLISH SWITCH
|
||
TLNE AC0,-1 ;[714] STUFF IN LH?
|
||
TRO ER,ERRA ;[741] YES, A-ERROR
|
||
;**; insert 2 lines at %ORG+16 13-Nov-85 HD
|
||
CAIN C,',' ;[1244] IS NEXT CHARACTER A COMMA?
|
||
TRO ER,ERRR!ERRN ;[1244] YES, FLAG AS ERROR
|
||
SKIPGE MODN ;ORG?
|
||
HRLM RC,MODN ;YES, SAVE RELOC OF ARG
|
||
SETOM RELARG ;[721] FLAG EXPLICIT ARGUMENT
|
||
ORG01: HRRM AC0,MODN ;STORE NEW VALUE
|
||
HLRZ AC0,MODN ;AC0=NEW MODE
|
||
MOVE AC1,MODO ;AC1=OLD MODE
|
||
SKIPN AC1 ;[721] OLD=LOC?
|
||
CALL [ JUMPE AC0,CPOPJ1 ;[721] YES, SKIPE IF NEW=LOC
|
||
SKIPE RELARG ;[721] OR IF NEW=RELOC <ARG>
|
||
AOS (P) ;[721]
|
||
RET] ;[721]
|
||
CALL ORG02 ;[721] ELSE ADJUST RELOC BLOCK PTR
|
||
SETZM RELARG ;[721] ZERO EXPLICIT ARG FLAG
|
||
HRRZ AC0,LOCO ;GET LAST PC TO PROPER BLOCK
|
||
MOVEM AC0,@REL1P(AC1) ;[573]
|
||
MOVEM AC1,ORGMOD ;SAVE OLD MODE
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC1,SGNCUR ;CURRENT PSECT INDEX
|
||
MOVE AC0,HIGH ;SAVE PSECT BREAK
|
||
HRRM AC0,SGATTR(AC1)
|
||
CALL ORG03 ;ADJUST RELOC PTR IF NECESSARY
|
||
HRR AC0,@REL1P+1 ;SAVE PSECT REL PC
|
||
HRL AC0,ORGMOD ;SAVE PSECT MODE
|
||
MOVEM AC0,SGRELC(AC1)
|
||
CALL ORG03 ;READJUST PTR IF NECESSARY
|
||
>
|
||
MOVE AC0,MODN ;GET RESULT
|
||
HLRZM AC0,MODA ;SET MODES
|
||
HLRZM AC0,MODO
|
||
HRRZM AC0,LOCA ;AND LOCATIONS
|
||
HRRZM AC0,LOCO
|
||
JRST BLOCK2
|
||
|
||
ORG02: MOVE AC0,REL1P+1 ;ADJUST RELOC BLOCK PTR
|
||
CAIN AC0,RELLOC ;[573]
|
||
AOSA REL1P+1 ;[573]
|
||
SOS REL1P+1 ;[573]
|
||
RET ;[573]
|
||
|
||
IFN FTPSECT,< ;[575][573]
|
||
ORG03: HLRZ AC0,MODN ;[573]
|
||
SKIPE AC0 ;IF LOC TO RELOC
|
||
SKIPE MODO ;[573]
|
||
RET ;[573]
|
||
JRST ORG02 ;ADJ REL PTR
|
||
> ;[575][573] END IFN FTPSECT
|
||
|
||
; .PSECT NAME /ATTRIB,ORIGIN
|
||
IFN FTPSEC,<
|
||
%SEGME: SKIPN HISNSW ;CAN'T HAVE PSECTS WITH
|
||
SKIPE UNIVSN ;HISEG, TWOSEG OR
|
||
JRST ERRSX ;UNIVERSAL
|
||
MOVE AC2,SGDMAX ;CHECK IF MAX PSECT
|
||
CAILE AC2,SGNDEP-1 ;NESTING DEPTH EXCEEDED
|
||
JRST ERRSX ;YES
|
||
SETZM SGSWPT ;[1074] INDICATE .PSECT FOR PSECT SWAP
|
||
CALL GETSYM ;GET PSECT NAME
|
||
CALL [MOVE AC0,[SIXBIT /.LOW./] ;[1165] NONE SPECIFIED,
|
||
;[1165] BLANK PSECT NAME IS .LOW.
|
||
TRZ ER,ERRA ;UNDO GETSYM'S ERR FLAG
|
||
RET]
|
||
MOVE AC1,SGNMAX ;GET PSECT COUNT
|
||
%SEGM1: CAMN AC0,SGNAME(AC1) ;SEEN THIS NAME BEFORE?
|
||
JRST %SEGM2 ;YES
|
||
SOJGE AC1,%SEGM1 ;LOOP THRU KNOWN NAMES
|
||
MOVE AC1,SGNMAX ;CHECK IF MAX DISTINCT PSECT
|
||
CAILE AC1,SGNSGS-1 ;LIMIT EXCEEDED
|
||
JRST ERRSX ;YES
|
||
AOS AC1,SGNMAX ;INCR PSECT COUNT
|
||
SETOM BLK24 ;[1020] FIRST TIME, OUTPUT BLOCK 24
|
||
MOVEM AC0,SGNAME(AC1) ;STORE PSECT NAME
|
||
MOVSI AC2,1 ;SET MODE TO RELOC
|
||
MOVEM AC2,SGRELC(AC1) ;AND PC TO ZERO
|
||
HRRZS SGORIG(AC1) ;[1131] INCASE NOT GIVEN
|
||
%SEGM4: MOVE SDEL,SYMBOL ;ROOM TO INIT
|
||
SUBI SDEL,LENGTH ;SYM TAB
|
||
CAMLE SDEL,FREE ;FOR NEW PSECT?
|
||
JRST %SEGM3 ;YES
|
||
CALL XCEEDS ;TRY FOR MORE CORE
|
||
JRST %SEGM4 ;START OVER
|
||
%SEGM3: MOVEM SDEL,SYMBOL ;NEW SYM TAB BOT
|
||
HRLI SDEL,LENGTH(SDEL) ;OLD SYM TAB BOT
|
||
MOVE SX,SYMTOP ;SYM TAB TOP
|
||
BLT SDEL,-LENGTH(SX) ;MOVE SYM TAB DOWN
|
||
HRLI SDEL,SYMNUM+1 ;PTR TO PERM SYM TAB
|
||
HRRI SDEL,1-LENGTH(SX) ;PERM SYMS GO HERE
|
||
BLT SDEL,0(SX) ;MOVE PERM SYMS TO NEW PSECT
|
||
MOVE AC2,SYMNUM ;PERM SYM CNT
|
||
MOVEM AC2,SGSCNT(AC1) ;SET SYM CNT
|
||
ADDM AC2,@SYMBOL ;[1042] ADJUST TOTAL SYM CNT
|
||
MOVSI AC2,<SG.RP==400000> ;[1042][1021] SET RELOC PSECT BIT
|
||
MOVEM AC2,SGATTR(AC1) ;[1042][1021] DEFAULT PSECT BRK AND ATTRS
|
||
TLO IO,DEFCRS ;[711] FLAG AS DEFINITION
|
||
PUSH P,AC1 ;[711] SAVE AC1 FOR A WHILE
|
||
CALL SSRCH ;[711] ADD PSECT-NAME AS EXTERN SYMBOL
|
||
JRST %SEG10 ;[711] COPIED FROM EXTERN CODE
|
||
TLNN ARG,EXTF!VARF!UNDF ;[711]
|
||
JRST [ TRO ER,ERRE ;[711]
|
||
JRST %SEG11] ;[711]
|
||
TLNE ARG,EXTF ;[711]
|
||
JRST [ JUMP1 %SEG11 ;[711]
|
||
TLZN ARG,UNDF
|
||
JRST %SEG11 ;[711]
|
||
ANDM ARG,(SX) ;[711]
|
||
JRST %SEG10] ;[711]
|
||
%SEG10: CALL EXTRN1 ;[711]
|
||
CALL EXTRN2 ;[711]
|
||
%SEG11: POP P,AC1 ;[711] RESTORE AC1
|
||
%SEGM2: AOS AC2,SGDMAX ;INCR PSECT DEPTH
|
||
MOVEM AC0,SGLIST(AC2) ;STORE PSECT NAME
|
||
SETZM SGLTLV(AC2) ;[1074] CLEAR PSECT ENTRY LITERAL LEVEL
|
||
%SEGM5: CAIE C,'/' ;ATTRIBUTES SPECIFIED?
|
||
JRST %SEGM9 ;NO, TRY VALUE
|
||
CAMN AC0,[SIXBIT /.LOW./] ;[1165] GIVING ATTRIB TO BLANK PSECT?
|
||
TRO ER,ERRA ;[1165] YES, FLAG ARG ERROR
|
||
PUSH P,AC1 ;SAVE PSECT INX
|
||
CALL GETSYM ;GET ATTRIBUTE
|
||
JRST %SEGM8 ;TOO BAD
|
||
; THE BELOW ATTRIBUTES ARE PAIRED; A CONFLICT IS
|
||
; FLAGGED IF BOTH OF ANY PAIR ARE SEEN (CUMMULATIVELY)
|
||
MOVE AC1,AC0 ;ATRIB NAME
|
||
SETO AC2, ;MASK
|
||
LSH AC1,6 ;SHIFT UP 1 CHAR AT A TIME
|
||
LSH AC2,-6 ;[1117] SAME FOR MASK
|
||
JUMPN AC1,.-2 ;UNTIL CHAR ALL GONE, MASK LEFT
|
||
PUSH P,[-1] ;[1117] STACK NO TABLE MATCH FOUND
|
||
PUSH P,AC2 ;[1117] AND ATTRIBUTE MASK
|
||
MOVSI AC1,-%SGATL ;[1117] SETUP AOBJN COUNTER
|
||
%SEGM6: CAMN AC0,%SGATN(AC1) ;[1117] EXACT MATCH ON ATTRIBUTE?
|
||
JRST %SEGM7 ;[1117] YES, CHECK IT OUT
|
||
MOVE AC2,%SGATN(AC1) ;[1117] GET TABLE ATTRIBUTE
|
||
ANDCM AC2,0(P) ;[1117] MASK IT
|
||
CAME AC0,AC2 ;[1117] MATCH YET?
|
||
JRST %SEG12 ;[1117] NO - KEEP CHECKING
|
||
SKIPL -1(P) ;[1117] HAS IT BEEN FOUND BEFORE?
|
||
JRST %SEG13 ;[1117] ERROR BECAUSE AMBIGUOUS
|
||
HRRZM AC1,-1(P) ;[1117] SAVE INDEX WHERE FOUND
|
||
%SEG12: AOBJN AC1,%SEGM6 ;[1117] LOOP THRU TABLE
|
||
MOVE AC1,-1(P) ;[1117] GET INDEX WHERE FOUND
|
||
JUMPGE AC1,%SEGM7 ;[1117] OK IF FOUND
|
||
%SEG13: SUB P,[2,,2] ;[1117] ERROR - CLEAN UP STACK
|
||
POP P,AC1 ;[1117] RESTORE PSECT INDEX
|
||
TRO ER,ERRQ ;[1117] FLAG QUESTIONABLE ERROR
|
||
JRST %SEGM5 ;[1117] AND TRY AGAIN
|
||
%SEGM7: SUB P,[2,,2] ;[1117] DISCARD MASK AND INDEX
|
||
MOVE AC2,%SGATB(AC1) ;[1117] GET ATTRIBUTE DEF AND CONFLICT BITS
|
||
MOVE AC1,0(P) ;[1117] GET PSECT INDEX
|
||
HLRZ AC0,SGATTR(AC1) ;[1117] AND CURRENT ATTRIBUTES
|
||
AND AC0,AC2 ;[1117] SEE IF ANY CONFLICTS
|
||
SKIPE AC0 ;[1117] SKIP IF NONE
|
||
JRST [ TRO ER,ERRQ ;[1117] FLAG QUESTIONABLE ERROR
|
||
JRST %SEGM8] ;[1117] AND IGNORE CONFLICT
|
||
HLLZS AC2 ;[1117] CLEAR RIGHT HALF
|
||
IORM AC2,SGATTR(AC1) ;MERGE ATTRIBUTES
|
||
%SEGM8: POP P,AC1 ;RESTORE PSECT INX
|
||
JRST %SEGM5 ;[1117] CHECK FOR MORE ATTRIBUTES
|
||
|
||
%SEGM9: JUMPNC %SWSEG ;[1021] NO VALUE
|
||
PUSH P,AC1 ;SAVE INDEX
|
||
MOVE AC1,SGNAME(AC1) ;[1165] GET THE PSECT NAME
|
||
CAMN AC1,[SIXBIT /.LOW./] ;[1165] ORIGIN FOR BLANK PSECT?
|
||
TRO ER,ERRA ;[1165] YES, FLAG ARG ERROR
|
||
CALL EVALCM ;GET IT
|
||
TRNN FRR,RHPSW!LHPSW!FWPSW ;[1137] IS ORIGIN POLISH
|
||
SKIPE RC ;[1137] OR EXTERNAL OR RELOC?
|
||
TRO ER,ERRA ;[1137] YES - FLAG ARG ERROR
|
||
POP P,AC1 ;RESTORE INDEX
|
||
MOVEM AC0,SGFWOR(AC1) ;[1235] STORE IT
|
||
SKIPL AC2,SGATTR(AC1) ;[1030][1021] RELOCATABLE PSECT?
|
||
JRST %SWSEG ;[1030][1021] NO,
|
||
TLZ AC2,SG.RP ;[1030][1021] YES, NO LONGER TRUE
|
||
MOVEM AC2,SGATTR(AC1) ;[1030][1021] MAKE IT FIX-ORIGIN
|
||
JRST %SWSEG ;SWAP PC AND MODE
|
||
|
||
;[1117] PSECT ATTRIBUTE DEFINITION
|
||
;[1117] VALS: ATTRIBUTE NAME - SIXBIT
|
||
;[1117] ATTRIBUTE SYMBOL - DEFINED FROM BIT 17 TO BIT 1
|
||
;[1117] CONFLICTING ATTRIBUTE SYMBOLS - ORED TOGETHER
|
||
DEFINE %SGATD,< ;[1117]
|
||
%SGATV RWRITE,AT.RW,AT.RO ;[1117] READ-WRITE
|
||
%SGATV RONLY,AT.RO,AT.RW ;[1117] READ-ONLY
|
||
%SGATV OVERLAID,AT.OV,AT.CN ;[1117] OVERLAY
|
||
%SGATV CONCATENATED,AT.CN,AT.OV ;[1117] CONCATENATE
|
||
%SGATV PALIGNED,AT.PA ;[1117] PAGE-ALIGNED
|
||
> ;[1117]
|
||
|
||
DEFINE %SGATV(ATB,DEF,CON),< ;[1117]
|
||
<SIXBIT /ATB/> ;[1117]
|
||
DEF==1B<ATC> ;[1117]
|
||
ATC==ATC-1> ;[1117]
|
||
|
||
ATC==^D17 ;[1117] START FROM BIT 17
|
||
%SGATN: %SGATD ;[1117] NAMES AND ASSIGNMENTS
|
||
%SGATL==.-%SGATN ;[1117]
|
||
PURGE ATC ;[1117]
|
||
|
||
DEFINE %SGATV(ATB,DEF,CON<0>),< ;[1117]
|
||
DEF+<CON_-^D18>> ;[1117]
|
||
|
||
%SGATB: %SGATD ;[1117] VALUES,,CONFLICT VALUES
|
||
|
||
%ENDSE: SKIPN HISNSW ;CAN'T HAVE PSECTS WITH
|
||
SKIPE UNIVSN ;HISEG, TWOSEG OR
|
||
JRST ERRSX ;UNIVERSAL
|
||
MOVE AC2,SGDMAX ;IF DEPTH IS ALREADY ZERO
|
||
JUMPE AC2,ERRSX ;THEN .ENDPS IS ILLEGAL
|
||
SETOM SGSWPT ;[1074] INDICATE .ENDPS FOR PSECT SWAP
|
||
CALL GETSYM ;GET PSECT NAME
|
||
JRST %ENDS1 ;NONE SPECIFIED, IGNORE CHECK
|
||
CAME AC0,SGLIST(AC2) ;DOES IT MATCH CORRES .PSECT NAME
|
||
TRO ER,ERRQ ;NO, FLAG WARN AND DO IT ANYWAY
|
||
%ENDS1: TRZ ER,ERRA ;UNDO GETSYM'S ERR FLAG
|
||
MOVE AC1,LITLVL ;[1074] IS CURRENT LITERAL LEVEL
|
||
CAME AC1,SGLTLV(AC2) ;[1074] THE SAME AS AT PSECT ENTRY?
|
||
JRST [ TRO ER,ERRL ;[1074] NO - FLAG LIT LEVEL MISMATCH
|
||
PUSH P,AC0 ;[1074] AND SAVE SPECIFIED PSECT NAME
|
||
JRST .+1] ;[1074]
|
||
SOS AC2,SGDMAX ;DECR PSECT DEPTH
|
||
MOVE AC0,SGLIST(AC2) ;NAME OF PSECT TO RESUME
|
||
MOVE AC1,SGNMAX ;GET PSECT COUNT
|
||
CAME AC0,SGNAME(AC1) ;NAME MATCH?
|
||
SOJGE AC1,.-1 ;NO, TRY NEXT
|
||
TRNN ER,ERRL ;[1074] ANY PSECT LIT LEVEL MISMATCH?
|
||
JRST %SWSEG ;[1074] NO - CONTINUE SWAP
|
||
SETZM LITLVL ;[1074] YES - CLEAR LIT LEVEL
|
||
CALL %SWSEG ;[1074] LET SWAP HAPPEN
|
||
MOVE AC0,['MCRLNI'] ;[1074] SETUP FOR ERROR
|
||
MOVEM AC0,PREFIX ;[1074] .....
|
||
CALL EFATAL ;[1074] SEND PREFIX
|
||
HRRZI CS,[SIXBIT / LITERAL NESTING INCORRECT AT END OF PSECT@/] ;[1074]
|
||
CALL TYPM2 ;[1074] SEND TEXT
|
||
POP P,CS ;[1074] GET PSECT NAME
|
||
CALL TYPSYM ;[1074] SEND PSECT NAME IF ANY
|
||
CALL CRLF ;[1074] TYPE ERROR
|
||
PUSH P,PAGENO ;[1074] SETUP 4 WORD BLOCK
|
||
PUSH P,SEQNO2 ;[1074] FOR ERROR LOC TYPEOUT
|
||
PUSH P,TAG ;[1074] .....
|
||
MOVE AC0,TAGINC ;[1074] GET CURRENT OFFSET
|
||
SKIPE LBLFLG ;[1074] FOUND A LABEL IN THIS LITERAL?
|
||
SUB AC0,LTGINC ;[1074] YES - CORRECT OFFSET
|
||
PUSH P,AC0 ;[1074] COMPLETE 4 WORD BLOCK
|
||
HRLI V,[SIXBIT /@/] ;[1074] SETUP NO ERROR TEXT
|
||
HRRI V,-3(P) ;[1074] AND POINTER TO ERROR BLOCK
|
||
JRST ERRNE3 ;[1074] FINISH OFF ERROR
|
||
|
||
;HERE TO SWAP TO NEW PSECT
|
||
;ENTER WITH OLD PSECR IN SGNCUR, NEW PSECT IN AC1
|
||
%SWSEG: PUSH P,AC1 ;SAVE NEW PSECT INX
|
||
MOVE AC2,SGNCUR ;GET OLD PSECT INX
|
||
HLRZ SDEL,SGORIG(AC2) ;ALREADY SETUP LIT/VAR BLOCK
|
||
JUMPN SDEL,%SWSG1 ;YES
|
||
MOVEI SDEL,.SGLVL ;[1131] NO
|
||
ADDB SDEL,FREE ;TRY TO GET IT
|
||
CAML SDEL,SYMBOL ;WILL IT FIT?
|
||
CALL XCEED ;NO, XPAND
|
||
SUBI SDEL,.SGLVL ;[1131] GET ORIGIN
|
||
HRLM SDEL,SGORIG(AC2) ;NOW STORE IT
|
||
%SWSG1: MOVSI AC0,.SGLVZ ;START OF LIT/VAR AREA
|
||
HRR AC0,SDEL ;[1131] SAVE AREA
|
||
BLT AC0,.SGLVL-1(SDEL) ;[1131] STORE IT
|
||
MOVE AC0,LITLVL ;GET LITLVL
|
||
MOVEM AC0,(SDEL) ;STORE IT
|
||
SKIPE LITLVL ;[602] IN A LITERAL?
|
||
JRST [ MOVE AC0,STPX ;[602] YES, SAVE DEPTH
|
||
MOVEM AC0,1(SDEL) ;[602]
|
||
MOVE AC0,STPY ;[602]
|
||
MOVEM AC0,2(SDEL) ;[602]
|
||
JRST .+1]
|
||
HLLZ AC0,SGORIG(AC1) ;RESTORE NEW LIT/VAR
|
||
JUMPE AC0,[MOVE AC0,[.SGLVZ,,.SGLVZ+1] ;NOT YET SETUP
|
||
SETZM .SGLVZ ;CLEAR FIRST WORD
|
||
BLT AC0,.SGLVZ+.SGLVL-1 ;[1131] PLUS REST
|
||
MOVEI AC0,VARHD ;SET UP AREA
|
||
MOVEM AC0,VARHDX
|
||
MOVEI AC0,LITHD
|
||
MOVEM AC0,LITHDX
|
||
SETZM LITLVL
|
||
CALL LITI
|
||
CALL STOWI ;[602]
|
||
JRST %SWSG2] ;JOIN COMMON CODE
|
||
TLNE FR,P1 ;[1134] ONLY DURING PASS 1
|
||
CALL STOWI ;[1134] RESET STOW COUNTERS
|
||
HRRI AC0,.SGLVZ ;TO LIT/VAR AREA
|
||
ADD AC0,[3,,3] ;[1131] BYPASS FIRST 3 WORDS
|
||
BLT AC0,.SGLVZ+.SGLVL-1
|
||
HLRZ SDEL,SGORIG(AC1) ;POINTER TO LIT INFO
|
||
MOVE AC0,(SDEL) ;GET LITLVL
|
||
MOVEM AC0,LITLVL ;WE ARE NOW IN
|
||
SKIPN SGSWPT ;[1074] SWAPPING DUE TO .ENDPS
|
||
JRST [ MOVE AC1,SGDMAX ;[1074] NO - .PSECT, GET DEPTH
|
||
MOVEM AC0,SGLTLV(AC1) ;[1074] SAVE ENTRY LITERAL LEVEL
|
||
MOVE AC1,0(P) ;[1100] RESTORE CURRENT PSECT NO.
|
||
JRST .+1] ;[1074]
|
||
SKIPE LITLVL ;[602] IN A LITERAL PREVIOUSLY?
|
||
JRST [ MOVE AC0,1(SDEL) ;[602] YES, RESTORE DEPTH
|
||
MOVEM AC0,STPX ;[602]
|
||
MOVE AC0,2(SDEL) ;[602]
|
||
MOVEM AC0,STPY ;[602]
|
||
JRST .+1] ;[602]
|
||
CALL HIGHQ ;SET CURRENT PROG BRK
|
||
%SWSG2: HRRZ AC0,LOCO ;[1132] GET OUTPUT LOC
|
||
MOVE AC1,MODO ;[1132] AND MODE
|
||
MOVEM AC0,@REL1P(AC1) ;[1132] SAVE OLD VALUE
|
||
MOVE AC1,SGNCUR ;CURRENT PSECT INDEX
|
||
MOVE AC0,HIGH ;SAVE PSECT BREAK
|
||
HRRM AC0,SGATTR(AC1)
|
||
HRR AC0,@REL1P+1 ;[1057] SAVE PSECT REL PC
|
||
HRL AC0,MODO ;[1132] GET OUTPUT MODE
|
||
MOVEM AC0,SGRELC(AC1) ;[1132] SAVE MODE AND PC
|
||
MOVE AC1,(P) ;[1132] GET NEW PSECT IDX.
|
||
MOVE AC0,SGRELC(AC1) ;[1132] GET NEW MODE AND PC
|
||
TLNE AC0,-1 ;[1132] IS NEW MODE ABSOLUTE?
|
||
JRST %SWSG3 ;[1132] NO
|
||
HRRM AC0,@REL1P+1 ;[1132] YES - SAVE RELOC PC
|
||
HRR AC0,ABSLOC ;[1132] AND USE CURRENT ABSOLUTE PC
|
||
%SWSG3: PUSH P,AC0 ;[1132] SAVE NEW MODE AND PC
|
||
MOVEM AC1,SGNCUR ;[1132] SET NEW CURRENT PSECT
|
||
JUMP1 .+2 ;IF PASS 2 THEN
|
||
CALL SGOUTN ;OUTPUT PSECT NAME BLOCK
|
||
POP P,AC0 ;GET RESULT
|
||
HLRZM AC0,MODA ;SET MODES
|
||
HLRZM AC0,MODO
|
||
HRRZM AC0,LOCA ;AND LOCATIONS
|
||
HRRZM AC0,LOCO
|
||
POP P,SGNCUR ;STORE NEW PSECT INX
|
||
MOVE AC1,SGNCUR ;NEW PSECT INX
|
||
HRRZ AC0,SGATTR(AC1) ;GET PSECT BRK
|
||
MOVEM AC0,HIGH ;RESTORE IT
|
||
JRST SRCHI ;[664] SET UP SRCHX, EXIT
|
||
|
||
ERRSX: TRO ER,ERRS ;FLAG PSECT USAGE ERROR
|
||
RET ;DONE
|
||
> ;END IFN FTPSECT
|
||
|
||
HISEG1:
|
||
IFN FTPSECT,< ;[575]
|
||
SKIPE SGNMAX ;IF PSECTS USED THEN CAN'T USE
|
||
JRST ERRSX ;HISEG OR TWOSEG
|
||
>
|
||
CALL HIGHQ ;SET CURRENT PROGRAM BREAK
|
||
CALL COUTD ;DUMP CURRENT TYPE OF BLOCK
|
||
SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE
|
||
SKIPE HIGH ;OR ANY RELOC CODE PUT OUT
|
||
TRO ER,ERRQ ;FLAG AS AN ERROR
|
||
CALL BYPASS ;[664] GO GET EXPRESSION
|
||
TLO IO,IORPTC
|
||
CALL EVALXQ ;CHECK FOR EXTERNAL
|
||
ANDCMI AC0,777 ;ONLY ALLOWED TO START ON NEW P BOUND
|
||
HRRZM AC0,LOCA ;SET LOC COUNTERS
|
||
HRRZM AC0,LOCO
|
||
MOVEI RC,1 ;ASSUME RELOCATABLE
|
||
RET
|
||
|
||
TWSEG0: CALL HISEG1 ;COMMON CODE
|
||
JUMPN AC0,.+2 ;ARGUMENT SEEN
|
||
MOVEI AC0,400000 ;ASSUME 400000
|
||
HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG.
|
||
HRRZM AC0,HHIGH ;IN CASE NO HISEG CODE
|
||
TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP
|
||
|
||
HISEG0: CALL HISEG1 ;COMMON CODE
|
||
HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG
|
||
MOVEM RC,MODA ;SET MODES
|
||
MOVEM RC,MODO
|
||
SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT
|
||
JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT
|
||
|
||
IFN FORMSW,<
|
||
ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING
|
||
RET
|
||
OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY
|
||
RET >
|
||
|
||
IFE FORMSW,<
|
||
SYN CPOPJ,ONFORM
|
||
SYN CPOPJ,OFFORM>
|
||
|
||
HIGHQ:
|
||
HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION
|
||
SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE
|
||
JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO
|
||
MOVEM V,ABSHI
|
||
RET]
|
||
SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM?
|
||
JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.?
|
||
JRST .+1 ;NO,STORE LOW SEGMENT
|
||
CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?
|
||
MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE
|
||
RET]
|
||
CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?
|
||
MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE
|
||
RET
|
||
|
||
ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK
|
||
OFFML: TLO FR,MWLFLG ;NO
|
||
RET
|
||
|
||
OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING
|
||
RET
|
||
|
||
SUPRE0: CALL GETSYM ;GET A SYMBOL TO SUPRES
|
||
JRST SUPRE1 ;ERROR
|
||
CALL SSRCH ;SYMBOL ONLY
|
||
JRST SUPRE1 ;GIVE ERROR MESSAGE
|
||
CALL SUPSYM ;SEE IF "!" SEEN
|
||
TLOA ARG,SUPRBT ;SET THE SUPRESS BIT
|
||
SUPRE1: TROA ER,ERRA
|
||
IORM ARG,(SX) ;PUT BACK
|
||
JUMPCM SUPRE0 ;ANY MORE?
|
||
JRST SUPRS1
|
||
|
||
SUPRSA: CALL LOOKUP ;SUPRESS ALL
|
||
MOVSI ARG,SUPRBT
|
||
IORM ARG,(SX)
|
||
SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP
|
||
IFN FTPSECT,< ;[575]
|
||
TLZ IO,RSASSW ;...
|
||
>
|
||
RET
|
||
|
||
XPUNG0: JUMP1 CPOPJ ;[664]
|
||
CALL LOOKUP
|
||
MOVE ARG,(SX) ;GET SYMBOL FLAGS
|
||
TLNN ARG,INTF!ENTF!EXTF!SPTR
|
||
TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT
|
||
SETZM EXTPNT
|
||
IFN FTPSECT,< ;[575]
|
||
TLZ IO,RSASSW ;...
|
||
>
|
||
MOVEM ARG,(SX) ;RESTORE FLAGS
|
||
RET
|
||
|
||
NODDT0: CALL GETSYM ;GET A SYMBOL TO SUPRES
|
||
JRST NODDT1 ;ERROR
|
||
CALL SSRCH ;SYMBOL ONLY
|
||
JRST [CALL MSRCH ;[670] ALLOW OPDEF
|
||
JRST NODDT1 ;[670] OTHERWISE GIVE ERROR
|
||
TLNE ARG,OPDF ;[670]
|
||
JRST .+1 ;[670]
|
||
JRST NODDT1] ;[670]
|
||
CALL SUPSYM ;SEE IF "!" SEEN
|
||
TLOA ARG,NOOUTF ;SET THE NO-DDT BIT
|
||
NODDT1: TROA ER,ERRA
|
||
IORM ARG,(SX) ;PUT BACK
|
||
JUMPCM NODDT0 ;ANY MORE?
|
||
JRST SUPRS1
|
||
|
||
SUPSYM: CAIE C,'!' ;WANT NO DDT OUTPUT FOR THIS SYMBOL?
|
||
RET ;NO
|
||
TLO ARG,NOOUTF ;YES, SET FLAG
|
||
PJRST BYPASS ;[664] SKIP "!" AND RETURN
|
||
|
||
; .CREF SYMBOL,SYMBOL,ETC
|
||
ONCRF: CALL GETSYM ;SEE IF A SYMBOL SPECIFIED
|
||
JRST [MOVSI AC0,IONCRF ;NO, PUT FLAG BACK
|
||
TRZ ER,ERRA ;CLEAR "A" ERROR
|
||
TLZ IO,DEFCRS ;CLEAR ANY WAITING DEFINING OCCURENCES
|
||
JRST IORSET]
|
||
ONCRF0: CALL SEARCH ;GENERAL SEARCH
|
||
JRST ONCRFE ;ERROR
|
||
MOVSI ARG,NCRF ;NO CREF FLAG IN ARG
|
||
ANDCAM ARG,(SX) ;TURN OFF NO CREF BIT
|
||
CAMN AC0,1(SX) ;OTHER ENTRY IN SYMBOL TABLE?
|
||
ANDCAM ARG,2(SX) ;TURN OFF NCRF
|
||
CAMN AC0,-3(SX) ;OTHER ENTRY IN SYMBOL TABLE
|
||
ANDCAM ARG,-2(SX) ;TURN OFF NCRF
|
||
CAIA
|
||
ONCRFE: TRO ER,ERRA ;SET ERROR CONDITION
|
||
JUMPNC SUPRS1 ;GIVE UP IF NO MORE
|
||
CALL GETSYM ;GET NEXT SYMBOL
|
||
JRST ONCRFE ;ERROR
|
||
JRST ONCRF0
|
||
|
||
; .XCREF SYMBOL,SYMBOL,ETC
|
||
OFFCRF: CALL GETSYM ;SEE IF A SYMBOL SPECIFIED
|
||
JRST [MOVSI AC0,IONCRF ;PUT FLAG BACK
|
||
TRZ ER,ERRA ;CLEAR "A" ERROR
|
||
JUMP1 CPOPJ ;[1063] EXIT ON PASS1
|
||
TDO IO,AC0 ;[1063] SET APPROPRIATE FLAGS
|
||
RET] ;[1063]
|
||
OFCRF0: CALL SEARCH ;GENERAL SEARCH
|
||
JRST OFCRFE ;ERROR
|
||
MOVSI ARG,NCRF ;NO CREF FLAG IN ARG
|
||
IORM ARG,(SX) ;SET NO CREF BIT
|
||
CAMN AC0,1(SX) ;OTHER ENTRY IN SYMBOL TABLE?
|
||
IORM ARG,2(SX) ;SET BIT
|
||
CAMN AC0,-3(SX) ;OTHER ENTRY IN SYMBOL TABLE?
|
||
IORM ARG,-2(SX) ;SET BIT
|
||
CAIA
|
||
OFCRFE: TRO ER,ERRA ;FLAG ERROR
|
||
JUMPNC SUPRS1 ;GIVE UP IF NO MORE SYMBOLS
|
||
CALL GETSYM ;GET NEXT SYMBOL
|
||
JRST OFCRFE ;ERROR
|
||
JRST OFCRF0
|
||
|
||
TITLE0: SKIPE TTLFND ;[1123] TITLE ALREADY SEEN FOR THIS MODULE?
|
||
JRST [ TRO ER,ERRQ ;[1123] YES - GENERATE Q ERROR
|
||
JRST REMAR0] ;[1123] AND IGNORE THE REST
|
||
MOVEI SX,.TBUF
|
||
HRRI AC0,TBUF
|
||
CALL SUBTT1 ;GO READ IT
|
||
MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN
|
||
SETOM TTLFND ;[1123] INDICATE TITLE SEEN
|
||
JUMP2 REMAR0 ;[1123] SKIP REST DURING PASS 2
|
||
SKIPE UNIVSN ;[1123] WAS IT A UNIVERSAL?
|
||
CALL ADDUNV ;[1123] YES - ADD TO TABLE
|
||
IFN CCLSW,<JRST PRNAM> ;PRINT NAME IF FIRST ONE
|
||
IFE CCLSW,<RET> ;EXIT OTHERWISE
|
||
|
||
SUBTT0: JUMP1 [SKIPE SBUF ;PASS1, FIRST SUBTTL?
|
||
JRST REMAR0 ;NO,
|
||
MOVE SX,PAGENO ;YES, CHECK PAGE NUMBER
|
||
CAIE SX,1 ;PAGE 1?
|
||
JRST REMAR0 ;NO,
|
||
JRST .+1] ;YES,
|
||
MOVEI SX,.SBUF
|
||
HRRI AC0,SBUF
|
||
SUBTT1: CALL BYPASS ;[664] BYPASS LEADING BLANKS
|
||
TLO IO,IORPTC
|
||
SUBTT3: CALL CHARAC ;GET ASCII CHARACTER
|
||
IDPB C,AC0 ;STORE IN BLOCK
|
||
CAIGE C,40 ;TEST FOR TERMINATOR
|
||
CAIN C,HT
|
||
SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL
|
||
DPB RC,AC0 ;END, STORE TERMINATOR
|
||
SOJA SX,REMAR1 ;COUNT NULL AND EAT UP ANY REMAINING CHARS.
|
||
|
||
IFN CCLSW,<
|
||
PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG
|
||
RET
|
||
PUSH P,AC0 ;SAVE AC0 DMN
|
||
PUSH P,RC ;AND RC
|
||
MOVE AC0,[POINT 7,TBUF]
|
||
MOVE SX,[POINT 7,OTBUF]
|
||
MOVEI RC,6 ;MAX OF SIX CHRS
|
||
MOVEI C,HT ;START WITH A TAB
|
||
IDPB C,SX
|
||
PN1: ILDB C,AC0
|
||
CAILE C," " ;CHECK FOR LEGAL
|
||
CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z
|
||
JRST PN2
|
||
PUSH P,C ;SAVE CHAR
|
||
CAILE C,137 ;GET RADIX-50 VALUE FROM CSTAT
|
||
SUBI C,40
|
||
SUBI C,40
|
||
LDB CS,[POINT 6,CSTAT(C),23]
|
||
POP P,C
|
||
SKIPN CS ;RADIX-50?
|
||
JRST PN2 ;NO, TREAT AS TERMINATOR
|
||
IDPB C,SX ;PUT IN OUTPUT BUFFER
|
||
SOJG RC,PN1 ;GET MORE
|
||
PN2: MOVEI C,CR ;END WITH CR-LF
|
||
IDPB C,SX
|
||
MOVEI C,LF
|
||
IDPB C,SX
|
||
SETZ C, ;TERMINATOR
|
||
IDPB C,SX
|
||
TTCALL 3,OTBUF
|
||
POP P,RC
|
||
POP P,AC0 ;RESTORE AC0 DMN
|
||
RET
|
||
>
|
||
|
||
SYN0: CALL GETSYM ;GET THE FIRST SYMBOL
|
||
JRST ERRAX ;ERROR, EXIT
|
||
CALL MSRCH ;TRY FOR MACRO/OPDEF
|
||
JRST SYN3 ;NO, TRY FOR OPERAND
|
||
SYN1: MOVEI SX,MSRCH ;YES, SET FLAG
|
||
SYN2: JUMPNC ERRAX ;ERROR IF NO COMMA
|
||
PUSH P,ARG ;SAVE SOME REGISTERS
|
||
PUSH P,RC
|
||
PUSH P,V
|
||
PUSH P,SX ;SAVE SEARCH ROUTINE
|
||
CALL GETSYM ;GET THE SECOND SYMBOL
|
||
JRST [SUB P,[4,,4] ;PUT STACK BACK
|
||
RET] ;AND GIVE UP
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
TLO IO,IONCRF ;[1143] DO NOT CREF FIRST SEARCH
|
||
CALL OPCFIX ;[736] FIX UP SYMTAB IF FORW-REF'ED
|
||
TLZ IO,IONCRF ;[1143] ALLOW CREFFING AGAIN
|
||
TLO IO,DEFCRS ;[1143] INDICATE DEFINITION
|
||
POP P,SX ;RESTORE SEARCH ROUTINE
|
||
CALL @SX ;SEARCH FOR SECOND SYMBOL
|
||
JFCL
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
POP P,V ;RESTORE VALUES
|
||
POP P,RC
|
||
POP P,ARG
|
||
TLNE ARG,MACF ;MACRO?
|
||
CALL REFINC ;YES, INCREMENT REFERENCE
|
||
JRST INSERT ;INSERT AND EXIT
|
||
|
||
SYN3: CALL SSRCH ;SEARCH FOR OPERAND
|
||
JRST SYN4 ;NOT FOUND, TRY OP CODE
|
||
TLO ARG,SYNF ;FLAG AS SYNONYM
|
||
TLNE ARG,EXTF ;EXTERNAL?
|
||
HRRZ V,ARG ;YES, RELPACE WITH POINTER
|
||
MOVEI SX,SSRCH ;SET FLAG
|
||
TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE
|
||
JRST SYN2
|
||
JRST ERRAX
|
||
|
||
SYN4: CALL OPTSCH ;SEARCH FOR OP-CODE
|
||
JRST ERRAX ;NOT FOUND, EXIT WITH ERROR
|
||
MOVSI ARG,SYNF ;FLAG AS SYNONYM
|
||
SKIPN UWVER ;WRITING A UNIVERSAL FILE?
|
||
JRST SYN1 ;NO,
|
||
MOVE AC1,FREE ;YES, GET A FREE WORD
|
||
ADDI AC1,1
|
||
CAML AC1,SYMBOL ;NO MORE ROOM?
|
||
CALL XCEEDS ;GET MORE ROOM
|
||
EXCH AC1,FREE ;UPDATE FREE
|
||
MOVEM AC0,(AC1) ;KEEP THE SIXBIT OPERATOR
|
||
MOVE V,AC0
|
||
HRR ARG,AC1 ;KEEP THE POINTER
|
||
TLO ARG,SIXF ;SET FLAGS FOR POINTER TO SIXBIT
|
||
BITON USYN,UWVER ;SET NEW-SYN-HANDLING BIT IN UNV VERSION #
|
||
JRST SYN1 ;CONTINUE...
|
||
|
||
PURGE0: CALL GETSYM ;GET A MNEMONIC
|
||
JRST [TRZ ER,ERRA ;CLEAR ERROR
|
||
RET] ;AND RETURN
|
||
CALL MSRCH ;SEARCH MACRO SYMBOL TABLE
|
||
JRST PURGE2 ;NOT FOUND, TRY SYMBOLS
|
||
PUSH P,CS ;SAVE CS AS IT MAY GET GARBAGED
|
||
TLNE ARG,MACF ;MACRO?
|
||
CALL REFDEC ;YES, DECREMENT THE REFERENCE
|
||
POP P,CS
|
||
JRST PURGE4 ;REMOVE SYMBOL FROM TABLE
|
||
|
||
PURGE2: CALL SSRCH ;TRY OPERAND SYMBOL TABLE
|
||
JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL
|
||
PURGE4: CALL REMOVE ;REMOVE FROM THE SYMBOL TABLE
|
||
SETZM EXTPNT ;IN CASE UNDEF OR EXT SYMBOL
|
||
PURGE5: JUMPCM PURGE0
|
||
RET ;EXIT
|
||
|
||
OPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED
|
||
TRO ER,ERRO ;GIVE "O" ERROR
|
||
OPD: MOVE AC0,V ;PUT VALUE IN AC0
|
||
IFE POLISH,< JRST OP> ;[772]
|
||
IFN POLISH,< ;[772]
|
||
JUMPGE RC,OP ;[772]
|
||
PUSH P,[POLFWF] ;[772] HERE ONLY IF POLISH OPDEF REFC'ED
|
||
POP P,POLTYP ;[772] MUST BE FULL WORD FIXUP
|
||
CALL POLPOP ;[772] GO FINISH UP THE POLISH STACK
|
||
SETZB RC,EXTPNT ;[772] CLEAR RELOCATION AND EXTERNAL PTR
|
||
JRST STOW> ;[772] EXIT THRU STOW
|
||
|
||
IOP: MOVSI AC2,(POINT 9,0(P),11)
|
||
IFE FORMSW,< TLOA IO,IOIOPF> ;SET "IOP SEEN" AND SKIP
|
||
IFN FORMSW,< PUSH P,IOFORM ;USE I/O FORM
|
||
JUMPAD .+2 ;IF IN ADDRESS FIELD, SKIP
|
||
SETOM IOSEEN ;SIGNAL FOR BOUT TO ADJUST FIELDS
|
||
TLO IO,IOIOPF ;SET "IOP" SEEN
|
||
JRST OP+2>
|
||
|
||
OP: MOVSI AC2,(POINT 4,0(P),12)
|
||
IFN FORMSW,< PUSH P,INFORM> ;USE INST. FORM
|
||
IFN POLISH,<
|
||
TRZN FRR,EXPSW ;[634] SKIPE IF DOING EXP
|
||
SETOM POLTYP ;[634] REST MUST BE RIGHT HALF FIXUP
|
||
>
|
||
TLO IO,FLDSW ;[634] WE HAVE A OPTR, REST IS ADDR.
|
||
PUSH P,RC
|
||
PUSH P,AC0 ;STACK CODE
|
||
PUSH P,AC2
|
||
CALL EVALEX ;EVALUATE FIRST EXPRESSION
|
||
POP P,AC2
|
||
JUMPNC OP2
|
||
OP1B: CALL GETCHR ;GET A CHARACTER
|
||
IFE FORMSW,<JUMPCM XWD5> ;PROCESS COMMA COMMA IN XWD
|
||
IFN FORMSW,<JUMPNC .+4 ;JUMP IF NO COMMA
|
||
MOVE AC2,HWFORM ;GET FORM WORD FOR XWD
|
||
MOVEM AC2,-2(P) ;REPLACE INSTRUCTION FORM
|
||
JRST XWD5> ;PROCESS COMMA COMMA IN XWD
|
||
TLO IO,IORPTC ;NOT A COMMA,REPEAT IT
|
||
TLZE FR,INDSW ;[1076] HAS '@' BEEN SEEN?
|
||
TRO ER,ERRQ ;[1076] YES - CLEAR AND GIVE 'Q' ERROR
|
||
LDB AC1,AC2
|
||
ADD AC1,AC0
|
||
DPB AC1,AC2
|
||
IFN POLISH,<
|
||
TLNN FR,POLSW ;DON'T ALLOW EXTERNAL ACS
|
||
>
|
||
JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE?
|
||
CALL QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR
|
||
|
||
OP1A: CALL EVALEX ;GET ADDRESS PART
|
||
OP2: CALL EVADR ;EVALUATE STANDARD ADDRESS
|
||
OP3: POP P,AC0 ;PUT IN AC0
|
||
POP P,RC
|
||
JUMPL RC,OP3A ;[1012] JUMP IF POLISH
|
||
TLNN RC,-2 ;[1012] LEFT EXTERNAL?
|
||
SKIPA ;[1012] NO,
|
||
HLLM RC,EXTPNT ;[1047][1012] YES, RECOVER EXTPNT FROM RC
|
||
OP3A: ;[1012]
|
||
IFN FORMSW,< POP P,AC1> ;GET FORM WORD
|
||
IFN POLISH,<
|
||
JUMPGE RC,OP4 ;[624] JUMP IF NOT POLISH
|
||
SKIPN INANGL ;[1227] IF NOT IN ANGLE BRACKETS
|
||
JUMPE AC0,OP4 ;[1227] OR IF NO OPCODE
|
||
SKIPE INASGN ;[1227] DOING ASSIGNMENT?
|
||
JRST OP3B ;[1227] YES - DO ADD
|
||
SKIPN INOPDF ;[624] OPDEF?
|
||
JRST OP4 ;[624] NO, JUMP
|
||
OP3B: MOVE PS,CSTAT+'+' ;[1227][624] YES, ADD OP AND ADR FIELDS
|
||
CALL CFORCP ;[706][624] IN A POLISH BLOCK
|
||
>
|
||
OP4: SETZ PR, ;[747]
|
||
SKIPE (P) ;[624] CAME FROM EVALCM?
|
||
JRST STOW ;NO,STOW CODE AND EXIT
|
||
POP P,AC1 ;YES,EXIT IMMEDIATELY
|
||
RET
|
||
|
||
IFN FORMSW,<
|
||
INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1
|
||
IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1
|
||
>
|
||
|
||
EVADR: ;EVALUATE STANDARD ADDRESS
|
||
IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S
|
||
JRST .+4 ;IT WAS
|
||
TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS
|
||
TLCE AC0,-1 ;OK IF ALL 1'S
|
||
TRO ER,ERRQ> ;NO,FLAG Q ERROR
|
||
ADD AC0,-1(P) ;ADD ADDRESS PORTIONS
|
||
HLL AC0,-1(P) ;GET LEFT HALF
|
||
TLZE FR,INDSW ;INDIRECT BIT?
|
||
TLO AC0,(Z @) ;YES, PUT IT IN
|
||
MOVEM AC0,-1(P) ;RE-STACK CODE
|
||
JUMPE RC,[MOVE RC,-2(P) ;[767] UPDATE RELOCATION
|
||
JRST EVADR4] ;[767]
|
||
SKIPN -2(P) ;[1227] CURRENT RC NON-ZERO, IS STACKED RC?
|
||
JRST EVADRB ;[1227] YES - GO UPDATE
|
||
EXCH AC1,-2(P) ;[1227] GET AN AC
|
||
TLNE AC1,-1 ;[1227] LH RC ON STACK?
|
||
TLNN RC,-1 ;[1227] AND LH CURRENT RC?
|
||
SKIPA ;[1227] NO - OK SO FAR
|
||
JRST EVADRA ;[1227] GO FLAG ERROR
|
||
TRNE AC1,-1 ;[1227] RH RC ON STACK?
|
||
TRNN RC,-1 ;[1227] AND RH CURRENT RC?
|
||
SKIPA ;[1227] NO - DIFFERENT HALVES OK
|
||
EVADRA: TROA ER,ERRR ;[1227] SAME HALVES - RELOCATION ERROR
|
||
ADD RC,AC1 ;[1227] ADD RELOCATIONS
|
||
EXCH AC1,-2(P) ;[1227] RESTORE AC
|
||
EVADRB: MOVEM RC,-2(P) ;[1227] UPDATE STACKED RC
|
||
EVADR4: ;[767]
|
||
IFN POLISH,<
|
||
JUMPGE RC,EVADR1 ;[634] JUMP IF NOT POLISH
|
||
JUMPE AC0,EVADR2 ;[634] DOING POLISH, JUMP IF NO CODE
|
||
SKIPE INANGL ;[730] IN <...>?
|
||
JRST EVADR2 ;[730] YES,
|
||
SKIPN INASGN ;[1227] DOING ASSIGNMENT?
|
||
SKIPE INOPDF ;[1227] OR OPDEF?
|
||
JRST EVADR2 ;[1227] YES - SKIP
|
||
PUSH P,RC ;[634] THERE IS SOMETHING, WE NEED AN AC
|
||
HRRZ RC,POLTYP ;[634] FOR THE TYPE OF FIXUPS
|
||
CAIN RC,-3 ;[634] FULLWORD?
|
||
JRST [TRO ER,ERRQ ;[634] YES, ERROR
|
||
JRST EVADR3] ;[634] JUMP
|
||
CAIN RC,-1 ;[634] RIGHT HALF FIXUP?
|
||
TRNN AC0,-1 ;[634] AND STUFF IN RIGHT HALF?
|
||
SKIPA ;[634] NO, O.K. THEN
|
||
JRST [TRO ER,ERRQ ;[634] YES, ERROR
|
||
JRST EVADR3] ;[634] JUMP
|
||
CAIN RC,-2 ;[634] LEFT HALF FIXUP?
|
||
TLNN AC0,-1 ;[634] AND STUFF IN LEFT HALF?
|
||
SKIPA ;[634] NO,
|
||
TRO ER,ERRQ ;[634] YES, ERROR
|
||
EVADR3: POP P,RC ;[634] RESTORE AC RC
|
||
EVADR2: ;[1227]
|
||
>
|
||
EVADR1: ;[634]
|
||
IFN POLISH,< ;[1114]
|
||
SKIPE PLHIDX ;[1114] LH INDEX VALUE SAVED FROM POLISH?
|
||
JRST [ MOVE AC0,PIDXVL ;[1114] YES - GET VALUE
|
||
MOVE RC,PIDXRC ;[1114] AND RC
|
||
TRNE RC,-2 ;[1114] EXTERNAL PTR?
|
||
HRLM RC,EXTPNT ;[1114] YES - FIXUP EXTERN PTR
|
||
JRST EVADR6] ;[1114] REJOIN INDEX CODE
|
||
> ;[1114]
|
||
CAIE C,10 ;"("?
|
||
RET ;NO, EXIT
|
||
|
||
TRO FRR,IDXSW ;[1107] SET OP INDEXING
|
||
IFN POLISH,< ;[1107]
|
||
PUSH P,POLTYP ;[1107] SAVE FIXUP TYPE
|
||
PUSH P,[POLFWF] ;[1107] DO FULL WORD FIXUP
|
||
POP P,POLTYP ;[1107] IN CASE OF POLISH
|
||
> ;[1107]
|
||
MOVSS EXTPNT ;WFW
|
||
CALL EVALCM ;EVALUATE
|
||
MOVSS EXTPNT ;WFW
|
||
IFN POLISH,< ;[1107]
|
||
POP P,POLTYP ;[1107] RESTORE FIXUP TYPE
|
||
TRNE FRR,FWPSW ;[1107] WAS POLISH GENERATED?
|
||
TRO ER,ERRR ;[1107] YES - FLAG ERROR
|
||
> ;[1107]
|
||
TRZ FRR,IDXSW ;[1107] CLEAR OP INDEXING
|
||
EVADR6: ;[1114] HANDLE THE INDEXING EXPRESSION
|
||
MOVSS V,AC0 ;SWAP HALVES
|
||
IFE IIISW,<MOVSS SX,RC
|
||
IOR SX,V ;MERGE RELOCATION
|
||
TRNN SX,-1 ;RIGHT HALF ZERO?
|
||
JRST OP2A ;YES, DO SIMPLE ADD
|
||
MOVE ARG,RC> ;NO, SWAP RC INTO ARG
|
||
IFN IIISW,<MOVSS ARG,RC>
|
||
ADD V,-1(P) ;ADD RIGHT HALVES
|
||
ADD ARG,-2(P)
|
||
HRRM V,-1(P) ;UPDATE WITHOUT CARRY
|
||
HRRM ARG,-2(P)
|
||
HLLZS AC0 ;PREPARE LEFT HALVES
|
||
HLLZS RC
|
||
IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?
|
||
TRO ER,ERRQ ;NO FLAG FORMAT ERROR
|
||
OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?
|
||
CALL OP2A1 ;YES,IS IT LEGAL?
|
||
TLNE AC0,777000 ;OP CODE FIELD USED?
|
||
JRST [EXCH AC0,-1(P) ;YES, GET STORED CODE
|
||
TLNE AC0,777000 ;OP CODE FIELD BEEN SET?
|
||
TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR
|
||
EXCH AC0,-1(P)
|
||
JRST .+1]> ;RETURN TO ADD
|
||
ADDM AC0,-1(P) ;MERGE WITH PREVIOUS VALUE
|
||
ADDM RC,-2(P)
|
||
IFN POLISH,< ;[1114]
|
||
SKIPE PLHIDX ;[1114] LH INDEX SAVED FROM POLISH?
|
||
JRST [ SETZM PLHIDX ;[1114] YES - CLEAR FLAG
|
||
TLO IO,IORPTC ;[1114] NEXT CHAR MAY BE SIGNIFICANT
|
||
JRST BYPASS] ;[1114] AND SKIP CHECK
|
||
> ;[1114]
|
||
CAIE C,11 ;")"?
|
||
JRST ERRAX ;NO, FLAG ERROR
|
||
;YES, BYPASS PARENTHESIS
|
||
BYPASS: CALL GETCHR ;[664]
|
||
BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS
|
||
RET ;EXIT
|
||
|
||
IFE IIISW,<
|
||
OP2A1: EXCH RC,-2(P) ;GET STORED CODE
|
||
TLNN RC,-1 ;OK IF ALL ZERO
|
||
JRST OP2A2 ;OK SO RETURN
|
||
TLC RC,-1 ;CHANGE ALL ONES TO ZEROS
|
||
TLCE RC,-1 ;OK IF ALL ONES
|
||
TRO ER,ERRQ ;OTHERWISE A "Q" ERROR
|
||
OP2A2: EXCH RC,-2(P) ;GET RC,BACK
|
||
RET> ;AND RETURN
|
||
|
||
EXPRES: HRLZ AC0,CURADX ;[613] FUDGE FOR OCT0
|
||
OCT0: PUSH P,CURADX ;[613] PUSH CURRENT RADIX
|
||
HLRM AC0,CURADX ;[613]
|
||
IFN POLISH,<
|
||
HRREI AC0,POLFWF ;PRESET POLISH TYPE SINCE WE
|
||
MOVEM AC0,POLTYP ;NEED FULL WORD FIXUPS IF POLISH
|
||
TRO FRR,EXPSW ;[634] FLAG FOR DOING EXP, DON'T CHANGE FWF
|
||
>
|
||
OCT1: CALL EVALEX ;EVALUATE
|
||
TLZE FR,INDSW ;[1115] INDIRECT DANGLING?
|
||
TRO ER,ERRQ ;[1115] ERROR IF NOT ENCLOSED IN BRACKETS
|
||
IFN POLISH,<
|
||
TLNN RC,-1 ;[1106] DO WE HAVE ABSOLUTE LEFT HALF
|
||
TRNN RC,-2 ;[1106] AND EXTERNAL RIGHT HALF
|
||
JRST OCT1A ;[1106] NO - DON'T DO FULLWORD
|
||
TLNN AC0,-1 ;[1106] WAS ABSOLUTE SPECIFIED
|
||
CALL OCTFW ;[1106] NO - CAN DO FULL WORD FIXUP
|
||
OCT1A: ;[1106]
|
||
>
|
||
IFN FORMSW,< MOVE AC1,HWFORM>
|
||
CALL STOW ;STOW CODE
|
||
JUMPCM OCT1
|
||
POP P,CURADX ;[613] YES, RESTORE RADIX
|
||
IFN POLISH,<
|
||
SETZM POLTYP ;CLEAR FLAG
|
||
>
|
||
RET ;EXIT
|
||
|
||
;HERE TO GENERATE FULL WORD FIXUPS FOR EXP EXTERN
|
||
;NOTE THIS GENERATES BLOCK TYPE 11 POLISH FIXUPS
|
||
;THESE CANNOT BE LOADER BY LOADER UNLESS FAILSW IS ON
|
||
IFN POLISH,<
|
||
OCTFW: SKIPN INASGN ;[1227] DOING ASSIGNMENT?
|
||
SKIPE INOPDF ;[1227] OR OPDEF?
|
||
RET ;[1227] YES - JUST RETURN
|
||
JUMP1 [ TRO ER,ERRF ;[1227]
|
||
RET] ;IGNORE ON PASS1
|
||
MOVE PV,FREE ;COPY CODE FROM POLPOP
|
||
EXCH PV,POLIST ;TO SET UP A NEW BLOCK
|
||
CALL POLSTR ;STORE POINTER TO LAST
|
||
PUSH P,MWP ;[1161] SAVE MWP
|
||
SETZ MWP, ;[1161] AND CLEAR IT
|
||
SETO PV, ;[1161] RESERVE ROOM FOR
|
||
CALL POLSTR ;[1161] COUNT OF POLISH WORDS NEEDED
|
||
IFN FTPSECT,< ;[641]
|
||
SKIPN SGNCUR ;[641] DOING PSECTS?
|
||
JRST OCTFW1 ;[641] NO,
|
||
HRRO PV,SGNCUR ;[641] YES, GET CURRENT PSECT NUMBER
|
||
TRO PV,400000 ;[641] MAKE IT INTO PSECT INDEX
|
||
CALL POLSTR ;[641] AND STORE IN BLOCK
|
||
AOJ MWP, ;[1161] COUNT PSECT REFERENCE
|
||
OCTFW1:
|
||
>
|
||
SKIPE CV ;[1110] IF EXTERNAL + VALUE
|
||
JRST [ HRROI PV,3 ;[1110] POLISH ADD OPERATION
|
||
CALL POLSTR ;[1110] STORE IT
|
||
MOVEI PV,1 ;[1110] 36 BIT VALUE
|
||
CALL POLSTR ;[1110] STORE
|
||
SETZ PV, ;[1110] ABSOLUTE RELOCATION
|
||
CALL POLSTR ;[1110] STORE
|
||
MOVE PV,CV ;[1110] VALUE
|
||
CALL POLSTR ;[1110] STORE IT
|
||
ADDI MWP,4 ;[1161] INCR COUNT FOR OP AND VALUE
|
||
JRST .+1] ;[1110]
|
||
MOVE PV,EXTPNT ;GET POINTER TO EXTERNAL SYMBOL
|
||
CALL POLFS2 ;STORE EXTERNAL
|
||
JRST POLOCT ;FIXUP ADDRESS, AND RETURN
|
||
>
|
||
|
||
SIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER
|
||
MOVEI AC0,0 ;CLEAR WORD
|
||
|
||
SIXB20: CALL CHARL ;GET NEXT CHARACTER
|
||
CAMN C,SX ;IS THIS PRESET DELIMITER?
|
||
IFE FORMSW,< JRST ASC60> ;YES
|
||
IFN FORMSW,<
|
||
JRST [ CALL BYPASS ;[664]
|
||
ANDCM RC,STPX
|
||
MOVE AC1,SXFORM
|
||
SETZM INTXT ;NO LONGER IN TEXT
|
||
TRZN FRR,WD2SW ;[607] DOING 2ND WORD?
|
||
JRST STOWZ ;[607] NO, GENERATE A NULL WORD
|
||
JUMPGE RC,STOWZ
|
||
RET]>
|
||
CAIL C,"A"+40
|
||
CAILE C,"Z"+40
|
||
JRST .+2 ;[701]
|
||
TRZA C,100 ;[701] CONVERT LOWER CASE TO SIXBIT
|
||
SUBI C,40 ;[701] CONVERT UC TO SIXBIT
|
||
JUMPL C,SIXB30 ;[701] IF NOT LEGAL SIXBIT,
|
||
CAILE C,77 ;[701] FLAG A-ERROR AND TERMINATE
|
||
JRST SIXB30 ;[701]
|
||
IDPB C,RC ;NO, DEPOSIT THE BYTE
|
||
TLNE RC,770000 ;IS THE WORD FULL?
|
||
JRST SIXB20 ;NO, GET NEXT CHARACTER
|
||
IFN FORMSW,<
|
||
SKIPA AC1,SXFORM ;SIXBIT FORM
|
||
SXFORM: BYTE (6) 1,1,1,1,1,1
|
||
>
|
||
CALL STOWZ ;YES, STORE
|
||
TRO FRR,WD2SW ;[607] SECOND WORD
|
||
JRST SIXB10 ;GET NEXT WORD
|
||
|
||
SIXB30: TRO ER,ERRA ;[701]
|
||
TRZ FRR,WD2SW ;[1024] CLEAR 2ND-WORD SWITCH
|
||
TDZ CS,CS ;[701] IN CASE NESTED
|
||
MOVE AC1,SXFORM ;[701]
|
||
JRST ASC51 ;[701]
|
||
|
||
%TEXT1: TLC AC0,240000 ;CONVERT .TEXT TO COMMENT ON PASS1
|
||
ASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG
|
||
ASC10: CALL CHARL ;GET FIRST NON-BLANK
|
||
SETZM NOTFL ;INITIALIZE TO FIRST LINE
|
||
CAIE C," "
|
||
CAIN C,HT
|
||
JRST ASC10
|
||
CAIG C,CR ;CHECK FOR CRRET AS DELIM
|
||
CAIGE C,LF
|
||
CAIA
|
||
JRST ERRAX
|
||
FORERR (SX,TXT)
|
||
SETOM INTXT
|
||
MOVE SX,C ;SAVE FOR COMPARISON
|
||
JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT
|
||
|
||
ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER
|
||
TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT
|
||
MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED
|
||
IFE IIISW,<MOVEI AC0,0> ;CLEAR WORD
|
||
IFN IIISW,<TLNE SDEL,100000 ;ASCID?
|
||
TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT
|
||
TDZA AC0,AC0 ;NO, ZERO WORD
|
||
MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] >;YES, A WORD FULL OF BACKSPACES
|
||
ASC30: CALL CHARL ;GET ASCII CHARACTER AND LIST
|
||
JUMP1 ASC31 ;JUMP ON PASS1
|
||
SKIPL NOTFL ;FIRST LINE?
|
||
AOS NOTFL ;YES, COUNT CHARS IF FIRST LINE
|
||
CAIG C,FF ;LF, FF, OR VT?
|
||
CAIGE C,LF
|
||
JRST ASC31 ;JUMP IF NO
|
||
SKIPE LITLVL ;JUMP IF LITERAL AND NOT LITLST
|
||
SKIPE LITLST
|
||
JRST .+2 ;ELSE
|
||
JRST ASC31
|
||
EXCH C,NOTFL ;EXCHANGE TEMPORARILY
|
||
CAILE C,5 ;WE HAVE AT LEAST 5 CHARS?
|
||
SETO C, ;YES, NO LONGER FIRST LINE
|
||
EXCH C,NOTFL ;RESTORE FROM THE EXCHANGE
|
||
ASC31: CAMN C,SX ;TEST FOR DELIMITER
|
||
JRST ASC50 ;FOUND
|
||
IDPB C,RC ;DEPOSIT BYTE
|
||
TLNE RC,760000 ;HAVE WE FINISHED WORD?
|
||
JRST ASC30 ;NO,GET NEXT CHARACTER
|
||
IFN FORMSW,<
|
||
SKIPA AC1,ASCIIF ;USE ASCII FORM WORD
|
||
ASCIIF: BYTE (7) 1,1,1,1,1
|
||
>
|
||
TLNE SDEL,040000 ;.TEXT ?
|
||
JRST [CALL STOTXT ;YES, STORE IN REL FILE
|
||
JRST ASC20] ;CONTINUE
|
||
CALL STOWZ ;YES, STOW IT
|
||
JRST ASC20 ;GET NEXT WORD
|
||
|
||
ASC50: TDZ RC,SDEL ;TEST FOR ASCIIZ
|
||
IFE FORMSW,<ASC60:> ;[1024]
|
||
CALL BYPASS ;[664] POLISH OFF TERMINATOR
|
||
SKIPGE NOTFL ;FIRST LINE?
|
||
SOS NOTFL ;NO, MAKE IT LAST LINE
|
||
IFN FORMSW,< MOVE AC1,ASCIIF> ;USE ASCII FORM WORD
|
||
IFN IIISW,<TLNN SDEL,100000> ;NO EXTRA WORDS FOR ASCID
|
||
ASC51: ANDCM RC,STPX ;[701] STORE AT LEAST ONE WORD
|
||
SETZM INTXT ;[701] FLAG OUT OF IT
|
||
TLNN SDEL,200000 ;GET OUT WITHOUT STORING
|
||
JUMPGE RC,[TLNN SDEL,040000 ;.TEXT?
|
||
JRST STOWZ ;NO, STOW
|
||
JRST STOTXT] ;YES, STORE IN REL FILE
|
||
RET ;ASCII, NO BYTES STORED, SO EXIT
|
||
|
||
; .TEXT PSEUDO-OP
|
||
%TEXT0: JUMP1 %TEXT1 ;IGNORE ON PASS1
|
||
PUSH P,BLKTYP ;SAVE CURRENT TYPE
|
||
CALL COUTD ;DUMP CURRENT BLOCK
|
||
HLLZ SDEL,AC0 ;FLAG BITS FOR ASCII
|
||
SETZM BLKTYP ;DON'T KNOW IT YET
|
||
CALL ASC10 ;START PROCESSING
|
||
CALL STOTXD ;FINISH BLOCK
|
||
POP P,BLKTYP ;RESTORE PREVIOUS
|
||
RET
|
||
|
||
STOTXT: SKIPN BLKTYP ;FIRST WORD?
|
||
JRST [MOVEM AC0,BLKTYP
|
||
RET] ;SAVE AS BLOCK TYPE
|
||
SKIPN COUTRB ;2ND WORD
|
||
JRST [MOVEM AC0,COUTRB
|
||
RET]
|
||
AOS C,COUTX ;NO, JUST STORE AS NORMAL
|
||
MOVEM AC0,COUTDB(C)
|
||
CAIE C,^D17 ;BUFFER FULL?
|
||
RET ;NO
|
||
|
||
STOTXD: SKIPN C,BLKTYP ;SEE IF ANY TEXT TO OUTPUT
|
||
JRST COUTI ;NO JUST CLEAR COUNTS
|
||
AOS COUTX ;ACCOUNT FOR STARTING FROM -1
|
||
SETZM BLKTYP ;CLEAR BLOCKTYPE WORD FOR NEXT BLOCK
|
||
TRNN C,177_1 ;SEE IF RELOCATION WORD IS NEEDED
|
||
AOS COUTRB ;FIRST WORD OF BLOCK WAS NOT FULL,
|
||
;2ND WAS 0, PUT THE LSN BIT ON FOR
|
||
;COUTD2 TO CHECK SO THERE WON'T BE
|
||
;AN EXTRA 0 WORD IN THE FILE
|
||
JRST COUTT ;DUMP BLOCK
|
||
|
||
POINT0:
|
||
IFN FORMSW,< PUSH P,BPFORM> ;USE BYTE POINTER FORM WORD
|
||
PUSH P,RC ;STACK REGISTERS
|
||
PUSH P,AC0
|
||
IFN POLISH,< TRO FRR,NOPSW> ;[751] NO POLISH FOR SIZE
|
||
CALL EVAL10 ;EVALUATE RADIX 10
|
||
IFN POLISH,< TRZ FRR,NOPSW> ;[751]
|
||
DPB AC0,[POINT 6,0(P),11] ;STORE BYTE SIZE
|
||
JUMPNC POINT2
|
||
IFN POLISH,< SETOM POLTYP> ;FORCE RIGHT-HALF FIXUP IF POLISH
|
||
CALL EVALEX ;NO, GET ADDRESS
|
||
CALL EVADR ;EVALUATE STANDARD ADDRESS
|
||
IFN POLISH,< SETZM POLTYP> ;BACK TO NORMAL
|
||
JUMPNC POINT2
|
||
IFN POLISH,< TRO FRR,NOPSW> ;[751] NO POLISH FOR BYTE POSITION
|
||
CALL EVAL10 ;EVALUATE RADIX 10
|
||
IFN POLISH,<TRZ FRR,NOPSW> ;[751] CLEAR FLAG
|
||
TLNE IO,NUMSW ;IF NUMERIC
|
||
TDCA AC0,[-1] ;POSITION=D35-RHB
|
||
POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36
|
||
ADDI AC0,^D36
|
||
LSH AC0,^D30
|
||
ADDM AC0,0(P) ;UPDATE VALUE
|
||
JRST OP3
|
||
|
||
IFN FORMSW,<
|
||
BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1
|
||
>
|
||
|
||
|
||
IFN POLISH,<
|
||
|
||
;USE TO FORCE POLISH OPERATION CONTAINED IN PS
|
||
; RC/ POL PTR
|
||
; AC0/ CONSTANT
|
||
; PS/ OPERATOR
|
||
;
|
||
FORCEP: MOVEM RC,SAVRC ;[773]
|
||
SETZB RC,SAVCV ;[773]
|
||
; JRST FORCPP ;[733]
|
||
|
||
;THIS IS A GENERALIZE FORCEP--
|
||
;ASSUMES CV,RC,SAVCV, SAVRC ARE SETUP
|
||
|
||
FORCPP: PUSH P,[TNODE,,0] ;[706]
|
||
PUSH P,SAVCV ;[706] POPPED AS PV
|
||
PUSH P,SAVRC ;[773] POPPED AS PR
|
||
PUSH P,PS ;[733]
|
||
MOVE CS,[11,33] ;[733] FAKE END
|
||
JRST EVGETD ;[733]
|
||
|
||
|
||
CFORCP: PUSH P,CS ;[706] CS GETS DESTROYED
|
||
CALL FORCEP ;[706]
|
||
POP P,CS ;[706]
|
||
RET ;[706]
|
||
;HERE TO NEGATE A POLISH
|
||
; RC/ POL PTR
|
||
;SETS UP:
|
||
; AC0/ 0
|
||
; PS/ '-'
|
||
;
|
||
FNEGP: SETZB AC0,SAVCV ;[773]
|
||
SETZM SAVRC ;[773]
|
||
MOVE PS,CSTAT+'-' ;[727]
|
||
PUSH P,CS ;[727]
|
||
CALL FORCPP ;[773]
|
||
POP P,CS ;[727]
|
||
RET ;[727]
|
||
>
|
||
|
||
XWD0:
|
||
IFN FORMSW,< PUSH P,HWFORM> ;USE HALF WORD FORM
|
||
PUSH P,RC
|
||
PUSH P,AC0 ;STORE ZERO ON STACK
|
||
IFN POLISH,<
|
||
MOVNI AC0,2 ;FORCE LEFT HALF STORE
|
||
MOVEM AC0,POLTYP ;IF POLISH
|
||
>
|
||
CALL EVALEX ;EVALUATE EXPRESSION
|
||
XWD5: ;[614]
|
||
IFN POLISH,<
|
||
SETOM INXWD ;[1010] DOING XWD
|
||
TLNN FR,POLSW ;[614] USED POLISH?
|
||
JRST XWD1 ;[614] NO,
|
||
SETZM EXTPNT ;CLEAR RHS NOW
|
||
TRZ FRR,FWPSW ;[614] NOT FULL WORD
|
||
TRO FRR,LHPSW ;[614] MAKE IT LEFT HALF FIXUP
|
||
SKIPN INASGN ;[1227] DOING ASSIGNMENT
|
||
SKIPE INOPDF ;[1227] OR OPDEF?
|
||
JRST [PUSH P,CS ;[1227] SAVE CURRENT STATUS
|
||
MOVEM RC,SAVCV ;[1227] VALUE
|
||
MOVEM RC,SAVRC ;[1227] AND RELOC FOR FORCED POLISH
|
||
MOVEI CV,^D18 ;[1227] SHIFT THIS MANY BITS
|
||
SETZ RC, ;[1227] ABSOLUTE
|
||
MOVE PS,CSTAT+'_' ;[1227] SHIFT OPERATOR
|
||
CALL FORCPP ;[1227] FORCE LEFT SHIFT
|
||
POP P,CS ;[1227] RECOVER STATUS
|
||
MOVEM RC,-1(P) ;[1227] UPDATE RELOCATION
|
||
SETOM POLTYP ;[1227] REST IS RIGHTHALF
|
||
JRST .+1] ;[1227] CONTINUE
|
||
XWD1: SKIPE INANGL ;[706] IF IN ANGBRKTS, SEE IF POL
|
||
CALL [ PUSH P,RC ;[1013][706] NEED AN AC
|
||
MOVE RC,INANGL ;[1013][706] IF INANGL IS A PTR,
|
||
CAMN RC,[-1] ;[1013][706]
|
||
JRST [ POP P,RC ;[1013] -1, RECOVER RC
|
||
RET] ;[1013] AND RETURN
|
||
CALL MOVSTK ;[1013] MOVE TO FREE SPACE
|
||
MOVEM RC,INANGL ;[1050] RECOVER PREVIOUS INANGL
|
||
MOVEM RC,XWDANG ;[1013][706] AND SAVE IN XWDANG (FOR ANGPOL)
|
||
POP P,RC ;[1013][706]
|
||
RET] ;[706]
|
||
XWD2:> ;[706] END IFN POLISH
|
||
JUMPNC OP2 ;[706][614]
|
||
IFN POLISH,< ;[1227]
|
||
JUMPL RC,OP1A ;[1227] FINISH IN OP
|
||
>; END IFN POLISH ;[1227]
|
||
SKIPN (P) ;ANY CODE YET?
|
||
JRST XWD10 ;NO,USE VALUE IN AC0
|
||
JUMPE AC0,.+2 ;ANYTHING IN AC0?
|
||
TRO ER,ERRQ ;YES,FLAG "Q"ERROR
|
||
MOVE AC0,(P) ;USE PREVIOUS VALUE
|
||
MOVE RC,-1(P) ;AND RELOCATION
|
||
XWD10: TLNN AC0,-1 ;LEFT HALF SHOULD BE ZERO
|
||
JRST XWD11 ;IT IS
|
||
TLC AC0,-1 ;OR AT LEST ALL ONES
|
||
TLCE AC0,-1 ;FOR XWD -1,-2 ETC
|
||
TRO ER,ERRQ ;NO, WARN USER
|
||
XWD11: HRLZM AC0,0(P) ;SET LEFT HALF
|
||
HRLZM RC,-1(P)
|
||
MOVSS EXTPNT ;WFW
|
||
IFN POLISH,<
|
||
SETOM POLTYP ;FORCE RHS FIXUP
|
||
>
|
||
JRST OP1A ;EXIT THROUGH OP
|
||
|
||
IOWD0:
|
||
IFE POLISH,< CALL EVALQ > ;EVALUATE AND TEST FOR EXTERNAL
|
||
|
||
IFN POLISH,<
|
||
SKIPN INANGL ;[730] IN ANGLE-BRACKETS?
|
||
SETOM INIOWD ;[730] NO,
|
||
MOVNI AC0,2 ;FORCE LEFT HALF STORE
|
||
MOVEM AC0,POLTYP ;IF POLISH
|
||
CALL EVALEX ;EVALUATE ALLOWING EXTERNS
|
||
> ;[730]
|
||
CAIN RC,1 ;[730] RELOCATABLE VALUE
|
||
IFN POLISH,< ;[730]
|
||
JRST IOWD02 ;[730] GO SET R-ERROR
|
||
SKIPN AC1,INANGL ;[730] IN ANGLE-BRACKETS?
|
||
JRST IOWD01 ;[730] NO,
|
||
AOJGE AC1,IOWD01 ;[730] JUMP IF NOT POLISH
|
||
MOVE RC,INANGL ;[730] UPDATE RC
|
||
IOWD01: JUMPE RC,IOWD1 ;[730] DON'T BOTHER IF ABSOLUTE
|
||
JUMP1 IOWD1 ;[730] DON'T BOTHER IN PASS1
|
||
CALL FNEGP ;[730] NEGATE EXTERNAL OR POLISH
|
||
SKIPN INANGL ;[730] IN ANGLE-BRACKETS?
|
||
JRST [ CALL POLSYM ;[730] NO, COMPLETE LH POLISH
|
||
JRST IOWD1] ;[730]
|
||
MOVE RC,INANGL ;[730]
|
||
CALL MOVSTK ;[730] YES, MOVE TO FREE SPACE
|
||
MOVEM RC,XWDANG ;[730] SAVE LH POLISH PTR
|
||
MOVEM RC,INANGL ;[730] UPDATE INANGL
|
||
SETZ RC, ;[730]
|
||
JRST IOWD1 ;[730]
|
||
IOWD02:> ;[730]
|
||
TRO ER,ERRR ;[730] R-ERROR
|
||
IOWD1: JUMPNC [TRZ ER,ERRR ;[730] IN CASE SET BEFORE
|
||
SKIPN AC0 ;IF NZERO AND NO "," SEEN
|
||
TRO ER,ERRQ ;TREAT AS Q ERROR
|
||
IFN FORMSW,< MOVE AC1,HWFORM> ;USE HALF WORD FORM
|
||
SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF
|
||
MOVNS AC0 ;[730] NEGATE LEFT HALF
|
||
PUSH P,AC0 ;YES, STACK LEFT HALF
|
||
;[730] FALL THRU
|
||
|
||
|
||
;HERE FOR RIGHT HALF
|
||
SETZM EXTPNT ;[730] CLEAR EXTERNAL POINTER
|
||
IFN POLISH,< SETZM POLTYP> ;RIGHT HALF STORE BY DEFAULT
|
||
CALL EVALEX ;WFW
|
||
IFN POLISH,<
|
||
SKIPN AC1,INANGL ;[730] IN ANGLE BRACKETS?
|
||
JRST IOWD11 ;[730] NO,
|
||
CAMN AC1,XWDANG ;[730] YES,
|
||
JRST IOWD12 ;[730] JUMP IF LH POLISH
|
||
AOJGE AC1,IOWD12 ;[730] JUMP IF NOT POLISH
|
||
MOVE RC,INANGL ;[730] GET POLISH PTR
|
||
SKIPA ;[730] AND SKIP
|
||
IOWD11: TLZE FR,POLSW ;[730] DOING POLISH?
|
||
JRST [ CALL MOVSTK ;[730] YES, MOVE CURRENT POLISH TO FREE SPACE
|
||
JRST IOWDRP] ;[730] DO RH-1 POLISH
|
||
IOWD12:
|
||
JUMPE RC,IOWD13 ;[1243] ABSOLUTE?
|
||
JUMP2 [ SKIPN INANGL ;[730] NO, MUST BE REL OR EXT
|
||
JUMPN AC0,IOWD13 ;[1243] JUMP IF ADDITIVE GLOBAL NOT IN <>
|
||
CAIN RC,1 ;[730] JUMP IF
|
||
JRST IOWD13 ;[1243] RELOCATABLE
|
||
SETZM EXTPNT ;[730] EXTERNAL
|
||
JRST IOWDRP] ;[730] GO DO RH-1
|
||
JUMP1 [ CAIN RC,1 ;[1243] CHECK FOR RELOCATABLE
|
||
JRST IOWD13 ;[1243] YES
|
||
SKIPE LITLVL ;[1243] IN A LITERAL?
|
||
TRO ER,ERRF ;[1243] YES - DON'T FOLD IN PASS 1
|
||
JRST IOWD13 ] ;[1243]
|
||
IOWD13: ;[1243]
|
||
>
|
||
SUBI AC0,1
|
||
IOWD2: POP P,AC1 ;RETRIEVE LEFT HALF
|
||
HRL AC0,AC1
|
||
IFN FORMSW,< SKIPA AC1,HWFORM ;USE HALF WORD FORM
|
||
HWFORM: BYTE (18) 1,1> ;END IFN FORMSW
|
||
IFN POLISH,< SETZM INIOWD> ;[730] CLEAR IOWD FLAG
|
||
JRST STOW ;STOW CODE AND EXIT
|
||
|
||
|
||
;HERE IF IOWD K,E OR IOWD K,POL SO THAT POLISH OF RH-1 IS NEEDED
|
||
;
|
||
IFN POLISH,< ;[730]
|
||
IOWDRP: MOVEI AC0,1 ;[730]
|
||
MOVE PS,CSTAT+'-' ;[730]
|
||
CALL CFORCP ;[730] GO DO IT
|
||
SKIPE INANGL ;[730]
|
||
MOVE RC,INANGL ;[730]
|
||
CALL MOVSTK ;[730]
|
||
SKIPN INANGL ;[730] IN ANGLE-BRACKETS?
|
||
JRST IOWDR1 ;[730] NO,
|
||
MOVEM RC,INANGL ;[730]
|
||
SKIPA ;[737] CLEAR RC AND RETURN
|
||
IOWDR1: CALL POLSYM ;[730] COMPLETE RH POLISH
|
||
SETZ RC, ;[737] CLEAR RC
|
||
JRST IOWD2 ;[730]
|
||
> ;[730]
|
||
|
||
BYTE0: CALL BYPASS ;[664] GET FIRST NON-BLANK
|
||
IFN POLISH,< SETZM BYTEAC> ;[777] ACCUMULATED BYTE SIZE SO FAR
|
||
CAIE C,10 ;"("?
|
||
JRST ERRAX ;NO, FLAG ERROR AND EXIT
|
||
SETOM BYTESW ;[1114] DOING BYTE PSEUDO-OP
|
||
IFN FORMSW,< PUSH P,[1]
|
||
MOVEI AC0,0>
|
||
PUSH P,RC
|
||
PUSH P,AC0 ;INITIALIZE STACK TO ZERO
|
||
MOVSI ARG,(POINT -1,(P))
|
||
|
||
BYTE1: PUSH P,ARG
|
||
CALL EVAL10 ;EVALUATE RADIX 10
|
||
POP P,ARG
|
||
CAIG AC0,^D36 ;TEST SIZE
|
||
JUMPGE AC0,.+2
|
||
TRO ER,ERRA
|
||
DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE
|
||
IFN POLISH,< ;[1067]
|
||
MOVEM AC0,BYTESZ ;[1067] STORE CURRENT BYTE SIZE
|
||
JRST BYTE2A ;[1067] FIRST TIME THROUGH
|
||
> ;[1067]
|
||
|
||
BYTE2:
|
||
IFN POLISH,<
|
||
MOVE AC0,BYTESZ ;[777] GET CURRENT BYTE SIZE
|
||
BYTE2A: CAIN AC0,^D36 ;[1067] FULL WORD?
|
||
JRST [ HRREI AC1,POLFWF ;[1067] YES, MAKE SURE FWF INCASE POLISH
|
||
MOVEM AC1,POLTYP ;[1067]
|
||
SETZM INBYTE ;[1067] POLISH ALLOWED
|
||
JRST BYTE2B] ;[1067]
|
||
CALL HWCHK ;[1067] NOT FULL WORD, GO CHECK HALF WORD
|
||
SETOM INBYTE ;[1067] NO POLISH
|
||
BYTE2B:> ;[1067]
|
||
IBP ARG ;INCREMENT BYTE
|
||
TRZN ARG,-1 ;OVERFLOW?
|
||
JRST BYTE3 ;NO
|
||
SETZB AC0,RC ;YES
|
||
EXCH AC0,0(P) ;GET CURRENT VALUES
|
||
EXCH RC,-1(P) ;AND STACK ZEROS
|
||
IFN FORMSW,<
|
||
MOVE AC1,HWFORM ;USE STANDARD FORM
|
||
EXCH AC1,-2(P) ;GET FORM WORD
|
||
>
|
||
CALL STOW ;STOW FULL WORD
|
||
|
||
BYTE3: PUSH P,ARG
|
||
CALL EVALEX ;COMPUTE NEXT BYTE
|
||
POP P,ARG
|
||
IFN POLISH,< ;[1067]
|
||
SKIPN INBYTE ;[1067] POLISH ALLOWED?
|
||
JRST BYTE3A ;[1067] YES
|
||
TDNN RC,[-1,,-1] ;[1067][1077] RELOC OR EXTERN?
|
||
JRST BYTE3A ;[1067] NEITHER
|
||
TDNE RC,[-1,,-2] ;[1077] RH RELOCATABLE?
|
||
JRST BYTE3B ;[1077] NO - ERROR FOR ANYTHING ELSE
|
||
MOVE AC1,BYTESZ ;[1077] GET RELOC BYTE SIZE
|
||
CAIG AC1,^D18 ;[1077] MUST BE MORE THAN 18 BITS
|
||
JRST BYTE3B ;[1077] TOO SMALL
|
||
ADD AC1,BYTEAC ;[1077] ADD IN BYTE SIZE SO FAR
|
||
CAIN AC1,^D36 ;[1077] MUST BE RIGHT JUSTIFIED
|
||
TLNE AC0,-1 ;[1077] AND LH MUST BE ZERO
|
||
BYTE3B: CALL QEXT ;[1067][1077] ERROR
|
||
BYTE3A:> ;[1067]
|
||
DPB AC0,ARG ;STORE BYTE
|
||
HLLO AC0,ARG
|
||
DPB RC,AC0 ;STORE RELOCATION
|
||
|
||
IFN FORMSW,<
|
||
MOVEI AC0,1
|
||
HRRI ARG,-2
|
||
DPB AC0,ARG ;STORE FORM BYTE
|
||
HRRI ARG,0
|
||
>
|
||
IFN POLISH,< ;[777]
|
||
MOVE AC1,BYTEAC ;[777] GET ACCUMULATED BYTE SIZE SO FAR
|
||
ADD AC1,BYTESZ ;[777] ADD CURRENT BYTE SIZE
|
||
CAIL AC1,^D36 ;[777] EXCEEDED WORD SIZE?
|
||
SUBI AC1,^D36 ;[777] YES, ADJUST TO BYTE SIZE IN A WORD
|
||
MOVEM AC1,BYTEAC ;[777] USED TO TEST HALFWORD ALIGNMENT
|
||
> ;[777]
|
||
CAIN AC1,^D18 ;[1223] JUST FINISHED A LEFT HALFWORD?
|
||
JRST [CAMN AC1,BYTESZ ;[1223] WITH A FULL HALFWORD BYTE?
|
||
MOVSS EXTPNT ;[1223] YES - CORRECT ANY EXTERNAL POINTERS
|
||
JRST .+1] ;[1223]
|
||
JUMPCM BYTE2
|
||
IFN POLISH,< SETZM INBYTE> ;[761] FLAG NO LONGER IN BYTE
|
||
CAIN C,10 ;"("?
|
||
JRST BYTE1 ;YES, GET NEW BYTE SIZE
|
||
SETZM BYTESW ;[1114] DONE WITH BYTE
|
||
JRST OP3 ;NO, EXIT
|
||
|
||
;HERE TO CHECK IF WE HAVE HALF WORD BYTE AND IF IS HALF WORD ALIGNED
|
||
;SKIP RETURN IF OK, AND NON-SKIP RETURN IF NO POLISH
|
||
|
||
IFN POLISH,<
|
||
HWCHK: CAIE AC0,^D18 ;[777] NOT FULL WORD, BUT HALF WORD?
|
||
RET ;[777] NOT HALF WORD
|
||
SKIPN AC1,BYTEAC ;[777] YES, BUT ALIGNED?
|
||
JRST [ HRREI AC1,POLLHF ;[777] YES, IN LEFT HALF
|
||
JRST HWCHK1] ;[777]
|
||
CAIE AC1,^D18 ;[777]
|
||
RET ;[777] NO, NOT ALIGNED
|
||
HRREI AC1,POLRHF ;[777] YES, IN RIGHT HALF
|
||
HWCHK1: MOVEM AC1,POLTYP ;[777] UPDATE FIXUP TYPE IN CASE POLISH
|
||
SETZM INBYTE ;[777] POLISH ALLOWED
|
||
AOS 0(P) ;[777] SKIP RETURN
|
||
RET ;[777]
|
||
>
|
||
|
||
RADX50: CALL EVALEX ;EVALUATE CODE
|
||
JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE
|
||
JUMPNC ERRAX
|
||
TDZE AC0,[EXP ^-74] ;MAKE SURE ONLY 74 BITS ON
|
||
TRO ER,ERRQ ;NOPE, LIGHT Q ERROR
|
||
PUSH P,AC0 ;SAVE CODE BITS
|
||
CALL GETSYM ;YES, GET SYMBOL
|
||
TRZ ER,ERRA ;CLEAR ERROR
|
||
POP P,ARG ;PUT CODE INTO ARG
|
||
CALL SQOZE ;SQUOZE SIXBIT AND ADD CODE
|
||
IFN FORMSW,< MOVE AC1,HWFORM> ;USE STANDARD FORM
|
||
JRST STOW ;STOW CODE AND EXIT
|
||
|
||
SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1
|
||
MOVEI AC0,0 ;CLEAR RESULT
|
||
SQOZ1: MOVEI AC1,0
|
||
LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1
|
||
LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50
|
||
IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT
|
||
ADD AC0,AC1 ;ADD NEW CHARACTER
|
||
JUMPN AC1+1,SQOZ1 ;TEST FOR END
|
||
LSH ARG,^D30 ;LEFT-JUSTIFY CODE
|
||
IOR AC0,ARG ;MERGE WITH RESULT
|
||
RET
|
||
|
||
%LINK: PUSH P,BLKTYP ;SAVE BLOCK TYPE
|
||
PUSH P,AC0
|
||
JUMP1 LINK1 ;SKIP CODE GEN IF P1
|
||
CALL COUTD
|
||
MOVEI AC0,12 ;LINK TYPE
|
||
MOVEM AC0,BLKTYP
|
||
LINK1: CALL EVALEX ;EVAL CHECK EXT
|
||
POP P,AC1 ;GET BITS BACK
|
||
JUMPN RC,LNKERR ;MUST BE ABS
|
||
JUMPNC LNKERR ;GRNTEE COMMA
|
||
TLNE AC1,400000 ;LNKEND?
|
||
MOVN AC0,AC0 ;YES, NEGATE RESULT
|
||
JUMP1 LINK2 ;SKIP IF P1
|
||
CALL COUT
|
||
LINK2: CALL EVALXQ ;NO EXTERNALS
|
||
JUMP1 [TRC IO,<UNDF!ERRV> ;[1172] CHECK FOR UNDEFINED STORE
|
||
TRCN IO,<UNDF!ERRV> ;[1172] ADDRESS AND V ERROR
|
||
TRZ IO,ERRV ;[1172] OK, DURING PASS 1
|
||
JRST .+1] ;[1172] CONTINUE
|
||
JUMPNC LINK2A ;THIRD ARGUMENT SPECIFIED?
|
||
HRL AC0,RC ;YES, MUST FIRST SAVE THE
|
||
PUSH P,AC0 ;OLD VALUES OF RC, AC0
|
||
CALL EVALXQ ;READ IN THIRD ARGUMENT
|
||
MOVS AC0,AC0 ;LINK EXPECTS LNKNXT IN THE
|
||
MOVS RC,RC ;LEFT HELF OF SECOND WORD
|
||
HRR AC0,(P) ;RESTORE LNKLOC VALUE
|
||
HLR RC,(P) ;AND ITS RELOCATION BIT
|
||
TLNE RC,1 ;LNKXNT RELOCATABLE?
|
||
TRO RC,2 ;YES, SET FOR COUT TO DEPOSIT
|
||
SUB P,[1,,1] ;"POP" BOGUS WORD OF STACK
|
||
LINK2A: JUMP1 LINK3
|
||
CALL COUT ;DUMP LOC
|
||
CALL COUTD ;FINISH BLOCK
|
||
LINK3: POP P,BLKTYP ;RESTORE BLKTYP
|
||
RET
|
||
|
||
LNKERR: POP P,BLKTYP ;RESTORE BLOCK TYPE
|
||
PJRST ERRAX ;GIVE ERROR RETURN
|
||
|
||
%INTEG: TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL GETSYM ;GET A SYMBOL
|
||
JRST INTG2 ;BAD SYMBOL ERROR
|
||
TLO IO,DEFCRS ;THIS IS A DEFINTION
|
||
CALL SSRCH ;SEE IF THERE
|
||
MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT
|
||
TLNN ARG,UNDF ;IF ALREADY DEFINED
|
||
JRST INTG1 ;JUST IGNORE
|
||
TLOA ARG,VARF ;SET VARIABLE FLAG
|
||
INTG2: TROA ER,ERRA ;SYMBOL ERROR
|
||
CALL INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1)
|
||
INTG1: JUMPCM %INTEG
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
RET
|
||
|
||
%ARAY: MOVEM P,ARAYP ;SAVE PUSHDOW POINTER
|
||
ARAY2: CALL GETSYM
|
||
JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT
|
||
PUSH P,AC0 ;SAVE NAME
|
||
JUMPCM ARAY2 ;AND GO ON IF A COMMA
|
||
CAIE C,"["-40 ;MUST BE A [
|
||
JRST ARAY1
|
||
CALL BYPASS ;[664] OH, WELL
|
||
TLO IO,IORPTC
|
||
CALL EVALXQ ;GET A SIZE
|
||
CAIE C,"]"-40 ;MUST END RIGHT
|
||
JRST ARAY1
|
||
CALL BYPASS ;[664] ??
|
||
HRRZ V,AC0 ;GET VALUE
|
||
SUBI V,1
|
||
NXTVAL: POP P,AC0
|
||
PUSH P,V ;SAVE OVER SEARCH
|
||
TLO IO,DEFCRS
|
||
TRO FRR,NOUNVS ;[1022][713] DON'T SEARCH UNIVERSALS
|
||
CALL SSRCH ;FIND IT
|
||
MOVSI ARG,SYMF!UNDF
|
||
TRZ FRR,NOUNVS ;[1022][713] SEARCH UNIVERSALS AGAIN
|
||
POP P,V ;GET VALUE BACK
|
||
TLNE ARG,EXTF ;[674] E-ERROR IF EXTERNAL
|
||
TRO ER,ERRE ;[674]
|
||
TLNN ARG,UNDF
|
||
JRST ARAY3
|
||
TLO ARG,VARF
|
||
MOVEI RC,0 ;NO RELOC
|
||
CALL INSERT
|
||
ARAY3: CAME P,ARAYP
|
||
JRST NXTVAL ;STILL NAMES STACKED
|
||
JUMPCM ARAY2
|
||
RET
|
||
|
||
ARAY1: TRO ER,ERRA ;ERROR EXIT
|
||
MOVE P,ARAYP
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
RET ;RESET PDL AND GO
|
||
|
||
; .COMMON SYMBOL [SIZE]
|
||
SYN ARAYP,COMMP ;SAVE SPACE
|
||
|
||
COMM0: JUMP1 COMM1 ;WASTE OF TIME ON PASS1
|
||
CALL COUTD ;DUMP CURRENT BLOCK
|
||
PUSH P,BLKTYP ;SAVE TYPE
|
||
MOVEI AC0,20 ;COMMON BLOCK TYPE
|
||
MOVEM AC0,BLKTYP ;SET NEW
|
||
COMM1: MOVEM P,COMMP ;SAVE PUSHDOWN POINTER
|
||
COMM2: CALL GETSYM ;GET A 6-BIT SYMBOL NAME
|
||
JRST COMM7 ;BAD SYMBOL, GIVE UP
|
||
PUSH P,AC0 ;SAVE SYMBOL NAME
|
||
JUMPCM COMM2 ;AND GET ANOTHER IF COMMA
|
||
CAIE C,'[' ;MUST BE A [
|
||
JRST COMM7 ;YOU LOSE
|
||
CALL BYPASS ;[664] SKIP ANY LEADING SPACES
|
||
TLO IO,IORPTC ;BUT NOT LAST CHAR
|
||
CALL EVALXQ ;GET SIZE OF COMMON
|
||
CAIE C,']' ;MUST END RIGHT
|
||
JRST COMM7
|
||
HRRZ V,AC0 ;GET VALUE
|
||
;PUSHDOWN STACK IS IN WRONG ORDER, REVERSE IT
|
||
HRRZ RC,P ;TOP ITEM
|
||
HRRZ ARG,COMMP ;BOTTOM ITEM
|
||
ADDI ARG,1 ;WELL ALMOST
|
||
COMM6: CAIG RC,(ARG) ;ANYTHING TO MOVE?
|
||
JRST COMM3 ;NO
|
||
MOVE 0,(RC) ;MOVE TOP
|
||
EXCH 0,(ARG) ;TO BOTTOM
|
||
MOVEM 0,(RC)
|
||
SUBI RC,1 ;DECREMENT
|
||
AOJA ARG,COMM6 ;AND TRY AGAIN
|
||
|
||
COMM3: MOVE AC0,0(P) ;GET SYMBOL
|
||
JUMP2 COMM3B ;DIFF CHECKS FOR EACH PASS
|
||
CALL SEARCH ;PERFORM GENERAL SEARCH
|
||
JRST COMM3A ;NOT FOUND, GOOD
|
||
JUMPL ARG,CMNERR ;FOUND, OPERAND, WARN
|
||
CAME AC0,-3(SX) ;MACRO, LOOK ONE SLOT BELOW
|
||
JRST COMM3A ;NOT FOUND, CONTINUE
|
||
JRST CMNERR ;WARNING
|
||
|
||
COMM3B: SKIPE BNSN ;CODE STORED?
|
||
JRST CMNERR ;YES, WARN USER
|
||
COMM3A: POP P,AC0 ;GET SYMBOL
|
||
JUMP1 .+2 ;IGNORE V ON PASS 1
|
||
PUSH P,V ;SAVE VALUE
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL EXTER1 ;DEFINE AS EXTERNAL(CLEAR NOUNVS)
|
||
;NOTE, CS IS NOT ON A COMMA, SO WILL RETURN
|
||
JUMP1 COMM4 ;ALL DONE IF PASS1
|
||
SETZ RC, ;NO RELOCATION
|
||
MOVEI ARG,4 ;FORM RADIX50 04,SYMBOL
|
||
CALL SQOZE ;IN AC0
|
||
CALL COUT ;OUTPUT SYMBOL
|
||
POP P,V ;GET VALUE BACK
|
||
MOVE AC0,V ;AND INTO AC0
|
||
CALL COUT ;SECOND PART OF PAIR
|
||
COMM4: CAME P,COMMP ;FINISHED WITH STACKED SYMBOLS
|
||
JRST COMM3 ;NO MORE TO GO
|
||
CALL BYPASS ;[664] GET NEXT DELIMITER
|
||
JUMPCM COMM2 ;MORE TO GO IF COMMA NEXT
|
||
COMM5: JUMP1 CPOPJ
|
||
CALL COUTD ;DUMP THIS BLOCK
|
||
POP P,BLKTYP ;RESTORE LAST
|
||
RET
|
||
|
||
COMM7: TRO ER,ERRA ;FLAG ERROR
|
||
MOVE P,COMMP ;RESET PUSHDOWN POINTER
|
||
JRST COMM5 ;RESTORE BLKTYP AND EXIT
|
||
|
||
CMNERR: PUSH P,['MCRSOC'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / STATEMENT OUT OF ORDER .COMMON@/] ;[1066] SYMBOL IN AC0
|
||
CALL EWARN ;[1066] WARNING
|
||
CALL TYPMSG
|
||
AOS QERRS ;COUNT AS WARNING
|
||
JRST COMM3A ;CONTINUE
|
||
|
||
; .REQUEST DEV:FILENAME[PPN]
|
||
REQUIR: SKIPA CS,[16] ;BLOCK TYPE 16
|
||
REQUES: MOVEI CS,17 ;BLOCK TYPE 17
|
||
JUMP1 REMAR0 ;IGNORE ON PASS 1
|
||
CALL COUTD ;DUMP CURRENT
|
||
PUSH P,BLKTYP ;SAVE LAST BLOCK TYPE
|
||
MOVEM CS,BLKTYP ;SET NEW
|
||
REQU0:
|
||
REPEAT 3,<PUSH P,[0]> ;STACK A NULL SPEC IN CASE OF ERROR
|
||
CALL BYPASS ;[664] FLUSH EXTRA TABS AND SPACES
|
||
TLO IO,IORPTC ;BACK OFF BECAUSE SCHGET
|
||
CALL SCHGET ;GET PART OF A FILE SPEC
|
||
JUMPE AC0,REQUER ;ERROR IF NOTHING
|
||
CAIE C,':' ;WAS THERE A DEVICE
|
||
JRST REQU1 ;NO, GOOD GUESS
|
||
MOVEM AC0,-2(P) ;SAVE DEVICE
|
||
CALL SCHGET ;GET THE FILE NAME
|
||
JUMPE AC0,REQUER ;ERROR IF NOTHING
|
||
REQU1: MOVEM AC0,(P) ;STORE FILE NAME
|
||
CAIN C,'.' ;SEE IF AN EXTENSION GIVEN
|
||
JRST REQU4 ;YES, GO SKIP IT AND MAKE SURE IT'S
|
||
REQU3: ;A .REL FILE, CAUSE THAT'S ALL IT CAN BE
|
||
CAIE C,'[' ;WAS THERE A PPN
|
||
JRST REQU2 ;NO, AS EXPECTED
|
||
CALL BYPASS ;[664] SKIP ANY BLANKS
|
||
TLO IO,IORPTC
|
||
CALL EVALXQ ;GET HALF A PPN
|
||
HRLM AC0,-1(P) ;STORE IT
|
||
CALL EVALXQ ;GET OTHER HALF
|
||
HRRM AC0,-1(P) ;STORE IT
|
||
CAIE C,']' ;MUST END ON ]
|
||
JRST REQUER ;IT DIDN'T
|
||
CALL BYPASS ;[664] SCAN AFTER RIGHT BRACKET
|
||
REQU2: SETZ RC, ;NO RELOCATION
|
||
POP P,AC0 ;GET FILE NAME
|
||
CALL COUT
|
||
POP P,AC0 ;AND PPN
|
||
CALL COUT
|
||
POP P,AC0 ;FINALLY DEVICE
|
||
CALL COUT
|
||
JUMPCM REQU0 ;MORE TO COME
|
||
CALL COUTD ;DUMP BLOCK
|
||
POP P,BLKTYP ;RESTORE BLOCK TYPE
|
||
RET ;NO
|
||
|
||
REQU4: CALL SCHGET ;GO SCAN OUT EXTENSION
|
||
HLRZ AC0,AC0 ;SWAP FOR CAIE
|
||
CAIE AC0,'REL' ;SEE IF IT'S FOR .REL
|
||
TRO ER,ERRQ ;NOPE, TELL HIM ABOUT IT
|
||
JRST REQU3 ;BACK TO LOOK FOR PPN
|
||
|
||
REQUER: SUB P,[3,,3] ;REMOVE THE THREE ITEMS
|
||
POP P,BLKTYP ;RESTORE BLOCK TYPE
|
||
JRST ERRAX ;AND GIVE UP
|
||
|
||
; NEW .DIRECTIVE PSEUDO-OP
|
||
; ARGS ARE FUNCTIONS TO BE DONE
|
||
%DIREC: MOVEI AC2,0 ;INIT FLAG TO 'YES'
|
||
DIREC1: CALL GETSYM ;GET THE SYMBOL
|
||
JRST ERRAX ;MISSING, GIVE ERROR
|
||
CAMN AC0,[SIXBIT /NO/] ;'NO ...' ?
|
||
JRST [ SKIPE AC2 ;[720] FLAG NO NO ...WITH Q-ERROR
|
||
TROA ER,ERRQ ;[720]
|
||
SETO AC2, ;REVERSE FLAG
|
||
JRST DIREC1] ;TRY AGAIN FOR FUNCTION
|
||
MOVSI ARG,-DIRLEN ;AOBJN WORD
|
||
CAMN AC0,DIRARG(ARG) ;LOOK FOR MATCH
|
||
JRST DIRFND ;GOT IT
|
||
AOBJN ARG,.-2 ;LOOP FOR ALL OF TABLE
|
||
JRST ERRAX ;NOT FOUND, GIVE ERROR
|
||
|
||
DIRFND: XCT DIRXCT(ARG) ;DO FUNCTION
|
||
JUMPCM %DIREC ;MORE IF COMMA
|
||
RET ;OTHERWISE RETURN
|
||
|
||
;[1125] DEFINITION OF THE .DIRECTIVE PSEUDO-OP
|
||
;[1125] ARGS: SIXBIT NAME OF ARGUMENT
|
||
;[1125] INSTRUCTION TO EXECUTE WHEN THAT DIRECTIVE IS SPECIFIED
|
||
DEFINE DIRMAK,< ;;[1125]
|
||
X (.NOBIN,<CALL SETNOB>) ;;[1125] DON'T GENERATE REL FILE
|
||
X (.ITABM,<SETCAM AC2,ITABM>) ;;[1125] INCLUDE TAB/SPACE IN MACRO ARGS
|
||
X (.XTABM,<MOVEM AC2,ITABM>) ;;[1125] EXCLUDE TAB/SPACE IN MACRO ARGS
|
||
X (SFCOND,<SETCAM AC2,IFXLSW>) ;;[1125] XLIST IN IF (FALSE)
|
||
X (LITLST,<SETCAM AC2,LITLST>) ;;[1125] LIST BINARY IN LITERALS
|
||
X (FLBLST,<CALL SETFLB>) ;;[1125] FIRST LINE BINARY LISTING ONLY
|
||
X (MACPRF,<SETCAM AC2,MACPRF>) ;;[1125] MACRO DEF PREFERED OVER SYMBOL
|
||
X (MACMPD,<CALL SETMPD>) ;;[1125] NEW MACRO ARG HANDLING
|
||
X (KA10,<CALL SETKA>) ;;[1125] PUT KA10 TYPE IN HEADER BLOCK
|
||
X (KI10,<CALL SETKI>) ;;[1125] PUT KI10 TYPE IN HEADER BLOCK
|
||
X (KL10,<CALL SETKL>) ;;[1125] PUT KL10 TYPE IN HEADER BLOCK
|
||
X (KS10,<CALL SETKS>) ;;[1173] PUT KS10 TYPE IN HEADER BLOCK
|
||
X (.OKOVL,<SETCAM AC2,OKOVFL>) ;;[1125] ALLOW /,* OVERFLOW
|
||
X (.EROVL,<MOVEM AC2,OKOVFL>) ;;[1125] DON'T ALLOW /,* OVERFLOW
|
||
X (.NOCAL,<SETOM NOUUO>) ;;[1125][1043][1041] DON'T SEARCH UUO TABLES
|
||
IFN TSTCD,< ;;[1125]
|
||
X (.TCDON,<CALL TCDSET>) ;;[1125][575] SET LINK DEBUGGING FLAG
|
||
X (.TCDOF,<MOVEM AC2,TCDFLG>) ;;[1125] TURN LINK DEBUGGING OFF
|
||
> ;END OF IFN TSTCD ;;[1125]
|
||
> ;END OF DIRMAK ;;[1125]
|
||
|
||
DEFINE X(A,B),< ;;[1125]
|
||
SIXBIT \A\> ;;[1125]
|
||
|
||
;[1125] GENERATE THE .DIRECTIVE ARGUMENT NAME TABLE
|
||
DIRARG: DIRMAK ;[1125]
|
||
DIRLEN==.-DIRARG ;[1125]
|
||
|
||
DEFINE X(A,B),< ;;[1125]
|
||
B> ;;[1125]
|
||
|
||
;[1125] GENERATE THE .DIRECTIVE INSTRUCTION TABLE (FOR XCT)
|
||
DIRXCT: DIRMAK ;[1125]
|
||
|
||
SETKS: MOVSI ARG,(10B5) ;[1173] SET BIT 2 FOR KS10
|
||
JRST SETKL+1 ;[1173] JOIN COMMON CODE
|
||
SETKA: SKIPA ARG,[1B5]
|
||
SETKI: MOVSI ARG,(2B5)
|
||
SKIPA ;SET FOR KI OR KA
|
||
SETKL: MOVSI ARG,(4B5) ;KA=1 KI=2 KL=4
|
||
IORM ARG,CPUTYP ;MAKE INCLUSIVE WITH WHAT IS THERE
|
||
RET ;THEN RETURN
|
||
|
||
;SET FLBLST SWITCH. WHEN ON, IT CAUSES ONLY ONE LINE OF BINARY TO BE
|
||
;LISTED FOR MULTI-WORD STATEMENTS, E.G. ASCIZ.
|
||
SETFLB: MOVSI AC1,(FLBLST)
|
||
ANDCAM AC1,BLSW
|
||
SKIPN AC2 ;USER WANTS IT?
|
||
IORM AC1,BLSW ;YES, SET FLAG
|
||
RET
|
||
|
||
;[1125] SET NO BINARY SWITCH - GENERATES NO REL FILE
|
||
SETNOB: JUMPE AC2,%NOBIN ;[1125] 'NO' GIVEN?
|
||
TRO ER,ERRQ ;[1125] YES, ILLEGAL
|
||
RET ;[1125]
|
||
|
||
;[1125] SET MACRO ARG HANDLING SWITCH - MATCH PAIRED DELIMITERS
|
||
SETMPD: MOVEM AC2,MACTAB ;[1125] SET MACRO ARG DELIMITER FLAG
|
||
MOVEM AC2,ITABM ;[1125] IMPLIES ITABM ALSO
|
||
RET ;[1125]
|
||
|
||
IFN TSTCD,<
|
||
TCDSET: SETCAM AC2,TCDFLG ;SET FLAG ON
|
||
JRST COUTD ;[664] BIND OFF LAST BLOCK, EXIT
|
||
>
|
||
|
||
; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY
|
||
|
||
; HERE IF PRGEND (PASS 1)
|
||
PSEND0: IFN FTPSECT,< ;[1136]
|
||
SKIPE SGLITL ;[1136] INSIDE A LITERAL OF ANY PSECT?
|
||
RET ;[1136] YES - JUST RETURN
|
||
> ;[1136]
|
||
TLO IO,MFLSW ;[1131] PSEND SEEN
|
||
SETOM PGENDF ;[1141] INDICATE PRGEND SEEN
|
||
CALL END0 ;AS IF END STATEMENT
|
||
HLLZS IO ;CLEAR ER(RH)
|
||
SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.
|
||
SETZM QERRS ;...
|
||
JUMP2 PSEND2 ;DIFFERENT ON PASS2
|
||
SKIPE UNIVSN ;SEEN A UNIVERSAL
|
||
CALL UNISYM ;YES, STORE SYMBOLS
|
||
CALL PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE
|
||
MOVE AC0,[ASCII /.MAIN/] ;GET DEFAULT TITLE
|
||
MOVEM AC0,TBUF ;AND MAKE IT CURRENT TITLE
|
||
SETZM TBUF+1 ;[1140] CLEAR 2ND WORD FOR ASCIZ TITLE
|
||
SETZM TTLFND ;[1123] MAKE SURE TITLE FLAG IS CLEARED
|
||
SETZM RELLOC ;CLEAR TO PREVENT EFFECTS ACROSS PRGEND
|
||
SETZM RELLOC+1 ;[573]
|
||
PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE
|
||
SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE
|
||
MOVE AC0,[UNISCH,,UNISCH+1]
|
||
BLT AC0,UNISCH+.UNIV-1
|
||
TLO IO,IOPAGE ;SIGNAL NEW PAGE BUT DON'T CHANGE NUMBER
|
||
MOVSI AC0,1 ;SET SO RELOC 0 WORKS
|
||
HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION
|
||
HRRZM AC0,LOCO ;AND OUTPUT LOCATION
|
||
HLRZM AC0,MODA ;SET MODE
|
||
HLRZM AC0,MODO
|
||
RET
|
||
|
||
; HERE IF PRGEND (PASS 2)
|
||
PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG
|
||
SETZM UNIVSN ;IN CASE IN UNIVERSAL
|
||
TLZ FR,R1BSW!RIMSW!RIM1SW
|
||
CALL PSEND5 ;PUT TITLE BACK
|
||
CALL PSEND1 ;COMMON CODE
|
||
JRST PASS20 ;OUTPUT THE ENTRIES
|
||
|
||
; HERE IF END (PASS 1)
|
||
PSEND3: CALL PSEND4 ;SAVE LAST PROGRAM
|
||
HLRS PRGPTR ;REINITIALIZE POINTER
|
||
PJRST PSEND5 ;READ BACK FIRST PROGRAM
|
||
|
||
;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS
|
||
XTRA==^D11 ;[1231] NUMBER OF OTHER LOCATIONS TO SAVE
|
||
|
||
PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION
|
||
ADDI V,LENGTH+.TBUF/5+XTRA
|
||
IFN FTPSECT,< ;[575]
|
||
ADDI V,1 ;[1052] ALLOW FOR PSECT COUNT
|
||
SKIPN SGNMAX ;[1052] IF COUNT IS 0, WILL LOOP ONCE
|
||
JRST [ADDI V,5 ;[1131][1052] SO ALLOW FOR IT
|
||
JRST PSEND7] ;[1052]
|
||
ADD V,SGNMAX ;[1131] SAVE 5 PSECT TABLES
|
||
ADD V,SGNMAX
|
||
ADD V,SGNMAX
|
||
ADD V,SGNMAX
|
||
ADD V,SGNMAX
|
||
ADD V,SGNMAX ;[1235] SAVE A SIXTH PSECT TABLE
|
||
PSEND7: ;[1052]
|
||
>
|
||
CAML V,SYMBOL ;WILL WORST CASE FIT?
|
||
CALL XCEED ;NO, EXPAND
|
||
MOVS V,FREE
|
||
HRR V,PRGPTR ;LAST PRGEND BLOCK
|
||
HLRM V,(V) ;LINK THIS BLOCK
|
||
SKIPN PRGPTR ;IF FIRST TIME
|
||
HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN
|
||
HLRM V,PRGPTR ;POINTER TO IT
|
||
SETZM @FREE ;CLEAR LINK WORD
|
||
AOS FREE ;THIS LOCATION USED NOW
|
||
MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE
|
||
HRR AC0,FREE ;FREE SPACE
|
||
MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS
|
||
ASH V,1 ;TWO WORDS PER SYMBOL
|
||
ADDI V,1 ;ONE MORE FOR COUNT
|
||
ADDB V,FREE ;END OF TABLE WHEN MOVED
|
||
BLT AC0,(V) ;MOVE TABLE
|
||
HRRZ AC0,.JBREL ;TOP OF CORE
|
||
SUBI AC0,1
|
||
MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE
|
||
SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS
|
||
MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS
|
||
HRLI AC0,SYMNUM ;BLT POINTER
|
||
BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE
|
||
CALL SRCHI ;SET UP SEARCH POINTER
|
||
MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE
|
||
SUB AC0,TCNT ;ACTUAL NUMBER
|
||
IDIVI AC0,5 ;NUMBER OF WORDS
|
||
SKIPE AC1 ;REMAINDER?
|
||
ADDI AC0,1 ;YES
|
||
MOVEM AC0,@FREE ;STORE COUNT
|
||
AOS FREE ;THIS LOCATION USED NOW
|
||
EXCH AC0,FREE ;SET UP AC0 FOR BLT
|
||
ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES
|
||
HRLI AC0,TBUF ;BLT POINTER
|
||
BLT AC0,@FREE ;MOVE TITLE
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC2,SGNMAX ;PSECT COUNT
|
||
MOVE AC0,AC2
|
||
CALL STORIT ;SAVE PSECT COUNT
|
||
PSEND8: MOVE AC0,SGNAME(AC2) ;[1052] START OF STORE LOOP
|
||
CALL STORIT ;SAVE PSECT NAME
|
||
MOVE AC0,SGRELC(AC2)
|
||
CALL STORIT ;SAVE MODE AND PC
|
||
MOVE AC0,SGSCNT(AC2)
|
||
CALL STORIT ;SAVE SYM CNT
|
||
MOVE AC0,SGATTR(AC2)
|
||
CALL STORIT ;SAVE BREAK AND ATTRS
|
||
MOVE AC0,SGORIG(AC2) ;[1131] SAVE LIT PTR,,ORIGIN
|
||
CALL STORIT ;[1131]
|
||
HRRZS SGORIG(AC2) ;[1131] CLEAR LIT PTR. FOR NEXT PROG
|
||
MOVE AC0,SGFWOR(AC2) ;[1235] GET PSECT FULLWORD START ADDR.
|
||
CALL STORIT ;[1235] SAVE IT
|
||
SOJGE AC2,PSEND8 ;[1052]
|
||
SETZM SGNMAX ;ZERO PSECT CNT
|
||
SETZM SGNCUR ;[1136] ZERO CURRENT PSECT
|
||
SETZM SGDMAX ;[1136] ZERO PSECT NESTING COUNT
|
||
MOVE AC0,[SIXBIT/.LOW./] ;[1165] GET BLANK PSECT NAME
|
||
MOVEM AC0,SGNAME ;[1165] RESET SGNAME
|
||
MOVEM AC0,SGLIST ;[1165] AND SGLIST
|
||
MOVSI AC0,1 ;SET RELOCATION
|
||
MOVEM AC0,SGRELC ;TO RELATIVE ZERO
|
||
SETZM SGATTR ;[1131] CLEAR PSECT BREAK
|
||
MOVE AC0,@SYMBOL ;GET SYM CNT
|
||
MOVEM AC0,SGSCNT ;SAVE PSECT SYM CNT
|
||
CALL SRCHI ;SET UP SEARCH POINTER
|
||
>
|
||
MOVE AC0,LITHD ;LENGTH ,, START
|
||
CALL STORIT
|
||
MOVE AC2,LITHDX ;POINTER TO LIT INFO.
|
||
MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO
|
||
CALL STORIT ;SAVE IT IN SYMBOL TABLE
|
||
MOVE AC0,-2(AC2) ;[1166] STORE OUTPUT LOCATION AND
|
||
CALL STORIT ;[1166] RELOCATION ALSO
|
||
MOVE AC2,VARHDX ;SAME FOR VARS
|
||
MOVE AC0,-1(AC2)
|
||
CALL STORIT
|
||
MOVE AC0,(AC2)
|
||
CALL STORIT
|
||
SETZM (AC2) ;CLEAR NUMBER OF VARIABLES SEEN
|
||
MOVE AC0,CPUTYP ;[1144] CPU TYPE BITS
|
||
CALL STORIT ;[1144] SAVE
|
||
SETZM CPUTYP ;[1144] CLEAR
|
||
MOVE AC0,R1TIME ;[1231] PASS1 RUNTIME
|
||
CALL STORIT ;[1231] SAVE
|
||
MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG
|
||
HRR AC0,HIGH1 ;AND PASS1 BREAK
|
||
CALL STORIT
|
||
SETZM HISNSW ;CLEAR HISEG FLAG FOR NEXT PROGRAM
|
||
SETZM HIGH ;[1131] CLEAR LOW SEG BREAK
|
||
JUMPGE AC0,PSEND6 ;NOT TWOSEG
|
||
MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET
|
||
CALL STORIT ;SAVE IT ALSO
|
||
PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION
|
||
SUBI AC0,1 ;LAST ONE USED
|
||
HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK
|
||
HRLM AC0,(V) ;LINK TO END OF BLOCK
|
||
RET ;RETURN
|
||
|
||
PSENDX: CALL XCEED ;NEED TO EXPAND CORE FIRST
|
||
PSEND5: HRRZ V,.JBREL ;GET TOP OF CORE
|
||
SETZM (V) ;CLEAR OR GET ILL MEM REF
|
||
MOVEI AC0,-1(V)
|
||
MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE
|
||
HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK
|
||
JUMPE V,PSNDER ;ERROR LINK NOT SET UP
|
||
MOVE AC1,(V) ;NEXT LINK
|
||
MOVE V,1(V) ;GET ITS SYMBOL COUNT
|
||
ASH V,1 ;NUMBER OF WORDS
|
||
ADDI V,1 ;PLUS ONE FOR COUNT
|
||
SUBI AC0,(V) ;START OF NEW SYMBOL TABLE
|
||
CAMG AC0,FREE ;WILL IT FIT
|
||
JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0
|
||
ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE
|
||
MOVEI V,1(V) ;THEN TO BEG OF TITLE
|
||
MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE
|
||
HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK
|
||
ADD AC0,[1,,0] ;MAKE BLT POINTER
|
||
HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK
|
||
BLT AC0,@SYMTOP ;MOVE TABLE
|
||
CALL SRCHI ;SET UP POINTER
|
||
MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE
|
||
MOVEI AC0,1(V) ;START OF STORED TITLE
|
||
ADD V,AC1 ;INCREMENT PAST TITLE
|
||
ADDI AC1,TBUF-1 ;END OF TITLE
|
||
HRLI AC0,TBUF ;WHERE TO PUT IT
|
||
MOVSS AC0 ;BLT POINTER
|
||
BLT AC0,(AC1) ;MOVE TITLE
|
||
SETZM TTLFND ;[1123] INDICATE TITLE NOT YET SEEN
|
||
IFN FTPSECT,< ;[575]
|
||
CALL GETIT ;GET PSECT COUNT
|
||
MOVE AC2,AC0
|
||
MOVEM AC2,SGNMAX
|
||
PSEND9: CALL GETIT ;[1052] GET PSECT NAME
|
||
MOVEM AC0,SGNAME(AC2)
|
||
CALL GETIT ;GET MODE AND PC
|
||
MOVEM AC0,SGRELC(AC2)
|
||
CALL GETIT ;GET SYM CNT
|
||
MOVEM AC0,SGSCNT(AC2)
|
||
CALL GETIT ;GET BREAK AND ATTRS
|
||
MOVEM AC0,SGATTR(AC2)
|
||
CALL GETIT ;[1131] GET LIT PTR,,ORIGIN
|
||
MOVEM AC0,SGORIG(AC2) ;[1131]
|
||
CALL GETIT ;[1235] GET THE FULLWORD START ADDR.
|
||
MOVEM AC0,SGFWOR(AC2) ;[1235] RESTORE IT
|
||
SOJGE AC2,PSEND9 ;[1052]
|
||
SETZM SGNCUR ;SET TO BLANK PSECT
|
||
CALL SRCHI ;SET UP POINTER
|
||
>
|
||
CALL GETIT
|
||
MOVEM AC0,LITHD
|
||
MOVE AC2,LITHDX ;INVERSE OF ABOVE
|
||
CALL GETIT
|
||
MOVEM AC0,-1(AC2)
|
||
CALL GETIT ;[1166] GET OUTPUT LOCATION
|
||
MOVEM AC0,-2(AC2) ;[1166] AND RELOCATION
|
||
MOVE AC2,VARHDX ;SAME FOR VARS
|
||
CALL GETIT
|
||
MOVEM AC0,-1(AC2)
|
||
CALL GETIT
|
||
MOVEM AC0,(AC2) ;RESTORE COUNT OF VARS
|
||
CALL GETIT ;[1144] CPU TYPE BITS
|
||
MOVEM AC0,CPUTYP ;[1144]
|
||
CALL GETIT ;[1231] PASS1 RUNTIME
|
||
MOVEM AC0,R1TIME ;[1231]
|
||
CALL GETIT ;GET TWO HALF WORDS
|
||
HRRZM AC0,HIGH1 ;PASS1 BREAK
|
||
HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG
|
||
JUMPGE AC0,CPOPJ ;NOT TWOSEG
|
||
CALL GETIT
|
||
MOVEM AC0,SVTYP3 ;BLOCK 3 WORD
|
||
RET
|
||
|
||
STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK
|
||
AOS FREE ;ADVANCE POINTER
|
||
RET
|
||
|
||
GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK
|
||
AOJA V,CPOPJ ;INCREMENT AND RETURN
|
||
|
||
PSNDER: PUSH P,['MCRPGE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / PRGEND ERROR@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS
|
||
UNIV0: JUMP2 UNIV2 ;DO PROPER PASS2 STUFF
|
||
BITON UBAS+UMACV,UWVER ;WRITING UNV, INCLUDE UBAS AND VERSION
|
||
HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN
|
||
CAIL SX,.UNIV ;ALLOW ONE MORE?
|
||
JRST UNVERR ;NO, GIVE FATAL ERROR
|
||
SETOM UNIVSN ;AND SET SEEN A UNIVERSAL
|
||
JRST TITLE0 ;CONTINUE AS IF TITLE
|
||
|
||
UNIV2: HLLOS UNIVSN ;ENSURE SET UP FOR UNIVERSAL
|
||
JRST TITLE0 ;[1123] AND CONTINUE AS IF TITLE
|
||
|
||
ADDUNV: PUSH P,RC ;AN AC TO USE
|
||
CALL NOUT ;CONVERT TO SIXBIT
|
||
HRRZ RC,UNIVNO ;GET ENTRY INDEX
|
||
MOVEM AC0,UNITBL+1(RC) ;STORE SIXBIT NAME IN TABLE
|
||
MOVEM AC0,UNVDIR ;AND FOR ENTER LATER
|
||
HRRZS UNIVSN ;ONLY DO IT ONCE
|
||
POP P,RC ;RESTORE RC
|
||
RET ;AND RETURN
|
||
|
||
UNVERR: PUSH P,['MCRTMU'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / TOO MANY UNIVERSALS@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
UNISYM: CALL SUPRSA ;TURN ON SUPPRESS BIT
|
||
SKIPE UNVSKP ;[700] IF /U, SET FLAG FOR
|
||
JRST [SETOM MRUNV ;[700] LATER ASSEMBLIES
|
||
JRST .+2] ;[700] AND SKIP .UNV FILE
|
||
CALL UNVOUT ;OUTPUT SYMBOL TABLE
|
||
TLNN IO,MFLSW ;ALSO IN PRGEND?
|
||
JRST UNISYN ;NO
|
||
MOVE AC0,@SYMBOL ;GET NO. OF SYMBOLS
|
||
LSH AC0,1 ;2 WORDS EACH
|
||
ADDI AC0,1 ;PLUS COUNT
|
||
ADD AC0,FREE ;HOW MUCH WE WILL NEED
|
||
CAML AC0,SYMBOL ;WILL IT FIT IN WHAT WE HAVE
|
||
UNISYK: CALL XCEED ;NO, EXPAND
|
||
CAML AC0,SYMBOL ;ENOUGH?
|
||
JRST UNISYK ;NO, EXPAND
|
||
UNISYN: PUSH P,SYMBOL ;NEED TO SAVE IN CASE PRGEND
|
||
MOVE AC0,SYMTOP ;TOP OF TABLE
|
||
SUB AC0,SYMBOL ;GET LENGTH OF TABLE
|
||
HRL ARG,SYMBOL ;BOTTOM OF TABLE
|
||
HRR ARG,FREE ;WHERE TO GO
|
||
HRRZ RC,UNIVNO ;GET TABLE INDEX
|
||
HRRM ARG,SYMBOL ;WILL BE THERE SOON
|
||
HRRZM ARG,UNIPTR+1(RC) ;STORE IN CORRESPONDING PLACE
|
||
ADDB AC0,FREE ;WHERE TO END
|
||
HRLM AC0,UNIPTR+1(RC) ;SAVE NEW SYMTOP
|
||
BLT ARG,@FREE ;MOVE TABLE
|
||
HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1
|
||
CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND
|
||
MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW
|
||
MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER
|
||
CALL SRCHI ;GET SEARCH POINTER
|
||
EXCH AC0,SRCHX
|
||
MOVEM AC0,UNISHX+1(RC) ;SAVE IT
|
||
POP P,SYMBOL ;RESTORE OLD VALUE
|
||
SETZM UNIVSN ;CLEAR FLAG IN CASE PRGEND
|
||
AOS UNIVNO ;SIGNAL ANOTHER UNIVERSAL SAVED
|
||
RET ;RETURN
|
||
|
||
SERCH0: CALL BYPASS ;[664][572] SKIP LEADING BLANKS
|
||
TLNE CS,4 ;FIRST CHAR NUMERIC?
|
||
TLO CS,2 ;YES, FIX UP FOR GETSYM
|
||
CALL GETSY0 ;GET A SYMBOL
|
||
JRST ERRAX ;ERROR IF NOT VALID
|
||
MOVE RC,UNIVNO ;NUMBER OF UNIVERSALS AVAILABLE
|
||
JUMPE RC,UNVINP ;TRY TO READ SYMBOLS FROM DSK
|
||
CAME AC0,UNITBL(RC) ;LOOK FOR MATCH
|
||
SOJA RC,.-2 ;NOT FOUND YET
|
||
|
||
SERCH1: MOVE AC0,RC ;STORE TABLE ENTRY NUMBER
|
||
MOVEI RC,1 ;START AT ENTRY ONE
|
||
SERCH5: CAIL RC,.UNIV ;[672] CHECK FOR CONSISTENCY ERROR
|
||
JRST SCHOVL ;[672] GIVE ERROR
|
||
SKIPN UNISCH(RC) ;[672] LOOK FOR AN EMPTY SLOT
|
||
JRST [MOVEM AC0,UNISCH(RC) ;[672] STORE INDEX IN TABLE
|
||
JRST SERCH6] ;[672]
|
||
CAME AC0,UNISCH(RC) ;[672] SAME INDEX?
|
||
AOJA RC,SERCH5 ;[672] NO, NOT FOUND YET
|
||
SERCH6: CAIE C,'(' ;[672] GIVING FILE SPEC?
|
||
JRST SERCH4 ;NO
|
||
SERCH2: CALL GETCHR ;YES, GET RID OF IT
|
||
CAIN C,')' ;LOOK FOR END
|
||
JRST SERCH3 ;FOUND IT
|
||
CAIE C,EOL ;REACHED END OF LINE?
|
||
JRST SERCH2 ;NO, KEEP LOOKING
|
||
TROA ER,ERRQ ;GIVE UP AND FLAG ERROR
|
||
SERCH3: CALL GETCHR ;GET NEXT CHAR
|
||
SERCH4: JUMPCM SERCH0 ;LOOK FOR MORE NAMES
|
||
RET ;FINISHED
|
||
|
||
VERSKW: PUSH P,['MCRUVS'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / UNIVERSAL VERSION SKEW, REASSEMBLE UNIVERSAL@/] ;[1066]
|
||
JRST ERRFIN ;NAME IN AC0
|
||
|
||
SCHERR: PUSH P,['MCRCFU'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / CANNOT FIND UNIVERSAL@/] ;[1066]
|
||
JRST ERRFIN ;NAME IN AC0
|
||
|
||
SCHOVL: PUSH P,['MCTSTO'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / SEARCH TABLE OVERFLOW, CANNOT SEARCH UNIVERSAL@/] ;[1066][672]
|
||
MOVE AC0,UNVDIR ;[672]
|
||
JRST ERRFIN ;[672]
|
||
|
||
;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL
|
||
UNIERR: PUSH P,['MCRCAP'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / CORE ALLOCATION PROBLEM WITH MEMORY-RESIDENT UNIVERSAL(S)@/] ;[1066][700]
|
||
MOVEI P,JOBFFI ;[1004] GET SAFE TEMP PDL PTR
|
||
JRST ERRFIN
|
||
|
||
SCHGET: SETZ AC0, ;INITIALIZE
|
||
MOVSI AC1,(POINT 6,AC0)
|
||
SCHGNX: CALL GETCHR ;GET NEXT CHARACTER
|
||
CAIE C,'.' ;SPECIAL TEST FOR END OF NAME
|
||
TLNN CS,6 ;OR ANY NON-ALPHANUMERIC
|
||
PJRST BYPAS2 ;SKIP ALL SPACES AND QUIT
|
||
TLNE AC1,770000 ;ALL SIX IN YET?
|
||
IDPB C,AC1 ;NO, STORE THIS ONE
|
||
JRST SCHGNX ;GET NEXT
|
||
|
||
SCHOCT: SETZ AC0, ;INITIALIZE
|
||
SCHONX: CALL GETCHR ;GET NEXT CHAR
|
||
TLNN CS,4 ;NUMBER
|
||
PJRST BYPAS2 ;NO, SKIP TRAILING SPACES
|
||
LSH AC0,3 ;MAKE SPACE
|
||
ADDI AC0,-'0'(C) ;AND STOW DIGIT
|
||
JRST SCHONX ;GET NEXT
|
||
SUBTTL MACRO/REPEAT HANDLERS
|
||
|
||
REPEA0: CALL EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.
|
||
JUMPNC ERRAX
|
||
SETZM NESTED ;ASSUME NOT NESTED
|
||
SKIPN LITLVL ;IN LITERAL?
|
||
SKIPE MACLVL ;IN MACRO?
|
||
SKIPA
|
||
SKIPE RPOLVL ;IN REPEAT 1 OR IF'S?
|
||
SETOM NESTED ;YES, IT IS NESTED IN ONE OF THEM
|
||
|
||
REPEA1: SETZM COMSW ;SET COMMENT SWITCH
|
||
JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS
|
||
SOJE AC0,REPO ;REPEAT ONCE
|
||
REPEA2: CALL GCHARQ ;GET STARTING "<"
|
||
CALL COMTST ;IGNORE COMMENTS
|
||
SKIPN COMSW ;INSIDE A COMMENT?
|
||
CAIG C," " ;TEXT FORMATTING CHARACTER?
|
||
JRST REPEA2 ;YES, GET NEXT
|
||
CAIE C,"<" ;"<"?
|
||
JRST REPMAB ;NO, ERROR
|
||
CALL SKELI1 ;INITIALIZE SKELETON
|
||
PUSH MP,REPEXP
|
||
MOVEM AC0,REPEXP
|
||
PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER
|
||
MOVEM ARG,REPPNT ;STORE NEW POINTER
|
||
TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP
|
||
|
||
REPEA4: CALL WCHAR ;[664] WRITE A CHARACTER
|
||
CALL GCHARQ ;GET A CHARACTER
|
||
CAIN C,"<" ;"<"?
|
||
AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE
|
||
CAIE C,">" ;">"?
|
||
JRST REPEA4 ;NO, WRITE THE CHARACTER
|
||
SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT
|
||
MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END
|
||
CALL WWRXE ;WRITE END
|
||
SKIPE NESTED ;NESTED?
|
||
JRST REPEA5 ;YES, REST OF LINE, SOMETHING ELSE MAY END HERE
|
||
CALL BYPASS ;[664]
|
||
CALL STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT
|
||
SOS TAGINC ;[1001] RECOVER CORRECT OFFSET
|
||
;(NOTE: THIS IS NECESSARY FOR MRP IS NOT YET NON-ZERO WHEN THE EARLY CALL
|
||
; TO STOUT OCCURS. THIS FOULS UP THE CHECK AT OUTLI4.)
|
||
|
||
REPEA5: PUSH MP,MRP ;STACK PREVIOUS READ POINTER
|
||
PUSH MP,RCOUNT ;SAVE WORD COUNT
|
||
HRRZ MRP,REPPNT ;SET UP READ POINTER
|
||
ADDI MRP,1 ;BYPASS ARG COUNT
|
||
SKIPE NESTED ;NESTED?
|
||
JRST REPEA8 ;YES
|
||
RET ;[664] NO
|
||
|
||
REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER
|
||
ADDI MRP,1 ;BYPASS ARG COUNT
|
||
REPEA8: MOVEI C,LF
|
||
JRST RSW2
|
||
|
||
REPEND: SOSL REPEXP
|
||
JRST REPEA7
|
||
HRRZ V,REPPNT ;GET START OF TREE
|
||
CALL REFDEC ;DECREMENT REFERENCE
|
||
POP MP,RCOUNT
|
||
POP MP,MRP
|
||
POP MP,REPPNT
|
||
POP MP,REPEXP
|
||
SKIPE NESTED ;NESTED?
|
||
JRST RSW0 ;YES, FINISH OF LINE NOW
|
||
JRST REPEA8
|
||
|
||
REPMAB: PUSH P,['MCRISR'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT \ ILLEGAL SYNTAX IN REPEAT@\] ;[1066][702]
|
||
JRST ERRNE4 ;[702]
|
||
|
||
REPZ: FORERR (SDEL,REP)
|
||
PUSH P,IO ;SAVE STATE OF IOPROG
|
||
SETOM INREP
|
||
REPZ0: CALL GCHAR0 ;[1003][753] GET STARTING <
|
||
CALL COMTST ;IGNORE COMMENTS
|
||
SKIPN COMSW ;INSIDE A COMMENT?
|
||
CAIG C," " ;TEXT-FORMATING CHAR?
|
||
JRST REPZ0 ;YES, GET NEXT
|
||
CAIE C,"<" ;<?
|
||
JRST CORMAB ;NO, ERROR
|
||
MOVEI SDEL,1 ;SET COUNT
|
||
REPZ1: CALL GCHAR0 ;[1003][753] GET NEXT CHARACTER
|
||
CAIG C,FF ;END OF LINE?
|
||
CAIGE C,LF
|
||
JRST REPZ3 ;NO
|
||
SKIPE IFXLSW ;YES, XLISTING IN IF?
|
||
TLO IO,IOPROG ;YES, DO IT
|
||
REPZ3: CAIN C,"<" ;"<"?
|
||
AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT
|
||
CAIN C,">" ;">"?
|
||
SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING
|
||
JRST REPZ1 ;NO, RECYCLE
|
||
REPZ2: POP P,AC1 ;RECOVER ORIGINAL IOPROG
|
||
TLNN AC1,IOPROG ;ORIGINALLY 0?
|
||
TLZ IO,IOPROG ;YES, RESTORE IT
|
||
SETZM INREP ;FLAG OUT OF IT
|
||
SETZM INCND ;AND CONDITIONAL ALSO
|
||
JRST STMNT ;AND EXIT
|
||
|
||
REPO: CALL GCHAR ;GET "<"
|
||
CALL COMTST ;IGNORE COMMENTS
|
||
SKIPN COMSW ;INSIDE A COMMENT?
|
||
CAIG C," " ;TEXT-FORMATTING CHAR?
|
||
JRST REPO ;YES, GET NEXT
|
||
CAIE C,"<" ;<?
|
||
JRST CORMAB ;NO, ERROR
|
||
SKIPE RPOLVL ;ARE WE NESTED?
|
||
AOS RPOLVL ;YES, DECREMENT CURRENT
|
||
PUSH MP,RPOLVL
|
||
SETOM RPOLVL
|
||
JRST STMNT
|
||
|
||
REPO1: CAIN C,"<"
|
||
SOS RPOLVL
|
||
CAIN C,">"
|
||
AOSE RPOLVL
|
||
JRST RSW2
|
||
POP MP,RPOLVL
|
||
CALL RSW2
|
||
JRST RSW0
|
||
|
||
CORMAB: PUSH P,['MCRISC'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / ILLEGAL SYNTAX IN CONDITIONAL OR REPEAT@/] ;[1066][702]
|
||
JRST ERRNE4 ;[702]
|
||
|
||
COMTST: CAIG C,FF ;SEARCH FOR END OF LINE
|
||
CAIGE C,LF ;LF, VT OR FF?
|
||
JRST .+2 ;WASN'T ANY OF THEM
|
||
SETZM COMSW ;RESET COMMENT SWITCH
|
||
CAIN C,";" ;COMMENT?
|
||
SETOM COMSW ;YES, SET COMMENT SWITCH
|
||
RET
|
||
SUBTTL MACRO PROCESSOR
|
||
|
||
COMMENT \
|
||
THE FOLLOWING IS A PARTIAL DESCRIPTION OF THE DATA STRUCTURES USED
|
||
BY THE MACRO PROCESSOR.
|
||
|
||
FREE STORAGE IS OBTAINED IN GROUPS OF .LEAF (4 PRESENTLY) WORDS.
|
||
SUCH A BLOCK IS CALLED A 'LEAF' AND IS FORMATTED AS FOLLOWS FOR
|
||
STORING TEXT:
|
||
|
||
!-------------------------------------------!
|
||
! LINK TO NEXT LEAF !//! CHAR 0 ! CHAR 1 !
|
||
!-------------------------------------------!
|
||
! CHAR 2 ... !
|
||
!-------------------------------------------!
|
||
! !
|
||
!-------------------------------------------!
|
||
! !
|
||
!-------------------------------------------!
|
||
|
||
THE FIRST LEAF OF A MACRO DEFINITION CONTAINS SOME ADDITIONAL INFORMATION
|
||
ABOUT THE MACRO:
|
||
1. DEFAULT ARGUMENT POINTER
|
||
2. ARGUMENT COUNT
|
||
3. REFERENCE COUNT
|
||
|
||
!-------------------------------------------!
|
||
! LINK ! !
|
||
!-------------------------------------------!
|
||
! DEF ARG PTR ! ARG CNT ! REF CNT!
|
||
!-------------------------------------------!
|
||
! CHAR 0 ! CHAR 1 ! ... !
|
||
!-------------------------------------------!
|
||
! !
|
||
!-------------------------------------------!
|
||
|
||
THE FIRST LEAF OF A MACRO ARGUMENT ALSO CONTAINS A REF COUNT:
|
||
|
||
!-------------------------------------------!
|
||
! LINK ! !
|
||
!-------------------------------------------!
|
||
! ! 1 ! REF CNT !
|
||
!-------------------------------------------!
|
||
! !
|
||
!-------------------------------------------!
|
||
! !
|
||
!-------------------------------------------!
|
||
|
||
MP - POINTER TO STACK USED FOR REPEATS
|
||
RP - POINTER TO STACK USED FOR MACRO CALLS
|
||
MACPNT - POINTER TO LIST OF ARG POINTERS (I.E. RP AT FIRST ARG)
|
||
|
||
A MACRO CALL PRODUCES THE FOLLOWING STACK FRAME:
|
||
|
||
MACPNT/ ---) PTR TO MACRO DEFINITION BODY
|
||
ARG 1
|
||
ARG 2
|
||
..
|
||
0
|
||
OLD MACPNT
|
||
OLD C
|
||
OLD RCOUNT
|
||
RP/ ---) OLD MRP
|
||
|
||
IRP VARIABLES:
|
||
|
||
IRPARP POINTER TO ORIGINAL MACRO ARG
|
||
IRPCF B0: 0=IRP, 1=IRPC
|
||
IRPSW
|
||
IRPARG ORIGINAL MACRO ARG
|
||
IRPCNT READ COUNT
|
||
IRPPOI ORIGIN OF BODY OF IRP RANGE
|
||
\ ;END OF COMMENT
|
||
|
||
DEFIN0: SKIPN UWVER ;WRITING UNV FILE?
|
||
JRST DEF01 ;NO
|
||
BITON UMAD,UWVER ;MACRO ARG DEF VALUE FIXED BIT
|
||
DEF01: CALL GETSYM ;GET MACRO NAME
|
||
JRST ERRAX ;EXIT ON ERROR
|
||
MOVEM P,PPTMP1 ;SAVE POINTER
|
||
MOVEM AC0,PPTMP2 ;SAVE NAME
|
||
TLO IO,IORPTC
|
||
FORERR (SX,DEF)
|
||
SETOM INDEF ;AND FLAG IN DEFINE
|
||
SETZB SX,.TEMP ;SET ARGUMENT AND REFERENCE COUNT
|
||
SETZM COMSW ;AND COMMENT SWITCH
|
||
DEF02: CALL GCHAR0 ;[1003] SEARCH FOR "(" OR "<"
|
||
CALL COMTST ;IGNORE COMMENTS
|
||
SKIPE COMSW ;INSIDE A COMMENT?
|
||
JRST DEF02 ;YES, IGNORE CHARACTER
|
||
CAIE C,")" ;MISSING "("?
|
||
CAIN C,">" ;OR "<"?
|
||
JRST DEFERR ;YES, GIVE ERROR, GET OUT OF DEF
|
||
CAIN C,"<" ;"<"?
|
||
JRST DEF20 ;YES
|
||
CAIE C,"(" ;"("?
|
||
JRST DEF02 ;NO
|
||
DEF10: CALL GETSYM ;YES, GET DUMMY SYMBOL
|
||
JRST DEFERR ;[1216] FLAG ERROR
|
||
ADDI SX,1 ;INCREMENT ARG COUNT
|
||
CAIG SX,37 ;[1162] TOO MANY ARGS?
|
||
JRST DEF11 ;[1162] NO, CONTINUE
|
||
PUSH P,['MCRTMA'] ;[1162] YES, SET UP PREFIX
|
||
POP P,PREFIX ;[1162] FOR THE ERROR MESSAGE
|
||
MOVSI RC,[SIXBIT/ MORE THAN 31 ARGUMENTS SPECIFIED FOR MACRO DEFINITION@/]
|
||
MOVE AC0,PPTMP2 ;[1162] GET THE MACRO NAME
|
||
JRST ERRNE4 ;[1162] GO GIVE THE ERROR MESSAGE
|
||
DEF11: PUSH P,AC0 ;[1162] STACK IT
|
||
JUMPCM DEF10 ;GET NEXT DUMMY SYMBOL IF COMMA
|
||
CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?
|
||
JRST DEF80 ;YES, STORE IT AWAY
|
||
CAIE C,11 ;")"?
|
||
JRST DEFERR ;NO, SYNTAX ERROR
|
||
DEF12: CALL GCHAR0 ;[1003]
|
||
CALL COMTST ;IGNORE COMMENTS
|
||
SKIPE COMSW ;GET NEXT IF INSIDE COMMENT
|
||
JRST DEF12 ;[574]
|
||
CAIN C,">" ;MISSING "<"?
|
||
JRST DEFERR ;YES, GIVE ERROR, LEAVE DEFINITION
|
||
CAIE C,"<" ;"<"?
|
||
JRST DEF12 ;NO
|
||
DEF20: PUSH P,[0] ;YES, MARK THE LIST
|
||
LSH SX,9 ;SHIFT ARG COUNT
|
||
AOS ARG,SX
|
||
CALL SKELI ;INITIALIZE MACRO SKELETON
|
||
MOVE AC0,PPTMP2 ;GET NAME
|
||
TLO IO,DEFCRS
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
CALL OPCFIX ;[736] FIX UP SYMTAB IF FORW-REF'ED
|
||
CALL MSRCH ;SEARCH THE TABLE
|
||
JRST DEF24 ;NOT FOUND
|
||
TLNN ARG,MACF ;FOUND, IS IT A MACRO?
|
||
TROA ER,ERRX ;NO, FLAG ERROR AND SKIP
|
||
CALL REFDEC ;YES, DECREMENT THE REFERENCE
|
||
DEF24: TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
HRRZ V,WWRXX ;GET START OF TREE
|
||
SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?
|
||
JRST DEF25 ;NO
|
||
HRRZ C,1(V) ;GET SHIFTED ARG COUNT
|
||
LSH C,-9 ;GET ARG COUNT BACK
|
||
ADDI C,1 ;ONE MORE FOR TERMINAL ZERO
|
||
ADD C,.TEMP ;NUMBER OF ITEMS IN STACK
|
||
HRLS C ;MAKE XWD
|
||
MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED
|
||
ADDI SDEL,1 ;PLUS THE 0 AT THE END
|
||
ADDB SDEL,FREE ;FROM FREE CORE
|
||
CAML SDEL,SYMBOL ;MORE CORE NEEDED
|
||
CALL XCEEDS ;YES, TRY TO GET IT
|
||
SUB SDEL,.TEMP ;FORM POINTER
|
||
SUBI SDEL,1 ;MINUS THE 0
|
||
SUB P,C ;BACK UP STACK TO START OF ARGS
|
||
HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO
|
||
SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE
|
||
MOVEI C,1(P) ;POINT TO START OF STACK
|
||
DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK
|
||
TLNN ARG,-40 ;A POINTER?
|
||
JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT
|
||
AOJA C,DEF26] ;GET NEXT
|
||
PUSH P,ARG ;RESTACK ARGUMENT
|
||
SKIPE ARG ;FINISHED IF ZERO
|
||
AOJA C,DEF26 ;GET NEXT
|
||
PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO
|
||
DEF25: MOVSI ARG,MACF
|
||
MOVEM P,PPTMP2 ;STORE TEMP STORAGE POINTER
|
||
SETZ RC, ;[1156] MAKE SURE DEFINITION IS ABSOLUTE
|
||
CALL INSERT ;INSERT/UPDATE
|
||
TLZ IO,DEFCRS ;JUST IN CASE
|
||
SETZM ARGF ;NO ARGUMENT SEEN
|
||
SETZM SQFLG ;AND NO ' SEEN
|
||
TDZA SDEL,SDEL ;CLEAR BRACKET COUNT
|
||
DEF30: CALL WCHAR ;WRITE CHARACTER
|
||
DEF31: CALL GCHAR0 ;[1003] GET A CHARACTER
|
||
DEF32: MOVE CS,C ;GET A COPY
|
||
CAIN C,";" ;IS IT A COMMENT
|
||
JRST CPEEK ;YES CHECK FOR ;;
|
||
DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE
|
||
CAIGE CS,"A"+40
|
||
JRST .+2
|
||
SUBI CS,40
|
||
CAIGE CS,40 ;TEST FOR CONTROL CHAR.
|
||
JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?
|
||
JRST DEF30 ;NO, OUTPUT THIS CHAR.
|
||
PUSH P,C ;YES, SAVE CURRENT CHAR
|
||
MOVEI C,47 ;SET UP QUOTE
|
||
CALL WCHAR ;WRITE IT
|
||
POP P,C ;GET BACK CURRENT CHAR.
|
||
SETZM SQFLG ;RESET FLAG
|
||
JRST DEF30] ;AND CONTINUE
|
||
CAILE CS,77+40
|
||
JRST DEF30 ;TEST FOR SPECIAL
|
||
MOVE CS,CSTAT-40(CS) ;GET STATUS BITS
|
||
TLNE CS,6 ;ALPHA-NUMERIC?
|
||
JRST DEF40 ;YES
|
||
SKIPN SQFLG ;WAS A ' SEEN?
|
||
JRST DEF36 ;NO, PROCESH
|
||
PUSH P,C ;YES, SAVE CURRENT CHARACTER
|
||
MOVEI C,47 ;AND PUT IN A '
|
||
CALL WCHAR ;...
|
||
POP P,C ;RESTORE CURRENT CHARACTER
|
||
SETZM SQFLG ;AND RESET FLAG
|
||
DEF36: CAIE C,47 ;IS THIS A '?
|
||
JRST DEF35 ;NOPE
|
||
SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?
|
||
SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG
|
||
SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE
|
||
JRST DEF31 ;GO GET NEXT CHARACTER
|
||
|
||
DEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT
|
||
CAIN C,"<" ;"<"?
|
||
AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE
|
||
CAIN C,">" ;">"?
|
||
SOJL SDEL,DEF70 ;YES, TEST FOR END
|
||
JRST DEF30 ;NO, WRITE IT
|
||
|
||
CPEEK: PUSH P,CS ;NEED TO SAVE CS, SINCE CHARAC MAY DESTROY IT
|
||
CALL PEEK ;LOOK AT NEXT CHAR.
|
||
POP P,CS ;RESTORE CS
|
||
CAIN C,";" ;IS IT ;;?
|
||
JRST CPEEK0 ;YES, GO SCAN LINE MATCHING ANGLE BRACKETS
|
||
MOVE C,CS ;RESTORE C
|
||
JRST DEF33 ;AND RETURN
|
||
|
||
CPEEK0: SETZM CPEEKC ;CLEAR MATCHING ANGLE COUNTER
|
||
CPEEK1: CALL GCHAR ;GET A CHARACTER
|
||
CAIN C,"<" ;SEE IF LEFT ANGLE
|
||
AOJA SDEL,CPEEKL ;YES, GO ADD TO COUNT
|
||
CAIN C,">" ;SEE IF RIGHT ANGLE
|
||
SOJA SDEL,CPEEKR ;YES, GO SUBTRACT FROM COUNT
|
||
CAIG C,CR ;SEE IF AN
|
||
CAIGE C,LF ;END OF LINE CHARACTER
|
||
JRST CPEEK1 ;NO, CONTINUE
|
||
CPEK1A: SKIPL CPEEKC ;YES, SEE IF UNMATCHED ANGLES
|
||
JRST CPEEK3 ;NO, GO SEE IF END OF MACRO
|
||
PUSH P,C ;SAVE EOL CHARACTER
|
||
CPEEK2: MOVEI C,">" ;SET TO PUT IN SOME RIGHTS
|
||
CALL WCHAR ;GO DO ONE
|
||
AOSGE CPEEKC ;SEE IF ENOUGH
|
||
JRST CPEEK2 ;NO, LOOP
|
||
POP P,C ;RECOVER EOL CHARACTER
|
||
CPEEK3: JUMPL SDEL,DEF70 ;IF END OF MACRO, LEAVE COMPLETELY
|
||
JRST DEF32 ;AND GET OUT OF LINE
|
||
|
||
CPEEKL: AOS CPEEKC ;ADD IN LEFT ANGLE BRACKET
|
||
JRST CPEEK1 ;TO NEXT CHARACTER
|
||
|
||
CPEEKR: JUMPL SDEL,CPEK1A ;JUMP IF END OF MACRO
|
||
SOS CPEEKC ;SUBTRACT OUT RIGHT BRACKET
|
||
JRST CPEEK1 ;CONTINUE
|
||
|
||
DEF40: MOVEI AC0,0 ;CLEAR ATOM
|
||
MOVSI AC1,(POINT 6,AC0) ;SET POINTER
|
||
DEF42: PUSH P,C ;STACK CHARACTER
|
||
TLNE AC1,770000 ;HAVE WE STORED 6?
|
||
IDPB CS,AC1 ;NO, STORE IN ATOM
|
||
CALL GCHAR ;GET NEXT CHARACTER
|
||
MOVE CS,C
|
||
CAIG CS,"Z"+40
|
||
CAIGE CS,"A"+40
|
||
JRST .+2
|
||
SUBI CS,40 ;CONVERT LOWER TO UPPER
|
||
CAIL CS,40
|
||
CAILE CS,77+40
|
||
JRST DEF44 ;TEST SPECIAL
|
||
MOVE CS,CSTAT-40(CS) ;GET STATUS
|
||
TLNE CS,6 ;ALPHA-NUMERIC?
|
||
JRST DEF42 ;YES, GET ANOTHER
|
||
DEF44: PUSH P,[0] ;NO, MARK THE LIST
|
||
MOVE SX,PPTMP1 ;GET POINTER TO TOP
|
||
|
||
DEF46: SKIPN 1(SX) ;END OF LIST?
|
||
JRST DEF50 ;YES
|
||
CAME AC0,1(SX) ;NO, DO THEY COMPARE?
|
||
AOJA SX,DEF46 ;NO, TRY AGAIN
|
||
SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER
|
||
LSH SX,4
|
||
MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND
|
||
LSH AC0,-^D30
|
||
CAIN AC0,5 ;"%"?
|
||
TLO CS,1000 ;YES, SET CRESYM FLAG
|
||
CALL WWORD ;WRITE THE WORD
|
||
SETOM ARGF ;SET ARGUMENT SEEN FLAG
|
||
SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING
|
||
DEF48: MOVE P,PPTMP2 ;RESET PUSHDOWN POINTER
|
||
TLO IO,IORPTC ;ECHO LAST CHARACTER
|
||
JRST DEF31 ;RECYCLE
|
||
|
||
DEF50: SKIPN SQFLG ;HAVE WE SEEN A '?
|
||
JRST DEF51 ;NOPE
|
||
MOVEI C,47 ;YES, PUT IT IN
|
||
CALL WCHAR ;...
|
||
SETZM SQFLG ;AND CLEAR FLAG
|
||
DEF51: MOVE C,2(SX) ;GET CHARACTER
|
||
JUMPE C,DEF48 ;CLEAN UP IF END
|
||
CALL WCHAR ;WRITE THE CHARACTER
|
||
AOJA SX,DEF51 ;GET NEXT
|
||
|
||
DEF70: MOVE P,PPTMP1 ;RESTORE PUSHDOWN POINTER
|
||
MOVSI CS,(BYTE (7) 177,1)
|
||
CALL WWRXE ;WRITE END
|
||
SETZM INDEF ;OUT OF IT
|
||
JRST BYPASS ;[664]
|
||
|
||
; HERE TO STORE DEFAULT ARGUMENTS
|
||
DEF80: AOS .TEMP ;COUNT ONE MORE
|
||
CALL SKELI1 ;INITIALIZE SKELETON
|
||
HRL V,SX ;SYMBOL NUMBER
|
||
PUSH P,V ;STORE POINTER
|
||
TDZA SDEL,SDEL ;ZERO BRACKET COUNT
|
||
DEF81: CALL WCHAR ;[664] WRITE A CHARACTER
|
||
CALL GCHAR0 ;[1003] GET A CHARACTER
|
||
CAIN C,"<" ;ANOTHER "<"?
|
||
AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE
|
||
CAIE C,">" ;CLOSING ANGLE?
|
||
JRST DEF81 ;NO, JUST WRITE THE CHAR.
|
||
SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END
|
||
MOVSI CS,(BYTE (7) 177,2)
|
||
CALL WWRXE ;WRITE END OF DUMMY ARGUMENT
|
||
CALL GCHAR ;READ AT NEXT CHAR.
|
||
CAIE C,")" ;END OF ARGUMENT LIST?
|
||
JRST DEF10 ;NO, GET NEXT SYMBOL
|
||
JRST DEF12 ;YES, LOOK FOR "<"
|
||
|
||
DEFERR: PUSH P,['MCRISD'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / ILLEGAL SYNTAX IN MACRO DEFINITION@/] ;[1066][574]
|
||
MOVE AC0,PPTMP2 ;GET MACRO NAME
|
||
SETZM INDEF ;[702] WANT MORE USEFUL INFO
|
||
JRST ERRNE4 ;[702] GIVE ERROR, RESET STACK, LEAVE DEF
|
||
SUBTTL MACRO CALL PROCESSOR
|
||
|
||
CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?
|
||
JRST ERRAX ;YES, BOMB OUT WITH ERROR
|
||
SETZM CRLFSN ;[1064] INIT FLAG IN CASE WE SEE LALL
|
||
HRROS MACENL ;FLAG "CALLM IN PROGRESS"
|
||
EXCH MP,RP
|
||
PUSH MP,V ;STACK FOR REFDEC
|
||
EXCH MP,RP
|
||
MOVEM AC0,CALNAM ;SAVE MACRO NAME IN CASE OF ERROR
|
||
FORERR (SDEL,CAL)
|
||
ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT
|
||
AOS SDEL,0(V) ;INCREMENT ARG COUNT
|
||
HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO
|
||
LDB SX,[POINT 9,SDEL,26] ;GET ARG COUNT
|
||
MOVEI SDEL,0 ;INIT PAREN COUNTER
|
||
SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG
|
||
HRRM SX,.TEMP ;STORE COUNT OF ARGS
|
||
PUSH P,V ;STACK FOR MRP
|
||
PUSH P,RP ;STACK FOR MACPNT
|
||
JUMPE SX,MAC20 ;TEST FOR NO ARGS
|
||
MAC13: CALL CHARAC
|
||
SKIPN MACTAB ;IF MACTAB=0..NEW ARG HANDLING V51
|
||
JRST .+3 ;ASSUME ITABM=0
|
||
SKIPE ITABM ;NEW FORMAT ARG HANDLING?
|
||
JRST MAC13A ;NO, DON'T FLUSH TAB/SP
|
||
CAIE C," " ;FLUSH LEADING TABS AND SPACES
|
||
CAIN C,HT
|
||
JRST MAC13
|
||
MAC13A: CAIE C,"(" ;"("
|
||
TLOA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP
|
||
|
||
MAC10: CALL GCHAR ;GET A CHARACTER, LOOK FOR AN ARG
|
||
JUMPGE SDEL,MAC11 ;SKIP TEST IF IN ()
|
||
SKIPN LITLVL ;[1171] INSIDE A LITERAL?
|
||
JRST MAC10A ;[1171] NO
|
||
CAIN C,"]" ;[1171] CLOSING BRACKET?
|
||
JRST MAC21 ;[1171] YES, GO SET UP ARGUMENT LIST
|
||
MAC10A: CAIG C,CR ;[1171]
|
||
CAIGE C,LF
|
||
CAIN C,";" ;";"?
|
||
JRST MAC21 ;YES, END OF ARGUMENT STRING
|
||
|
||
MAC11: SKIPN MACTAB ;IF MACTAB=0..NEW ARG HANDLING V51
|
||
JRST [JUMPL SDEL,.+3 ;[1032] .XTABM IF NOT IN (),
|
||
JRST MAC11A] ;[1032] .ITABM IF IN ().
|
||
SKIPE ITABM ;MAC51 ARG HANDLING?
|
||
JRST MAC11A ;NO
|
||
CAIE C," " ;YES, ELIMINATE LEADING TABS AND SPACES
|
||
CAIN C,HT
|
||
JRST MAC10 ;[1032]
|
||
MAC11A: SKIPLE SX ;SKIP IF NO ARGS LEFT
|
||
CALL SKELI1 ;NO, INITIALIZE SKELETON
|
||
CAIN C,"<" ;"<"?
|
||
JRST MAC30 ;YES, PROCESS AS SPECIAL
|
||
CAIE C,176
|
||
CAIN C,134 ;"\"
|
||
JRST MAC40 ;YES, PROCESS SYMBOL
|
||
;..
|
||
|
||
MAC14: CAIN C,"," ;","?
|
||
JRST [JUMPG SDEL,MAC14B ;[656] YES, IGNORE IF PART OF ARG
|
||
JRST MAC16] ;[656] OTHERWISE END OF ARG
|
||
JUMPGE SDEL,[CAIN C,"(" ;IF IN (), CHECK AND COUNT
|
||
AOS SDEL ;..
|
||
CAIN C,")" ;..
|
||
SOJL SDEL,MAC16 ;JUMP IF END OF ARGLIST
|
||
SKIPE MACTAB ;[1032] IF NOT MACMPD,
|
||
JRST MAC14C ;[1032] DO .XTABM/.ITABM TEST
|
||
JRST MAC14B] ;[1032] ELSE FORCE .ITABM IN ()
|
||
SKIPN MACTAB ;[671] NEW ARG HANDLING IF MACTAB=0
|
||
JRST .+3 ;[671] ASSUME ITABM=0
|
||
MAC14C: SKIPE ITABM ;[1032] OLD FORMAT WANTED?
|
||
JRST MAC14B ;YES, NO FURTHER CHECKS
|
||
CAIE C," " ;SPACE OR TAB?
|
||
CAIN C,HT
|
||
JRST MACTB ;YES, GO SEE WHAT FOLLOWS
|
||
SKIPE MACTAB ;[671] SKIP REST IF OLD FORMAT
|
||
JRST MAC14B ;NO
|
||
JUMPGE SDEL,MAC14B ;[1032] IF IN PARENS NO FURTHER CHECKS
|
||
CAIN C,42 ;A QUOTE MARK?
|
||
JRST MAC12B ;YES, GO QUOTE TIL ANOTHER QUOTE
|
||
CAIN C,"<" ;OPEN ANG BKT?
|
||
JRST MAC12 ;YES, QUOTE TO CLOSE
|
||
CAIE C,"("
|
||
CAIN C,"[" ;CHECK FOR BKTS AND PARENS
|
||
JRST MAC12 ;OPEN BKT, GO SCAN TO CLOSE BKT
|
||
CALL SKPNTM ;CHECK FOR UNMATCHED TERMINATORS
|
||
JRST MAC9 ;FOUND ONE, END OF ARG LIST
|
||
MAC14B: SKIPLE SX ;IGNORE IF NO ARGS LEFT
|
||
CALL WCHAR ;WRITE INTO SKELETON
|
||
MAC14A: JUMPGE SDEL,[CALL GCHAR ;[673] IF IN (), LIST CRLFS CORRECTLY
|
||
JRST .+2] ;[673] THEN SKIP LOCAL CALL
|
||
CALL CHARAC ;GET NEXT CHARACTER
|
||
CAIE C,177 ;RUB-OUT?
|
||
JRST MAC14E ;NO,
|
||
MOVSI CS,(BYTE (7) 177,5) ;YES, A REAL RUBOUT, PUT INTO SKELETON
|
||
CALL WWRXE ;(177,5)
|
||
JRST MAC14A
|
||
MAC14E: JUMPGE SDEL,MAC14 ;IGNORE TEST IF IN ()
|
||
CAIG C,CR
|
||
CAIGE C,LF
|
||
CAIN C,";"
|
||
JRST MAC15
|
||
JRST MAC14 ;JUMP IF NOT END OF LINE
|
||
|
||
MAC9: SETOM SDEL ;FORCE END OF ARG LIST
|
||
MAC15: TLO IO,IORPTC
|
||
MAC16: JUMPLE SX,MAC17 ;SKIP IF NO ARGS LEFT
|
||
MOVSI CS,(BYTE (7) 177,2)
|
||
CALL WWRXE ;WRITE END
|
||
EXCH MP,RP
|
||
PUSH MP,WWRXX
|
||
EXCH MP,RP
|
||
MAC17: SUBI SX,1 ;DECREMENT ARG COUNT
|
||
JUMPGE SDEL,MAC10 ;IF IN () KEEP LOOKING
|
||
TRNN SDEL,1B18 ;SKIP LOOKING IF SEEN ")"
|
||
JUMPG SX,MAC10 ;NO, BUT MORE ARGS TO COME
|
||
|
||
MAC20: TLZN IO,IORPTC
|
||
CALL CHARAC
|
||
MAC21: EXCH MP,RP
|
||
JUMPE SX,MAC21B ;NO MISSING ARGS
|
||
MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS
|
||
SKIPN .TEMP ;ANY DEFAULT ARGS?
|
||
JRST MAC21C ;NO
|
||
HRRZ C,.TEMP ;GET ARG COUNT
|
||
SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN
|
||
HRLZS C ;PUT IN LEFT HALF
|
||
HLRZ SDEL,.TEMP ;ADDRESS OF TABLE
|
||
MAC21D: SKIPN (SDEL) ;END OF LIST
|
||
JRST MAC21C ;YES
|
||
XOR C,(SDEL) ;TEST FOR CORRECT ARG
|
||
TLNN C,-1 ;WAS IT?
|
||
JRST MAC21E ;YES
|
||
XOR C,(SDEL) ;BACK THE WAY IT WAS
|
||
AOJA SDEL,MAC21D ;AND TRY AGAIN
|
||
|
||
MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER
|
||
AOS 1(C) ;INCREMENT REFERENCE
|
||
MAC21C: SOJG SX,MAC21A
|
||
MAC21B: PUSH MP,[0] ;SET TERMINAL
|
||
EXCH MP,RP ;[1015]
|
||
HRRZ C,LIMBO
|
||
TLNN IO,IOSALL ;SUPPRESSING ALL?
|
||
JRST MAC23 ;NO
|
||
JUMPN MRP,MAC27 ;IN MACRO?
|
||
CALL SEMSRC ;CHECK FOR IMMEDIATE COMMENT
|
||
JRST MAC26 ;NOT FOUND, CONTINUE
|
||
MAC22: CALL CHARAC ;YES,GET IT INTO THE LBUF
|
||
CAIG C,CR ;LESS THAN CR?
|
||
CAIGE C,LF ;AND GREATER THAN LF?
|
||
JRST MAC22 ;NO GET ANOTHER
|
||
MAC26: CALL DECLBP ;DECREMENT LINE BUFFER POINTER
|
||
MAC27: HRLI C,-1 ;SET FLAG
|
||
JRST MAC25
|
||
|
||
MAC23: SKIPN MRP ;[1072] INSIDE A MACRO?
|
||
TLZ IO,IOMAC ;[1072] NO - CLEAR EXPANSION FLAG FOR LISTING
|
||
MOVEI SX,"^"
|
||
DPB SX,LBUFP ;SET ^ INTO LINE BUFFER
|
||
JUMPAD MAC25 ;BRANCH IF ADDRESS FIELD
|
||
JUMPN MRP,MAC25 ;BRANCH IF ALREADY IN A MACRO
|
||
SKIPN LITLVL ;BRANCH IF WITHIN A LITERAL
|
||
SKIPE RPOLVL ;OR IN A REPEAT
|
||
JRST MAC25
|
||
CALL RSW3 ;OUTPUT C AGAIN (OVERWRITTEN BY "^")
|
||
CALL SEMSRC ;LOOK FOR A COMMENT
|
||
JRST MAC24 ;NO COMMENT CONTINUE
|
||
CALL STOUT ;LIST COMMENT OR CR-LF
|
||
TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?
|
||
TLO IO,IOMAC ; NO, SET TEMP BIT
|
||
TDOA C,[-1] ;FLAG LAST CHARACTER
|
||
MAC24: CALL DECLBP ;DECREMENT BYTE POINTER
|
||
MAC25: EXCH MP,RP ;[1015]
|
||
PUSH MP,MACPNT
|
||
POP P,MACPNT
|
||
PUSH MP,C
|
||
PUSH MP,RCOUNT ;STACK WORD COUNT
|
||
PUSH MP,MRP ;STACK MACRO POINTER
|
||
POP P,MRP ;SET NEW READ POINTER
|
||
EXCH MP,RP
|
||
AOS MACLVL
|
||
HRRZS MACENL ;RESET "CALLM IN PROGRESS"
|
||
JUMPOC STMNT2 ;OP-CODE FIELD
|
||
JRST EVATOM ;ADDRESS FIELD
|
||
|
||
;ROUTINE TO LOOK FOR A SEMICOLON, IGNORING SPACES AND TABS
|
||
; SKIP IF FOUND
|
||
CALL CHARAC ;FETCH ANOTHER CHARACTER
|
||
SEMSRC: CAIE C," " ;SPACE?
|
||
CAIN C,HT ;OR TAB?
|
||
JRST .-3 ;YES, GET ANOTHER CHARACTER
|
||
CAIN C,";" ;NO, SEMICOLON?
|
||
CPOPJ1: AOS (P) ;[664] YES, SKIP RETURN
|
||
CPOPJ: RET ;[664]
|
||
|
||
;ROUTINE TO DECREMENT BYTE POINTER LBUFP
|
||
DECLBP: HRLZI SX,70000 ;INCREASE P FIELD BY 1 BYTE
|
||
ADDB SX,LBUFP
|
||
JUMPGE SX,CPOPJ ;RETURN IF NO OVERFLOW
|
||
HRLOI SX,347777 ;OVERFLOW, BACKUP ONE WORD
|
||
ADDM SX,LBUFP
|
||
RET
|
||
|
||
;HERE WHEN ENCOUNTERED UNQUOTED TAB OR SPACE IN MACRO ARGUMENT.
|
||
;"LOOK AHEAD" TO SEE IF END OF ARG LIST COMING UP.
|
||
;IF ARG LIST END FOUND, FLUSH TRAILING TABS/SPACES, OTHERWISE
|
||
;KEEP THEM. BUFFER TAB/SPACE STRING ON STACK.
|
||
MACTB: MOVE AC2,P ;SAVE CURRENT STACK PTR
|
||
HRRZ AC1,AC2 ;CONSTRUCT BYTE PTR TO STACK
|
||
HRLI AC1,(<POINT 7,0,34>) ;..
|
||
MOVEI AC0,0 ;INIT CHAR COUNT
|
||
MACTB1: TLNN AC1,(76B5) ;NEED ANOTHER STACK WORD?
|
||
PUSH P,[0] ;YES, GET IT
|
||
IDPB C,AC1 ;BUILD TEMP STRING
|
||
AOS AC0 ;COUNT CHARS STORED
|
||
CALL CHARAC ;GET NEXT CHAR
|
||
CAIE C," " ;ANOTHER SPACE OR TAB?
|
||
CAIN C,HT ;..
|
||
JRST MACTB1 ;YES, KEEP SCANNING
|
||
PUSH P,C ;NO, SAVE IT
|
||
JUMPGE SDEL,[CAIE C,"," ;[1032] SPECIAL CHECKS FOR PARENS
|
||
CAIN C,")" ;[1032] ARG TERMINATORS ARE
|
||
JRST MACTB2 ;[1032] COMMA AND CLOSE PAREN
|
||
JRST MACTB4] ;[1032] ELSE RETAIN TAB/SPACE
|
||
CAIG C,CR ;END OF LINE?
|
||
CAIGE C,LF ;..
|
||
CAIN C,";" ;OR SEMICOLON?
|
||
JRST MACTB2 ;YES, FLUSH TEMP STRING
|
||
CAIE C,"," ;END OF ARGUMENT?
|
||
CALL [SKIPE MACTAB ;[664] OR ARG LIST TERMINATOR?
|
||
JRST CPOPJ1 ;[664] (SKIP RETURN IF OLD FORMAT)
|
||
PJRST SKPNTM] ;[664]
|
||
JRST MACTB2 ;YES
|
||
MACTB4: HRRZ AC1,AC2 ;[1032] NO, MUST KEEP TEMP STRING
|
||
HRLI AC1,(<POINT 7,0,34>) ;REINIT BYTE PTR
|
||
MACTB3: ILDB C,AC1 ;COPY TEMP STRING TO SKELETON
|
||
SKIPLE SX ;UNLESS HAVE ALL ARGS NOW
|
||
CALL WCHAR ;..
|
||
SOJG AC0,MACTB3 ;..
|
||
MACTB2: POP P,C ;RECOVER LAST CHAR
|
||
MOVEM AC2,P ;FLUSH TEMP STRING FROM STACK
|
||
JRST MAC14E ;CONTINUE PROCESSING
|
||
|
||
;TEST FOR UNMATCHED BRACKETING PAIR - TERMINATES ARG LIST IF NOT
|
||
;QUOTED.
|
||
SKPNTM: CAIE C,")" ;[664] PAIRS ARE PARENS, BRACKETS, AND
|
||
CAIN C,"]" ;ANG BKTS
|
||
RET ;TERMINATOR, NOSKIP
|
||
CAIE C,">"
|
||
AOS 0(P) ;[664] NON-TERMINATOR, SKIP
|
||
RET
|
||
|
||
;HERE ON OPEN ANG BKT AS FIRST CHAR IN ARG
|
||
MAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER
|
||
MAC31: CALL GCHAR ;GET A CHARACTER
|
||
CAIN C,"<" ;"<"?
|
||
ADDI AC0,1 ;YES, INCREMENT COUNT
|
||
CAIN C,">" ;">"?
|
||
SOJL AC0,MAC14A ;YES, EXIT IF MATCHING
|
||
SKIPLE SX ;IGNORE IF NO ARGS LEFT
|
||
CALL WCHAR ;WRITE INTO SKELETON
|
||
JRST MAC31 ;GO BACK FOR ANOTHER
|
||
|
||
;HERE IF ENCOUNTERED UNQUOTED "<", "[", OR "(". SCAN TO MATCHING
|
||
;CLOSE WITHOUT TERMINATING ARG.
|
||
MAC12: MOVEI AC0,0 ;INIT BKT COUNT
|
||
PUSH P,C ;SAVE CHAR
|
||
CAIN C,"<" ;GET MATCHING CLOSE CHARACTER
|
||
MOVEI C,">"
|
||
CAIN C,"["
|
||
MOVEI C,"]"
|
||
CAIN C,"("
|
||
MOVEI C,")"
|
||
PUSH P,C ;SAVE TERMINATOR
|
||
MOVE C,-1(P) ;GET ORIG CHAR
|
||
MAC12A: SKIPLE SX ;FLUSH CHAR IF NO ARGS LEFT
|
||
CALL WCHAR ;STOR CHAR
|
||
CAMN C,-1(P) ;ANOTHER OPEN?
|
||
AOS AC0 ;YES, COUNT UP
|
||
CAMN C,0(P) ;A CLOSE?
|
||
SOJLE AC0,[SUB P,[2,,2] ;YES. IF MATCH, CLEAR STACK
|
||
JRST MAC14A] ;AND RESUME NORMAL SCAN
|
||
CALL GCHAR ;GET NEXT CHAR
|
||
JRST MAC12A ;CONTINUE SCAN
|
||
|
||
;HERE IF ENCOUNTERED UNQUOTED QUOTED MARK.
|
||
;SCAN TO ANOTHER QUOTE MARK WITHOUT TERMINATING ARG.
|
||
MAC12B: PUSH P,C ;SAVE THE QUOTE MARK
|
||
MAC12C: SKIPLE SX ;FLUSH CHAR IS NO ARGS LEFT
|
||
CALL WCHAR ;WRITE IT OUT
|
||
CALL GCHAR ;GET NEXT CHAR
|
||
CAME C,0(P) ;ANOTHER QUOTE MARK?
|
||
JRST MAC12C ;NO, LOOP
|
||
SKIPLE SX ;YES, DECIDE TO WRITE OR SKIP
|
||
CALL WCHAR ;WRITE QUOTE MARK OUT
|
||
POP P,0(P) ;CLEAR STACK
|
||
JRST MAC14A ;RESUME NORMAL SCAN
|
||
|
||
;HERE ON BACKSLASH AS FIRST CHAR IN ARG
|
||
MAC40: PUSH P,SX ;STACK REGISTERS
|
||
PUSH P,SDEL
|
||
PUSH P,IO ;SAVE IO FLAGS
|
||
PUSH P,CURADX ;[635] DEFAULT VALUES
|
||
POP P,MACDVR ;[635] FOR DIVISOR
|
||
MOVEI AC1,"0" ;[635] AND ADDER
|
||
MOVEM AC1,MACADR ;[635]
|
||
CALL PEEK ;[635] CHECK NEXT CHAR
|
||
CAIN C,47 ;[635] SINGLE-QUOTE?
|
||
JRST [ CALL GETCHR ;[635] YES,
|
||
MOVEI AC1,100 ;[635]
|
||
MOVEM AC1,MACDVR ;[635]
|
||
MOVEI AC1,40 ;[635]
|
||
MOVEM AC1,MACADR ;[635]
|
||
JRST MAC43] ;[635]
|
||
CAIN C,42 ;[635] DOUBLE-QUOTE?
|
||
JRST [ CALL GETCHR ;[635] YES,
|
||
MOVEI AC1,200 ;[635]
|
||
MOVEM AC1,MACDVR ;[635]
|
||
SETZM MACADR ;[635]
|
||
JRST MAC43] ;[635]
|
||
MAC43: CALL CELL ;[635] GET AN ATOM
|
||
MOVE V,AC0 ;ASSUME NUMERIC
|
||
TLNE IO,NUMSW ;GOOD GUESS?
|
||
JRST MAC41 ;YES
|
||
CALL SSRCH ;SEARCH THE SYMBOL TABLE
|
||
TROA ER,ERRX ;NOT FOUND, ERROR
|
||
MAC41: CALL MAC42 ;FORM ASCII STRING
|
||
TLNE IO,IOCREF ;[704] IOCREF SET DURING CALL TO SSRCH?
|
||
JRST [HLL IO,0(P) ;[704] YES, DON'T LOSE IT
|
||
TLO IO,IOCREF ;[704]
|
||
JRST .+2] ;[704]
|
||
HLL IO,0(P) ;RESTORE IO FLAGS
|
||
POP P,0(P) ;FLUSH TEMP
|
||
POP P,SDEL
|
||
POP P,SX
|
||
TLO IO,IORPTC ;REPEAT LAST CHARACTER
|
||
JRST MAC14A ;RETURN TO MAIN SCAN
|
||
|
||
MAC42: MOVE SX,-3(P) ;[1127] GET ARG COUNT
|
||
JUMPLE SX,CPOPJ ;[1127] NO ARGS LEFT
|
||
MOVE C,V
|
||
MAC44: LSHC C,-^D35
|
||
LSH CS,-1
|
||
DIV C,MACDVR ;[635] DIVIDE BY THE RIGHT DIVISOR
|
||
HRLM CS,0(P)
|
||
JUMPE C,.+2 ;TEST FOR END
|
||
CALL MAC44
|
||
HLRZ C,0(P)
|
||
ADD C,MACADR ;[635] ADD THE RIGHT ADDER TO FORM TEXT
|
||
JRST WCHAR ;WRITE INTO SKELETON
|
||
|
||
MACEN0: SOS MACENL
|
||
MACEND: HRRZ C,0(P) ;GET TOP ADDRESS
|
||
CAIN C,MAC14E ;WERE WE LOOKING FOR CLOSE PAREN?
|
||
JUMPGE SDEL,MPAERR ;YES, GIVE USEFUL ERROR MESSAGE
|
||
SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"
|
||
AOS MACENL ;INCREMENT END LEVEL AND EXIT
|
||
JUMPL C,REPEA8
|
||
EXCH MP,RP
|
||
POP MP,MRP ;RETRIEVE READ POINTER
|
||
POP MP,RCOUNT ;AND WORD COUNT
|
||
MOVEI C,"^"
|
||
SKIPL 0(MP) ;TEST FLAG
|
||
CALL RSW2 ;MARK END OF SUBSTITUTION
|
||
POP MP,C
|
||
POP MP,ARG
|
||
SKIPA MP,MACPNT ;RESET MP AND SKIP
|
||
MACEN1: CALL REFDEC ;DECREMENT REFERENCE
|
||
MACEN2: AOS V,MACPNT ;GET POINTER
|
||
MOVE V,0(V)
|
||
JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE
|
||
JUMPL V,MACEN2 ;IF <0, BYPASS
|
||
POP MP,V ;IF=0, RETRIEVE POINTER
|
||
CALL REFDEC ;DECREMENT REFERENCE
|
||
MOVEM ARG,MACPNT
|
||
EXCH MP,RP
|
||
SOS MACLVL
|
||
SKIPN MACENL ;CHECK UNPROCESSED END LEVEL
|
||
JRST MACEN3 ;NONE TO PROCESS
|
||
TRNN MRP,-1 ;MRP AT END OF TEXT
|
||
JRST MACEN0 ;THEN POP THE MACRO STACK NOW
|
||
MACEN3: TRNN C,77400 ;SALL FLAG?
|
||
HRLI C,0 ;YES,TURN IT OFF
|
||
JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE
|
||
JRST RSW2
|
||
|
||
IRP0: SKIPN MACLVL ;ARE WE IN A MACRO?
|
||
JRST ERRAX ;NO, BOMB OUT
|
||
IRP10: CALL MREADS ;YES, GET DATA SPEC
|
||
CAIE C,40 ;SKIP LEADING BLANKS
|
||
CAIN C,"(" ;"("?
|
||
JRST IRP10 ;YES, BYPASS
|
||
CAIE C,"<"
|
||
CAIN C,11
|
||
JRST IRP10
|
||
CAIE C,177 ;NO, IS IT SPECIAL?
|
||
JRST ERRAX ;NO, ERROR
|
||
CALL MREADS ;YES
|
||
TRZN C,100 ;CREATED?
|
||
JRST ERRAX
|
||
CAIL C,40 ;TOO BIG?
|
||
JRST ERRAX
|
||
ADD C,MACPNT ;NO, FORM POINTER TO STACK
|
||
PUSH MP,IRPCF ;STACK PREVIOUS POINTERS
|
||
PUSH MP,IRPSW
|
||
PUSH MP,IRPARP
|
||
PUSH MP,IRPARG
|
||
PUSH MP,IRPCNT
|
||
PUSH MP,0(C)
|
||
PUSH MP,IRPPOI
|
||
HRRZM C,IRPARP
|
||
MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0
|
||
SETOM IRPSW ;RESET IRP SWITCH
|
||
MOVE CS,0(C)
|
||
MOVEM CS,IRPARG
|
||
|
||
IRP15: CALL MREADS ;GET A CHARACTER LOOKING FOR "<"
|
||
CAIE C,"<" ;"<"?
|
||
JRST [ CAIE C,"," ;ALLOW COMMA
|
||
CAIG C," " ;ALLOW TEST FORMATTING CHARS
|
||
JRST IRP15 ;IT WAS ONE, JUST GET ANOTHER
|
||
CAIE C,")" ;ALLOW )
|
||
CAIN C,">" ;ALLOW RIGHT ANGLE BRACKET
|
||
JRST IRP15 ;GO BACK FOR ANOTHER
|
||
JRST IRPMBI] ;CAN'T FIND BRACKET, IT'S AN ERROR
|
||
CALL SKELI1 ;INITIALIZE NEW STRING
|
||
MOVEM ARG,IRPPOI ;SET NEW POINTER
|
||
TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP
|
||
|
||
IRP20: CALL WCHAR ;[664]
|
||
CALL MREADS
|
||
CAIN C,"<" ;"<"?
|
||
AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE
|
||
CAIE C,">" ;">"?
|
||
JRST IRP20 ;NO, JUST WRITE IT
|
||
SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING
|
||
MOVE CS,[BYTE (7) 15,177,4]
|
||
CALL WWRXE ;WRITE END
|
||
PUSH MP,MRP ;STACK PREVIOUS READ POINTER
|
||
PUSH MP,RCOUNT ;AND WORD COUNT
|
||
SKIPG CS,IRPARG
|
||
JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT
|
||
MOVEI C,1(CS) ;INITIALIZE POINTER
|
||
MOVEM C,IRPARG
|
||
|
||
IRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS
|
||
MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ
|
||
EXCH SX,IRPCNT
|
||
MOVEM SX,RCOUNT
|
||
CALL SKELI1 ;INITIALIZE SKELETON FOR DATA
|
||
HRRZM ARG,@IRPARP ;STORE NEW DS POINTER
|
||
SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT
|
||
LDB C,MRP ;GET LAST CHAR
|
||
CAIN C,","
|
||
SKIPE IRPCF ;IN IRPC
|
||
JRST IRPSE1 ;NO
|
||
MOVEI SX,1 ;FORCE ARGUMENT
|
||
IRPSE1: CALL MREADS
|
||
CAIE C,177 ;SPECIAL?
|
||
AOJA SX,IRPSE2 ;NO, FLAG AS FOUND
|
||
CALL PEEKM ;LOOK AT NEXT CHARACTER
|
||
SETZM IRPSW ;SET IRP SWITCH
|
||
JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT
|
||
JRST IRPPOP ;NO, CLEAN UP AND EXIT
|
||
|
||
IRPSE2: SKIPE IRPCF ;IRPC?
|
||
JRST IRPSE3 ;YES, WRITE IT
|
||
CAIN C,"," ;NO, IS IT A COMMA?
|
||
JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED
|
||
CAIN C,"<" ;"<"?
|
||
ADDI SDEL,1 ;YES, INCREMENT COUNT
|
||
CAIN C,">" ;">"?
|
||
SUBI SDEL,1 ;YES, DECREMENT COUNT
|
||
|
||
IRPSE3: CALL WCHAR
|
||
SKIPN IRPCF ;IRPC?
|
||
JRST IRPSE1 ;NO, GET NEXT CHARACTER
|
||
|
||
IRPSE4: MOVSI CS,(BYTE (7) 177,2)
|
||
CALL WWRXE ;WRITE END
|
||
MOVEM MRP,IRPARG ;SAVE POINTER
|
||
MOVE MRP,RCOUNT ;SAVE COUNT
|
||
MOVEM MRP,IRPCNT
|
||
HRRZ MRP,IRPPOI ;SET FOR NEW SCAN
|
||
AOJA MRP,REPEA8 ;ON ARG COUNT
|
||
|
||
IRPMBI: PUSH P,['MCRISI'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
SKIPN IRPCF ;IRPC?
|
||
JRST [MOVSI RC,[SIXBIT / ILLEGAL SYNTAX IN IRP INSIDE MACRO@/] ;[1066][702]
|
||
JRST IRPERR]
|
||
MOVSI RC,[SIXBIT / ILLEGAL SYNTAX IN IRPC INSIDE MACRO@/] ;[1066][702]
|
||
IRPERR: MOVE AC0,CALNAM ;[702] FETCH MACRO NAME
|
||
CALL EFATAL ;[1066] FATAL ERROR, TYPE PREFIX
|
||
CALL TYPMSG ;OUTPUT MESSAGE
|
||
JUMP1 .+2 ;ONLY COUNT ERROR ONCE
|
||
AOS ERRCNT ;DO DURING PASS 2
|
||
JRST ERRNE2 ;COMMON MESSAGE
|
||
|
||
STOPI0: SKIPN IRPARP ;IRP IN PROGRESS?
|
||
JRST ERRAX ;NO, ERROR
|
||
SETZM IRPSW ;YES, SET SWITCH
|
||
RET
|
||
|
||
IRPEND: MOVE V,@IRPARP
|
||
CALL REFDEC
|
||
SKIPE IRPSW ;MORE TO COME?
|
||
JRST IRPSET ;YES
|
||
|
||
IRPPOP: MOVE V,IRPPOI
|
||
CALL REFDEC ;DECREMENT REFERENCE
|
||
POP MP,RCOUNT
|
||
POP MP,MRP ;RESTORE CELLS
|
||
POP MP,IRPPOI
|
||
POP MP,@IRPARP
|
||
POP MP,IRPCNT
|
||
POP MP,IRPARG
|
||
POP MP,IRPARP
|
||
POP MP,IRPSW
|
||
POP MP,IRPCF
|
||
JRST REPEA8
|
||
|
||
GETDS: ;GET DUMMY SYMBOL NUMBER
|
||
MOVE CS,C ;USE CS FOR WORK REGISTER
|
||
ANDI CS,37 ;MASK
|
||
ADD CS,MACPNT ;ADD BASE ADDRESS
|
||
MOVE V,0(CS) ;GET POINTER FLAG
|
||
JUMPG V,GETDS1 ;BRANCH IF POINTER
|
||
TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?
|
||
JRST RSW0 ;NO, FORGET THIS ARG
|
||
PUSH P,WWRXX
|
||
PUSH P,MWP ;STACK MACRO WRITE POINTER
|
||
PUSH P,WCOUNT ;SAVE WORD COUNT
|
||
CALL SKELI1 ;INITIALIZE SKELETON
|
||
MOVEM ARG,0(CS) ;STORE POINTER
|
||
MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL
|
||
ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED
|
||
TDZ CS,[BYTE (7) 0,170,170,170,170]
|
||
MOVEM CS,LSTSYM
|
||
TLZE CS,774000 ;[1053] ZERO ANY OVERFLOW INTO ".." FIELD
|
||
TRO ER,ERRX ;[1053] X-ERROR FOR EXCEEDING "..7777"
|
||
IOR CS,[ASCII /.0000/]
|
||
MOVEI C,"."
|
||
CALL WCHAR
|
||
CALL WWORD ;WRITE INTO SKELETON
|
||
MOVSI CS,(BYTE (7) 177,2)
|
||
CALL WWRXE ;WRITE END CODE
|
||
POP P,WCOUNT ;RESTORE WORD COUNT
|
||
POP P,MWP ;RESTORE MACRO WRITE POINTER
|
||
POP P,WWRXX
|
||
MOVE V,ARG ;SET UP FOR REFINC
|
||
|
||
GETDS1: CALL REFINC ;INCREMENT REFERENCE
|
||
HRL V,RCOUNT ;SAVE WORD COUNT
|
||
PUSH MP,V ;STACK V FOR DECREMENT
|
||
PUSH MP,MRP ;STACK READ POINTER
|
||
MOVEI MRP,1(V) ;FORM READ POINTER
|
||
JRST RSW0 ;EXIT
|
||
|
||
DSEND: POP MP,MRP
|
||
POP MP,V
|
||
HLREM V,RCOUNT ;RESTORE WORD COUNT
|
||
HRRZS V ;CLEAR COUNT
|
||
CALL REFDEC ;DECREMENT REFERENCE
|
||
JRST RSW0 ;EXIT
|
||
|
||
SKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG
|
||
SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH
|
||
CALL SKELWL ;GET POINTER WORD
|
||
HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS
|
||
HRRZM MWP,LADR ;SAVE START OF LINKED LIST
|
||
HRRZM ARG,1(MWP) ;STORE COUNT
|
||
SOS WCOUNT ;ACCOUNT FOR WORD
|
||
HRRZ ARG,WWRXX ;SET FIRST ADDRESS
|
||
ADDI MWP,2 ;BUMP POINTER
|
||
HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES
|
||
;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)
|
||
|
||
SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?
|
||
RET ;YES, RETURN
|
||
SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS
|
||
JRST SKELW1 ;IF NON-ZERO, UPDATE FREE
|
||
MOVE V,FREE ;GET FREE
|
||
ADDI V,.LEAF ;INCREMENT BY LEAF SIZE
|
||
CAML V,SYMBOL ;OVERFLOW?
|
||
CALL XCEED ;YES, BOMB OUT
|
||
EXCH V,FREE ;UPDATE FREE
|
||
SETZM (V) ;CLEAR LINK
|
||
|
||
SKELW1: HLL V,0(V) ;GET ADDRESS
|
||
HLRM V,NEXT ;UPDATE NEXT
|
||
SKIPE MWP ;IF FIRST TIME
|
||
HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF
|
||
MOVEI MWP,.LEAF ;SIZE OF LEAF
|
||
MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN
|
||
MOVEI MWP,(V) ;SET UP WRITE POINTER
|
||
TLO MWP,(POINT 7,,20) ;2 ASCII CHARS
|
||
RET
|
||
|
||
;WWRXX POINTS TO END OF TREE
|
||
;MWP IDPB POINTER TO NEXT HOLE
|
||
;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
|
||
;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
|
||
;LADR POINTS TO BEG OF LINKED PORTION.
|
||
|
||
GCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE
|
||
GCHAR0: CALL CHARAC ;[1003] GET ASCII CHAR
|
||
CAIE C,FF ;[1003] FF?
|
||
JRST GCHAR1 ;[1003] NO, CHECK RANGE
|
||
PUSH P,C ;[1003] YES, SET IF AT START OF LINE
|
||
MOVE C,CPL ;[1003]
|
||
ADDI C,1 ;[1003] COMPENSATE FOR FF
|
||
CAME C,CPLSAV ;[1003]
|
||
JRST [ POP P,C ;[1003] NO, ALL IS OK
|
||
JRST GCHAR2] ;[1003] CHECK FOR ERRORS, LIST
|
||
POP P,C ;[1003]
|
||
OUTFF3: CALL OUTFF1 ;[1003] COMMON ROUTINE TO SET IOPAGE
|
||
CALL OUTLI ;[1003] CLEAR LBUF
|
||
SOS TAGINC ;[1003] RECOVER CORRECT OFFSET
|
||
RET ;[1003] RETURN WITH FF IN C
|
||
|
||
GCHAR: CALL CHARAC ;GET ASCII CHARACTER
|
||
GCHAR1: CAIG C,FF ;[753] TEST FOR LF, VT OR FF
|
||
CAIGE C,LF
|
||
RET ;NO
|
||
GCHAR2: TRNN ER,ERRORS ;[1003][663] YES, ERRORS?
|
||
JRST OUTIM1 ;[663] NO, NORMAL IMAGE
|
||
TRNN ER,ERROR1 ;[663] ONLY PASS1 ERRORS IN PASS1
|
||
JUMP1 OUTIM1 ;[663]
|
||
TLO FR,IOSCR ;[663] SET IMAGE/CRLF FLAG
|
||
JRST OUTLIN ;[663] OUTPUT LINE, EXIT BY OUTLI1
|
||
|
||
WCHAR: TLNN MWP,760000 ;[664] END OF WORD?
|
||
CALL SKELW ;YES, GET ANOTHER
|
||
IDPB C,MWP ;STORE CHARACTER
|
||
RET
|
||
|
||
WWORD: LSHC C,7 ;MOVE ASCII INTO C
|
||
CALL WCHAR ;[664] STORE IT
|
||
JUMPN CS,WWORD ;TEST FOR END
|
||
RET ;YES, EXIT
|
||
|
||
WWRXE: CALL WWORD ;WRITE LAST WORD
|
||
ADD MWP,WCOUNT ;GET TO END OF LEAF
|
||
SUBI MWP,.LEAF ;NOW POINT TO START OF IT
|
||
HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF
|
||
HRRM MWP,@WWRXX ;SET POINTER TO END
|
||
RET
|
||
|
||
MREAD: CALL MREADS ;READ ONE CHARACTER
|
||
CAIE C,177 ;SPECIAL?
|
||
JRST RSW1 ;NO, EXIT
|
||
CALL MREADS ;YES, GET CODE WORD
|
||
TRZE C,100 ;SYMBOL?
|
||
JRST GETDS ;YES
|
||
CAILE C,5 ;POSSIBLY ILLEGAL
|
||
JRST ERRAX ;YUP
|
||
HRRI MRP,0 ;NO, SIGNAL END OF TEXT
|
||
JRST .+1(C)
|
||
CALL XCEED
|
||
JRST MACEND ;1; END OF MACRO
|
||
JRST DSEND ;2; END OF DUMMY SYMBOL
|
||
JRST REPEND ;3; END OF REPEAT
|
||
JRST IRPEND ;4; END OF IRP
|
||
JRST RSW1 ;5; RUBOUT
|
||
|
||
MREADI: HRLI MRP,700 ;SET UP BYTE POINTER
|
||
MOVEI C,.LEAF-1 ;NUMBER OF WORDS
|
||
MOVEM C,RCOUNT
|
||
MREADS: TLNN MRP,-1 ;FIRST TIME HERE?
|
||
JRST MREADI ;YES, SET UP MRP AND RCOUNT
|
||
TRNN MRP,400000 ;[1061] IF MRP IS ZERO, NEGATIVE OR
|
||
TRNN MRP,-1 ;[1061] GREATER THAN 400000,
|
||
JRST DECERR ;[1061] CONFUSED WHILE EXPANDING (E.G.,
|
||
;[1061] UNQUOTED, UNMATCHED "[","(",ETC)
|
||
TLNN MRP,760000 ;HAVE WE FINISHED WORD?
|
||
SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?
|
||
JRST MREADC ;STILL CHAR. IN LEAF
|
||
HLRZ MRP,1-.LEAF(MRP) ;YES, GET LINK
|
||
HRLI MRP,(POINT 7,,20) ;SET POINTER
|
||
MOVEI C,.LEAF ;RESET COUNT
|
||
MOVEM C,RCOUNT
|
||
MREADC: ILDB C,MRP ;GET CHARACTER
|
||
RET ;[1061]
|
||
|
||
PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ
|
||
CALL CHARAC ;READ AN ASCII CHAR.
|
||
TLO IO,IORPTC ;REPEAT FOR NEXT
|
||
RET ;AND RETURN
|
||
|
||
PEEKM: PUSH P,MRP ;SAVE MACRO READ POINTER
|
||
PUSH P,RCOUNT ;SAVE WORD COUNT
|
||
CALL MREADS ;READ IN A CHAR.
|
||
POP P,RCOUNT ;RESTORE WORD COUNT
|
||
POP P,MRP ;RESET READ POINTER
|
||
RET ;IORPTC IS NOT SET
|
||
|
||
REFINC: AOS 1(V) ;INCREMENT REFERENCE
|
||
RET
|
||
|
||
REFDEC: TRNN V,400000 ;[1061] IF V IS 0, NEGATIVE OR
|
||
TRNN V,-1 ;[1061] GREATER THAN 400000,
|
||
JRST DECERR ;[1061] CATASTROPHIC ERROR SOMEWHERE
|
||
SOS CS,1(V) ;DECREMENT REFERENCE
|
||
TRNE CS,000777 ;IS IT ZERO?
|
||
RET ;NO, EXIT
|
||
CAMGE V,UNITOP ;IS THIS IN UNIV AREA?
|
||
JRST REFINC ;YES, PUT IT BACK, DON'T DELETE
|
||
HRRZ CS,0(V) ;YES, GET POINTER TO END
|
||
HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE
|
||
HLLM CS,0(CS) ;SET LINK
|
||
HRRM V,NEXT ;RESET NEXT
|
||
RET
|
||
|
||
DECERR: PUSH P,['MCREWE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / ERROR WHILE EXPANDING@/] ;[1066]
|
||
JRST IRPERR ;[702] COMMON MESSAGE
|
||
|
||
MPAERR: PUSH P,['MCRMPA'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / MISSING CLOSE PAREN AROUND ARG LIST OF@/] ;[1066]
|
||
JRST IRPERR ;[702] COMMON MESSAGE
|
||
|
||
A== 0 ;ASCII MODE
|
||
AL== 1 ;ASCII LINE MODE
|
||
IB== 13 ;IMAGE BINARY MODE
|
||
B== 14 ;BINARY MODE
|
||
|
||
; == 0 ;USED BY HELPER AND GETSEGS
|
||
CTL== 1 ;CONTROL DEVICE NUMBER
|
||
IFN CCLSW,<CTL2==5> ;INPUT DEV FOR CCL FILE
|
||
BIN== 2 ;BINARY DEVICE NUMBER
|
||
CHAR== 3 ;INPUT DEVICE NUMBER
|
||
LST== 4 ;LISTING DEVICE NUMBER
|
||
UNV== 6 ;SYMBOL TABLE FILE (UNIVERSAL)
|
||
|
||
; COMMAND STRING ACCUMULATORS
|
||
|
||
ACDEV== 1 ;DEVICE
|
||
ACFILE==2 ;FILE
|
||
ACEXT== 3 ;EXTENSION
|
||
ACPPN== 4 ;PPN
|
||
ACDEL== 4 ;DELIMITER
|
||
ACPNTR==5 ;BYTE POINTER
|
||
|
||
TIO== 6
|
||
|
||
TIORW== 1000
|
||
TIOLE== 2000
|
||
TIOCLD==20000
|
||
|
||
DIRBIT==4 ;DIRECTORY DEVICE
|
||
TTYBIT==10 ;TTY
|
||
MTABIT==20 ;MTA
|
||
DTABIT==100 ;DTA
|
||
DISBIT==2000 ;DISPLAY
|
||
CONBIT==20000 ;CONTROLING TTY
|
||
LPTBIT==40000 ;LPT
|
||
DSKBIT==200000 ;DSK
|
||
|
||
;GETSTS ERROR BITS
|
||
|
||
IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)
|
||
IODERR==200000 ;DEVICE DATA ERROR
|
||
IODTER==100000 ;CHECKSUM OR PARITY ERROR
|
||
IOBKTL== 40000 ;BLOCK TOO LARGE
|
||
ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL
|
||
|
||
SYN .TEMP,PPN
|
||
SUBTTL I/O ROUTINES
|
||
|
||
BEG:
|
||
IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION
|
||
TLO IO,ARPGSW> ;ALLOW RAPID PROGRAM GENERATION
|
||
IFN PURESW,<
|
||
MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA
|
||
SETZM LOWL ;ZERO FIRST WORD
|
||
BLT MRP,LOWEND ;AND THE REST
|
||
MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE
|
||
BLT MRP,LOWL+LENLOW> ;MOVE IT IN
|
||
HRRZ MRP,.JBREL ;GET LOWSEG SIZE
|
||
MOVEM MRP,MACSIZ ;SAVE CORE SIZE
|
||
;DECODE VERSION NUMBER
|
||
MOVEI P,JOBFFI ;TEMP PUSH DOWN STACK
|
||
PUSH P,[0] ;MARK BOTTOM OF STACK
|
||
LDB 0,[POINT 3,.JBVER,2] ;GET USER BITS
|
||
JUMPE 0,GETE ;NOT SET IF ZERO
|
||
ADDI 0,"0" ;FORM NUMBER
|
||
PUSH P,0 ;STACK IT
|
||
MOVEI 0,"-" ;SEPARATE BY HYPHEN
|
||
PUSH P,0 ;STACK IT ALSO
|
||
GETE: HRRZ 0,.JBVER ;GET EDIT NUMBER
|
||
JUMPE 0,GETU ;SKIP ALL THIS IF ZERO
|
||
MOVEI 1,")" ;ENCLOSE IN PARENS.
|
||
PUSH P,1
|
||
GETED: IDIVI 0,8 ;GET OCTAL DIGITS
|
||
ADDI 1,"0" ;MAKE ASCII
|
||
PUSH P,1 ;STACK IT
|
||
JUMPN 0,GETED ;LOOP TIL DONE
|
||
MOVEI 0,"(" ;OTHER PAREN.
|
||
PUSH P,0
|
||
GETU: LDB 0,[POINT 6,.JBVER,17] ;UPDATE NUMBER
|
||
JUMPE 0,GETV ;SKIP IF ZERO
|
||
IDIVI 0,^D26 ;MIGHT BE TWO DIGITS
|
||
ADDI 1,"@" ;FORM ALPHA
|
||
PUSH P,1
|
||
JUMPN 0,GETU+1 ;LOOP IF NOT DONE
|
||
GETV: LDB 0,[POINT 9,.JBVER,11] ;GET VERSION NUMBER
|
||
IDIVI 0,8 ;GET DIGIT
|
||
ADDI 1,"0" ;TO ASCII
|
||
PUSH P,1 ;STACK
|
||
JUMPN 0,GETV+1 ;LOOP
|
||
MOVE 1,[POINT 7,VBUF+1,20] ;POINTER TO DEPOSIT IN VBUF
|
||
POP P,0 ;GET CHARACTER
|
||
IDPB 0,1 ;DEPOSIT IT
|
||
JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO
|
||
IFN FORMSW,<IFE DFRMSW,<
|
||
SETOM PHWFMT>> ;HALF WORD UNLESS CHANGED BY SWITCH
|
||
|
||
IFN CCLSW,<
|
||
TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE
|
||
M: TLNN IO,CRPGSW> ;CURRENTLY DOING RPG?
|
||
IFE CCLSW,<M:>
|
||
RESET ;INITIALIZE PROGRAM
|
||
SETZM LITLST ;NOLIST LITERALS INLINE UNLESS CHANGED
|
||
SETZM BLSW
|
||
SETZM IFXLSW
|
||
SETZM MACPRF ;DEFAULT IS OLD WAY
|
||
SETZM BINDEV ;CLEAR IN CASE NOT USED NEXT TIME
|
||
SETZM LSTDEV ;SAME REASON
|
||
SETZM INDEV ;IN CASE OF ERROR
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SETZM DINDEV ;NO STICKY DEVICE
|
||
SETZM DINDIR ;NO STICKY INPUT DIRECTORY
|
||
> ;[1024]
|
||
HRRZ MRP,MACSIZ ;GET INITIAL SIZE
|
||
CORE MRP, ;BACK TO ORIGINAL SIZE
|
||
JFCL ;SHOULD NEVER FAIL
|
||
SKIPE UNIFLG ;[700] DOING RESCAN?
|
||
JRST [SETZB MRP,PASS1U ;[700] YES, SAVE CTLBUF, CLEAR UNIVS
|
||
SETZM UNISIZ ;[700]
|
||
MOVE [XWD UNISIZ,UNISIZ+1] ;[700]
|
||
BLT UWVER ;[700]
|
||
MOVE [XWD PASS1U,PASS1U+1] ;[700]
|
||
JRST CTLS0] ;[700]
|
||
SETZB MRP,PASS1I
|
||
MOVE [XWD PASS1I,PASS1I+1]
|
||
CTLS0: BLT PASS2X-1 ;[700] ZERO THE PASS1 AND PASS2 VARIABLES
|
||
; IFE TOPS20,< ;TOPS20 DEFAULT IS NEW WAY
|
||
; SETOM MACTAB> ;TOPS10 DEFAULT IS OLD WAY
|
||
MOVEI P,JOBFFI ;SET TEMP PUSH-DOWN POINTER
|
||
IFN FORMSW,<
|
||
MOVE CS,PHWFMT ;GET DEFAULT VALUE (PERMANENT)
|
||
MOVEM CS,HWFMT> ;SET IT (TEMP)
|
||
MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE
|
||
MSTIME 2, ;GET TIME FROM MONITOR
|
||
CALL TIMOUT ;TIME FORMAT OUTPUT
|
||
DATE 1, ;GET DATE
|
||
IBP CS ;PASS OVER PRESET SPACE
|
||
CALL DATOUT ;DATE FORMAT OUTPUT
|
||
MOVSI FR,P1!CREFSW
|
||
IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?
|
||
JRST GOSET ;YES, GO READ NEXT COMMAND
|
||
TLNE IO,ARPGSW ;NO, RPG ALLOWED?
|
||
JRST RPGSET ;YES, GO TRY
|
||
CTLSET: RELEASE CTL2,> ;IN CASE OF LOOKUP FAILURE
|
||
IFE CCLSW,<CTLSET:>
|
||
MOVSI IO,IOPALL ;ZERO FLAGS
|
||
INIT CTL,AL ;INITIALIZE USER CONSOLE
|
||
SIXBIT /TTY/
|
||
XWD CTOBUF,CTIBUF
|
||
EXIT ;NO TTY, NO ASSEMBLY
|
||
MOVSI C,'TTY'
|
||
DEVCHR C, ;GET CHARACTERISTICS
|
||
TLNN C,10 ;IS IT REALLY A TTY
|
||
EXIT ;NO
|
||
INBUF CTL,1 ;INITIALIZE SINGLE CONTROL
|
||
OUTBUF CTL,1 ;BUFFERS
|
||
SKIPE UNIFLG ;[700] DOING RESCAN?
|
||
JRST [MOVE AC2,CTL2SV ;[700] YES, GET CHAR COUNT
|
||
SETZM UNIFLG ;[700]
|
||
JRST CTLS3] ;[700] SET PTRS
|
||
CALL CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
|
||
MOVEI C,"*"
|
||
IDPB C,CTOBUF+1
|
||
OUTPUT CTL,
|
||
MOVE AC1,[POINT 7,CTLBUF] ;BYTE POINTER TO STORE COMMAND
|
||
MOVEI AC2,1 ;INITIALIZE CHARACTER COUNT
|
||
CTLS2: SOSGE CTIBUF+2 ;USUAL SOSG LOOP ON TTY INPUT
|
||
INPUT CTL, ;GET NEXT BUFFER
|
||
ILDB 0,CTIBUF+1 ;GET CHARACTER
|
||
CAIL AC2,CTLSIZ ;NUMBER OF CHARS. ALLOWED
|
||
JRST COMERR ;COMMAND LINE TOO LONG
|
||
CAIN 0,CZ ;TEST FOR ^Z
|
||
JRST CZSTOP ;MONRET TYPE EXIT
|
||
IDPB 0,AC1 ;STORE CHAR.
|
||
CAIE 0,33 ;TEST FOR ALTMODE
|
||
CAIG 0,FF ;TEST FOR EOL CHAR
|
||
CAIGE 0,LF ;ONE OF FF, VT, OR LF
|
||
AOJA AC2,CTLS2 ;NOT END OF LINE YET
|
||
MOVEM AC2,CTL2SV ;[700] SAVE CHAR COUNT IN CASE UNIERR
|
||
CTLS3: MOVEM AC2,CTIBUF+2 ;[700] RESET CHAR. COUNT
|
||
MOVE AC1,[POINT 7,CTLBUF] ;BYTE POINTER TO STORE COMMAND
|
||
MOVEM AC1,CTIBUF+1 ;RESET BYTE POINTER
|
||
|
||
IFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE
|
||
|
||
RPGSET:
|
||
IFN TEMP,<HRRZ 3,.JBFF ;GET START OF BUFFER AREA
|
||
HRRZ 0,.JBREL ;GET TOP OF CORE
|
||
CAIGE 0,200(3) ;WILL BUFFER FIT?
|
||
JRST [ADDI 0,200 ;NO, GET ENUF CORE
|
||
CORE 0, ;CORE UUO
|
||
JRST XCEED2 ;FAILED, SO GIVE UP
|
||
JRST .+1] ;CONTINUE
|
||
HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD
|
||
SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT
|
||
HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER
|
||
MOVE 0,[2,,TMPFIL] ;SET UP FOR TEMP CORE READ
|
||
TMPCOR ;READ AND DELETE FILE "MAC"
|
||
JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK
|
||
ADD 3,0 ;CALCULATE END OF BUFFER
|
||
MOVEM 3,.JBFF ;FIX JOBFF SO FILE WONT BE KILLED
|
||
IMULI 0,5 ;CALCULATE CHARACTER COUNT
|
||
ADDI 0,1 ;SINCE SOSG HAPPENS AFTER NOT BEFORE
|
||
MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER
|
||
MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER
|
||
HRLM 0,CTLBLK+1 ;BUFFER HEADER NOW SET UP
|
||
SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE
|
||
JRST RPGS2A ;CONTINUE IN MAIN STREAM
|
||
RPGTMP: SETZM TMPFLG> ;JUST IN CASE
|
||
INIT CTL2,AL ;LOOK FOR DISK
|
||
SIXBIT /DSK/ ;...
|
||
XWD 0,CTLBLK ;...
|
||
JRST CTLSET ;DSK NOT THERE
|
||
HRLZI 3,'MAC' ;###MAC
|
||
MOVEI 3 ;COUNT
|
||
PJOB AC1, ;RETURNS JOB NO. TO AC1
|
||
RPGLUP: IDIVI AC1,12 ;CONVERT
|
||
ADDI AC2,"0"-40 ;SIXBITIZE IT
|
||
LSHC AC2,-6
|
||
SOJG 0,RPGLUP ;3 TIMES
|
||
MOVEM 3,CTLBUF ;###MAC
|
||
HRLZI 'TMP'
|
||
MOVEM CTLBUF+1 ;TMP
|
||
SETZM CTLBUF+3 ;PROG-PRO
|
||
LOOKUP CTL2,CTLBUF ;COMMAND FILE
|
||
JRST CTLSET ;NOT THERE
|
||
HLRM EXTMP ;SAVE THE EXTENSION
|
||
|
||
RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED
|
||
RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES
|
||
SIXBIT /TTY/ ;...
|
||
XWD CTOBUF,0 ;...
|
||
EXIT ;NO TTY, NO ASSEMBLY
|
||
OUTBUF CTL,1 ;SINGLE BUFFERED
|
||
MOVE .JBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN
|
||
MOVEM SAVFF ;...
|
||
HRRZ .JBREL ;TOP OF CORE
|
||
CAMLE MACSIZ ;SEE IF IT HAS GROWN
|
||
MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT
|
||
TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE?
|
||
JRST M ;MUST HAVE COME FROM @ COMMAND, RESET
|
||
|
||
GOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS
|
||
SKIPE UNIFLG ;[700] IF UNIERR DO RESCAN
|
||
JRST [MOVE AC1,[POINT 7,CTLBUF] ;[700] PTR TO STRING
|
||
MOVEM AC1,CTIBUF+1 ;[700]
|
||
MOVE AC2,CTL2SV ;[700] GET COUNT
|
||
MOVEM AC2,CTIBUF+2 ;[700]
|
||
SETZM UNIFLG ;[700]
|
||
JRST GOSET3] ;[700]
|
||
MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE
|
||
MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS
|
||
MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2
|
||
MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS
|
||
MOVEM AC1,CTIBUF+1 ;...
|
||
GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?
|
||
CALL [IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?
|
||
EXIT> ;YES EXIT
|
||
IN CTL2, ;READ ANOTHER BUFFERFUL
|
||
RET ;EVERYTHING OK, RETURN
|
||
STATO CTL2,20000 ;EOF?
|
||
JRST [PUSH P,['MCRECF'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / ERROR READING COMMAND FILE@/] ;[1066]
|
||
JRST ERRFIN] ;GO COMPLAIN
|
||
CALL DELETE ;CMD FILE
|
||
EXIT] ;EOF AND FINISHED
|
||
ILDB C,CTLBLK+1 ;GET NEXT CHAR
|
||
MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS
|
||
TRNE RC,1 ;...
|
||
JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS
|
||
MOVNI RC,5 ;...
|
||
ADDM RC,CTLBLK+2 ;...
|
||
JRST GOSET1 ] ;GO READ ANOTHER CHAR
|
||
JUMPE C,GOSET1 ;IGNORE NULLS
|
||
CAIE C," " ;IGNORE SPACES
|
||
CAIN C,HT ;AND TABS
|
||
JRST GOSET1 ;ALSO, SAVES SPACE AND COMMAND ERROR
|
||
IDPB C,CTIBUF+1 ;STASH AWAY
|
||
AOS CTIBUF+2 ;INCREMENT CHAR. COUNT
|
||
CAIE C,12 ;LINE FEED OR
|
||
CAIN C,175 ;ALTMODE?
|
||
JRST GOSET2 ;YES, FINISHED WITH COMMAND
|
||
CAIE C,176
|
||
CAIN C,33
|
||
JRST GOSET2 ;ALTMODE.
|
||
SOJG CS,GOSET1 ;GO READ ANOTHER
|
||
JRST COMERR ;GO COMPLAIN
|
||
|
||
GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF
|
||
IDPB C,CTIBUF+1 ;...
|
||
MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING
|
||
AOS CTIBUF+2 ;ADD I TO COUNT
|
||
MOVE CTIBUF+2 ;[700] SAVE IN CASE UNIERR
|
||
MOVEM CTL2SV ;[700]
|
||
GOSET3: MOVE SAVFF ;[700] RESET JOBFF FOR NEW BINARY
|
||
MOVEM .JBFF ;...
|
||
JRST BINSET
|
||
|
||
RPGS1: CALL DELETE ;DELETE COMMAND FILE
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
MOVEM ACDEV,RPGDEV ;GET SET TO INIT
|
||
OPEN CTL2,RPGINI ;DO IT
|
||
JRST EINIT ;ERROR
|
||
MOVEM ACFILE,INDIR ;USE INPUT BLOCK
|
||
MOVEM ACPPN,INDIR+3 ;SET PPN
|
||
HLLZM ACEXT,INDIR+1 ;SET FILE EXTENSION
|
||
JUMPN ACEXT,RPGS1A ;EXPLICIT EXTENSION GIVEN, USE IT
|
||
IFE STANSW,<MOVSI ACEXT,'CCL'> ;IF BLANK TRY CCL
|
||
IFN STANSW,<MOVSI ACEXT,'RPG'> ;IF BLANK TRY RPG
|
||
HLLZM ACEXT,INDIR+1 ;STORE DEFAULT EXT
|
||
LOOKUP CTL2,INDIR
|
||
SKIPA ACEXT,INDIR+1 ;FAILED, PICKUP EXT AND ERROR CODE
|
||
JRST RPGS1B ;SUCCESS
|
||
TRNE ACEXT,-1 ;CHECK FOR ERROR CODE OTHER THAN 0
|
||
JRST RPGLOS ;YES, YOU LOSE
|
||
SETZB ACEXT,INDIR+1 ;TRY NULL EXT
|
||
RPGS1A: LOOKUP CTL2,INDIR
|
||
JRST RPGLOS ;TOTAL FAILURE
|
||
> ;END OF TOPS20 EQ CONDITIONAL
|
||
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SKIPN FILNAM ;HAVE A NAME YET?
|
||
CALL NAME1 ;NO GO GET THE NAME
|
||
JFCL ;LET COMPT GENERATE THE ERROR
|
||
MOVE ACPPN,[10,,RPGADR] ;TO GET THE FILE
|
||
COMPT. ACPPN, ;GO GET IT
|
||
JRST RPGLOS ;NOT THERE
|
||
> ;END OF TOPS20 NE CONDITIONAL
|
||
RPGS1B: HLRM ACEXT,EXTMP ;SAVE THE EXTENSION
|
||
HLRZ .JBSA ;RESET JOBFF TO ORIGINAL
|
||
MOVEM .JBFF
|
||
TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD
|
||
JRST RPGS2 ;AND GO
|
||
|
||
RPGLOS: RELEAS CTL2,0
|
||
TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN
|
||
JRST ERRCF ;NO FILE FOUND
|
||
>
|
||
|
||
BINSET: CALL NAME1 ;GET FIRST NAME
|
||
JRST BINSE3 ;NO FILE HERE
|
||
HLLZ ACEXT,ACEXT ;DISALLOW NULL EXTENSION
|
||
IFN CCLSW,<CAIN C,"!" ;WAS THIS AN IMPERATIVE?
|
||
JRST NUNSET ;GET THEE TO A NUNNERY
|
||
CAIN C,"@" ;CHECK FOR A NEW RPG FILE
|
||
JRST RPGS1>
|
||
TLNN FR,CREFSW ;CROSS REF REQUESTED?
|
||
JRST LSTSE1 ;YES, SKIP BINARY
|
||
IFN TOPS20,< ;CODE FOR LONG FILE NAMES
|
||
LDB ACDEV,[POINT 7,FILNAM,6] ;GET FIRST ASCII BYTE
|
||
JUMPE ACDEV,[ CAIN C,"," ;IF NULL AND TERM WITH COMMA
|
||
JRST LSTSET ;THEN GO READ LISTING FILE
|
||
CAIN C,"_" ;IF NULL AND TERM WITH _
|
||
JRST GETSEN ;THEN GO READ INPUT FILE
|
||
JRST M] ;ELSE, START OVER
|
||
CAIE C,CR ;NOT NULL. END IN CR?
|
||
CAIN C,LF ;OR LF?
|
||
JRST [MOVE SDEL,CTL2SV ;[1176] PUT BACK THE BUFFER HEADER INFO
|
||
MOVEM SDEL,CTIBUF+2 ;[1176] FOR THE GETSET ROUTINE
|
||
MOVE SDEL,[POINT 7, CTLBUF] ;[1176]
|
||
MOVEM SDEL,CTIBUF+1 ;[1176]
|
||
JRST GETSET] ;[1176] YES. IT IS AN INPUT FILE
|
||
|
||
> ;END OF TOPS20 CONDITIONAL
|
||
|
||
IFE TOPS20,< ;CONDITIONAL FOR TOPS10 FILES
|
||
CAIN C,"," ;COMMA?
|
||
JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
|
||
CAIN C,"_" ;LEFT ARROW?
|
||
JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
|
||
JUMPE ACDEV,M ;IGNORE IF JUST CR-LF
|
||
> ;END OF TOPS20 EQ CONDITIONAL
|
||
TLO FR,PNCHSW ;OK, SET SWITCH
|
||
IFN TOPS20,< ;CONDITIONAL FOR LONG FILES
|
||
MOVE ACDEV,[10,,BINADR] ;COMPT. ARGS
|
||
COMPT. ACDEV, ;DO UUO
|
||
JRST EINIT1 ;REL FILE OPEN ERROR
|
||
> ;END OF CONDITIONAL NE TOPS20
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
MOVEM ACDEV,BINDEV ;STORE DEVICE NAME
|
||
MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY
|
||
JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?
|
||
MOVSI ACEXT,'REL' ;NO, ASSUME RELOCATABLE BINARY
|
||
MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY
|
||
CAIE ACPPN,SFDADD ;SFD?
|
||
JRST BINSE4
|
||
MOVE ACPPN,[0,,BINSFD] ;RESET POINTER AND
|
||
MOVE AC0,[SFDADD,,BINSFD] ;BLT TO APPROPRIATE BLOCK
|
||
BLT AC0,BINSFD+2+.SFDLN ;
|
||
BINSE4: MOVEM ACPPN,BINDIR+3 ;SET PPN
|
||
OPEN BIN,BININI ;INITIALIZE BINARY
|
||
JRST EINIT ;ERROR
|
||
> ;END OF EQ TOPS20 CONDITIONAL
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SETZM FILNAM ;CLEARED
|
||
MOVEI ACDEV,BIN ;CHANNEL
|
||
MOVEM BINDEV ;FOR DEVCHR
|
||
>
|
||
TLZE TIO,TIOLE ;SKIP TO EOT
|
||
MTEOT. BIN,
|
||
TLZE TIO,TIORW ;REWIND REQUESTED?
|
||
MTREW. BIN, ;YES
|
||
JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE
|
||
MTBSF. BIN, ;BACK-SPACE A FILE
|
||
AOJL CS,.-1 ;TEST FOR END
|
||
MTWAT. BIN,
|
||
STATO BIN,1B24 ;LOAD POINT?
|
||
MTSKF. BIN, ;NO, GO FORWARD ONE
|
||
BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING
|
||
|
||
TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
|
||
UTPCLR BIN, ;YES, CLEAR IT
|
||
OUTBUF BIN,2 ;SET UP TWO RING BUFFER
|
||
BINSE3: CAIN C,"_"
|
||
JRST GETSET ;NO LISTING
|
||
|
||
LSTSET: CALL NAME1 ;GET NEXT DEVICE
|
||
JRST GETSET ;NO FILE HERE
|
||
HLLZ ACEXT,ACEXT ;DISALLOW NULL EXTENSION
|
||
LSTSE1: CAIE C,"_"
|
||
JRST ERRCM
|
||
IFN TOPS20,< ;CONDITIONAL FOR LONG FILE NAMES
|
||
SETZM LSTNAM ;NO DEFAULT LISTING NAME
|
||
HRROI ACDEV,[ASCIZ /LST/] ;DEFAULT EXTENSION
|
||
MOVEM ACDEV,LSTEXT ;TO ARG BLOCK
|
||
> ;END OF NE CONDITIONAL
|
||
TLNE FR,CREFSW ;CROSS-REF REQUESTED?
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
JRST LSTSE2 ;NO, BRANCH
|
||
JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?
|
||
MOVSI ACDEV,'DSK' ;NO, ASSUME DSK
|
||
JUMPN ACFILE,.+2
|
||
MOVE ACFILE,[SIXBIT /CREF/]
|
||
JUMPN ACEXT,.+2
|
||
MOVSI ACEXT,'CRF'
|
||
LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED
|
||
MOVE AC0,ACDEV
|
||
> ;END OF EQ TOPS20 CONDITIONAL
|
||
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
JRST [ LDB ACDEV,[POINT 7,FILNAM,6] ;GET FIRST ASCII BYTE
|
||
JUMPE ACDEV,GETSET ;IF NONE, GO DO INPUT
|
||
JRST LSTSE2] ;IF ONE, USE IT
|
||
HRROI ACDEV,[ASCIZ /CREF/] ;XREF REQUESTED
|
||
MOVEM ACDEV,LSTNAM ;SET UP DEFAULT NAME
|
||
HRROI ACDEV,[ASCIZ /CRF/] ;EXTENSION NAME
|
||
MOVEM ACDEV,LSTEXT ;TO ARG BLOCK
|
||
LSTSE2: MOVE ACDEV,[10,,LSTARG] ;[1024] COMPT. ARGS
|
||
COMPT. ACDEV, ;OPEN FILE
|
||
JRST EINIT2 ;BAD, LST FILE OPEN ERROR
|
||
SETZM FILNAM ;MADE IT
|
||
MOVEI AC0,LST
|
||
MOVEM AC0,LSTDEV ;FOR OTHER GUYS
|
||
> ;END OF CONDITIONAL
|
||
DEVCHR AC0, ;GET CHARACTERISTICS
|
||
TLNE AC0,LPTBIT!DISBIT!TTYBIT
|
||
JRST [ TLNE FR,CREFSW ;[1146] CROSS-REF REQUESTED?
|
||
JRST .+1 ;[1146] NO
|
||
TLC AC0,DSKBIT+MTABIT ;[1146] IF BOTH DSK: AND MTA: THEN
|
||
TLCE AC0,DSKBIT+MTABIT ;[1146] DEVICE IS OK (NUL:)
|
||
JRST ERRCM ;[1146] CAN'T CREF IF NO DIRECTORY
|
||
JRST .+1] ;[1146] DEV WAS NULL, CARRY ON
|
||
AOS OUTSW+0*TTYSW ;[1231] NO, ASSUME TTY
|
||
TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?
|
||
JRST GETSET ;YES, BUFFER ALREADY SET
|
||
MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME
|
||
AOS OUTSW+0*LPTSW ;SET FOR LPT
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
MOVEM ACFILE,LSTDIR ;STORE FILE NAME
|
||
JUMPN ACEXT,.+2
|
||
MOVSI ACEXT,'LST'
|
||
MOVEM ACEXT,LSTDIR+1
|
||
CAIE ACPPN,SFDADD ;SFD?
|
||
JRST LSTSE5
|
||
MOVE ACPPN,[0,,LSTSFD] ;YES, REST POINTER AND
|
||
MOVE AC0,[SFDADD,,LSTSFD] ;BLT TO APPROPRIATE
|
||
BLT AC0,LSTSFD+2+.SFDLN ;
|
||
LSTSE5: MOVEM ACPPN,LSTDIR+3 ;SET PPN
|
||
OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT
|
||
JRST EINIT ;ERROR
|
||
> ;END OF EQ CONDITIONAL
|
||
TLZE TIO,TIOLE
|
||
MTEOT. LST,
|
||
TLZE TIO,TIORW ;REWIND REQUESTED?
|
||
MTREW. LST, ;YES
|
||
JUMPGE CS,LSTSE3
|
||
MTBSF. LST,
|
||
AOJL CS,.-1
|
||
MTWAT. LST,
|
||
STATO LST,1B24
|
||
MTSKF. LST,
|
||
LSTSE3: SOJG CS,.-1
|
||
TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
|
||
UTPCLR LST, ;YES, CLEAR IT
|
||
OUTBUF LST,2 ;SET UP A TWO RING BUFFER
|
||
|
||
IFN TOPS20,<
|
||
GETSEN: SETZM FILNAM ;INIT CODE FOR LONG FILES
|
||
>
|
||
GETSET: MOVEI 3,PDPERR
|
||
HRRM 3,.JBAPR ;SET TRAP LOCATION
|
||
MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW
|
||
APRENB 3,
|
||
SOS 3,PDP ;GET PDP REQUEST MINUS 1
|
||
IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
|
||
HRLZ MP,3
|
||
HRR MP,.JBFF ;SET BASIC POINTER
|
||
MOVE P,MP
|
||
SUB P,3
|
||
MOVEM P,RP ;SET RP
|
||
MOVEM P,SAVERP
|
||
SUB P,3
|
||
IFN POLISH,<
|
||
MOVEM P,POLSTK ;SAVE INITIAL POLISH FIXUP STACK
|
||
MOVEM P,POLPTR ;ONLY CHANGE IF STACK MOVES
|
||
SUB P,3
|
||
>
|
||
ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER
|
||
HRL P,3
|
||
MOVEM P,SAVEPP
|
||
MOVEM MP,SAVEMP
|
||
SUBM P,3 ;COMPUTE TOP LOCATION
|
||
SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN
|
||
JRST GETSE0 ;NO
|
||
HRRZS 3 ;GET TOP OF BUFFERS AND STACKS
|
||
CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE
|
||
JRST [SKIPE MRUNV ;[700] IT WAS, GIVE ERROR IF
|
||
JRST UNIERR ;[700] DISK-RESIDENT UNIVS
|
||
SETOM UNIFLG ;[700] ELSE FORCE REALLOCATION
|
||
JRST M] ;[700]
|
||
SKIPA 3,UNITOP ;DON'T LOSE THEM
|
||
GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN
|
||
HRRZM 3,LADR ;SET START OF MACRO TREE
|
||
HRRZM 3,FREE
|
||
|
||
GETSE1: HRRZ .JBREL
|
||
SUBI 1
|
||
MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE
|
||
SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS
|
||
CAMLE LADR ;HAVE WE ROOM?
|
||
JRST GETSE2 ;YES
|
||
|
||
HRRZ 2,.JBREL ;NO, TRY FOR MORE CORE
|
||
ADDI 2,2000
|
||
CORE 2,
|
||
JRST XCEED2 ;NO MORE, INFORM USER
|
||
JRST GETSE1 ;TRY AGAIN
|
||
|
||
GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE
|
||
HRLI SYMNUM
|
||
BLT @SYMTOP ;STORE SYMBOLS
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE @SYMBOL ;SYMBOL COUNT
|
||
MOVEM SGSCNT ;FOR THIS PSECT
|
||
>
|
||
CALL SRCHI ;INITIALIZE TABLE
|
||
|
||
; ;HERE TO TEST FOR CPU AND SET VALUE IN .CPU.
|
||
;PDP-6 = 1
|
||
;KA-10 = 2
|
||
;KI-10 = 3
|
||
;KL-10 = 4
|
||
MOVEI V,1 ;START WITH PDP-6
|
||
JFCL 1,.+1 ;CLEAR PC CHANGE FLAG
|
||
JRST .+1 ;THEN CHANGE PC
|
||
JFCL 1,.PDP6. ;IF FLAG ON, ITS A PDP6
|
||
HRLOI 1,-2 ;CHECK FOR KA-10
|
||
AOBJP 1,.KA10. ;CHECK CARRY BETWEEN HALVES
|
||
SETZ 1, ;CLEAR AC
|
||
BLT 1,0 ;AND TRY BLT, KI WILL BE 0 AND
|
||
JUMPE 1,.KI10. ;LK WILL HAVE 1,,1
|
||
; JRST .KL10.
|
||
|
||
.KL10.: AOS V
|
||
.KI10.: AOS V
|
||
.KA10.: AOS V
|
||
.PDP6.: MOVE AC0,['.CPU. ']
|
||
MOVEM V,CPUV ;[775] SAVE IT FOR CORE SIZE TYPEOUT
|
||
CALL SSRCH ;SEE IF THERE ALREADY AND IF NOT
|
||
CALL [MOVSI ARG,SYMF!NOOUTF!SUPRBT
|
||
SETZ RC,
|
||
JRST INSERT] ;PUT IT IN TABLE
|
||
|
||
GETPPN V, ;GET LOGGED IN PPN
|
||
JFCL ;ALT. RETURN
|
||
MOVEM V,MYPPN ;AND REMEMBER IR
|
||
; END OF EDIT
|
||
IFN FTPSECT,< ;[575]
|
||
SETZM SGNMAX ;INIT TO ONE .PSECT
|
||
SETZM SGNCUR ;IT IS THE CURRENT .PSECT
|
||
MOVE AC0,[SIXBIT /.LOW./] ;[1165] BLANK PSECT NAME IS .LOW.
|
||
MOVEM AC0,SGNAME ;[1165] SO STORE IT AS SGNAME
|
||
MOVEM AC0,SGLIST ;[1165] AND SGLIST
|
||
MOVSI 1
|
||
MOVEM SGRELC ;SET THE RELOCATION COUNTER
|
||
SETZM SGATTR ;ZERO PSECT BRK AND ATTRS
|
||
SETZM SGDMAX ;ONE .PSECT DEEP
|
||
>
|
||
MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER
|
||
BLT CTLS1 ;FOR RESCAN ON PASS 2
|
||
MOVSI 'DSK' ;SET INPUT TO TAKE DSK AS DEV
|
||
MOVEM ACDEVX
|
||
CALL COUTI ;INIT OUTPUT JUST IN CASE
|
||
CALL INSET ;GET FIRST INPUT FILE
|
||
JRST GETSE3 ;ERROR
|
||
|
||
IFN CCLSW,<TLNE IO,CRPGSW ;BUT ONLY IF DOING RPG
|
||
TTCALL 3,[ASCIZ /MACRO:/] >;PUBLISH COMPILER NAME
|
||
MOVE CS,INDIR ;SET UP NAME OF FIRST FILE
|
||
MOVEM CS,LSTFIL ;AS LAST PRINTED
|
||
SETZM LSTPGN
|
||
JRST ASSEMB ;START ASSEMBLY
|
||
|
||
GETSE3: CALL ERRNE
|
||
JRST ERRFN2 ;[1066] START OVER
|
||
|
||
FINIS: CLOSE BIN, ;DUMP BUFFER
|
||
TLNE FR,PNCHSW ;PUNCH REQUESTED?
|
||
CALL TSTBIN ;YES, TEST FOR ERRORS
|
||
RELEAS BIN,
|
||
CLOSE LST,
|
||
SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?
|
||
CALL TSTLST ;YES, TEST FOR ERRORS
|
||
RELEAS LST,
|
||
RELEAS CHAR,
|
||
MOVE C,CTOBUF+2 ;SKIP OUTPUT IF BUFFER EMPTY
|
||
CAIE C,120 ;[565]
|
||
OUTPUT CTL,0 ;FLUSH TTY OUTPUT
|
||
SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL
|
||
CALL UNISYM ;STORE SYMBOLS ETC. FIRST
|
||
JRST M ;RETURN FOR NEXT ASSEMBLY
|
||
|
||
IFN CCLSW,<
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
NUNSET: JUMPN ACDEV,.+2
|
||
MOVSI ACDEV,'SYS' ;USE SYS IF NONE SPECIFIED
|
||
MOVEM ACDEV,RUNDEV
|
||
MOVEM ACFILE,RUNFIL ;STORE FILE NAME
|
||
SKIPN SFDADD ;ANY SFD'S?
|
||
JRST NUNPP ;NO
|
||
HRLI ACPPN,RUNSFD ;FORM BLT WORD
|
||
MOVSS ACPPN ;BUT WRONG WAY ROUND
|
||
BLT ACPPN,RUNSFD+2+.SFDLN
|
||
MOVEI ACPPN,RUNSFD ;SET UP ADDRESS AGAIN
|
||
NUNPP: MOVEM ACPPN,RUNPP ;IN PPN
|
||
CALL DELETE ;COMMAND FILE
|
||
SETZM RUNFIL+1 ;LET MONITOR CHOOSE EXT
|
||
SETZM RUNFIL+2 ;CLEAR ALSO
|
||
SETZM RUNPP+1 ;ZERO CORE ARG
|
||
MOVEI 16,RUNDEV ;XWD 0,RUNDEV
|
||
TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?
|
||
HRLI 16,1 ;YES. START NEXT AT C(.JBSA)+1
|
||
|
||
;REDUCE THE LOW SEGMENT TO 1K AND DELETE THE HIGH
|
||
;BEFORE THE RUN UUO, SAVES CORE AND TIME
|
||
MOVE 1,[1,,RUNEND-1] ;DELETE HIGH & LOW
|
||
MOVE 2,[RUNHI,,RUNLO]
|
||
BLT 2,RUNDEV-1 ;BLT CODE DOWN
|
||
JRST RUNLO ;GO TO IT
|
||
|
||
RUNHI: PHASE LOWL
|
||
RUNLO:! CORE 1, ;CUT DOWN TO 1K
|
||
JFCL ;TOO BAD
|
||
RUN 16, ;DO "RUN DEV:NAME"
|
||
HALT ;SHOULDN'T RETURN. HALT IF IT DOES
|
||
|
||
RUNDEV:! BLOCK 1
|
||
RUNFIL:! BLOCK 3
|
||
RUNPP:! BLOCK 2
|
||
RUNSFD:! BLOCK 3+.SFDLN
|
||
RUNEND:!
|
||
DEPHASE
|
||
> ;END OF CONDITIONAL
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
NUNSET: CALL DELETE ;GET RID OF COMMAND FILE
|
||
MOVE ACDEV,[4,,RUNARG] ;FOR COMPT.
|
||
COMPT. ACDEV, ;DO IT
|
||
HALT ;LET PA1050 COMPLAIN
|
||
> ;END OF CONDITIONAL
|
||
|
||
DELETE: HRRZ EXTMP ;IF THE EXTENSION
|
||
CAIE 'TMP' ;IS .TMP
|
||
RET ;RETURN.
|
||
CLOSE CTL2, ;DELETE
|
||
SETZB 4,5 ;THE COMMAND FILE.
|
||
SETZB 6,7
|
||
RENAME CTL2,4
|
||
JFCL
|
||
RET
|
||
>
|
||
|
||
INSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER
|
||
HRRM .JBFF ;INFORM SYSTEM OF BUFFER AREA
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SKIPE FILNAM ;ALREADY HAVE A NAME?
|
||
JRST INSET9 ;YES. GO USE IT
|
||
>
|
||
CALL NAME2 ;GET NEXT COMMAND NAME
|
||
RET ;ERROR RETURN IF NONE LEFT
|
||
INSET9: AOS (P) ;SUCCESS
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
MOVEM ACDEV,INDEV ;STORE DEVICE
|
||
MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY
|
||
MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT
|
||
OPEN CHAR,INDEVI
|
||
> ;END OF EQ TOPS20 CONDITIONAL
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
MOVE ACDEV,[10,,INARG] ;COMPT. ARGS
|
||
COMPT. ACDEV, ;OPEN THE FILE
|
||
> ;END OF NE TOPS20
|
||
JRST EINIT ;ERROR
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
MOVEI ACDEV,CHAR ;THE CHANNEL
|
||
MOVEM ACDEV,INDEV ;FAKE THIS AS THE DEVICE CODE
|
||
>
|
||
DEVCHR ACDEV, ;TEST CHARACTERISTICS
|
||
TLNN ACDEV,MTABIT ;MAG TAPE?
|
||
JRST INSET3 ;NO
|
||
TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?
|
||
JRST INSET1 ;NO
|
||
TLNN TIO,TIORW ;YES, REWIND REQUESTED?
|
||
SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE
|
||
INSET1: AOS RECCNT ;INCREMENT FILE COUNTER
|
||
ADDM CS,RECCNT ;UPDATE COUNT
|
||
TLZE TIO,TIOLE
|
||
MTEOT. CHAR,
|
||
TLZE TIO,TIORW ;REWIND?
|
||
MTREW. CHAR, ;YES
|
||
JUMPGE CS,INSET2
|
||
MTBSF. CHAR,
|
||
MTBSF. CHAR,
|
||
AOJL CS,.-1
|
||
MTWAT. CHAR,
|
||
STATO CHAR,1B24
|
||
MTSKF. CHAR,
|
||
INSET2: SOJGE CS,.-1
|
||
|
||
INSET3: INBUF CHAR,1
|
||
MOVEI ACPNTR,JOBFFI
|
||
EXCH ACPNTR,.JBFF
|
||
SUBI ACPNTR,JOBFFI
|
||
MOVEI ACDEL,NUMBUF*203+1
|
||
IDIV ACDEL,ACPNTR
|
||
INBUF CHAR,(ACDEL)
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SETZM FILNAM ;CLEAR THIS FOR NEXT TRY
|
||
>
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK
|
||
MOVSI ACEXT,'MAC' ;BLANK, TRY .MAC FIRST
|
||
CALL INSETI
|
||
INSET4: CALL INSETI
|
||
JUMPE ACEXT,ERRCF ;ERROR IF ZERO
|
||
TLNE ACDEV,TTYBIT ;TELETYPE?
|
||
SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE
|
||
|
||
;DO ALL ENTERS HERE FOR LEVEL D
|
||
SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?
|
||
> ;END OF EQ TOPS20
|
||
JRST ENTRDN ;YES, DON'T DO TWICE
|
||
SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?
|
||
JRST BINSE5 ;NO SO DON'T DO ENTER
|
||
SKIPE ACFILE,LSTDIR ;GET FILE NAME IN CASE OF ERROR
|
||
JRST LSTSE4
|
||
DEVCHR ACEXT,
|
||
TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
|
||
JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE
|
||
SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
|
||
MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO
|
||
LSTSE4: HLLZS ACEXT,LSTDIR+1 ;EXT ALSO
|
||
ENTER LST,LSTDIR ;SET UP DIRECTORY
|
||
JRST ERRCL ;ERROR
|
||
BINSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?
|
||
JRST ENTRDN ;NO
|
||
SKIPE ACFILE,BINDIR ;IN CASE OF ERROR
|
||
JRST BINSE6
|
||
DEVCHR ACEXT,
|
||
TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
|
||
JRST BINSE6 ;YES, GIVE UP BEFORE HARM IS DONE
|
||
SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
|
||
MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO
|
||
BINSE6: HLLZS ACEXT,BINDIR+1
|
||
ENTER BIN,BINDIR ;ENTER FILE NAME
|
||
JRST ERRCB ;ERROR
|
||
|
||
ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE
|
||
MOVE CS,[POINT 7,DEVBUF]
|
||
PUSH P,1 ;SAVE THE ACCS
|
||
PUSH P,2
|
||
PUSH P,3
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
SKIPN 2,INDIR ;GET INPUT NAME
|
||
JRST FINDEV ;FINISHED WITH DEVICE
|
||
SETZ 1, ;CLEAR FOR RECEIVING
|
||
LSHC 1,6 ;SHIFT ONE CHAR. IN
|
||
ADDI 1,40 ;FORM ASCII
|
||
IDPB 1,CS ;STORE CHAR.
|
||
JUMPN 2,.-4 ;MORE TO DO?
|
||
> ;END OF EQ TOPS20
|
||
IFN TOPS20,< ;FOR LONF FILES
|
||
MOVE 1,[3,,[ CHAR,,5 ;GET FILE NAME
|
||
-1,,BIGBUF
|
||
1B8+1B11+1]] ;NAME AND EXTENSION
|
||
COMPT. 1, ;GET THEM
|
||
JFCL
|
||
MOVE 1,[POINT 7,BIGBUF]
|
||
DONME: ILDB 2,1
|
||
JUMPE 2,NOEXT ;ALL DONE THE NAME
|
||
CAIN 2,"." ;TO THE EXT?
|
||
JRST EXXT ;YES
|
||
IDPB 2,CS ;STORE IT
|
||
JRST DONME
|
||
EXXT: MOVEI 3,HT ;SEPARATOR
|
||
IDPB 3,CS ;FOR THE EXTENSION
|
||
DOEXT: ILDB 2,1 ;THE EXTENSION
|
||
JUMPE 2,NOEXT
|
||
IDPB 2,CS ;TO THE OUTPTU
|
||
JRST DOEXT
|
||
NOEXT: DMOVE 1,INRIB+3 ;THE DATE
|
||
DMOVEM 1,INDIR+1 ;FOR THE REST
|
||
MOVEI 1,HT
|
||
IDPB 1,CS
|
||
> ;END OF CONDITIONAL
|
||
IFE TOPS20,<
|
||
MOVEI 1,HT ;SEPARATE BY TAB
|
||
IDPB 1,CS
|
||
HLLZ 2,INDIR+1 ;GET EXT
|
||
JUMPE 2,FINEXT ;NO EXT
|
||
SETZ 1,
|
||
LSHC 1,6 ;SAME LOOP AS ABOVE
|
||
ADDI 1,40
|
||
IDPB 1,CS
|
||
JUMPN 2,.-4
|
||
MOVEI 1,HT
|
||
IDPB 1,CS ;SEPARATE BY TAB
|
||
> ;END OF CONDITIONAL
|
||
FINEXT: LDB 1,[POINT 12,INDIR+2,35] ;GET LOW 12 BITS OF DATE
|
||
LDB 2,[POINT 3,INDIR+1,20] ;GET HIGH 3 BITS OF DATE
|
||
DPB 2,[POINT 3,1,23] ;MERGE TO BITS
|
||
JUMPE 1,FINDEV ;NO DATE?
|
||
CALL DATOUT ;STORE IT
|
||
LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME
|
||
JUMPE 2,FINDEV ;NO TIME (DECTAPE)
|
||
MOVEI 1," " ;SEPARATE BY SPACE
|
||
IDPB 1,CS
|
||
CALL TIMOU1 ;STORE TIME
|
||
FINDEV: SETZ 1,
|
||
MOVEI 2,HT ;FINAL TAB
|
||
IDPB 2,CS
|
||
IDPB 1,CS ;TERMINATE FOR NOW
|
||
POP P,3 ;RESTORE ACCS
|
||
POP P,2
|
||
POP P,1
|
||
SKIPN PAGENO ;IF FIRST TIME THRU
|
||
JRST OUTFF ;START NEW PAGE
|
||
SETZM PAGENO ;ON NEW FILE, RESET PAGES
|
||
JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF
|
||
|
||
INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION
|
||
MOVE ACPPN,INDIR+3 ;SAVE PPN
|
||
LOOKUP CHAR,INDIR
|
||
SKIPA ACEXT,INDIR+1 ;GET ERROR CODE
|
||
JRST CPOPJ1 ;SKIP-RETURN IF FOUND
|
||
TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND
|
||
JRST ERRCF ;FILE THERE BUT NOT READABLE
|
||
SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN
|
||
MOVEM ACPPN,INDIR+3 ;RESTORE PPN
|
||
RET
|
||
|
||
REC2: MOVS [CTIBUF+1,,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)
|
||
BLT CTIBUF+2 ;INPUT BUFFER
|
||
MOVEI "_"
|
||
HRLM ACDELX ;FUDGE PREVIOUS DELIMITER
|
||
SETZM PASS2I
|
||
MOVE [XWD PASS2I,PASS2I+1]
|
||
BLT PASS2X-1 ;ZERO PASS2 VARIABLES
|
||
MOVE AC0,[SIXBIT /.LOW./] ;[1165] REPLACE BLANK PSECT NAME
|
||
MOVEM AC0,SGLIST ;[1165] AS .LOW.
|
||
TLO FR,MTAPSW!LOADSW ;SET FLAGS
|
||
|
||
GOTEND: MOVE INDEV ;GET LAST DEVICE
|
||
DEVCHR ;GET ITS CHARACTERISTICS
|
||
TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)
|
||
JRST EOT ;YES, SO DON'T WASTE TIME
|
||
JRST .+3 ;NO, INPUT BUFFER BY BUFFER
|
||
IN CHAR,
|
||
JRST .-1 ;NO ERRORS
|
||
STATO CHAR,1B22 ;TEST FOR EOF
|
||
JRST .-3 ;IGNORE ERRORS
|
||
|
||
EOT: CALL SAVEXS ;SAVE REGISTERS
|
||
SETOM EOFFLG ;GOING THRU EOF PROCEDURE
|
||
CALL INSET ;GET THE NEXT INPUT DEVICE
|
||
JRST EOT0 ;ERROR
|
||
PUSH P,['MCREP1'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / END OF PASS 1]@/] ;[1066] ASSUME END OF PASS
|
||
TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1
|
||
JRST [HRROI RC,[SIXBIT / LOAD THE NEXT FILE]@/] ;[1066] NOT END OF PASS
|
||
PUSH P,['MCRLNF'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
JRST .+1] ;[1066]
|
||
TLNE ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?
|
||
JRST RSTRXS ;NO
|
||
CALL EINFO ;CR-LF [
|
||
CAMN RC,[-1] ;[1066] IF TEXT SUPPRESSED,
|
||
HRROI RC,[SIXBIT /]@/] ;[1066] FUDGE IN CLOSE BRACKET
|
||
CALL TYPMSG ;YES
|
||
|
||
RSTRXS: MOVSI RC,SAVBLK ;SET POINTER
|
||
BLT RC,RC-1 ;RESTORE REGISTERS
|
||
MOVE RC,SAVERC ;RESTORE RC
|
||
RET ;EXIT
|
||
|
||
SAVEXS: MOVEM RC,SAVERC ;SAVE RC
|
||
MOVEI RC,SAVBLK ;SET POINTER
|
||
BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC
|
||
RET ;EXIT
|
||
|
||
EOT0: JUMP1 [TLON FR,LOADSW ;PRINT MESSAGE ONCE
|
||
CALL ERRNE ;ON PASS1
|
||
JRST EOT1]
|
||
TLO FR,LOADSW ;USED TO SIGNAL POPJ RET FROM ERRNE
|
||
CALL ERRNE ;PRINT ERROR MESSAGE
|
||
EOT1: TLZ IO,IORPTC
|
||
MOVE P,SAVEPP ;RESTORE STACKS
|
||
MOVE MP,SAVERP
|
||
MOVEM MP,RP ;[774]
|
||
MOVE MP,SAVEMP
|
||
CALL END01 ;[774] FAKE END SEEN
|
||
JRST ASSEM1 ;[774] CONTINUE ASSEMBLY AT START OF LINE
|
||
|
||
NAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION
|
||
NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE
|
||
SETZB ACFILE,PPN ;CLEAR FILE AND PPN
|
||
HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER
|
||
SETZB TIO,CS
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR
|
||
SETZM SFDADD ;CLEAR FIRST WORD OF SFD BLOCK
|
||
MOVE AC0,[SFDADD,,SFDADD+1]
|
||
BLT AC0,SFDADD+2+.SFDLN ;AND REST OF IT
|
||
NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER
|
||
> ;END OF EQ TOPS20
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
NAME3: MOVE ACPNTR,[POINT 7,FILNAM] ;ASCII POINTER
|
||
SETZ ACPPN, ;NOT IN A PPN TO START
|
||
>
|
||
SETZ AC0, ;CLEAR SYMBOL
|
||
JRST GETIOC ;GO GET INPUT CHARACTER
|
||
|
||
|
||
SLASH: SETO CS, ;CS=-1 GET RID OF ALPHAS AT END
|
||
CALL SW0
|
||
GETIOC: CALL TTYIN ;GET INPUT CHARACTER
|
||
CAIN C,"/"
|
||
JRST SLASH
|
||
CAIN C,"("
|
||
JRST [ SETZ CS, ;CS=0 EVERY CHAR COUNT
|
||
JRST SWITCH]
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
CAIN C,":"
|
||
JRST DEVICE
|
||
CAIN C,"."
|
||
JRST NAME
|
||
> ;END OF EQ TOPS20
|
||
CALL TRMTST ;TERMINATOR?
|
||
JRST TERM ;YES,
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
CAIE C,OBRCKT ;AN OPEN BRACKET?
|
||
CAIN C,"["
|
||
JRST PROGNP ;GET PROGRAMER NUMBER PAIR
|
||
> ;END OF CONDITIONAL
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
CAIN C,"," ;A COMMA?
|
||
JUMPL ACPPN,INPPN ;YES. IN A PPN?
|
||
> ;END OF EQ TOPS20
|
||
CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW
|
||
TRCA C,142 ;SO MAKE IT A "_" AND SKIP
|
||
CAIE C,","
|
||
CAIN C,"_"
|
||
JRST TERM
|
||
JUMPL C,TERME ;ERROR RETURN FROM TTYIN?
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
CAIGE C,40 ;VALID AS SIXBIT?
|
||
JRST [CAIN C,CZ ;NO,IS IT ^Z
|
||
JRST CZSTOP ;YES,EXIT FOR BATCH
|
||
JRST GETIOC] ;JUST IGNORE
|
||
CAIL C,"0" ;ERROR IF NOT ALPHANUMERIC
|
||
CAILE C,"Z"
|
||
JRST ERRCM
|
||
CAILE C,"9"
|
||
CAIL C,"A"
|
||
CAIA
|
||
JRST ERRCM
|
||
SUBI C,40 ;CONVERT TO 6-BIT
|
||
TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
|
||
IDPB C,ACPNTR ;NO, STORE IT
|
||
JRST GETIOC ;GET NEXT CHARACTER
|
||
> ;END OF EQ TOPS20
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
CAIN C,"[" ;START OF A PPN?
|
||
SETOM ACPPN ;YES. REMEMBER THUIS
|
||
CAIN C,"]" ;END OF A PPN?
|
||
SETZ ACPPN, ;YES. REMEMBER THIS
|
||
CAIN C,CZ ;^Z?
|
||
JRST CZSTOP ;YES
|
||
INPPN: IDPB C,ACPNTR ;NO. SAVE BYTE
|
||
JRST GETIOC ;AND GO GET MORE
|
||
> ;END OF NE TOPS20
|
||
|
||
TRMTST: ;TERMINATOR TEST
|
||
IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPERATIVE?
|
||
CAIN C,"@"
|
||
RET> ;YES, GO DO IT
|
||
CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE
|
||
CAIN C,176 ;...
|
||
RET
|
||
CAIG C,CR ;LESS THAN CR?
|
||
CAIGE C,LF ;AND GREATER THAN LF?
|
||
CAIN C,175 ;OR 3RD ALTMOD
|
||
RET
|
||
CAIN C,";" ;SEMI-COLON?
|
||
RET ;YES,
|
||
JRST CPOPJ1 ;NOT A TERMINATOR, SKIP RETURN
|
||
|
||
DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET
|
||
MOVE ACDEV,AC0 ;DEVICE NAME
|
||
JRST DEVNAM ;COMMON CODE
|
||
|
||
NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET
|
||
MOVE ACFILE,AC0 ;FILE NAME
|
||
DEVNAM: MOVE ACDEL,C ;SET DELIMITER
|
||
JRST NAME3 ;GET NEXT SYMBOL
|
||
|
||
TERME: TLZA C,-1 ;MAKE INTO 33 BUT GIVE ERROR RET
|
||
TERM: AOS (P) ;GIVE SKIP RETURN ON VALID TERMINATOR
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
SETZ ACDEV, ;GET A NULL
|
||
IDPB ACDEV,ACPNTR ;TIE OFF ASCII STRING
|
||
>
|
||
JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME
|
||
CAIN ACDEL,"_" ;...
|
||
JRST TERM1 ;...
|
||
CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
|
||
CAIN ACDEL,"," ;WAS COLON OR COMMA
|
||
TERM1: MOVE ACFILE,AC0 ;SET FILE
|
||
CAIN ACDEL,"." ;IF PERIOD,
|
||
HLLO ACEXT,AC0 ;SET EXTENSION
|
||
HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER
|
||
IFN TOPS20,<RET> ;ALL DONE IF LONG FILES
|
||
JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT
|
||
SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE
|
||
MOVEM ACDEV,ACDEVX ;AND DEVICE
|
||
SKIPN ACPPN,PPN ;PUT PPN IN RIGHT PLACE
|
||
SKIPN PPPN ;DO WE HAVE A DEFAULT?
|
||
JRST TERM2 ;PPN IS SETUP
|
||
|
||
MOVE ACPPN,[PSFD,,SFDADD] ; MOVE DEFAULT SFD
|
||
BLT ACPPN,SFDE
|
||
MOVE ACPPN,PPPN ;AND PPN
|
||
TERM2: CAIN C,"!" ;IMPERATIVE?
|
||
RET ;YES, DON'T ASSUME DEV
|
||
JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,
|
||
JUMPN ACDEV,.+2 ;BUT NO DEVICE
|
||
MOVSI ACDEV,'DSK' ;THEN ASSUME DISK
|
||
RET ;EXIT
|
||
|
||
|
||
CZSTOP: EXIT 1, ;MONRET
|
||
JRST M ;CONTINUE
|
||
|
||
ERRCM: PUSH P,['MCRCME'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / COMMAND ERROR@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
PROGNP: CALL GETOCT ;GET AN OCTAL NUMBER IN RC
|
||
SKIPN RC ;IF ITS 0, USE
|
||
HLRZ RC,MYPPN ;USE LOGGED IN PROJECT NUMBER
|
||
HRLZM RC,PPN ;STORE IT
|
||
CAIE C,"," ;MORE?
|
||
JRST PPNTST ;NO, GIVE UP
|
||
CALL GETOCT ;GET AN OCTAL NUMBER
|
||
SKIPN RC ;IF ITS 0, USE
|
||
HRRZ RC,MYPPN ;MY PROGRAMMER NUMBER
|
||
HRRM RC,PPN ;STORE IT
|
||
CAIE C,"," ;SFD'S?
|
||
JRST PPNTST ;NO
|
||
MOVEI C,SFDADD ;POINT TO DDDSFD BLOCK
|
||
EXCH C,PPN ;SWAP WITH PPN
|
||
MOVEM C,SFDADD+2 ;STORE IT
|
||
MOVEI RC,SFDADD+3 ;START OF SFD AREA
|
||
SFD1: HRRZS RC ;CLEAR BYTE POINTER
|
||
CAILE RC,SFDADD+2+.SFDLN
|
||
JRST ERRCM ;PATH TOO LONG
|
||
HRLI RC,(POINT 6) ;BYTE POINTER SETUP
|
||
SFD2: CALL TTYIN ;GET CHAR
|
||
CAIE C,">" ;ALT FORM
|
||
CAIN C,"]" ;END?
|
||
JRST PPNTST ;YES
|
||
CALL TRMTST ;OR TERMINATOR?
|
||
JRST PPNTST ;YES
|
||
CAIN C,"," ;NEXT SFD
|
||
AOJA RC,SFD1 ;YES, INCREMENT STORE ADDRESS
|
||
SUBI C,40 ;CONVERT TO SIXBIT
|
||
JUMPL C,ERRCM ;ERROR
|
||
TLNE RC,770000 ;SPACE IN WORD
|
||
IDPB C,RC ;YES, STORE CHAR.
|
||
JRST SFD2 ;GET NEXT CHAR
|
||
|
||
GETOCT: SETZ RC, ;START WITH ZERO
|
||
GETOC1: CALL TTYIN
|
||
CAIE C,"," ;TEST FOR COMMA
|
||
CAIN C,"]" ;AND CLOSE SQB
|
||
RET ;YES, WEVE GOT SOMETHING
|
||
CAIN C,">" ;ALSO ALT FORM
|
||
RET
|
||
CALL TRMTST
|
||
RET
|
||
IFE STANSW,<
|
||
CAIL C,"0" ;CHECK FOR VALID NUMBERS
|
||
CAILE C,"7"
|
||
JRST ERRCM ;NOT VALID
|
||
LSH RC,3 ;SHIFT PREVIOUS RESULT
|
||
ADDI RC,-"0"(C)> ;ADD IN NEW NUMBER
|
||
IFN STANSW,<LSH RC,6 ;SHIFT PREVIOUS RESULT
|
||
ADDI RC,-40(C)> ;PUT IN NEW CHARACTER
|
||
JRST GETOC1 ;GET NEXT CHARACTER
|
||
|
||
; HERE TO TEST FOR DEFAULT PPN
|
||
PPNTST: SKIPN ACFILE ;SEEN FILE NAME YET?
|
||
SKIPE AC0 ;OR PENDING
|
||
JRST PPNTS1 ;NO
|
||
PUSH P,AC0 ;GET AN AC
|
||
MOVE AC0,PPN ;GET PPN
|
||
MOVEM AC0,PPPN ;MAKE IT PERMANENT
|
||
MOVE AC0,[SFDADD,,PSFD]
|
||
BLT AC0,PSFDE ;SAME FOR SFDS
|
||
POP P,AC0
|
||
PPNTS1: CALL TRMTST
|
||
JRST TERM
|
||
JRST GETIOC
|
||
; END OF EDIT
|
||
|
||
SWITC0: CALL SW1 ;PROCESS CHARACTER
|
||
SWITCH: CALL TTYIN ;GET NEXT CHARACTER
|
||
CAIE C,")" ;END OF STRING?
|
||
JRST SWITC0 ;NO
|
||
JRST GETIOC ;YES
|
||
|
||
SW0: CALL TTYIN
|
||
SW1: HRREI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC
|
||
JUMPL C,SEELPP ;NUMERIC VALUE MAYBE?
|
||
CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)
|
||
JRST ERRCM ;NO, LT. Z, ERROR
|
||
MOVE RC,[POINT 5,BYTAB]
|
||
IBP RC
|
||
SOJGE C,.-1 ;MOVE TO PROPER BYTE
|
||
LDB C,RC ;PICK UP BYTE
|
||
JUMPE C,ERRCM ;TEST FOR VALID SWITCH
|
||
CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?
|
||
JUMPL P,ERRCM ;NO, TEST FOR SOURCE
|
||
LDB RC,[POINT 4,SWTAB-1(C),12]
|
||
CAIN RC,IO
|
||
SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,
|
||
XCT SWTAB-1(C) ;EXECUTE INSTRUCTION
|
||
SKIPA
|
||
TLZ IO,IOSALL ;TAKE CARE OF /X
|
||
JUMPN CS,SW2 ;DOING A SLASH? IF YES, JUMP
|
||
RET
|
||
|
||
SW2: SETZ CS,
|
||
CALL TTYIN ;NEXT CHAR
|
||
CAIL C,"A"
|
||
CAILE C,"z"
|
||
JRST CPOPJ1 ;SKIP RETURN, SO NOT TO DO ANOTHER TTYIN
|
||
CAILE C,"Z" ;HERE IS BETWEEN A AND z
|
||
CAIL C,"a" ;NOW, IS IT BETWEEN Z AND a?
|
||
JRST SW2+1 ;NO, IT'S ALPHA
|
||
JRST CPOPJ1 ;YES, NOT ALPHA, SKIP RETURN
|
||
|
||
HELP: PUSH P,.JBFF ;SAVE REAL .JBFF
|
||
MOVE 1,.JBREL ;USE JOBREL
|
||
MOVEM 1,.JBFF ;SO HELPER DOESN'T DESTROY SYMBOL TABLE
|
||
MOVE 1,['MACRO '] ;GET MACRO.HLP
|
||
CALL .HELPR ;CALL HELPER
|
||
POP P,.JBFF ;RESTORE JOBFF IN CASE CCL MODE
|
||
JRST M ;RESTART
|
||
|
||
; HERE FOR /nnL SWITCH TO SET LINES/PAGE
|
||
|
||
SEELPP: ADDI C,"A"-"0" ;TO NUMERIC RANGE
|
||
CAIG C,9 ;IS IT
|
||
JUMPGE C,.+2
|
||
JRST ERRCM ;NO, BARF
|
||
MOVE RC,C ;MOVE VALUE
|
||
|
||
SEELP1: CALL TTYIN ;GET NEXT
|
||
CAIG C,"9" ;IS IT NUMERIC
|
||
CAIGE C,"0" ;...
|
||
JRST SEELP2 ;NO, CHECK END
|
||
IMULI RC,^D10 ;MAKE SPACE
|
||
ADDI RC,-"0"(C) ;AND PUT DIGIT
|
||
JRST SEELP1 ;AND CONTINUE
|
||
|
||
SEELP2: CAIE C,"L" ;END PROPERLY?
|
||
JRST ERRCM ;NO, BARF
|
||
SUBI RC,4 ;EASIER FOR SYMBOL OUTPUT ROUTINES
|
||
JUMPL RC,[PUSH P,['MCRATS'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT \ LINES/PAGE ARGUMENT TOO SMALL@\] ;[1066]
|
||
JRST ERRFIN] ;[676] PREVENT INFINITE LOOP
|
||
MOVEM RC,..LPP ;SAVE IN "READ-ONLY"
|
||
RET ;ALL DONE
|
||
|
||
DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION
|
||
J= <"LETTER"-"A">-7*<I=<"LETTER"-"A">/7>
|
||
SETCOD \I,J>
|
||
|
||
DEFINE SETCOD (I,J)
|
||
<BYTAB'I=BYTAB'I!<.-SWTAB>B<5*J+4>>
|
||
|
||
BYTAB0= 0 ;INITIALIZE TABLE
|
||
BYTAB1= 0
|
||
BYTAB2= 0
|
||
BYTAB3= 0
|
||
|
||
SWTAB:
|
||
SETSW Z,<TLO TIO,TIOCLD>
|
||
SETSW C,<TLZ FR,CREFSW>
|
||
SETSW P,<SOS PDP>
|
||
SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
|
||
SETSW A,<ADDI CS,1>
|
||
SETSW B,<SUBI CS,1>
|
||
SETSW E,<TLZ IO,IOPALL!IOSALL>
|
||
IFN FORMSW,< SETSW F,<SETZM HWFMT>
|
||
SETSW G,<SETOM HWFMT>>
|
||
SETSW H,<JRST HELP>
|
||
SETSW L,<TLZ IO,IOMSTR>
|
||
SETSW M,<TLO IO,IOPALL!IOSALL>
|
||
SETSW N,<HLLOS TYPERR>
|
||
SETSW O,<XCT OFFML>
|
||
SETSW Q,<TLO FR,ERRQSW>
|
||
SETSW S,<TLO IO,IOMSTR>
|
||
SETSW T,<TLO TIO,TIOLE>
|
||
SETSW U,<SETOM UNVSKP>
|
||
SETSW W,<TLO TIO,TIORW>
|
||
SETSW X,<TLOA IO,IOPALL>
|
||
IFG .-SWTAB-37,<PRINTX SWITCH TABLE TOO LONG, CHANGE BYTE SIZE>
|
||
|
||
BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB
|
||
;IT CONSIST OF 7 5BIT BYTES/WORD
|
||
;OR ONE BYTE FOR EACH LETTER
|
||
|
||
+BYTAB0 ;A-G BYTE = 1 THROUGH 17 = INDEX
|
||
+BYTAB1 ;H-N BYTE = 0 = COMMAND ERROR
|
||
+BYTAB2 ;O-U
|
||
+BYTAB3 ;V-Z
|
||
|
||
IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2,BYTAB3>
|
||
|
||
TTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?
|
||
JRST TTYERR ;NO
|
||
ILDB C,CTIBUF+1 ;GET CHARACTER
|
||
CAIE C," " ;SKIP BLANKS
|
||
CAIN C,HT ;AND TABS
|
||
JRST TTYIN
|
||
CAIN C,15 ;CR?
|
||
SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE
|
||
CAIG C,"Z"+40 ;CHECK FOR LOWER CASE
|
||
CAIGE C,"A"+40
|
||
RET ;NO,EXIT
|
||
SUBI C,40
|
||
RET ;YES, EXIT
|
||
|
||
COMERR: PUSH P,['MCRCTL'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / COMMAND LINE TOO LONG@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?
|
||
JRST ERRCM ;NO, SO MISSING "_"
|
||
HRROI C,EOL ;SIGNAL ERROR
|
||
RET ;AND RETURN
|
||
|
||
ERRNE: PUSH P,['MCRNES'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / NO END STATEMENT ENCOUNTERED ON INPUT FILE@/] ;[1066]
|
||
ERRNE4: JUMP1 .+2 ;[702] COUNT ERROR ON PASS2
|
||
AOS ERRCNT ;[702]
|
||
ERRNE0: CALL EFATAL ;OUTPUT CR-LF ?MCR
|
||
CALL TYPMSG ;OUTPUT IT
|
||
SKIPE LITLVL ;SEE IF IN LITERAL
|
||
SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALLY
|
||
JRST ERRNE1 ;NO, TRY OTHERS
|
||
MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]
|
||
CAME RC,[-1] ;[1066] SUPPRESS INFO IF REQUIRED BY
|
||
;[1066] MESSAGE LEVEL BITS
|
||
CALL PRNUM ;GO PRINT INFORMATION
|
||
ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES
|
||
SKIPE INDEF
|
||
MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]
|
||
SKIPE INTXT
|
||
MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]
|
||
SKIPE INREP
|
||
MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]
|
||
SKIPE INCND
|
||
MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]
|
||
SKIPGE MACENL
|
||
ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]
|
||
SETOM UNVSKP ;SET /U IN CASE CONTINUE ASSEMBLY
|
||
JUMPN V,ERRNE3
|
||
MOVE V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING
|
||
SKIPE LITLVL ;HAD ONE PAGE NUMBER ALREADY
|
||
RET
|
||
ERRNE3: CAME RC,[-1] ;[1066] SUPPRESS TEXT IF REQUIRED BY
|
||
;[1066] MESSAGE LEVEL BITS
|
||
CALL PRNUM
|
||
TLNE FR,LOADSW ;SEEN END OF FILE YET?
|
||
RET ;YES
|
||
MOVE P,SAVEPP ;NO RESET STACK
|
||
MOVE MP,SAVERP
|
||
MOVEM MP,RP
|
||
MOVE MP,SAVEMP
|
||
SETZ MRP,
|
||
SETZM LBLFLG ;[1074] CLEAR LABEL-IN-LITERAL FLAG
|
||
JRST ASSEM2 ;AND CONTINUE
|
||
|
||
ERRMS1: SIXBIT / ERRORS DETECTED@/
|
||
ERRMS2: SIXBIT /1 ERROR DETECTED@/
|
||
ERRMS3: SIXBIT /NO ERRORS DETECTED@/
|
||
ERRMQ1: SIXBIT /1 WARNING GIVEN@/
|
||
ERRMQ2: SIXBIT / WARNINGS GIVEN@/
|
||
IFE TOPS20,< ;FOR SHORT FILES
|
||
EINIT: PUSH P,['MCRDNA'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE @/]]
|
||
CALL EFATAL ;[1066] OUTPUT PREFIX
|
||
MOVEI C," " ;[1066] FORCE A SPACE
|
||
CALL TYO ;[1066]
|
||
JRST ERRFN1 ;REST OF MESSAGE
|
||
> ;END OF EQ TOPS20
|
||
IFN TOPS20,< ;FOR LONG FILES
|
||
EINIT: OUTSTR [ASCIZ /
|
||
?MCRFNF FILE NOT FOUND-/]
|
||
EINIT0: OUTSTR FILNAM ;AND THE FILE NAME
|
||
OUTSTR [ASCIZ /
|
||
/]
|
||
JRST M ;AND START OVER
|
||
|
||
EINIT1: OUTSTR [ASCIZ/
|
||
?MCRRFO REL FILE OPEN ERROR - /]
|
||
JRST EINIT0
|
||
EINIT2: OUTSTR [ASCIZ/
|
||
?MCRLFO LST FILE OPEN ERROR - /]
|
||
JRST EINIT0
|
||
> ;END OF NE TOPS20 CONDITIONAL
|
||
|
||
ERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE
|
||
JRST .+2 ;GET ERROR MESSAGE
|
||
ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE
|
||
JUMPN RC,ERRTYP
|
||
SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0
|
||
|
||
ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE
|
||
HLLZ ACEXT,INDIR+1 ;SET UP EXT
|
||
|
||
ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?
|
||
SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE
|
||
MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE
|
||
PUSH P,['MCRLRE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
|
||
ERRFIN: CALL EFATAL
|
||
ERRFN1: CALL TYPMSG
|
||
ERRFN2: CLOSE LST, ;[1066] GIVE USER A PARTIAL LISTING
|
||
CLOSE BIN,40 ;BUT NEVER A BUM REL FILE
|
||
JRST M
|
||
|
||
EFATAL: ;[1066]
|
||
IFN CCLSW,<AOS .JBERR> ;RECORD ERROR SO EXECUTION DELETED
|
||
MOVEI CS,"?" ;[1066]
|
||
ECOMMN: SKPINC C ;[1066] SEE IF WE CAN INPUT A CHAR.
|
||
JFCL ;[1066] BUT ONLY TO DEFEAT ^O
|
||
CALL CRLF ;[1066]
|
||
MOVE C,CS ;[1066] GET LEADING CHARACTER
|
||
CALL TYO ;[1066] OUTPUT IT
|
||
IFE TOPS20,< ;[1066] FORCE DEFAULT ON TOPS20
|
||
HRROI C,35 ;[1066] GET MESSAGE LEVEL BITS
|
||
GETTAB C, ;[1066] RETURN THEM IN C
|
||
MOVEI C,0 ;[1066] RETURN ZERO IF ERROR
|
||
TLNN C,700 ;[1066] IF NO BITS SET,
|
||
TLO C,300 ;[1066] SET DEFAULT (PREFIX!FIRST)
|
||
TLNE C,400 ;[1066] IF CONTINUATION,
|
||
TLO C,200 ;[1066] FORCE FIRST
|
||
TLNN C,200 ;[1066] WANT MESSAGE?
|
||
SETOM RC ;[1066] NO, OBLITERATE IT
|
||
TLNN C,100 ;[1066] WANT PREFIX?
|
||
RET ;[1066] NO, EXIT NOW
|
||
> ;[1066] END IFE TOPS20
|
||
MOVE CS,PREFIX ;[1066] OUTPUT PREFIX
|
||
PJRST TYPSYM ;AND RETURN
|
||
|
||
EWARN: MOVEI CS,"%" ;[1066]
|
||
JRST ECOMMN ;[1066] JOIN COMMON ROUTINE
|
||
|
||
EINFO: MOVEI CS,"[" ;[1066]
|
||
JRST ECOMMN ;[1066] JOIN COMMON ROUTINE
|
||
|
||
|
||
[SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE
|
||
TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE
|
||
[SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE
|
||
[SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE
|
||
[SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE
|
||
[SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE
|
||
[SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE
|
||
[SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE
|
||
[SIXBIT /(7) NOT A SAV FILE@/],,ACFILE
|
||
[SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE
|
||
[SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE
|
||
[SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE
|
||
[SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE
|
||
[SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE
|
||
[SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE
|
||
[SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE
|
||
[SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE
|
||
[SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE
|
||
[SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE
|
||
[SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE
|
||
[SIXBIT /(23) SFD NOT FOUND@/],,ACFILE
|
||
[SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE
|
||
[SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE
|
||
[SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE
|
||
|
||
TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE
|
||
|
||
TYPMSG: HLRZ CS,RC ;GET FIRST MESSAGE
|
||
CAIE CS,-1 ;SKIP IF MINUS ONE
|
||
CALL TYPM2 ;TYPE MESSAGE
|
||
HRRZ CS,RC ;GET SECOND HALF
|
||
CAIE CS,-1 ;[1066] SKIP IF -1
|
||
CALL TYPM2
|
||
|
||
CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN
|
||
CALL TYO
|
||
MOVEI C,LF ;AND LINE FEED
|
||
|
||
TYO: SOSG CTOBUF+2 ;BUFFER FULL?
|
||
OUTPUT CTL,0 ;YES, DUMP IT
|
||
IDPB C,CTOBUF+1 ;STORE BYTE
|
||
CAIG C,FF ;FORM FEED?
|
||
CAIGE C,LF ;V TAB OR LINE FEED?
|
||
RET ;NO
|
||
OUTPUT CTL,0 ;YES
|
||
RET ;AND EXIT
|
||
|
||
TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD
|
||
CAIN CS,ACFILE ;FILE NAME ?
|
||
JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT
|
||
LSH ACEXT,-6 ;MAKE SPACE FOR "."
|
||
IOR ACEXT,[SIXBIT /. @/]
|
||
JRST TYPM2A]
|
||
CAIG CS,17 ;IS IT?
|
||
MOVEM C,1(CS)
|
||
TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER
|
||
|
||
TYPM3: ILDB C,CS ;GET A SIXBIT BYTE
|
||
CAIN C,40 ;"@"?
|
||
JRST TYO ;YES, TYPE SPACE AND EXIT
|
||
ADDI C,40 ;NO, FORM 7-BIT ASCII
|
||
CALL TYO ;OUTPUT CHARACTER
|
||
JRST TYPM3
|
||
|
||
TYPSYM: MOVEI C,0 ;CLEAR C
|
||
LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
|
||
JUMPE C,CPOPJ ;TEST FOR END
|
||
ADDI C,40 ;CONVERT TO ASCII
|
||
CALL TYO ;OUTPUT
|
||
JRST TYPSYM ;LOOP
|
||
|
||
;TYPE OUT OCTAL NUMBER (SEE DP1:)
|
||
TYPOCT: IDIVI AC0,^D8 ;[1060]
|
||
HRLM AC1,(P) ;[1060]
|
||
JUMPE AC0,.+2 ;[1060]
|
||
CALL TYPOCT ;[1060]
|
||
HLRZ C,(P) ;[1060]
|
||
ADDI C,"0" ;[1060]
|
||
JRST TYO ;[1060]
|
||
|
||
XCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER
|
||
XCEED: CALL SAVEXS ;SAVE THE REGISTERS
|
||
HRRZ 1,.JBREL ;GET CURRENT TOP
|
||
MOVEI 0,2000(1)
|
||
CORE 0, ;REQUEST MORE CORE
|
||
JRST XCEED2 ;ERROR, BOMB OUT
|
||
HRRZ 2,.JBREL ;GET NEW TOP
|
||
|
||
XCEED1: MOVE 0,0(1) ;GET ORIGIONAL
|
||
MOVEM 0,0(2) ;STORE IN NEW LOCATION
|
||
SUBI 2,1 ;DECREMENT UPPER
|
||
CAMLE 1,SYMBOL ;HAVE WE ARRIVED?
|
||
SOJA 1,XCEED1 ;NO, GET ANOTHER
|
||
MOVEI 1,2000
|
||
ADDM 1,SYMBOL
|
||
ADDM 1,SYMTOP
|
||
CALL SRCHI ;RE-INITIALIZE SYMBOL TABLE
|
||
JRST RSTRXS ;RESTORE REGISTERS AND EXIT
|
||
|
||
XCEED2: PUSH P,['MCRNEC'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT / INSUFFICIENT CORE@/] ;[1066]
|
||
XCEED3: TLO FR,LOADSW ;MAKE SURE IT COMES BACK
|
||
CALL ERRNE0 ;GO PRINT HERE
|
||
JRST ERRFN2 ;[1066] START OVER
|
||
PDPERR: PUSH P,['MCRPDL'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
HRROI RC,[SIXBIT . PDP OVERFLOW, TRY /P@.] ;[1066]
|
||
MOVE P,SAVEPP ;GET A VALID STACK POINTER
|
||
JRST XCEED3 ;DON'T CONTINUE ASSEMBLY
|
||
|
||
PRNUM: HLRZ CS,V ;GET MESSAGE
|
||
CALL TYPM2
|
||
MOVEI CS,[SIXBIT /ON PAGE@/]
|
||
CALL TYPM2
|
||
MOVE AC0,(V) ;GET PAGE
|
||
CALL DP1 ;PRINT NUMBER
|
||
MOVEI C,40
|
||
CALL TYO
|
||
SKIPN AC1,1(V) ;GET SEQ NUM IF THERE
|
||
JRST PRNUM1 ;NO, TRY FOR TAG
|
||
MOVEM AC1,OUTSQ
|
||
MOVEI CS,[SIXBIT /LINE@/]
|
||
CALL TYPM2
|
||
OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER
|
||
OUTSTR OUTSQ ;PRINT SEQUENCE NUMBER
|
||
MOVEI C," " ;ADD SPACE
|
||
CALL TYO
|
||
|
||
PRNUM1: MOVEI CS,[SIXBIT /AT@/]
|
||
CALL TYPM2
|
||
MOVE CS,2(V)
|
||
CALL TYPSYM ;PRINT TAG
|
||
MOVEI CS,[SIXBIT / +@/]
|
||
CALL TYPM2
|
||
HRRZ AC0,3(V) ;[666]
|
||
CALL DP1 ;PRINT DECIMAL INCREMENT
|
||
PJRST CRLF ;END LINE
|
||
|
||
DP1: IDIVI AC0,^D10
|
||
HRLM AC1,(P)
|
||
JUMPE AC0,.+2
|
||
CALL DP1
|
||
HLRZ C,(P)
|
||
ADDI C,"0"
|
||
JRST TYO
|
||
|
||
RIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG
|
||
TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET
|
||
SETSTS BIN,IB ;SET TO IMAGE BINARY MODE
|
||
RET
|
||
|
||
ROUT: EXCH CS,RIMLOC
|
||
SUB P,[XWD 1,1] ;CLEAR OUT STACK WFW
|
||
TLNE FR,R1BSW
|
||
JRST ROUT6
|
||
TLNN FR,RIM1SW
|
||
JRST ROUT1
|
||
JUMPE CS,ROUT1 ;RIM10 OUTPUT
|
||
SUB CS,RIMLOC
|
||
JUMPE CS,ROUT1
|
||
JUMPG CS,ERRAX
|
||
MOVEI C,0
|
||
CALL PTPBIN
|
||
AOJL CS,.-1
|
||
ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT
|
||
HRR C,LOCO ;GET ADDRESS
|
||
TLNE FR,RIM1SW ;NO DATAI IF RIM10
|
||
AOSA RIMLOC
|
||
CALL PTPBIN ;OUTPUT
|
||
MOVE C,AC0 ;CODE
|
||
AOSA LOCO ;INCREMENT CURRENT LOCATION
|
||
|
||
OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE
|
||
PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED
|
||
RET
|
||
SOSG BINBUF+2 ;TEST FOR BUFFER FULL
|
||
CALL DMPBIN ;YES, DUMP IT
|
||
IDPB C,BINBUF+1 ;DEPOSIT BYTE
|
||
RET ;EXIT
|
||
|
||
DMPBIN: OUT BIN,0 ;DUMP THE BUFFER
|
||
RET ;NO ERRORS
|
||
TSTBIN: GETSTS BIN,C ;GET STSTUS BITS
|
||
TRNN C,ERRBIT ;ERROR?
|
||
RET ;NO, EXIT
|
||
MOVE AC0,BINDEV ;YES, GET TAG
|
||
JRST ERRLST ;TYPE MESSAGE AND ABORT
|
||
|
||
DMPLST: OUT LST,0 ;OUTPUT BUFFER
|
||
RET ;NO ERRORS
|
||
TSTLST: GETSTS LST,C ;ANY ERRORS?
|
||
TRNN C,ERRBIT
|
||
RET ;NO, EXIT
|
||
MOVE AC0,LSTDEV
|
||
ERRLST: PUSH P,['MCRWLE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / OUTPUT WRITE-LOCK ERROR DEVICE@/] ;[1066]
|
||
TRNE C,IOIMPM ;IMPROPER MODE?
|
||
JRST ERRFIN ;YES
|
||
PUSH P,['MCRODE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / OUTPUT DATA ERROR DEVICE@/] ;[1066]
|
||
TRNE C,IODERR ;DEVICE DATA ERROR?
|
||
JRST ERRFIN ;YES
|
||
PUSH P,['MCROCP'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/] ;[1066]
|
||
TRNE C,IODTER ;IS IT
|
||
JRST ERRFIN ;YES
|
||
MOVE CS,AC0 ;GET DEVICE
|
||
DEVCHR CS, ;FIND OUT WHAT IT IS
|
||
PUSH P,['MCROQE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / OUTPUT QUOTA EXCEEDED ON DEVICE@/] ;[1066]
|
||
TLNE CS,DSKBIT ;[1206] SKIP IF NOT DSK OUTPUT
|
||
JRST ERRFIN ;[1206] PRINT MESSAGE FOR DISK
|
||
PUSH P,['MCROBL'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / OUTPUT BLOCK TOO LARGE DEVICE@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
R1BDMP: SETCM CS,R1BCNT
|
||
JUMPE CS,R1BI
|
||
HRLZS C,CS
|
||
HRR C,R1BLOC
|
||
HRRI C,-1(C)
|
||
MOVEM C,R1BCHK
|
||
CALL PTPBIN
|
||
HRRI CS,R1BBLK
|
||
R1BDM1: MOVE C,0(CS)
|
||
ADDM C,R1BCHK
|
||
CALL PTPBIN
|
||
AOBJN CS,R1BDM1
|
||
MOVE C,R1BCHK
|
||
CALL PTPBIN
|
||
R1BI: SETOM R1BCNT
|
||
PUSH P,LOCO
|
||
POP P,R1BLOC
|
||
RET
|
||
|
||
ROUT6: CAME CS,RIMLOC
|
||
CALL R1BDMP
|
||
AOS C,R1BCNT
|
||
MOVEM AC0,R1BBLK(C)
|
||
AOS LOCO
|
||
CAIN C,.R1B-1
|
||
CALL R1BDMP
|
||
AOS RIMLOC
|
||
RET
|
||
|
||
|
||
R1BLDR:
|
||
PHASE 0
|
||
IOWD $ADR,$ST
|
||
$ST: CONO PTR,60
|
||
HRRI $A,$RD+1
|
||
$RD: CONSO PTR,10
|
||
JRST .-1
|
||
DATAI PTR,@$TBL1-$RD+1($A)
|
||
XCT $TBL1-$RD+1($A)
|
||
XCT $TBL2-$RD+1($A)
|
||
$A: SOJA $A,
|
||
$TBL1: CAME $CKSM,$ADR
|
||
ADD $CKSM,1($ADR)
|
||
SKIPL $CKSM,$ADR
|
||
$TBL2: JRST 4,$ST
|
||
AOBJN $ADR,$RD
|
||
$ADR: JRST $ST+1
|
||
$CKSM:
|
||
DEPHASE
|
||
|
||
IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
|
||
|
||
READ0: CALL EOT ;END OF TAPE
|
||
|
||
READ: SOSGE IBUF+2 ;BUFFER EMPTY?
|
||
JRST READ3 ;YES
|
||
READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C
|
||
MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER
|
||
TRNN CS,1
|
||
JRST READ1A
|
||
CAMN CS,[<ASCII / />+1] ; HOWEVER IF AN SOS PAGE MARK
|
||
SETZ CS, ;CLEAR SEQ NO. SO LINE NOT COUNTED
|
||
MOVEM CS,SEQNO
|
||
MOVEM CS,SEQNO2
|
||
MOVNI CS,4
|
||
ADDM CS,IBUF+2 ;ADJUST WORD COUNT
|
||
REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO
|
||
CALL READ ;AND THE TAB
|
||
JRST READ ;GET NEXT CHARACTER
|
||
|
||
READ1A: JUMPE C,READ ;IGNORE NULL
|
||
CAIG C,CLA ;[664] CHECK RANGE
|
||
CAIGE C,CZ ;[664]
|
||
RET ;[664] FAST EXIT FOR TYPICAL CASE
|
||
CAIE C,CZ ;IF IT'S A "^Z"
|
||
JRST READ1B ;[554]
|
||
MOVE CS,INDEV ;CHECK DEVICE
|
||
DEVCHR CS, ;[554]
|
||
TLNE CS,10 ;IF TTY,
|
||
MOVEI C,LF ;TREAT IT AS A "LF"
|
||
RET ;EXIT
|
||
READ1B: CAIE C,CLA ;CONTROL _
|
||
RET
|
||
MOVEI C,"^" ;MAKE CONTROL _ VISIBLE
|
||
CALL RSW2
|
||
MOVEI C,"_"
|
||
CALL RSW2
|
||
CALL PEEK ;LOOK AT NEXT CHAR
|
||
CAIG C,CR ;IF IT IS END OF LINE
|
||
CAIGE C,LF
|
||
JRST [POP P,CS ;GET RETURN ADDRESS
|
||
PUSH P,LIMBO ;SAVE NEXT CHAR,RSW1 DESTROYS IT
|
||
MOVEI C,CLA ;RESTORE ^_
|
||
CALL (CS) ;RETURN TO LIST CHAR ETC
|
||
POP P,LIMBO ;SAFE TO STORE NOW
|
||
RET] ;RETURN TO PROGRAM
|
||
TLZ IO,IORPTC ;USE THE CHAR IN C NOW
|
||
JRST READ2A ;BUT DON'T LIST TWICE
|
||
|
||
READ2: CALL READ ;YES, TEST FOR LINE FEED
|
||
CALL RSW2 ;LIST IN ANY EVENT
|
||
READ2A: CAIG C,FF ;IS IT ONE OF
|
||
CAIGE C,LF ;LF, VT, OR FF?
|
||
JRST READ2 ;NO
|
||
CALL OUTIM1 ;YES, DUMP THE LINE
|
||
JRST READ ;RETURN NEXT CHARACTER
|
||
|
||
READ3: IN CHAR,0 ;GET NEXT BUFFER
|
||
JRST READ ;NO ERRORS
|
||
GETSTS CHAR,C
|
||
TRNN C,ERRBIT!2000 ;ERRORS?
|
||
JRST READ0 ;EOF
|
||
MOVE AC0,INDEV
|
||
READ4: PUSH P,['MCRPET'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / INPUT PHYSICAL END OF TAPE DEVICE@/] ;[1066]
|
||
TRNE C,2000
|
||
JRST ERRFIN ;E-O-T
|
||
PUSH P,['MCRMDE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/] ;[1066]
|
||
TRNE C,IOIMPM ;IMPROPER MODE?
|
||
JRST ERRFIN ;YES
|
||
PUSH P,['MCRIDE'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / INPUT DATA ERROR DEVICE@/] ;[1066]
|
||
TRNE C,IODERR ;DEVICE DATA ERROR?
|
||
JRST ERRFIN ;YES
|
||
PUSH P,['MCRICP'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / INPUT CHECKSUM OR PARITY ERROR DEVICE@/] ;[1066]
|
||
TRNN C,IODTER
|
||
PUSH P,['MCRIBL'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / INPUT BLOCK TOO LARGE DEVICE@/] ;[1066]
|
||
JRST ERRFIN
|
||
|
||
OUTTAB: MOVEI C,HT
|
||
JRST OUTL ;[664] AVOID CHECKS
|
||
PRINT: CAIG C,CR ;[664] RANGE CHECK
|
||
CAIGE C,LF ;[664]
|
||
JRST OUTL
|
||
JRST @PRINTB-12(C) ;[664] CALL PROPER ROUTINE
|
||
PRINTB: EXP OUTCR,OUTVT,OUTFF0,OUTCR ;[1003][664]
|
||
|
||
OUTVT: PUSH P,C+1 ;NEED ADJACENT ACC
|
||
MOVEI C,.LPP ;NO. OF LINES WE STARTED WITH
|
||
SUB C,LPP ;MINUS NO. OF LINES LEFT
|
||
IDIVI C,^D20 ;HOW MANY WILL VT TAKE
|
||
SUBI C+1,^D20 ;TO GET TO NEXT TAB STOP
|
||
ADDM C+1,LPP ;ACCOUNT FOR THEM
|
||
POP P,C+1
|
||
MOVEI C,VT ;PUT CHAR BACK
|
||
SKIPLE LPP ;DID WE END PAGE?
|
||
JRST OUTL ;NO, OUTPUT IT
|
||
TLO IO,IOPAGE ;YES, NEXT TIME
|
||
CALL OUTC ;[1003] YES, OUTPUT CHAR
|
||
SETOM CRFLG ;[1003] PAGE NEXT, ADDING CRLF
|
||
RET ;[1003]
|
||
|
||
OUTCR0: CALL OUTAS0 ;[664]
|
||
OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW
|
||
RET
|
||
SETOM CRLFSN ;[1064] SET FLAG IN CASE WE SEE LALL
|
||
MOVEI C,CR ;CARRIAGE RETURN, LINE FEED
|
||
CALL OUTL
|
||
TRNE ER,LPTSW ;[756] GOING TO LISTING?
|
||
JRST OUTCR1 ;[756] YES, COUNT THIS LINE
|
||
TRNN ER,TTYSW ;[756] GOING TO TTY?
|
||
JRST OUTCR2 ;[756] NO, DON'T COUNT IT
|
||
MOVE C,OUTSW ;[756] SEE IF TTY IS LIST DEV
|
||
CAIN C,TTYSW ;[756] IF SO, COUNT IT
|
||
OUTCR1: SOSL LPP ;[756] END OF PAGE?
|
||
JRST OUTCR2 ;[756]
|
||
TLO IO,IOPAGE ;[756] YES, SET FLAG
|
||
SETOM INTPGR ;[756] AND FLAG INTERNAL PAGE REQUEST
|
||
OUTCR2: MOVEI C,LF ;[756] SET LF, EXIT THRU OUTC
|
||
PJRST OUTC ;[756]
|
||
|
||
OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?
|
||
JRST OUTC ;NO
|
||
JUMP1 OUTC ;YES, BYPASS IF PASS ONE
|
||
TLNE IO,IOMSTR+IOPROG ;XLIST IN EFFECT
|
||
JRST [ SKIPN INTPGR ;[655] BYPASS UNLESS IN SALL MACRO AND
|
||
JRST OUTC ;[655] PAGE REQUEST WAS INTERNAL
|
||
TLNE IO,IOSALL ;[655]
|
||
JUMPN MRP,.+1 ;[655]
|
||
SETZM INTPGR ;[655]
|
||
JRST OUTC] ;[655]
|
||
SETZM INTPGR ;[655] CLEAR INT PAGE-REQUEST JUST IN CASE
|
||
PUSH P,C ;SAVE C AND CS
|
||
PUSH P,CS
|
||
PUSH P,ER
|
||
HRR ER,OUTSW
|
||
TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW
|
||
TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)
|
||
JRST .+2
|
||
CALL CLSC3 ;CLOSE IT OUT
|
||
HLLM IO,(P) ;SAVE THIS NEW STATE OF IO
|
||
MOVE C,..LPP
|
||
ADDI C,2 ;PUT BACK THE 2 LINES
|
||
MOVEM C,LPP ;SET NEW COUNTER
|
||
SKIPE CRFLG ;[1003] CRLF NEEDED?
|
||
CALL OUTCR ;[1003] YES,
|
||
MOVEI C,FF
|
||
CALL OUTC ;OUTPUT FORM FEED
|
||
MOVEI CS,TBUF
|
||
CALL OUTAS0 ;OUTPUT TITLE
|
||
MOVEI CS,VBUF
|
||
CALL OUTAS0 ;OUTPUT VERSION
|
||
MOVEI CS,DBUF
|
||
CALL OUTAS0 ;AND DATE
|
||
MOVE C,PAGENO
|
||
CALL DNC ;OUTPUT PAGE NUMBER
|
||
AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?
|
||
JRST OUTL1 ;YES
|
||
MOVEI C,"-" ;NO, PUT OUT MODIFIER
|
||
CALL OUTC
|
||
MOVE C,PAGEN.
|
||
CALL DNC
|
||
OUTL1: CALL OUTCR
|
||
MOVEI CS,DEVBUF
|
||
CALL OUTAS0
|
||
HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE
|
||
SKIPE 0(CS) ;IS THERE A SUB-TITLE?
|
||
CALL OUTTAB ;YES, OUTPUT A TAB
|
||
CALL OUTCR0 ;[664] OUTPUT ASCII WITH CARRIAGE RETURN
|
||
CALL OUTCR
|
||
POP P,ER
|
||
POP P,CS ;RESTORE REGISTERS
|
||
POP P,C
|
||
|
||
OUTC: SETZM CRFLG ;[1003] CLEAR CRLF REQUEST
|
||
TRNE ER,ERRORS!TTYSW
|
||
CALL TYO
|
||
TRNN ER,LPTSW
|
||
RET
|
||
OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?
|
||
CALL DMPLST ;YES, DUMP IT
|
||
IFN STANSW,< CAIN C,"@"
|
||
MOVEI C,140
|
||
CAIN C,"_"
|
||
MOVEI C,30
|
||
CAIN C,"^"
|
||
MOVEI C,32
|
||
CAIE C,"\"
|
||
JRST OUTLSS
|
||
MOVEI C,177
|
||
IDPB C,LSTBUF+1
|
||
JRST OUTLST
|
||
OUTLSS: >
|
||
IDPB C,LSTBUF+1 ;STORE BYTE
|
||
RET ;EXIT
|
||
|
||
OUTFF0: SETOM CRFLG ;[1003] CRLF WILL BE NEEDED
|
||
OUTFF: TLOA IO,IOPAGE
|
||
OUTFF1: CALL PAGE1 ;CLOSE CREF
|
||
OUTFF2: SETOM PAGEN.
|
||
AOS PAGENO
|
||
RET
|
||
|
||
TIMOUT: IDIVI 2,^D60*^D1000
|
||
TIMOU1: IDIVI 2,^D60
|
||
PUSH P,3 ;SAVE MINUTES
|
||
CALL OTOD ;STORE HOURS
|
||
MOVEI 3,":" ;SEPARATE BY COLON
|
||
IDPB 3,CS
|
||
POP P,2 ;STORE MINUTES
|
||
OTOD: IDIVI 2,^D10
|
||
ADDI 2,60 ;FORM ASCII
|
||
IDPB 2,CS
|
||
ADDI 3,60
|
||
IDPB 3,CS
|
||
RET
|
||
|
||
DATOUT: IDIVI 1,^D31 ;GET DAY
|
||
ADDI 2,1
|
||
CAIG 2,^D9 ;TWO DIGITS?
|
||
ADDI 2,7760*^D10 ;NO, PUT IN SPACE
|
||
CALL OTOD ;STORE DAY
|
||
IDIVI 1,^D12 ;GET MONTH
|
||
MOVE 2,DTAB(2) ;GET MNEMONIC
|
||
IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS
|
||
LSH 2,-7 ;SHIFT NEXT IN
|
||
JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS
|
||
MOVEI 2,^D64(1) ;GET YEAR
|
||
JRST OTOD ;STORE IT
|
||
|
||
DTAB: "-naJ-" ;[567]
|
||
"-beF-"
|
||
"-raM-"
|
||
"-rpA-"
|
||
"-yaM-"
|
||
"-nuJ-"
|
||
"-luJ-"
|
||
"-guA-"
|
||
"-peS-"
|
||
"-tcO-"
|
||
"-voN-"
|
||
"-ceD-"
|
||
|
||
; BINARY UNIVERSALS
|
||
;HERE TO WRITE OUT UNIVERSAL SYMBOL FILE
|
||
;SYMBOL TABLE PLUS MACROS
|
||
|
||
UNVOUT: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION
|
||
MOVEM AC0,.JBFF ;INTO JOBFF
|
||
INIT UNV,B ;INIT DSK FOR OUTPUT
|
||
SIXBIT /DSK/
|
||
XWD UNVBUF,0 ;OUTPUT ONLY
|
||
JRST UNVINT ;ERROR
|
||
MOVSI AC0,'UNV' ;STANDARD EXT
|
||
MOVEM AC0,UNVDIR+1
|
||
SETZM UNVDIR+2
|
||
SETZM UNVDIR+3 ;CLEAR PPN
|
||
ENTER UNV,UNVDIR ;ENTER FILE
|
||
JRST UNVENT ;ERROR
|
||
MOVEI SDEL,2*203 ;STANDARD DOUBLE BUFFERING
|
||
ADD SDEL,FREE ;FROM FREE CORE
|
||
CAML SDEL,SYMBOL ;MORE CORE NEEDED?
|
||
CALL XCEED ;YES
|
||
SUBI SDEL,2*203 ;BACK TO START OF BUFFER
|
||
MOVEM SDEL,.JBFF ;SETUP FOR BUFFERS
|
||
OUTBUF UNV,2 ;SET THEM UP
|
||
MOVSI AC1,777 ;SPECIAL MARKER FIRST WORD
|
||
HRR AC1,UWVER ;STORE VERSION NUMBER
|
||
CALL UNVBIN ;LOADER BLOCK 777?
|
||
MOVE AC1,.JBVER ;GET MACRO VERSION NUMBER
|
||
CALL UNVBIN ;AND OUTPUT IT AS THE SECOND WORD
|
||
MOVE AC1,@SYMBOL ;GET NUMBER OF SYMBOLS
|
||
MOVN SDEL,AC1
|
||
HRLZS SDEL
|
||
HRR SDEL,SYMBOL ;FORM AOBJN POINTER
|
||
CALL UNVBIN ;OUTPUT NUMBER OF SYMBOLS
|
||
ADDI SDEL,1 ;BYPASS COUNT
|
||
UNVLUP: MOVE AC1,(SDEL) ;GET SYMBOL
|
||
CALL UNVBIN
|
||
ADDI SDEL,1
|
||
MOVE AC1,(SDEL) ;GET VALUE
|
||
TLNE AC1,SPTR ;SPECIAL EXTERNAL POINTER?
|
||
JRST UNVSPT ;YES
|
||
TLNE AC1,EXTF ;EXTERNAL (BUT NOT SPTR)?
|
||
JRST UNVEXT ;YES, OUTPUT 2 WORDS
|
||
TLNE AC1,MACF ;MACRO
|
||
JRST UNVMAC ;YES, SAVE MACRO TEXT ALSO
|
||
TLNE AC1,PNTF ;ONLY A POINTER TO VALUE?
|
||
JRST UNVPTF ;YES
|
||
CALL UNVBIN ;OUTPUT VALUE
|
||
UNVNXT: AOBJN SDEL,UNVLUP ;FOR ALL SYMBOLS
|
||
RELEASE UNV,
|
||
RET
|
||
|
||
UNVINT: PUSH P,['MCRUWU'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
AOS QERRS ;INCREMENT WARNING COUNT
|
||
MOVE AC0,UNVDIR ;FILNAM IN AC0
|
||
MOVSI RC,[SIXBIT / UNABLE TO WRITE UNIVERSAL FILE@/] ;[1066]
|
||
CALL EWARN ;[1066] NOT FATAL
|
||
PJRST TYPMSG ;TYPE MESSAGE AND EXIT
|
||
|
||
UNVENT: AOS QERRS ;INCREMENT WARNING COUNT
|
||
PUSH P,['MCREFU'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
SETZ RC, ;[1066] ZERO RC FOR TEST AFTER CALL
|
||
CALL EWARN ;[1066] GIVE WARNING
|
||
CAMN RC,[-1] ;[1066] SUPPRESS REST IF REQUIRED BY
|
||
PJRST CRLF ;[1066] MESSAGE LEVEL BITS
|
||
HRRZ RC,UNVDIR+1 ;GET ERROR BITS
|
||
SKIPN RC
|
||
SOS RC ;=0 SPECIAL CASE
|
||
CAIL RC,TABLND-TABLE ;WITHIN BOUND?
|
||
JRST [ HLRZ CS,TABLND ;CATCH-ALL ERR MESS
|
||
JRST .+2]
|
||
HLRZ CS,TABLE(RC) ;REFERENCE TABLE
|
||
CALL TYPM2 ;GIVE APPROPRIATE MESSAGE
|
||
MOVE AC0,UNVDIR ;FILENAME
|
||
MOVSI RC,[SIXBIT /UNIVERSAL FILE@/]
|
||
PJRST TYPMSG ;FINISH OFF AND EXIT
|
||
|
||
;HERE FOR EXTERNAL (NOT SPTR)
|
||
UNVEXT: MOVE AC2,AC1 ;GET POINTER
|
||
HLLZ AC1,AC1 ;CLEAR POINTER
|
||
CALL UNVBIN ;OUTPUT FLAGS
|
||
MOVE AC1,0(AC2) ;GET FIRST WORD (VALUE)
|
||
CALL UNVBIN
|
||
MOVE AC1,1(AC2) ;GET SECOND WORD (SYMBOL)
|
||
CALL UNVBIN
|
||
JRST UNVNXT
|
||
|
||
;HERE FOR 36 BIT VALUE
|
||
UNVPTF: MOVE AC2,AC1 ;GET COPY
|
||
HLLZ AC1,AC1 ;CLEAR POINTER
|
||
CALL UNVBIN ;OUTPUT FLAGS
|
||
MOVE AC1,(AC2) ;GET VALUE
|
||
CALL UNVBIN ;OUTPUT IT
|
||
JRST UNVNXT
|
||
|
||
;HERE FOR SPECIAL EXTERNAL SYMBOL
|
||
UNVSPT: MOVE AC2,AC1 ;COPY POINTER
|
||
HLLZ AC1,AC1 ;CLEAR POINTER
|
||
CALL UNVBIN ;OUTPUT FLAGS
|
||
MOVE AC1,(AC2) ;GET FIRST WORD
|
||
CALL UNVBIN ;STORE VALUE
|
||
MOVE AC1,1(AC2) ;GET RELOCATION WORD
|
||
MOVE AC2,AC1 ;COPY IT
|
||
CALL UNVBIN
|
||
IFN POLISH,<
|
||
JUMPL AC2,UNVWPL ;IF POLISH JUMP
|
||
>
|
||
TRNN AC2,-1 ;RIGHT HALF RELOCATION?
|
||
JRST .+5 ;NO
|
||
MOVE AC1,(AC2) ;GET VALUE
|
||
CALL UNVBIN
|
||
MOVE AC1,1(AC2) ;EXTERNAL SYMBOL
|
||
CALL UNVBIN
|
||
TLNN AC2,-1 ;LEFT HALF RELOCATION?
|
||
JRST UNVNXT ;NO
|
||
HLRZS AC2 ;YES, SWAP
|
||
JRST .-7 ;AND OUTPUT
|
||
|
||
IFN POLISH,<
|
||
|
||
;HERE IF POLISH
|
||
UNVWPL: PUSH P,SDEL ;SAVE ORIGINAL SDEL
|
||
PUSH P,AC2 ;SAVE ORIGINAL AC2
|
||
PUSH P,[-1] ;TO INDICATE THE END OF SAVED POINTERS
|
||
UNVWP1: MOVEM AC2,UNVPOL ;SAVE THE POLISH PTR AT THE BEG OF STACK
|
||
SETZ AC1, ;OUTPUT ZERO FOR 1ST WORD OF OPERATOR PAIR
|
||
CALL UNVBIN ;WRITE IT OUT
|
||
MOVE AC1,1(AC2) ;GET 2ND WORD -- THE OPERATOR
|
||
CALL UNVBIN ;WRITE IT OUT
|
||
MOVE SDEL,DESTB-3(AC1) ;GET # OF OPERANDS FOR THAT OPERATOR
|
||
UNVWP2: ADDI AC2,2 ;NEXT 2 WORDS PAIR
|
||
MOVE AC1,(AC2) ;GET FIRST WORD
|
||
CALL UNVBIN ;WRITE IT OUT
|
||
JUMPN AC1,[ PUSH P,AC1 ;NOT ZERO, MUST BE A POINTER; SAVE IT
|
||
SETZ AC1, ;ZERO FOR 2ND WORD
|
||
JRST UNVWP5]
|
||
MOVE AC1,1(AC2) ;GET 2ND WORD OF THE PAIR
|
||
UNVWP5: CALL UNVBIN
|
||
SOJG SDEL,UNVWP2 ;ANY MORE OPERAND?
|
||
SETZ AC1,
|
||
CALL UNVBIN
|
||
MOVE AC1,UNVPOL
|
||
CALL UNVBIN
|
||
|
||
UNVWP3: POP P, AC2 ;NO, ANY PTRS SAVED ON STACK?
|
||
CAME AC2,[-1] ;END OF SAVED PTRS?
|
||
JRST UNVWP4 ;NO, GO CHECK PTR
|
||
POP P, AC2 ;YES, RESTORE ORIGINAL AC2 COMING INTO UNVWPL
|
||
POP P,SDEL ;RESTORE ORIGINAL SDEL
|
||
JRST UNVNXT
|
||
|
||
UNVWP4: JUMPL AC2,UNVWP1 ;IF IT'S POLISH JUMP
|
||
MOVE AC1,(AC2) ;GET 1ST WORD
|
||
CALL UNVBIN
|
||
SKIPE AC1
|
||
PUSH P,AC2
|
||
MOVE AC1,1(AC2)
|
||
CALL UNVBIN
|
||
JRST UNVWP3
|
||
;NUMBER OF OPERANDS FOR EACH OPERATOR
|
||
DESTB: EXP 2,2,2,2,2,2,2,2,1,2,1,2,1,100
|
||
|
||
>
|
||
|
||
;HERE FOR MACRO
|
||
UNVMAC: MOVE AC2,AC1 ;GET POINTER TO TEXT
|
||
HLLZ AC1,AC1 ;CLEAR POINTER
|
||
CALL UNVBIN ;OUTPUT FLAGS
|
||
HLRZ AC1,1(AC2) ;GET DEFAULT VALUES, IF ANY
|
||
MOVEM AC1,UNVDFA ;SAVE STARTING ADRESS
|
||
CALL UNVMCP ;GO DUMP MACRO ITSELF
|
||
SKIPN AC2,UNVDFA ;SEE IF ANY DEFAULT VALUES (LEFT)
|
||
JRST UNVNXT ;NO, CONTINUE WITH NEXT SYMBOL
|
||
HRROI AC1,(AC2) ;SET UP AOBJP POINTER FOR # OF DEFAULTS
|
||
SKIPE (AC1) ;ARE THERE ANY MORE?
|
||
AOBJP AC1,.-1 ;YES, COUNT AND TRY NEST
|
||
CALL UNVBIN ;OUTPUT COUNT WORD
|
||
UNVMC1: HLRZ AC1,(AC2) ;GET THE AGUMENT # OF THIS DEFAULT
|
||
CALL UNVBIN ;OUTPUT THE ARGUMENT NUMBER
|
||
MOVE AC2,(AC2) ;GET ADDRESS OF DEFAULT
|
||
CALL UNVMCP ;GO OUTPUT, IT LOOKS LIKE MACRO
|
||
AOS AC2,UNVDFA ;UP POINTER TO DEFAULT BLOCK
|
||
SKIPE (AC2) ;SEE IF ANY MORE
|
||
JRST UNVMC1 ;YES, GO WRITE THEM OUT
|
||
JRST UNVNXT ;NO, GO DO NEXT SYMBOL
|
||
|
||
UNVMCP: HLL AC2,(AC2) ;PUT ADDRESS OF NEXT BLOCK IN LEFT
|
||
QQ==0
|
||
REPEAT .LEAF,<
|
||
MOVE AC1,QQ(AC2)
|
||
CALL UNVBIN
|
||
QQ==QQ+1>
|
||
HLRZS AC2
|
||
JUMPN AC2,UNVMCP ;MORE LEAFS TO PROCESS
|
||
RET ;RETURN
|
||
|
||
UNVBIN: SOSG UNVBUF+2
|
||
CALL DMPUNV
|
||
IDPB AC1,UNVBUF+1
|
||
RET
|
||
|
||
DMPUNV: OUT UNV,0
|
||
RET
|
||
GETSTS UNV,C ;GET STATUS BITS
|
||
TRNN C,ERRBIT ;ERRORS?
|
||
RET ;NO, EXIT
|
||
MOVSI AC0,'DSK' ;DEVICE ALWAYS DSK
|
||
JRST ERRLST ;GIVE ERROR MESSAGE
|
||
|
||
;HERE TO READ IN UNIVERSAL SYMBOL TABLE
|
||
|
||
UNVINP: MOVEM AC0,UNVDIR ;FILE WE NEED
|
||
PUSH P,AC0 ;SAVE REAL NAME OF UNV
|
||
MOVSI AC1,'DSK' ;DEFAULT DEVICE
|
||
MOVEM AC1,UNVDEV
|
||
MOVSI AC1,'UNV' ;REQUIRED EXT
|
||
MOVEM AC1,UNVDIR+1
|
||
SETZM UNVDIR+2
|
||
SETZM UNVDIR+3
|
||
CAIE C,'(' ;SEE IF USER SUPPLIED FILE SPEC
|
||
JRST UNVOPN ;NO, USE DEFAULT
|
||
CALL SCHGET ;GET A NAME
|
||
CAIE C,':' ;IS IT A DEVICE?
|
||
JRST UNVCKN ;NO TRY NAME
|
||
MOVEM AC0,UNVDEV ;YES, SAVE DEVICE
|
||
CALL SCHGET ;TRY NEXT NAME
|
||
UNVCKN: MOVEM AC0,UNVDIR ;SAVE NAME
|
||
CAIE C,'.' ;DOES EXT FOLLOW?
|
||
JRST .+3 ;NO
|
||
CALL SCHGET ;YES, GET IT
|
||
MOVEM AC0,UNVDIR+1 ;AND STORE IT
|
||
CAIE C,'[' ;A DIRECTORY SPECIFIED?
|
||
JRST SCHCLP ;NO
|
||
CALL SCHOCT ;GET PPN
|
||
HRLZM AC0,UNVDIR+3 ;AND SAVE IT
|
||
CAIE C,',' ;CHECK PROG NO.
|
||
TROA ER,ERRQ ;WARN USER
|
||
CALL SCHOCT ;GET IT
|
||
HRRM AC0,UNVDIR+3
|
||
CAIE C,',' ;AN SFD GIVEN?
|
||
JRST SCHCLB ;NO
|
||
MOVEI AC0,UNVPTH ;GET PATH PTR
|
||
EXCH AC0,UNVDIR+3 ;SWAP WITH PPN
|
||
MOVEM AC0,UNVPTH+2 ;AND PUT IN PATH
|
||
MOVSI RC,-.SFDLN ;AOBJN PTR FOR SFDS
|
||
SCHSFD: CALL SCHGET ;GET SFD NAME
|
||
AOBJP RC,SCHCLB+1 ;SEE IF ENOUGH ROOM
|
||
MOVEM AC0,UNVPTH+2(RC) ;YES, STORE
|
||
CAIN C,',' ;DOES PATH CONTINUE ON?
|
||
JRST SCHSFD ;YES
|
||
SCHCLB: CAIE C,']' ;DOES PATH FINISH PROPERLY?
|
||
TROA ER,ERRQ ;NO
|
||
CALL BYPASS ;[664] EAT UP THE "]"
|
||
SCHCLP: CAIE C,')' ;FILE SPEC END PROPERLY?
|
||
TROA ER,ERRQ ;NO
|
||
CALL BYPASS ;[664] EAT IT
|
||
UNVOPN: POP P,AC0 ;UNV NAME BACK IN 0
|
||
OPEN UNV,UNVINI ;TRY USER SPECIFICATION
|
||
JRST UNVUNV ;FAILED
|
||
LOOKUP UNV,UNVDIR ;SEE IF THERE
|
||
JRST UNVUNV ;TRY UNV:
|
||
MOVEM AC0,UNVDIR ;RESTORE NAME OF UNV
|
||
UNVFND: MOVE RC,UNIVNO ;[1002] GET NUM OF CURRENT UNIV TABLES IN CORE
|
||
CAILE RC,.UNIV-1 ;[1002] SEE IF ROOM IN TABLES
|
||
JRST UNVERR ;NO, GIVE ERROR
|
||
SKIPN UNIVSN ;IS CURRENT PROG A UNIVERSAL
|
||
JRST UNVNOT ;NO
|
||
CAIL RC,.UNIV-1 ;[1002] YES, ROOM FOR IT AS WELL?
|
||
JRST UNVERR ;NO
|
||
MOVE AC1,UNITBL+1(RC) ;[1002] GET CURRENT NAME
|
||
MOVEM AC1,UNITBL+2(RC) ;[1002] STORE IT IN NEXT SLOT
|
||
UNVNOT: PUSH P,AC0 ;[1002] SAVE NAME
|
||
HLRE SDEL,UNVDIR+3 ;GET SIZE OF FILE
|
||
MOVMS SDEL ;IN WORDS
|
||
ADD SDEL,FREE ;AT TOP OF FREE CORE
|
||
HRRZM SDEL,UNIPTR+1(RC) ;[1002] SAVE NEW SYMTOP (IN WRONG HALF)
|
||
ADDI SDEL,2*203 ;PLUS 2 BUFFERS
|
||
CAML SDEL,SYMBOL ;WILL IT FIT?
|
||
CALL XCEED ;NO, TRY FOR MORE
|
||
CAML SDEL,SYMBOL ;DID WE GET ENOUGH?
|
||
JRST .-2 ;NO TRY AGAIN
|
||
SUBI SDEL,2*203 ;START OF BUFFERS
|
||
MOVEM SDEL,.JBFF
|
||
INBUF UNV,2 ;STANDARD DOUBLE BUFFERING
|
||
CALL UNVREAD ;READ
|
||
TLC AC1,777 ;[1002] LEFT HALF OF FIRST WORD OF UNV FILE
|
||
TLCE AC1,777 ;[1002] MUST BE A 777 MARKER
|
||
JRST UNVFAKE ;[1002] ERROR FOR FAKE UNV
|
||
TLNE AC1,777000 ;[1002]
|
||
JRST UNVFAKE ;[1002] ERROR
|
||
AOS RC,UNIVNO ;[1002] BUMP COUNT OF UNIVERSALS
|
||
POP P,UNITBL(RC) ;[1002] ADD NAME TO TABLE
|
||
HRRZS AC1 ;GET UNV VERSION #
|
||
SETOM UNVER% ;KLUDGE SWITCH TO ALLOW VERSION 4
|
||
CAIE AC1,4 ;SEE IF 4 (MIGHT BOMB DEFAULT ARGUMENTS)
|
||
AOS UNVER% ;NO, UNVER% IS 0 FOR GOOD FILES
|
||
TRNE AC1,.URVER ;MAKE SURE EXTRA BITS ARE NOT ON
|
||
JRST VERSKW ;YOU LOSE
|
||
TRNE AC1,UMACV ;MACRO VERSION EXPECTED?
|
||
CALL UNVREAD ;YES, SKIP OVER IT
|
||
CALL UNVREAD ;READ SYMBOL COUNT (SECOND WORD)
|
||
MOVE SDEL,AC1 ;GET COPY
|
||
LSH SDEL,1 ;TWO WORDS PER SYMBOL
|
||
ADDI SDEL,1 ;PLUS ONE FOR COUNT
|
||
MOVNS SDEL ;NEGATE
|
||
MOVE AC2,SDEL ;STORE IT
|
||
ADD AC2,UNIPTR(RC) ;ADD SYMTOP
|
||
HRLM AC2,UNIPTR(RC) ;TO FORM SYMBOL
|
||
MOVSS UNIPTR(RC) ;NOW PUT IN CORRECT HALVES
|
||
MOVN SDEL,AC1 ;GET NO. OF SYMBOLS
|
||
HRLZ SDEL,SDEL ;TO FORM AOBJN POINTER
|
||
HRR SDEL,AC2 ;POINT TO WHERE TO STORE THEM
|
||
MOVEM AC1,(SDEL) ;STORE COUNT
|
||
ADDI SDEL,1 ;AND GET PAST IT
|
||
|
||
UNVRLO: CALL UNVREAD ;GET A SYMBOL
|
||
MOVEM AC1,(SDEL) ;STORE IT
|
||
ADDI SDEL,1 ;INCREMENT PAST IT
|
||
CALL UNVREAD ;GET VALUE
|
||
MOVEM AC1,(SDEL) ;STORE IT
|
||
TLNE AC1,SPTR ;SPECIAL EXTERNAL POINTER?
|
||
JRST UNVRSP ;YES
|
||
TLNE AC1,EXTF ;EXTERNAL (NOT SPTR)?
|
||
JRST UNVREX ;YES
|
||
TLNE AC1,MACF ;MACRO?
|
||
JRST UNVRMC ;YES
|
||
TLNE AC1,PNTF ;36 BIT VALUE
|
||
JRST UNVRPT ;YES
|
||
UNVRNX: AOBJN SDEL,UNVRLO ;GET NEXT
|
||
RELEASE UNV,
|
||
MOVE RC,UNIVNO ;POINT TO LAST ENTRY
|
||
MOVE AC1,UNITBL+1(RC) ;GET NAME IN CASE IN UNIV NOW
|
||
SKIPE UNIVSN ;ARE WE?
|
||
MOVEM AC1,UNVDIR ;YES, RESET NAME OF OUTPUT FILE
|
||
IFN FTPSECT,< ;[575]
|
||
PUSH P,SGSBOT
|
||
PUSH P,SGSTOP
|
||
PUSH P,SGSCNT
|
||
PUSH P,SGNCUR
|
||
>
|
||
PUSH P,SYMBOL
|
||
PUSH P,SYMTOP ;SAVE EXISTING VALUES
|
||
PUSH P,SRCHX
|
||
MOVE AC1,UNIPTR(RC) ;GET SYMTOP,,SYMBOL
|
||
HLRZM AC1,SYMTOP
|
||
HLRZM AC1,FREE ;DON'T FORGET TO SET FREE BEYOND SYMTOP
|
||
HRRZM AC1,SYMBOL
|
||
HLRZ AC1,AC1 ;TOP LOCATION
|
||
MOVEM AC1,UNITOP ;SAVE NEW TOP FOR UNIVERSALS
|
||
CAMLE AC1,MACSIZ ;HAVE WE INCREASED?
|
||
MOVEM AC1,MACSIZ ;YES, STOP ILL MEM REFS
|
||
IFN FTPSECT,< ;[575]
|
||
SETZM SGNCUR
|
||
MOVE AC0,@SYMBOL
|
||
MOVEM AC0,SGSCNT
|
||
>
|
||
CALL SRCHI ;SETUP SEARCH POINTER
|
||
MOVE AC1,SRCHX ;LOAD IT
|
||
MOVEM AC1,UNISHX(RC) ;SAVE IT
|
||
POP P,SRCHX ;RESTORE
|
||
POP P,SYMTOP
|
||
POP P,SYMBOL
|
||
IFN FTPSECT,< ;[575]
|
||
POP P,SGNCUR
|
||
POP P,SGSCNT
|
||
POP P,SGSTOP
|
||
POP P,SGSBOT
|
||
>
|
||
JRST SERCH1 ;AND RETURN
|
||
|
||
;HERE FOR 36 BIT VALUE
|
||
UNVRPT: CALL UNVREAD
|
||
AOS AC2,FREE ;GET A FREE LOC
|
||
SUBI AC2,1
|
||
MOVEM AC1,(AC2) ;STORE IT
|
||
HRRM AC2,(SDEL) ;FIXUP SYMBOL POINTER
|
||
JRST UNVRNX ;GET NEXT
|
||
|
||
;HERE FOR EXTERNAL (NOT SPTR)
|
||
UNVREX: MOVEI AC2,2 ;NEED 2 LOCS
|
||
ADDB AC2,FREE
|
||
SUBI AC2,2 ;POINT TO START OF 2 WORDS
|
||
CALL UNVREAD ;GET VALUE
|
||
MOVEM AC1,0(AC2) ;MOST LIKELY 0
|
||
CALL UNVREAD ;GET NAME
|
||
MOVEM AC1,1(AC2)
|
||
HRRM AC2,(SDEL) ;POINT TO VALUE
|
||
JRST UNVRNX ;GET NEXT
|
||
|
||
;HERE FOR SPECIAL EXTERNAL SYMBOL
|
||
UNVRSP: CALL UNVR2W ;GET 2 LOCATIONS
|
||
CALL UNVREAD ;GET VALUE
|
||
MOVEM AC1,(AC2)
|
||
CALL UNVREAD ;GET RELOCATION
|
||
HRRM AC2,(SDEL) ;STORE POINTER
|
||
MOVEI RC,1(AC2) ;POINT TO RELOCATION WORD
|
||
SETZM (RC) ;CLEAR RELOCATION
|
||
IFN POLISH,<
|
||
JUMPL AC1,UNVRPL ;JUMP IF IT'S POLISH
|
||
>
|
||
MOVE AC2,AC1 ;STORE PREVIOUS RELOCATION
|
||
TRNN AC2,-1 ;RIGHT HALF RELOCATION?
|
||
JRST UNVRS2 ;NO
|
||
HRR AC2,FREE ;POINT TO NEXT 2 WORD BLOCK
|
||
HRRM AC2,(RC) ;POINT TO BLOCK (RELOCATION)
|
||
UNVRS1: CALL UNVREAD ;GET VALUE
|
||
MOVEM AC1,(AC2)
|
||
CALL UNVREAD ;GET EXTERNAL SYMBOL
|
||
MOVEM AC1,1(AC2)
|
||
HRRI AC2,2(AC2) ;INCREMENT RIGHT HALF BY 2 WORDS USED
|
||
HRRZM AC2,FREE ;INCREMENT FREE
|
||
UNVRS2: TLZN AC2,-1 ;LEFT HALF RELOCATION?
|
||
JRST UNVRNX ;NO, GET NEXT SYMBOL
|
||
HRR AC2,FREE ;[1230] POINT TO NEXT 2 WORD BLOCK
|
||
HRLM AC2,(RC) ;FIX LEFT RELOCATION
|
||
JRST UNVRS1 ;AND FILL IN VALUE
|
||
|
||
UNVR2W: MOVEI AC2,2 ;GET 2 LOCATIONS
|
||
ADDB AC2,FREE ;FROM FREE CORE
|
||
SUBI AC2,2 ;POINT TO START OF 2 WORDS
|
||
RET
|
||
|
||
IFN POLISH,<
|
||
|
||
;HERE FOR POLISH
|
||
UNVRPL: PUSH P,[-1] ;END OF LOCATIONS TO BE ADJUSTED
|
||
MOVEM AC1,UNVPOL ;STORE PTR, USED TO FIND END OF POL STK
|
||
CALL UNVR2W ;GET 2 LOCATIONS
|
||
UNVRP0: SETOM (RC) ;-1 IN LEFT HALF
|
||
HRRM AC2,(RC) ;TO SET UP A NEW POLISH POINTER
|
||
MOVE AC1,(RC)
|
||
MOVEM AC1,UNVNPL ;SAVE THE NEW POLISH POINTER
|
||
UNVRP1: CALL UNVREAD ;READ 1ST WORD OF THE PAIR
|
||
MOVEM AC1,(AC2)
|
||
JUMPE AC1,UNVRP2
|
||
SKIPG AC1 ;SKIP IF NOT POLISH
|
||
PUSH P,AC1 ;STORE POLISH PTR WITH ORIGINAL ADDR
|
||
MOVEI RC,(AC2)
|
||
HLL RC,AC1
|
||
PUSH P,RC ;STORE LOCATIONS TO BE ADJUSTED ON STACK
|
||
UNVRP2: CALL UNVREAD ;READ 2ND WORD OF THE PAIR
|
||
CAME AC1,UNVPOL ;END OF POLISH STACK?
|
||
JRST [ MOVEM AC1,1(AC2)
|
||
CALL UNVR2W
|
||
JRST UNVRP1] ;GET 2 LOCATIONS AND LOOP BACK
|
||
MOVE AC1,UNVNPL ;ADJUSTED NEW POL STR IN 2ND WORD
|
||
MOVEM AC1,1(AC2)
|
||
|
||
;HERE AT END OF POLISH STACK READ
|
||
UNVRP3: POP P,AC1 ;GET LOCATION TO BE ADJUSTED
|
||
CAMN AC1,[-1] ;NO MORE?
|
||
JRST UNVRNX
|
||
CALL UNVR2W ;GET 2 LOCATIONS
|
||
HRRM AC2,(AC1) ;SO ADJUST IT
|
||
JUMPL AC1,[POP P, AC1 ;GET POL PTR WITH ORIGINAL ADDR
|
||
MOVEM AC1,UNVPOL ;SAVE IT
|
||
SETZM (AC2) ;ZERO THE FIRST WORD
|
||
MOVEI RC,1(AC2)
|
||
JRST UNVRP0]
|
||
MOVEI RC,(AC2)
|
||
CALL UNVREAD ;READ 1ST WORD
|
||
MOVEM AC1,(AC2)
|
||
JUMPE AC1,UNVRP4
|
||
HLL RC,AC1
|
||
PUSH P,RC
|
||
UNVRP4: CALL UNVREAD
|
||
MOVEM AC1,1(AC2)
|
||
JRST UNVRP3
|
||
|
||
>
|
||
|
||
;HERE FOR MACRO
|
||
UNVRMC: MOVE AC2,FREE ;FREE LOC COUNTER
|
||
HRRM AC2,(SDEL) ;IS WHERE MACRO STARTS
|
||
|
||
MOVEM AC2,UNVDFA ;SAVE STARTING ADDRESS OF MACRO
|
||
CALL UNVRML ;GO READ IN MACRO DEFINITION
|
||
MOVE AC1,UNVDFA ;GET STARTING ADDRESS BACK
|
||
HLRZ AC2,1(AC1) ;GET POINTER FOR ANY DEFAULTS
|
||
JUMPE AC2,UNVRNX ;NONE, GO DO NEXT SYMBOL
|
||
SKIPE UNVER% ;MAKE SURE WE WROTE THEM ON DISK
|
||
JRST UNVRER ;NO, TELL USER
|
||
PUSH P,SDEL ;SAVE AOBJN POINTER
|
||
MOVE AC2,FREE ;GET NEXT FREE ADDRESS
|
||
HRLM AC2,1(AC1) ;POINT TO IT IN MACRO BODY
|
||
CALL UNVREAD ;GO READ COUNT OF DEFAULTS
|
||
MOVN SDEL,AC1 ;COPY COUNT TO AOBJN POINTER
|
||
HRRI SDEL,(AC2) ;SET AOBJN ADDRESS INTO SDEL
|
||
HLRZ AC2,AC1 ;GET COUNT-1 OF DEFAULTS
|
||
ADDI AC2,2 ;CHANGE TO COUNT+1 (+0 WORD)
|
||
ADDB AC2,FREE ;BUMP FREE BY DEFAULT POINTER BLOCK LENGTH
|
||
UNVRM1: CALL UNVREAD ;GO READ ARGUMENT NUMBER
|
||
HRLM AC1,(SDEL) ;SAVE IN POINTER BLOCK
|
||
HRRM AC2,(SDEL) ;SAVE START OF VALUE (MAY BE SET UP BY UNVRML)
|
||
CALL UNVRML ;GO COPY DEFAULT VALUE
|
||
AOBJN SDEL,UNVRM1 ;DO ALL DEFAULTS
|
||
SETZM (SDEL) ;CLEAR END OF BLOCK WORD
|
||
POP P,SDEL ;RESTORE BIG AOBJN WORD
|
||
JRST UNVRNX ;GO DO NEXT SYMBOL
|
||
|
||
UNVRML: QQ==0
|
||
REPEAT .LEAF,<
|
||
CALL UNVREAD
|
||
MOVEM AC1,QQ(AC2) ;STORE
|
||
QQ==QQ+1>
|
||
MOVE AC1,(AC2) ;SEE WHAT FIRST WORD WAS
|
||
TLNN AC1,-1 ;IF ZERO THEN FINISHED
|
||
JRST UNVRMF ;SET LAST BLOCK POINTER
|
||
MOVEI AC1,.LEAF(AC2) ;POINT TO NEXT BLOCK
|
||
HRLM AC1,(AC2) ;FILL IT IN
|
||
ADDI AC2,.LEAF ;POINT TO IT
|
||
JRST UNVRML ;AND LOOP
|
||
|
||
UNVRMF: MOVE AC1,(SDEL) ;GET FIRST BLOCK
|
||
HRRM AC2,(AC1) ;POINT TO LAST
|
||
ADDI AC2,.LEAF ;POINT TO NEXT FREE
|
||
MOVEM AC2,FREE
|
||
RET ;RETURN
|
||
|
||
UNVRER: PUSH P,['MCROUF'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / UNIVERSAL FILE DEFAULT ARGUMENTS LOST, REASSEMBLE@/] ;[1066]
|
||
JRST ERRFIN ;PRINT THAT HAD DEFAULTS WHICH WERE LOST
|
||
UNVFAKE: PUSH P,['MCRNUF'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / NOT A REAL UNIVERSAL FILE@/] ;[1066]
|
||
JRST ERRFIN ;NAME IN AC0
|
||
|
||
UNVREA: SOSG UNVBUF+2
|
||
CALL UNVRIN
|
||
ILDB AC1,UNVBUF+1
|
||
RET
|
||
|
||
UNVRIN: IN UNV,
|
||
RET
|
||
GETSTS UNV,C ;GET STATUS BITS
|
||
TRNN C,ERRBIT!2000 ;ERRORS?
|
||
JRST [PUSH P,['MCRERU'] ;[1066] SET UP PREFIX
|
||
POP P,PREFIX ;[1066]
|
||
MOVSI RC,[SIXBIT / UNEXPECTED END-OF-FILE READING UNIVERSAL FILE@/] ;[1066]
|
||
JRST ERRFIN] ;GIVE ERROR MESSAGE,NAME IN AC0
|
||
MOVE AC0,UNVDEV ;GET DEVICE
|
||
JRST READ4 ;GIVE I/O ERROR MESSAGE
|
||
|
||
UNVUNV: MOVEM AC0,UNVDIR ;RESTORE REAL NAME
|
||
MOVSI AC1,'UNV' ;AND DEFAULT EXT
|
||
MOVEM AC1,UNVDIR+1
|
||
SETZM UNVDIR+2
|
||
SETZM UNVDIR+3 ;DEFAULT PATH
|
||
INIT UNV,B
|
||
SIXBIT /UNV/
|
||
UNVBUF
|
||
JRST UNVSYS
|
||
LOOKUP UNV,UNVDIR
|
||
JRST UNVSYS
|
||
JRST UNVFND
|
||
|
||
UNVSYS: INIT UNV,B
|
||
SIXBIT /SYS/
|
||
UNVBUF
|
||
JRST SCHERR
|
||
LOOKUP UNV,UNVDIR ;SEE IF THERE
|
||
JRST SCHERR ;NO
|
||
JRST UNVFND ;GOT IT
|
||
SUBTTL MACHINE INSTRUCTION SEARCH ROUTINES
|
||
|
||
IFE OPHSH,<
|
||
OPTSCH: MOVEI RC,0
|
||
MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX
|
||
MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT
|
||
|
||
OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?
|
||
JRST OPT1D ;YES, GET THE CODE
|
||
JUMPE V,CPOPJ ;[664] TEST FOR END
|
||
CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?
|
||
TDOA ARG,V ;NO, INCREMENT
|
||
OPT1B: SUB ARG,V ;YES, DECREMENT
|
||
ASH V,-1 ;HALVE INCREMENT
|
||
CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?
|
||
JRST OPT1A ;NO, TRY AGAIN
|
||
JRST OPT1B ;YES, BRING IT DOWN A PEG
|
||
>
|
||
|
||
IFN OPHSH,<
|
||
OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME
|
||
TLZ ARG,400000 ;CLEAR SIGN BIT
|
||
IDIVI ARG,PRIME ;REM. GOES IN V
|
||
CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?
|
||
JRST OPT1D ;YES
|
||
SKIPN OP1TOP(V) ;TEST FOR END
|
||
JRST OPT1B ;SYMBOL NOT FOUND
|
||
HLRZ RC,ARG ;SAVE LHS OF QUOTIENT
|
||
SKIPA ARG,RC ;GET IT BACK
|
||
OPT1A: ADDI ARG,(RC) ;INCREMENT ARG
|
||
ADDI V,(ARG) ;QUADRATIC INCREASE TO V
|
||
CAIL V,PRIME ;V IS MODULO PRIME
|
||
JRST [SUBI V,PRIME
|
||
JRST .-1]
|
||
CAMN AC0,OP1TOP(V) ;IS THIS IT?
|
||
JRST OPT1D ;YES
|
||
SKIPE OP1TOP(V) ;END?
|
||
JRST OPT1A ;TRY AGAIN
|
||
OPT1B: SETZ RC, ;CLEAR RELOCATION IN CASE IMPLICIT OPDEF
|
||
RET ;FAILED
|
||
>
|
||
OPT1D:
|
||
IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION
|
||
MOVE ARG,V> ;GET INDEX IN RIGHT ACC.
|
||
IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB
|
||
LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB
|
||
CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?
|
||
JRST OPT1G ;YES
|
||
ROT V,-^D9 ;LEFT JUSTIFY
|
||
HRRI V,OP ;POINT TO BASIC FORMAT
|
||
OPT1F: AOS 0(P) ;SET FOR SKIP EXIT
|
||
MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG
|
||
JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE
|
||
|
||
OPT1G: JUMPG AC0,[CAME AC0,['.XCREF'] ; DON'T CREF .XCREF
|
||
JRST .+3 ;IF ".","$",OR "%" USE TABLE 1
|
||
MOVE V,OP1TAB-700(V) ; USE TABLE 1
|
||
JRST CPOPJ1] ;AND BYPASS CREF
|
||
TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
|
||
SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"
|
||
MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"
|
||
JRST OPT1F ;EXIT
|
||
|
||
OPTTAB:
|
||
IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>
|
||
POINT 9,OP1COD (ARG), 8
|
||
POINT 9,OP1COD (ARG),17
|
||
POINT 9,OP1COD (ARG),26
|
||
IFN OPHSH,< POINT 9,OP1COD (ARG),35>
|
||
|
||
.XCREF ;DON'T CREF THIS MESS
|
||
IFE OPHSH,<
|
||
RELOC .-1
|
||
OP1TOP:
|
||
RELOC
|
||
|
||
IF1,<N1=0
|
||
DEFINE X (SYM,COD)<N1=N1+1>> ;
|
||
|
||
IF2, <
|
||
N2=^D36
|
||
CC=0
|
||
RELOC OP1COD
|
||
RELOC
|
||
DEFINE X (SYMBOL,CODE)
|
||
<SIXBIT /SYMBOL/
|
||
CC=CC+CODE_<N2=N2-9>
|
||
IFE N2, <OUTLIT>>
|
||
|
||
DEFINE OUTLIT <
|
||
RELOC
|
||
+CC
|
||
RELOC
|
||
N2=^D36+<CC=0>>>
|
||
>
|
||
|
||
IFN OPHSH,<
|
||
OP1TOP: IF1,< BLOCK PRIME>
|
||
IF1,<DEFINE X (SB,CD)<>>
|
||
IF2,<
|
||
DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>
|
||
|
||
DEFINE X (SB,CD)<
|
||
SXB=<SIXBIT /SB/>
|
||
Q=SXB&-1_-1/PRIME
|
||
R=SXB&-1_-1-Q*PRIME
|
||
H=Q_-22&777
|
||
TRY=1
|
||
OPCODE=CD
|
||
ITEM Q,\R
|
||
IFL PRIME-TRY,<PRINTX HASH FAILURE>>
|
||
|
||
DEFINE ITEM (QT,RM)<
|
||
IFN .%'RM,<R=R+H
|
||
IFL PRIME-R,<R=R-R/PRIME*PRIME>
|
||
H=H+Q_-22&777
|
||
IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>
|
||
IFE .%'RM,<.%'RM=SXB
|
||
OPSTOR \<R/4>>>>
|
||
IF1,<
|
||
DEFINE GETSYM (N)<.%'N=0>
|
||
|
||
N=0
|
||
XLIST
|
||
REPEAT PRIME,<GETSYM \N
|
||
N=N+1>
|
||
DEFINE GETSYM (N)<.$'N=0>
|
||
N=0
|
||
REPEAT <PRIME/4+1>,<GETSYM \N
|
||
N=N+1>
|
||
>
|
||
LIST>
|
||
|
||
;MACRO TO HANDLE KI10 OP-CODES
|
||
IFE KI10,<
|
||
DEFINE XK (SB,CD) <>> ;NUL MACRO
|
||
IFN KI10,<SYN X,XK> ;USUAL X MACRO
|
||
|
||
;MACRO TO HANDLE KL10 OP-CODES
|
||
IFE KL10,<
|
||
DEFINE XL (SB,CD) <>> ;NUL MACRO
|
||
IFN KL10,<SYN X,XL> ;USUAL X MACRO
|
||
|
||
;MACRO TO HANDLE F40 UUOS
|
||
IFE F40,<
|
||
DEFINE XF (SB,CD) <>> ;NUL MACRO
|
||
IFN F40,<SYN X,XF> ;USUAL X MACRO
|
||
|
||
X ADD , 270
|
||
X ADDB , 273
|
||
X ADDI , 271
|
||
X ADDM , 272
|
||
|
||
XL ADJBP , 133
|
||
XL ADJSP , 105
|
||
|
||
X AND , 404
|
||
X ANDB , 407
|
||
X ANDCA , 410
|
||
X ANDCAB, 413
|
||
X ANDCAI, 411
|
||
X ANDCAM, 412
|
||
X ANDCB , 440
|
||
X ANDCBB, 443
|
||
X ANDCBI, 441
|
||
X ANDCBM, 442
|
||
X ANDCM , 420
|
||
X ANDCMB, 423
|
||
X ANDCMI, 421
|
||
X ANDCMM, 422
|
||
X ANDI , 405
|
||
X ANDM , 406
|
||
|
||
X AOBJN , 253
|
||
X AOBJP , 252
|
||
|
||
X AOJ , 340
|
||
X AOJA , 344
|
||
X AOJE , 342
|
||
X AOJG , 347
|
||
X AOJGE , 345
|
||
X AOJL , 341
|
||
X AOJLE , 343
|
||
X AOJN , 346
|
||
|
||
X AOS , 350
|
||
X AOSA , 354
|
||
X AOSE , 352
|
||
X AOSG , 357
|
||
X AOSGE , 355
|
||
X AOSL , 351
|
||
X AOSLE , 353
|
||
X AOSN , 356
|
||
X ARG , 320
|
||
X ARRAY , 771
|
||
IFN IIISW,<X ASCID , 773>
|
||
X ASCII , 700
|
||
X ASCIZ , 701
|
||
|
||
X ASH , 240
|
||
X ASHC , 244
|
||
|
||
X ASUPPR, 705
|
||
|
||
X BLKI , 702
|
||
X BLKO , 703
|
||
X BLOCK , 704
|
||
X BLT , 251
|
||
|
||
X BYTE , 707
|
||
|
||
X CAI , 300
|
||
X CAIA , 304
|
||
X CAIE , 302
|
||
X CAIG , 307
|
||
X CAIGE , 305
|
||
X CAIL , 301
|
||
X CAILE , 303
|
||
X CAIN , 306
|
||
|
||
X CALL , 040
|
||
X CALLI , 047
|
||
|
||
X CAM , 310
|
||
X CAMA , 314
|
||
X CAME , 312
|
||
X CAMG , 317
|
||
X CAMGE , 315
|
||
X CAML , 311
|
||
X CAMLE , 313
|
||
X CAMN , 316
|
||
|
||
X CLEAR , 400
|
||
X CLEARB, 403
|
||
X CLEARI, 401
|
||
X CLEARM, 402
|
||
|
||
X CLOSE , 070
|
||
XL CMPSE , 002
|
||
XL CMPSG , 007
|
||
XL CMPSGE, 005
|
||
XL CMPSL , 001
|
||
XL CMPSLE, 003
|
||
XL CMPSN , 006
|
||
X COMMEN, 770
|
||
|
||
|
||
X CONI , 710
|
||
X CONO , 711
|
||
IFN STANSW,<X CONS,257>
|
||
X CONSO , 712
|
||
X CONSZ , 713
|
||
|
||
XL CVTBDO, 012
|
||
XL CVTBDT, 013
|
||
XL CVTDBO, 010
|
||
XL CVTDBT, 011
|
||
XL DADD , 114
|
||
|
||
XF DATA. , 020
|
||
|
||
X DATAI , 714
|
||
X DATAO , 715
|
||
XL DDIV , 117
|
||
X DEC , 716
|
||
X DEFINE, 717
|
||
X DEPHAS, 720
|
||
|
||
XK DFAD , 110
|
||
XK DFDV , 113
|
||
XK DFMP , 112
|
||
X DFN , 131
|
||
XK DFSB , 111
|
||
XL DGFLTR, 027 ;[1237]
|
||
|
||
X DIV , 234
|
||
X DIVB , 237
|
||
X DIVI , 235
|
||
X DIVM , 236
|
||
|
||
XK DMOVE , 120
|
||
XK DMOVEM, 124
|
||
XK DMOVN , 121
|
||
XK DMOVNM, 125
|
||
XL DMUL , 116
|
||
X DPB , 137
|
||
XL DSUB , 115
|
||
XL EDIT , 004
|
||
|
||
X END , 721
|
||
X ENTER , 077
|
||
X ENTRY , 722
|
||
|
||
X EQV , 444
|
||
X EQVB , 447
|
||
X EQVI , 445
|
||
X EQVM , 446
|
||
|
||
X EXCH , 250
|
||
|
||
X EXP , 723
|
||
XL EXTEND, 123
|
||
X EXTERN, 724
|
||
|
||
X FAD , 140
|
||
X FADB , 143
|
||
X FADL , 141
|
||
X FADM , 142
|
||
|
||
X FADR , 144
|
||
X FADRB , 147
|
||
X FADRI , 145
|
||
X FADRM , 146
|
||
|
||
X FDV , 170
|
||
X FDVB , 173
|
||
X FDVL , 171
|
||
X FDVM , 172
|
||
|
||
X FDVR , 174
|
||
X FDVRB , 177
|
||
X FDVRI , 175
|
||
X FDVRM , 176
|
||
|
||
XF FIN. , 021
|
||
|
||
IFN STANSW,<X FIX , 130>
|
||
IFE STANSW,<XK FIX , 122>
|
||
XK FIXR , 126
|
||
XK FLTR , 127
|
||
|
||
X FMP , 160
|
||
X FMPB , 163
|
||
X FMPL , 161
|
||
X FMPM , 162
|
||
|
||
X FMPR , 164
|
||
X FMPRB , 167
|
||
X FMPRI , 165
|
||
X FMPRM , 166
|
||
|
||
X FSB , 150
|
||
X FSBB , 153
|
||
X FSBL , 151
|
||
X FSBM , 152
|
||
|
||
X FSBR , 154
|
||
X FSBRB , 157
|
||
X FSBRI , 155
|
||
X FSBRM , 156
|
||
|
||
X FSC , 132
|
||
XL GDBLE , 022 ;[1236]
|
||
XL GDFIX , 023 ;[1237]
|
||
XL GDFIXR, 025 ;[1237]
|
||
|
||
X GETSTS, 062
|
||
XL GFAD , 102 ;[1236]
|
||
XL GFDV , 107 ;[1236]
|
||
XL GFIX , 024 ;[1236]
|
||
XL GFIXR , 026 ;[1236]
|
||
XL GFMP , 106 ;[1236]
|
||
XL GFSB , 103 ;[1236]
|
||
XL GFSC , 031 ;[1236]
|
||
XL GSNGL , 021 ;[1236]
|
||
|
||
X HALT , 725
|
||
X HISEG , 706
|
||
|
||
X HLL , 500
|
||
X HLLE , 530
|
||
X HLLEI , 531
|
||
X HLLEM , 532
|
||
X HLLES , 533
|
||
X HLLI , 501
|
||
X HLLM , 502
|
||
X HLLO , 520
|
||
X HLLOI , 521
|
||
X HLLOM , 522
|
||
X HLLOS , 523
|
||
X HLLS , 503
|
||
X HLLZ , 510
|
||
X HLLZI , 511
|
||
X HLLZM , 512
|
||
X HLLZS , 513
|
||
|
||
X HLR , 544
|
||
X HLRE , 574
|
||
X HLREI , 575
|
||
X HLREM , 576
|
||
X HLRES , 577
|
||
X HLRI , 545
|
||
X HLRM , 546
|
||
X HLRO , 564
|
||
X HLROI , 565
|
||
X HLROM , 566
|
||
X HLROS , 567
|
||
X HLRS , 547
|
||
X HLRZ , 554
|
||
X HLRZI , 555
|
||
X HLRZM , 556
|
||
X HLRZS , 557
|
||
|
||
X HRL , 504
|
||
X HRLE , 534
|
||
X HRLEI , 535
|
||
X HRLEM , 536
|
||
X HRLES , 537
|
||
X HRLI , 505
|
||
X HRLM , 506
|
||
X HRLO , 524
|
||
X HRLOI , 525
|
||
X HRLOM , 526
|
||
X HRLOS , 527
|
||
X HRLS , 507
|
||
X HRLZ , 514
|
||
X HRLZI , 515
|
||
X HRLZM , 516
|
||
X HRLZS , 517
|
||
|
||
X HRR , 540
|
||
X HRRE , 570
|
||
X HRREI , 571
|
||
X HRREM , 572
|
||
X HRRES , 573
|
||
X HRRI , 541
|
||
X HRRM , 542
|
||
X HRRO , 560
|
||
X HRROI , 561
|
||
X HRROM , 562
|
||
X HRROS , 563
|
||
X HRRS , 543
|
||
X HRRZ , 550
|
||
X HRRZI , 551
|
||
X HRRZM , 552
|
||
X HRRZS , 553
|
||
|
||
X IBP , 133
|
||
|
||
X IDIV , 230
|
||
X IDIVB , 233
|
||
X IDIVI , 231
|
||
X IDIVM , 232
|
||
|
||
X IDPB , 136
|
||
|
||
X IF1 , 726
|
||
X IF2 , 727
|
||
X IFB , 730
|
||
X IFDEF , 731
|
||
X IFDIF , 732
|
||
X IFE , 733
|
||
X IFG , 734
|
||
X IFGE , 735
|
||
X IFIDN , 736
|
||
X IFL , 737
|
||
X IFLE , 740
|
||
X IFN , 741
|
||
X IFNB , 742
|
||
X IFNDEF, 743
|
||
|
||
X ILDB , 134
|
||
|
||
X IMUL , 220
|
||
X IMULB , 223
|
||
X IMULI , 221
|
||
X IMULM , 222
|
||
|
||
X IN , 056
|
||
XF IN. , 016
|
||
X INBUF , 064
|
||
XF INF. , 026
|
||
X INIT , 041
|
||
X INPUT , 066
|
||
X INTEGE, 772
|
||
|
||
X INTERN, 744
|
||
|
||
X IOR , 434
|
||
X IORB , 437
|
||
X IORI , 435
|
||
X IORM , 436
|
||
|
||
|
||
X IOWD , 745
|
||
X IRP , 746
|
||
X IRPC , 747
|
||
X JCRY , 750
|
||
X JCRY0 , 751
|
||
X JCRY1 , 752
|
||
X JEN , 753
|
||
|
||
X JFCL , 255
|
||
|
||
X JFFO , 243
|
||
X JFOV , 765
|
||
X JOV , 754
|
||
|
||
X JRA , 267
|
||
X JRST , 254
|
||
|
||
X JRSTF , 755
|
||
|
||
X JSA , 266
|
||
X JSP , 265
|
||
X JSR , 264
|
||
X JSYS , 104
|
||
|
||
X JUMP , 320
|
||
X JUMPA , 324
|
||
X JUMPE , 322
|
||
X JUMPG , 327
|
||
X JUMPGE, 325
|
||
X JUMPL , 321
|
||
X JUMPLE, 323
|
||
X JUMPN , 326
|
||
|
||
X LALL , 756
|
||
|
||
X LDB , 135
|
||
|
||
X LIST , 757
|
||
X LIT , 760
|
||
X LOC , 761
|
||
|
||
X LOOKUP, 076
|
||
|
||
X LSH , 242
|
||
X LSHC , 246
|
||
XK MAP , 257
|
||
X MLOFF , 767
|
||
X MLON , 766
|
||
X MOVE , 200
|
||
X MOVEI , 201
|
||
X MOVEM , 202
|
||
X MOVES , 203
|
||
X MOVM , 214
|
||
X MOVMI , 215
|
||
X MOVMM , 216
|
||
X MOVMS , 217
|
||
X MOVN , 210
|
||
X MOVNI , 211
|
||
X MOVNM , 212
|
||
X MOVNS , 213
|
||
X MOVS , 204
|
||
X MOVSI , 205
|
||
XL MOVSLJ, 016
|
||
X MOVSM , 206
|
||
XL MOVSO , 014
|
||
XL MOVSRJ, 017
|
||
X MOVSS , 207
|
||
XL MOVST , 015
|
||
|
||
|
||
X MTAPE , 072
|
||
XF MTOP. , 024
|
||
|
||
X MUL , 224
|
||
X MULB , 227
|
||
X MULI , 225
|
||
X MULM , 226
|
||
XF NLI. , 031
|
||
XF NLO. , 032
|
||
|
||
X NOSYM , 762
|
||
|
||
X OCT , 763
|
||
X OPDEF , 764
|
||
|
||
X OPEN , 050
|
||
|
||
X OR , 434
|
||
X ORB , 437
|
||
X ORCA , 454
|
||
X ORCAB , 457
|
||
X ORCAI , 455
|
||
X ORCAM , 456
|
||
X ORCB , 470
|
||
X ORCBB , 473
|
||
|
||
X ORCBI , 471
|
||
X ORCBM , 472
|
||
X ORCM , 464
|
||
X ORCMB , 467
|
||
X ORCMI , 465
|
||
X ORCMM , 466
|
||
X ORI , 435
|
||
X ORM , 436
|
||
|
||
X OUT , 057
|
||
XF OUT. , 017
|
||
X OUTBUF, 065
|
||
XF OUTF. , 027
|
||
X OUTPUT, 067
|
||
|
||
X PAGE , 700
|
||
X PASS2 , 701
|
||
X PHASE , 702
|
||
|
||
XL PMOVE , 052
|
||
XL PMOVEM , 053
|
||
|
||
X POINT , 703
|
||
|
||
X POP , 262
|
||
X POPJ , 263
|
||
X PORTAL, 760
|
||
|
||
X PRGEND, 714
|
||
X PRINTX, 704
|
||
X PURGE , 705
|
||
|
||
X PUSH , 261
|
||
X PUSHJ , 260
|
||
|
||
X RADIX , 706
|
||
X RADIX5, 707
|
||
|
||
XL RDCLK , 052
|
||
X RELEAS, 071
|
||
|
||
X RELOC , 710
|
||
X REMARK, 711
|
||
|
||
X RENAME, 055
|
||
|
||
X REPEAT, 712
|
||
|
||
XF RESET., 015
|
||
X RIM , 715
|
||
X RIM10 , 735
|
||
X RIM10B, 736
|
||
|
||
X ROT , 241
|
||
X ROTC , 245
|
||
|
||
X RSW , 716
|
||
XF RTB. , 022
|
||
X SALL , 720
|
||
X SEARCH, 721
|
||
|
||
X SETA , 424
|
||
X SETAB , 427
|
||
X SETAI , 425
|
||
X SETAM , 426
|
||
X SETCA , 450
|
||
X SETCAB, 453
|
||
X SETCAI, 451
|
||
X SETCAM, 452
|
||
X SETCM , 460
|
||
X SETCMB, 463
|
||
X SETCMI, 461
|
||
X SETCMM, 462
|
||
X SETM , 414
|
||
X SETMB , 417
|
||
X SETMI , 415
|
||
X SETMM , 416
|
||
X SETO , 474
|
||
X SETOB , 477
|
||
X SETOI , 475
|
||
X SETOM , 476
|
||
X SETSTS, 060
|
||
X SETZ , 400
|
||
X SETZB , 403
|
||
X SETZI , 401
|
||
X SETZM , 402
|
||
|
||
X SIXBIT, 717
|
||
|
||
X SKIP , 330
|
||
X SKIPA , 334
|
||
X SKIPE , 332
|
||
X SKIPG , 337
|
||
X SKIPGE, 335
|
||
X SKIPL , 331
|
||
X SKIPLE, 333
|
||
X SKIPN , 336
|
||
|
||
XF SLIST., 025
|
||
|
||
X SOJ , 360
|
||
X SOJA , 364
|
||
X SOJE , 362
|
||
X SOJG , 367
|
||
X SOJGE , 365
|
||
X SOJL , 361
|
||
X SOJLE , 363
|
||
X SOJN , 366
|
||
|
||
X SOS , 370
|
||
X SOSA , 374
|
||
X SOSE , 372
|
||
X SOSG , 377
|
||
X SOSGE , 375
|
||
X SOSL , 371
|
||
X SOSLE , 373
|
||
X SOSN , 376
|
||
|
||
IFN STANSW,<X SPCWAR,43>
|
||
X SQUOZE, 707
|
||
|
||
X STATO , 061
|
||
X STATUS, 062
|
||
X STATZ , 063
|
||
|
||
X STOPI , 722
|
||
|
||
X SUB , 274
|
||
X SUBB , 277
|
||
X SUBI , 275
|
||
X SUBM , 276
|
||
|
||
IF2,<IFE OPHSH,<SUBTL:>>
|
||
X SUBTTL, 723
|
||
X SUPPRE, 713
|
||
X SYN , 724
|
||
X TAPE , 725
|
||
|
||
X TDC , 650
|
||
X TDCA , 654
|
||
X TDCE , 652
|
||
X TDCN , 656
|
||
X TDN , 610
|
||
X TDNA , 614
|
||
X TDNE , 612
|
||
X TDNN , 616
|
||
X TDO , 670
|
||
X TDOA , 674
|
||
X TDOE , 672
|
||
X TDON , 676
|
||
X TDZ , 630
|
||
X TDZA , 634
|
||
X TDZE , 632
|
||
X TDZN , 636
|
||
|
||
X TITLE , 726
|
||
|
||
X TLC , 641
|
||
X TLCA , 645
|
||
X TLCE , 643
|
||
X TLCN , 647
|
||
X TLN , 601
|
||
X TLNA , 605
|
||
X TLNE , 603
|
||
X TLNN , 607
|
||
X TLO , 661
|
||
X TLOA , 665
|
||
X TLOE , 663
|
||
X TLON , 667
|
||
X TLZ , 621
|
||
X TLZA , 625
|
||
X TLZE , 623
|
||
X TLZN , 627
|
||
|
||
X TRC , 640
|
||
X TRCA , 644
|
||
X TRCE , 642
|
||
X TRCN , 646
|
||
X TRN , 600
|
||
X TRNA , 604
|
||
X TRNE , 602
|
||
X TRNN , 606
|
||
X TRO , 660
|
||
X TROA , 664
|
||
X TROE , 662
|
||
X TRON , 666
|
||
X TRZ , 620
|
||
X TRZA , 624
|
||
X TRZE , 622
|
||
X TRZN , 626
|
||
|
||
X TSC , 651
|
||
X TSCA , 655
|
||
X TSCE , 653
|
||
X TSCN , 657
|
||
X TSN , 611
|
||
X TSNA , 615
|
||
X TSNE , 613
|
||
|
||
X TSNN , 617
|
||
X TSO , 671
|
||
X TSOA , 675
|
||
X TSOE , 673
|
||
X TSON , 677
|
||
X TSZ , 631
|
||
X TSZA , 635
|
||
X TSZE , 633
|
||
X TSZN , 637
|
||
X TTCALL, 051
|
||
X TWOSEG, 731
|
||
X UFA , 130
|
||
X UGETF , 073
|
||
X UJEN , 100
|
||
X UNIVER, 737
|
||
X USETI , 074
|
||
X USETO , 075
|
||
|
||
X VAR , 727
|
||
|
||
XF WTB. , 023
|
||
|
||
X XALL , 732
|
||
|
||
XL XBLT , 020
|
||
X XCT , 256
|
||
XL XHLLI , 501 ;[1236]
|
||
XL XJEN , 761
|
||
XL XJRSTF, 762
|
||
|
||
X XLIST , 733
|
||
XL XMOVEI, 415 ;[1236]
|
||
|
||
X XOR , 430
|
||
X XORB , 433
|
||
X XORI , 431
|
||
X XORM , 432
|
||
|
||
XL XPCW , 763
|
||
X XPUNGE, 730
|
||
XL XSFM , 764
|
||
X XWD , 734
|
||
|
||
X Z , 000
|
||
|
||
X .ASSIG, 751
|
||
X .COMMO, 747
|
||
X .CREF , 740
|
||
X .DIREC, 750
|
||
IFN FTPSECT,< ;[575]
|
||
X .ENDPS, 766
|
||
>
|
||
X .HWFRM, 742
|
||
X .IF , 756
|
||
X .IFN , 757
|
||
X .LINK , 753
|
||
X .LNKEN, 754
|
||
X .MFRMT, 743
|
||
X .NODDT, 746
|
||
X .ORG , 752
|
||
IFN FTPSECT,< ;[575]
|
||
X .PSECT, 765
|
||
>
|
||
X .REQUE, 744
|
||
X .REQUI, 745
|
||
X .TEXT , 755
|
||
X .XCREF, 741
|
||
|
||
IFE OPHSH,<
|
||
IF1, < BLOCK N1>
|
||
OP1END: -1B36
|
||
OP1COD: BLOCK N1/4
|
||
CC
|
||
IF2,< PURGE N1,N2>
|
||
>
|
||
IFN OPHSH,<
|
||
IF2,<
|
||
DEFINE SETVAL (N)<EXP .%'N
|
||
PURGE .%'N>
|
||
N=0
|
||
XLIST
|
||
REPEAT PRIME,<SETVAL \N
|
||
N=N+1>
|
||
LIST
|
||
>
|
||
OP1COD: IF1,< BLOCK <PRIME/4+1>>
|
||
IF2,<
|
||
DEFINE SETVAL (N)<EXP .$'N
|
||
PURGE .$'N>
|
||
N=0
|
||
XLIST
|
||
REPEAT <PRIME/4+1>,<SETVAL \N
|
||
N=N+1>
|
||
>
|
||
LIST>
|
||
|
||
.CREF ;START CREFFING AGAIN
|
||
SUBTTL PERMANENT SYMBOLS
|
||
|
||
SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS
|
||
|
||
DEFINE PSYM (A,B)<
|
||
XLIST
|
||
SIXBIT /A/
|
||
XWD SYMF!NOOUTF,B
|
||
LIST>
|
||
|
||
PSYM @, 0(SUPRBT)
|
||
PSYM ??????, 0(SUPRBT)
|
||
|
||
LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS
|
||
|
||
PRMTBL: ;PERMANENT SYMBOLS
|
||
PSYM ADC, 24
|
||
PSYM ADC2, 30
|
||
PSYM APR, 0
|
||
PSYM CCI, 14
|
||
PSYM CDP, 110
|
||
PSYM CDR, 114
|
||
PSYM CLK, 70
|
||
PSYM CLK2, 74
|
||
PSYM CPA, 0
|
||
PSYM CR, 150
|
||
PSYM CR2, 154
|
||
PSYM DC, 200
|
||
PSYM DC2, 204
|
||
PSYM DCSA, 300
|
||
PSYM DCSB, 304
|
||
PSYM DDC, 270
|
||
PSYM DDC2, 274
|
||
PSYM DF, 270
|
||
PSYM DIS, 130
|
||
PSYM DIS2, 134
|
||
PSYM DLB, 60
|
||
PSYM DLB2, 160
|
||
PSYM DLC, 64
|
||
PSYM DLC2, 164
|
||
PSYM DLS, 240
|
||
PSYM DLS2, 244
|
||
PSYM DPC, 250
|
||
PSYM DPC2, 254
|
||
PSYM DPC3, 260
|
||
PSYM DPC4, 264
|
||
PSYM DSI, 464
|
||
PSYM DSI2, 474
|
||
PSYM DSK, 170
|
||
PSYM DSK2, 174
|
||
PSYM DSS, 460
|
||
PSYM DSS2, 470
|
||
PSYM DTC, 320
|
||
PSYM DTC2, 330
|
||
PSYM DTS, 324
|
||
PSYM DTS2, 334
|
||
PSYM LPT, 124
|
||
PSYM LPT2, 234
|
||
PSYM MDF, 260
|
||
PSYM MDF2, 264
|
||
PSYM MTC, 220
|
||
PSYM MTM, 230
|
||
PSYM MTS, 224
|
||
PSYM PAG, 10
|
||
PSYM PI, 4
|
||
PSYM PLT, 140
|
||
PSYM PLT2, 144
|
||
PSYM PTP, 100
|
||
PSYM PTR, 104
|
||
PSYM TMC, 340
|
||
PSYM TMC2, 350
|
||
PSYM TMS, 344
|
||
PSYM TMS2, 354
|
||
PSYM TTY, 120
|
||
PSYM UTC, 210
|
||
PSYM UTS, 214
|
||
PRMEND: ;END OF PERMANENT SYMBOLS
|
||
|
||
OPDEF ZL [Z LITF] ;INVALID IN LITERALS
|
||
OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES
|
||
OPDEF ZAL [Z ADDF!LITF]
|
||
|
||
OP1TAB:
|
||
|
||
ZA PAGE0 ;PAGE
|
||
ZAL PASS20 ;PASS2
|
||
ZAL PHASE0 ;PHASE
|
||
Z POINT0 ;POINT
|
||
ZA PRNTX0 ;PRINTX
|
||
ZA PURGE0 ;PURGE
|
||
ZA RADIX0 ;RADIX
|
||
Z RADX50 ;RADIX50,SQUOZE
|
||
ZAL %ORG (1) ;RELOC
|
||
ZAL REMAR0 ;REMARK
|
||
ZA REPEA0 ;REPEAT
|
||
ZA SUPRE0 ;SUPRESS
|
||
ZAL PSEND0 ;PRGEND
|
||
ZAL RIM0 (RIMSW) ;RIM
|
||
DATAI 0,IOP ;RSW
|
||
Z ASCII0 (1) ;SIXBIT
|
||
ZA IOSET (IOPALL!IOSALL) ;[1065] SALL
|
||
ZAL SERCH0 ;SEARCH
|
||
ZA STOPI0 ;STOPI
|
||
ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL
|
||
ZA SYN0 ;SYN
|
||
ZAL TAPE0 ;TAPE
|
||
ZA TITLE0 (Z (POINT 7,,)) ;TITLE
|
||
ZAL VAR0 ;VAR
|
||
|
||
Z XPUNG0 ;XPUNGE
|
||
ZAL TWSEG0 ;TWOSEGMENTS
|
||
ZA XALL0 (IOPALL) ;[1065] XALL
|
||
ZA IOSET (IOPROG) ;[1065][1150] XLIST
|
||
Z XWD0 ;XWD
|
||
ZAL RIM0 (RIM1SW) ;RIM10
|
||
ZAL RIM0 (R1BSW) ;RIM10B
|
||
ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL
|
||
ZA ONCRF (IONCRF) ;[1063] .CREF
|
||
ZA OFFCRF (IONCRF) ;[1063] .XCREF
|
||
ZA OFFORM ;.HWFRMT
|
||
ZA ONFORM ;.MFRMT
|
||
ZAL REQUEST ;.REQUEST
|
||
ZAL REQUIRE ;.REQUIRE
|
||
ZA NODDT0 ;.NODDT
|
||
ZAL COMM0 ;.COMMON
|
||
ZA %DIREC ;[1065] .DIRECTIVE
|
||
ZA ASGN ;.ASSIGN
|
||
ZAL %ORG (1B18) ;.ORG
|
||
ZAL %LINK (0) ;.LINK
|
||
ZAL %LINK (1B18) ;.LNKEND
|
||
Z %TEXT0 (1B18+1B21) ;.TEXT
|
||
Z %IF ;.IF
|
||
Z %IFN ;.IFN
|
||
JRST 1,OP ;PORTAL
|
||
JRST 6,OP ;XJEN
|
||
JRST 5,OP ;XJRSTF
|
||
JRST 7,OP ;XPCW
|
||
JRST 14,OP ;XSFM
|
||
IFN FTPSECT,< ;[575]
|
||
ZA %SEGME ;.PSECT
|
||
ZA %ENDSE ;.ENDPS
|
||
>
|
||
|
||
OP2TAB:
|
||
|
||
Z ASCII0 (0) ;ASCII
|
||
Z ASCII0 (1B18) ;ASCIZ
|
||
BLKI IOP ;BLKI
|
||
BLKO IOP ;BLKO
|
||
ZAL BLOCK0 ;BLOCK
|
||
ZA SUPRSA ;ASUPPRESS
|
||
ZAL HISEG0 ;HISEG
|
||
Z BYTE0 ;BYTE
|
||
CONI IOP ;CONI
|
||
CONO IOP ;CONO
|
||
CONSO IOP ;CONSO
|
||
CONSZ IOP ;CONSZ
|
||
DATAI IOP ;DATAI
|
||
DATAO IOP ;DATAO
|
||
Z OCT0 (^D10) ;DEC
|
||
ZA DEFIN0 ;DEFINE
|
||
|
||
ZAL DEPHA0 ;DEPHASE
|
||
ZAL END0 ;END
|
||
ZA INTER0 (INTF!ENTF) ;ENTRY
|
||
Z EXPRES ;EXP
|
||
ZA EXTER0 ;EXTERN
|
||
JRST 4,OP ;HALT
|
||
TLNN FR,IFPASS ;IF1
|
||
TLNE FR,IFPASS ;IF2
|
||
|
||
TRNE AC0,IFB0 ;IFB
|
||
TLNE ARG,IFDEF0 ;IFDEF
|
||
Z IFIDN0 (0) ;IFDIF
|
||
SKIPE IF ;IFE
|
||
SKIPG IF ;IFG
|
||
SKIPGE IF ;IFGE
|
||
Z IFIDN0 (1) ;IFIDN
|
||
SKIPL IF ;IFL
|
||
|
||
SKIPLE IF ;IFLE
|
||
SKIPN IF ;IFN
|
||
TRNN AC0,IFB0 ;IFNB
|
||
TLNN ARG,IFDEF0 ;IFNDEF
|
||
ZA INTER0 (INTF) ;INTERN
|
||
Z IOWD0 ;IOWD
|
||
Z IRP0 (0) ;IRP
|
||
Z IRP0 (400000) ;IRPC
|
||
|
||
JFCL 6,OP ;JCRY
|
||
JFCL 4,OP ;JCRY0
|
||
JFCL 2,OP ;JCRY1
|
||
JRST 12,OP ;JEN
|
||
JFCL 10,OP ;JOV
|
||
JRST 2,OP ;JRSTF
|
||
ZA IOLSET (IOPALL!IOSALL) ;[1065] LALL
|
||
ZA IORSET (IOPROG) ;[1065] LIST
|
||
ZAL LIT0 ;LIT
|
||
ZAL %ORG (0) ;LOC
|
||
ZA OFFSYM ;NOSYM
|
||
Z OCT0 (^D8) ;OCT
|
||
ZA OPDEF0 ;OPDEF
|
||
JFCL 1,OP ;JFOV
|
||
ZA ONML ;MLON
|
||
ZA OFFML ;MLOFF
|
||
Z ASCII0 (3B19) ;COMMENT
|
||
ZAL %ARAY ;ARRAY
|
||
ZAL %INTEG ;INTEGER
|
||
IFN IIISW,<
|
||
Z ASCII0 (5B20)> ;ASCID
|
||
|
||
IFN UUOSYM,<
|
||
CALTBL:
|
||
;USER DEFINED CALLI'S GO HERE
|
||
SIXBIT /LIGHTS/ ;-1
|
||
CALLI0: SIXBIT /RESET/ ;0
|
||
SIXBIT /DDTIN/ ;1
|
||
SIXBIT /SETDDT/ ;2
|
||
SIXBIT /DDTOUT/ ;3
|
||
SIXBIT /DEVCHR/ ;4
|
||
SIXBIT /DDTGT/ ;5
|
||
SIXBIT /GETCHR/ ;6
|
||
SIXBIT /DDTRL/ ;7
|
||
SIXBIT /WAIT/ ;10
|
||
SIXBIT /CORE/ ;11
|
||
SIXBIT /EXIT/ ;12
|
||
SIXBIT /UTPCLR/ ;13
|
||
SIXBIT /DATE/ ;14
|
||
SIXBIT /LOGIN/ ;15
|
||
SIXBIT /APRENB/ ;16
|
||
SIXBIT /LOGOUT/ ;17
|
||
SIXBIT /SWITCH/ ;20
|
||
SIXBIT /REASSI/ ;21
|
||
SIXBIT /TIMER/ ;22
|
||
SIXBIT /MSTIME/ ;23
|
||
SIXBIT /GETPPN/ ;24
|
||
SIXBIT /TRPSET/ ;25
|
||
SIXBIT /TRPJEN/ ;26
|
||
SIXBIT /RUNTIM/ ;27
|
||
SIXBIT /PJOB/ ;30
|
||
SIXBIT /SLEEP/ ;31
|
||
SIXBIT /SETPOV/ ;32
|
||
SIXBIT /PEEK/ ;33
|
||
SIXBIT /GETLIN/ ;34
|
||
SIXBIT /RUN/ ;35
|
||
SIXBIT /SETUWP/ ;36
|
||
SIXBIT /REMAP/ ;37
|
||
SIXBIT /GETSEG/ ;40
|
||
SIXBIT /GETTAB/ ;41
|
||
SIXBIT /SPY/ ;42
|
||
SIXBIT /SETNAM/ ;43
|
||
SIXBIT /TMPCOR/ ;44
|
||
SIXBIT /DSKCHR/ ;45
|
||
SIXBIT /SYSSTR/ ;46
|
||
SIXBIT /JOBSTR/ ;47
|
||
SIXBIT /STRUUO/ ;50
|
||
SIXBIT /SYSPHY/ ;51
|
||
SIXBIT /FRECHN/ ;52
|
||
SIXBIT /DEVTYP/ ;53
|
||
SIXBIT /DEVSTS/ ;54
|
||
SIXBIT /DEVPPN/ ;55
|
||
SIXBIT /SEEK/ ;56
|
||
SIXBIT /RTTRP/ ;57
|
||
SIXBIT /LOCK/ ;60
|
||
SIXBIT /JOBSTS/ ;61
|
||
SIXBIT /LOCATE/ ;62
|
||
SIXBIT /WHERE/ ;63
|
||
SIXBIT /DEVNAM/ ;64
|
||
SIXBIT /CTLJOB/ ;65
|
||
SIXBIT /GOBSTR/ ;66
|
||
0 ;67
|
||
0 ;70
|
||
SIXBIT /HPQ/ ;71
|
||
SIXBIT /HIBER/ ;72
|
||
SIXBIT /WAKE/ ;73
|
||
SIXBIT /CHGPPN/ ;74
|
||
SIXBIT /SETUUO/ ;75
|
||
SIXBIT /DEVGEN/ ;76
|
||
SIXBIT /OTHUSR/ ;77
|
||
SIXBIT /CHKACC/ ;100
|
||
SIXBIT /DEVSIZ/ ;101
|
||
SIXBIT /DAEMON/ ;102
|
||
SIXBIT /JOBPEK/ ;103
|
||
SIXBIT /ATTACH/ ;104
|
||
SIXBIT /DAEFIN/ ;105
|
||
SIXBIT /FRCUUO/ ;106
|
||
SIXBIT /DEVLNM/ ;107
|
||
SIXBIT /PATH./ ;110
|
||
SIXBIT /METER./ ;111
|
||
SIXBIT /MTCHR./ ;112
|
||
SIXBIT /JBSET./ ;113
|
||
SIXBIT /POKE./ ;114
|
||
SIXBIT /TRMNO./ ;115
|
||
SIXBIT /TRMOP./ ;116
|
||
SIXBIT /RESDV./ ;117
|
||
SIXBIT /UNLOK./ ;120
|
||
SIXBIT /DISK./ ;121
|
||
SIXBIT /DVRST./ ;122
|
||
SIXBIT /DVURS./ ;123
|
||
SIXBIT /XTTSK./ ;124
|
||
SIXBIT /CAL11./ ;125
|
||
SIXBIT /MTAID./ ;126
|
||
SIXBIT /IONDX./ ;127
|
||
SIXBIT /CNECT./ ;130
|
||
SIXBIT /MVHDR./ ;131
|
||
SIXBIT /ERLST./ ;132
|
||
SIXBIT /SENSE./ ;133
|
||
SIXBIT /CLRST./ ;134
|
||
SIXBIT /PIINI./ ;135
|
||
SIXBIT /PISYS./ ;136
|
||
SIXBIT /DEBRK./ ;137
|
||
SIXBIT /PISAV./ ;140
|
||
SIXBIT /PIRST./ ;141
|
||
SIXBIT /IPCFR./ ;142
|
||
SIXBIT /IPCFS./ ;143
|
||
SIXBIT /IPCFQ./ ;144
|
||
SIXBIT /PAGE./ ;145
|
||
SIXBIT /SUSET./ ;146
|
||
SIXBIT /COMPT./ ;147
|
||
SIXBIT /SCHED./ ;150
|
||
SIXBIT /ENQ./ ;151
|
||
SIXBIT /DEQ./ ;152
|
||
SIXBIT /ENQC./ ;153
|
||
SIXBIT /TAPOP./ ;154
|
||
SIXBIT /FILOP./ ;155
|
||
SIXBIT /CAL78./ ;156
|
||
SIXBIT /NODE./ ;157
|
||
SIXBIT /ERRPT./ ;160
|
||
SIXBIT /ALLOC./ ;161
|
||
SIXBIT /PERF./ ;162
|
||
CALNTH==.-CALTBL
|
||
NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S
|
||
|
||
TTCTBL: SIXBIT /INCHRW/ ;0 INPUT A CHAR. AND WAIT
|
||
SIXBIT /OUTCHR/ ;1 OUTPUT A CHAR.
|
||
SIXBIT /INCHRS/ ;2 INPUT A CHAR. AND SKIP
|
||
SIXBIT /OUTSTR/ ;3 OUTPUT A STRING
|
||
SIXBIT /INCHWL/ ;4 INPUT CHAR., WAIT, LINE MODE
|
||
SIXBIT /INCHSL/ ;5 INPUT CHAR., SKIP, LINE MODE
|
||
SIXBIT /GETLCH/ ;6 GET LINE CHARACTERISTICS
|
||
SIXBIT /SETLCH/ ;7 SET LINE CHARACTERISTICS
|
||
SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND
|
||
SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER
|
||
SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER
|
||
SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT
|
||
SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT
|
||
SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.
|
||
|
||
TTCLTH==.-TTCTBL
|
||
|
||
MTATBL: SIXBIT /MTWAT./ ; 0
|
||
SIXBIT /MTREW./ ; 1
|
||
SIXBIT /MTEOF./ ; 3
|
||
SIXBIT /MTSKR./ ; 6
|
||
SIXBIT /MTBSR./ ; 7
|
||
SIXBIT /MTEOT./ ;10
|
||
SIXBIT /MTUNL./ ;11
|
||
SIXBIT /MTBLK./ ;13
|
||
SIXBIT /MTSKF./ ;16
|
||
SIXBIT /MTBSF./ ;17
|
||
SIXBIT /MTDEC./ ;100
|
||
SIXBIT /MTIND./ ;101
|
||
|
||
MTALTH==.-MTATBL
|
||
|
||
MTACOD: BYTE (9) 0,1,3,6
|
||
BYTE (9) 7,10,11,13
|
||
BYTE (9) 16,17,100,101
|
||
> ;END UUOSYM
|
||
SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES
|
||
|
||
;SEARCH FOR OPERATOR DEFINITION (MACRO, SYN, OPDEF)
|
||
|
||
MSRCH: CALL SEARCH ;PERFORM GENERAL SEARCH
|
||
RET ;NOT FOUND, EXIT
|
||
JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
|
||
CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
|
||
RET ;NO, EXIT
|
||
ADDI SX,2 ;YES, POINT TO IT
|
||
SETZM EXTPNT ;RESET EXTERNAL POINTER WORD
|
||
CALL SRCH5 ;LOAD REGISTERS
|
||
MSRCH2: AOSA 0(P) ;SET SKIP-EXIT
|
||
QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND
|
||
TLC ARG,SIXF ;DO WE HAVE A SIXF?
|
||
TLCN ARG,SIXF
|
||
CALL SYNFIX ;YES, GO TAKE CARE OF IT FIRST
|
||
QSRCH1: MOVEI SDEL,%MAC ;SET OPERATOR FLAG
|
||
TLZE IO,DEFCRS ;IS IT A DEFINITION?
|
||
MOVEI SDEL,%DMAC ;YES
|
||
JRST CREF ;CROSS-REF AND EXIT
|
||
|
||
;HERE IF WE HAVE A SYN AND ITS VALUE IS A POINTER TO A SIXBIT OPERATOR NAME
|
||
SYNFIX: PUSH P,AC0 ;SAVE CURRENT SYMBOL
|
||
PUSH P,IO ;[1152] SAVE CURRENT SYN BITS
|
||
TLZ IO,DEFCRS ;[1152] THIS IS NOT A DEFINITION
|
||
MOVE AC0,(ARG) ;AND GET SIXBIT SYMBOL NAME
|
||
PUSH P,ARG ;SAVE SIXBIT POINTER
|
||
CALL OPTSCH ;GET ITS VALUE
|
||
JRST [TRO ER,ERRA ;GIVE A-ERROR
|
||
JRST SYNFI1]
|
||
POP P,ARG ;RESTORE POINTER
|
||
SKIPE UWVER ;WRITING A UNV FILE?
|
||
JRST SYNFI1 ;YES, JUMP, DON'T UPDATE SYMBOL TABLE
|
||
MOVEM V,(ARG) ;NO, REPLACE SIXBIT WITH OPERATOR VALUE
|
||
MOVSI ARG,SYNF+PNTF ;SET FLAGS
|
||
HLLM ARG,(SX) ;UPDATE IN SYMBOL TABLE
|
||
SYNFI1: POP P,AC0 ;[1152] RETRIEVE SYN BITS
|
||
TLNE AC0,DEFCRS ;[1152] IS THIS A DEFINITION?
|
||
TLO IO,DEFCRS ;[1152] YES - TURN BIT BACK ON
|
||
POP P,AC0 ;[1152] RESTORE SYMBOL NAME
|
||
RET
|
||
|
||
;SEARCH FOR SYMBOL DEFINITION
|
||
|
||
SSRCH: CALL SEARCH ;PERFORM GENERAL SEARCH
|
||
RET ;NOT FOUND, EXIT
|
||
JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
|
||
SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
|
||
RET ;NO DICE, EXIT
|
||
SUBI SX,2 ;YES, POINT TO IT
|
||
SETZM EXTPNT ;RESET EXTERNAL POINTERS WORD
|
||
CALL SRCH5 ;LOAD REGISTERS
|
||
SSRCH2: AOS 0(P) ;SET FOR SKIP-EXIT
|
||
SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG
|
||
|
||
CREF: TLNE ARG,NCRF ;.XCREF SEEN?
|
||
JRST [TLZ IO,DEFCRS ;CLEAR DEFINITION FLAG
|
||
RET] ;AND DON'T CREF
|
||
TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?
|
||
TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?
|
||
RET ;YES, EXIT
|
||
EXCH SDEL,C ;PUT FLAG IN C, SACE C
|
||
PUSH P,CS
|
||
TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102
|
||
JRST CREF3 ;YES
|
||
PUSH P,C ;START OF CREF DATA
|
||
|
||
REPEAT 0,< ;NEEDS CHANGE TO CREF
|
||
MOVEI C,177
|
||
CALL OUTLST
|
||
MOVEI C,102
|
||
CALL OUTLST
|
||
TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
|
||
POP P,C ;WE HAVE NOW
|
||
CREF3: JUMPE C,NOFLG ;JUST CLOSE IT
|
||
CALL OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
|
||
MOVSI CS,770000 ;COUNT CHRS
|
||
TDZA C,C ;STARTING AT 0
|
||
LSH CS,-6 ;TRY NEXT
|
||
TDNE AC0,CS ;IS THAT ONE THERE?
|
||
AOJA C,.-2 ;YES
|
||
CALL OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
|
||
MOVE CS,AC0
|
||
|
||
CREF2: MOVEI C,0
|
||
LSHC C,6
|
||
ADDI C,40
|
||
CALL OUTLST ;THE ASCII SYMBOL
|
||
JUMPN CS,CREF2
|
||
MOVEI C,%DSYM
|
||
TLZE IO,DEFCRS
|
||
CALL OUTLST ;MARK IT AS A DEFINING OCCURENCE
|
||
NOFLG: MOVE C,SDEL
|
||
POP P,CS
|
||
RET
|
||
|
||
CLSCRF: TRNN ER,LPTSW
|
||
RET ;LEAVE IF WE SHOULD NOT BE PRINTING
|
||
CLSCR2: MOVEI C,177
|
||
CALL PRINT
|
||
TLZE IO,IOCREF ;WAS IT OPEN?
|
||
JRST CLSCR1 ;YES, JUST CLOSE IT
|
||
MOVEI C,102 ;NO, OPEN IT FIRST
|
||
CALL OUTLST ;MARK BEGINNING OF CREF DATA
|
||
MOVEI C,177
|
||
CALL OUTLST
|
||
CLSCR1: MOVEI C,103
|
||
JRST OUTLST ;MARK END OF CREF DATA
|
||
|
||
CLSC3: TLZ IO,IOCREF
|
||
MOVEI C,177
|
||
CALL OUTLST
|
||
MOVEI C,104
|
||
JRST OUTLST ;177,104 CLOSES IT FOR NOW
|
||
> ;END OF REPEAT 0
|
||
|
||
REPEAT 1,< ;WORKS WITH EXISTING CREF
|
||
TLNE IO,IOPAGE
|
||
CALL CRFHDR ;GET CORRECT SUBTTL
|
||
MOVEI C,177
|
||
CALL OUTLST
|
||
MOVEI C,102
|
||
CALL OUTLST
|
||
TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
|
||
POP P,C ;WE HAVE NOW
|
||
CREF3: CALL OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
|
||
MOVSI CS,770000 ;COUNT CHRS
|
||
TDZA C,C ;STARTING AT 0
|
||
LSH CS,-6 ;TRY NEXT
|
||
TDNE AC0,CS ;IS THAT ONE THERE?
|
||
AOJA C,.-2 ;YES
|
||
CALL OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
|
||
MOVE CS,AC0
|
||
|
||
CREF2: MOVEI C,0
|
||
LSHC C,6
|
||
ADDI C,40
|
||
CALL OUTLST ;THE ASCII SYMBOL
|
||
JUMPN CS,CREF2
|
||
MOVEI C,%DSYM
|
||
TLZE IO,DEFCRS
|
||
CALL OUTLST ;MARK IT AS A DEFINING OCCURENCE
|
||
MOVE C,SDEL
|
||
POP P,CS
|
||
RET
|
||
|
||
IFN OPHSH,<
|
||
SUBTL: SIXBIT /SUBTTL/>
|
||
CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"
|
||
JRST CRFHD1 ;NO
|
||
HLLZ AC0,V
|
||
CALL SUBTT0 ;UPDATE SUBTTL
|
||
MOVE AC0,SUBTL ;RESTORE ARG.
|
||
MOVEI V,CPOPJ
|
||
CRFHD1: MOVEI C,0
|
||
JRST OUTL
|
||
|
||
CLSC3:
|
||
CLSCRF: TRNN ER,LPTSW
|
||
RET ;LEAVE IF WE SHOULD NOT BE PRINTING
|
||
CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE
|
||
JRST CLSCR1
|
||
MOVEI C,0
|
||
TLNE IO,IOPAGE ;NEW PAGE?
|
||
CALL OUTL ;YES,GIVE IT A ROUSING SENDOFF!
|
||
MOVEI C,177
|
||
CALL OUTLST
|
||
MOVEI C,102
|
||
CALL OUTLST ;MARK BEGINNING OF CREF DATA
|
||
CLSCR1: TRNN ER,ERRORS ;ANY ERRORS TO CREF
|
||
JRST CLSCR6 ;NO, JUST CLOSE OUT
|
||
MOVE C,[POINT 6,[SIXBIT /QXADLRUVNOPEMS/]]
|
||
PUSH P,ER ;SAVE
|
||
ANDI ER,ERRORS ;ONLY LOOK AT THESE
|
||
HRLZ ER,ER ;PUT FLAGS IN LEFT HALF
|
||
CLSCR4: ILDB CS,C ;GET NEXT ERROR CODE
|
||
LSH ER,1 ;SHIFT FLAG IN
|
||
JUMPE ER,CLSCR5 ;FINISHED
|
||
JUMPG ER,CLSCR4 ;NOT YET
|
||
PUSH P,C ;SAVE BYTE POINTER
|
||
TDO CS,['%.... '] ;MAGIC SYMBOL
|
||
MOVEI C,%ERR ;TYPE
|
||
CALL OUTLST
|
||
MOVEI C,6 ;NO OF CHARS.
|
||
CALL OUTLST
|
||
SETZ C, ;CLEAR RECEIVING ACC
|
||
LSHC C,6 ;SHIFT IN CHAR
|
||
ADDI C,40 ;TO ASCII
|
||
CALL OUTLST
|
||
JUMPN CS,.-4 ;MORE TO DO
|
||
POP P,C ;BYTE POINTER BACK
|
||
JUMPN ER,CLSCR4 ;GET NEXT
|
||
CLSCR5: POP P,ER ;RESTORE ER
|
||
CLSCR6: MOVEI C,177
|
||
CALL OUTLST
|
||
MOVEI C,103
|
||
JRST OUTLST ;MARK END OF CREF DATA
|
||
> ;END OF REPEAT 1
|
||
|
||
|
||
RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22
|
||
|
||
SEARCH: CALL SRCHI ;SET UP SRCHX
|
||
IFN FTPSECT,< ;[575]
|
||
TLZ IO,RSASSW ;CLR INTER-PSECT REF SWITCH
|
||
HRRZ AC1,SGNCUR ;GET CUR PSECT INX
|
||
MOVEM AC1,SGWFND ;SET PSECT WHERE FOUND
|
||
> ;END IFN FTPSECT
|
||
CALL SRCH ;SEARCH CURRENT PSECT
|
||
IFE FTPSECT,<
|
||
JRST SRCHU ;SEE IF THERE ARE UNIVERSALS TO SEARCH
|
||
JRST SRCH4S ;COMMON SUCCESSFUL EXIT
|
||
>
|
||
IFN FTPSECT,<
|
||
JRST [SKIPN SGSRCH ;[1070] SEARCHING ONLY CURRENT PSECT?
|
||
JRST SRCHSG ;[1070] NO -TRY OTHERS
|
||
CALL SRCHI ;[1070] YES - RESET SRCHX
|
||
JRST SRCHU] ;[1070] AND CHECK UNIVERSALS
|
||
JRST SRCH4S ;COMMON SUCCESSFUL EX
|
||
|
||
SRCHSG: PUSH P,V ;SAVE V
|
||
PUSH P,SX ;SAVE SX VALUE
|
||
PUSH P,SGNCUR ;SAVE SGNCUR
|
||
PUSH P,SGNMAX ;INIT PSECT INX
|
||
SRCHSL: MOVE V,0(P) ;GET PSECT INX
|
||
CAMN V,-1(P) ;DON'T SEARCH CURRENT
|
||
JRST SRCHSC ;PSECT AGAIN
|
||
MOVEM V,SGNCUR ;FUDGE CUR PSECT
|
||
CALL SRCHI ;SET UP SRCHX
|
||
CALL SRCH ;SEARCH THIS PSECT
|
||
JRST SRCHSC ;NOT HERE EITHER
|
||
MOVE AC1,SGNCUR ;GET RELEVANT PSECT INX
|
||
MOVEM AC1,SGWFND ;SET PSECT WHERE FOUND
|
||
SKIPGE -1(P) ;WANT TO EVALUATE IN THIS PSECT?
|
||
JRST SRCH4 ;YES, JUST EXIT
|
||
MOVE ARG,0(SX) ;GET FLAGS
|
||
TLNE ARG,EXTF ;[1116] EXTERNAL?
|
||
JRST SRCHEX ;[1116] YES - STORE IN REQUESTING PSECT
|
||
TLNE ARG,SPTR ;[1116] SPECIAL POINTER TO EXTERNAL?
|
||
JRST SRCHSP ;[1116] YES - CHECK FOR INTER-PSECT EXTERNAL
|
||
TLNE ARG,LELF!RELF ;IF RELOCATABLE THEN
|
||
TLO IO,RSASSW ;SET INTER-PSECT REF SWITCH
|
||
JRST SRCH4 ;COMMON SUCCESSFUL EXIT
|
||
|
||
SRCHEX: POP P,AC1 ;INDEX
|
||
POP P,SGNCUR ;RESTORE
|
||
POP P,SX ;WHERE IT SHOULD BE
|
||
POP P,V
|
||
MOVEI SDEL,2 ;NEEDS 2 WORDS
|
||
ADDB SDEL,FREE
|
||
CAML SDEL,SYMBOL ;WILL IT FIT?
|
||
CALL XCEEDS ;NO
|
||
SETZM -2(SDEL) ;VALUE
|
||
MOVEM AC0,-1(SDEL) ;NAME
|
||
MOVEI V,-2(SDEL) ;POINTER
|
||
HLLZ ARG,ARG ;KEEP FLAGS BUT NOT POINTER
|
||
CALL INSERT ;PUT IT IN
|
||
JRST SEARCH ;TRY AGAIN
|
||
|
||
;[1116] A SYMBOL REFERENCED IN THE CURRENT PSECT IS DEFINED IN ANOTHER
|
||
;[1116] PSECT AS A SPECIAL EXTERNAL POINTER (I.E. FOO=BAR##). IF THE SYMBOL
|
||
;[1116] WILL NOT GO POLISH, THEN BOTH IT AND THE EXTERNAL IT POINTS TO MUST
|
||
;[1116] BE COPIED INTO THE CURRENT PSECT TO KEEP THE EXTERNAL CHAIN FROM
|
||
;[1116] CROSSING PSECTS
|
||
SRCHSP: SKIPGE 1(ARG) ;[1204] POINTER TO POLISH DEFINITION?
|
||
JRST SRCH4 ;[1204] YES - NO NEED TO COPY SYMBOLS
|
||
MOVE AC1,(ARG) ;[1204] GET ADDITION
|
||
TRNE AC1,-1 ;[1213] IS RIGHT HALF NON-ZERO?
|
||
JRST SRCH4 ;[1116] YES - NO NEED TO COPY SYMBOLS
|
||
POP P,AC1 ;[1116] DISCARD INDEX
|
||
POP P,SGNCUR ;[1116] NEED PSECT INDEX
|
||
POP P,AC1 ;[1116] DISCARD SYMBOL TABLE PTR.
|
||
POP P,AC1 ;[1116] AND VALUE
|
||
PUSH P,AC0 ;[1116] SAVE SYMBOL
|
||
PUSH P,(ARG) ;[1116] SAVE VALUE ( SHOULD BE 0)
|
||
PUSH P,ARG ;[1116] AND SYMBOL FLAGS
|
||
HRRZ AC1,1(ARG) ;[1116] GET POINTER TO EXTERNAL BLOCK
|
||
MOVE AC0,1(AC1) ;[1116] GET EXTERNAL SYMBOL NAME
|
||
CALL SEARCH ;[1116] FIND EXTERNAL IN SOME OTHER PSECT
|
||
JFCL ;[1116] AND PUT IN CURRENT PSECT (CAN'T FAIL)
|
||
HRRZ RC,ARG ;[1116] USE EXTERNAL POINTER AS RELOCATION
|
||
POP P,ARG ;[1116] RESTORE SYMBOL FLAGS
|
||
POP P,V ;[1116] SYMBOL VALUE
|
||
POP P,AC0 ;[1116] AND SYMBOL NAME
|
||
CALL SRCHI ;[1116] SETUP FOR INSERT
|
||
CALL SRCH ;[1116] FIND PLACE WHERE SYMBOL GOES
|
||
JFCL ;[1116] CANNOT FAIL
|
||
CALL INSERT ;[1116] ADD SYMBOL TO CURRENT PSECT
|
||
MOVE AC1,SGNCUR ;[1116] GET CURRENT INDEX
|
||
MOVEM AC1,SGWFND ;[1116] AND SAVE AS PSECT WHERE FOUND
|
||
JRST SRCH4S ;[1116] COMMON SUCCESSFUL EXIT
|
||
|
||
SRCHSC: SOS V,0(P) ;BUMP PSECT INX
|
||
JUMPGE V,SRCHSL ;LOOP IF MORE PSECTS
|
||
POP P,AC1 ;THROW AWAY PSECT INX
|
||
POP P,SGNCUR ;RESTORE SGNCUR
|
||
CALL SRCHI ;RESET SRCHX
|
||
POP P,SX ;RESTORE SX VALUE
|
||
POP P,V ;RESTORE V
|
||
>
|
||
SRCHU: TRNN FRR,NOUNVS ;[713] WANT TO SEARCH UNVS?
|
||
SKIPN UNISCH+1 ;ARE THERE ANY?
|
||
RET ;NO, JUST RETURN
|
||
HRLM SX,UNISCH ;SAVE SX AND SET FLAG
|
||
MOVE ARG,SRCHX ;SEARCH POINTER
|
||
MOVEM ARG,UNISHX ;TO A SAFE PLACE
|
||
IFE FTPSECT,< ;[575]
|
||
HRR ARG,SYMBOL
|
||
HRL ARG,SYMTOP
|
||
> ;END IFE FTPSECT
|
||
IFN FTPSECT,< ;[575]
|
||
HRR ARG,SGSBOT
|
||
HRL ARG,SGSTOP
|
||
> ;END IFN FTPSECT
|
||
MOVEM ARG,UNIPTR ;STORE ALSO
|
||
SRCHUL: AOS V,UNISCH ;GET NEXT INDEX TO TABLE
|
||
MOVE V,UNISCH(V) ;GET TRUE INDEX
|
||
JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED
|
||
MOVE ARG,UNISHX(V) ;NEW SRCHX
|
||
MOVEM ARG,SRCHX ;SET IT UP
|
||
MOVE ARG,UNIPTR(V) ;SGSTOP,,SGSBOT
|
||
IFE FTPSECT,< ;[575]
|
||
HRRZM ARG,SYMBOL
|
||
HLRZM ARG,SYMTOP
|
||
> ;END IFE FTPSECT
|
||
IFN FTPSECT,< ;[575]
|
||
HRRZM ARG,SGSBOT
|
||
HLRZM ARG,SGSTOP
|
||
> ;END IFN FTPSECT
|
||
CALL SRCH ;SEARCH UNIV SYM TAB
|
||
JRST SRCHUL ;NOPE, TRY NEXT ONE
|
||
IFN FTPSECT,<
|
||
JRST SRCH4S ;COMMON SUCCESSFUL EXIT
|
||
|
||
SRCH4: POP P,AC1 ;THROW AWAY PSECT INX
|
||
POP P,SGNCUR ;RESTORE SGNCUR
|
||
POP P,AC1 ;THROW AWAY SX VALUE
|
||
POP P,AC1 ;THROW AWAY V
|
||
>
|
||
SRCH4S: AOS 0(P) ;SET FOR SKIP EXIT
|
||
SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT
|
||
ANDCAM ARG,(SX) ;IN THE TABLE
|
||
SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG
|
||
REPEAT 0,< ;[1203] REMOVE EDIT 653
|
||
SKIPE UNISCH ;[1203] [653] FOUND IN UNV?
|
||
JRST [ TLC ARG,SYNF!PNTF ;[1203] [653] YES, CHECK FOR SYN FIXUP
|
||
TLCE ARG,SYNF!PNTF ;[1203] [653]
|
||
JRST .+1 ;[1203] [653]
|
||
TLNE ARG,VARF ;[1203] [653] YES, OLD STYLE UNV FILE?
|
||
JRST .+1 ;[1203] [653]
|
||
MOVE AC0,UNITBL(V) ;[1203] [653]
|
||
JRST VERSKW] ;[1203] [653] YES, REASSEMBL UNV
|
||
> ;[1203]
|
||
LDB RC,RCPNTR ;POINT 1,ARG,17
|
||
TLNE ARG,LELF ;CHECK LEFT RELOCATE
|
||
TLO RC,1
|
||
HRRZ V,ARG
|
||
TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER
|
||
JRST SRCH6
|
||
TLNE ARG,PNTF
|
||
MOVE V,0(ARG) ;36BIT VALUE TO V
|
||
JRST SRCHOK
|
||
|
||
SRCH6: MOVE V,0(ARG) ;VALUE
|
||
MOVE RC,1(ARG) ;AND RELOC
|
||
JUMPL RC,SRCHOK ;[773] JUMP IF POLISH
|
||
TLNE RC,-2 ;CHECK AND SET EXTPNT
|
||
HLLM RC,EXTPNT
|
||
TRNE RC,-2
|
||
HRRM RC,EXTPNT
|
||
JRST SRCHOK
|
||
|
||
SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED
|
||
SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES
|
||
RET ;NO, JUST RETURN
|
||
SYMBCK: HLRZ SX,UNISCH ;RESTORE SX
|
||
SETZM UNISCH ;CLEAR SYMBCK FLAG
|
||
MOVE SDEL,UNISHX ;SRCHX
|
||
MOVEM SDEL,SRCHX ;RESTORE ORIGINAL
|
||
IFE FTPSECT,< ;[575]
|
||
MOVE SDEL,UNIPTR ;SYMTOP,,SYMBOL
|
||
HRRZM SDEL,SYMBOL
|
||
HLRZM SDEL,SYMTOP
|
||
JUMPE ARG,CPOPJ ;TOTALLY UNDEFINED
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE SDEL,UNIPTR ;SGSTOP,,SGSBOT
|
||
HRRZM SDEL,SGSBOT
|
||
HLRZM SDEL,SGSTOP
|
||
JUMPE ARG,CPOPJ ;TOTALLY UNDEFINED
|
||
PUSH P,SGNCUR ;SAVE CUR PSECT
|
||
SETZM SGNCUR ;SET TO BLANK PSECT
|
||
SETZM SGWFND ;SET PSECT WHERE FOUND
|
||
CALL SRCHI ;SET UP SRCHX
|
||
CALL SRCH ;SET UP SX
|
||
JFCL
|
||
>
|
||
TLNE ARG,SPTR ;SPECIAL EXTERNAL?
|
||
JRST SYMBKS ;YES
|
||
TLNE ARG,EXTF ;EXTERNAL?
|
||
JRST SYMBKX ;YES, NEED 2 MORE CELLS
|
||
TLNN ARG,PNTF ;36 BIT VALUE FLAG SET?
|
||
JRST .+3 ;NO, PUT IN TABLE AND RETURN
|
||
TLNN V,-1 ;BUT IS IT ONLY 18 BIT VALUE?
|
||
TLZ ARG,PNTF ;YES, SO ONLY USE 18 BITS
|
||
IFE FTPSECT,< ;[575]
|
||
JRST INSERT
|
||
SYN CPOPJ,SYMBKR
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
CALL INSERT ;STILL HAVE 0 PSECT
|
||
SYMBKR: POP P,SGNCUR ;RESTORE CUR PSECT
|
||
RET
|
||
>
|
||
|
||
SYMBKX: PUSH P,[EXP SYMBKR] ;RETURN ADDRESS
|
||
PUSH P,1(ARG) ;SAVE SIXBIT NAME
|
||
MOVSI ARG,SYMF!EXTF!PNTF ;SET ONLY THE REQUIRED FLAGS
|
||
;PUT 2 WORDS IN CORE
|
||
SYMBKY: CALL INSERZ ;INSERT SYMBOL IN TABLE
|
||
MOVEI SDEL,2 ;GET 2 CELLS FROM FREE CORE
|
||
ADDB SDEL,FREE
|
||
CAML SDEL,SYMBOL ;MORE CORE NEEDED?
|
||
CALL XCEEDS ;YES
|
||
HRRI ARG,-2(SDEL) ;POINTER TO VALUE
|
||
SETZM (ARG) ;AND CLEAR IT
|
||
POP P,1(ARG) ;STORE SIXBIT VALUE
|
||
MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE
|
||
RET ;RETURN
|
||
|
||
SYMBKS: PUSH P,V ;SAVE ADDITIVE VALUE
|
||
PUSH P,[Z SYMBKZ] ;SET UP RETURN ADDRESS FOR PJRST
|
||
PUSH P,ARG ;SAVE SYMBOL'S FLAGS
|
||
HLLZM ARG,0(P) ;[1230] ONLY LEFT HALF
|
||
TRO FRR,NOUNVS ;[713] DON'T SEARCH UNIVERSALS
|
||
PUSH P,AC0 ;SAVE SYMBOL WE REALLY WANT
|
||
MOVE ARG,1(ARG) ;GET POINTER TO DEFINING SYMBOL
|
||
IFN POLISH,<
|
||
JUMPL ARG,SYMBKP ;JUMP IF POLISH
|
||
>
|
||
PUSH P,ARG ;[1230] SAVE POINTER IN CASE LEFT HALF
|
||
TRNN ARG,-1 ;[1230] POINTER IN RIGHT HALF?
|
||
JRST SYMBKL ;[1230] NO, TRY LEFT HALF
|
||
MOVE AC0,1(ARG) ;AND FINALLY SYMBOL
|
||
CALL SEARCH ;SEE IF DEFINING GLOBAL IS IN TABLE
|
||
CALL [PUSH P,1(ARG) ;SAVE SIXBIT NAME
|
||
MOVSI ARG,SYMF!EXTF!PNTF ;SET ONLY THE REQUIRED FLAGS
|
||
JRST SYMBKY] ;NO, PUT IN SYMBOL TABLE
|
||
MOVE AC0,(SX) ;[1230] GET FLAGS
|
||
TLNN AC0,EXTF ;[1230] CHECK FOR NOT EXTERNAL
|
||
CALL SYMBS2 ;[1230] NOT EXTERNAL - ERROR
|
||
HRRM ARG,-2(P) ;[1230] STACK POINTER TO GLOBAL
|
||
SYMBKL: SETZ ARG, ;[1230] CLEAR IN CASE NO LEFT HALF
|
||
MOVE AC0,0(P) ;[1230] GET POINTER BACK
|
||
TLNN AC0,-1 ;[1230] LEFT HALF?
|
||
JRST SYMBS1 ;[1230] NO.
|
||
HLR ARG,AC0 ;[1230] GET POINTER TO SYMBOL
|
||
MOVE AC0,1(ARG) ;[1230] AND FINALLY SYMBOL
|
||
CALL SEARCH ;[1230] SEE IF DEFINING GLOBAL IS IN TABLE
|
||
CALL [PUSH P,1(ARG) ;[1230] SAVE SIXBIT NAME
|
||
MOVSI ARG,SYMF!EXTF!PNTF ;[1230] SET ONLY THE REQUIRED FLAGS
|
||
JRST SYMBKY] ;[1230] NO, PUT IN SYMBOL TABLE
|
||
MOVE AC0,(SX) ;[1230] GET FLAGS
|
||
TLNN AC0,EXTF ;[1230] CHECK FOR NOT EXTERNAL
|
||
CALL SYMBS2 ;[1230] NOT EXTERNAL - ERROR
|
||
SYMBS1: POP P,0(P) ;[1230] TOSS POINTERS
|
||
POP P,AC0 ;[1230] GET SYMBOL BACK
|
||
CALL SEARCH ;SETUP SX AGAIN
|
||
JFCL ;WILL ALWAYS FAIL
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
HLL ARG,0(P) ;[1230] RECOVER FLAGS
|
||
HRLM ARG,0(P) ;[1230] STACK LH POINTER TO GLOBAL
|
||
JRST SYMBKY ;AND DO DUMMY PUSHJ
|
||
SYMBS2: TRO ER,ERRM ;[1230] SET PASS 1 'M' ERROR
|
||
MOVSI AC0,MDFF ;[1230] GET MULTIPLY DEFINED SYMBOL FLAG
|
||
IORM AC0,0(SX) ;[1230] SET FOR NEW SYMBOL
|
||
IORM AC0,-3(P) ;[1230] AND SUPPOSED EXTERNAL
|
||
MOVE AC0,-1(SX) ;[1230] GET SYMBOL
|
||
MOVEI SDEL,2 ;[1230] NEED 2 WORDS FOR FAKE EXTERNAL BLOCK
|
||
ADDB SDEL,FREE ;[1230] FROM FREE CORE
|
||
CAML SDEL,SYMBOL ;[1230] IS SPACE AVAILABLE?
|
||
CALL XCEEDS ;[1230] NO. MOVE SYMBOL TABLE
|
||
SETZM -2(SDEL) ;[1230] ZERO THE FIRST WORD
|
||
MOVEM AC0,-1(SDEL) ;[1230] PUT THE SYMBOL NAME IN EXTERNAL BLOCK
|
||
HRRI ARG,-2(SDEL) ;[1230] GET ADDRESS OF EXTERNAL BLOCK
|
||
RET ;[1230] RETURN
|
||
|
||
SYMBKZ: ;FAKE RETURN ADDRESS
|
||
POP P,V ;GET OFFSET
|
||
MOVEM V,0(ARG) ;STORE OFFSET
|
||
JRST SYMBKR ;RETURN
|
||
|
||
IFN POLISH,<
|
||
;HERE IF POLISH
|
||
SYMBKP: PUSH P,ARG
|
||
PUSH P,SDEL ;SAVE SDEL
|
||
PUSH P,[-1] ;END OF LOWER LEVEL POLISH TO BE CHECKED
|
||
SYMBP4: MOVE AC1,1(ARG) ;GET THE OPERATOR
|
||
MOVE SDEL,DESTB-3(AC1) ;AND NUMBER OF OPERANDS
|
||
SYMBP0: ADDI ARG,2 ;GET 1ST OPERAND
|
||
HRRZM ARG,UNVNPL ;REMEMBER CURRENT ADDRESS
|
||
MOVE AC0,(ARG) ;GET 1ST WORD OF THE PAIR
|
||
JUMPE AC0,SYMBP1 ;IF 1ST WORD IS 0, GO ONTO NEXT PAIR
|
||
JUMPL AC0,[PUSH P,AC0 ;1ST WORD IS POLISH
|
||
JRST SYMBP1] ;STORE LOWER LEVEL POLISH PTR ON STACK
|
||
MOVE ARG,AC0
|
||
MOVE AC0,1(ARG) ;GET SIXBIT SYMBOL
|
||
PUSH P,SDEL ;SAVE NUMBER OF OPERANDS LEFT
|
||
CALL SEARCH
|
||
CALL [PUSH P,1(ARG) ;NOT FOUND, GO INSERT IT
|
||
TLO ARG,SYMF!EXTF!PNTF
|
||
JRST SYMBKY]
|
||
POP P,SDEL ;RESTORE NUMBER OF OPERANDS LEFT
|
||
SYMBP1: MOVE ARG,UNVNPL ;GET CURRENT LOCATION
|
||
SOJG SDEL,SYMBP0 ;ANY MORE OPERANDS? IF YES, GO BACK
|
||
POP P,ARG ;NO, ANY LOWER LEVEL POLISH?
|
||
CAMN ARG,[-1] ;END?
|
||
JRST SYMBP3 ;YES,
|
||
JRST SYMBP4
|
||
|
||
SYMBP3: POP P,SDEL ;RESTORE ORIGINAL SDEL
|
||
POP P,ARG ;RECOVER ORIGINAL ARG
|
||
POP P,AC0 ;AND SYMBOL
|
||
CALL SEARCH ;SET UP SX AGAIN
|
||
JFCL ;WILL ALWAYS FAIL
|
||
TRZ FRR,NOUNVS ;[713] SEARCH UNIVERSALS AGAIN
|
||
MOVEM ARG,0(P) ;STACK POINTER TO POLISH
|
||
SETZ ARG,
|
||
TLO ARG,SPTR!SYMF ;SET ONLY THE REQUIRED FLAGS
|
||
JRST SYMBKY ;GO INSERT
|
||
|
||
>
|
||
|
||
SRCH: HLRZ SX,SRCHX
|
||
HRRZ SDEL,SRCHX
|
||
SRCH1: CAML AC0,-1(SX)
|
||
JRST SRCH3
|
||
SRCH2: SUB SX,SDEL
|
||
LSH SDEL,-1
|
||
IFE FTPSECT,< ;[575]
|
||
CAMG SX,SYMTOP
|
||
> ;[575]
|
||
IFN FTPSECT,< ;[575]
|
||
CAMG SX,SGSTOP
|
||
> ;[575]
|
||
JUMPN SDEL,SRCH1
|
||
JUMPN SDEL,SRCH2
|
||
SOJA SX,CPOPJ ;NOT FOUND
|
||
SRCH3: CAMN AC0,-1(SX)
|
||
JRST CPOPJ1 ;NORMAL / FOUND EXIT
|
||
ADD SX,SDEL
|
||
LSH SDEL,-1
|
||
IFE FTPSECT,< ;[575]
|
||
CAMG SX,SYMTOP
|
||
> ;[575]
|
||
IFN FTPSECT,< ;[575]
|
||
CAMG SX,SGSTOP
|
||
> ;[575]
|
||
JUMPN SDEL,SRCH1
|
||
JUMPN SDEL,SRCH2
|
||
SOJA SX,CPOPJ ;NOT FOUND
|
||
|
||
INSERQ: TLNE ARG,VARF ;[1210] IS THIS A VAR?
|
||
JUMP1 INSERT ;[1210] YES-DON'T DESTROY VALUE ON PASS 1
|
||
TLNE ARG,UNDF!VARF ;[1210]
|
||
INSERZ: SETZB RC,V
|
||
INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?
|
||
JRST INSRT2 ;NO, JUST INSERT
|
||
JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND
|
||
SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?
|
||
JRST UPDATE ;YES, UPDATE
|
||
JRST INSRT2 ;NO, INSERT
|
||
|
||
INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?
|
||
JRST UPDATE ;YES, UPDATE
|
||
SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT
|
||
INSRT2: MOVE SDEL,SYMBOL
|
||
SUBI SDEL,2
|
||
CAMLE SDEL,FREE
|
||
JRST INSRT3
|
||
CALL XCEEDS
|
||
ADDI SDEL,2000
|
||
INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY
|
||
HRLI SDEL,2(SDEL)
|
||
BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS
|
||
IFN FTPSECT,< ;[575]
|
||
MOVE AC1,SGNCUR ;CURRENT PSECT INDEX
|
||
AOS SGSCNT(AC1) ;INCREMENT PSECT SYM COUNT
|
||
>
|
||
AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT
|
||
TDNE RC,[-2,,-2] ;SPECIAL LEFT OR RIGHT EXTERNAL?
|
||
JRST INSRT5 ;YES, JUMP
|
||
TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE
|
||
JRST INSRT4 ;JUMP, ITS A 18BIT VALUE
|
||
AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE
|
||
CAML SDEL,SYMBOL ;MORE CORE NEEDED?
|
||
CALL XCEEDS ;YES
|
||
HRRI ARG,-1(SDEL) ;POINTER TO ARG
|
||
MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE
|
||
TLO ARG,PNTF ;NOTE THAT ARG IS A POINTER, NOT A 18BIT VALUE
|
||
JRST INSRT7 ;STORE SYMBOL
|
||
|
||
INSRT4: HRR ARG,V ;18 BIT VALUE ARG
|
||
TLNN ARG,EXTF ;POSSIBLE TO BE EXT WITH 0 RELOC SO DON'T
|
||
TLZ ARG,PNTF ;CLEAR POINTER FLAG IN CASE SET
|
||
INSRT7: DPB RC,RCPNTR ;FIX RIGHT RELOCATION
|
||
TLNE RC,1
|
||
TLO ARG,LELF ;FIX LEFT RELOCATION
|
||
INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.
|
||
MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.
|
||
CALL SRCHI ;INITILIAZE SRCHX
|
||
JRST QSRCH ;EXIT THROUGH CREF
|
||
|
||
INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE
|
||
ADDB SDEL,FREE
|
||
CAML SDEL,SYMBOL ;MORE CORE NEEDED?
|
||
CALL XCEEDS ;YES
|
||
MOVEM RC,-1(SDEL)
|
||
HRRI ARG,-2(SDEL) ;POINTER TO ARG
|
||
MOVEM V,0(ARG)
|
||
TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS
|
||
JRST INSRT6
|
||
|
||
REMOVE:
|
||
IFN FTPSECT,< ;[575]
|
||
MOVEI AC2,0(SX) ;ADDRESS OF THE SYMBOL
|
||
SUB AC2,SYMBOL ;- BASE OF SYMBOL TABLE
|
||
LSH AC2,-1 ;/ 2 = SYMBOL ORDINAL
|
||
TDZA AC1,AC1 ;INIT PSECT INDEX
|
||
ADDI AC1,1 ;INCREMENT PSECT INDEX
|
||
HRRZ AC0,SGSCNT(AC1) ;WITHIN THIS PSECT?
|
||
SUB AC2,AC0
|
||
JUMPG AC2,.-3 ;TRY NEXT PSECT IF NOT
|
||
SOS SGSCNT(AC1) ;DECREMENT PSECT SYM COUNT
|
||
>
|
||
SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS
|
||
REMOV1: MOVE 0(SX)
|
||
MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL
|
||
CAME SX,SYMBOL ;SKIP WHEN DONE
|
||
SOJA SX,REMOV1
|
||
ADDI SX,2
|
||
MOVEM SX,SYMBOL
|
||
SOS 0(SX) ;DECREMENT THE SYMBOL COUNT
|
||
|
||
SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX
|
||
IFE FTPSECT,< ;[575]
|
||
FAD AC2,@SYMBOL
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
HRRZ AC1,SGNCUR
|
||
HRRZ AC1,SGSCNT(AC1)
|
||
FAD AC2,AC1
|
||
>
|
||
LSH AC2,-^D27
|
||
MOVEI AC1,1000
|
||
LSH AC1,-357(AC2)
|
||
HRRM AC1,SRCHX
|
||
LSH AC1,1
|
||
IFE FTPSECT,< ;[575]
|
||
ADD AC1,SYMBOL
|
||
HRLM AC1,SRCHX
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
HRLM AC1,SRCHX
|
||
MOVE AC1,SYMBOL
|
||
MOVEM AC1,SGSBOT
|
||
HRRZ AC2,SGNCUR
|
||
JUMPE AC2,SRCHI2
|
||
SRCHI1: HRRZ AC1,SGSCNT-1(AC2)
|
||
LSH AC1,1
|
||
ADDB AC1,SGSBOT
|
||
SOJG AC2,SRCHI1
|
||
SRCHI2: MOVS AC2,AC1
|
||
ADDM AC2,SRCHX
|
||
MOVE AC2,SGNCUR
|
||
SRCHI3: HRRZ AC1,SGSCNT(AC2)
|
||
LSH AC1,1
|
||
ADD AC1,SGSBOT
|
||
MOVEM AC1,SGSTOP
|
||
>
|
||
RET ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4
|
||
|
||
UPDATE: ;[745] TEST SPTR BEFORE DOING R-RELOC
|
||
TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER
|
||
JRST UPDAT4 ;YES, USE THE TWO CELLS
|
||
IFN POLISH,< ;[1101]
|
||
SKIPL RC ;[1101] SKIP FIXUP IF POLISH
|
||
> ;[1101]
|
||
TDNE RC,[-2,,-2] ;NEED TO CHANGE ANY CURRENT EXTERNS
|
||
JRST UPDAT5 ;YES ,JUMP
|
||
DPB RC,RCPNTR ;[1116][745] FIX RIGHT RELOCATION
|
||
TLZ ARG,LELF ;CLEAR LELF
|
||
TLNE RC,1 ;LEFT RELOCATABLE?
|
||
TLO ARG,LELF ;YES, SET THE FLAG
|
||
TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?
|
||
JRST UPDAT2 ;YES, USE IT.
|
||
TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?
|
||
JRST UPDAT1 ;YES, GET A CELL
|
||
HRR ARG,V ;NO, USE RH OF ARG
|
||
UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE
|
||
IFE FTPSECT,< ;[575]
|
||
RET ;AND EXIT
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
JRST UPDAT6 ;AND EXIT
|
||
>
|
||
|
||
UPDAT1: AOS SDEL,FREE ;GET ONE CELL
|
||
CAML SDEL,SYMBOL ;NEED MORE CORE?
|
||
CALL XCEEDS ;YES
|
||
HRRI ARG,-1(SDEL) ;POINTER TO ARG
|
||
TLO ARG,PNTF ;AND NOTE IT.
|
||
UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?
|
||
JRST UPDAT3 ;YES, - JUST SAVE A LOCATION
|
||
MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE
|
||
MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE
|
||
IFE FTPSECT,< ;[575]
|
||
RET ;AND EXIT
|
||
>
|
||
IFN FTPSECT,< ;[575]
|
||
JRST UPDAT6 ;AND EXIT
|
||
>
|
||
|
||
UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM
|
||
MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE
|
||
MOVEM RC,1(ARG) ;SAVE RELOCATION BITS
|
||
RET ;AND EXIT
|
||
|
||
UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL
|
||
ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS
|
||
CAML SDEL,SYMBOL ;NEED MORE CORE?
|
||
CALL XCEEDS ;YES
|
||
MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS
|
||
HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG
|
||
MOVEM V,0(ARG) ;SAVE A 36BIT VALUE
|
||
TLO ARG,SPTR ;SET SPECIAL PNTR FLAG
|
||
TLZ ARG,PNTF ;CLEAR POINTER FLAG
|
||
IFN POLISH,<
|
||
TLZE ARG,OPDF ;[624] OPDEF?
|
||
TLO ARG,SYMF ;[624] MAKE IT INTO SYMBOL
|
||
>
|
||
JRST UPDAT3 ;SAVE THE POINTER AND EXIT
|
||
IFN FTPSECT,< ;[575]
|
||
UPDAT6: TLNE ARG,EXTF!MACF ;[1242] EXTERNAL OR MACRO REDEFINITION?
|
||
RET ;YES, RETURN
|
||
MOVE SDEL,SYMBOL ;GET START OF SYM TAB
|
||
SETZ AC1, ;ZERO PSECT INX
|
||
UPDAT7: HRRZ AC2,SGSCNT(AC1) ;PSECT SYM CNT
|
||
LSH AC2,1 ;DOUBLE IT
|
||
ADD SDEL,AC2 ;END OF PSECT
|
||
CAMGE SDEL,SX ;SYM IN THIS PSECT?
|
||
AOJA AC1,UPDAT7 ;NO, TRY NEXT PSECT
|
||
CAMN AC1,SGNCUR ;IF IT'S IN THE CUR PSECT
|
||
RET ;THEN RETURN
|
||
PUSH P,AC1 ;SAVE PRESENT PSECT INX
|
||
PUSH P,0(SX) ;SAVE SYMBOL STUFF
|
||
PUSH P,-1(SX) ;AND NAME
|
||
PUSH P,SX ;SAVE PRESENT SYM INX
|
||
CALL SRCHI ;SET UP SRCHX
|
||
CALL SRCH ;SET UP NEW SX
|
||
JFCL
|
||
POP P,SDEL ;RESTORE PRESENT SYM INX
|
||
MOVE AC1,-2(P) ;GET PRESENT PSECT INX
|
||
CAMG AC1,SGNCUR ;WHICH WAY TO MOVE?
|
||
JRST UPDAT9 ;DOWN
|
||
ADDI SX,2 ;MUST MOVE THIS ONE ALSO
|
||
UPDAT8: MOVE AC2,-2(SDEL) ;MOVE PART OF
|
||
MOVEM AC2,0(SDEL) ;SYMBOL TABLE
|
||
CAILE SDEL,0(SX) ;ENOUGH MOVED?
|
||
SOJA SDEL,UPDAT8 ;NO
|
||
JRST UPDT10 ;COMMON EXIT
|
||
UPDAT9: HRLI AC2,1(SDEL) ;FROM HERE
|
||
HRRI AC2,-1(SDEL) ;TO HERE
|
||
BLT AC2,-2(SX) ;UNTIL HERE, MOVE!
|
||
UPDT10: POP P,-1(SX) ;RESTORE SYMBOL NAME
|
||
POP P,0(SX) ;AND STUFF
|
||
POP P,AC1 ;OLD PSECT INX
|
||
SOS SGSCNT(AC1) ;DECR ITS SYM CNT
|
||
MOVE AC1,SGNCUR ;CUR PSECT INX
|
||
AOS SGSCNT(AC1) ;INCR ITS SYM CNT
|
||
JRST SRCHI ;[664] SET UP SRCHX, RETURN
|
||
>
|
||
SUBTTL PHASED CODE
|
||
|
||
IFN PURESW,<LOWH:
|
||
PHASE LOWL>
|
||
|
||
IFN TEMP,<TMPFIL: SIXBIT /MAC/
|
||
XWD -200,0>
|
||
LSTFIL: BLOCK 1
|
||
SIXBIT /@/ ;SYMBOL TO STOP PRINTING
|
||
TABI:
|
||
IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11>
|
||
IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11>
|
||
SEQNO: BLOCK 1
|
||
ASCIZ / /
|
||
BININI: EXP B
|
||
BINDEV: BLOCK 1
|
||
XWD BINBUF,0
|
||
LSTINI: EXP AL
|
||
LSTDEV: BLOCK 1
|
||
XWD LSTBUF,0
|
||
IFN CCLSW,<
|
||
RPGINI: EXP AL
|
||
RPGDEV: BLOCK 1
|
||
XWD 0,CTLBLK
|
||
>
|
||
INDEVI: EXP A
|
||
INDEV: BLOCK 1
|
||
XWD 0,IBUF
|
||
|
||
UNVINI: EXP B ;OPEN BLOCK FOR BINARY UNV
|
||
UNVDEV: BLOCK 1 ;SO USER CAN SPECIFY
|
||
EXP UNVBUF
|
||
|
||
..LPP: EXP .LPP-2 ;"READ-ONLY" LINES/PAGE
|
||
|
||
REL1P: EXP ABSLOC ;[573]
|
||
EXP RELLOC ;PTR TO RELLOC BLOCK
|
||
|
||
;DATA AREA FOR COMPT. UUO'S
|
||
IFN TOPS20,<
|
||
|
||
DEFDIR: BLOCK ^D8 ;DEFAULT DIRECTORY NAME
|
||
DEFDEV: BLOCK ^D8 ;DEFAULT DEVICE NAME
|
||
BIGBUF: BLOCK ^D17
|
||
FILNAM: BLOCK ^D26
|
||
|
||
RUNARG: 4 ;RUN ARG
|
||
RUNBLK ;LONG FORM
|
||
-1,,FILNAM
|
||
1
|
||
RUNBLK: 100001,,0
|
||
377777,,377777
|
||
-1,,[ASCIZ /SYS/]
|
||
0
|
||
0
|
||
-1,,[ASCIZ /EXE/] ;DEFAULT EXT
|
||
BLOCK 3 ;THAT'S ALL
|
||
INARG: CHAR,,1
|
||
INBLK
|
||
-1,,FILNAM
|
||
440000,,200000
|
||
0
|
||
IBUF
|
||
0
|
||
.+1
|
||
INRIB: 5 ;SIZE OF RIB
|
||
BLOCK 5 ;DUMMY
|
||
INBLK: 100001,,0
|
||
377777,,377777
|
||
DINDEV: 0
|
||
DINDIR: 0
|
||
0
|
||
-1,,[ASCIZ /MAC/]
|
||
BLOCK 3
|
||
LSTARG: LST,,1
|
||
LSTBLK
|
||
-1,,FILNAM
|
||
070000,,100000
|
||
1
|
||
0
|
||
LSTBUF
|
||
.+1
|
||
BLOCK 4 ;DUMMY RIB
|
||
LSTBLK: 400001,,0
|
||
377777,,377777
|
||
0
|
||
0
|
||
LSTNAM: 0 ;NAME
|
||
LSTEXT: 0 ;EXTENSION
|
||
BLOCK 3
|
||
BINADR: BIN,,1
|
||
BINSTK ;LONG FORM
|
||
-1,,FILNAM
|
||
440000,,100000 ;WRITE ACCESS
|
||
14
|
||
0
|
||
BINBUF
|
||
.+1
|
||
BLOCK 4 ;DUMMY RIB
|
||
BINSTK: 400001,,0 ;FLAGS
|
||
377777,,377777
|
||
0
|
||
0
|
||
0
|
||
-1,,[ASCIZ /REL/] ;DEFAULT EXTENSION
|
||
BLOCK 3 ;ALL REST ARE ZERO
|
||
|
||
|
||
RPGADR: CTL2,,1 ;BLOCK FOR COMMAND FILE
|
||
RPGBLK
|
||
-1,,FILNAM
|
||
440000,,200000 ;OPENF BITS
|
||
0
|
||
CTLBLK
|
||
0
|
||
.+1 ;RIB ADDRESS
|
||
5 ;SIZE OF BLOCK WHICH FOLLOWS
|
||
BLOCK 5
|
||
RPGBLK: 100001,,0 ;OLD FILE
|
||
377777,,377777
|
||
BLOCK 3 ;NO DEFAULTS HERE
|
||
-1,,[ASCIZ /CCL/] ;DEFAULT EXTTENSION
|
||
BLOCK 3
|
||
> ;END OF TOPS20 CONDITIONAL
|
||
|
||
DBUF: ASCIZ / TI:ME DY-MON-YR Page /
|
||
VBUF: ASCIZ / MACRO %/ ;MUST BE LAST LOCATIONS IN BLOCK
|
||
IFE PURESW,< BLOCK 3> ;ALLOW FOR LONG TITLE
|
||
IFN PURESW,< DEPHASE
|
||
LENLOW==.-LOWH>
|
||
SUBTTL STORAGE CELLS
|
||
|
||
IFN PURESW,< RELOC LOWL
|
||
LOWL: BLOCK LENLOW+3 >
|
||
PASS1I:
|
||
CTLBUF: BLOCK <CTLSIZ+5>/5 ;[700]
|
||
PASS1U: ;[700]
|
||
RP: BLOCK 1
|
||
IFN POLISH,<
|
||
POLSTK: BLOCK 1
|
||
POLPTR: BLOCK 1
|
||
>
|
||
LSTBUF: BLOCK 3
|
||
BINBUF: BLOCK 3
|
||
IBUF: BLOCK 3
|
||
UNVBUF: BLOCK 3
|
||
LSTDIR: BLOCK 4
|
||
BINDIR: BLOCK 4
|
||
INDIR: BLOCK 4
|
||
UNVDIR: BLOCK 4
|
||
UNVPTH: BLOCK 2+.SFDLN ;PATH FOR UNV LOOKUP
|
||
MYPPN: BLOCK 1 ;LOGGED IN PPN
|
||
|
||
ACDELX: ;LEFT HALF
|
||
BLKTYP: BLOCK 1 ;RIGHT HALF
|
||
|
||
COUTX: BLOCK 1
|
||
COUTY: BLOCK 1
|
||
COUTP: BLOCK 1
|
||
COUTRB: BLOCK 1
|
||
COUTDB: BLOCK ^D18
|
||
CURADX: BLOCK 1 ;[613] CURRENT RADIX
|
||
MACDVR: BLOCK 1 ;[635] STORE DIVISOR FOR BACKSLASH MACRO ARG
|
||
MACADR: BLOCK 1 ;[635] STORE ADDER FOR BACKSLASH MACRO ARG
|
||
UPARRO: BLOCK 1 ;-1 == RE-EAT ^ IF NOT FOLLOWED BY ! / -
|
||
OKOVFL: BLOCK 1 ;-1 == * OR / OVERFLOW OK
|
||
EOFFLG: BLOCK 1 ;END OF FILE SEEN, NEXT FILE OPENED
|
||
NOUUO: BLOCK 1 ;[1041] -1 MEANS NO UUO SEARCH
|
||
IFN TSTCD,<
|
||
TCDFLG: BLOCK 1 ;-1 MEANS TEST MODE, 0 REGULAR MODE
|
||
>
|
||
|
||
UNDCNT: BLOCK 1 ;UND SYMBOL COUNT--CLEARED AND INCREMENTED IN UOUT
|
||
ERRCNT: BLOCK 1
|
||
QERRS: BLOCK 1 ;COUNT OF "Q" ERRORS
|
||
FREE: BLOCK 1
|
||
HIGH1: BLOCK 1
|
||
HISNSW: BLOCK 1
|
||
SVTYP3: BLOCK 1
|
||
HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG.
|
||
RLHMIN: BLOCK 1 ;[1111] LOWER BOUND FOR HI SEG WHEN COMPARING
|
||
;[1111] RELOCATABLES... HMIN-400.
|
||
SXSV: BLOCK 1
|
||
SDELSV: BLOCK 1
|
||
COLSIZ: BLOCK 1
|
||
SYMBLK: BLOCK 1
|
||
IFBLK: BLOCK .IFBLK
|
||
IFBLKA: BLOCK .IFBLK
|
||
LADR: BLOCK 1
|
||
NCOLLS: BLOCK 1
|
||
LIMBO: BLOCK 1
|
||
LBUFP: BLOCK 1
|
||
LBUF: BLOCK <.CPL+5>/5
|
||
.SGLVZ==. ;START OF LIT /VAR AREA
|
||
BLOCK 1 ;[602] CURRENT LITLVL BEFORE PSECT SWITCH
|
||
.SGX: BLOCK 1 ;[602] CURRENT STPX BEFORE PSECT SWITCH
|
||
.SGY: BLOCK 1 ;[602] CURRENT STPY BEFORE PSECT SWITCH
|
||
|
||
|
||
BLOCK 1 ;[1224] START LOCATION OF VARIABLES
|
||
VARHD: BLOCK 1
|
||
VARHDX: BLOCK 1
|
||
VARCNT: BLOCK 1 ;VARIABLE COUNTER
|
||
|
||
LITAB: BLOCK 1
|
||
LITABX: BLOCK 1
|
||
BLOCK 1 ;[1166] STORE OUTPUT LOCATION & RELOCATION
|
||
BLOCK 1
|
||
LITHD: BLOCK 1
|
||
LITHDX: BLOCK 1
|
||
LITCNT: BLOCK 1
|
||
LITNUM: BLOCK 1
|
||
.SGLVL==.-.SGLVZ ;LENGTH OF LIT/VAR AREA
|
||
|
||
ENDSN: BLOCK 1 ;-1 IF CHECKED VAR AREA BEFORE LISING END
|
||
LOOKX: BLOCK 1
|
||
NEXT: BLOCK 1
|
||
OUTSW: BLOCK 1
|
||
PDP: BLOCK 1
|
||
RECCNT: BLOCK 1
|
||
SAVBLK: BLOCK RC
|
||
SAVERC: BLOCK 1
|
||
SBUF: BLOCK .SBUF/5
|
||
SRCHX: BLOCK 1
|
||
SUBTTX: BLOCK 1
|
||
SVSYM: BLOCK 1
|
||
SYMBOL: BLOCK 1
|
||
SYMTOP: BLOCK 1
|
||
SYMCNT: BLOCK 1
|
||
IFN FTPSECT,< ;[575]
|
||
SGNMAX: BLOCK 1
|
||
SGNAME: BLOCK SGNSGS+1
|
||
SGRELC: BLOCK SGNSGS+1
|
||
SGSCNT: BLOCK SGNSGS+1
|
||
SGATTR: BLOCK SGNSGS+1
|
||
SGORIG: BLOCK SGNSGS+1 ;LIT/VAR AREA ,, ORIGIN OF PSECT
|
||
SGFWOR: BLOCK SGNSGS+1 ;[1235] FULLWORD PSECT ORIGIN
|
||
SGSBOT: BLOCK 1
|
||
SGSTOP: BLOCK 1
|
||
SGWFND: BLOCK 1
|
||
>
|
||
|
||
STPX: BLOCK 1
|
||
STPY: BLOCK 1
|
||
STCODE: BLOCK .STP
|
||
STOWRC: BLOCK .STP
|
||
|
||
IFN FORMSW,<
|
||
STFORM: BLOCK .STP
|
||
FORM: BLOCK 1
|
||
HWFMT: BLOCK 1
|
||
FLDSIZ: BLOCK 1
|
||
IOSEEN: BLOCK 1
|
||
>
|
||
TABP: BLOCK 1
|
||
TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF
|
||
TBUF: BLOCK .TBUF/5
|
||
TTLFND: BLOCK 1 ;[1123] -1 IF TITLE/UNIVERSAL SEEN IN MODULE
|
||
DEVBUF: BLOCK 12 ;STORE NAME.EXT CREATION DATE AND TIME
|
||
TYPERR: BLOCK 1
|
||
PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS
|
||
PGENDF: BLOCK 1 ;[1141] -1 IF PRGEND FOUND
|
||
ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE
|
||
UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN
|
||
UNVSKP: BLOCK 1 ;-1 IF /U SEEN (DON'T SAVE UNIV)
|
||
CPUTYP: BLOCK 1 ;CPU TYPE FOR HEADER BLOCK
|
||
|
||
PASS2I:
|
||
|
||
ABSHI: BLOCK 1
|
||
HIGH: BLOCK 1
|
||
HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.
|
||
IFN FTPSECT,< ;[575]
|
||
BLK24: BLOCK 1 ;[1020] -1 IF TO OUTPUT BLOCK 24
|
||
SGNCUR: BLOCK 1
|
||
SGDMAX: BLOCK 1
|
||
SGLIST: BLOCK SGNDEP+1
|
||
SGSRCH: BLOCK 1 ;[1070] -1 IF SEARCHING ONLY CURRENT PSECT
|
||
SGLTLV: BLOCK SGNDEP+1 ;[1074] PSECT ENTRY LITERAL LEVEL
|
||
SGSWPT: BLOCK 1 ;[1074] PSECT SWAP TYPE, 0 = .PSECT, -1 = .ENDPS
|
||
SGLITL: BLOCK 1 ;[1074] TOTAL LITERALS OPEN IN ALL PSECTS
|
||
>
|
||
ACDEVX: BLOCK 1
|
||
CPL: BLOCK 1
|
||
CTLSAV: BLOCK 1
|
||
CTLS1: BLOCK 1
|
||
EXTPNT: BLOCK 1
|
||
INTENT: BLOCK 1
|
||
INREP: BLOCK 1
|
||
INDEF: BLOCK 1
|
||
INTXT: BLOCK 1
|
||
INCND: BLOCK 1
|
||
CALNAM: BLOCK 1
|
||
COMSW: BLOCK 1 ;-1 IF IN COMMENT WHILE SCANNING FOR ANG.BRKT.
|
||
;DO NOT SPLIT THIS BLOCK OF 4 WORDS
|
||
PAGENO: BLOCK 1
|
||
SEQNO2: BLOCK 1
|
||
TAG: BLOCK 1
|
||
TAGINC: BLOCK 1
|
||
CALPG: BLOCK 4
|
||
DEFPG: BLOCK 4
|
||
LITPG: BLOCK 4
|
||
REPPG: BLOCK 4
|
||
TXTPG: BLOCK 4
|
||
CNDPG: BLOCK 4
|
||
IRPCNT: BLOCK 1
|
||
IRPARG: BLOCK 1
|
||
IRPARP: BLOCK 1
|
||
IRPCF: BLOCK 1
|
||
IRPPOI: BLOCK 1
|
||
IRPSW: BLOCK 1
|
||
LSTPY: BLOCK 1 ;SAVED STPY IN LITERAL
|
||
LITLVL: BLOCK 1
|
||
LBLFLG: BLOCK 1 ;-1 IF LABEL HAS OCCURRED INSIDE CURRENT LITERAL
|
||
LTGINC: BLOCK 1 ;DEPTH OF LABEL IN LITERAL
|
||
LBLPNT: BLOCK 1 ;POINTS TO THE START OF TAGS IN LITERAL CHAIN
|
||
LBLNXT: BLOCK 1 ;POINTS TO THE NEXT BLOCK IN CHAIN
|
||
LITV: BLOCK 1 ;ACTUAL ADDR OF THIS LITERAL
|
||
LITRC: BLOCK 1 ;BLOCK RELOCATION FOR THIS LITERAL
|
||
LITN: BLOCK 1 ;SAVE LITNUM BEFORE IT GETS UPDATED IN STOLIT
|
||
SQBST: BLOCK 1 ;START OF LIT SCOPE FOR CHECKING TAG FIXUPS IN LITERAL POOL
|
||
SQBRC: BLOCK 1 ;KEEP THE FAKE EXT PTR , WHEN DOING LIT TAG FIXUPS
|
||
|
||
ASGBLK: BLOCK 1
|
||
LOCBLK: BLOCK 1
|
||
|
||
LOCA: BLOCK 1
|
||
LOCO: BLOCK 1
|
||
BNSN: BLOCK 1 ;-1 IF CODE STORED
|
||
RELLOC: BLOCK 2 ;[573]
|
||
ABSLOC: BLOCK 1
|
||
LPP: BLOCK 1
|
||
ORGMOD: BLOCK 1
|
||
MODA: BLOCK 1
|
||
MODLOC: BLOCK 1
|
||
MODO: BLOCK 1
|
||
MODN: BLOCK 1 ;NEW MODE,,NEW PC
|
||
NESTED: BLOCK 1 ;-1 IF IN LITERAL, MACRO, REPEAT 1 OR IF'S
|
||
IFN CCLSW,<OTBUF: BLOCK 2>
|
||
OUTSQ: BLOCK 2
|
||
PAGEN.: BLOCK 1
|
||
PPTEMP: BLOCK 1
|
||
PPTMP1: BLOCK 1
|
||
PPTMP2: BLOCK 1
|
||
|
||
REPCNT: BLOCK 1
|
||
REPEXP: BLOCK 1
|
||
REPPNT: BLOCK 1
|
||
RPOLVL: BLOCK 1
|
||
R1BCNT: BLOCK 1
|
||
R1BCHK: BLOCK 1
|
||
R1BBLK: BLOCK .R1B
|
||
R1BLOC: BLOCK 1
|
||
RIMLOC: BLOCK 1
|
||
VECREL: BLOCK 1
|
||
VECTOR: BLOCK 1
|
||
VECSYM: BLOCK 1 ;GLOBAL SYMBOLIC START ADDRESS
|
||
IFN FTPSECT,< ;[575]
|
||
VECFND: BLOCK 1
|
||
>
|
||
.TEMP: BLOCK 1 ;TEMPORARY STORAGE
|
||
UNISCH: BLOCK .UNIV+1 ;SEARCH TABLE FOR UNIVERSALS
|
||
SQFLG: BLOCK 1
|
||
ARGF: BLOCK 1
|
||
CPEEKC: BLOCK 1 ;ANGLE COUNT AFTER ;; IN MACRO
|
||
MACENL: BLOCK 1
|
||
MACLVL: BLOCK 1
|
||
MACPNT: BLOCK 1
|
||
WWRXX: BLOCK 1
|
||
RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF
|
||
WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF
|
||
IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS
|
||
LOCAL: BLOCK 1 ;LINKED LIST OF LOCAL FIXUPS
|
||
IFN FTPSECT,< ;[735]
|
||
BLOCK SGNSGS ;[735] ADDITIONAL LOCALS (ONE PER PSECT)
|
||
> ;[735]
|
||
INOPDF: BLOCK 1 ;[624] POLISH FIXUP NEEDED FOR THIS OPDEF
|
||
IFN POLISH,<
|
||
POLTYP: BLOCK 1 ;PRESET IF POLISH FIXUP TYPE KNOWN
|
||
POLIST: BLOCK 1 ;LINKED LIST OF POLISH FIXUP BLOCKS
|
||
POLITS: BLOCK 1 ;LINKED LIST OF POLISH FIXUPS TO LITS (TEMP)
|
||
BYTEAC: BLOCK 1 ;[777] KEEP ACCUMULATED BYTE SIZE
|
||
BYTESZ: BLOCK 1 ;[777] TO KEEP CURRENT BYTE SIZE
|
||
BSHIFT: BLOCK 1 ;[1037] -1 IF DOING B-SHIFT & WITH POLISH EXP
|
||
BSHFLG: BLOCK 1 ;[1054] -1 IF EVALUATING 2ND ARG TO BSHIFT
|
||
INBYTE: BLOCK 1 ;[761] -1 IF DOING BYTE & POLISH NOT ALLOWED
|
||
INIOWD: BLOCK 1 ;[730] -1 WHEN DOING IOWD(NOT IN ANGLE-BRACKETS)
|
||
INANGL: BLOCK 1 ;-1 WHEN INSIDE ANGLE BRACKETS
|
||
INASGN: BLOCK 1 ;HOLDS SYMBOL NAME DURING ASSIGN IN CASE NEEDS POLISH
|
||
INXWD: BLOCK 1 ;[1010] -1 IF DOING XWD
|
||
LSTOPR: BLOCK 1 ;POINTER TO STORE OP FOR LAST POLISH
|
||
PINDFL: BLOCK 1 ;[1114] -1 IF SAVING INDIRECTION DURING POLISH INDEXING
|
||
PLHIDX: BLOCK 1 ;[1114] -1 IF INDEX VALUE SAVED FROM POLIDX FOR OP
|
||
PIDXVL: BLOCK 1 ;[1114] INDEX VALUE SAVED FROM POLIDX
|
||
PIDXRC: BLOCK 1 ;[1114] INDEX RELOCATION SAVED FROM POLIDX
|
||
>
|
||
SFDADD: BLOCK 3+.SFDLN ;FOR LOOKUP/ENTER OF SFD PATH
|
||
SFDE==.-1 ;END OF SFD
|
||
PPPN: BLOCK 1 ;DEFAULT PPN
|
||
PSFD: BLOCK 3*.SFDLN ;DEFAULT SFD
|
||
PSFDE==.-1 ;LAST ADDRESS IN SFD
|
||
BINSFD: BLOCK 3+.SFDLN
|
||
LSTSFD: BLOCK 3+.SFDLN
|
||
LITLST: BLOCK 1 ;LIST BINARY IN LITERALS IF NON-0
|
||
BLSW: BLOCK 1 ;BINARY LISTING CONTROL SWITCHES
|
||
NOTFL: BLOCK 1 ;-1 IF NOT FIRST LINE.
|
||
;-2 IF LAST LINE.
|
||
;0 OR +N FOR CHAR COUNT OF FIRST LINE.
|
||
IFXLSW: BLOCK 1 ;XLIST IN IF SWITCH
|
||
INTPGR: BLOCK 1 ;[655] -1 IF INTERNAL PAGE REQUEST
|
||
XWDANG: BLOCK 1 ;[706] PTR TO LH POL IN <POL,,>
|
||
SAVCV: BLOCK 1 ;[773] OPERAND VALUE WHEN DOING FORCED POLISH
|
||
SAVRC: BLOCK 1 ;[773] OPERAND RC WHEN DOING FORCED POLISH
|
||
XWDLRC: BLOCK 1 ;[773] RELOCATION FOR LEFT HALF OF XWD IN ANGLE BRACKETS
|
||
XWDLV: BLOCK 1 ;[773] VALUE FOR LEFT HALF OF XWD IN ANGLE BRACKETS
|
||
XWDRRC: BLOCK 1 ;[773] RELOCATION FOR RIGHT HALF
|
||
XWDRV: BLOCK 1 ;[773] VALUE FOR RIGHT HALF
|
||
RELARG: BLOCK 1 ;[721] -1 IF RELOC OR LOC HAS EXPLICIT ARG
|
||
CPLSAV: BLOCK 1 ;[1003]
|
||
CRFLG: BLOCK 1 ;[1003] -1 TO REQUEST CRLF AFTER FF
|
||
MACTAB: BLOCK 1 ;[1033] -1 == OLD FORMAT MACRO ARGS
|
||
ITABM: BLOCK 1 ;[1033] INCLUDE TABS IN MACRO ARGS IF NON-0
|
||
IFSRCH: BLOCK 1 ;[1056] NONZERO IF SEARCH DONE DURING .IF(N)
|
||
.IFFLG: BLOCK 1 ;[1056] -1 IF EVALUATING .IF(N) ARG
|
||
.IFNUM: BLOCK 1 ;[1056] -1 IF SAW NUMBER DURING .IF(N)
|
||
.IFANG: BLOCK 1 ;[1056] -1 IF SAW ANGLE-BRACKETED EXP DURING .IF(N)
|
||
.IFNAM: BLOCK 1 ;[1112] NON 0 IF WE HAVE A SINGLE RADIX50 NAME DURING .IF(N)
|
||
POLAD0: BLOCK 1 ;[1060] FIXUP ADDRESS FOR ?MCRPTC
|
||
POLSY0: BLOCK 1 ;[1060] FIXUP SYMBOL FOR ?MCRPTC
|
||
POLPS0: BLOCK 1 ;[1060] FIXUP PSECT FOR ?MCRPTC
|
||
POLERR: BLOCK 1 ;[1060] POLISH BLOCK COUNT FOR ERROR
|
||
;[1060] ROUTINE (SEE PCOUTR)
|
||
CRLFSN: BLOCK 1 ;[1064] -1 IF DON'T NEED CRLF FOR LALL IN SALL
|
||
IOFLGS: BLOCK 1 ;[1065] LISTING FLAGS TO BE SET AFTER LINE OUTPUT
|
||
PREFIX: BLOCK 1 ;[1066] PREFIX FOR ERROR MESSAGE (MCRxxx)
|
||
BYTESW: BLOCK 1 ;[1114] -1 IF DOING BYTE PSEUDO-OP
|
||
PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND
|
||
LSTSYM: BLOCK 1
|
||
SPAGNO: BLOCK 1 ;PAGE NUMBER FOR SYMBOL TABLES
|
||
SPAGN.: BLOCK 1 ;PAGE OFFSET STORAGE DURING SYMBOL OUTPUT
|
||
PASS2X:
|
||
SUBTTL MULTI-ASSEMBLY STORAGE CELLS
|
||
|
||
SAVEPP: BLOCK 1 ;SAVE P IN CASE NO END STATEMENT
|
||
SAVEMP: BLOCK 1 ;MACRO PNTR FOR SAME REASON
|
||
SAVERP: BLOCK 1 ;MACRO READ POINTER
|
||
LSTPGN: BLOCK 1
|
||
ARAYP: BLOCK 1
|
||
HDAS: BLOCK 1
|
||
IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)
|
||
SAVFF: BLOCK 1>
|
||
CTLBLK: BLOCK 3
|
||
CTIBUF: BLOCK 3
|
||
CTOBUF: BLOCK 3
|
||
IFN TEMP,<TMPFLG: BLOCK 1>
|
||
IFN FORMSW,<PHWFMT: BLOCK 1>
|
||
UNIFLG: BLOCK 1 ;[700] -1 IF UNIERR
|
||
CTL2SV: BLOCK 1 ;[700] COMMAND LINE CHAR COUNT
|
||
MRUNV: BLOCK 1 ;[700] -1 IF MEM-RES UNVS IN ASSEMBLY
|
||
MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG
|
||
UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS
|
||
UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE
|
||
UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN
|
||
UNITBL: BLOCK .UNIV+1 ;TABLE OF UNIVERSAL NAMES
|
||
UNIPTR: BLOCK .UNIV+1 ;TABLE OF SYMBOL POINTERS
|
||
UNISHX: BLOCK .UNIV+1 ;TABLE OF SRCHX POINTERS
|
||
UNVDFA: BLOCK 1 ;DEFAULT ARGUMENT POINTER FOR UNIVERSAL I/O
|
||
UNVER%: BLOCK 1 ;OLD UNIVERSAL FILE IF -1, MAY HAVE LOST DEFAULT ARGUMENTS
|
||
UNVPOL: BLOCK 1 ;STORE POLISH PTR, USED TO FIND THE END OF POLISH STACK
|
||
UNVNPL: BLOCK 1 ;NEW(ADJUSTED) POLISH PTR WHEN READING UNV FILE
|
||
UWVER: BLOCK 1 ;ACCUMULATE FEATURE BITS FOR WRITING UNV FILE
|
||
RTIME: BLOCK 1 ;[1231] CPU TIME AT START OF PASS
|
||
R1TIME: BLOCK 1 ;[1231] PASS1 RUNTIME
|
||
CPUV: BLOCK 1 ;[775] CPU VALUE
|
||
MACPRF: BLOCK 1 ;MACRO DEF PREFERRED OVER SYMBOL IF NON-0
|
||
PHALVL: BLOCK 1 ;-1 IN PHASE, 0 NOT IN PHASE
|
||
POLWRD: BLOCK 1 ;[1161] USED FOR COUNT FOR POLISH WORDS IN
|
||
;[1161] BLOCK TYPE 11
|
||
INRMRK: BLOCK 1 ;[1177] -1 IF DOING REMARK
|
||
VAR ;CLEAR VARIABLES
|
||
|
||
IFE FTPSECT,<SYN HIGH,SGATTR> ;[575]
|
||
JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE
|
||
IFN PURESW,<LOWEND==.-1
|
||
RELOC >
|
||
|
||
END BEG
|