ASMB,R,L,C
* 
*     NAME:   ASMB1 
*     SOURCE: 92067-18071 
*     RELOC:  92067-16071 
*     PGMR:   C.C.H.,S.P.K. 
*     MOD 77-01-30 ADDED DEY INST EAS 
*     MODIFIED BY VERN MCGEORGE 22MAY79 TO RELEASE LOD & GEN INSTR. 
*     MODIFIED BY VERN MCGEORGE 13JUL79 TO REPORT "SY" ERROR IN NAM 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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.       *
*  ***************************************************************
      HED * RTE ASMB1 92067-16071 * (C) HEWLETT-PACKARD COMPANY 1978. 
* 
      NAM ASMB1,5,99 92067-16071 REV.1940 790713
      ENT ASMB1 
      SPC 1 
      EXT RWN.C,C.SOR 
      SPC 1 
      ENT ?LITI,?CMQ,?INSR,?HA3Z,?ENP,?EXP,?EMP 
      EXT ?RSTA,?ERPR,?MOVE,?CHPI,?OPER,?PLIT,?ORGS 
      EXT ?ASCN,?BPKU,?MSYM,?PKUP,?SYMK,?CHOP,?ENDS 
      EXT ?MSYS,?SEGM,?PNCH,?V,?X,?T
      EXT ?ICSA,?TFLG,?LTFL,?CNTR 
      EXT ?ARTL,?ASM1,?ORRP,?BNCN,?DCOD,?MESX,?PRNT 
      EXT ?LABE 
      EXT ?OPLK,?NDOP,?NDSY,?ENER,?PRPG 
      EXT ?BPSV,?GETA,?GETC,?SYMT,?FMPE 
      SPC 2 
      EXT ?NAMI,?NAME,?SUMP,?FLEX,?CNTB,?CODE,?INST 
      EXT ?LAST,?PEEK,?PLCN,?PLEN,?PNTR,?SCN1,?SYMI 
      EXT ?SYMP,?TEST,?ENT.,?ENTC,?ENTV,?IOBF,?BUFF 
      EXT ?PBUF,?TEMP,FUBP,FUBP2
      SUP 
.1    DEC 1 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.5    DEC 5 
.6    DEC 6 
.7    DEC 7 
.12   DEC 12
.13   DEC 13
.14   DEC 14
.15   DEC 15
.16   DEC 16
.17   DEC 17
.M1   DEC -1
.M2   DEC -2
L     OCT 50,51,52,53,54,55,56
.9    DEC 9 
.29   DEC 29
.M8   DEC -8
.M15  DEC -15 
.M29  DEC -29 
BLNK  OCT 40        =40B(LOWER BLANK) 
.IL   ASC 1,IL
.MBLN ASC 1,M 
.NO   ASC 1,NO
BLNS  ASC 1,
BIT15 OCT 100000
.E    OCT 105 
.B    OCT 102 
RC    ASC 5,E R B C X 
TEMP  EQU ?TEMP 
NAMI  EQU ?NAMI     LOC'N FOR TEMP SYMBOL STORAGE 
NAME  EQU ?NAME     FOR USE BY 'OPLK' 
SUMP  EQU ?SUMP     RUNNING SUM FOR 'CHOP'
FLEX  EQU ?FLEX     'ASCN'
CNTB  EQU ?CNTB 
CODE  EQU ?CODE     OPCODE TYPE(FROM OPTABLE) 
INST  EQU ?INST     OPCODE FORMAT 
LAST  EQU ?LAST 
PEEK  EQU ?PEEK     LAST CHAR PICKED UP 
PLCN  EQU ?PLCN     PROGRAM LOCATION COUNTER
PLEN  EQU ?PLEN     LIT LENGTH PASS 1/LIT ORG PASS 2
PNTR  EQU ?PNTR     POINTS AT LAST OR CURRENT CHAR. 
SCN1  EQU ?SCN1     STATE LNG/OPCODE/OPERAND/LABEL(4) 
SYMI  EQU ?SYMI     ADDR CNTR FOR SYMBOL TBL (SYMK) 
SYMP  EQU ?SYMP     SYMBOL LNG/ AND LOC'N 
TEST  EQU ?TEST     TEST CHARACTER
ENT.  EQU ?ENT. 
ENTC  EQU ?ENTC 
ENTV  EQU ?ENTV 
*          * I/O STATEMENT BUFFER * 
IOBF  EQU ?IOBF     50 WORDS + END OF STATEMENT BUFF
*      *(INPUT BUFFER 'BUFF' STARTS IN 11TH WORD)*
BUFF EQU ?BUFF
PBUF  EQU ?PBUF     SAVES THE 'NAM' RECORD INFO.
      OCT 0         EXTRA WORD FOR BUFFER OVERFLOW. 
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 
T     EQU ?T
X     EQU ?X
* 
ICNTR DEC -6
ATBL  DEF *+1 
PBF9  DEF PBUF+9
CSAD  DEF PBUF+3    POINTS AT PUNCH BUFFER
DSTAD DEF PBUF+17   ADDR: NAM EXTENSION BUFFER
PBF8  DEF PBUF+8    ADDRESS: NAM-RECORD COMMON DECLARATION
SNOB  DEF IOBF+5    BUFFER ORIGIN 
FFUB  DEF BUFF
      SPC 1 
