ASMB,R,L,C          EIG FOR HP2100 BY E.J.W.  JULY 1975 
*                                   MODIFIED BY G.L.M         OCT  1977 
* 
*     EXTENDED INSTRUCTION GROUP OF THE 21MX SERIES 
*     EMULATED ON THE 2100 INSTRUCTION SET
*                   BY EUGENE J. WONG 
*                   JULY 1975 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.        * 
*  **************************************************************** 
* 
      NAM .CBT,7  92064-16081  REV.1940  790717 
      ENT .CBT,.LBT,.MBT,.SBT,.SFB
* 
* 
*     SOURCE      - 92064-18017 
*     RELOCATABLE - 92064-16081 
* 
.A    NOP           A-REGISTER
.B    NOP           B-REGISTER
.EO   NOP           E,O REGISTERS 
* 
*  COMPARE BYTES ROUTINE
* 
*     (A) = STRING1 BYTE ADDRESS
*     (B) = STRING2 BYTE ADDRESS
*     P             JSB .CBT
*     P+1           DEF COUNT     NUMBER OF BYTES 
*     P+2           NOP           TEMP. STORAGE FOR ROUTINE 
*     P+3           <STRING1=STRING2>  (A)=STRING1 BYTE ADDR + COUNT
*     P+4           <STRING1<STRING2>  (A)=STRING1 BYTE ADDR WHERE STOPPED
*     P+5           <STRING1>STRING2>  (A)=STRING1 BYTE ADDR WHERE STOPPED
*                                      (B)=STRING2 BYTE ADDR + COUNT
* 
.CBT  NOP 
      DST .A        SAVE A,B REGS 
      ERA,ALS       SAVE E,O REGS 
      SOC C 
      INA 
      STA .EO 
      LDA .CBT,I    GET COUNT ADDR
      LDA 0,I       GET COUNT 
      ADA 1         CALC. ADDR+1 OF LAST
      STA STOP       BYTE IN STRING2
      LDA .CBT,I    GET COUNT ADDR AGAIN
      LDA 0,I       NEGATE BYTE COUNT 
      CMA,INA,SZA,RSS   FOR LOOP
      JMP RTN       RETURN EQUAL IF ZERO COUNT
      ISZ .CBT      GET ADDR OF USER TEMP WORD
      STA .CBT,I    SAVE NEGATIVE COUNT 
* 
LOOP  LDB .A        GET ADDR OF STRING1 BYTE
      JSB LBT       GET THE BYTE
      STB .A        SAVE ADDR OF NEXT STRING1 BYTE
      CMA,INA 
      STA TEST      NEGATE AND SAVE 
      LDB .B        GET ADDR OF STRING2 BYTE
      JSB LBT       GET THE BYTE
      STB .B        SAVE ADDR OF NEXT STRING1 BYTE
      ADA TEST      SUBTRACT STRING1 BYTE 
      SSA 
      JMP MORE      STRING1 > STRING2 
      SZA 
      JMP LESS      STRING1 < STRING2 
      ISZ .CBT,I
      JMP LOOP      NOT DONE YET
* 
      JMP RTN       IF FALL THROUGH, EQUAL! 
MORE  ISZ .CBT
LESS  ISZ .CBT
RTN   CCA           SUBTRACT ONE FOR BYTE ADDR
      ADA .A        (A)=BYTE ADDR OF LAST COMPARE 
      ISZ .CBT         OR ADDR OF NEXT IF EQUAL STRINGS 
      LDB .EO       RESTORE E,O REGS
      SLB,ELB 
      STO 
      LDB STOP      SET UP B-REG
      JMP .CBT,I    RETURN
* 
*  LOAD BYTE ROUTINE
* 
.LBT  NOP 
      ERA,ALS       SAVE E,O REGS 
      SOC C 
      INA 
      STA .EO 
      JSB LBT       CALL LOCAL ROUTINE TO DO IT 
      STB .B        SAVE B-REG TEMPORARILY
      LDB .EO       RESTORE E,O REGS
      SLB,ELB 
      STO 
      LDB .B        RESTORE B-REG 
      JMP .LBT,I    RETURN
* 
*  MOVE BYTES ROUTINE 
* 
*     (A) = SOURCE ADDRESS
*     (B) = DESTINATION ADDRESS 
*     P             JSB .MBT
*     P+1           DEF N BYTE COUNT
*     P+2           NOP       TEMP FOR .MBT 
*     P+3           <RETURN>
*     (A) = ADDR+1 OF LAST SOURCE BYTE
*     (B) = ADDR+1 OF LAST DESTINATION WORD 
* 
.MBT  NOP 
      DST .A        SAVE A,B REGS 
      ERA,ALS       SAVE E,O REGS 
      SOC C 
      INA 
      STA .EO 
