2005-04-17 02:20:36 +04:00
|
| binstr. s a 3 . 3 1 2 / 1 9 / 9 0
|
|
| Description : Converts a 6 4 - b i t b i n a r y i n t e g e r t o b c d .
|
| Input : 6 4 - bit b i n a r y i n t e g e r i n d2 : d3 , d e s i r e d l e n g t h ( L E N ) i n
| d0 , a n d a p o i n t e r t o s t a r t i n m e m o r y f o r b c d c h a r a c t e r s
| in d0 . ( T h i s p o i n t e r m u s t p o i n t t o b y t e 4 o f t h e f i r s t
| lword o f t h e p a c k e d d e c i m a l m e m o r y s t r i n g . )
|
| Output : LEN b c d d i g i t s r e p r e s e n t i n g t h e 6 4 - b i t i n t e g e r .
|
| Algorithm :
| The 6 4 - b i t b i n a r y i s a s s u m e d t o h a v e a d e c i m a l p o i n t b e f o r e
| bit 6 3 . T h e f r a c t i o n i s m u l t i p l i e d b y 1 0 u s i n g a m u l b y 2
| shift a n d a m u l b y 8 s h i f t . T h e b i t s s h i f t e d o u t o f t h e
| msb f o r m a d e c i m a l d i g i t . T h i s p r o c e s s i s i t e r a t e d u n t i l
| LEN d i g i t s a r e f o r m e d .
|
| A1 . I n i t d7 t o 1 . D 7 i s t h e b y t e d i g i t c o u n t e r , a n d i f 1 , t h e
| digit f o r m e d w i l l b e a s s u m e d t h e l e a s t s i g n i f i c a n t . T h i s i s
| to f o r c e t h e f i r s t b y t e f o r m e d t o h a v e a 0 i n t h e u p p e r 4 b i t s .
|
| A2 . B e g i n n i n g o f t h e l o o p :
| Copy t h e f r a c t i o n i n d2 : d3 t o d4 : d5 .
|
| A3 . M u l t i p l y t h e f r a c t i o n i n d2 : d3 b y 8 u s i n g b i t - f i e l d
| extracts a n d s h i f t s . T h e t h r e e m s b s f r o m d2 w i l l g o i n t o
| d1 .
|
| A4 . M u l t i p l y t h e f r a c t i o n i n d4 : d5 b y 2 u s i n g s h i f t s . T h e m s b
| will b e c o l l e c t e d b y t h e c a r r y .
|
| A5 . A d d u s i n g t h e c a r r y t h e 6 4 - b i t q u a n t i t i e s i n d2 : d3 a n d d4 : d5
| into d2 : d3 . D 1 w i l l c o n t a i n t h e b c d d i g i t f o r m e d .
|
| A6 . T e s t d7 . I f z e r o , t h e d i g i t f o r m e d i s t h e m s d i g i t . I f n o n -
| zero, i t i s t h e l s d i g i t . P u t t h e d i g i t i n i t s p l a c e i n t h e
| upper w o r d o f d0 . I f i t i s t h e l s d i g i t , w r i t e t h e w o r d
| from d0 t o m e m o r y .
|
| A7 . D e c r e m e n t d6 ( L E N c o u n t e r ) a n d r e p e a t t h e l o o p u n t i l z e r o .
|
| Implementation N o t e s :
|
| The r e g i s t e r s a r e u s e d a s f o l l o w s :
|
| d0 : LEN c o u n t e r
| d1 : temp u s e d t o f o r m t h e d i g i t
| d2 : upper 3 2 - b i t s o f f r a c t i o n f o r m u l b y 8
| d3 : lower 3 2 - b i t s o f f r a c t i o n f o r m u l b y 8
| d4 : upper 3 2 - b i t s o f f r a c t i o n f o r m u l b y 2
| d5 : lower 3 2 - b i t s o f f r a c t i o n f o r m u l b y 2
| d6 : temp f o r b i t - f i e l d e x t r a c t s
| d7 : byte d i g i t f o r m a t i o n w o r d ;digit count {0,1}
| a0 : pointer i n t o m e m o r y f o r p a c k e d b c d s t r i n g f o r m a t i o n
|
| Copyright ( C ) M o t o r o l a , I n c . 1 9 9 0
| All R i g h t s R e s e r v e d
|
2006-02-12 04:55:48 +03:00
| For d e t a i l s o n t h e l i c e n s e f o r t h i s f i l e , p l e a s e s e e t h e
| file, R E A D M E , i n t h i s s a m e d i r e c t o r y .
2005-04-17 02:20:36 +04:00
| BINSTR i d n t 2 ,1 | M o t o r o l a 0 4 0 F l o a t i n g P o i n t S o f t w a r e P a c k a g e
| section 8
# include " f p s p . h "
.global binstr
binstr :
moveml % d0 - % d7 ,- ( % a7 )
|
| A1 : Init d7
|
moveql #1 ,% d7 | i n i t d7 f o r s e c o n d d i g i t
subql #1 ,% d0 | f o r d b f d0 w o u l d h a v e L E N + 1 p a s s e s
|
| A2 . C o p y d2 : d3 t o d4 : d5 . S t a r t l o o p .
|
loop :
movel % d2 ,% d4 | c o p y t h e f r a c t i o n b e f o r e m u l s
movel % d3 ,% d5 | t o d4 : d5
|
| A3 . M u l t i p l y d2 : d3 b y 8 ; extract msbs into d1.
|
bfextu % d2 { #0 : #3 } ,% d1 | c o p y 3 m s b s o f d2 i n t o d1
asll #3 ,% d2 | s h i f t d2 l e f t b y 3 p l a c e s
bfextu % d3 { #0 : #3 } ,% d6 | c o p y 3 m s b s o f d3 i n t o d6
asll #3 ,% d3 | s h i f t d3 l e f t b y 3 p l a c e s
orl % d6 ,% d2 | o r i n m s b s f r o m d3 i n t o d2
|
| A4 . M u l t i p l y d4 : d5 b y 2 ; add carry out to d1.
|
asll #1 ,% d5 | m u l d5 b y 2
roxll #1 ,% d4 | m u l d4 b y 2
swap % d6 | p u t 0 i n d6 l o w e r w o r d
addxw % d6 ,% d1 | a d d i n e x t e n d f r o m m u l b y 2
|
| A5 . A d d m u l b y 8 t o m u l b y 2 . D 1 c o n t a i n s t h e d i g i t f o r m e d .
|
addl % d5 ,% d3 | a d d l o w e r 3 2 b i t s
nop | E R R A T A ; FIX #13 (Rev. 1.2 6/6/90)
addxl % d4 ,% d2 | a d d w i t h e x t e n d u p p e r 3 2 b i t s
nop | E R R A T A ; FIX #13 (Rev. 1.2 6/6/90)
addxw % d6 ,% d1 | a d d i n e x t e n d f r o m a d d t o d1
swap % d6 | w i t h d6 = 0 ; put 0 in upper word
|
| A6 . T e s t d7 a n d b r a n c h .
|
tstw % d7 | i f z e r o , s t o r e d i g i t & t o l o o p
beqs f i r s t _ d | i f n o n - z e r o , f o r m b y t e & w r i t e
sec_d :
swap % d7 | b r i n g f i r s t d i g i t t o w o r d d7 b
aslw #4 ,% d7 | f i r s t d i g i t i n u p p e r 4 b i t s d7 b
addw % d1 ,% d7 | a d d i n l s d i g i t t o d7 b
moveb % d7 ,( % a0 ) + | s t o r e d7 b b y t e i n m e m o r y
swap % d7 | p u t L E N c o u n t e r i n w o r d d7 a
clrw % d7 | s e t d7 a t o s i g n a l n o d i g i t s d o n e
dbf % d0 ,l o o p | d o l o o p s o m e m o r e !
bras e n d _ b s t r | f i n i s h e d , s o e x i t
first_d :
swap % d7 | p u t d i g i t w o r d i n d7 b
movew % d1 ,% d7 | p u t n e w d i g i t i n d7 b
swap % d7 | p u t L E N c o u n t e r i n w o r d d7 a
addqw #1 ,% d7 | s e t d7 a t o s i g n a l f i r s t d i g i t d o n e
dbf % d0 ,l o o p | d o l o o p s o m e m o r e !
swap % d7 | p u t l a s t d i g i t i n s t r i n g
lslw #4 ,% d7 | m o v e i t t o u p p e r 4 b i t s
moveb % d7 ,( % a0 ) + | s t o r e i t i n m e m o r y s t r i n g
|
| Clean u p a n d r e t u r n w i t h r e s u l t i n f p0 .
|
end_bstr :
moveml ( % a7 ) + ,% d0 - % d7
rts
| end