ASMB,R,L,C
      HED ** RTE-M ASMB - SEGMENT 3 **
* 
* 
*     9/29/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  : ASMB3 
* SOURCE: 92064-18130 
* RELOC : 92064-16043 
* PRGMR : C.H., H.C., S.K.
* 
      NAM ASMB3,5,99 92064-16043 REV.1650 761001
      SUP 
* 
      ENT ASMB3,?INS? 
* 
      EXT ?BPKU,?RSTA,?PKUP,?SYMK,?CHOP,?ENDS 
      EXT ?MSYS,?ASMB,?SEGM,?ERPR,?X
      EXT ?MOVE,?TFLG,?CHPI 
      EXT ?V,?ASM1,?BNCN,?PRNT,?NDOP
      EXT ?NDSY,?OPER,?OPLK,?POSN 
* 
      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 
.7    EQU TEMP+13 
.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 
.M29  EQU #+45B 
BLNK  EQU #+46B     =40B(LOWER BLANK) 
.IL   EQU #+47B 
.MBLN EQU #+50B 
.NO   EQU #+51B 
BLNS  EQU #+55B 
.E    EQU #+61B 
NAMI  EQU #+71B    LOC'N FOR TEMP SYMBOL STORAGE
NAME  EQU #+72B    FOR USE BY 'OPLK'
SUMP  EQU #+100B   RUNNING SUM FOR 'CHOP' 
CNTB  EQU #+106B
CODE  EQU #+107B   OPCODE TYPE(FROM OPTABLE)
INST  EQU #+113B   OPCODE FORMAT
PLCN  EQU #+117B   PROGRAM LOCATION COUNTER 
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
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 
BPKUP EQU ?BPKU 
CHOPI EQU ?CHPI 
ERPR  EQU ?ERPR 
MOVE  EQU ?MOVE 
MSYMS EQU ?MSYS 
PKUP  EQU ?PKUP 
RSTA  EQU ?RSTA 
X     EQU ?X
      SPC 3 
* 
* 
ASMB3 JSB RSTA
      LDA CODE
      CPA .12+3     'HED' STATE?
      JMP IXH        YES
      STA ?ASM1     CLEAR 'CS' AND 'INIT' FLAGS 
      LDB .2000 
      STB PLCN      INITIALIZE PROGRAM COUNTER
      CPA .1        IS OPCODE AN ORG? 
      JMP HI12
      LDA .NO       'NO'= NO ORG STATEMENT
      JSB ERPR
      JMP HA32+1
IXH   JSB INST,I    GO TO HEDSB 
      JMP ASMB3 
HI12  JSB ?CHOP     PROCESS AN ORIGIN VALUE 
      JMP HA32+1    ERROR RETURN
      STB PLCN      SET INITIAL COUNTER VALUE 
      JMP HA32      GO TO START PASS 1
* 
      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 THE 'END PROCESSOR. 
      CPA BLNK      (40B) SUP/UNS?
      JMP HA32       IGNORE-PASS #1.
      CPA .32B      REPLACEMENT CODE ?
      JMP HA63       YES * ERROR *
      CPA .100B     USER MICROCODE ('MIC')? 
      JMP MIC        YES, GO PROCESS. 
      ADA ..M1+2    -3
      SSA 
      JMP HA64      ORR OR ORG FOUND
      CPA .12B      NAM?
      JMP HA63       YES, ERROR 
      ADA ..M1+2    (-3)
      SSA           'COM','ENT' OR 'EXT' ?
      JMP HA63       YES - ERROR
      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      IGNORE-PASS #1.
      JMP HA32       IGNORE-PASS #1.
      CPA .12+2     (16B) LST/UNL?
      JMP HA32       IGNORE-PASS #1.
* 
*             * TEST FOR LABEL FIELD
      LDA SCN1+3    GET LABEL LENGTH
      SZA,RSS       LABEL PRESENT ? 
      JMP HALB       NO, DONE 
      STA SYMP      SET CHAR COUNT
      LDB FFUB
      STB SYMP+1    SET LABEL ADDR. 
      CLA           SET A=0 FOR ABSOLUTE VALUE
      LDB PLCN
      JSB INSR      INSERT LABEL INTO SYMBOL TABLE
      NOP           ERROR EXIT
HALB  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 HA63       YES, ERROR 
      ADA .M10      -10 
      SSA           OCT OR DEC? 
      JMP HA40       YES. 
      SZA,RSS       BSS?
      JMP HA3M       TO BSS PROC. 
      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      (HA3B+1)
      STA PLCN
      JMP HA32
.26B  OCT 26        FOR HARDWARE ARITHMETIC 
.32B  OCT 32        RPL CODE. 
       SPC 1
*             * PROCESS BSS * 
HA3M  JSB CHOPI     EVAL.OPERAND
      JMP HA32      ERROR 
      LDA 1         B TO A
      JMP HA3Z