* 
      LDA .MBT,I    GET ADDR OF COUNT 
      ISZ .MBT
      LDA 0,I       GET BYTE COUNT
      CMA,INA,SZA,RSS 
      JMP RMBT      EXIT IF COUNT=0 
      STA .MBT,I     ELSE SAVE NEGATIVE COUNT 
* 
MBTL  LDB .A        GET SOURCE ADDR 
      JSB LBT       GET THE BYTE
      STB .A        SAVE NEW SOURCE ADDR
      LDB .B        GET DESTINATION ADDR
      JSB SBT       STORE THE BYTE
      STB .B        SAVE NEW DESTINATION ADDR 
      ISZ .MBT,I    INCREMENT THE COUNT 
      JMP MBTL      MOVE SOME MORE IF NOT DONE. 
* 
RMBT  ISZ .MBT      INCREMENT RETURN ADDR 
      LDA .EO       RESTORE E,O REGS
      SLA,ELA 
      STO 
      DLD .A        SET NEW BYTE ADDRS IN A,B REGS
      JMP .MBT,I    RETURN
* 
*  STORE BYTE ROUTINE 
* 
.SBT  NOP 
      STA .A        SAVE A-REG
      ERA,ALS       SAVE E,O REGS 
      SOC C 
      INA 
      STA .EO 
      LDA .A        KEEP ONLY LOW HALF
      AND B377
      JSB SBT       CALL LOCAL ROUTINE TO DO IT 
      LDA .EO       RESTORE E,O REGS
      SLA,ELA 
      STO 
      LDA .A        RESTORE A-REG 
      JMP .SBT,I    RETURN
* 
*  SEARCH FOR BYTES ROUTINE 
* 
*     A=STOP BYTE-TEST BYTE 
*     B=FIRST BYTE ADDRESS OF SEARCH
*     P             JSB .SFB
*     P+1           <MATCH RETURN>  (B)=BYTE ADDR OF MATCH
*     P+2           <STOP RETURN>   (B)=BYTE ADDR+1 OF STOP 
* 
.SFB  NOP 
      STA .A        SAVE A-REG
      ERA,ALS       SAVE E,O REGS 
      SOC C 
      INA 
      STA .EO 
* 
      LDA .A
      AND B377
      STA TEST      SAVE TEST BYTE
      XOR .A
      ALF,ALF 
      STA STOP      SAVE STOP BYTE
* 
SFBL  LDA .A        SET A IN CASE OF WRAP-AROUND
      JSB LBT       FETCH A BYTE
      CPA TEST      DOES IT MATCH TEST BYTE?
      JMP MATCH      YES, EXIT
      CPA STOP      MATCH STOP BYTE?
      RSS            YES
      JMP SFBL       NO, KEEP SEARCHING 
* 
*                   IF WRAP-AROUND OCCURRED, A-REG
      ISZ .SFB      WOULD MATCH STOP BYTE. INCRE RETURN 
      RSS 
MATCH ADB N1        ADJUST BYTE ADDRESS FOR MATCH 
      LDA .EO       RESTORE E,O REGS
      SLA,ELA 
      STO 
      LDA .A        RESTORE A-REG 
      JMP .SFB,I    RETURN
* 
TEST  NOP 
STOP  NOP 
N1    OCT -1
* 
* 
* **************************************
*     LOCAL ROUTINES FOR BYTE LOAD/STORE
* 
LBT  NOP
      CLE,ERB       SET (B) TO WORD ADDR
      LDA 1,I       GET WORD AND SHIFT ACCORDING TO 
      ELB            (SLB) CONTAINING EVEN/ODD POSITION 
      SLB,INB,RSS    ALSO BUMP BYTE COUNT 
      ALF,ALF       IT WAS EVEN.
      AND B377      KEEP BYTE 
      JMP LBT,I     RETURN BYTE IN (A)
* 
B377  OCT 377 
C377  OCT 177400
CHAR  NOP 
* 
SBT   NOP 
      STA CHAR      SAVE NEW BYTE TEMPORARILY 
      CLE,ERB       SET (B) TO WORD ADDR
      LDA 1,I       GET WORD ANDSHIFT ACCORDING TO
      SEZ,RSS       ROTATE IF ODD CHAR
      ALF,ALF       IT WAS EVEN.
      AND C377      KEEP HALF WHICH IS STAYING
      IOR CHAR      FILL IN NEW BYTE
      SEZ,RSS 
      ALF,ALF       SHIFT IF NEEDED 
      STA 1,I       SAVE NEW WORD 
      ELB           RESTORE BYTE ADDR 
      INB            INCREMENT TO NEXT BYTE ADDR
      JMP SBT,I     RETURN
* 
* 
      END 
                                                                                                                                        