* 
ASMB1 LDA ATBL,I    GET AN INDIRECT ADDRESS 
      RSS 
      LDA A,I       REMOVE ONE LEVEL OF INDIRECT
      RAL,CLE,SLA,ERA   BIT 15 SET? 
      JMP *-2       YES 
      STA ATBL,I    RESTORE DIRECT ADDRESS
      ISZ ATBL
      ISZ ICNTR     ALL ADDRESSES DONE? 
      JMP ASMB1     NO
* 
ASMBA JSB RSTA
      LDA CODE
      CPA .15       'HED' STATE?
      JMP IXH       YES 
      STA ?ASM1     CLEAR 'CS' AND 'INIT' FLAGS 
      CPA .13       (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 ASMBA 
* 
* 
*             * PROCESS NAME FOR BINARY RECORD *
* 
.SY   ASC 1,SY
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 A         CHECK FOR NAM TOO LONG
      CMB,INB 
      ADB .5
      SSB,RSS       ERR < 0 / OK >= 0 
      JMP HI13        OK NAM <= 5 CHARACTERS
      LDA .SY         NOT OK NAM > 5 CHARACTERS 
      JSB ERPR        REPORT ERROR
      LDA PNSAV       RESTORE A REG (NESSESSARY ?)
* 
HI13  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
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 .M3       (-3)
      SSA           ORR/ORB/ORG ? 
      JMP HA64       YES, ROUTE TO PROCESSOR. 
      CPA .12B      NAM?
      JMP HA63       YES, ERROR 
      ADA .M3       (-3)
      SSA           'COM','ENT','EXT' OR 'EMA' ?
      JMP INST,I    JUMP TO ROUTINE DESIGNATED IN INST
      CPA .5        'EQU'?
      JMP HA56      TO EQU
      CPA .9        (11B) HED?
      JMP HA32       IGNORE-PASS #1.
      CPA .12       (14B) SKP?
      JMP HA32       IGNORE-PASS #1.
      CPA .13       (15B) SPC?
      JMP HA32       IGNORE-PASS #1.
      CPA .14       (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 DEY       IF INST = DEY THEN
      JMP HA40      GO PROCESS IT 
      CPA BYT       IS IT A 'BYT'?
      JMP HA40       YES, GO PROCESS. 
      CPA .29       REP?
      JMP HA64      YES 
      CPA .7        (7) 
      JMP HA54      TO ASC
      CPA .33B      (33 OCTAL) GEN INFORMATION RECORD 
      JMP GENR       YES, USE GEN PROCESSOR 
      CPA .34B      (34 OCTAL) LOADER INFO RECORD 
      JMP LODR       YES, USE LOD PROCESSOR 
      CPA .26B      INTEGER ARITH(HARDWARE)?
      JMP HA70       YES....
      CPA .6        (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 .4        (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
* 
.M3   DEC -3
.12B  OCT 12
.32B  OCT 32
.33B  OCT 33
.34B  OCT 34
.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' 
DEY   OCT 44        OP TYPE FOR 'DEY' 
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 PBF8,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 PBF8,I    BUMP LENGTH OF OOMMON 
      STA PBF8,I
* 
*            * INSERT 'COMMON' SYMBOL INTO TABLE *
HM3   LDA .3        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 PBF8,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 .4        (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 
* 
*     PROCESS 'EMA' DECLARATION 
EMP   CLA,INA       SET EMA FLAG
      STA EMFLG 
      LDA EMCNT     COUNTER FOR # OF EMA INSTR. 
      SZA           AN EMA INSTR ALREADY ENCOUNTERED? 
      JMP EMAIL     YES, THEN ERROR 
      LDA SCN1+2    SET POINTER TO FIRST OPCODE'S 
      STA PNTR      RELATIVE CHARACTER POSITION 
      LDA .2        PRETEND IT IS AN ASC INSTRUCTION
      JSB CHOP      GET VALUE OF FIRST OPERAND
      JMP HA32      ERROR RETURN
      SZA           IS VALUE ABSOLUTE?
      JMP EMAOP     NO THEN OPERAND ERROR 
      LDA SUMP      SAVE VALUE OF FIRST OPERAND 
      STA EMASZ     WHICH IS EMA SIZE 
* 
      JSB PKUP      PICKUP NEXT CHAR
      CPA L+4       IS IT A COMMA?
      RSS           YES 
      JMP EMAOP     NO, THEN ERROR
      JSB BPKUP     SKIP OVER ANY BLANKS
      STB SCN1+2    SET OPERAND POINTER AT 2ND PARAMETER
      CLA           SET A=0 FOR NO COMMA
      JSB CHOP      GET VALUE OF THE MSEG SIZE
      JMP HA32      ERROR RETURN
      SZA           ABSOLUTE VALUE? 
      JMP EMAOP     NO, THEN ERROR-BAD OPERAND
      LDA SUMP      YES, GET VALUE
      STA MSGSZ     SAVE THE MAPPING SEGMENT SIZE 
*    TEST FOR VALIDITY OF EMA SIZE AND MSEG SIZE
      LDA EMASZ     GET EMA SIZE
      SSA           -VE?
      JSB EMAOP     YES, THEN OPERAND ERROR 
      CMA,INA       NEGATE EMA SIZE 
      ADA .1023     MUST BE LESS THAN 1024
      SSA           EMA SIZE LESS THAN 1024?
      JMP EMAOP     NO THEN OPERALND ERROR
      LDA MSGSZ     NO, GET MSEG SIZE 
      SSA           -VE?
      JMP EMAOP     YES, THEN OPERAND ERROR 
      CMA,INA       NEGATE MSEG SIZE
      ADA .31 
      SSA           IS IT LESS THAN 32? 
      JMP EMAOP     NO, THEN ERROR
*     BOTH OPERANDS ARE VALID ,  TEST FOR LABEL 
      JSB LBCK      LABEL PRESENT?
      STA SYMP      YES, SET CHARACTER COUNT
      LDB FFUB      GET BUFFER ADDRESS
      STB SYMP+1    SET LABEL ADDRESS 
      LDA .4        EXT INDICATOR 
      LDB CNTR      ORDINAL # - VALUE 
      JSB INSR      INSERT EMA LABEL INTO SYMBOL TABLE
      JMP HA32      ERROR EXIT
      ISZ CNTR      INCREAMENT ORDINAL# 
      CLA 
      STA EMFLG     CLEAR EM FLAG 
      INA           SET EMA COUNT TO INDICATE AN EMA
      STA EMCNT     INSTRUCTION HAS ALREADY BEEN ENCOUNTERED
      JMP HA32      READ NEXT STATEMENT 
*     PRINT EMA ERRORS
EMAOP JSB OPERR     OPERAND ERROR 
      JMP HA32      READ NEXT STATEMENT 
EMAIL LDA .IL       'IL' ILLEGAL INSTR ERROR
      JSB ERPR      PRINT ERROR MESSAGE 
      JMP HA32      READ NEXT STATEMENT 
* 
EMASZ NOP 
MSGSZ NOP 
EMFLG NOP 
EMCNT NOP 
.31   DEC 31
.1023 DEC 1023
* 
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 
      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 .M4       (-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 .7        ISOLATE SYMBOL TYPE.
      LDB FLEX      GET CURRENT FW OF ENTRY.
      SSB,RSS       UNDEFINED ENTRY POINT?
      JMP INSG      NO
      BLF           IS THE 'E' BIT SET? 
      SSB,RSS 
      JMP INSG      NO, THEN AN EMA LABEL 
      LDB FLX1      YES, GET CURRENT SYMBOL TYPE
      CPB .4        EQUATING EXT TO ENT-DEFINED SYMBOL? 
      JMP INSX-1     YES: 'DD' ERROR! 
      ADA .M4       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 TEMP+1,I   SYMBOL TABLE ENTRY.
      JMP INSEX-1   FINISH PROCESSING.
INSG  CPA .7        LITERAL?
      JMP INSR,I    YES, EXIT 
      CPA .4        EXT?
      JMP INSZ       YES, TEST
INSE  LDA .EN+1      NO, 'DD' ERROR (MULTIPLE SYMBOL) 
INSX  JSB ERPR
      JMP INSR,I    GET OUT HERE
INSZ  LDB FLEX      EMA?
      SSB           IS THE 'U' BIT SET? 
      JMP INSE      YES, ERROR
      LDB EMFLG     IN EMA PROCESS? 
      SZB 
      JMP INSE      YES, ERROR
      CPA FLX1      ARE BOTH EXT'S? 
      JMP INSR,I     YES, FAKE 'DD'EXIT (FOR ARITH. MACRO'S). 
      JMP INSE      GO TO ERROR PRNT
INS1  LDA FLX1
      ALF,ALF 
      ADA NAME      TYPE IN FIRST WORD
      LDB EMFLG     IN EMA PROCESS? 
      SZB 
      IOR BIT15     YES, SET 'U' BIT TO INIDICATE EMA LABEL 
      STA NAME       OF ENTRY 
      LDB NAMI
      ADB TEMP+2
      STB TEMP+1    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 TEMP+1
      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 
.M4   DEC -4
* 
*          ************************************ 
*          * INSERT LITERAL INTO SYMBOL TABLE * 
*          ************************************ 
LITIN NOP 
      LDA ?ICSA     GET LOC'N OF ASCI BUFFER
      STA SYMP+1
      LDA .7        (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 .2        B=3 IF CODE IS 'DEX'
      CPA DEY       IF CODE = DEY THEN
      LDB .4        SET WORD COUNT = 4
      STB TEMP+5     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 TEMP+5     GET COUNT BUMPER 
      CPA L+4       COMMA?
      JMP HA44       YES, GO SCAN FOR NEXT PARAM. 
      ADB .M2       IF (TYPE=DEX) OR (TYPE=DEY) THEN
      SSB,RSS 
      JMP HA42       GO CONTINUE SCAN 
      LDB TEMP+5
      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 TEMP+5     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 TEMP+5
      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 .2        (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  * 
INFER 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 * 
      STB TEMP+1
      CPA .4          (4) EXT ? 
      RSS 
      JMP HA57
      LDA .5          (5) SET FOR NON-PNCH EXT
      LDB FLEX      IS THIS AN EMA? 
      SSB,RSS 
      JMP HA57      NO
      CLB,INB       YES,THEN SET EMA FLAG 
      STB EMFLG 
HA57  STA TEMP          NO
      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 
      CLA           CLEAR EMA FLAG
      STA EMFLG 
      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  .2       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 .14       (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.
                                                                                                                                                                                                                    