ASMB,R,L,C
      HED ** RTE-M ASMB - SEGMENT 1 **
* 
* 
*     9/24/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  : ASMB1 
* SOURCE: 92064-18128 
* RELOC : 92064-16041 
* PRGMR : C.H., H.C., S.K.
* 
      NAM ASMB1,5,99 92064-16041 REV.1650 761001
* 
      SUP 
      ENT ASMB1 
      ENT ?LITI,?CMQ,?INSR,?HA3Z,?ENP,?EXP
* 
      EXT ?RSTA,?ERPR,?MOVE,?CHPI,?OPER,?PLIT,?ORGS 
      EXT ?ASCN,?BPKU,?MSYM,?PKUP,?SYMK,?CHOP,?ENDS 
      EXT ?MSYS,?SEGM,?PNCH,?V,?X,?POSN 
      EXT ?ICSA,?TFLG,?LTFL,?CNTR 
      EXT ?ARTL,?ASM1,?ORRP,?BNCN,?DCOD,?PRNT 
      EXT ?LABE 
      EXT ?OPLK,?NDOP,?NDSY,?ENER,?PRPG 
      EXT ?BPSV,?GETA,?GETC,?SYMT 
* 
      COM TEMP(322B)
****************************
* 
#     EQU TEMP      SAME AS DATA ORIGIN 
VAL0  EQU TEMP+1    'ASCN' AND  'SYMK'
DCNT  EQU TEMP+4
...1  EQU TEMP+7
.1    EQU ...1
.4    EQU TEMP+10 
.5    EQU TEMP+11 
.12   EQU .1+7
..M1  EQU .12+6 
.M2   EQU TEMP+21 
L     EQU ..M1+6
.9    EQU #+41B 
.29   EQU #+42B 
.M8   EQU #+43B 
.M15  EQU #+44B 
.M29  EQU #+45B 
BLNK  EQU #+46B     =40B(LOWER BLANK) 
.IL   EQU #+47B 
.MBLN EQU #+50B 
.NO   EQU #+51B 
BLNS  EQU #+55B 
BIT15 EQU #+60B 
.E    EQU #+61B 
.B    EQU #+62B 
NAMI  EQU #+71B     LOC'N FOR TEMP SYMBOL STORAGE 
NAME  EQU #+72B     FOR USE BY 'OPLK' 
SUMP  EQU #+100B    RUNNING SUM FOR 'CHOP'
CFRA  EQU #+105B    'ASCN'
CNTB  EQU #+106B
CODE  EQU #+107B    OPCODE TYPE(FROM OPTABLE) 
FLEX  EQU CFRA      (ASCN)
INST  EQU #+113B    OPCODE FORMAT 
LAST  EQU #+114B
PEEK  EQU #+116B    LAST CHAR PICKED UP 
PLCN  EQU #+117B    PROGRAM LOCATION COUNTER
PLEN  EQU #+120B    LIT LENGTH PASS 1/LIT ORG PASS 2
PNTR  EQU #+121B    POINTS AT LAST OR CURRENT CHAR. 
SCN1  EQU #+125B    STATE LNG/OPCODE/OPERAND/LABEL(4) 
SYMI  EQU #+132B    ADDR CNTR FOR SYMBOL TBL (SYMK) 
SYMP  EQU #+133B    SYMBOL LNG/ AND LOC'N 
TEST  EQU #+135B    TEST CHARACTER
ENT.  EQU #+137B
ENTC  EQU #+140B
ENTV  EQU #+141B
*          * I/O STATEMENT BUFFER * 
IOBF  EQU #+142B    50 WORDS + END OF STATEMENT BUFF
*      *(INPUT BUFFER 'BUFF' STARTS IN 11TH WORD)*
BUFF EQU IOBF+12B 
PBUF  EQU #+225B    SAVES THE 'NAM' RECORD INFO.
WCNT  EQU PBUF      WORD(BLK) CNT FOR BIN.RECRD.
      SPC 1 
ASCN  EQU ?ASCN 
BPKUP EQU ?BPKU 
CHOP  EQU ?CHOP 
CHOPI EQU ?CHPI 
CNTR  EQU ?CNTR 
ERPR  EQU ?ERPR 
GETA  EQU ?GETA 
GETC  EQU ?GETC 
LTFLG EQU ?LTFL 
MOVE  EQU ?MOVE 
MSYM  EQU ?MSYM 
MSYMS EQU ?MSYS 
OPERR EQU ?OPER 
ORGSV EQU ?ORGS 
PKUP  EQU ?PKUP 
PNCH  EQU ?PNCH 
RSTA  EQU ?RSTA 
SYMTS EQU ?SYMT 
X     EQU ?X
      SPC 1 
