ASMB,L,R,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 * HED ".DMP" - DOUBLE INTEGER MULTIPLY. NAM .DMP,7 24998-1X045 REV.2001 780818 * ENT .DMP * A EQU 0 B EQU 1 * * .DMP TAKES THE PRODUCT OF TWO DOUBLE INTEGERS. SEE ".DADS" * FOR DATA FORMAT. * NOTE: THE INSTRUCTION "MPY" IS NOT COMPATIBLE WITH ".DMP" ! * * CALLING SEQUENCE: * * DLD * JSB .DMP * DEF * * * IF OVERFLOW OCCURS, THE OVERFLOW BIT IS SET AND THE VALUE * (077777,177777) IS RETURNED, ELSE OVERFLOW IS CLEARED. * THE E-BIT IS PRESERVED. SPC 3 * COPY ARGS, DECIDE WHICH IS SHORT (IN [-2**15,+2**15) ). * .DMP NOP STA ARG1 SAVE ARG 1 STB ARG1+1 CCA SAVE "E". ERA STA E LDA B SWAP LDB ARG1 ASL 16 O=0 IF SHORT CLE COPY O TO E SOC CCE LDA .DMP,I COPY ARG 2 ISZ .DMP STA ARG2 MAY BE IN (A,B) ! LDA ARG1 LDB ARG1+1 DLD ARG2,I STA ARG2 STB ARG2+1 SWP ASL 16 O=0 IF SHORT SKP * NOW E=0 IFF ARG1 SHORT, O=0 IFF ARG2 SHORT. * CHECK IF SIMPLE MULTIPLY OR REVERSED ORDEFR. * SOC ARG 2 SHORT ? JMP DMP1 NO. SEZ,RSS YES, ARG 1 SHORT ? JMP DMP4 YES, SIMPLE MULTIPLY. LDA ARG1 NO, LONG*SHORT, SWITCH. LDB ARG2 STB ARG1 STA ARG2 LDA ARG1+1 LDB ARG2+1 STB ARG1+1 STA ARG2+1 * * NOW ARG2 IS OUTSIDE [-2**15,+2**15). ASSUME THAT * ARG1 IS IN [-2**16,+2**16). FORM THE PRODUCT * (ARG1L)*(ARG2U,ARG2L), WHICH IS A 16-BIT UNSIGNED * BY 32-BIT SIGNED MULTIPLY, YIELDING A 48-BIT SIGNED * RESULT. THE PRODUCT CANNOT OVERFLOW. * DMP1 LDA ARG1+1 ARG1L*ARG2L MPY ARG2+1 STA RES+1 LDA ARG2+1 CORRECT FOR ARG2L<15> SSA ADB ARG1+1 LDA ARG1+1 CORRECT FOR ARG1L<15> SSA ADB ARG2+1 STB RES MPY ARG2 ARG1L*ARG2U CLE FORM MIDDLE RESULT WORD. ADA RES STA RES SEZ PROPOGATE CARRY INB LDA ARG1+1 CORRECT FOR ARG1L<15> SSA ADB ARG2 * * THE PRODUCT IS NOW IN (B,RES,RES+1). VERIFY THAT * ARG1 IS IN [-2**16,+2**16). * LDA ARG1 UPPER WORD MUST BE ZERO OR -1. SZA,RSS JMP DMP3 ZERO, PRODUCT IS O.K. INA,SZA JMP OFL NOT -1, OVERFLOW. SKP * ARG1U = -1, CORRECT FOR IT: SUBTRACT ARG2 * 2**16 . * IF ARG2 = MAX NEG #, THE WHOLE PRODUCT OVERFLOWS. * IF NOT, THE WHOLE PRODUCT FITS IN 48 BITS. * STB ARG1 SAVE FIRST WORD RESULT. LDB ARG2 NEGATE ARG2. LDA ARG2+1 CMB CMA,CLE,INA,SZA JMP DMP2 IF NO CARRY. (E=0) CLE,INB ELSE PROPOGATE. (E=0: ARG2.NE.0) CPB =B040000 OVERFLOW ? JMP OFL YES, WHOLE THING OVERFLOWS. DMP2 ADA RES ADD -ARG2 TO PRODUCT. STA RES SEZ INB ADB ARG1 * * CHECK FOR OVERFLOW, SET RESULT, EXIT. * DMP3 LDA RES CHECK FOR OFL. ASL 16 LDA B FORM RESULT. LDB RES+1 SOS CHECK FOR OVERFLOW. JMP EXIT NO, GO RESTORE "E". OFL LDA =B77777 RETURN (077777,177777) CCB STO SET OVERFLOW. JMP EXIT GO RESTORE "E". * * SIMPLE MULTIPLY. * DMP4 LDA B ARG2L MPY ARG1+1 ARG2L*ARG1L SWP EXIT CCE RESTORE "E". ISZ E CLE JMP .DMP,I * * LOCALS. * ARG1 BSS 2 ARG 1 ARG2 BSS 2 ARG2 & RESULT RES BSS 2 LAST 2 WORDS OF 48-BIT PRODUCT. E BSS 1 -1 IFF E=1. END