ASMB,R RTE-M CROSS-REFERENCE TABLE GENERATOR SEGMENT HED ** RTE-M CROSS-REFERENCE TABLE GENERATOR SEGMENT ** * * * 9/10/76 * * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * * NAME : XRFSG * SOURCE: 92064-18137 * RELOC : 92064-16026 * PRGMR : C.H., H.C., S.K. * NAM XRFSG,5,99 92064-16026 REV.2001 791004 EXT READF EXT CLOSE EXT IMESS EXT FCONT EXT AI,AL,?FMPE,?ERR,DCBL,?FWA,?LWA,FCONT,WRITF,READF EXT DCBI,RTNXR,PRMXR,.M12 * * * THIS SEGMENT PRODUCES A CROSS REFERENCE TABLE FOR A PROGRAM * WRITTEN IN HP-21XX ASSEMBLY LANGUAGE (HPAP). THE TABLE CON- * SISTS OF A LIST OF SYMBOLS, IN ALPHABETIC ORDER, EACH FOLLOWED * BY ITS LOCATION IN THE PROGRAM, AND A LIST OF REFERENCES TO * THAT SYMBOL. EACH LOCATION IS A 5-DIGIT SEQUENCE NUMBER, FOL- * LOWED BY THE NUMBER OF THE TAPE ON WHICH IT APPEARS. THESE TWO * ARE SEPARATED BY A SLASH. THE TAPE NUMBER IS NOT PRINTED WHEN * ONE TAPE ONLY EXISTS. * * THE METHOD USED IS TO READ IN THE HPAP SOURCE PROGRAM AND * BUILD A TABLE OF REFERENCES. THERE ARE TWO INTERNAL TABLES, THE * LABEL TABLE (LTAB) AND THE CROSS REFERENCE TABLE (XTAB). THESE * TABLES ARE ORGANIZED AS FOLLOWS: * * LTAB: EACH ENTRY CONTAINS THE LABEL NAME AS FOLLOWS: * WORD COUNT CHAR.1 * CHAR.2 CHAR.3 (OPTIONAL) * CHAR.4 CHAR.5 (OPTIONAL) * CHAR.6 CHAR.7 (OPTIONAL) * * THE WORD COUNT MAY BE 1,2,3, OR 4 * * XTAB: EACH ENTRY CONTAINS THE FOLLOWING: * -NUMBER OF WORDS IN ENTRY (-N-2) * LABEL SEQUENCE NUMBER * REF.1 " " LABELS ARE ADDED AS ENCOUNTERED; * ... * REF.N " " REST OF TABLE IS PUSHED DOWN. * * NO LINKAGE BETWEEN THE 2 TABLES IS REQUIRED BECAUSE THE ENTRIES * ARE IN THE SAME ORDER AND CORRESPOND 1 FOR 1. * NOTE THAT LTAB BEGINS IN LOW CORE AND XTAB IN HIGH CORE, SO THAT * BOTH ARE OPEN-ENDED. * * A LABEL WHICH HAS BEEN DEFINED BUT NEVER REFERENCED IS SIGNIFIED BY * A "@" IN COLUMN #1 PRECEEDING THE LABEL. * * A LABEL WHICH HAS BEEN DEFINED MORE THAN ONCE WILL HAVE A DEFINITION * FIELD OF HASH MARKS: "#####". * * A LABEL WHICH HAS BEEN REFERENCED BUT NEVER DEFINED WILL HAVE A * DEFINITION FIELD OF QUESTION MARKS "?????". * * ANY INSTRUCTION THAT WILL HAVE AN EFFECT UPON THE PROGRAM LISTING * AS ORG, ORB, ORR, IFN, IFZ, XIF, ECT. WILL BE DEFINED AS FOLLOWS: * " **XXX ***** NNNNN NNNNN " WHERE XXX IS THE TYPE OF INSTR. * AND NNNNN IS THE SEQUENCE NUMBER OF THE INSTRUCTION. * * A LITERAL INSTRUCTION WILL BE DEFINED AS A LABEL WITH ITS DEFINITION * FILLED WITH DOTS, OTHER SEQUENCE NUMBERS DEFINE WHERE THEY WERE USED. * * PARAMETERS ARE PASSED BY ASMB OR XREF MAIN IN A 2 WORD BUFFER PRMXR * WHERE PRMXR BIT 15 = 0 NO ALPHA LIMITS WILL BE ASKED * = 1 ALPHA LIMITS WILL BE ASKED * "ENTER LIMITS OR /E" * BITS 0-14 = # LINES PER PAGE - DEFAULT IS 55 * PRMXR+1 = 0 TAPE NUMBERS WITH SEQUENCE #'S WILL BE GIVEN * = N NO TAPE NUMBERS ARE GIVEN THUS ALLOWING * LARGER SEQUENCE #'S * = -N PAGES ARE NUMBERED CONSECUTIVELY FROM THE * LAST RTE-ASMB PAGE # * (TAPE #'S WILL BE PRINTED) * (MORE THAN 16 TAPES: PROCESSING TERMINATES) * * SKP * * XRFSG LDA PRMXR GET FIRST PARAMETER ELA SIGN BIT IN E REG CLB ELB B REG HAS BIT 15 ERA A REG HAS BITS 0-14 OF FIRST PARM STB LETOP SAVE LIMIT PARAMETER CMA,INA,SZA,RSS NEGATE COUNT, AND CHECK FOR ZERO JMP TAPE ZERO, SO USE DEFAULT COUNT = 55 LINES PER PAGE STA CHEKR SAVE FOR LATER USE ADA .55 ADD MAXIMUM ALLOWABLE VALUE SSA IS PARAMETER <= MAXIMUM VALUE? JMP TAPE NO, USE DEFAULT LDA CHEKR YES, GET SUPPLIED VALUE STA NLINZ SAVE IN LINE COUNTER STA LNSKP SAVE IN LINE SKIP COUNTER * TAPE LDA PRMXR+1 GET THE TAPE NUMBER OPTION PARAMETER STA .TAPE SAVE THE TAPE NUMBER OPTION PARAMETER SSA,RSS IF PARAM. IS POSITIVE, PROCEED JMP TAPE# NORMALLY; ELSE, IF NEGATIVE, CMA,INA MAKE POS. FOR CONTINUING PAGE STA PAGNO FROM THE ASSEMBLER. CLA SET THE FLAG TO INDICATE STA .TAPE THAT TAPE NUMBERS ARE DESIRED. * TAPE# SZA IS THIRD PARAMETER NON-ZERO JMP XR11 YES; SET FOR NO TAPE NUMBERS LDA RM4 NO; SET FOR TAPE NUMBERS STA MSK12 SET SEQ # MADK LDA RM5 STA TAPE1 SET TAPE # ADD VALUES LDA RM6 STA ROTAT SET ROTATE INSTR -ALF,RAL- FGSET CLA LOAD A WITH ZERO STA RUN SET RUN TO ZERO RSTAR LDA DEFCB INITIALIZE CONSTANTS ADA DEFCB STA CHAR1 STA OUTBF LDA DEFLB ADA DEFLB STA LABCH LDA FXEND GET "CODED" END OF OP-CODE TABLE, STA ETAB AND SET CURRENT END-OF-TABLE ADDRESS. LDA ?FWA SET BEGINNING OF LTAB TABLE STA FWA * LDA RUN GET RUN FLAG SZA NEW PASS: OPERATOR SPEC'D LIMITS ? JMP CLSEQ YES, SKIP LINE CNT,. & NAME INIT. LDA BLBL SET BLANKS IN STA NAME NAME LOCATION STA NAME+1 STA NAME+2 CCA SET A TO -1 STA LINES SET LINES TO -1 CLSEQ CLA INITIALIZE STA SEQNO SEQUENCE NUMBER & STA LABCT NUMBER OF LABELS TO ZERO STA DDFLG CLEAR DOUBLE DEFINES FLAG STA LOBND SET LOWER BOUND OF LLOWED SYMBS 0 STA TAPNO INITIALIZE TAPE NUMBER LDA MASK8 SET UPPER BOUND OF ALLOWED STA HIBND SYMBOLS. LDA ?FWA BOUNDS OF STA LTAB. LABEL TABLE LDA ?LWA BOUNDS OF CROSS STA .XTAB REFERENCE TABLE LDA LETOP CHECK IF XREF LIMITS SPECIFIED SZA,RSS JMP RAC THEYRE NOT--USE 0 AND 377,I.E.,ALL. JSB IMESS DEF *+4 DEF .2 DEF EMESG DEF .18 LDA TWO LDB BUFAD READ TWO CHARS FROM KEYBOARD. JSB KEYBD LDA CBUF CPA SLSHE KEYBOARD TERMINATE REQUEST? RSS YES, GO SEE IF PAGE EJECT REQUIRED. JMP BOUND NO. GO TO SET NEW BOUNDS. LDA RUN GET RUN FLAG. SZA HAS ANY OUTPUT OCCURRED? JMP PEJEC YES, GO ISSUE TERMINATING PAGE EJECT. JMP STOP NO. DON'T WASTE PAPER. BOUND LDA CBUF PLACE THE TWO CHARS IN LOBND AND MASK8 AND HIBND. STA HIBND XOR CBUF ALF,ALF STA LOBND SPC 1 * RECORD INPUT SECTION * SPC 1 RAC CLA INITIALIZE NEXT TO ZERO TO PRE- STA NEXT VENT ERROR FROM OCCURING IN ID. LDA DEC80 NUMBER OF CHARACTERS TO BE READ. LDB BUFAD ADDRESS OF CHARACTER BUFFER JSB READ GO TO READ THE RECORD. SZA END OF TAPE? JMP DOCRD NO. GO TO PROCESS RECORD SPC 1 * END OF TAPE SECTION * SPC 1 LDA .TAPE YES, LOAD A WITH TAPE # PARAMETER SZA SKIP IF PARAMETER IS ZERO JMP RAC IF NOT ZERO SKIP EOT ROUTINE STA SEQNO RESET SEQUENCE NO. TO ZERO. LDA TAPNO OTHERWISE BUMP TAPE NUMBER ADA TAPE1 BY ONE STA TAPNO AND UPDATE TAPE COUNTER. SSA,RSS MORE THAN 16 TAPES PROCESSED? JMP RAC NO, CONTINUE. LDA TPMSG YES, GET ADDRESS OF TAPE MESSAGE. JMP NDFIL+1 GO TO PRINT & ABORT. * XR11 LDA RM1 LOAD WITH MASK OF 077777B STA MSK12 SET SEQ # MASK LDA RM2 STA TAPE1 SET TAPE # ADD VALUE LDA RM3 STA ROTAT SET ROTATE INSTRUCTION -RAL- STA .TAPE SET TAPE# PARAMETER: NON-ZERO JMP FGSET M1 DEC -1 SPC 1 * RECORD PROCESSING SECTION * SPC 1 DOCRD ISZ SEQNO ADD 1 TO SEQUENCE NUMBER. CMA INITIALIZE CCNT TO STA CCNT -1-# OF CHARACTERS IN RECORD LDA RM1 LOAD A WITH RM1 MASK CPA MSK12 IS IT THE SAME AS MASK 12 JMP RETRX YES, CONTINUE NORMAL SEQUENCE. LDA SEQNO NO, LOAD A WITH SEQUENCE NUMBER CPA =D2048 IS SEQUENCE NUMBER 2048 JMP .CHNG YES, CHANGE TO NO TAPE NUMBERS RETRX LDB CHAR1 GET THE FIRST STB CPNTR JSB BUF2A CHARACTER. CPA STAR IF A STAR, GO TO READ THE JMP RAC NEXT RECORD. CPA BLANK IF A BLANK, SKIP OVER LABEL JMP DOOP SECTION. JSB ID GO GET THE LABEL JMP RAC ILLEGAL LABEL. CPA COMMA IS NEXT CHARACTER A COMMA ? JMP RAC IF SO, IGNORE--ASMB CARD. JSB CHEKR JMP DOOP JSB LLKUP FIND THE LABEL IN LTAB. CCB SET B TO POINT AT LABEL SEQUENCE JSB PUTSQ NUMBER AND PUT IN XTAB. SPC 1 * OPERATOR PROCESSING SECTION * SPC 1 DOOP JSB ID GO GET THE OPERATOR. JMP RAC ILLEGAL OPERATOR. JSB LOOK FIND IN OPERATOR TABLE DEF OPBEG DEFINE BEGINNING OF OPERATOR TABLE ETAB DEF FXEND DEF END OP-TABLE (MODIFIED BY 'DOMIC') LDB A GET INDEX VALUE CMB IF IT IS EQUAL ADB MICOP OR GREATER ELB THAN SEZ CONSTANT, USE LDA MICOP CONSTANT AS INDEX BASE. LDB OPCNT GET # OF OPERANDS FOR CURRENT OP-CODE. SZB IF NOT ZERO, JMP DOOP1 GO MAKE NUMBER NEGATIVE. SEZ,RSS IF NOT A MIC-OP, INB,RSS INCR BY ONE, AND SKIP. RSS DOOP1 CMB,INB MAKE NEGATIVE AND STB TEMP2 SAVE FOR FUTURE REFERENCE. ADA SWICH JUMP TO CORRECT PROCESSING JMP 0,I ROUTINE. * .CHNG LDA RM1 CHANGE STA MSK12 FOR LDA RM2 NO STA TAPE1 TAPE LDA RM3 NUMBERS STA ROTAT STA .TAPE SET TAPE PARAMETER NON-ZERO JMP RETRX RETURN. SPC 1 * CHEKR TESTS FOR WHETHER THE CURRENT LABEL IS BETWEEN THE * BOUNDS OF ACCEPTABILITY. THAT IS, WHETER ITS FIRST CHAR * IS BETWEEN LOBND AND HIBND. IF IT IS, WE RETURN TO * NORMAL +1, OTHERWISE TO NORMAL SPC 1 CHEKR NOP LDA LABEL GET THE FIRST CHARACTER AND MASK8 CMA,INA -CHAR ADA HIBND HIBND-CHAR SSA TEST HIGH END JMP CHEKR,I TOO HIGH. CMA,INA CHAR-HIBND ADA HIBND CHAR CMA -CHAR-1 ADA LOBND LOBND-CHAR-1 SSA TEST LOW END ISZ CHEKR FORCE THE SKIP IF OKAY. JMP CHEKR,I SPC 1 PSUDO NOP LDA LABEL+1 LOAD CHARACTERS 2 AND 3 STA LABEL+2 STORE AS CHARACTERS 4 AND 5 LDA LABEL LOAD THE FIRST CHARACTER IOR SSTAR SET THE WORD COUNT TO "*". STA LABEL+1 STORE AS CHARACTERS 2 AND 3 LDA SPCLB LOAD WORD COUNT/ASTERISK STA LABEL STORE FIRST CHARACTER WORD JSB CHEKR GO CHECK FOR CURRENT BOUNDS JMP PSUDO,I GO IGNORE CURRENT OPERATOR ISZ PSUDO RETURN TO P+2: WITHIN BOUNDS. JSB LLKUP GO GET THE SYMBOL ORDINAL JMP PSUDO,I RETURN SPC 1 DOSP1 CLA,RSS SPECIAL OPCODE; OPERAND EXPECTED. DOSPC CCA SPECIAL OPCODE; NO OPERAND. STA SOP STORE THE OPERAND OPTION FLAG. JSB PSUDO GO PROCESS PSUEDO OPCODE JMP IGNOP IGNORE: OPCODE OUT OF BOUNDS! CLB ENTER: B=0 JSB PUTSQ GO INSERT SEQ. # IN XTAB. IGNOP ISZ SOP IS AN OPERAND TO BE PROCESSED? SPC 1 * PROCESS SINGLE AND MULTIPLE OPERANDS * SPC 1 DOSOP JSB SOP PROCESS THE OPERAND. JMP RAC GO TO NEXT RECORD. SPC 1 * ROUTINE TO HANDLE SINGLE AND MULTIPLE OPERANDS * SPC 1 SOP NOP LDA TEMP2 IF NO OPERANDS SZA,RSS WERE SPECIFIED JMP SOP,I RETURN. CLIND CLA STA INDIR CLEAR INDIRECT INDICATOR DONXT JSB ID GET A SYMBOL JMP NXOPR NOT SYMBOLIC LDA INDIR IF INDIRECT INDICATOR SZA IS SET, GO CLEAR AND JMP CLIND GO GET NEXT SYMBOL. JSB CHEKR JMP NXOPR JSB LLKUP GET SYMBOL'S ORDINAL IN A CLB AND CREATE A SEQ. NO. IN JSB PUTSQ XTAB. NXOPR LDA NEXT IS NEXT CHARACTER CPA PLUS A PLUS JMP DONXT YES-GO GET NEXT SYMBOL CPA MINUS NO-IS IT A MINUS? JMP DONXT YES-GO GET NEXT SYMBOL CPA COMMA NO-IS IT A COMMA? JMP STIND YES-GO SET INDIR. CPA BLANK NO-IS IT A SPACE? JMP BPCNT YES-GO DECR CNTR JMP SOP,I NO-GO GET NEXT STIND STA INDIR SET INDIRECT INDICATOR BPCNT ISZ TEMP2 DECR COUNTER BY 1 JMP DONXT GO GET NEXT OPERAND JMP SOP,I GO GET NEXT STATEMENT TEMP2 = 0 SPC 1 * MIC PROCESSOR SPC 1 DOMIC JSB PSUDO GO PROCESS PSUEDO OP-CODE JMP IGMIC IGNORE 'MIC': OUT OF BOUNDS. CLB ENTER B=0 JSB PUTSQ GO INSERT SEQ # IN XTAB. IGMIC JSB ID GET OP-CODE JMP RAC GO TO PROCESS NEXT RECORD LDA LABEL GET 1ST CHAR OF OP-CODE LDB ETAB GET CURRENT END OF OP-CODE TABLE STA B,I STORE 1ST CHAR OF OP-CODE INB INCR CURRENT END OF OP-CODE TABLE LDA LABEL+1 STA B,I STORE LAST 2 CHARS OF OP-CODE JSB PSUDO GO PROCESS AS PSUEDO OP-CODE JMP MICPR IGNORE PSUEDO OPCODE; CHECK PARAMETERS. CCB SET B TO POINT AT LABEL SEQUENCE JSB PUTSQ NUMBER AND PUT IN ETAB. MICPR LDA NEXT IS NEXT CHAR CPA COMMA EQUAL TO A COMMA? RSS YES - GO GET NEXT PARAM JMP RAC NO - GO GET NEXT STATEMENT. GSEC JSB ID GO GET NEXT SYMBOL JMP *+1 SKIP SECOND PARAMETER LDA NEXT IS NEXT CHAR CPA BLANK EQUAL TO SPACE JMP RAC YES - GO GET NEXT STATEMENT CPA FEED IS IT A LINE FEED JMP RAC YES - GO GET NEXT STATEMENT CPA COMMA IS IT A COMMA RSS YES - GO GET NEXT CHAR JMP GSEC NO - GO GET NEXT SYMBOL GTLEN JSB CHAR GET # OF OPERANDS PARAMETER CPA BLANK SKIP JMP GTLEN BLANKS. CPA FEED END OF CARD? JMP FLEN YES - CONTINUE. JSB DIGIT GO CHECK SEE IF IT IS A DIGIT RSS YES - IT IS A DIGIT CONTINUE FLEN CLA,INA,RSS SYMBOLIC - SET # OF OPERANDS TO 1. AND .7 CONVERT ASCII DIGIT TO OCTAL. ALF ALF,ALF STA NEXT LDB ETAB LDA B,I GET FIRST CHAR OF CURRENT OP-CODE IOR NEXT "OR" IN NUMBER OF OPERANDS STA B,I RESTORE ENTRY IN TABLE ALF,ALF UPDATE POINTER AND .15 TO NEXT ADB A ENTRY IN OP-CODE STB ETAB TABLE. JMP RAC GO GET NEXT STATEMENT SPC 1 * EXT PROCESSOR SPC 1 DOEXT JSB ID GET SYMBOL JMP RAC END OF STATEMENT. JSB CHEKR JMP DOEXX JSB LLKUP PUT IN LABEL TABLE. JSB ORDLK GET ADDRESS OF LABEL SEQUENCE ADA MIN1 LDB 0,I NUMBER AND SEE IF IT'S ZERO. SZB,RSS IF IT IS, PLACE THE CURRENT JSB MKSEQ SEQNO THERE. DOEXX LDA NEXT IF NEXT CHARACTER IS A CPA COMMA COMMA, JMP DOEXT GO GET THE NEXT SYMBOL, JMP RAC ELSE GO TO READ NEXT LINE. SPC 1 * ENT PROCESSOR * SPC 1 DOENT JSB SOP PROCESS SYMBOL. CPA COMMA IF NEXT CHARACTER IS A COMMA, RSS SKIP FOR REFRESH JMP RAC ELSE GO TO READ NEXT CARD. CCA REFRESH NUMBER-OF-OPERANDS STA TEMP2 COUNTER, AND JMP DOENT GO TO GET THE NEXT SYMBOL. SPC 1 * COM PROCESSOR * SPC 1 DOCOM JSB ID GET A SYMBOL JMP RAC END OF STATEMENT. JSB CHEKR JMP DOCM1 JSB LLKUP PUT IN LABEL TABLE. CCB JSB PUTSQ PUT SEQUENCE NUMBER IN XTAB. DOCM1 LDA NEXT IF NEXT CHARACTER IS A CPA LPREN LEFT PARENTHESIS, JMP COMRG GO TO PROCESS ARGUMENT. COM1 CPA COMMA IF A COMMA, JMP DOCOM GO GET NEXT COMMON ENTRY. JMP RAC ELSE GET NEXT RECORD. COMRG JSB CHAR PROCESS ARGUMENT. CPA RPREN IF NEXT CHAR. IS A RIGHT PAREN, JMP *+4 GO GET NEXT COM ENTRY. CPA FEED IF A LINE FEED, THEN JMP RAC END OF CARD. JMP COMRG ELSE GET NEXT CHARACTER. JSB CHAR JMP COM1 SPC 1 * NAM PROCESSOR * SPC 1 DONAM LDA CCNT GET CURRENT CHARACTER COUNT. STA NAMLN SAVE FOR EXTENSION PROCESSING. JSB ID GET THE NAME JMP RAC NOT THERE LDA LABEL GET FIRST CHARACTER OF NAME AND MASK8 IOR UPBLN AND PRECEDE IT BY A BLANK. STA NAME MOVE TO NAME LOCATION. LDA LABEL+1 STA NAME+1 LDA LABEL+2 STA NAME+2 LDA CCNT GET CURRENT CHARACTER COUNT. CMA,INA,SZA,RSS MAKE POSITIVE. ZERO ? JMP RAC YES, GO GET NEXT RECORD. ADA NAMLN ANY MORE TO PROCESS ? SSA,RSS JMP RAC NO. GO TO READ NEXT RECORD. LDA .NMEX ADA .NMEX STA NAMLN LDA NEXT GET LAST CHARACTER READ. RSS GO TO CHECK FOR FIRST BLANK. FBLNK JSB CHAR YES, EXAMINE NEXT CHARACTER. CPA FEED IF CHAR. IS A LINE FEED, THIS IS JMP RAC END OF STRING. GO READ NEW REC CPA BLANK IS THIS BEGINNING OF NAM EXTENT? RSS YES, GO TO PROCESS. JMP FBLNK NO. GO SEARCH FOR 1RST BLANK. LDB DM40 (B) = MAX CHAR. COUNT. LDA CCNT GET CURRENT CHAR. COUNT. ADA DEC40 IS NAM EXTENT >40 CHARS.? SSA STB CCNT YES, SET = 40 MAX CHARS. LDA BLANK (A)= ASCII BLANK. MVEXT LDB NAMLN JSB A2BUF ISZ NAMLN JSB CHAR GET THE NEXT CHARACTER. LDB CCNT GET NUMBER OF CHARS. ALREADY MOVED. SZB EXTENSION BUFFER FULL ? CPA FEED NO. IF THIS CHARACTER IS A LINE FEED, JMP RAC THAT'S ALL. JMP MVEXT GO BACK FOR MORE. SPC 1 * END PROCESSOR * SPC 1 DOEND JSB SOP PROCESS ELEMENT FOLLOWING END. LDA TAPNO SET TAPE NUMBER STA TPCNT TO TAPE COUNT * SPC 1 * OUTPUT SECTION * SPC 1 LDA RUN GET RUN FLAG SZA NEW PASS: OPERATOR SPEC'D LIMITS? JMP *+3 YES, DON'T FORCE NEW HEADER. CCA SET LINE COUNT TO -1 TO FORCE PAGE EJECT STA LINES TITLE AT THE BEGINNING. LDA LABCT COMPLEMENT LABCT TO FACILITATE STA LBLCT CMA ITS USE AS A COUNTER. STA LABCT SPC 1 * SECTION TO PROCESS A SINGLE LABEL * SPC 1 DUMP ISZ LABCT ANY MORE LABELS ? JMP DOLAB YES. LDA LETOP GET LIMIT PARAMETER. SZA LIMITS SUPPLIED FROM KEYBOARD ? JMP KYRTN YES, BYPASS PAGE EJECT. PEJEC JSB FCONT DEF *+5 EJECT DEF DCBL PAGE DEF ?ERR DEF .110B DEF LINES SSA,RSS ERRORS? JMP STOP NO CPA .M12 -12 ERROR? JMP STOP YES, THEN IGNORE IT JSB ?FMPE FMP ERROR ROUTINE DEF AL+1 FILE NAME KYRTN ISZ RUN SET RUN NOT EQUAL TO ZERO JMP RSTAR RETURN FOR NEXT LIMITS * DOLAB LDA MAXCC SET CCNT SO AS TO FORCE A STA CCNT BLANK LINE. JSB LINE * * SEARCH LABEL TABLE TO FIND THE FIRST LABEL, ALPHABETICALLY * * LDA MASK8 INITIALIZE TO A STA LABEL MAXIMUM. LDA ?FWA INITIALIZE LPNTR TO POINT AT STA PNTR1 FIRST ENTRY. LDA LTAB. SET LTAB. AS END OF TABLE CMA,INA POINTER. STA PNTR2 CLA INTIALIZE ORDNL TO STA ORDNL ZERO. DOLB1 ISZ ORDNL ADVANCE ORDNL. LDB PNTR1 TEST FOR END OF LTAB. ADB PNTR2 SSB,RSS SKIP IF NOT END OF LABEL TABLE. JMP GOTLB GO TO PRINT SECTION. * * MOVE CURRENT LABEL TO TEST ARRAY. * * LDA BLBL FIRST INITIALIZE TO BLANKS. STA TEST+1 STA TEST+2 STA TEST+3 STORE BLANKS IN TEST BUFFER LDA PNTR1 SET TEMP TO POINT AT CURRENT STA TEMP LABEL. LDB .TEST SET B TO POINT AT TEST ARRAY. LDA TEMP,I GET FIRST WORD OF LABEL IN A. AND MASK8 GET FIRST CHARACTER IN STA TEST TEST. XOR TEMP,I GET WORD COUNT IN HI-PART OF A. ALF,ALF ROTATE TO LO-PART. CMA,INA STORE AS NEGATIVE IN COUNT. STA COUNT DOLB2 ISZ TEMP ADVANCE LABEL POINTER. ISZ COUNT TEST FOR ANY MORE WORDS IN LABEL INB,RSS ADVANCE TEST POINTER, SKIP JMP COMPR GO TO COMPARISON SECTION. LDA TEMP,I GET NEXT WORD OF LABEL. STA 1,I AND MOVE IT TO TEST ARRAY. JMP DOLB2 SPC 1 * COMPARISON SECTION * SPC 1 COMPR LDA .LAB SET TEMP1 TO POINT STA TEMP1 AT LABEL LDB .TEST AND B TO POINT AT TEST LDA MIN4 SET COUNT TO -4 STA COUNT DOLB3 LDA TEMP1,I GET LABEL WORD IN A AND CMA,INA SUBTRACT IT FROM ADA 1,I TEST WORD. SSA IF TEST WORD IS SMALLER, GO TO JMP MOVE MOVE SECTION; SZA IF BIGGER GO TO JMP KEEP KEEP SECTION. ISZ COUNT TEST FOR ANY MORE WORDS. RSS YES. JMP KEEP NO--SHOULDN'T COME HERE ISZ TEMP1 ADVANCE LABEL POINTER INB AND TEST POINTER JMP DOLB3 MOVE LDA 1,I MOVE TEST WORD TO LABEL STA TEMP1,I ISZ TEMP1 ADVANCE INB POINTERS. ISZ COUNT ANY MORE WORDS IN TEST ? JMP MOVE YES. LDA PNTR1 SET UP ADDRESS OF BEST LABEL STA BESTL SO FAR. LDA ORDNL SET ORDINAL OF THAT STA BESTO LABEL ALSO. KEEP LDA TEMP SET PNTR1 TO NEXT LABEL, AND STA PNTR1 GO TO TEST THE JMP DOLB1 NEXT ONE. *