ASMB1 JSB RSTA
      LDA CODE
      CPA .12+3     'HED' STATE?
      JMP IXH       YES 
      STA ?ASM1     CLEAR 'CS' AND 'INIT' FLAGS 
      CPA .12+1     (13) NAM ?
      JMP HI12
* 
*             * NO NAM OR ORG * 
* 
      LDA .NO       'NO'= NO ORG OR NAM STATEMENT 
      JSB ERPR
      JMP HA32+1
IXH   JSB INST,I    GO TO HEDSB 
      JMP ASMB1 
* 
* 
*             * PROCESS NAME FOR BINARY RECORD *
* 
PNSAV OCT 0,0       FOR USE IN 'NAM' SETUP
HI12  LDB SCN1+2
      JSB MSYM      MEASURE THE NAME
      STB HI14
      STA PNSAV     SAVE # OF CHARS IN THE PARAMETER
      LDB TEST      GET CONTINUATOR 
      STB PNSAV+1   AND SAVE IT 
      LDB CSAD
      JSB MOVE      MOVE IT TO THE 'NAM' RECORD 
HI14  NOP 
      LDA PNSAV+1   GET THE CONTINUATOR 
      CPA L+4       COMMA?(ANOTHER PARAMETER?)
      RSS           YES 
      JMP HI16      NO - GO TEST FOR END
      LDA PNSAV     GET # OF CHARS IN CURRENT PARAME
      ADA PNTR
      INA 
      STA PNTR      SET POINTER TO NEXT PARAMETER 
      JSB BPKUP     SCAN TO NEXT PARAM. 
      JSB MSYM      MEASURE IT
      STA PNSAV     SAVE # OF CHARS IN THE PARAMETER
      ALF,ALF 
      INA           FOR DECIMAL CONV
      ALF,ALF       POSITION IT 
      STA 1         PARAM. FOR 'ASCN' TO 'B' REG. 
      LDA TEST      GET CONTINUATOR 
      STA PNSAV+1   AND SAVE IT 
      LDA PNTR      GET POSITION OF NUMBER
      JSB ASCN      GO CONVERT THE NUMBER 
      CLA           ERROR RETURN, SET 'A' =0
      STA PBF9,I
      ISZ PBF9
      JMP HI14+1
PBF9  DEF PBUF+9
HI16  CPA BLNK      LEGAL?
      RSS           YES 
      JSB OPERR     NO - PRINT 'M' ERROR
      LDA PBUF+9
      SZA,RSS       IS TYPE=0(SYSTEM)?
      STA PBUF+10   YES,  SET PRIORITY = 0. 
      SPC 1 
*            * EXTENDED NAM RECORD PROCESSOR *
      SPC 1 
      LDA PNSAV     GET # OF CHARS. IN CURRENT PARAM. 
      ADA PNTR
      INA           SET POINTER TO NEXT PARAMETER.
      STA PNTR      SAVE FOR BUFFER MOVE. 
      CMA,INA       COMPUTE THE NUMBER OF 
      ADA SCN1        ADDITIONAL CHARACTERS, IF ANY.
      SSA,INA       MORE ?
      JMP HA32      NO. 
      STA PNSAV     YES. SAVE CHARACTER COUNT.
      LDA PNTR      RELATIVE POINTER TO START 
      JSB GETA        OF NAM RECORD EXTENSION 
      STB SRCAD         SOURCE BUFFER.
      LDA PNSAV     GET NUMBER OF CHARACTERS, 
      LDB DSTAD       AND DESTINATION ADDRESS 
      JSB MOVE        FOR DATA MOVE.
SRCAD NOP 
      LDA PNSAV     CONVERT NUMBER OF 
      INA             CHARACTERS TO 
      ARS             NUMBER OF WORDS.
      ALF,ALF       POSITION TO UPPER BYTE. 
      ADA WCNT      COMPUTE TOTAL NAM-REC WORD COUNT
      STA WCNT      SAVE FOR PUNCH ROUTINE. 
