ASMB,R,L,C * * **************************************************************** * * (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. * * **************************************************************** * * NAME: PART OF MATH LIBRARY * SOURCE: 24998-18XXX SEE NAM FOR LAST THREE DIGITS * RELOC: PART OF 24998-12001 * PGMR: BG & JTS * NAM INDEX,7 24998-1X252 REV.2001 750701 ENT .INDA,.INDR EXT REIO,IND.E * .INDA AND .INDR ARE USED BY THE ALGOL COMPILER * IN ORDER TO ACCESS ARRAY ELEMENTS. .INDA PRODUCES * THE ABSOLUTE ADDRESS OF AN ARRAY ELEMENT, WHEREAS *.INDR PRODUCES THE VALUE STORED IN THAT LOCATION. * THE CALLING SEQUENCE TO THESE ROUTINES IS: * * JSB .INDA OR .INDR * DEF ARRAY TABLE * ABS -NUMBER OF INDICES * DEF INDEX1 * ..... * DEF INDEX N * * THE ARRAY TABLE FOR A GIVEN ARRAY HAS THE FORM: * * TABLE ABS NUMBER OF INDICES (+=REAL, -=INTEGER) * ABS SIZE OF 1ST DIM * ABS -LOWER BOUND OF 1ST DIM * ..... * ABS SIZE OF LAST DIM * ABS -LOWER BOUND OF LAST DIM * .INDA NOP LDA .INDA JSB GETAD JMP T,I * .INDR NOP LDA .INDR JSB GETAD LDB 0 LDA 1,I INB LDB 1,I JMP T,I * GETAD IS THE ROUTINE THAT DOES ALL THE WORK. THE * COMPUTATION OF THE LOCATION IS DONE AS FOLLOWS: * * M_INDEX[1]-LB[1]; * FOR I_2 STEP 1 UNTIL NUMBEROFINDICES DO * M_SIZE[I]*M+INDEX[I]-LB[I]; * IF REAL ARRAY THEN M_2*M. * ADDRESS_M+BASE GETAD NOP STA T SAVE POINTER TO INDICES. LDA T,I GET ADDRESS OF ARRAY TABLE RAL,CLE,SLA,ERA TEST FOR INDIRECT. LDA 0,I RELOAD IF INDIRECT STA TABLE SAVE TABLE ADDRESS LDA TABLE,I BET # OF INDICES FROM TABLE STA MODE SAVE IN MODE FOR LATER USE. ISZ T BUMP T TO POINT AT ACTUAL COUNT. SSA,RSS SET COUNT IN CALLING SEQUENCE CMA,INA NEGATIVE STA COUNT AND SAVE IN COUNT CPA T,I MAKE SURE COUNT AGREES JMP CNTOK THEY DO--WE CAN CONTINUE * * ILLEGAL ARRAY REFERENCE* * ERROR ISZ T FIXUP FOR CORRECT RETURN ISZ COUNT REPOSITION FOR JMP ERROR PROPER RETURN LDB T GET ADDRESS TO BE PRINTED LDA .1+3 STA COUNT SET FOR 3 TIMES LDA BNLOC STA MODE LDA B2006 GET BLANK UPPER OF 1ST CHAR RBL,CLE POSITION B REG. JMP *+4 POOL LDA B3006 JSB RRL3 ALF,RAL JSB RRL3 STA MODE,I STORE 2 DIGITS ISZ MODE BUMP BUFFER ADDRESS ISZ COUNT ARE WE DONE? JMP POOL NO, GO NEXT 2 DIGITS JSB REIO PRINT ERROR MESSAGE DEF *+5 DEF .1+1 DEF IND.E PRINT ON THE SYST. TTY DEF FLAG DEF .1+2 3WORDS(6 CHARS.) CLA CLB BACK ISZ T JMP GETAD,I RRL3 NOP ROTATE B AND A 3 BITDS ELB ELA ELB ELA ELB ELA JMP RRL3,I SUP B2006 OCT 2006 B3006 OCT 3006 .1 OCT 1,2,6,-3 FLAG ASC 6,INDEX? BNLOC DEF FLAG+3 LOCN. K OF START OF NUMBER CNTOK ISZ TABLE POINT TABLE TO FIRST SIZE CLA CLEAR M INITIALLY. LOOP STA M LDA TABLE,I GET DIMENSION SIZE CMA,INA AS NEGATIVE STA SIZE ISZ TABLE POINT AT LOWER BOUND LDA TABLE,I GET LOWER BOUND ISZ T ADD IN LDB T,I INDEX ADA 1,I SSA TEST FOR LEGAL JMP ERROR+1 ERROR INDEX TOO LOW STA 1 SAVE IN B ADA M ADD TO INDEX ADB SIZE SSB,RSS JMP ERROR+1 ERROR-INDEX TOO HIGH ISZ COUNT TEST FOR DONE JMP MULT NO--GO DO A MULTIPLY * LDB MODE TEST MODE SSB,RSS IF + (REAL) ALS DOUBLE M ISZ TABLE ADA TABLE,I ADD IN BASE ADDRESS JMP BACK * MULT ISZ TABLE MPY TABLE,I JMP LOOP * T NOP TABLE NOP MODE NOP COUNT NOP M EQU .INDA SIZE EQU .INDR * END * *