/ MODE A EAE MATH PACKAGE / PHIL SIEMENS JANUARY 27, 1975 / LAWRENCE LIVERMORE LABORATORY / LIVERMORE, CA / VERSION 5 / FIXED BUG IN FLOAT 1/14/76 P.S. / FIXED BUG IN FIX 1/27/76 P.S. / THE FLOATING POINT FORMAT USED IS: / ACH = MS MANTISSA -- 2'S COMPLEMENT / ACM = LS MANTISSA -- 2'S COMPLEMENT / ACL = EXPONENT -- 2'S COMPLEMENT / THE VERSION # AND EDIT # OF EACH ROUTINE / ARE CONTAINED IN THE ROUTINE ENTRY POINT /----------------------------------------------/ / THERE IS NO CHECK FOR OVERFLOW / /----------------------------------------------/ / ENTRIES ENTRY FAD ENTRY FSB ENTRY FMP ENTRY FDV ENTRY STO ENTRY FLOT ENTRY FLOAT ENTRY FIX ENTRY IFIX ENTRY IFAD ENTRY ISTO ENTRY ABS ENTRY CHS //////////// / DEFINITIONS FOR FAST TIMING / USG0WitH0Wc]vKon]^otw]n;~}>}>zgow{?}qh^~[{O3ww{~_[F& STE RNPFY MTE RNVFY DTE RNOSY TTE RNOFY TLN YTEL RTOF ATE RNXFY ITE RNIIY XFN YTEF R AIE DRN IYTOS TTE RNSAYPHB25 ABSYM OPL 26 ABSYM OPX 27 ABSYM AC1 23 ABSYM AC2 24 ABSYM PNT2 10 / SPECIAL DEFINITIONS ABSYM AC7776 7344 ABSYM AC0002 7326 ABSYM RDF 6214 ABSYM AC7775 7346 / EAE DEFINITIONS ABSYM MQL 7421 ABSYM NMI 7411 ABSYM SCA 7441 ABSYM MQA 7501 ABSYM SHL 7413 ABSYM MQLSHL 7433 ABSYM ASR 7415 ABSYM MQLMUY 7425 ABSYM DVI 7407 ABSYM CLAMQA 7701 ABSYM LSR 7417 LAP //////////// / FLOATING POINT ADDITION FAD, 6440 /ENTRY 0005 JMS GETADD /GET ADDRESS OF ARG FADX, JMS GETARG /GET THE ARG JMPI FFADDI FFADDI, FFADD / FLOATING POINT SUBTRACTION FSB, 6440 /ENTRY 0005 JMS GETADD /GET ADDRESS OF ARG JMS GETARG /GET THE ARG JMPI FFSUBI FFSUBI, FFSUB / FLOATING POINT MULTIPLY FMP, 6440 /ENTRY 0005 JMS GETADD /GET ADDRES OF ARG JMS GETARG /GET THE ARG JMPI FFMPYI FFMPYI, FFMPY / FLOATING POINT DIVIDE DIVZ, 4411 2632 FDV, 6440 /ENTRY 0005 JMS GETADD /GET ADDRESS OF ARG JMS GETARG /GET THE ARG JMPI FFDIVI FFDIVI, FFDIV //////////// /GET ADDRESS OF ARG /ASSUMES THE 2 WORDS JUST PREVIOUS TO THE /JMS ARE IN SABR ENTRY POINT FORMAT / / CDF N / ADDR / JMS GETADD GETADD, 0 /ENTERS WITH DF POINTING TO FROM BANK AC7775 /GET A -3 IN AC TAD GETADD /BACK UP THE POINTER TO ADDR DCA PNT /POINT TO LOCATION BEFORE JMS TADI PNT /GET CDF TO FROM FIELD DCA GETAF1 /STORE CDF FOR A FETCH ISZ PNT /BUMP POINTER TADI PNT /GET ADDR DCA PNT /NOW POINT TO ARG ADDRESS GETAF1, HLT /CHANGED TO CDF TO ARG ADDRESS FIELD TADI PNT /GET FIELD OF ARG DCA GETAF2 /STORE IT ISZ PNT /BUMP POINTER CLA CMA TADI PNT /GET ADDRESS OF ARG DCA PNT2 AC0002 TAD GETAF1 /MAKE A CIF CDF TO FROM FIELD DCA FRETF ISZ PNT /RETURN ADDRESS JMPI GETADD /EXIT /GET ARGUMENT (FETCH) GETARG, 0 GETAF2, HLT /CHANGED TO CDF TADI PNT2 DCA OPH TADI PNT2 DCA OPL TADI PNT2 DCA OPX DCA AC2 /CLEAR OP LS BITS JMPI GETARG //////////// / FLOATING POINT STORE ROUTINE STO, 6440 /ENTRY 0006 JMS GETADD /GET ADDRESS STOX, TAD ACH /MOVE FAC TO THIS DCA OPH /FIELD TEMPORARILY TAD ACM DCA OPL TAD ACL MQL TAD GETAF2 /MOVE THE CDF INSTRUCTION DCA STOAF2 STOAF2, HLT /GETS A CDF TAD OPH /NOW STORE WITH AUTO INDEX DCAI PNT2 TAD OPL DCAI PNT2 MQA DCAI PNT2 STOX1, DCA ACH /CLEAR THE FAC DCA ACM DCA ACL /FLOATING POINT SUBROUTINE RETURN FRETF, HLT /CHANGED TO CIF CDF JMPI PNT / FLOATING POINT ABSOLUTE VALUE ABS, 6440 /ENTRY 0005 JMS GETADD /GET ADDRESS OF ARG JMS GETARG /GET ARG JMPI FABSI FABSI, FABS PNT, 0 //////////// / INDIRECT FLOATING POINT STORE ISTO, 6440 /ENTRY 0005 JMS GETADD /GET FIRST ADDRESS JMS GETARG /GET SECOND ADDRESS TAD OPH /MOVE SECOND ADDRESS DCA GETAF2 /TO SET UP GETARG CLA CMA TAD OPL DCA PNT2 JMP STOX / INDIRECT FLOATING ADD IFAD, 6440 /ENTRY 0005 JMS GETADD /GET FIRST ADDRESS JMS GETARG /GET SECOND ADDRESS TAD OPH /MOVE SECOND ADDRESS DCA GETAF2 /TO SET UP GETARG CLA CMA TAD OPL DCA PNT2 JMP FADX / FLOAT AN INTEGER ARG FLOAT, 6440 /ENTRY 0005 KMS GEVADFI/WgT%Umg{m___{o?/v}u}_w{{_>~o~_{yPfGSJAE RTE/GSTGOE NCDADSRD SEA ODT P M HEO/E VNCSADORD SED SAD E CFTG/2A T TSOP EE URTG GAL CAC M T A A LOD PAD N C TPJ 2 S JMS GETARG /GET ARG JMS MOPFAC /MOVE OP TO FAC JMPI FIXXI FIXXI, FIXL PAGE //////////// /FLOATING ADD AND SUBTRACT FFSUB, JMS OPNEG /NEGATE OPERAND FFADD, TAD OPH SNA CLA /IS OPERAND = 0? JMP FRETF /YES DONE TAD ACH /IS FAC = 0? SNA CLA JMP REPLC /YES JUST PUT OP IN FAC TAD ACL /NO -- DO EXPONENT CALC. CLL CMA IAC TAD OPX SMA SZA /WHICH EXP. IS GREATER? JMP FACR /OPERAND -- SHIFT FAC CMA IAC /FAC -- SHIFT OPERAND = DIF+1 JMS OPSR JMSI ACSRI /SHIFT FAC 1 PLACE RIGHT DOADD, TAD OPX /SET EXPONENT OF RESULT DCAI (22 JMSI OADDI /DO THE ADDITION JMS FFNOR /NORMALIZE THE RESULT JMP FRETF /RETURN FACR, JMSI ACSRI /SHIFT FAC = DIF+1 JMS OPSR /SHIFT OPERAND 1 PLACE RIGHT JMP DOADD /DO ADDITION ACSRI, ACSR OADDI, OADD //////////// /NEGATE OPERAND OPNEG, 0 TAD OPL /GET LOW ORDER CLL CMA IAC /NEGATE DCA OPL /STORE BACK CML RAL /PROPAGATE CARRY TAD OPH CLL CMA IAC /NEGATE AND STORE DCA OPH JMPI OPNEG / OPERAND SHIFT RIGHT / ENTER WITH POSITIVE COUNT-1 IN AC OPSR, 0 SNA /ONE SHIFT? JMP OPSRA /YES MQL /SAVE COUNT-1 MQA /RETRIEVE IT TAD OPX DCA OPX /EXPONENT STILL NEEDS 1 MQA /DECREMENT AND (7740 /MASK FOR TOO LARGE SHIFT SZA CLA TAD (37 /MAKE IT OK MQA TAD IFM1 DCA OPSRB /SHIFT COUNT TAD OPL /GET LOW MQL /PUT IN MQ TAD OPH /GET HIGH ASR /SHIFT RIGHT WITH SIGN OPSRB, 0 OPSRC, RAR DCA OPH /STORE HIGH MQA RAR DCA OPL /STORE LOW ISZ OPX /FIX EXPONENT NOP RAR DCA AC2 /SAVE LS BITS FOR ROUNDING JMPI OPSR OPSRA, TAD OPL /ONLY 1 SHIFT MQL /SET UP FOR IT TAD OPH /GET HIGH CLL SPA /GET SIGN IN LINK CML JMP OPSRC //////////// / NORMALIZE ROUTINE FFNOR, 0 TAD ACH /GET HI ORDER SNA /ZERO? TAD ACM /YES -- HOW ABOUT LOW SNA TAD AC1 /HOW ABOUT OVERFLOW? SZA CLA JMP IFN2 DCA ACL /ZERO IT FOR SURE FFNORR, DCA AC1 JMPI FFNOR /EXIT IFN2, TADI (21 MQL TADI (20 NMI /NORMALIZE DCAI (20 /STORE HIGH SCA /GET SHIFT COUNT CIA TADI (22 DCAI (22 /STORE CORRECTED EXPONENT SCA SNA /NO SHIFTS NEEDED? JMP FFNORR /RIGHT TAD IFM1 /DECREMENT DCA NX1 MQA DCAI (21 TAD AC1 MQLSHL /SHIFT OVERFLOW NX1, 0 TADI (21 DCAI (21 JMP FFNORR IFM1, -1 //////////// / DO THE ABSOLUTE VALUE FABS, TAD OPH /GET SIGN SPA CLA /IS IT MINUS? JMS OPNEG /YES -- NEGATE REPLC, JMS MOPFAC /MOVE OP TO FAC JMP FRETF MOPFAC, 0 TAD OPH DCA ACH TAD OPL DCA ACM TAD OPX DCA ACL JMPI MOPFAC PAGE / ADD ROUTINE OADD, 0 CLL /CLEAR LINK TAD AC2 /ADD LEAST SIG TAD AC1 DCA AC1 RAL TAD OPL /ADD LOW ORDER TAD ACM DCA ACM RAL TAD OPH /ADD HIGH ORDER TAD ACH DCA ACH JMPI OADD //////////// / FAC SHIFT RIGHT WITH COUNT-1 IN AC ACSR, 0 SNA /ONE SHIFT? JMP ACSRA /YES MQL /SAVE COUNT-1 MQA /RETRIEVE IT TAD ACL /GET EXP DCA ACL /EXPONENT STILL NEEDS 1 MQA AND K7740 SZA CLA TAD (37 MQA TAD (-1 /DECREMENT DCA BCI /SHIFT COUNT TAD ACM /GET LOW AND MQL /PUT IN MQ TAD ACH /GET HIGH ASR /SHIFT RIGHT WITH SIGN BCI, 02 QC[rc/[rU~_oUwOi}o{ww~?}?mok?=_;{wm LvENL DE 1SQ AMN KDA47 07Z CAS L T A A 7(D 3AM QDT - A 1(E/ ECDNMR TEC BAD C S IFH/CTINO TUA ADT C G M E/WLTN O DAQ SHIFT MQL TAD ACH CLL SPA /GET SIGN IN LINK CML JMP ACSRB //////////// / FIX WITH NO ARG FXER, 4611 /"FIX" ERROR 3040 FIX, 6440 /ENTRY 0005 AC0002 /SET UP RETURN TAD FIX DCA FRETF TAD FIX# DCA PNT FIXL, DCA SIGN /CLEAR SIGN INDICATOR TAD ACH /GET SIGN BIT K7740, SMA SZA CLA /MINUS? JMP FIXP /NO JMS FFNEG /YES -- MAKE POSITIVE INC SIGN /AND REMEMBER ITS NEGATIVE FIXP, TADI (22 /GET EXPONENT CIA TAD (13 SPA JMP FIXERR TAD (13 JMS ACSR FIXR, DCAI (20 /CLEAR HIGH ORDER FAC TAD SIGN /WHAT SIGN WAS IT? CLL RAR /PUT IT IN LINK TADI (21 JMP FIXZR /GO FIND SOME ROOM TO FINISH FIXERR, CALL 1, ERROR ARG FXER CLA CMA CLL RAR /2047 DCA ACM JMP FIXR //////////// /FLOAT A FIXED INTEGER IN AC /LEAVE RESULT IN FAC SIGN, FLOT, 6440 /ENTRY 0006 MQL /SAVE THE AC AC0002 TAD FLOT /MAKE CIF CDF TO FROM FIELD DCA FRETF TAD FLOT# /SET UP RETURN POINTER DCA PNT MQA /GET INTEGER BACK FLOTX, SNA /IS INTEGER ZERO? JMP STOX1 /YES -- CLEAR FAC CLL RAL /SIGN TO LINK MQL /PUT IN MQ SZL /IS SIGN ON? CMA /YES -- EXTEND IT NMI DCA ACH /SAVE HIGH MQA DCA ACM /SAVE LOW SCA /GET STEP COUNT CIA TAD (26 DCA ACL /SAVE EXPONENT JMP FRETF PAGE //////////// / MULTIPLY FFMPY, JMS MDSET /SET UP FOR MPY-OPX IN AC TAD ACL /DO EXPONENT ADDITION DCA ACL /STORE FINAL EXPONENT DCA MDSET /ZERO TEM STORAGE DCA AC2 TAD ACH /IS FAC = 0? SNA CLA JMP MPY1 /YES - ZERO EXPONENT JMS MP24 /NO - MULT FAC BY LOW OPR TAD OPH /NOW MULT FAC BY HI ORDER DCA OPL JMS MP24 TAD AC2 /STORE RESULT BACK IN FAC DCA ACM /LOW ORDER TAD MDSET /HI ORDER DCA ACH TAD ACH /NORMALIZE? RAL SMA CLA JMSI IFNOR /YES TAD AC1 SPA CLA /CHECK OVERFLOW ISZ ACM /HIGH BIT ON -- ROUND RESULT JMP MDONE ISZ ACH /LOW ORDER OVERFLOWED TAD ACH SPA /CHECK FOR 4000 0000 JMPI SHR1I CLA MDONE, DCA AC1 /ZERO OVERFLOW ISZ MSIGN /SHOULD RESULT BE NEGATIVE SKP JMSI FFNEGI /YES -- NEGATE TADI (20 SNA CLA /ZERO HIGH MEANS ZERO EXP MPY1, DCAI (22 JMP FRETF //////////// /MDSET -- SETS UP SIGNS FOR MULT & DIVIDE /SHIFTS OPERAND 1 BIT LEFT /EXIT WITH EXP OF OPERAND IN AC MDSET, 0 CLA CLL CMA RAL /GET -2 DCA MSIGN TAD OPH /IS OP NEGATIVE SMA CLA JMP MDS1 /NO JMSI OPNEGI /YES -- NEGATE ISZ MSIGN /BUMP SIGN CHECK MDS1, TAD OPL /SHIFT OP LEFT 1 BIT CLL RAL DCA OPL TAD OPH RAL DCA OPH TAD ACH /IS FAC NEGATIVE? SMA CLA JMP LEV /NO JMSI FFNEGI /YES -- NEGATE ISZ MSIGN /BUMP SIGN CHECK NOP /SKIP PROTECT LEV, TAD OPX JMPI MDSET MSIGN, 0 OPNEGI, OPNEG FFNEGI, FFNEG SHR1I, SHR1 IFNOR, FFNOR //////////// / MULTIPLIER IS IN OPL / MULTIPLICAND IS IN ACH AND ACM / RESULT LEFT IN MDSET, AC2, AND AC1 MP24, 0 TAD OPL /GET MULTIPLIER (12 BITS) SNA /IS IT ZERO? JMP MP24OUT /YES DCA MP24A TAD ACM /LOW 12 BITS OF MULTIPLICAND MQLMUY MP24A, 0 / *OPL DCA MP24A /GET LO PART IN AC, LINK IS CLEAR MQA TAD AC2 /MAKE FULL PRODUCT DCA AC1 /LINK CONTAINS CARRY RAL /GET POSSIBLE CARRY TAD MP24A ?ADF`iY"PUr\*UEu;ow__ww_F{_}{w]_m?k7n{"ZOLMFPTUCLIDAI NLM YMQM U4P A20 ,/ O P*D L C 2MA 4PE/ALTGPO TA N RC IL,AKI S NL IREC AAM QDT C A 2AA/ KMLFEPLUDR TUO CPL DCA MDSET /HI PRODUCT EXCEPT FOR POSS. CARRY MQA /MAKE MIDDLE 12 BITS TAD AC2 DCA AC2 RAL /GET POSSIBLE CARRY TAD MP24A TAD MDSET DCA MDSET JMPI MP24 MP24OU, DCA AC1 /INSURE PRODUCT IS ALL ZERO JMPI MP24 //////////// / NEGATE FAC FFNEG, 0 TAD ACM CLL CIA DCA ACM CML RAL TAD ACH CLL CIA DCA ACH JMPI FFNEG / CHANGE SIGN OF FAC CHS, 6440 /ENTRY 0005 JMS FFNEG /NEGATE FAC AC0002 TAD CHS /MAKE CIF CDF DCA CHS1 CHS1, HLT /FAST EXIT JMPI CHS# FIXZZ, DCAI (22 MQA /RESTORE AC JMP FRETF PAGE //////////// / DIVIDE ROUTINE FFDIV, JMSI MDSETI /SET UP FOR DIVIDE OPX IN AC CMA IAC /NEGATE EXP. OF OPERAND TAD ACL /ADD EXP. OF FAC DCA ACL /STORE AS FINAL EXP. TAD OPH /NEGATE HI ORDER OP. FOR USE CLL CMA IAC /AS DIVISOR DCA OPH JMS DV24 /DIV. -- (ACH+ACM)/OPH TAD ACM /SAVE QUOT. FOR LATER DCA AC1 TAD OPL SNA CLA JMP DVL2 /AVOID MULTIPLYING BY 0 TAD OPL DCA DVXX /SET UP FOR A MULTIPLY TAD ACM MQLMUY /ACM*OPL DVXX, 0 DCA DVXX MQA /GET LOW IN AC CIA /NEGATE LOW DCA ACM /STORE TAD DVXX /GET HI IN AC SNL /CARRY? IAC /YES TAD AC2 /NEGATE HI ORDER PRODUCT CLL CML CIA TAD ACH /COMPARE WITH REMAINDER OF FIRST SZL /WELL? JMP DVOPS /GREATER THAN REM. -- ADJ. QUOT DCA ACH /OK - DO (REM-(Q*OPL))/OPH DVL3, JMS DV24 /DIVIDE BY OPH DVL1, TAD AC1 /GET QUOT OF FIRST DIV. SMA /IF HI ORDER BIT SET, MUST SHIFT 1 JMP FD /NO, ITS NORMALIZED -- DONE SHR1, CLL ISZ ACM /ROUND AND SHIFT RIGHT ONE SKP IAC /DOUBLE PREC INCREMENT RAR DCA ACH /STORE IN FAC TAD ACM /SHIFT LOW ORDER RIGHT RAR DCA ACM /STORE BACK ISZ ACL /BUMP EXPONENT NOP TAD ACH JMP DVL1# FD, DCA ACH /STORE HIGH ORDER RESULT JMP MDONE DVL2, DCA ACM /COME HERE IF LO QUO=0 JMP DVL3 /SAVE SOME TIME /ROUTINE TO ADJUST QUOTIENT OF FIRST DIVIDE (MAYBE) /WHEN REMAINDER OF THE FIRST DIVIDE IS LESS THAN QUO*OPL DVOPS, CMA IAC /NEGATE AND STORE REVISED REM. DCA ACH CLL TAD OPH TAD ACH /WATCH FOR OVERFLOW SNL JMP DVOP1 /OVERFLOW -- DONT ADJUST QUOT DCA ACH /NO OVRFLW, STORE NEW REM. CMA /SUBTRACT 1 FROM QUOT OF TAD AC1 /FIRST DIVIDE DCA AC1 DVOP1, CLA CLL TAD ACH /GET HI ORD OF REMAINDER SNA /IS IT ZERO? DVOP2, DCA ACM /YES, MAKE WHOLE THING ZERO DCA ACH JMS DV24 /DIVIDE EXTENDED REM BY HI DIVISOR TAD ACM /NEGATE THE RESULT CLL CMA IAC DCA ACM SNL /IF QUOT. IS NON-ZERO, SUBTRACT CMA /ONE FROM HI ORDER QUOT. JMP DVL1 DV24, 0 TAD OPH CIA DCA DV24A /STORE DIVISOR TAD ACM /GET LOW MQL TAD ACH CLL /CLEAR OVRFLO INDICATOR DVI DV24A, 0 DCA ACH /REM SZL /OVRFLO JMP DBAD /YES MQA DCA ACM /QUOTIENT DCA AC2 /RETURN WITH AC2=0 JMPI DV24 DBAD, CALL 1, ERROR ARG DIVZ CLA CLL CMA RAR DCA ACH CLA CLL CMA RAR DCA ACL JMP FRETF MDSETI, MDSET FIXZR, SZL CIA MQL /SAVE AC DCAI (21 JMP FIXZZ /******* END