* 
      SKP 
HA32  JSB RSTA      GO TO GET NEXT STATEMENT. 
      LDA CODE      GET OPCODE IDENTIFIER.
      CPA .12       IS IT THE 'END' STATEMENT ? 
      JMP HB00       YES, GO TO 'END' PROCESSOR.
      CPA BLNK      (40B) SUP/UNS?
      JMP HA32       IGNORE-PASS #1.
      CPA .32B      REPLACEMENT CODE ?
      JMP HA71       YES, GO TO RPL PROCESSOR.
      CPA .100B     USER MICROCODE (MIC)? 
      JMP MIC        YES, GO PROCESS. 
      ADA ..M1+2    (-3)
      SSA           ORR/ORB/ORG ? 
      JMP HA64       YES, ROUTE TO PROCESSOR. 
      CPA .12B      NAM?
      JMP HA63       YES, ERROR 
      ADA ..M1+2    (-3)
      SSA           'COM','ENT' OR 'EXT' ?
      JMP INST,I    JUMP TO ROUTINE DESIGNATED IN INST
      CPA ...1+4    'EQU'?
      JMP HA56      TO EQU
      CPA .9        (11B) HED?
      JMP HA32       IGNORE-PASS #1.
      CPA .12       (14B) SKP?
      JMP HA32       IGNORE-PASS #1.
      CPA .12+1     (15B) SPC?
      JMP HA32       IGNORE-PASS #1.
      CPA .12+2     (16B) LST/UNL?
      JMP HA32       IGNORE-PASS #1.
* 
*             * TEST FOR LABEL FIELD *
      JSB LABEL 
      LDA CODE      OPCODE INDICATOR
      CPA DEX 
      JMP HA40      IT'S A 'DEX'
      CPA BYT       IS IT A 'BYT'?
      JMP HA40       YES, GO PROCESS. 
      CPA .29       REP?
      JMP HA64      YES 
      CPA ...1+6    (7) 
      JMP HA54      TO ASC
      CPA .26B      INTEGER ARITH(HARDWARE)?
      JMP HA70       YES....
      CPA ...1+5    (6) ARITH MACRO?
      JMP INST,I     YESM JUMP TO PROCESS IT..
      ADA .M10      -10 
      SSA           OCT OR DEC? 
      JMP HA40        YES.
      SZA,RSS       BSS?
      JMP HA3M       TO BSS PROCESSOR.
      CPA ...1+3    (4) MEM REF?
      JMP HA3L       YES,TEST FOR LITERAL 
      LDA CODE      GET OPCODE I.D. NUMBER. 
      ADA M100B     SUBTRACT 100 OCTAL. 
      SSA,RSS       CODE <100B ?
      JMP XMIC       NO, IT'S A MICROCODE MACRO.
HA3B  CLA,INA       TO ADD 1 TO PLCN
* 
*             * INCREMENT PROGRAM LOCN. CNTR. * 
* 
HA3Z  ADA PLCN      ADD CURRENT LOC'N.
      STA PLCN      SAVE NEW PROG. LOC'N COUNT. 
      JMP HA32      GO TO GET NEXT STATEMENT. 
.26B  OCT 26        FOR HARDWARE ARITHMETIC 
      SPC 1 
*             * PROCESS BSS * 
* 
HA3M  JSB CHOPI     EVALUATE OPERAND. 
      JMP HA32      * ERROR * 
      LDA 1         B TO A
      JMP HA3Z      GO UPDATE PROG. LOC'N COUNT.
HA3L  LDA LTFLG 
      SZA,RSS       LITERAL PRESENT ? 
      JMP HA3B       NO 
      LDA INST
      SLA           IS LITERAL LEGAL WITH INST? 
      JMP *+3        YES
      JSB OPERR      NO 'M' ERROR 
      JMP HA3B
      JSB ?PLIT     PROCESS LITERAL 
      NOP           IGNORE ERROR
      JMP HA3B
* 
.12B  OCT 12
.32B  OCT 32
.100B OCT 100 
M100B OCT -100
.M10  DEC -10 
BYT   OCT 43        OPCODE I.D. NO. FOR 'BYT' 
DEX   OCT 25        OP TYPE FOR 'DEX' 
CSAD  DEF PBUF+3    POINTS AT PUNCH BUFFER
DSTAD DEF PBUF+17   ADDR: NAM EXTENSION BUFFER. 
ENFLG NOP           FLAG FOR PROCESSING ENTRY POINTS
S     BSS 1 
* 
      SKP 
