ASMB,L,C
      HED ".ERES" - EMA ADDRESS RESOLVER. 
*     NAME:   .ERES 
*     SOURCE: 92067-18258 
*     RELOC:  PART OF 92067-16035 
*     PGMR:   B.G.    
* 
*  ***************************************************************
*  * (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 .ERES,7 92067-16035 REV.1913 781226 
* 
      ENT .ERES 
      SUP 
* 
A     EQU 0 
      SPC 1 
*     .ERES RESOLVES AN ADDRESS IN EMA BUT DOES NOT MAP IN THE
*     PAGE CONTAINING THE RESULTING ADDRESS.  INSTEAD, THE
*     ADDRESS IS RETURNED IN (B,A).  THE CALLING SEQUENCE IS
*     IDENTICAL TO THAT OF ".EMAP" EXCEPT THE "ARRAY ADDRESS" 
*     IS IGNORED, SO THE ARRAY MUST ALWAYS BE IN EMA. 
      SPC 2 
*                   LOCALS. 
* 
EMSG  ASC 2,20EM
T1    BSS 1         UPPER WORD RUNNING RESULT.
T2    BSS 1         LOWER.
ND    BSS 1         LOOP COUNTER OF # DIMENSIONS. 
TABLE BSS 1         ADDR OF ARRAY DESCRIPTOR. 
RTN   BSS 1         RETURN ADDRESS. 
* 
*                   ERROR HANDLING AND ZERO-DIMENSION CASE. 
* 
ERROR DLD EMSG      (A,B) = ASCII "20EM"
      JMP RTN,I     TAKE ERROR EXIT.
ZEROD DLD TABLE,I   JUST CHECK SIGN OF OFFSET.
      JMP NCHK
      SPC 2 
*                   COPY RETURN ADDRESS, TABLE ADDR, & # DIM. 
* 
.ERES NOP 
      LDA .ERES,I   COPY RETURN ADDR. 
      ISZ .ERES 
      STA RTN 
      ISZ .ERES     SKIP ARRAY ADDR 
      LDA .ERES     COPY TABLE ADDR 
      ISZ .ERES 
      LDA A,I       (FIRST REMOVE INDIRECTS)
      RAL,CLE,SLA,ERA 
      JMP *-2 
      LDB A,I       B = # DIM.
      INA           SKIP IT IN TABLE. 
      STA TABLE 
      SSB           # DIM < 0 ? 
      JMP ERROR     YES.
      CMB,INB,SZB,RSS NEGATE. ZERO ?
      JMP ZEROD     YES.
      STB ND        NO. KEEP AS COUNTER.
      CLA           SET CURRENT OFFSET TO ZERO. 
      STA T1
      STA T2
      SKP 
*                   LOOP THRU SUBSCRIPTS AND COMPUTE OFFSET.
* 
LOOP  LDA .ERES,I   NEXT SUBSCRIPT ADDR.
      ISZ .ERES 
      LDA A,I       NEXT SUBSCRIPT. 
      CLO           ADD - (LOWER BOUND) CAREFULLY.
      ADA TABLE,I 
      ISZ TABLE 
      CLE,SSA,RSS   RESULT NEGATIVE 
      SOC           OR OVERFLOW ? 
      JMP ERROR     YES.
      ADA T2        NO. ADD TO CURRENT SUM. 
      STA T2
      SEZ           PROPOGATE CARRY.
      ISZ T1        (CAN'T SKIP)
      LDA TABLE,I   SIZE OF PREVIOUS DIM (OR # WDS / ELEMENT) 
      SSA           NEGATIVE ?
      JMP ERROR     YES.
      MPY T2        LOWER PRODUCT.
      STA T2
      SSB           IF T2<15> = 1, FIX UPPER PART OF PRODUCT. 
      ADB TABLE,I 
      LDA T1        UPPER PART OLD VALUE. 
      STB T1        SAVE UPPER PART LOWER MULTIPLY. 
      SZA,RSS       ANY NEED TO DO UPPER MULTIPLY ? 
      JMP LOOPE     NO. 
      MPY TABLE,I   YES. DO IT. 
      CLE,SZB       THIRD WORD ?
      JMP ERROR     YES.
      ADA T1        NO. ADD TO SUM. 
      STA T1
      SEZ,INA,RSS   OFL ?   (A#-1)
      SSA 
      JMP ERROR     YES.
LOOPE ISZ TABLE 
      ISZ ND        DO ONCE FOR EACH DIMENSION. 
      JMP LOOP
* 
*                   ADD OFFSET FROM START OF EMA. 
* 
      DLD TABLE,I   THIS IS IT. 
      CLE,SSB       NEGATIVE ?
      JMP ERROR     YES.
      ADA T2        ADD LOWERS. 
      SEZ,CLE       PROPOGATE CARRY.
      ISZ T1        (T1#-1) 
      ADB T1        ADD UPPERS. 
      SEZ,RSS       CARRY OR
NCHK  SSB           RESULT < 0 ?
      JMP ERROR     YES.
      ISZ RTN       NO. RETURN RESULT IN (B,A)
      JMP RTN,I 
      SPC 1 
      END 
                                                                                                                                                                                                                      