File: SABR.CO of Tape: OS8/OS8-V3D/al-4692c-sa-os8-v3d-2
(Source file text) 

/SABR ASSEMBLER, V17
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1974 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
/
/NOTE: WHENEVER ABOVE VERSION NUMBER IS CHANGED
/BE SURE TO ALSO CHANGE VERSION NUMBER FOR TYPEOUT.
/THIS IS AT VERSN+13 (ABOUT P. 83)
/
/THERE ARE TWO BASIC PHASES OF OPERATION WITHIN
/SABR:(A) COLLECTION AND (B) ASSEMBLY. IN PASS 1
/SABR COLLECTS A FULL PAGE OF DATA AND THEN
/ASSEMBLES THE FULL PAGE. IN PASS2 COLLECTION
/AND ASSEMBLY ARE CARRIED OUT ON A LINE-
/BY-LINE BASIS RATHER THAN PAGE-BY-
/PAGE. FOLLOWING IS A DESCRIPTIVE FLOW CHART OF
/THE PRINCIPAL METHODS OF OPERATION USED IN
/THE PROGRAM DURING PASS1.
/(1) BEGINNING AT START THERE ARE TWO ROUTINES NECESSARY
/TO INTIALIZE THE ENTIRE PROGRAM. IOINIT CARRIES
/OUT THE DIALOG WITH THE USER TO DETERMINE WHICH
/I/O DEVICES WILL BE USED. INITA INTIALIZES ALL
/THE FLAGS AND TABLES WHICH ARE USED CONTINOUSLY
/THROUGHOUT THE PROGRAM.
/(2) THE DRIVER FOR THE FULL PAGE-BY-PAGE ASSEMBLER
/IS CONTAINED IN THE LOOP THAT RUNS FROM RSTRT
/TO RSTRT6-1. THIS LOOP OPERATES AS FOLLOWS.
/FIRST IT CALLS INILPT WHICH INITIALIZES ALL
/THOSE FLAGS AND TABLES WHICH MUST BE
/REFRESHED OR REBUILT FOR EACH PAGE OF CODE.
/THEN IT CALLS THE MAIN LINE-BY-LINE
/COLLECTION LOOP (WHICH IS DESCRIBED IN ITEM 3).
/WHEN A FULL PAGE OF CODE HAS BEEN COLLECTED
/THE DRIVER THEN CALLS L55 TO ASSEMBLE THE
/PAGE (SEE ITEM 8).
/(3) THE COLLECTION LOOP RUNS FROM RSTRT1 THROUGH
/THE CODE AT RSTRT6. THIS LOOP FIRST CALLS
/INCPT WHICH PREPARES FLAGS AND INCREMENTS
/TABLE POINTERS FOR EACH LINE OF CODE. IT
/THEN CALLS THE LINE DECODER DCIL (SEE
/ITEM 4) FOLLOWED BY SETCT, THE ROUTINE WHICH
/INCREMENTS THE PAGE COUNTERS AS REQUIRED
/FOR THE GIVEN LINE (SEE ITEM 6). THEN
/THE COLLECTIONS LOOP PROCEEDS TO INTERPRET
/THE DATA LEFT BY DCIL AND STORE IT, PROPERLY
/CODED, ON THE PAGE TABLE. IF THERE WAS
/A TAG ("LFS" FOR "LOCATION FIELD SYMBOL") IT
/IS NECESSARY TO CALL RECT FOR A PAGE RECOUNT.
/(SEE ITEM 7). THEN THE SIZE OF THE PAGE SO
/FAR COLLECTED IS TALLYED UP BY CPGES. IF
/IT IS STILL .LE. 200. EVERYTHING IS FINE AND WE
/RUN THROUGH THE LOOP AGAIN. IF NOT WE
/FIRST SAVE (USING PUSHIN)
/ALL THE KEY INFORMATION ABOUT THE LINE WHICH
/CAUSED THE OVERFLOW AND THEN EXIT FROM THE
/COLLECTION LOOP TO ASSEMBLE THE PAGE.
/(4) CERTAIN NOTES ABOUT DCIL MAY BE HELPFUL. THIS
/ROUTINE CONTROLS INPUT OF THE SOURCE. INDEV
/(SET BY IOINIT) POINTS TO THE PROPER INPUT
/ROUTINE, HSR OR ASR. THESE ROUTINES
/READ ONE CHARACTER AT A
/TIME FROM THE INPUT DEVICE. THE ROUTINE CALLED
/R DRAWS CHARACTERS ONE AT A TIME FROM THE
/INPUT BUFFER (DATA). WHEN THIS BUFFER IS
/EMPTY R REFILLS IT USING @INDEV. FETCH
/USES R TO EXTRACT ONE CHARACTER AT A TIME FROM
/THE INPUT BUFFER AND DOES SOME PRELIMINARY
/SCREENING. RLN USES FETCH TO READ A
/FULL LINE OF CODE INTO THE LINE BUFFER.