*            * PROCESS 'COMMON' DECLARATION * 
* 
CMQ   LDA SCN1+2
      STA PNTR      SET POINTER 
      STA TEST      SET TEST (U) = 0. 
CMQA  LDB PNTR
      JSB SYMCK     GO TO CHECK FOR VALID SYMBOL. 
      JMP HA32      ** ERROR ! GO TO GET NEXT STATEMENT.
      LDB PBF10,I   SAVE CURRENT COM. LOC'N 
      STB S           FOR SYMBOL TABLE VALUE. 
      LDB TEST      GET CHARACTER FOLLOWING THE SYMBOL. 
      CPB L+4       COMMA?
      JMP HM2        YES
      CPB BLNK      END OF OPERAND ?
      JMP HM2        YES, IT'S = BLANK
      CPB L         LEFT PAREN? 
      RSS            YES, = ( 
      JMP HA55+1     NO. ERROR: 1ST PASS
      JSB BPKUP     SKIP BLANKS 
      STB TEMP+1    SAVE POINTER
      JSB MSYM      MEASURE COM LENGTH
      STA TEMP      SAVE NUMBER OF CHARACTERS 
      JSB SPNTR     ALIGN POINTER 
      LDA TEST
      CPA L+1       RT PAREN? 
      RSS            YES, = ) 
      JMP HA55+1     NO. 1RST PASS ERROR! 
      STA PEEK
      LDB TEMP
      LDA LAST
      ADB ..M1      LENGTH-1 TO B REG 
      CPA .B        =B? (OCTAL VALUE) 
      RSS            YES-SKIP 
      ADB .401B      NO, SET FOR DECIMAL
      LDA TEMP+1
      JSB ASCN      GO TO ASCII CONVERSION ROUTINE
      JMP HA32      ERROR EXIT
      ADA PBF10,I   BUMP LENGTH OF OOMMON 
      STA PBF10,I 
* 
*            * INSERT 'COMMON' SYMBOL INTO TABLE *
HM3   LDA ...1+2    SET RELOC=COMMON
      LDB S         VALUE TO B
      JSB INSR      INSERT SYMBOL 
      NOP           ERROR EXIT
      LDA PEEK
      CPA BLNK      BLANK?
      JMP HA32       YES, EXIT TO HA32
      CPA L+4       COMMA?
      RSS            YES
      JSB PKUP      GET NEXT CHAR 
      JSB ENDTS     TEST FOR TERMINATION
      JMP CMQA
HM2   ISZ PBF10,I 
      STB PEEK      SAVE TEST 
      JMP HM3 
*             * PROCESS 'EXT' DECLARATION * 
EXP   LDA SCN1+2
      STA PNTR      SET POINTER 
EXPA  LDB PNTR
      JSB SYMCK     GO TO CHECK FOR VALID SYMBOL. 
      JMP HA32      ** ERROR: INVALID SYMBOL !
      LDB CNTR      VALUE TO B
      LDA ...1+3    (4) EXT INDIC.
      JSB INSR      GO TO INSERTION ROUTINE 
      JMP *+2       ERROR EXIT
      ISZ CNTR      BUMP EXT CNTR 
      LDA TEST
      JSB ENDTS     TEST FOR TERMINATION
      JMP EXPA      GO BACK, THERE'S ANOTHER 'EXT'!!
* 
*             * PROCESS 'ENT' DECLARATION * 
ENP   LDA .10B      SET ENFLG = 10B 
      STA ENFLG 
      LDA SCN1+2
      STA PNTR      SET POINTER 
ENPA  LDB PNTR
      JSB SYMCK     GO TO CHECK FOR VALID SYMBOL. 
      JMP HA32      ** ERROR: INVALID SYMBOL !
      LDA .210B     SET 'U' & 'E' FIELDS = 1
      CLB 
      JSB INSR      INSERT INTO THE SYMBOL TABLE
      NOP 
      LDA TEST
      JSB ENDTS     TEST FOR TERMINATION
      JMP ENPA