* 
.12B  OCT 12
.M10  DEC -10 
.100B OCT 100 
M100B OCT -100
DEX   OCT 25        OP TYPE FOR 'DEX' 
BYT   OCT 43        OPCODE I.D. NO. FOR 'BYT' 
* 
      SKP 
*        *************************************************
*        * INSR: ADD ENTRY TO THE SYMBOL TABLE, W HACCOU *
*        *  LINKAGE:            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                   *
*        *************************************************
.DD   ASC 2,DDSO
INSR  NOP 
      STB NAME+3    SAVE VALUE
      JSB ?SYMK     SYMBOL TABLE LOOKUP 
      JMP INS1
      LDA .DD       NO, 'DD' ERROR (MULTIPLE SYMBOL)
INSX  JSB ERPR
      JMP INSR,I    GET OUT HERE
INS1  LDB NAMI
      ADB TEMP+2
      STB VAL0      SET LIMIT 
      LDA ?NDOP     GET LWA AVAIL. MEM. 
      CMA,INA 
      ADA SYMI      TEST FOR SYMBOL TBL 
      ADA TEMP+2    OVERFLOW
      SSA 
      JMP *+3       NO
      LDA .DD+1     'SO' SYMBOL TABLE OVERFLOW
      JMP INSX       GO TO PRINT ERROR MESSAGE. 
      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 INSEX     EXIT
      INA 
      ISZ SYMI
      JMP *-6 
INSEX LDB SYMI
      STB ?NDSY     SET NEW END OF SYMBOL TABLE.
      ISZ INSR      BUMP EXIT POINT FOR A+2 EXIT
      JMP INSR,I    EXIT HERE 
HA63  LDA .IL       ILLEGAL OPCODE: ABS. ASSEMBLIES ! 
      JMP HA55+2    TO ERPR 
* 
      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      (HA40+4 WAS HA41) 
      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
      CPA .E        'E' ? 
      JMP HA48
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. NUMBER. 
      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
      SKP 
*             ********************************
*             * 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 WORD COUNT ? 
      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
*             **********************
*             * PROCESS EQU PSEUDO *
*             **********************
HA56  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
*         ******************************
*         *     ORG ORR REP PROC.JUMPS *
*         ******************************
HA64  JSB INST,I    GO TO SUBROUTINE
      JMP HA32
HA70  LDA .1+1      A=2 
      JMP HA3Z
* 
      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 
      LDB ENTV      GET TBL ENTRY LOCATION
      CMB,INB 
*             * SEND ADDR. TO MOVE LINKAGE
      STB HMOV5 
*             * MOVE BLANKS TO BUFFER 
      LDB BLNS
      STB BUFF
      STB BUFF+1
      STB BUFF+2
      STB BUFF+3
      LDB FFUB      ADDR. OF BUFF TO B
      SPC 1 
*             * MOVE CHARS FROM SYMBOL TABLE *
      ALF 
      AND ...1+6    (7) FOR NO.OF WRDS. 
      STA SUMP
      CPA ...1+1    (2) 
      CLA 
      IOR ...1
      JSB MOVE
HMOV5 NOP 
* 
*             * 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. 
* 
* 
      SKP 
*             * ERRORS PRINTED *
HB08  JSB ?ENDS     GO TO END PASS PROCESSOR
      SPC 1 
*             ********************************
*             * START 'ABSOLUTE' PASS 2 HERE *
*             ********************************
      SPC 1 
* 
      JSB ?POSN     POSITION SOURCE FILE TO BEGINNING 
* 
      LDA *+2       PICK UP ENT CODE TO GET ASMB5 
      JMP ?SEGM     GO TO LOADER FOR NEXT SEGMENT 
      ASC 1,4 
* 
.2000 OCT 2000
FFUB  DEF BUFF
* 
      SKP 
*         ********************************************************
*         * PROCESS EXTENDED INSTRUCTION SET AND USER MICROCODES *
*         ********************************************************
* 
XMIC  STA B         CODE-100B NOW IN B
      LDA .1+1      SET A=2 
      CPB .12       TYPE 114B?
      INA           YES, A=3
      CPB .12+1     TYPE 115B?
      INA           YES, A=3
      ADB .M8 
      SSB,RSS       USER CODE? (101B THRU 107B) 
      JMP HA3Z      NO, USE VALUE IN A FOR PLCN BUMP
      ADB .1+6
      ADA B         A = MACRO INSTRUCTION COUNT.
      JMP HA3Z
*         **********************************************************
*         * PROCESS A 'MIC' PSEUDO OPERATION (I.E. USER MICROCODE) *
*         * FORMAT:  MIC MMM,CCC,N                                 *
*         *  WHERE                                                 *
*         *   MMM = USER DESIGNATED MNEMONIC (ALL ALPHABETIC)      *
*         *   CCC = USER DESIGNATED FUNCTION CODE (0 TO 177777B)   *
*         *    N  = NUMBER OF PARAMETERS IN USER OPERAND           *
*         **********************************************************
* 
MIC   LDA SCN1+2
      STA PNTR      MOVE POINTER TO OPERAND 
      JSB ?OPLK     CHECK FOR DUPLICATE MNEMONIC
      JMP MIC01     GOOD - MNEMONIC NOT FOUND 