/L65 READS ONE CHARACTER AT A TIME FROM
/THE LINE BUFFER. GTSYM READS THE LINE
/ITEM-BY-ITEM. IF THE ITEM IS A SYMBOL, GTSYM
/CALLS SRSYM TO LOOK UP THE ITEM IN THE
/MAIN SYMBOL TABLE OR ENTER IT IF IT IS NOT
/ALREADY THERE(SEE ITEM 5).
/**IMPORTANT**
/WHEN A SYMBOL HAS BEEN PLACED ON THE SYMBOL
/TABLE THE ADDRESS OF THE FIRST WORD OF THE
/ENTRY IS RETURNED AT "SYMBOL." THIS ADDRESS
/IS UNIQUE FOR EACH SYMBOL AND IN THE
/RANGE 2000-7575. THIS NUMBER IS USED
/THROUGHOUT THE PROGRAM AS THE IDENTIFIER FOR
/THIS SYMBOL. ** DCIL CONSIDERS EACH ITEM
/OF THE LINE AND ACTS APPROPRIATELY. FOR
/STANDARD INSTRUCTIONS A STRING OF KEY DATA ABOUT
/THE LINE IS LEFT. IF THE LINE IS A PSUEDO-OP
/DCIL WILL IMMEDIATELY CALL THE APPROPRIATE PSUEDO-OP
/HANDLER TO TAKE ALL NECESSARY ACTION. MOST
/OF THE PSUEDO-OP HANDLERS RETURN TO THE
/BEGINNING OF DCIL WHERE THE NEXT LINE CAN BE
/PROCESSED AS IF NOTHING UNUSUAL HAPPENED. THE
/EXCEPTIONS TO THIS ARE THOSE PSUEDO-OPS WHICH
/CAUSE A PREMATURE PAGE ASSEMBLY.
/THE ROUTINE SKIPL IS ACTUALLY A SMALL PART OF
/DCIL. IT HAS TWO PURPOSES. ONE, IT WATCHES
/FOR LINES WHICH SHOULD BE IGNORED BECAUSE THE
/FORTR PSUEDO-OP IS IN EFFECT. SECONDLY IT
/MUST WATCH FOR SEMI-COLONS SO THAT
/IF ONE IS ENCOUNTERED(OUTSIDE A COMMENT)
/THE REMAINDER OF THE LINE CAN BE SAVED FOR
/PROCESSING AS THE "NEXT" LINE.
/(5)ONLY TWO MAIN ROUTINES SRSYM AND
/OBSYM, TOGETHER WITH THEIR SUBSIDIARYS RUSVL AND SUSVL
/MAY DIRECTLY CONTACT THE MAIN SYMBOL TABLE.
/THESE ROUTINES COMMUNICATE WITH THE REST OF
/THE PROGRAM THROUGH FOUR IMPORTANT
/CELLS IN PAGE 0:
/USE CONTAINS THE CODE WORD FOR THE SYMBOL ENTRY.
/VAL CONTAINS THE VALUE OF THE SYMBOL.
/SYMBOL CONTAINS THE ADDRESS OF THE FIRST WORD OF THE
/ENTRY(NAMELY THE CODE WORD).
/VALPTR CONTAINS THE ADDRESS OF THE VALUE WORD
/OF THE ENTRY.
/SRSYM, AFTER LOCATING A GIVEN SYMBOL IN THE TABLE
/(OR ENTERING IT IF NECESSARY)
/CALLS SUSVL TO FILL THE FOUR CELLS WITH THE
/PROPER INFORMATION ABOUT THE SYMBOL.


/OBSYM USES A SYMBOL IDENTIFIER TO GET
/THE FOUR ESSENTIAL BITS OF INFORMATION, AGAIN
/CALLING SUSVL TO DO THE WORK. HOWEVER
/BEFORE EITHER SRSYM OR OBSYM DO ANYTHING
/THEY BOTH MAKE USE OF RUSVL. RUSVL IS A
/VERY IMPORTANT ROUTINE. HERE IS HOW IT WORKS.
/LET US SUPPOSE THAT THE PROGRAM HAS OBTAINED
/USE, VAL, SYMBOL AND VALPTR FOR A GIVEN
/SYMBOL(USING SRSYM OR OBSYM). FURTHER, LET
/US SUPPOSE THAT THE PROGRAM WISHES TO
/MODIFY BOTH OR EITHER OF THE CODE AND VALUE
/WORDS FOR THIS SYMBOL IN THE SYMBOL TABLE.
/THE PROGRAM DOES NOT DIRECTLY ACCESS THESE
/WORDS IN THE SYMBOL TABLE. INSTEAD THE
/PROGRAM MERELY MAKES THE DESIRED MODIFICATIONS
/TO USE AND VAL. NOW SYMBOL AND VALPTR
/ARE THE POINTERS FOR STORING THIS NEW INFORMATION
/BACK IN THE TABLE. IT IS VERY IMPORTANT THAT
/NO PART OF THE PROGRAM EXCEPT SRSYM AND OBSYM
/EVER MODIFY SYMBOL OR VALPTR, AND BEFORE
/EITHER OF THESE MODIFY THEM THEY ALWAYS CALL
/RUSVL. RUSVL TAKES USE AND VAL
/INCLUDING ANY MODIFICATIONS THAT HAVE BEEN
/MADE TO THEM AND STORE THESE WORDS BACK
/IN THE TABLE USING THE STILL UNCHANGED POINTERS
/SYMBOL AND VALPTR. IN THIS WAY MODIFICATIONS
/TO THE SYMBOL TABLE ARE MADE IN TWO STAGES.
/THE FIRST STAGE CONSISTS OF A SIMPLE REFERENCE
/TO ONE OF TWO PAGE 0 LOCATIONS, AND THE
/SECOND STAGE IS TAKEN CARE OF AUTOMATICALLY
/DURING FURTHER OPERATION OF THE PROGRAM.
/(6)SETCT AND CPGES DEAL WITH FIVE SEPARATE PAGE
/COUNTERS. THE SUM OF THESE IS THE NUMBER
/OF WORDS OF CORE NECESSARY TO ASSEMBLE THE CURRENT
/COLLECTED DATA. PTSZE (PAGE TABLE SIZE) IS THE
/NUMBER OF ITEMS - CONSTANTS,ADDRESS PARAMETERS
/AND INSTRUCTIONS - WHICH HAVE BEEN SO FAR
/COLLECTED. LTSZE IS THE NUMBER OF DISTINCT LITERALS
/WHEN ARE REQUIRED ON THE CURRENT PAGE. PGEESC
/WILL BE EITHER 2 OR 4. IT IS
/2 IF THE LAST COLLECTED INSTRUCTION WAS NOT A
/SKIP INSTRUCTION, 4 OTHERWISE. THESE ARE THE
/NUMBER OF WORDS REQUIRED FOR THE PAGE
/ESCAPE. THIS ITEM IS IGNORED WHEN THE AUTO-
/MATIC PAGING SWITCH IS NON-ZERO. OPSCTR
/IS THE NUMBER OF POINTERS TO OFF-PAGE SYMBOLS
/WHICH ARE REQUIRED ON THE CURRENT PAGE.


/THIS ITEM IS DETERMINED BY USE OF THE
/PAGE SYMBOL TABLE. TWO TYPES OF SYMBOLS
/ARE STORED ON THIS TABLE: TAGS(LFS'S) ON THE
/CURRENT PAGE AND SYMBOLS WHICH ARE REFERENCED
/BY MEMORY REFERENCE INSTRUCTIONS(AFS'S) ON THE
/CURRENT PAGE. IN THIS TABLE SABR KEEPS TRACK OF
/WHETHER THE SYMBOL IS ON-PAGE(I.E. IF IT OCCURS AS
/A TAG ON THE PAGE) AND WHETHER IT HAS BEEN
/REFERENCED EITHER SIMPLY OR WITH A NUMBER SIGN
/(MEANING <SYM>+1). IF THE SYMBOL IS OFF-PAGE
/AND HAS BEEN REFERENCED ON THE PAGE, ONE POINTER
/IS REQUIRED ON THE ASSEMBLED PAGE FOR
/EACH TYPE OF REFERENCE USED (SIMPLE OR #).
/IN ADDITION CERTAIN INFORMATION REGARDING OBACTR
/IS KEPT IN THE P.S.T. OBACTR KEEPS COUNT OF
/THE NUMBER OF EXTRA INSTRUCTIONS WHICH MUST
/BE GENERATED ON THE CURRENT PAGE. THESE
/INCLUDE CDF'S TO CURRENT BANK (CODE05 6201'S),
/CDF 00'S FOR REFERENCE TO COMMON,			/(*)
/JMS CDFSK/SKP PAIRS FOR CDF CUR'S FOLLOWING
/SKIP INSTRUCTIONS, AND JMS CDZSK/SKP PAIRS FOR
/CDF 00'S FOLLOWING SKIP INSTRUCTIONS. SUCH
/CDF'S ARE NEEDED FOR OFF-PAGE REFERENCES WHENEVER
/THE BANK REFERENCED IS NOT THE SAME AS PREVIOUSLY
/(0 INSTEAD OF CURRENT=1 OR VICE-VERSA) OR WHEN
/THE BANK IS UNKNOWN (=-1) AS AFTER A TAG,
/AT THE START OF A PAGE, OR FOR ALL JMS'S.
/OBACTR ALSO KEEPS COUNT OF EXTRA INSTRUCTIONS
/NEEDED TO GENERATE OFF-PAGE INDIRECT REFERENCES.
/FOR THESE EITHER 2 OR 4 EXTRA INSTRUCTIONS
/ARE NEEDED DEPENDING ON WHETHER OR NOT THE
/PREVIOUS INSTRUCTION WAS A SKIP INSTRUCTION.
/IN THE PST AN UP-TO-DATE RECORD IS KEPT OF THE
/NUMBER OF INCREMENTS TO OBACTR SPECIFICALLY
/DUE TO EACH OFF-PAGE SYMBOL. IN VIEW
/OF THE RECOUNT PROCEDURE DESCRIBED IN ITEM 7
/IT WOULD SEEM THAT THIS INFORMATION IS REDUNDANT
/AND UNNECESSARY. HOWEVER, DURING THE DEBUGGING
/STAGE OF THE PROGRAM WITH PASS 2 INCLUDED
/I ENCOUNTERED SEVERAL SITUATIONS, WHICH I FIND
/VERY DIFFICULT TO DESCRIBE, WHERE MORE IMMEDIATE
/INFORMATION ABOUT OBACTR WAS NEEDED. I
/AM NOT EVEN COMPLETELY SURE I UNDERSTAND WHY.
/OBACTR MUST BE WATCHED CLOSELY. AT 6652 IN THE
/PROGRAM THERE IS SOME CODE TO ASSIST IN
/DEBUGGING THE PROGRAM IF PROBLEMS ARISE WITH
/THE PAGE COUNT.
/WHENEVER A NEW TAG IS ENCOUNTERED ON A
/PAGE, SETCT USES CPLFS TO REDUCE
/BOTH OPSCTR AND OBACTR APPROPRIATELY
/SINCE WHAT PREVIOUSLY WERE OFF-PAGE REFERENCES
/MAY NOW HAVE BECOME ON-PAGE REFERENCES.

/(7) WHENEVER A TAG IS ENCOUNTERED ON A GIVEN
/PAGE RECT IS CALLED TO GO THROUGH THE
/ENTIRE CURRENT PAGE TABLE AND RECOUNT
/THE PAGE. IT DOES THIS BY CALLING SETCT
/AGAIN, ONCE FOR EACH ITEM ON THE PAGE TABLE.
/THE ONLY THING REALLY ACCOMPLISHED HERE
/IS THAT OBACTR IS RESET. OPSCTR IS
/UNCHANGED AS WELL AS THE OTHER PAGE COUNTERS.
/THE NEED TO RECOUNT OBACTR IS SHOWN
/BY THE FOLLOWING EXAMPLE:
/      A, TAD   B
/         TAD   C
/      B, 0
/         <PAGE FILLS UP>
/      C, 0
/NOW BECAUSE BANK IS UNKNOWN AFTER "A,"
/AND B IS UNDEFINED AS YET, "TAD B"
/REQUIRES A CDF CUR. HENCE INCREMENT OBACTR.
/"TAD C" IS OFF PAGE TOO, BUT REQUIRES NO
/CDF SINCE IT IS IN THE SAME BANK.
/HOWEVER WHEN B IS DEFINED ON PAGE, THE
/CDF IT CAUSED IS NO LONGER NECESSARY,
/BUT NOW THE "TAD C" REQUIRES A CDF.
/(8) THE ROUTINE L55 CAUSES EACH PAGE TO BE ASSEMBLED.
/DURING PASS 1 THERE ARE TWO SUB-PHASES TO THE ASSEMBLY.
/FOR THE MOST PART BOTH PHASES RUN THROUGH THE
/ENTIRE PAGE OF COLLECTED CODE USING THE
/SAME ASSEMBLY ROUTINES. THE DIFFERENCE IS
/THAT DURING PHASE 1 (ACTR=0)
/ACTUAL OUTPUT IS SUPPRESSED. THE KEY
/PURPOSE OF PHASE 1 IS TO DEFINE ALL THE
/TAGS THAT OCCUR ON THE PAGE. CLEARLY THE
/TAGS COULD NOT BE DEFINED DURING COLLECTION
/BECAUSE AT THAT POINT WE WERE NOT SURE
/WHAT SYMBOLS EVEN WERE ON PAGE, AND THUS
/NOT SURE HOW MANY EXTRA INSTRUCTIONS
/WOULD BE NECESSARY. THUS SUB-PHASE 1 OF THE
/ASSEMBLY IS REQUIRED SO THAT IN THE
/SECOND PHASE OF THE ASSEMBLY ON-PAGE
/FORWARD REFERENCES CAN BE RESOLVED. HENCE
/L55 CALLS THE ASSEMBLY ROUTINE ASMBL
/TWICE FOR EACH PAGE OF CODE.
/(9)AFTER INITIALIZING THE VARIOUS PAGE TABLE POINTERS
/ASMBL GOES INTO A LOOP WHEREIN THE
/LINE-BY-LINE ASSEMBLY ROUTINE ASM02 IS
/CALLED ONCE FOR EACH ITEM ON THE PAGE TABLE.
/ASM02 IS A HUGE ROUTINE OCCUPYING ABOUT
/THREE FULL PAGES OF CODE. ASM02 FIRST

/EXAMINES THE CODED DATA PERTAINING TO THE GIVEN
/ITEM ON THE PAGE TABLE TO DETERMINE WHAT
/TYPE OF INSTRUCTION IS TO BE ASSEMBLED AND
/WHAT THE CURRENT BANK AND SKIP SETTINGS
/ARE.  THEN DEPENDING ON THIS ANALYSIS THE ROUTINE
/TRANFERS TO THE PROPER SUBSECTION OF ITSELF
/FOR HANDLING THIS TYPE OF INSTRUCTION. THERE
/ARE A DOZEN OR MORE CASES WHICH MUST
/BE DEALT WITH. THEN THE ROUTINE MOVES
/TO ONE OF ITS VARIOUS EXIT STRINGS
/TO COMPLETE THE ACTION AND SET THE BANK AND
/SKIP CONDITIONS FOR THE NEXT LINE. AFTER ALL
/ITEMS ON THE PAGE TABLE HAVE BEEN ASSEMBLED
/IN THIS WAY ASMBL THEN CALLS THE ROUTINE
/A2. A2 PRODUCES (IN PHASE 2) THE PAGE ESCAPE AND
/THEN OUTPUTS THE ENTIRE LITERAL TABLE WITH
/ALL THE OFF-PAGE POINTERS INTERMINGLED.
/(10) SPECIAL CONSIDERATION SHOULD BE GIVEN TO OFF-
/PAGE FORWARD REFERENCES SINCE THEY WILL REMAIN
/UNRESOLVED WHEN THE CURRENT PAGE HAS BEEN
/ASSEMBLED. DURING ASSEMBLY WHEN 
/A REFERENCE TO AN OFF-PAGE, OR AN AS YET
/UNDEFINED SYMBOL IS ENCOUNTERED THE SYMBOL'S
/IDENTIFIER IS STORED ON THE LITERAL/OFF-PAGE POINTER
/TABLE. THEN WHEN A2 IS OUTPUTTING THE
/LITERAL TABLE ANY STILL UNDEFINED SYMBOLS ARE
/DEALT WITH AS FOLLOWS. THE SYMBOL'S INDENTIFIER
/TOGETHER WITH THE LOCATION RESERVED IN THE CURRENT
/PAGE FOR ITS VALUE ARE STORED ON THE OCCURRENCE
/TABLE. THE LOCATION WHERE THE POINTER MUST BE
/STORED IN THE CURRENT PAGE IS MERELY LEFT
/BLANK AT THIS TIME. THEN LATER ON WHEN THIS SYMBOL IS
/ENCOUNTERED AS A TAG THE ROUTINE LFSCK
/WHICH PROCESSES TAGS DURING ASSEMBLY WILL
/REMOVE THE ITEM FROM THE OCCURRENCE TABLE AND
/OUTPUT IT PRECEEDING THE POINTER BY AN ORIGIN
/TO THE CORRECT LOCATION.
/(11) DURING PASS2 (THE LISTING PASS) MOST OF
/THE SAME CODE IS USED TO PRODUCE THE
/ASSEMBLY LISTING. HOWEVER THE TIMING IS
/DIFFERENT. NOW THE COLLECTION-ASSEMBLY
/ALTERATION IS CARRIED OUT ON A LINE-BY-LINE
/BASIS RATHER THAN ON A PAGE-BY-PAGE BASIS.
/(HOWEVER ALL THE PAGE TABLES AND COUNTERS MUST
/STILL BE MAINTAINED JUST AS IN PASS1.) THE
/PASS2 OPERATION DIFFERS FROM PASS1 IN THE

/FOLLOWING RESPECTS. EACH TIME A LINE HAS
/BEEN COLLECTED AND ITS DATA ENTERED INTO THE
/PAGE TABLE IN THE NORMAL FIRST PASS WAY,
/A CALL IS ISSUED TO THE LINE-BY-LINE
/ASSEMBLY ROUTINE ASM02. SINCE ALL SYMBOLS
/ARE NOW DEFINED THERE WILL BE NO UNRESOLVED
/FORWARD REFERENCES ON OR OFF-PAGE. ASM02 ACTS
/DURING PASS2 EXACTLY AS IT DOES DURING PASS1
/WITH ONE BIG EXCEPTION: THE BINARY OUTPUT ROUTINE
/OUTBN IN SUPPRESSED AND IN ITS PLACE IS
/SUBSTITUTED THE LISTING ROUTINE WRITE.
/WHEN THE PAGE COUNTERS INDICATE THAT THE PAGE
/IS FULL THE DRIVER ROUTINE WILL CALL L55 AS
/USUAL. HOWEVER IN PASS2 THE TWO CALLS
/TO ASMBL ARE BY-PASSED AND INSTEAD A SINGLE
/CALL TO A2 IS ISSUED SO AS TO GET THE
/LISTING TO THE PAGE ESCAPE, THE LITERALS AND
/THE OFF-PAGE POINTERS.
/(12) THE REASON FOR HAVING SEPARATE LITERAL TABLES FOR THE
/COLLECTION AND THE ASSEMBLY PHASES OF
/THE PROGRAM IS THAT DURING PASS2 BOTH
/PHASES OF THE PROGRAM ARE OPERATING SIMUTANEOUSLY
/AND BOTH ARE BUILDING LITERAL TABLES IN A
/DIFFERENT WAY.
/(13) THE PAGE ESCAPE TABLE, PEBSE, IS NECESSARY
/IS THAT DURING PASS2 LOCATIONS
/CANNOT BE ASSIGNED FOR LITERALS AND OFF-PAGE
/POINTERS UNLESS THE FINAL PAGE ESCAPE
/FOR THE PAGE IS KNOWN. HENCE THESE NUMBERS
/ARE SAVED DURING PASS1.
/(14) THE PAGE OP TABLE IS ACTUALLY A PART OF
/THE PAGE TABLE.
/(15) EXTERNAL SYMBOLS ARISE IN TWO WAYS:
/FROM ENTRY STATEMENTS AND FROM CALL STATEMENTS.
/THEY ARE ENTERED IN THE E.S.T. IN ORDER OF
/APPEARANCE IN THE PROGRAM AND NUMBERED
/ACCORDINGLY. THESE ARE THE NUMBERS WHICH THE
/LOADER REFERS TO AS "LOCAL EXTERNAL NUMBERS."
/(16) EQUIVALENCING OF TAGS
/IS TREATED AS A PSEUDO-OP AND IS
/HANDLED BY THE ROUTINE PBSS2. (INCIDENTALLY
/SOME OF THE ODD NAMES IN THE SOURCE WERE
/PASSED ON TO ME FROM THE ORIGINAL ICS
/PROGRAM. I DID NOT CHANGE THEM MERELY BECAUSE
/THEY MADE NO SENSE.) THE OPERATION IS THIS:
/ALL EXTRA TAGS TO BE DEFINED AT A GIVEN LOCATION ARE
/ENTERED AS A GROUP IN THE EQUIVALENCE TABLE,
/AND A CODE BIT IS SET ON THE PAGE TABLE TO
/INDICATE THAT SUCH A GROUP IS TO BE DEFINED
/WHEN THE LOCATION HAS BEEN DETERMINED DURING
/ASSEMBLY. ANUMCK DOES THE WORK OF DEFINITION.
/(*)
/V03	CHANGE NOTICE:
/	AS OF V03 THE SABR SYSTEM HAS
/	BEEN CHANGED SUCH THAT COMMON
/	WILL RESIDE IN FIELD 1 INSTEAD
/	OF FIELD 0.
/	THE ONLY CHANGES REQUIRED TO SABR
/	ITSELF ARE AS FOLLOWS
/	(1) HICOM=177 INSTEAD OF 777;
/	(2) PARG & ASMBL MUST NOW OUTPUT 6211'S
/	INSTEAD OF 6201'S FOR CDF'S TO COMMON.
/	NOTE:
/	THE COMMENTS HAVE NOT BEEN CHANGED TO
/	REFLECT THIS CHANGE.
/	ALSO, BANK = 0 IS STILL THE CONDITION
/	FOR REFERENCES TO COMMON. (BANK=1
/	STILL MEANS BANK KNOWN TO BE CURRENT
/	AND BANK = -1 STILL MEANS BANK UNKNOWN.)