Home | History | Annotate | Line # | Download | only in fpsp
binstr.sa revision 1.1
      1 *	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      2 *	M68000 Hi-Performance Microprocessor Division
      3 *	M68040 Software Package 
      4 *
      5 *	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
      6 *	All rights reserved.
      7 *
      8 *	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
      9 *	To the maximum extent permitted by applicable law,
     10 *	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     11 *	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
     12 *	PARTICULAR PURPOSE and any warranty against infringement with
     13 *	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     14 *	and any accompanying written materials. 
     15 *
     16 *	To the maximum extent permitted by applicable law,
     17 *	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     18 *	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
     19 *	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
     20 *	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
     21 *	SOFTWARE.  Motorola assumes no responsibility for the maintenance
     22 *	and support of the SOFTWARE.  
     23 *
     24 *	You are hereby granted a copyright license to use, modify, and
     25 *	distribute the SOFTWARE so long as this entire notice is retained
     26 *	without alteration in any modified and/or redistributed versions,
     27 *	and that such modified versions are clearly identified as such.
     28 *	No licenses are granted by implication, estoppel or otherwise
     29 *	under any patents or trademarks of Motorola, Inc.
     30 
     31 *
     32 *	binstr.sa 3.3 12/19/90
     33 *
     34 *
     35 *	Description: Converts a 64-bit binary integer to bcd.
     36 *
     37 *	Input: 64-bit binary integer in d2:d3, desired length (LEN) in
     38 *          d0, and a  pointer to start in memory for bcd characters
     39 *          in d0. (This pointer must point to byte 4 of the first
     40 *          lword of the packed decimal memory string.)
     41 *
     42 *	Output:	LEN bcd digits representing the 64-bit integer.
     43 *
     44 *	Algorithm:
     45 *		The 64-bit binary is assumed to have a decimal point before
     46 *		bit 63.  The fraction is multiplied by 10 using a mul by 2
     47 *		shift and a mul by 8 shift.  The bits shifted out of the
     48 *		msb form a decimal digit.  This process is iterated until
     49 *		LEN digits are formed.
     50 *
     51 *	A1. Init d7 to 1.  D7 is the byte digit counter, and if 1, the
     52 *		digit formed will be assumed the least significant.  This is
     53 *		to force the first byte formed to have a 0 in the upper 4 bits.
     54 *
     55 *	A2. Beginning of the loop:
     56 *		Copy the fraction in d2:d3 to d4:d5.
     57 *
     58 *	A3. Multiply the fraction in d2:d3 by 8 using bit-field
     59 *		extracts and shifts.  The three msbs from d2 will go into
     60 *		d1.
     61 *
     62 *	A4. Multiply the fraction in d4:d5 by 2 using shifts.  The msb
     63 *		will be collected by the carry.
     64 *
     65 *	A5. Add using the carry the 64-bit quantities in d2:d3 and d4:d5
     66 *		into d2:d3.  D1 will contain the bcd digit formed.
     67 *
     68 *	A6. Test d7.  If zero, the digit formed is the ms digit.  If non-
     69 *		zero, it is the ls digit.  Put the digit in its place in the
     70 *		upper word of d0.  If it is the ls digit, write the word
     71 *		from d0 to memory.
     72 *
     73 *	A7. Decrement d6 (LEN counter) and repeat the loop until zero.
     74 *
     75 *	Implementation Notes:
     76 *
     77 *	The registers are used as follows:
     78 *
     79 *		d0: LEN counter
     80 *		d1: temp used to form the digit
     81 *		d2: upper 32-bits of fraction for mul by 8
     82 *		d3: lower 32-bits of fraction for mul by 8
     83 *		d4: upper 32-bits of fraction for mul by 2
     84 *		d5: lower 32-bits of fraction for mul by 2
     85 *		d6: temp for bit-field extracts
     86 *		d7: byte digit formation word;digit count {0,1}
     87 *		a0: pointer into memory for packed bcd string formation
     88 *
     89 
     90 BINSTR    IDNT    2,1 Motorola 040 Floating Point Software Package
     91 
     92 	section	8
     93 
     94 	include	fpsp.h
     95 
     96 	xdef	binstr
     97 binstr:
     98 	movem.l	d0-d7,-(a7)
     99 *
    100 * A1: Init d7
    101 *
    102 	moveq.l	#1,d7			;init d7 for second digit
    103 	subq.l	#1,d0			;for dbf d0 would have LEN+1 passes
    104 *
    105 * A2. Copy d2:d3 to d4:d5.  Start loop.
    106 *
    107 loop:
    108 	move.l	d2,d4			;copy the fraction before muls
    109 	move.l	d3,d5			;to d4:d5
    110 *
    111 * A3. Multiply d2:d3 by 8; extract msbs into d1.
    112 *
    113 	bfextu	d2{0:3},d1		;copy 3 msbs of d2 into d1
    114 	asl.l	#3,d2			;shift d2 left by 3 places
    115 	bfextu	d3{0:3},d6		;copy 3 msbs of d3 into d6
    116 	asl.l	#3,d3			;shift d3 left by 3 places
    117 	or.l	d6,d2			;or in msbs from d3 into d2
    118 *
    119 * A4. Multiply d4:d5 by 2; add carry out to d1.
    120 *
    121 	asl.l	#1,d5			;mul d5 by 2
    122 	roxl.l	#1,d4			;mul d4 by 2
    123 	swap	d6			;put 0 in d6 lower word
    124 	addx.w	d6,d1			;add in extend from mul by 2
    125 *
    126 * A5. Add mul by 8 to mul by 2.  D1 contains the digit formed.
    127 *
    128 	add.l	d5,d3			;add lower 32 bits
    129 	nop				;ERRATA FIX #13 (Rev. 1.2 6/6/90)
    130 	addx.l	d4,d2			;add with extend upper 32 bits
    131 	nop				;ERRATA FIX #13 (Rev. 1.2 6/6/90)
    132 	addx.w	d6,d1			;add in extend from add to d1
    133 	swap	d6			;with d6 = 0; put 0 in upper word
    134 *
    135 * A6. Test d7 and branch.
    136 *
    137 	tst.w	d7			;if zero, store digit & to loop
    138 	beq.b	first_d			;if non-zero, form byte & write
    139 sec_d:
    140 	swap	d7			;bring first digit to word d7b
    141 	asl.w	#4,d7			;first digit in upper 4 bits d7b
    142 	add.w	d1,d7			;add in ls digit to d7b
    143 	move.b	d7,(a0)+		;store d7b byte in memory
    144 	swap	d7			;put LEN counter in word d7a
    145 	clr.w	d7			;set d7a to signal no digits done
    146 	dbf.w	d0,loop			;do loop some more!
    147 	bra.b	end_bstr		;finished, so exit
    148 first_d:
    149 	swap	d7			;put digit word in d7b
    150 	move.w	d1,d7			;put new digit in d7b
    151 	swap	d7			;put LEN counter in word d7a
    152 	addq.w	#1,d7			;set d7a to signal first digit done
    153 	dbf.w	d0,loop			;do loop some more!
    154 	swap	d7			;put last digit in string
    155 	lsl.w	#4,d7			;move it to upper 4 bits
    156 	move.b	d7,(a0)+		;store it in memory string
    157 *
    158 * Clean up and return with result in fp0.
    159 *
    160 end_bstr:
    161 	movem.l	(a7)+,d0-d7
    162 	rts
    163 	end
    164