ENDTS NOP           TEST FOR TERMINATION
      CPA BLNK       OF COM,ENT OR EXT
      JMP HA55E 
      CPA L+4       COMMA?
      RSS            YES
      JMP HA55+1    NOT AN ERROR EXIT 
      JSB BPKUP     SCAN TO NEXT CHAR.
      JMP ENDTS,I 
* 
HA55E CLA 
      STA ENFLG     CLEAR 'ENT'FLAG 
      JMP HA32      EXIT ON A BLANK 
      SPC 1 
*             * PNTR+1+'A' TO PNTR *
SPNTR NOP 
      ADA PNTR
      INA 
      STA PNTR
      JMP SPNTR,I 
* 
.10B  OCT 10
.210B OCT 210 
PBF10 DEF PBUF+10B  ADDRESS: NAM-RECORD COMMON DECLARATION. 
      SPC 1 
HA63  LDA .IL       NAM IS ILLEGAL AFTER START
      JMP HA55+2    TO ERPR 
*        *************************************************
*        * INSR: ADD ENTRY TO THE SYMBOL TABLE, W HACCOU *
*        *  LINKAGE: A = TYPE   B = VALUE ON INPUT       *
*        *   (OUTPUT) SYMP=NO.OF CHARS., SYMN=ENTRY FWA  *
*        *            L    JSB INSR,I                    *
*        *           L+1   ERROR RETN ('SO' OR 'DD'PRNTD)*
*        *           L+2   NORMAL RETN                   *
*        *************************************************
.EN   ASC 3,ENDDSO
INSR  NOP 
      STA FLX1      SAVE TYPE 
      STB NAME+3    SAVE VALUE
      JSB ?SYMK     SYMBOL TABLE LOOKUP 
      JMP INS1      NOT FOUND; GO TO INSERT.
      LDB ENFLG     ALREADY THERE.
      SZB,RSS       IN ENTRY PROC?
      JMP INSY      NO
      ADA ..M1+3    (-4) CHECK SYMBOL TYPE: 
      SSA           IS IT ABS,REL,B.P.,OR COM ? 
      JMP INSC       YES
ENERR LDA .EN       'EN' ERROR: WRONG TYPE, DUPLICATE OR
      JMP INSX       REFERENCE TO EXT-DEFINED SYMBOL. 
INSY  AND .1+6      ISOLATE SYMBOL TYPE.
      LDB FLEX      GET CURRENT FW OF ENTRY.
      SSB,RSS       UNDEFINED ENTRY POINT?
      JMP INSG      NO
      LDB FLX1      YES, GET CURRENT SYMBOL TYPE
      CPB .1+3      EQUATING EXT TO ENT-DEFINED SYMBOL? 
      JMP INSX-1     YES: 'DD' ERROR! 
      ADA ..M1+3    NO, CHECK TYPE: 
      SSA,RSS        ABS,REL,B.P. REL,OR COM? 
      JMP ENERR     INVALID TYPE FOR ENT! 
      LDA FLX1      GET SYMBOL TYPE.
      ALF,ALF       POSITION TO BITS #8-11
      IOR FLEX       INCLUDE ORIGINAL DATA, 
      ELA,CLE,ERA     CLEAR UNDEFINED BIT.
      LDB NAME+3    SET VALUE INTO
      STB VAL0,I     SYMBOL TABLE ENTRY.
      JMP INSEX-1   FINISH PROCESSING.
INSG  CPA .1+6      LITERAL?
      JMP INSR,I    YES, EXIT 
      CPA ...1+3    EXT?
      JMP *+4        YES, TEST
      LDA .EN+1      NO, 'DD' ERROR (MULTIPLE SYMBOL) 
