ASMB,R,L,C
      HED CA.. ROUTINE
*     NAME:   CA..
*     SOURCE: 92070-18013 
*     RELOC:  92070-16013 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (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 CA..,8  92070-1X013  REV.1941  790712 
      ENT CA..
      EXT N.OPL,.ENTR,.DFER,G0..
      SUP 
* 
*     THIS MODULE OF THE RTE FILE MANAGEMENT PACKAGE CACULATES
*     A VALUE AND STORES IT IN A GLOBAL LOCATION.  IT IS CALLED 
*     WHEN A STATEMENT OF THE FORM: 
* 
*     :CA,#,OPERAND1,OPERATION,OPERAND2,OPERATION,OPERAND3...ETC. 
* 
*     IS ENCOUNTERED. 
* 
*     THE RESULT OF THE OPERATION WILL BECOME GLOBAL '#'. 
* 
*     OPERATION CODES ARE:
* 
*     +             ADD 
*     -             SUBTRACT (1-2)
*     /             DIVIDE   (1/2)
*     *             MULTIPLY (1*2)
*     O             OR       (1 OR 2) 
*     X             EXCLUSIVE OR (1 XOR 2)
*     A             AND          (1 AND 2)
* 
*     THE ORDER OF THE RESULT WILL BE THE MAXIMUM OF THE ORDERS 
*     OF THE OPERANDS. (THE ORDER IS 0=NULL,1=NUMERIC AND 3=ASCII)
*     IN ALL CASES EXCEPT / AND * THE CACULATION IS DONE INDEPENDTLY
*     ON THE THREE WORD VALUES OF THE OPERANDS.  IN THE CASE OF 
*     / AND * THE FIRST WORD OF OPERAND TWO IS USED FOR ALL 
*     THREE WORD OF OPERAND ONE.
* 
*     EVALUATION PROCEEDS FROM LEFT TO RIGHT UNTIL A NULL OPERATION 
*     CODE IS DETECTED.  ANY OTHER PRECEDENCE MUST BE EFFECTED BY 
*     MULTIPLE STATEMENTS.
* 
COUNT NOP 
PRAM  NOP 
ERR   NOP 
CA..  NOP 
      JSB .ENTR     GET THE PRAMS 
      DEF COUNT 
* 
* 
      ISZ PRAM      STEP TO GLOBAL #
      LDA PRAM,I    GET IT
      LDB N.OPL     GET POSSIBLE 'P' FLAG 
      CPB "P"       SET ??
      JMP PTST      YES GO TEST 'P' NUMBER
* 
      SSA,RSS 
      CMA,INA,SZA,RSS IF 0 OR - 
      JMP EREX      TAKE GAS. 
* 
      ADA .9        IF MORE THAN
      SSA           9 
      JMP EREX      TAKE GAS. 
* 
      LDB PRAM,I    GET THE NUMBER
      BLS,BLS       TIMES 4 
PADD  LDA DGLOB     GET THE ADDRESS OF THE
      RAL,CLE,SLA,ERA GLOBAL ARRAY
      LDA A,I 
      ADA B         COMPUTE THE DESTINATION ADDRESS 
      STA DESTT     AND SET IT
      LDB PRAM      SET UP THE TEMP 
      ADB .3        STORE 
      STB TDES      ADDRESS 
      STB PRAM
* 
LOOP  ADB .5        INDEX TO OP 
      LDA B,I       PICK UP OP CODE 
      ADB .3        INDEX TO OP2
      STB PRAM      SET ADDRESS 
      SZA,RSS       IF NO CODE
      JMP EXOK      THEN END OF LINE, GO EXIT 
* 
      AND C377      KEEP FIRST CHARACTER
      CLB,CLE       SET UP THE COMP LOOP
      STB COMP
      STB ADDR
      STB DMCD
      CPA MINUS     SUBTRACT? 
      CCE,RSS       YES SET FLAG AND USE PLUS 
      CPA PLUS      ADD 
      LDB ADA       YES USE ADD INSTR 
      CPA "O"       OR? 
      LDB IOR       YES 
      CPA "X"       XOR?
      LDB XOR       YES 
      CPA "A"       AND?
      LDB AND       YES 
      SZB           ON OF THE ABOVE?
      JMP SETOP     YES GO SET UP 
* 
      CPA "/"       DIVIDE? 
      LDB DIV       YES 
      CPA TIMES     *?
      LDB MPY       YES 
      SZB,RSS       IF STILL NO GO
      JMP EREX     THEN GO EXIT ERROR 
* 
      STB DMCD      SET *, / CODE 
      LDB LDB       SET A LDB BEFORE IT 
      STB COMP      AND 
      LDB PRAM      SET THE OP 2 ADDRESS
      CLE,INB       AFTER THE DIV 
      STB ADDR
      LDB ASR       GET THE ASR INSTRUCTION 
* 
SETOP STB OPCD      SET THE OP CODE 
      LDA NEGAT     IF -
      SEZ           SET 
      STA COMP      A CMA,INA 
      LDA N3        SET THE LOOP COUNT
      STA COUNT 
      LDA TDES      AND THE DESTINATION ADDRESS 
      STA DES 
      LDA A,I       SET THE ORDER CODE
NEGAT CMA,INA 
      ADA PRAM,I    TO THE
      LDB PRAM,I    MAX 
      SSA,RSS       OF THE
      STB DES,I     ORDERS PRESENT
* 
CLOOP ISZ DES      STEP DESTINATION ADDRESS 
      ISZ PRAM      AND SOURCE ADDRESS
      LDB DES       GET ADDRESS TO B
      LDA PRAM,I    OP2 TO A
COMP  CMA,INA /NOP  /LDB B,I    DO IT 
OPCD  ADA B,I       /ASR 16 
DMCD  NOP           /DIV/MPY
ADDR  NOP           /ADDR -PRAM 
      STA DES,I     SET THE RESULT AWAY 
      ISZ COUNT     DONE? 
      JMP CLOOP     NO DO NEXT WORD 
* 
      LDB PRAM      SET UP A FOR
      ADB N3        NEXT OP CODE
      JMP LOOP      AND LOOP
* 
PTST  ADA .36       MUST BE IN RANGE -36<= X < 7
      SSA,RSS       IF NEGATIVE THEN < -36
      CPA .36       DON'T ALLOW ZERO EITHER 
      JMP EREX      ERROR ZERO OR LESS THAN -36 
* 
      ADA N43       TEST FOR  > 7 
      SSA,RSS       OK? 
      JMP EREX      NO  NUMBER TO BIG 
* 
      LDB PRAM,I    GET PRAM AND
      ADB .40       CACULATE THE ADDRESS OFFSET 
      JMP PADD      GO SET IT UP AND DO THE 'CA'
* 
* 
EXOK  LDA TDES,I    AH - SWEET SUCCESS
      STA DESTT,I   SET NEW PRAM IN DESTINATION 
      ISZ TDES
      LDB N.OPL     IF A
      CPB "P"       P CACULATE
      JMP PSET      GO RESET TO RIGHT THING 
* 
      ISZ DESTT     AND 
      JSB .DFER     THEN
DESTT NOP 
TDES  NOP 
EXP   CLA,RSS 
EREX  LDA BADPM     ERROR EXIT
      STA ERR,I     SET ERROR CODE
      JMP CA..,I    EXIT
* 
* 
PSET  LDA TDES,I    GET THE VALUE WORD
      STA DESTT,I   AND SET FOR P 
      JMP EXP       GO EXIT 
* 
DES   NOP 
DGLOB DEF G0..
BADPM DEC 56
ASR   ASR 16
LDB   LDB B,I 
ADA   ADA B,I 
IOR   IOR B,I 
AND   AND B,I 
XOR   XOR B,I 
DIV   OCT 100400
MPY   OCT 100200
"A"   OCT 40400 
"X"   OCT 54000 
"O"   OCT 47400 
"P"   ASC 1,P       P BLANK FOR P TEST
MINUS OCT 26400 
PLUS  OCT 25400 
"/"   OCT 27400 
TIMES OCT 25000 
C377  OCT 177400
.3    DEC 3 
.9    DEC 9 
.5    DEC 5 
.36   DEC 36
.40   DEC 40
N3    DEC -3
N43   DEC -43 
A     EQU 0 
B     EQU 1 
      ORG * 
      END 
                                                                                                                                                          