ASMB,R,L,C
* 
*     NAME:   ASMB3 
*     SOURCE: 92067-18073 
*     RELOC:  92067-16073 
*     PGMR:   C.C.H.,S.P.K. 
*     MOD 77-01-30 ADDED DEY OP CODE EAS
*     MODIFIED BY VERN MCGEORGE 22MAY79 TO RELEASE LOD & GEN  INSTR.
*  ***************************************************************
*  * (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 ASMB3 92067-16073 * (C) HEWLETT-PACKARD COMPANY 1978. 
      NAM ASMB3,5,99 92067-16073 REV.1940 790531
      ENT ASMB3,?INS? 
      EXT RWN.C,C.SOR 
      EXT ?BPKU,?RSTA,?PKUP,?SYMK,?CHOP,?ENDS 
      EXT ?MSYS,?ASMB,?SEGM,EXEC,?ERPR,?X 
      EXT ?MOVE,?LFLG,?TFLG,?CHPI 
      EXT ?V,?ASM1,?MESX,?BNCN,?PRNT,?NDOP,?FMPE
      EXT ?NDSY,?OPER,?OPLK 
      SPC 2 
      EXT ?TEMP,?NAMI,?NAME,?SUMP,?CNTB,?CODE,?INST 
      EXT ?PLCN,?PNTR,?SCN1,?SYMI,?SYMP,?ENTV,?IOBF 
      EXT ?BUFF,?PBUF 
      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
.M1   DEC -1
.M2   DEC -2
.M3   DEC -3
.M4   DEC -4
.M5   DEC -5
L     OCT 50,51,52,53,54,55,56
.9    DEC 9 
.29   DEC 29
.M8   DEC -8
.M29  DEC -29 
BLNK  OCT 40        =40B(LOWER BLANK) 
.IL   ASC 1,IL
.MBLN ASC 1,M 
.NO   ASC 1,NO
BLNS  ASC 1,
.E    OCT 105 
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' 
CNTB  EQU ?CNTB 
CODE  EQU ?CODE    OPCODE TYPE(FROM OPTABLE)
INST  EQU ?INST    OPCODE FORMAT
PLCN  EQU ?PLCN    PROGRAM LOCATION COUNTER 
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
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 
BPKUP EQU ?BPKU 
CHOPI EQU ?CHPI 
ERPR  EQU ?ERPR 
LFLAG EQU ?LFLG 
MOVE  EQU ?MOVE 
MSYMS EQU ?MSYS 
PKUP  EQU ?PKUP 
RSTA  EQU ?RSTA 
X     EQU ?X
      SPC 3 
ASMB3 LDA FFUB      REMOVE INDIRECTS
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA BIT 15 SET? 
      JMP *-2       YES, REMOVE ONE LEVEL OF INDIRECTS
      STA FFUB      NO
ASMBA JSB RSTA
      LDA CODE
      CPA .15       '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 ASMBA 
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. 
      CPA B33       GEN INFO RECORD?
      JMP HA63       YES * ERROR *
      CPA B34       LOADER INFO RECORD? 
      JMP HA63       YES * ERROR *
      ADA .M3       -3
      SSA 
      JMP HA64      ORR OR ORG FOUND
      CPA .12B      NAM?
      JMP HA63       YES, ERROR 
      ADA .M3       (-3)
      SSA           'COM','ENT' OR 'EXT' ?
      JMP HA63       YES - ERROR
      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        IGNORE-PASS #1.
      JMP HA32       IGNORE-PASS #1.
      CPA .14       (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 DEY       IF CODE = DEY THEN
      JMP HA40      GO TO CONSTANT PROCESSING 
      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 .26B      INTEGER ARITH(HARDWARE)?
      JMP HA70       YES....
      CPA .6        (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
B33   OCT 33
B34   OCT 34
.M10  DEC -10 
.100B OCT 100 
M100B OCT -100
DEX   OCT 25        OP TYPE FOR 'DEX' 
DEY   OCT 44        OP TYPE FOR 'DEY' 
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 TEMP+1    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 TEMP+1
      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 .2        B=3 IF CODE IS 'DEX'
      CPA DEY       IF CODE = DEY THEN
      LDB .4        B := 4 & FOUR WORD CONSTANTS
      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      (HA40+4 WAS HA41) 
      LDB TEMP+5    GET COUNT BUMPER
      CPA L+4       COMMA?
      JMP HA44       YES, GO SCAN FOR NEXT PARAM. 
      ADB .M2       IF (TYPE=3) OR (TYPE=4) THEN
      SSB,RSS         GO CONTINUE PROCESSING
      JMP HA42       YES
      LDB TEMP+5
      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 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. 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 .2        (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 .4        (4) EXT ? 
      LDA .5        (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 .2        A=2 
      JMP HA3Z
* 
      SKP 
*             ************************
*             * PASS 1 END PROCESSOR *
*             ************************
      NOP 
HB00  LDA ?TFLG     GET TABLE OUTPUT FLAG 
      SZA,RSS 
      JMP HB08      TABLE NOT REQUESTED - FINISH PASS 
      LDA FFUB
      ADA .4
      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 .7        (7) FOR NO.OF WRDS. 
      STA SUMP
      CPA .2        (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 .14       (14)
      JSB ?PRNT     GO TO PRINT 
      JMP HBX       ENTRY DONE. 
* 
.PASS ASC 2,PASS
* 
      SKP 
*             * ERRORS PRINTED *
HB08  JSB ?ENDS     GO TO END PASS PROCESSOR
*             ********************************
*             *  START 'ABSOLUTE' PASS 2 HERE*
*             ********************************
      SPC 1 
HB11  JSB RWN.C     REWIND SOURCE FILE
      DEF C.SOR     INPUT FILE FCB
      JMP HBERR 
      LDA .4        PICK UP ENT CODE TO GET ASMB5 
      JMP ?SEGM     GO TO LOADER FOR NEXT SEGMENT 
* 
HBERR CCB           INPUT FILE ERROR
      JMP ?FMPE     FMP ERROR 
* 
.2000 OCT 2000
FFUB  DEF BUFF
* 
      SKP 
*         ********************************************************
*         * PROCESS EXTENDED INSTRUCTION SET AND USER MICROCODES *
*         ********************************************************
* 
XMIC  STA B         CODE-100B NOW IN B
      LDA .2        SET A=2 
      CPB .12       TYPE 114B?
      INA           YES, A=3
      CPB .13       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 .7
      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 .M3 
      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 .2        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 .M3       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  OCT 21        (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 
********************************************************************
********** CHANGE LOC'N. Z IN ASMB IF THIS PROGS. LWA > 1550B ******
********************************************************************
      SPC 1 
?INS? EQU INSR
      SPC 1 
      END ASMB3 
                                                                                    