INSX  JSB ERPR
      JMP INSR,I    GET OUT HERE
      CPA FLX1      ARE BOTH EXT'S? 
      JMP INSR,I     YES, FAKE 'DD'EXIT (FOR ARITH. MACRO'S). 
      JMP *-5       GO TO ERROR PRNT
INS1  LDA FLX1
      ALF,ALF 
      ADA NAME      TYPE IN FIRST WORD
      STA NAME       OF ENTRY 
      LDB NAMI
      ADB TEMP+2
      STB VAL0      SET LIMIT 
      LDA ?NDOP     LWA-1 FOR SYMBOL TABLE
      CMA,INA 
      ADA SYMI      TEST FOR SYMBOL TBL 
      ADA TEMP+2     OVERFLOW 
      SSA 
      JMP *+3       NO
      LDA .EN+2     'SO' SYMBOL TABLE OVERFLOW
      JMP INSX      'SO' ERROR
      LDA NAME+3      MOVE VALUE
      STA 1,I       UP
      LDA NAMI
      LDB 0,I       ADD ENTRY  (FROM *+6) 
      STB SYMI,I    TO SYMBOL 
      CPA VAL0
      JMP INS5      GO SET NEW END OF SYMBOL TABLE. 
      INA 
      ISZ SYMI
      JMP *-6 
INS5  LDB SYMI
      STB ?NDSY     SET NEW END OF SYMBOL TABLE.
      JMP INSEX     EXIT. 
INSC  LDA .4000 
      IOR TEMP+4,I
      STA TEMP+4,I  SET ENTRY POINT TYPE
INSEX ISZ INSR      BUMP EXIT POINT FOR A+2 EXIT
      JMP INSR,I    EXIT HERE 
* 
*          ************************************ 
*          * INSERT LITERAL INTO SYMBOL TABLE * 
*          ************************************ 
LITIN NOP 
      LDA ?ICSA     GET LOC'N OF ASCI BUFFER
      STA SYMP+1
      LDA ...1+6    (7) 
      STA LTFLG 
      LDB PLEN
      JSB INSR      INSERT SYMBOL 
      JMP LITIN,I   ERROR RETN. 
      ISZ PLEN      BUMP LITERAL LOC'N CNTR 
      ISZ LITIN 
      JMP LITIN,I   EXIT(NORMAL)
* 
      SKP 
*             *********************** 
*             * PROCESS OCT AND DEC * 
*             *********************** 
HA40  CLB,INB       B=1 
      CPA DEX       CHECK CODE FOR 'DEX'
      ADB .1+1      B=3 IF CODE IS 'DEX'
      STB DCNT      SET LOCN COUNT BUMPER 
      CLA 
      STA CNTB
      STA TEMP
      LDA SCN1+2
      STA PNTR      SET POINTER 
* 
*             * PICK UP AND EXAMINE A CHARACTER * 
* 
HA41  JSB PKUP
      LDB DCNT      GET COUNT BUMPER
      CPA L+4       COMMA?
      JMP HA44       YES, GO SCAN FOR NEXT PARAM. 
      CPB .1+2      IS IT=3(I.E. DEX)?
      JMP HA42       YES
      CPA L+6       PERIOD? 
      JMP HA48       YES, GO TEST FLT. POINT. 
      CPA .E        'E' ? 
      JMP HA48      YES, GO SEE IF DECIMAL PT., ALSO
HA42  CPA BLNK      END OF STATEMENT? 
      JMP HA49      YES 
      JMP HA41
* 
*             * RESET FLT PT FLAG, SKIP BLANKS FOR NEXT CHAR *
HA44  CLA 
      STA TEMP
      JSB BPKUP 
      LDB DCNT      GET 'BUMP' COUNT
      JMP HA48+4
* 
*             * FLT PT TEST FOR NUMBER USING BOTH . AND E * 
HA48  LDA TEMP
      ISZ TEMP
      SZA           E OR '.' COUNTED YET? 
      CLB           YES, SET B=0. 
* 
      ADB CNTB      (HA48+4)
      STB CNTB      ADD TO WORD COUNT 
      JMP HA41
* 
*             * END OF NUMERIC PSEUDO-OP PROCESSOR *
HA49  LDA DCNT
      ADA CNTB      SET A=NO OF LOCNS TO BE USED
      LDB CODE      GET OPCODE I.D. NO. 
      CLE           PREPARE FOR REMAINDER TEST. 
      CPB BYT       BYTE? 
      ERA            YES, DIVIDE BY 2 
      SEZ           ODD BYTE REMAINING? 
      INA            YES, ADD 1 TO WORD COUNT.
      JMP HA3Z      EXIT
*             ********************************
*             * PROCESS ASC (GET VALUE OF N) *
*             ********************************
HA54  LDA ...1+1    (2) 'ASC' INDIC.FOR CHOP
      JSB ?CHOP 
      JMP HA3B      * ERROR * 
      SZA 
      JMP HA55      ERROR-NOT ABS.VAL.
      SZB,RSS       ZERO WORDS? 
      JMP HA55       YES - * ERROR *
      ADB .M29      -29 
      LDA SUMP
      SSB           SKIP IF >28 WORDS 
      JMP HA3Z
HA55  ISZ PLCN      * ERROR EXIT  * 
      LDA .MBLN     'M' ERROR(BAD OPERAND)
      JSB ERPR      TO PRINT ERROR DIAG.
      JMP HA32
* 
*       ********************************************************
*       *                                                      *
*       *  SYMCK: CHECK FOR A VALID SYMBOL                     *
*       *   ENTER: <A> = DON'T CARE.                           *
*       *          <B> = 'PNTR' (RELATIVE POS'N 1RST CHAR.)    *
*       *   RETURN: P+1 - INVALID SYMBOL ('SY' ERROR PRINTED)  *
*       *           P+2 - VALID SYMBOL.                        *
*       *           <REGISTERS MEANINGLESS>                    *
*       *                                                      *
*       ********************************************************
SYMCK NOP 
      STB PNTSV     SAVE 'PNTR' FOR LATER RESTORATION.
      JSB MSYMS     GO TO MEASURE THE SYMBOL. 
      STA SYMSZ     SAVE CHARACTER COUNT. 
      CMA,INA       NEGATE THE COUNT, 
      STA SMCNT      AND SAVE FOR 'SYMTS' LOOP COUNT. 
      LDA TEST      GET CONTINUATOR CHARACTER AND 
      STA SYTST      SAVE FOR LATER RESTORATION.
      LDA PNTSV     GET POINTER TO FIRST CHARACTER. 
      JSB GETC      GO TO GET THE CHARACTER.
      LDB SMCNT     GET NEGATIVE SYMBOL SIZE. 
      JSB SYMTS     GO TO CHECK FOR LEGAL SYMBOL. 
      RSS           ** ERROR: SET RETURN TO P+1.
      ISZ SYMCK     VALID: SET RETURN TO P+2. 
      LDA PNTSV     RESTORE FORMER CONTENTS 
      STA PNTR       OF CHARACTER POINTER.
      LDA SYMSZ     GET SYMBOL MEASUREMENT. 
      JSB SPNTR     GO TO ALIGN 'PNTR' FOR NEXT USE.
      LDA SYTST     RESTORE THE 
      STA TEST       ORIGINAL CONTINUATOR.
      JMP SYMCK,I   RETURN: P+1=ERROR; P+2=O.K. 
* 
PNTSV NOP           TEMP. STORAGE: 'PNTR'.
SYMSZ NOP           TEMP. STORAGE: SYMBOL SIZE. 
SMCNT NOP           TEMP. STORAGE: -SYMSZ.
SYTST NOP           TEMP. STORAGE: 'TEST'.
* 
*             **********************
*             * PROCESS EQU PSEUDO *
*             **********************
HA56  JSB LBCK       CHECK FOR REQUIRED LABEL.
      JSB CHOPI       EVALUATE OPERAND
      JMP HA32        * ERROR * 
      CPA ...1+3      (4) EXT ? 
      LDA ...1+4      (5) SET FOR NON-PNCH EXT
      STA TEMP          NO
      STB TEMP+1
      CLB,INB 
      JSB MSYMS       GO TO MEAS.SYMBOL, SET SYMP/SYMN
      LDA TEMP
      LDB TEMP+1
* 
*             * SEND LABEL TO TABLE * 
      JSB INSR      TO SYMBOL TABLE INSERTION RTN 
      NOP 
      JMP HA32
*             ******************************* 
*             * ORB ORG ORR PROCESSOR JUMPS * 
*             ******************************* 
HA64  JSB INST,I    GO TO SUBROUTINE
      JMP HA32
HA70  LDB LTFLG     GET LITERAL FLAG
      SZB           IS A LITERAL IN THE OPERAND?
      JSB ?ARTL     GO PROCESS THE LITERAL
      LDA  .1+1     A=2 
      JMP  HA3Z 
*             **********************************
*             * PROCESS REPLACEMENT CODE (ENT) *
*             **********************************
HA71  JSB LBCK      CHECK FOR REQUIRED LABEL. 
      JSB CHOPI     EVALUATE OPERAND. 
      JMP HA32      *ERROR* GET NEXT STATEMENT. 
      STB TEMP+1    SAVE OPERAND. 
      CLB,INB       POINT TO 1RST CHAR. OF LABEL. 
      JSB MSYMS     MEASURE SYMBOL,SET SYMP/SYMN
      LDA .12+2     (16B)CODE-REPLACEMENT ENT RECORD. 
      LDB TEMP+1    GET REPLACEMENT CODE VALUE. 
      JSB INSR      INSERT SYMBOL & VALUE IN TABLE. 
      NOP           (ERRORS ARE ALREADY NOTED)
      JMP HA32      GO GET NEXT STATEMENT.
* 
*             * LABEL PRESENCE DETECTOR * 
* 
LBCK  NOP 
      LDA SCN1+3    GET LABEL LENGTH. 
      SZA           LABEL PRESENT ? 
      JMP LBCK,I     YES, RETURN. 
* 
      LDA .LB        NO. GET ASCII ERROR CODE.
      JMP HA55+2    GO TO NOTE THE ERROR. 
.LB   ASC 1,LB
* 
   SKP
*             ************************
*             * PASS 1 END PROCESSOR *
*             ************************
      DEF BUFF
HB00  LDA ?TFLG     GET TABLE OUTPUT FLAG 
      SZA,RSS 
      JMP HB08      TABLE NOT REQUESTED - FINISH PASS 
      LDA HB00-1
      ADA .1+3
      STA HB00-1    SET HB00-1 = L(BUFF+4)
      LDA X         GET FWA OF AVAILABLE MEMORY 
      STA ENTV      TO ENTV 
HBX   LDA ENTV,I    TEST 1ST WORD OF ENTRY
      SZA,RSS       COMPLETED?
      JMP HB08      YES - GO TO FINISH PASS 1 
      JSB MBLNK     SET UP BLANKS IN SYMBOL OUT AREA
* 
*             * GET RELOCATION INDIC. CHAR. 
      LDA  ENTV,I 
      ALF,ALF 
      AND ...1+6    (7) 
      CPA ...1+6    LITERAL ENTRY?
      JMP HBY        YES. 
      CLB 
      CPA .1+5      (6) REPLACEMENT CODE ENTRY ?
      LDB SBLN       YES, GET ASCII S-BLNK. 
      SZB,RSS       SKIP IF INDICATOR PRESENT.
      JSB ?DCOD 
      STB BUFF+3
* 
*             * GET VALUE OF SYMBOL * 
      LDB SUMP       (NO.OF WORDS IN ENTRY) 
      ADB ..M1
      ADB ENTV
      STB ENTV
      LDA 1,I 
      ISZ ENTV
      CLE           SET E = 0 FOR OCTAL CONV. 
      JSB ?BNCN 
* 
*             * STORE ASCI VALUE INTO BUFF
      LDB HB00-1    GET L(BUFF+4) 
      JSB ?V
      LDB FFUB      SET PRINT PARAMETERS
      LDA .12+2     (14)
      JSB ?PRNT     GO TO PRINT 
      JMP HBX       ENTRY DONE. 
HBY   LDA SUMP      NO.WDS IN ENTRY 
      ADA ENTV      + ADDR OF ENTRY 
      STA ENTV      = ADDR OF NEXT ENTRY
      JMP HBX 
SBLN  ASC 1,S 
* 
      SKP 
* 
*             * ERRORS PRINTED *
* 
HB08  JSB ?ENDS     CLOSE OUT THE PASS
      SPC 1 
*              ***********************
*              *  START PASS 2 HERE  *
*              ***********************
      SPC 1 
*             * TEST FOR PUNCH OUTPUT * 
* 
      JMP NMP       YES - GO PUT OUT START OF BIN DK
* 
HB11  JSB ?POSN     POSITION SOURCE FILE TO BEGINNING 
* 
      LDA *+2       PICK UP ENT CODE TO GET ASMB2 
      JMP ?SEGM     GO TO GET NEXT SEGMENT
      ASC 1,2 
* 
   SKP
*             * MOVE ENT NAMES/ADDRESS TO PUNCH BUFFER. 
*             * IF UNDEFINED, PRINT DIAGNOSTIC. 
HNP   NOP 
      LDA .10B      FOR "ENT" TYPE = 10B
      STA ENFLG 
      LDB .2000     FOR WORDS PER ENTRY = 4 
      LDA .M15      FOR 15 ENTRIES/RECORD 
      JSB ENEXT 
      CLA 
      STA ENFLG 
      JMP HNP,I 
                                                                                                                                                                