MICOP JSB ?OPER     ERROR IN OPERAND ('M' TERM) 
      STA CODE      -SET CODE NOT = 100B
      JMP HA32      GO GET NEXT INSTRUCTION 
* 
MIC01 LDA TEMP+5    * * SAVE USER MNEMONIC HERE * * 
      STA SCODE     SAVE 1ST 2 CHARS. 
      LDA TEMP+6
      STA MTEMP     SAVE LAST CHARACTER 
* 
*         * TEST 3 CHARACTERS FOR ALPHA ONLY MNEMONIC * 
      LDA ..M1+2
      STA TEMP
MIC04 JSB PKUP      PICK UP A CHARACTER 
      CMA,INA 
      ADA .100B 
      SSA,RSS       LESS THAN LETTER A? 
      JMP MICOP     YES - NON-ALPHA 
      ADA .32B
      SSA           GREATER THAN LETTER Z?
      JMP MICOP     YES - NON-ALPHA 
      ISZ TEMP      LAST CHARACTER TESTED?
      JMP MIC04     NO - GO GET NEXT ONE
      LDA .21B
      STA CODE      SET CODE 'ABS' TO FOOL CHOP RTN.
      LDA .1+1      SET FOR COMMA STOP IN CHOP
      JSB VMIC      PICK UP MICRO CODE AND TEST PART
      STA INST      SAVE USER FUNCTION CODE 
* 
      CLA           SET FOR NO COMMA STOP IN CHOP 
      JSB VMIC      GET VALUE OF N
      SSB           IS VALUE OF N POSITIVE
      JMP MICOP     NO - ERROR
      ADB .M8 
      SSB,RSS       IS N GREATER THAN 7?
      JMP MICOP     YES - ERROR 
      ADA .100B 
      CPA .100B     WILL CODE BE 100B?
      LDA .30B      YES - NO PARAMS. THUS IT'S =30B 
      STA CODE      SAVE CODE FOR OPTABLE ENTRY 
* 
*         ****************************************************
*         * ENTER NEW OPCODE INTO SUPPLEMENTARY OPCODE TABLE *
*         ****************************************************
* 
      LDA ?NDOP     GET ORG OF SUPPL. OPCODE TABLE
      ADA ..M1+2    SET NEW ORIGIN
      STA B 
      CMB,INB       START TEST FOR OVERFLOW 
      ADB ?NDSY 
      SSB           OPTABLE OVERFLOW? 
      JMP MIC10     NO
      LDA .SO       YES - PRINT 'SO' ERROR
      JSB ERPR
      JMP HA32      GO FOR NEXT STATEMENT 
* 
MIC10 STA ?NDOP     SET NEW OPTABLE ORIGIN
      LDB SCODE 
      STB A,I       STORE 1ST 2 CHARS.
      INA 
      LDB MTEMP     GET 3RD CHAR. 
      ADB CODE      INSERT CODE 
      STB A,I       STORE IT INTO THE TABLE 
      INA 
      LDB INST
      STB A,I       STORE THE MICROCODE (FUNCTION)
      JMP HA32      GO FOR NEXT STATEMENT 
* 
      SKP 
*         **********************************************************
*         * VMIC CHECKS FOR COMMAS, NUMERICS, AND TYPE OF OUTPUT   *
*         *  FROM OPERAND PROCESSOR (MICROCODE AND # OF PARAMETERS *
*         **********************************************************
* 
VMIC  NOP 
      STA CTM       SAVE CHOP INPUT PARAMETER 
      JSB PKUP      PICK UP A CHAR. 
      CPA L+4       IS IT A COMMA?
      RSS           YES 
      JMP MICOP     NO - ERROR
      JSB BPKUP     SKIP OVER FOLLOWING BLANKS
      STB SCN1+2    SET OPERAND PNTR TO NEXT PARAM. 
      LDA CTM 
      JSB ?CHOP     EVALUATE THE PARAMETER
      JMP HA32      ERROR - GO TO NEXT SOURCE STATE.
      SZA           ABSOLUTE VALUE? 
      JMP MICOP     ERROR - NO
      LDA SUMP      VALUE IN BOTH A AND B ON EXIT 
      JMP VMIC,I    RETURN
* 
CTM   NOP           SAVE A FOR CHOP ENTRY 
.21B  EQU .12+5     (21B) 
.30B  OCT 30
SCODE NOP           SAVE 1ST 2 NMEMONIC CHARS.
MTEMP NOP           SAVE 3RD CHAR.
A     EQU 0 
B     EQU 1 
.SO   ASC 1,SO
* 
      SPC 1 
?INS? EQU INSR
      SPC 1 
      END ASMB3 
                            