*TITLEDOTSCL -- SCALES TRACE SAMPLES 00000100 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** *A AUTHOR BARBARA BUCK 00000200 *A DESIGNER PATTY JENNINGS 00000300 *A LANGUAGE ASSEMBLER 00000400 *A SYSTEM IBM 3033/MVS & 4341/CMS 00000600 *A WRITTEN 02-03-78 00000700 * REVISED 04-24-79 BY RKS. ADD ROUNDING INSTRUCTIONS. 00000800 * REVISED 01-19-81 BY BJB. CONVERT TO IBM ASSEMBLER. 00000900 * REVISED 08-25-81 BY REP. CHANGE NAME FROM USDOTS TO DOTSCL 00001000 * REVISED MO-DA-YR BY PROGRAMMER FOR REASON. 00001100 *A 00001200 *A 00001300 *A CALL DOTSCL(INB,IOB,KNT,ISF,INM,ITM,IPRSW) 00001500 *A 00001600 *A IN/OUT ARGUMENT TYPE DESCRIPTION 00001900 *A 00002000 *A IN INB I2 INPUT BUFFER OF 16 BIT INTEGER VALUES. 00002100 *A OUT IOB I2 OUTPUT BUFFER OF 16 BIT INTEGER VALUES. 00002200 *A IN KNT I4 NUMBER OF VALUES IN INB TO BE SCALED. 00002300 *A IN ISF I4 NUMBER OF BITS TO SHIFT EACH VALUE IN 00002400 *A ADDITION TO APPLICATION OF SCALING. POS 00002500 *A ISF GIVES RIGHT SHIFT. NEG ISF GIVES 00002600 *A LEFT SHIFT. 00002700 *A IN INM I4 INPUT ABSOLUTE VALUE MEAN OF INB. 00002800 *A IN ITM I4 INPUT TARGET MEAN TIMES 4. 00002900 *A IN IPRSW I4 INPUT POLARITY REVERSE SWITCH. 00003000 *A 0 - LEAVE SIGN OF EACH VALUE UNCHANGED. 00003100 *A 1 - REVERSE SIGN OF EACH VALUE. 00003200 *A 00003300 *A 00003400 *A SCALE TRACE SAMPLES TO DOT NUMBERS SUITABLE FOR USE IN 00003800 *A GENERATING TRACE ENVELOPE. THE SHIFT FACTOR MAY BE USED 00003900 *A TO HANDLE DATA WHICH HAS BEEN OBTAINED FROM FLOATING 00004000 *A POINT SOURCE AND WHICH MAY NOT ALL HAVE SAME PRESHIFT. 00004100 *A THE TARGET MEAN IS ACTUALLY THE PEAK TO PEAK TRACE 00004200 *A RANGE IN DOTS AND IS 4 TIMES THE ACTUAL RESULTANT MEAN. 00004300 *A POLARITY REVERSE SWITCH ALLOWS SIGN RETENTION OR SIGN 00004400 *A REVERSAL OF EACH INPUT VALUE DURING SCALING. SCALING 00004500 *A MAY BE PERFORMED IN PLACE IE., OUTPUT BUFFER MAY OVER- 00004600 *A LAY INPUT BUFFER. 00004700 * 00004800 * 00004900 EJECT 00005000 * 00005100 * REGISTER EQUATES 00005200 * ================ 00005300 * 00005400 R0 EQU 0 SUBROUTINE COMMUNICATION 00005500 R1 EQU 1 ADDR OF PARAMETER ADDRESS BLOCK 00005600 R2 EQU 2 WORK REGISTER 00005700 R3 EQU 3 WORK REGISTER 00005800 R4 EQU 4 WORK REGISTER 00005900 R5 EQU 5 WORK REGISTER 00006000 R6 EQU 6 WORK REGISTER 00006100 R7 EQU 7 WORK REGISTER 00006200 R8 EQU 8 WORK REGISTER 00006300 R9 EQU 9 00006400 R10 EQU 10 00006500 R11 EQU 11 REG USED IN CHAINING SAVE AREAS 00006600 R12 EQU 12 BASE REGISTER 00006700 R13 EQU 13 ADDRESS OF SAVE AREA & BASE 00006800 R14 EQU 14 RETURN ADDRESS FOR SUBROUTINES 00006900 R15 EQU 15 BRANCH ADDRESS TO SUBROUTINES 00007000 EJECT 00007100 * 00007200 * SET UP SAVE AREA CHAINING & STORE USER'S REGISTERS 00007300 * 00007400 DOTSCL CSECT 00007500 USING *,R15 00007600 B 12(R15) 00007700 DC X'06',CL7'DOTSCL ' 00007800 STM R14,R12,12(R13) 00007900 LA R12,SAVEAREA 00008000 ST R12,8(R13) 00008100 ST R13,4(R12) 00008200 DROP R15 00008300 LR R13,R12 00008400 USING SAVEAREA,R13 00008500 B SAVEAREA+72 00008600 * 00008700 SAVEAREA DC 18F'0' 00008800 * 00008900 * RETRIEVE INPUT PARAMETERS 00009000 * 00009100 LM R2,R8,0(R1) SAVE INPUT ADDRESSES 00009200 STM R2,R8,INB 00009300 L R1,INM ABS. VALUE MEAN OF INM 00009400 L R1,0(R1) 00009500 SLA R1,2 MULTIPLY BY 4 00009600 L R5,ITM TARGET MEAN *4 00009700 L R5,0(R5) 00009800 SR R6,R6 NORMALIZE WHERE BIT 1 IS SET 00009900 LTR R5,R5 PUT SHIFT COUNT IN R6 00010000 BNP NORM2 IF ZERO OR <0 => DONE 00010100 LA R6,16 SINCE HALFWORD => AT LEAST 00010200 SLL R5,15 16 ZEROES 00010300 LR R7,R6 00010400 NLOOP SLL R5,1 SHIFT AND COUNT ZEROES 00010500 LTR R5,R5 00010600 BM NORM1 00010700 LA R6,1(R6) BUMP COUNT 00010800 BCT R7,NLOOP 00010900 * 00011000 NORM1 SLL R5,1 00011100 NORM2 SRL R5,2 SHIFT BACK TO BIT 1 00011200 O R5,SETBIT1 SET BIT 1 ON 00011300 S R6,FONE 00011400 SR R4,R4 ZERO R4 FOR DIVISION 00011500 DR R4,R1 DIVIDE R4R5(ITM) BY R1(INM*4) 00011600 SR R4,R4 NORMALIZE AS BEFORE AND STORE 00011700 LTR R5,R5 COUNT IN R4 00011800 BNP NORM4 R5 HAS MULTIPLIER ITM/(INM*4) 00011900 LA R4,1 00012000 LA R7,32 00012100 NLOOP1 SLL R5,1 SHIFT AND COUNT ZEROES 00012200 LTR R5,R5 00012300 BM NORM3 00012400 LA R4,1(R4) BUMP COUNT 00012500 BCT R7,NLOOP1 00012600 * 00012700 NORM3 SLL R5,1 00012800 NORM4 SRL R5,2 SHIFT BACK TO BIT 1 00012900 O R5,SETBIT1 SET BIT 1 ON 00013000 S R4,FONE 00013100 AR R4,R6 ADD SHIFT COUNTS TOGETHER (R4) 00013200 L R1,KNT 00013300 L R1,0(R1) KNT IN R1 00013400 L R7,IPRSW POLARITY REVERSAL SWITCH IN R7 00013500 L R7,0(R7) 00013600 LTR R7,R7 CHECK IF ON OR OFF 00013700 BZ LP OFF GO LOAD POSITIVE 00013800 LH R3,LCRI SWITCH ON, BUILD LOAD COMPLEMENT 00013900 B SSTT TO LOAD NEG. CONTENTS OF R3, 00014000 * INDEXED BY R1 TO R7. GO STORE. 00014100 LP LH R3,=X'0700' NO-OP LOAD COMPLEMENT INSTR. 00014200 SSTT STH R3,POS+4 00014300 STH R3,ZERO+4 00014400 STH R3,NEG1+4 STORE ORRED WORD IN LOOPS 00014500 STH R3,TOOBIG+4 00014600 L R2,IOB STARTING ADDR OF IOB 00014700 L R3,INB ADDRESS OF INB IN R3 00014800 LCR R4,R4 CORRECT SIGN ON SHIFT COUNT 00014900 A R4,=F'32' ADD SHIFT FACTOR 00015000 L R7,ISF 00015100 S R4,0(R7) ADD USER SUPPLIED SHIFT FACTOR 00015200 BZ ZERO SEND TO CORRECT SHIFT LOOP 00015300 BM NEG 00015400 * LEFT SHIFT APPLIED 00015500 SRL R5,16 SHIFT DATA TO LOW HALFWORD 00015600 C R4,=F'15' CHECK IF LARGER THAN POSSIBLE 00015700 BNL TOOBIG IF SO, OUTPUT MAXIMUM VALUE 00015800 O R4,SLI BUILD SHIFT LEFT INSTR. 00015900 ST R4,LSHFT AND STORE IN LSHFT 00016000 POS LH R7,0(R3) 00016100 DC H'0' PUT ELEMENT OF INB IN R7 00016200 MR R6,R5 MULT INB ELEMENT BY SHIFT(R7) 00016300 CNOP 0,4 00016400 LSHFT DC F'0' SHIFT R7 LEFT BY COUNT IN R4 00016500 BO OVER CHECK FOR OVERFLOW 00016600 A R7,=X'00008000' ROUND TO NEAREST VALUE 00016700 SRA R7,16 SHIFT RESULT TO LOW ORDER HW 00016800 STORE STH R7,0(R2) STORE RESULT IN IOB 00016900 LA R2,2(R2) INCREMENT ADDRESS OF IOB 00017000 LA R3,2(R3) 00017100 BCT R1,POS BUMP INDEX AND CHECK IF AT END 00017200 B RETURN RETURN TO MAIN PROGRAM 00017300 * OVERFLOW HAS OCCURED 00017400 OVER LTR R7,R7 CHECK SIGN OF NUMBER 00017500 BL OVNEG 00017600 * NUMBER IS POSITIVE 00017700 LH R7,=X'7FFF' LARGEST POSSIBLE POSITIVE IN R7 00017800 B STORE AND GO STORE 00017900 * NUMBER IS NEGATIVE 00018000 OVNEG LH R7,=X'8000' LARGEST POSSIBLE NEGATIVE IN R7 00018100 B STORE AND GO STORE 00018200 * END OF LEFT SHIFT SECTION 00018300 * SHIFT IS TOO LARGE, MAXIMUM SIGNED VALUE WILL BE PUT IN IOB 00018400 TOOBIG LH R7,0(R3) 00018500 DC H'0' PUT ELEMENT OF IOB IN R7 00018600 LTR R7,R7 00018700 BZ ST 00018800 BM TNEG 00018900 LH R7,=X'7FFF' POSITIVE - LOAD 7FFF IN R7 AND 00019000 ST STH R7,0(R2) STORE IN IOB 00019100 LA R2,2(R2) INCR. IOB ADDRESS 00019200 LA R3,2(R3) 00019300 BCT R1,TOOBIG INCR. INDEX AND CHECK IF AT END 00019400 B RETURN RETURN TO MAIN PROGRAM 00019500 TNEG LH R7,=X'8000' NEGATIVE - LOAD 8000 IN R7 00019600 B ST AND STORE 00019700 * NO SHIFT APPLIED 00019800 ZERO LH R7,0(R3) 00019900 DC H'0' PUT ELEMENT OF INB IN R7 00020000 MR R6,R5 MULT INB ELEMENT * MULTIPLIER R7 00020100 LTR R7,R7 CHECK FOR ROUNDING 00020200 BNM STOR NO ROUNDING NEEDED 00020300 LA R6,1(R6) ROUND ANSWER 00020400 STOR STH R6,0(R2) STORE HW IN R6 INTO IOB 00020500 LA R2,2(R2) BUMP IOB ADDRESS 00020600 LA R3,2(R3) 00020700 BCT R1,ZERO INCR. INDEX AND CHECK IF AT END 00020800 B RETURN RETURN TO MAIN PROGRAM 00020900 * END OF NO SHIFT SECTION 00021000 * 00021100 * RIGHT SHIFT APPLIED 00021200 NEG LCR R4,R4 MAKE SHIFT POSITIVE 00021300 C R4,=F'15' CHECK IF SHIFT IS LARGER THAN 15 00021400 BNL ZEROUT GO PUT OUT MAXIMUM VALUE 00021500 SR R7,R7 SETUP ROUNDING INSTRUCTION 00021600 LA R8,1 00021700 LR R6,R4 00021800 S R6,FONE 00021900 STH R6,ADDSET+2 SLA INSTRUCTION SHIFT VALUE 00022000 O R4,SRI BUILD SHIFT RIGHT INSTR. 00022100 ST R4,RSHFT STORE IN RSHFT 00022200 ADDSET SLA R8,0 SHIFT TO SETUP FOR ROUNDING 00022300 NEG1 LH R7,0(R3) 00022400 DC H'0' PUT ELEMENT OF INB IN R7 00022500 MR R6,R5 MULT. INB BY MULTIPLIER INR5 00022600 AR R6,R8 ROUNDING INSTRUCTION 00022700 CNOP 0,4 00022800 RSHFT DC F'0' APPLY RIGHT SHIFT 00022900 STR STH R6,0(R2) STORE HW INTO ELEMENT OF IOB 00023000 LA R2,2(R2) INCREMENT IOB ADDRESS 00023100 LA R3,2(R3) 00023200 BCT R1,NEG1 INCR. INDEX AND CHECK IF AT END 00023300 B RETURN RETURN TO MAIN PROGRAM 00023400 * END OF RIGHT SHIFT SECTION 00023500 * SHIFT ZEROES OUT ALL ELEMENTS, ZERO OUT ARRAY 00023600 ZEROUT L R6,KNT ADDRESS OF KNT IN ADRSK 00023700 STCM R6,X'07',ADRSK 00023800 L R6,IOB ADDRESS OF IOB IN ADRSA 00023900 ST R6,ADRSA 00024000 CNOP 0,4 00024100 BAL R1,*+16 00024200 DC A(FZERO) 00024300 ADRSA DC F'0' 00024400 DC X'80' 00024500 ADRSK DC AL3(0) 00024600 L R15,=V(INITAR) CALL SUB TO INITIALIZE ALL 00024700 BALR R14,R15 ELEMENTS OF IOB TO ZERO 00024800 * 00024900 RETURN EQU * 00025000 L R13,SAVEAREA+4 RESTORE SAVE AREA POINTER 00025100 LM R14,R12,12(R13) RESTORE REGISTERS 00025200 BR R14 RETURN 00025300 EJECT 00025400 * 00025500 * DATA AREA 00025600 * 00025700 * INSTRUCTIONS BUILT DURING EXECUTION 00025800 * 00025900 CNOP 0,4 00026000 STHI STH R3,0(R1) 00026100 SLI SLA R7,0 00026200 SRI SRA R6,0 00026300 LCRI LCR R7,R7 00026400 SPACE 5 00026500 * 00026600 * CONSTANTS 00026700 * 00026800 FZERO DC F'0' 00026900 FONE DC F'1' 00027000 SETBIT1 DC X'40000000' 00027100 * 00027200 * INPUT PARAMETER ADDRESSES 00027300 * 00027400 INB DC F'0' 00027500 IOB DC F'0' 00027600 KNT DC F'0' 00027700 ISF DC F'0' 00027800 INM DC F'0' 00027900 ITM DC F'0' 00028000 IPRSW DC F'0' 00028100 * 00028200 LTORG 00028300 END 00028400