ASMB,R,L,C HED RTE MICRO CROSS-REFERENCE GENERATOR NAM MXREF,3 92061-16002 REV.2013 800131 SUP * * * ********************************************************* * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. * * * * * * THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT * * * A TIME AND SHALL NOT OTHERWISE BE RECORDED, * * * TRANSMITTED OR STORED IN A RETRIEVAL SYSTEM. COPYING * * * OR OTHER REPRODUCTION OF THIS PROGRAM EXCEPT FOR * * * ARCHIVAL PURPOSES IS PROHIBITED WITHOUT THE PRIOR * * * WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * ********************************************************* * * HEADR ASC 11,PAGE .... MICRO XREF ASC 10,REV.2013 801031 TIME BSS 16 * EXT EXEC RTE \ RLIB EXT SUP.C,GMM.C,OPN.C,SPC.C CMPLR LIB EXT END.C,WRT.C,RED.C,PRM.C CMPLR LIB EXT C.SAU,C.LST,C.SON,C.TTY CMPLR LIB * * ******************** * * INITIALIZATION PHASE * MXREF NOP JSB SYSIO SET UP SUBSYS I/O JSB EJECT PRINT HEADER JSB EXEC SWAP ALL OF MEMORY PARTITION DEF *+3 BECAUSE WE'RE USING IT FOR DEF .22 SYMBOL TABLE DEF .3 JSB GMM.C GET FWA,LWA DEF .0 (NO OF SEGMENTS) STA SBASE BASE OF SYM TAB (GROWS UP) STA SNEXT ADB .M1 BASE OF REF TAB (GROWS DOWN) STB RNEXT CMB,INB SUFFICIENT MEMORY? ADB SNEXT RNEXT-6>SNEXT? ADB .6 SSB,RSS ISZ SYMOV NO: ANTICIPATE OVERFLOW * * INITIATE I/O ON INPUT DEVICE * JSB OPN.C DEF C.SAU JMP IER ERROR RTN JMP INIT IER LDA .M20 ABORT - NO SOURCE JSB PRINT DEF NOLS JMP ABORT * * * INIT EQU * JSB INPUT GET MIC CMD. LIMITED CHECKING LDA MIC1 "MICMX "? LDB CARD JSB CMP DEC 3 SZA,RSS JMP MX YES LDA MIC2 "MICMX,"? JSB CMP DEC 3 SZA,RSS JMP MX YES LDA MIC3 "MICMXE"? WE TAKE XE CLASSES JSB CMP REGARDLESS...BUT WE XREF 1ST DEC 3 RECORD IF NOT MIC COMMAND SZA,RSS JMP READ YES JMP READ2 NO: SCAN FOR SYMBOLS MX ISZ MX? SET MX STATE * * ******************** * * INPUT PHASE * READ JSB INPUT GET A SOURCE RECORD ISZ #REC READ2 LDB @FLD1 EXAMINE FIRST CHARACTER JSB LOADB CPA ASTER COMMENT? JMP READ YES: IGNORE RECORD CPA "$" CONTROL CARD? JMP READ YES: IGNORE RECORD JSB CLASS CLASSIFY OP-FIELD ADA *+2 JMP A,I DEF *+1,I ZERO-ORIGINED TABLE DEF SORT "END" PSEUDO-OP DEF CL1 OF CLASSES DEF CL2 DEF CL3 * CL1 EQU * LABEL ONLY JSB DFINE XFER LABEL SOC JMP NOMEM OUT OF MEMORY JMP READ * CL2 EQU * LABEL & FIXED-FIELD EXPR JSB DFINE XFER LABEL LDB @FLD6 XREF LABEL IN FIELD 6 SOS JSB REFER SOC JMP NOMEM OUT OF MEMORY JMP READ * CL3 EQU * LABEL & VARIABLE-FIELD EXPR JSB DFINE XREF LABEL LDB @FLD3 XREF LABEL BETWEEN FIELDS 3 & 6 SOS JSB REFER SOS JMP READ * * SYMBOL TABLE OVERFLOW. REPORT ERROR, THEN LIST * AS MUCH AS WE'VE GOT * NOMEM EQU * ISZ ANYER BUMP ERROR COUNT LDA #REC MOVE LINE# INTO ERROR MSG LDB @OV1 JSB DECML DEC 4 LDA .M45 JSB PRINT DEF OVMSG LDA .2 JSB SPACE * * ******************** * * SORT PHASE * * SIMPLE IN-PLACE EXCHANGE SORT. DEFINE CONTINUALLY * DIMINISHING PARTITIONS OF SYMBOL TABLE AND MOVE * "SMALLEST" SYMBOL TO TOP OF PARTITION * SORT EQU * LDB SBASE * SPART EQU * NEXT PARTITION CPB SNEXT JMP LIST DONE STB TOP STB LEAST * SFIND EQU * FIND LEAST IN PARTITION ADB .6 PTR TO NEXT SYMBOL CPB SNEXT JMP SXCH END OF PARTITION LDA LEAST LEAST<=NEXT SYMBOL? JSB CMP DEC 4 CMA,SSA,INA,SZA STB LEAST NO: NEXT SYMBOL BECOMES LEAST JMP SFIND * SXCH EQU * MOVE LEAST TO TOP IF NECESSARY LDB LEAST CPB TOP JMP SNXT TOP IS LEAST ALREADY LDA B TEMP<==LEAST LDB TEMP JSB MOVE DEC 6 LDA TOP LEAST<==TOP LDB LEAST JSB MOVE DEC 6 LDA TEMP TOP<==TEMP LDB TOP JSB MOVE DEC 6 SNXT EQU * ADB .6 TOP+6: NEXT PARTITION JMP SPART * * ******************** * * LIST PHASE * LIST EQU * JSB SUMRY LDA .1 JSB SPACE LDB SBASE * LNXTS EQU * GET NEXT SYMBOL CPB SNEXT JMP LDONE STB SYM CLA,INA SPACE ONE LINE... JSB SPAC? ...IF NOT AT TOP OF FORM LDA SYM MOVE SYMBOL TO OUTPUT LDB OUTBF JSB MOVE DEC 4 LDB SYM GET DEFINITION ADB .4 LDA B,I SYMBOL DEFINED? SSA JMP LUND NO LDB @XR3 YES: MOVE DEFINITION INTO OUTPUT JSB DECML DEC 4 LDA @XR5 STA @XR LDA .M14 STA XRLEN JMP LREF LUND LDA @UND UNDEFINED SYMBOL LDB @XR2 JSB MVB DEC 15 LDA @XR6 STA @XR LDA .M26 STA XRLEN LREF EQU * LIST REFERENCES LDB SYM ANY REFERENCES? ADB .5 LDA B,I (PTR TO LAST REF IF ANY) SSA,RSS JMP L1ST YES LDA @UNR NO REFERENCES LDB @XR4 JSB MVB DEC 18 LDA XRLEN ADA .M20 STA XRLEN JMP LLAST L1ST LDA A,I PTR TO FIRST REF STA TOP * LNXTR EQU * LIST NEXT REFERENCE STA REF LDB @XR FULL LINE? CPB @XR7 JSB DUMP YES: WRITE LINE LDA REF GET LINE # INA LDA A,I JSB DECML DEC 4 ADB .10 NEXT REFERENCE POSTION STB @XR IN OUTPUT LDB XRLEN ADB .M6 STB XRLEN LDA REF,I PTR TO NEXT REFERENCE CPA TOP JMP *+2 END OF REFERENCES JMP LNXTR * LLAST JSB DUMP WRITE LAST LINE LDB SYM NEXT SYM TAB ENTRY ADB .6 JMP LNXTS * * ******************** * * END OF CROSS-REFERENCE * LDONE EQU * LDA .M12 JSB DSPLY DEF ENDMS JMP STOP * ABORT EQU * ISZ ANYER BUMP ERROR COUNT LDA .M14 JSB DSPLY DEF ABMSG * STOP JSB SPC.C DEF C.LST DEF .M2 NOP ERROR RTN UNIMPORTANT IN ABORT * JSB END.C DEF ANYER RETURN ERROR COUNT JMP 12 ERROR RTN HERE ? - ABORT (MP) HED RTE MICRO CROSS-REFERENCE GENERATOR -- SUBROUTINES * * ******************** * * C L A S S * * ENTRY: * JSB CLASS * * EXIT: * A= CLASSIFICATION * * CLASSIFY OP-MNEMONIC TO DETERMINE WHICH FIELDS TO * CROSS-REFERENCE. * * WE EXAMINE ONLY FIRST 4 CHARACTERS OF OP-FIELD. WE ALSO * ALLOW LABELS WHERE THEY ARE NORMALLY NOT PERMITTED AND TREAT * ILLEGAL OP-MNEMONICS AS CLASS-2. THIS IS TO MAXIMIZE * THE UTILITY OF THE XREF, BEING AS FORGIVING OF SYNTAX * ERRORS AS POSSIBLE. * * CLASSIFICATIONS ARE DEFINED AS FOLLOWS: * 0 -- NO XREF. TERMINATE SOURCE INPUT (END). * 1 -- NO EXPR. XREF LABEL (TYPE-1, ZERO AND ONES * OP-MNEMONICS -- ALSO ALGN). * 2 -- XREF LABEL AND FIXED-FMT EXPR (TYPES-2, -3 AND * -4 OP-MNEMONICS -- ALSO ILLEGAL OP-MNEMONICS). * 3 -- XREF LABEL AND VARIABLE-FMT EXPR (ORG, DEF AND EQU). * * ADDITIONAL INTERNAL CLASSIFICATIONS: * 377B -- "RTN" OP-CODE, MX-E ONLY. TREATED AS CLASS-2 * IS SPECIAL FIELD IS "CNDX". OTHERWISE, TREATED * AS CLASS-1. * * CLASSIFICATION TABLE HAS THE FOLLOWING FORMAT: * * 1 * 5 8 7 0 * *********************** * * MNEMONIC (2 WORDS) * END OF TABLE IS DENOTED * * * BY 4 BYTES OF ZEROES * *********************** * * MX CLASS : XE CLASS * * *********************** * CLASS NOP LDA @FLD2 GET OP-CODE FIELD LDB CODE JSB MVB DEC 4 LDA CLTAB INITIALIZE TABLE SEARCH STA CLPTR * CLNXT EQU * LDA CLPTR,I GET TABLE ENTRY ISZ CLPTR LDB CLPTR,I ISZ CLPTR POINTS TO CLASSIFICATION CPB CODE+2 NB: IF B=0, WE ALWAYS SKIP XOR CODE+1 SZA,RSS A=0 OR A=CODE JMP GOTCL FOUND MATCH OR END OF TABLE ISZ CLPTR JMP CLNXT * GOTCL EQU * LDA CLPTR,I GET CLASSIFICATION LDB MX? SZB ALF,ALF GET MX CLASSIFICATION AND =B377 CPA =B377 SPECIAL INTERNAL CLASS? JMP *+2 JMP CLASS,I LDA @FLD3 YES: "RTN" OP-CODE LDB CNDX SPECIAL FIELD IS "CNDX"? JSB CMPB DEC 4 SZA CLA,INA,RSS NO: TREAT AS CLASS-1 LDA .2 YES: TREAT AS CLASS-2 JMP CLASS,I CLPTR BSS 1 CODE DBL *+1 HOLDS OP-CODE FOR COMPARISON BSS 2 CNDX DBL *+1 ASC 2,CNDX CLTAB DEF *+1 OP-CODE TABLE ASC 2, BYT 1,1 ASC 2,IMM BYT 2,2 ASC 2,JMP BYT 2,2 ASC 2,JSB BYT 2,2 ASC 2,RTN (NOT ON MX) BYT 2,377 ASC 2,EQU BYT 3,3 ASC 2,DEF BYT 3,3 ASC 2,ORG BYT 3,3 ASC 2,DIV BYT 1,1 ASC 2,MPY BYT 1,1 ASC 2,WRTE BYT 1,1 ASC 2,READ BYT 1,1 ASC 2,ENV BYT 1,1 ASC 2,ENVE BYT 1,1 ASC 2,ALGN BYT 1,1 ASC 2,ARS BYT 1,1 ASC 2,CRS BYT 1,1 ASC 2,LGS BYT 1,1 ASC 2,NRM (NOT ON MX) BYT 2,1 ASC 2,LWF BYT 1,1 ASC 2,ASG BYT 1,1 ASC 2,NOP BYT 1,1 ASC 2,ONES BYT 1,1 ASC 2,ZERO BYT 1,1 ASC 2,END BYT 0,0 DEC 0,0 ILLEGAL OP-MNEMONIC BYT 2,2 JMP CLASS,I * * ******************** * * C M P * * ENTRY: * LDA * LDB * JSB CMP * DEC <# WORDS> * * EXIT: * A= -1 IF LEFTRIGHT * B= RIGHT PTR (AS ON ENTRY) * * COMPARE TWO WORD ARRAYS. "LEFT" AND "RIGHT" REFER * OPERANDS OF A RELATIONAL EXPR (EG., "LEFT < RIGHT"). * CMP NOP STA CLFT STB CRT LDA CMP,I CMA,INA STA CCNT ISZ CMP * CWORD EQU * COMPARE NEXT WORD LDA CRT,I CMA,INA ADA CLFT,I A>0 IF LEFT>RIGHT SZA JMP CDONE ISZ CLFT ISZ CRT ISZ CCNT JMP CWORD * CDONE EQU * COMPARISON COMPLETE SZA,RSS JMP CMP,I EQUAL SSA CCA,RSS INDICATE LEFTRIGHT JMP CMP,I CCNT BSS 1 CLFT BSS 1 CRT BSS 1 * * ******************** * * C M P B * * ENTRY: * LDA * LDB * JSB CMPB * DEC <# BYTES> * * EXIT: * A=-1 IF LEFTRIGHT * * SIMILAR TO "CMP", BUT FOR CHARACTER STRINGS. * CMPB NOP STA CBLFT STB CBRT LDA CMPB,I CMA,INA STA CBCNT ISZ CMP * CBYTE EQU * COMPARE NEXT BYTE LDB CBLFT JSB LOADB STB CBLFT STA CBCHR SAVE LEFT BYTE LDB CBRT JSB LOADB STB CBRT CMA,INA ADA CBLFT A>0 IF LEFT>RIGHT SZA JMP CBFIN ISZ CBCNT JMP CBYTE * CBFIN EQU * COMPARISON COMPLETE SZA,RSS JMP CMPB,I EQUAL SSA CCA,RSS INDICATE LEFTRIGHT JMP CMPB,I CBCHR BSS 1 LEFT CHARACTER CBCNT BSS 1 CHARACTER COUNTER CBLFT BSS 1 BPTR TO LEFT STRING CBRT BSS 1 BPTR TO RIGHT STRING * * ******************** * * D E C M L * * ENTRY: * LDA * LDB * JSB DECML * DEC <# DIGITS> * * EXIT: * B= BPTR TO MOST-SIGNIFICANT DIGIT PLUS ONE * * CONVERT INTERNAL BINARY VALUE TO ASCII FORM OF * DECIMAL NUMBER. NOTE THAT RESULT MAY HAVE LEADING * ZEROES. * DECML NOP STA DVAL LDA DECML,I CMA,INA STA DCNT ISZ DECML * DNXT EQU * NEXT DIGIT STB DDEST CLB LDA DVAL SHIFT VALUE DIV .10 STA DVAL ENTIER(VALUE/10) LDA B VALUE MOD 10 ADA "0" CONVERT DIGIT TO ASCII LDB DDEST STORE INTO STRING JSB STORB ADB .M2 BPTR TO NEXT MOST-SIG DIGIT ISZ DCNT JMP DNXT JMP DECML,I DCNT BSS 1 # DIGITS DDEST BSS 1 BPTR TO NEXT POSITION DVAL BSS 1 VALUE * * ******************** * * D F I N E * * ENTRY: * JSB DFINE * * EXIT: * O= 1 IF SYMBOL TABLE OVERFLOW * * CROSS-REFERENCE SYMBOL IN LABEL FIELD. BUILDS * "DEFINED" SYMBOL ENTRY IN CASE SYMBOL DOES NOT * EXIST. * DFINE NOP LDA #REC STA DEFN LDA @FLD1 LABEL PRESENT? LDB LABL JSB MVLBL SZA JSB XREF YES: UPDATE REF LIST JMP DFINE,I * * ******************** * * D S P L Y * * ENTRY: * LDA * JSB DSPLY * DEF * * WRITE MESSAGE TO CONSOLE DEVICE. * DSPLY NOP SSA,RSS JMP DS CMA,INA SLA,ARS INA DS STA DLEN LDA DSPLY,I STA DBUF ISZ DSPLY JSB WRT.C DEF C.TTY DBUF DEF 0 DEF DLEN JMP ABORT ERROR RTN JMP DSPLY,I DLEN BSS 1 * * ******************** * * D U M P * * ENTRY: * JSB DUMP * * EXIT: * B= NEW @XR * * WRITES LINE OF REFERENCES (OUTBUF) TO LIST DEVICE. * RESETS FIELD INDICATORS FOR NEXT LINE. * DUMP NOP LDA XRLEN WRITE BUFFER JSB PRINT DEF OUTBF+1 LDA .35 LDB OUTBF JSB PAD LDB .M10 RESET TO 1ST COLUMN STB XRLEN LDB @XR3 STB @XR JMP DUMP,I * * ******************** * * E J E C T * * ENTRY: * JSB EJECT * * EJECTS PAGE AND WRITES HEADER...ONLY IF WE'RE NOT * ALREADY AT THE TOP OF FORM (AND HEADER WRITTEN). * EJECT NOP LDA #LNS TOP OF FORM ALREADY? CPA LINE3 JMP EJECT,I YES: IGNORE REQUEST JSB SPC.C DEF C.LST DEF .M2 JMP ABORT ERROR RTN JSB TITLE WRITE HEADER JMP EJECT,I * * ******************** * * F I N D X * * ENTRY: * LDB * JSB FINDX * * EXIT: * B= BPTR TO EXPR (OR FIELD 6) * * SKIP BLANKS TO FIND FIRST CHARACTER OF EXPRESSION. * WON'T GO BEYOND FIELD 6. * FINDX NOP LDA BLNK JSB SKIP LDA @FLD6 PAST FIELD 6? CMA,INA B>=@FLD6? ADA B SSA,RSS LDB @FLD6 YES: RESET TO FIELD 6 JMP FINDX,I * * ******************** * * I N P U T * * ENTRY: * JSB INPUT * * READ SOURCE LINE FROM INPUT DEVICE. * INPUT NOP LDA .36 LDB CARD JSB PAD RETRY JSB RED.C READ SOURCE FROM DISC OR DEVICE DEF C.SAU DEF CARD+1 DEF .36 JMP ABORT EROR RTN SSB EOF ? JMP INEOF YES: ADD "END" CARD SZB,RSS BLANK RECORD (EOT)? JMP RETRY YES: IGNORE JMP INPUT,I * INEOF EQU * FAKE "END" LDA =A E STA CARD+5 LDA =AND STA CARD+6 JMP INPUT,I * * * ******************** * * L O A D B * * ENTRY: * LDB * JSB LOADB * * EXIT: * A= CHARACTER * B= BPTR TO NEXT CHARACTER * * LOAD CHARACTER FROM INTO A-REGISTER. * LOADB NOP CLE,ERB LDA B,I SEZ,RSS ALF,ALF AND =B377 ELB INB JMP LOADB,I * * ******************** * * M O V E * * ENTRY: * LDA * LDB * JSB MOVE * DEC <# WORDS> * * EXIT: * B= PTR TO TARGET (AS ON ENTRY) * * MOVE WORDS FROM ONE ARRAY TO ANOTHER. * MOVE NOP STA MINP STB MDEST LDA MOVE,I CMA,INA STA MCNT ISZ MOVE * MWORD EQU * NEXT WORD LDA MINP,I STA MDEST,I ISZ MINP ISZ MDEST ISZ MCNT JMP MWORD JMP MOVE,I MCNT BSS 1 MDEST BSS 1 MINP BSS 1 * * ******************** * * M V B * * ENTRY: * LDA * LDB * JSB MVB * DEC <# BYTES> * * MOVE CHARACTERS FROM ONE STRING TO ANOTHER. * MVB NOP STA MVINP STB MVDST LDA MVB,I CMA,INA STA MVCNT ISZ MVB * MVNXT EQU * LDB MVINP JSB LOADB STB MVINP LDB MVDST JSB STORB STB MVDST ISZ MVCNT JMP MVNXT JMP MVB,I MVCNT BSS 1 MVDST BSS 1 MVINP BSS 1 * * ******************** * * M V L B L * * ENTRY: * LDA * LDB * JSB MVLBL * * EXIT: * A= # CHARACTERS MOVED * MLINP= BPTR TO LAST+1 CHAR * * MOVE A LABEL (IF FOUND) INTO THE "LABL" BUFFER. * ENSURES THAT FIRST CHARACTER IS NOT "%", "*" * OR DIGIT (IE., VALID CONSTANT). THEN MOVES * STRING UNTIL WE FIND A BLANK, "+", OR "-" UP TO * 8 CHARACTERS. NOTE THAT WE ACCEPT LABEL WITH * INITIAL "$" HERE (CONSISTENT WITH WEAK DIAGNOSTIC * PHILOSOPHY). * MVLBL NOP STA MLINP STB MLDST LDA .4 JSB PAD LDA MLDST GET BPTR TO TARGET RAL STA MLDST LDA .M8 STA MLCNT LDB MLINP JSB LOADB CPA ASTER STARTS WITH "*" OR "%"? JMP MLFIN YES: NO LABEL CPA "%" JMP MLFIN YES: NO LABEL ADA .M"0" SSA JMP MLNXT NO: POSSIBLY A LABEL ADA .M10 SSA JMP MLFIN YES: NOT A LABEL * MLNXT EQU * LDB MLINP JSB LOADB CPA PLUS "+", "-" OR BLANK? JMP MLFIN YES: END OF LABEL CPA MINUS JMP MLFIN CPA BLNK JMP MLFIN STB MLINP LDB MLDST JSB STORB STB MLDST ISZ MLCNT JMP MLNXT * MLFIN EQU * LDA MLCNT ADA .8 # CHARACTERS MOVED JMP MVLBL,I MLCNT BSS 1 MLDST BSS 1 * * ******************** * * P A D * * ENTRY: * LDA <# WORDS> * LDB * JSB PAD * * PROPAGATE BLANKS INTO THE BUFFER. * PAD NOP CMA,INA STA PCNT LDA BLNK2 * PANXT EQU * STA B,I INB ISZ PCNT JMP PANXT JMP PAD,I PCNT BSS 1 * * ****************************** * * P R I N T * * ENTRY: * LDA * JSB PRINT * DEF * PRINT NOP SSA,RSS JMP PR1 CMA,INA SLA,ARS INA PR1 STA PLEN ISZ #LNS TOP OF FORM? JMP PR0 JSB EJECT YES: PRINT HEADER ISZ #LNS (CANNOT BE ZERO) PR0 LDA PRINT,I STA PBUF ISZ PRINT JSB WRT.C DEF C.LST PBUF DEF 0 DEF PLEN JMP ABORT ERROR RTN JMP PRINT,I PLEN BSS 1 * * ******************** * * R A D D * * ENTRY: * LDB * JSB RADD * * EXIT: * O= 1 IF SYM TAB OVERFLOW * * ALLOCATE AND SET-UP REFERENCE ENTRY. ADD ENTRY * TO REFERENCE LIST. * * REFERENCE ENTRY HAS THE FOLLOWING FORMAT: * * ******************** * * REFERENCE LINK * * ******************** * * REFERENCE LINE # * * ******************** * * REFERENCE LIST IS CIRCULAR WITH HEAD POINTER IN SYMBOL * TABLE. THUS, INSERTIONS ARE EASY AND THE REFERENCE HAS * A FIFO ORDER, OBVIATING A LIST SORT. NOTE THAT THE * LINE # IN WHICH SYMBOL IS DEFINED APPEARS IN SYMBOL * TABLE, NOT REFERENCE LIST (ALTHO ANY DUPLICATE * DEFINITION WILL APPEAR AS REFERENCES TO THE FIRST). * REFERENCE LIST HAS THE FOLLOWING FORM: * * **************** * * SYMBOL TABLE * * * ENTRY * * * ---*-----------------+ * **************** : * : * : * *********** *********** +--> *********** * +--> * ---*--> * ---*-----> * ---*--+ * : * * * * * * : * : *********** *********** *********** : * : FIRST REF LAST REF : * +--------------------------------------------------+ * RADD NOP STB SYM LDA SYMOV REF TAB OVERFLOW? STO SZA JMP RADD,I YES LDB RNEXT "ALLOCATE" REF TAB ENTRY STB REF ADB .M2 STB RNEXT NEXT AVAIL ENTRY CMB,INB RNEXT-6<=SNEXT? ADB SNEXT ADB .4 NET: ADD 6 SSB,RSS ISZ SYMOV YES: ANTICIPATE OVERFLOW * LDA SYM,I PTR TO LAST ENTRY LDB REF LINK ENTRY INTO CIRC LIST STB SYM,I LINK NEW ENTRY TO SYM TAB SSA FIRST REF? JMP RA1ST YES LDB A,I PTR TO FIRST ENTRY STB REF,I LINK FIRST TO NEW ENTRY LDB REF STB A,I LINK LAST TO NEW ENTRY JMP *+2 RA1ST STB REF,I FIRST ENTRY PTS TO SELF ISZ REF PUT LINE# INTO NEW ENTRY LDA #REC STA REF,I CLO NO OVERFLOW ISZ #REF JMP RADD,I * * ******************** * * R E F E R * * ENTRY: * LDB * JSB REFER * * EXIT: * O= 1 IF SYM TAB OVERFLOW * * CROSS-REFERENCE SYMBOL (IF ANY) ENCOUNTERED IN EXPR. * BUILDS "FWD REFERENCE" ENTRY IN CASE SYMBOL IS NOT * ALREADY DEFINED. * REFER NOP LDA =B100000 SET UP ENTRY STA DEFN JSB FINDX LOCATE EXPR LDA B LABEL PRESENT? LDB LABL JSB MVLBL SZA JSB XREF YES: UPDATE REF LIST JMP REFER,I * * ****************************** * * S A D D * * ENTRY: * JSB SADD * * EXIT: * B= PTR TO SYM TAB ENTRY * O= 1 IF OVERFLOW (IN WHICH CASE B IS INVALID) * * ALLOCATE AND SET-UP SYMBOL TABLE ENTRY. ENTRY * TEMPLATE IS IN "LABL". * * SYMBOL TABLE ENTRY HAS THE FOLLOWING FORMAT: * * ********************* * * SYMBOL (4 WORDS) * * * * * ********************* * * DEFINITION LINE # * 100000B IF UNDEFINED * ********************* * * REF LIST HEAD * -1 IF NO REFERENCES * ********************* * * SYMBOL AND REFERENCE ENTRIES ARE ALLOCATED IN A FREE * SPACE. THE TWO TABLES GROW TOGETHER. THE FORM IS: * * *********** * * SYM TAB * <-- SBASE (FWA) * * ENTRY * * *---------* * * * <-- SNEXT * * * * * * <-- RNEXT (NB: PTS LOWER OF TWO WORDS) * * * * *---------* * * REF TAB * * * ENTRY * <-- LWM * *********** * * SEE "RADD" FOR RELATIONSHIP BETWEEN SYMBOL TABLE ENTRY AND * REFERENCE LIST. * SADD NOP LDA SYMOV SYM TAB OVERFLOW? STO SZA JMP SADD,I YES LDB SNEXT "ALLOCATE" SYM TAB ENTRY LDA RNEXT ANTICIPATE OVERFLOW CMA,INA RNEXT-6<=SNEXT? ADA B ADA .6 SSA,RSS ISZ SYMOV YES: SET OVERFLOW FLAG ADA RNEXT NEXT SYMTAB ENTRY (SNEXT+6) STA SNEXT * LDA LABL SET UP SYMTAB ENTRY JSB MOVE DEC 6 CLO ISZ #SYM JMP SADD,I * * ******************** * * S E R C H * * ENTRY: * JSB SERCH * DEF * * EXIT: * B= -1 IF NOT FOUND * SYM TAB ENTRY ADDR IF FOUND * * SEARCH SYMBOL TABLE FOR LABEL POINTED TO AT P+1 IN * CALLING SEQUENCE. * SERCH NOP LDB SBASE * SRNXT EQU * CPB SNEXT JMP SRNO LDA SERCH,I JSB CMP DEC 4 SZA,RSS JMP SRYES FOUND IT ADB .6 JMP SRNXT * SRNO CCB NOT FOUND SRYES ISZ SERCH JMP SERCH,I * * ******************** * * S K I P * * ENTRY: * LDA * LDB * JSB SKIP * * EXIT: * A= LAST CHARACTER * B= BPTR TO LAST CHARACTER * * SKIP CONTIGUOUS SEQUENCE OF SPECIFIED CHARACTER. * SKIP NOP STA SKCHR * SK1 JSB LOADB CPA SKCHR JMP SK1 ADB .M1 JMP SKIP,I SKCHR BSS 1 * * ******************** * * S P A C ? * S P A C E * * ENTRY: * LDA <# BLANK LINES> * JSB SPACE * * PRINT A BLANK LINE ON LIST DEVICE. * SPAC? NOP LDB #LNS TOP OF FORM? CPB LINE3 JMP SPAC?,I YES: IGNORE REQUEST LDB SPAC? STB SPACE JMP SPACE+1 * SPACE NOP STA SLEN ADA #LNS ENOUGH LINES ON PAGE? SSA,RSS JMP SP1 NO: PAGE EJECT INSTEAD STA #LNS JSB SPC.C DEF C.LST DEF SLEN JMP ABORT ERROR RTN JMP SPACE,I * SP1 EQU * JSB EJECT JMP SPACE,I SLEN BSS 1 * * ******************** * * S T O R B * * ENTRY: * LDA * LDB * JSB STORB * * EXIT: