Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/packages/basic09/basic09.real.add.68.asm @ 477:7a5d3fcbe2d8
Added Basic09 sources from Curtis Boyle
author | boisy |
---|---|
date | Tue, 08 Oct 2002 03:27:42 +0000 |
parents | |
children |
line wrap: on
line source
* Add for REAL #'s - 6809 version L3FB1 pshs x Preserve X tst 2,y 1st byte of mantissa 0 (means value is 0)? beq L3FC7 Yes, eat temp var & leave other var alone tst 8,y Is original # a 0? bne L3FCB No, go do actual add L3FBB ldd 1,y Copy temp var's value overtop original var (0) std 7,y ldd 3,y std 9,y lda 5,y Copy last byte of mantissa (sign bit) to orig var sta $B,y L3FC7 leay 6,y Eat temp var & return puls pc,x * Real add with non-zero values starts here * NOTE: Exponents are 2^n, with n being the SIGNED exponent byte L3FCB lda 7,y Get 1st exponent suba 1,y Calculate difference in exponents bvc L3FD5 Didn't exceed +127 or -128, skip ahead bpl L3FBB Went too big on plus side, make temp var the answe bra L3FC7 Too small, eat temp var & leave answer alone L3FD5 bmi L3FDD If negative difference in exponents, skip ahead cmpa #31 Difference of exponents within 0-31? ble L3FE5 Yes, go deal with it bra L3FC7 >2^31, out of range so eat temp var & return L3FDD cmpa #-31 Difference of exponents within -1 to -31? blt L3FBB <2^-31, out of range so copy temp to answer ldb 1,y ???Since negative difference, copy temp exponent stb 7,y overtop destination exponent? * As of this point, exponent in temp var no longer needed (A=difference in exp L3FE5 ldb $B,y Get sign of dest. var andb #$01 Keep sign bit only stb ,y Save copy over var type eorb 5,y EOR with sign bit of temp var andb #$01 Keep only merged sign bit stb 1,y Save what resulting sign should be ldb $B,y andb #$FE stb $B,y ldb 5,y andb #$FE stb 5,y tsta Are exponents exactly the same? beq L4031 Yes, skip ahead bpl L4029 Exponent difference positive, go process * Exponent difference is a negative value nega Force to positive leax 6,y Point X to dest. var bsr L4082 Shift mantissa to match other value (into X:D) tst 1,y Result going to be positive? beq L4039 Yes, skip ahead L400B subd 4,y Essentially, X:D=X:D-(2,y) exg d,x * This is essentially a sign reverse on 32 bit #? sbcb 3,y sbca 2,y bcc L404D No borrow required, skip ahead coma Compliment all 4 bytes comb exg d,x coma comb addd #1 +1 exg d,x bcc L4025 If no carry, skip ahead addd #1 +1 to rest of 32 bit # L4025 dec ,y Drop exponent by 1 bra L404D * Exponent difference is positive value L4029 leax ,y Point X to temp var bsr L4082 Shift mantissa to match other value (into X:D) stx 2,y std 4,y * Equal exponents come here L4031 ldx 8,y Get mantissa of dest var into X:D ldd $A,y tst 1,y Check exponent of temp var bne L400B <>0, go process L4039 addd 4,y 32 bit add of X:D + [2,y] exg d,x adcb 3,y adca 2,y bcc L404D No overflow carry after add, skip ahead rora Overflow, divide 32 bit mantissa by 2 rorb exg d,x rora rorb inc 7,y Bump up exponent of dest var by 1 exg d,x L404D tsta bmi L4060 L4050 dec 7,y lbvs L40DD exg d,x lslb rola exg d,x rolb rola bpl L4050 L4060 exg d,x addd #1 exg d,x bcc L4071 addd #1 bcc L4071 rora inc 7,y L4071 std 8,y tfr x,d andb #$FE Mask out sign bit in mantissa (force to positive) tst ,y Result supposed to be negative? beq L407C No, leave it alone incb Set sign bit (negative result) L407C std $A,y Save LSW of mantissa leay 6,y Eat temp var puls pc,x Restore X & return * Entry: A=ABS(difference between exponents) * Y=Ptr to temp var packet\ These could be swapped depending on whether * X=Ptr to dest var packet/ exponent difference is positive or negative * Exit: X:D is 32 bit shifted mantissa L4082 suba #16 Subtract 16 from exponent difference (2 byte shift blo L40A0 Wrapped to negative, skip ahead suba #8 Try subtracting 8 from it blo L4091 Wrapped, go add it back in * 3 byte minimum shift sta <u0014 Save number of rotates needed after 3 byte move clra D=High word of mantissa ldb 2,x bra L4097 Go get Low word of mantissa into X & process * 2 byte minimum shift L4091 adda #8 Bump # shifts back up sta <u0014 Save number of rotates needed ldd 2,x D= L4097 ldx #0 tst <u0014 Any shifts required? bne L40BD Yes, go do them rts No, return L40A0 adda #8 Add 8 back (back to 1 byte shift) bhs L40B3 Still more left, skip ahead sta <u0014 clra ldb 2,x ldx 3,x tst <u0014 Any shifts to do? bne L40BF Yes, go do exg d,x rts L40B3 adda #8 Add 8 back again (back to original difference) sta <u0014 Save # bit shifts needed ldd 2,x Get 32 bit mantissa into D:X from dest var ldx 4,x bra L40BF Go perform shift * NOTE: BY LOOKS OF IT MOST OF THESE D,X PAIRS CAN BE CHANGED TO D,W (Q) PAIRS * ELIMINATING ALL THE EXCHANGES AND SPEEDING UP REAL CALCS BY QUITE A BIT L40BD exg d,x L40BF lsra rorb exg d,x rora rorb dec <u0014 bne L40BD L40C9 rts