2005-04-17 02:20:36 +04:00
|
| gen_ e x c e p t . s a 3 . 7 1 / 1 6 / 9 2
|
| gen_ e x c e p t - - - F P S P r o u t i n e t o d e t e c t r e p o r t a b l e e x c e p t i o n s
|
| This r o u t i n e c o m p a r e s t h e e x c e p t i o n e n a b l e b y t e o f t h e
| user_ f p c r o n t h e s t a c k w i t h t h e e x c e p t i o n s t a t u s b y t e
| of t h e u s e r _ f p s r .
|
| Any r o u t i n e w h i c h m a y r e p o r t a n e x c e p t i o n s m u s t l o a d
| the s t a c k f r a m e i n m e m o r y w i t h t h e e x c e p t i o n a l o p e r a n d ( s ) .
|
| Priority f o r e x c e p t i o n s i s :
|
| Highest : bsun
| snan
| operr
| ovfl
| unfl
| dz
| inex2
| Lowest : inex1
|
| Note : The I E E E s t a n d a r d s p e c i f i e s t h a t i n e x2 i s t o b e
| reported i f o v f l o c c u r s a n d t h e o v f l e n a b l e b i t i s n o t
| set b u t t h e i n e x2 e n a b l e b i t i s .
|
|
| 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
GEN_EXCEPT : | idnt 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 "
| xref r e a l _ t r a c e
| xref f p s p _ d o n e
| xref f p s p _ f m t _ e r r o r
exc_tbl :
.long bsun_exc
.long commonE1
.long commonE1
.long ovfl_unfl
.long ovfl_unfl
.long commonE1
.long commonE3
.long commonE3
.long no_match
.global gen_except
gen_except :
cmpib #I D L E _ S I Z E - 4 ,1 ( % a7 ) | t e s t f o r i d l e f r a m e
beq d o _ c h e c k | g o h a n d l e i d l e f r a m e
cmpib #U N I M P _ 40 _ S I Z E - 4 ,1 ( % a7 ) | t e s t f o r o r i g u n i m p f r a m e
beqs u n i m p _ x | g o h a n d l e u n i m p f r a m e
cmpib #U N I M P _ 41 _ S I Z E - 4 ,1 ( % a7 ) | t e s t f o r r e v u n i m p f r a m e
beqs u n i m p _ x | g o h a n d l e u n i m p f r a m e
cmpib #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | i f s i z e < > $ 6 0 , f m t e r r o r
bnel f p s p _ f m t _ e r r o r
leal B U S Y _ S I Z E + L O C A L _ S I Z E ( % a7 ) ,% a1 | i n i t a1 s o f p s p . h
| ;equates will work
| Fix u p t h e n e w b u s y f r a m e w i t h e n t r i e s f r o m t h e u n i m p f r a m e
|
movel E T E M P _ E X ( % a6 ) ,E T E M P _ E X ( % a1 ) | c o p y e t e m p f r o m u n i m p
movel E T E M P _ H I ( % a6 ) ,E T E M P _ H I ( % a1 ) | f r a m e t o b u s y f r a m e
movel E T E M P _ L O ( % a6 ) ,E T E M P _ L O ( % a1 )
movel C M D R E G 1 B ( % a6 ) ,C M D R E G 1 B ( % a1 ) | s e t i n s t i n f r a m e t o u n i m p
movel C M D R E G 1 B ( % a6 ) ,% d0 | f i x c m d1 b t o m a k e i t
andl #0x03c30000 ,% d0 | w o r k f o r c m d3 b
bfextu C M D R E G 1 B ( % a6 ) { #13 : #1 } ,% d1 | e x t r a c t b i t 2
lsll #5 ,% d1
swap % d1
orl % d1 ,% d0 | p u t i t i n t h e r i g h t p l a c e
bfextu C M D R E G 1 B ( % a6 ) { #10 : #3 } ,% d1 | e x t r a c t b i t 3 ,4 ,5
lsll #2 ,% d1
swap % d1
orl % d1 ,% d0 | p u t t h e m i n t h e r i g h t p l a c e
movel % d0 ,C M D R E G 3 B ( % a1 ) | i n t h e b u s y f r a m e
|
| Or i n t h e F P S R f r o m t h e e m u l a t i o n w i t h t h e U S E R _ F P S R o n t h e s t a c k .
|
fmovel % F P S R ,% d0
orl % d0 ,U S E R _ F P S R ( % a6 )
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a1 ) | s e t e x c b i t s
orl #s x _ m a s k , E _ B Y T E ( % a 1 )
bra d o _ c l e a n
|
| Frame i s a n u n i m p f r a m e p o s s i b l e r e s u l t i n g f r o m a n f m o v e < e a > ,f p0
| that c a u s e d a n e x c e p t i o n
|
| a1 i s m o d i f i e d t o p o i n t i n t o t h e n e w f r a m e a l l o w i n g f p s p e q u a t e s
| to b e v a l i d .
|
unimp_x :
cmpib #U N I M P _ 40 _ S I Z E - 4 ,1 ( % a7 ) | t e s t f o r o r i g u n i m p f r a m e
bnes t e s t _ r e v
leal U N I M P _ 4 0 _ S I Z E + L O C A L _ S I Z E ( % a7 ) ,% a1
bras u n i m p _ c o n
test_rev :
cmpib #U N I M P _ 41 _ S I Z E - 4 ,1 ( % a7 ) | t e s t f o r r e v u n i m p f r a m e
bnel f p s p _ f m t _ e r r o r | i f n o t $ 2 8 o r $ 3 0
leal U N I M P _ 4 1 _ S I Z E + L O C A L _ S I Z E ( % a7 ) ,% a1
unimp_con :
|
| Fix u p t h e n e w u n i m p f r a m e w i t h e n t r i e s f r o m t h e o l d u n i m p f r a m e
|
movel C M D R E G 1 B ( % a6 ) ,C M D R E G 1 B ( % a1 ) | s e t i n s t i n f r a m e t o u n i m p
|
| Or i n t h e F P S R f r o m t h e e m u l a t i o n w i t h t h e U S E R _ F P S R o n t h e s t a c k .
|
fmovel % F P S R ,% d0
orl % d0 ,U S E R _ F P S R ( % a6 )
bra d o _ c l e a n
|
| Frame i s i d l e , s o c h e c k f o r e x c e p t i o n s r e p o r t e d t h r o u g h
| USER_ F P S R a n d s e t t h e u n i m p f r a m e a c c o r d i n g l y .
| A7 m u s t b e i n c r e m e n t e d t o t h e p o i n t b e f o r e t h e
| idle f s a v e v e c t o r t o t h e u n i m p v e c t o r .
|
do_check :
addl #4 ,% a7 | p o i n t A 7 b a c k t o u n i m p f r a m e
|
| Or i n t h e F P S R f r o m t h e e m u l a t i o n w i t h t h e U S E R _ F P S R o n t h e s t a c k .
|
fmovel % F P S R ,% d0
orl % d0 ,U S E R _ F P S R ( % a6 )
|
| On a b u s y f r a m e , w e m u s t c l e a r t h e n m n e x c b i t s .
|
cmpib #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | c h e c k f r a m e t y p e
bnes c h e c k _ f r | i f b u s y , c l r n m n e x c
clrw N M N E X C ( % a6 ) | c l r n m n e x c & n m c e x c
btstb #5 ,C M D R E G 1 B ( % a6 ) | t e s t f o r f m o v e o u t
bnes f r a m e _ c o m
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a6 ) | s e t e x c b i t s
orl #s x _ m a s k , E _ B Y T E ( % a 6 )
bras f r a m e _ c o m
check_fr :
cmpb #U N I M P _ 40 _ S I Z E - 4 ,1 ( % a7 )
beqs f r a m e _ c o m
clrw N M N E X C ( % a6 )
frame_com :
moveb F P C R _ E N A B L E ( % a6 ) ,% d0 | g e t f p c r e n a b l e b y t e
andb F P S R _ E X C E P T ( % a6 ) ,% d0 | a n d i n t h e f p s r e x c b y t e
bfffo % d0 { #24 : #8 } ,% d1 | t e s t f o r f i r s t s e t b i t
leal e x c _ t b l ,% a0 | l o a d j m p t a b l e a d d r e s s
subib #24 ,% d1 | n o r m a l i z e b i t o f f s e t t o 0 - 8
movel ( % a0 ,% d1 . w * 4 ) ,% a0 | l o a d r o u t i n e a d d r e s s b a s e d
| ;based on first enabled exc
jmp ( % a0 ) | j u m p t o r o u t i n e
|
| Bsun i s n o t p o s s i b l e i n u n i m p o r u n s u p p
|
bsun_exc :
bra d o _ c l e a n
|
| The t y p i c a l w o r k t o b e d o n e t o t h e u n i m p f r a m e t o r e p o r t a n
| exception i s t o s e t t h e E 1 / E 3 b y t e a n d c l r t h e U f l a g .
| commonE1 d o e s t h i s f o r E 1 e x c e p t i o n s , w h i c h a r e s n a n ,
| operr, a n d d z . c o m m o n E 3 d o e s t h i s f o r E 3 e x c e p t i o n s , w h i c h
| are i n e x2 a n d i n e x1 , a n d a l s o c l e a r s t h e E 1 e x c e p t i o n b i t
| left o v e r f r o m t h e u n i m p e x c e p t i o n .
|
commonE1 :
bsetb #E 1 ,E _ B Y T E ( % a6 ) | s e t E 1 f l a g
bra c o m m o n E | g o c l e a n a n d e x i t
commonE3 :
tstb U F L G _ T M P ( % a6 ) | t e s t f l a g f o r u n s u p / u n i m p s t a t e
bnes u n s E 3
uniE3 :
bsetb #E 3 ,E _ B Y T E ( % a6 ) | s e t E 3 f l a g
bclrb #E 1 ,E _ B Y T E ( % a6 ) | c l r E 1 f r o m u n i m p
bra c o m m o n E
unsE3 :
tstb R E S _ F L G ( % a6 )
bnes u n s E 3 _ 0
unsE3_1 :
bsetb #E 3 ,E _ B Y T E ( % a6 ) | s e t E 3 f l a g
unsE3_0 :
bclrb #E 1 ,E _ B Y T E ( % a6 ) | c l r E 1 f l a g
movel C M D R E G 1 B ( % a6 ) ,% d0
andl #0x03c30000 ,% d0 | w o r k f o r c m d3 b
bfextu C M D R E G 1 B ( % a6 ) { #13 : #1 } ,% d1 | e x t r a c t b i t 2
lsll #5 ,% d1
swap % d1
orl % d1 ,% d0 | p u t i t i n t h e r i g h t p l a c e
bfextu C M D R E G 1 B ( % a6 ) { #10 : #3 } ,% d1 | e x t r a c t b i t 3 ,4 ,5
lsll #2 ,% d1
swap % d1
orl % d1 ,% d0 | p u t t h e m i n t h e r i g h t p l a c e
movel % d0 ,C M D R E G 3 B ( % a6 ) | i n t h e b u s y f r a m e
commonE :
bclrb #U F L A G , T _ B Y T E ( % a 6 ) | c l r U f l a g f r o m u n i m p
bra d o _ c l e a n | g o c l e a n a n d e x i t
|
| No b i t s i n t h e e n a b l e b y t e m a t c h e x i s t i n g e x c e p t i o n s . C h e c k f o r
| the c a s e o f t h e o v f l e x c w i t h o u t t h e o v f l e n a b l e d , b u t w i t h
| inex2 e n a b l e d .
|
no_match :
btstb #i n e x 2 _ b i t ,F P C R _ E N A B L E ( % a6 ) | c h e c k f o r o v f l / i n e x2 c a s e
beqs n o _ e x c | i f c l e a r , e x i t
btstb #o v f l _ b i t , F P S R _ E X C E P T ( % a 6 ) | n o w c h e c k o v f l
beqs n o _ e x c | i f c l e a r , e x i t
bras o v f l _ u n f l | g o t o u n f l _ o v f l t o d e t e r m i n e i f
| ;it is an unsupp or unimp exc
| No e x c e p t i o n s a r e t o b e r e p o r t e d . I f t h e i n s t r u c t i o n w a s
| unimplemented, n o F P U r e s t o r e i s n e c e s s a r y . I f i t w a s
| unsupported, w e m u s t p e r f o r m t h e r e s t o r e .
no_exc :
tstb U F L G _ T M P ( % a6 ) | t e s t f l a g f o r u n s u p p / u n i m p s t a t e
beqs u n i _ n o _ e x c
uns_no_exc :
tstb R E S _ F L G ( % a6 ) | c h e c k i f f r e s t o r e i s n e e d e d
bne d o _ c l e a n | i f c l e a r , n o f r e s t o r e n e e d e d
uni_no_exc :
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
unlk % a6
bra f i n i s h _ u p
|
| Unsupported D a t a T y p e H a n d l e r :
| Ovfl :
| An f m o v e o u t t h a t r e s u l t s i n a n o v e r f l o w i s r e p o r t e d t h i s w a y .
| Unfl :
| An f m o v e o u t t h a t r e s u l t s i n a n u n d e r f l o w i s r e p o r t e d t h i s w a y .
|
| Unimplemented I n s t r u c t i o n H a n d l e r :
| Ovfl :
| Only s c o s h , s e t o x , s s i n h , s t w o t o x , a n d s c a l e c a n s e t o v e r f l o w i n
| this m a n n e r .
| Unfl :
| Stwotox, s e t o x , a n d s c a l e c a n s e t u n d e r f l o w i n t h i s m a n n e r .
| Any o f t h e o t h e r L i b r a r y R o u t i n e s s u c h t h a t f ( x ) =x i n w h i c h
| x i s a n e x t e n d e d d e n o r m c a n r e p o r t a n u n d e r f l o w e x c e p t i o n .
| It i s t h e r e s p o n s i b i l i t y o f t h e e x c e p t i o n - c a u s i n g e x c e p t i o n
| to m a k e s u r e t h a t W B T E M P i s c o r r e c t .
|
| The e x c e p t i o n a l o p e r a n d i s i n F P _ S C R 1 .
|
ovfl_unfl :
tstb U F L G _ T M P ( % a6 ) | t e s t f l a g f o r u n s u p p / u n i m p s t a t e
beqs o f u f _ c o n
|
| The c a l l e r w a s f r o m a n u n s u p p o r t e d d a t a t y p e t r a p . T e s t i f t h e
| caller s e t C U _ O N L Y . I f s o , t h e e x c e p t i o n a l o p e r a n d i s e x p e c t e d i n
| FPTEMP, r a t h e r t h a n W B T E M P .
|
tstb C U _ O N L Y ( % a6 ) | t e s t i f i n s t i s c u - o n l y
beq u n s E 3
| move. w #$ f e , C U _ S A V E P C ( % a 6 )
clrb C U _ S A V E P C ( % a6 )
bsetb #E 1 ,E _ B Y T E ( % a6 ) | s e t E 1 e x c e p t i o n f l a g
movew E T E M P _ E X ( % a6 ) ,F P T E M P _ E X ( % a6 )
movel E T E M P _ H I ( % a6 ) ,F P T E M P _ H I ( % a6 )
movel E T E M P _ L O ( % a6 ) ,F P T E M P _ L O ( % a6 )
bsetb #f p t e m p 15 _ b i t ,D T A G ( % a6 ) | s e t f p t e 1 5
bclrb #U F L A G , T _ B Y T E ( % a 6 ) | c l r U f l a g f r o m u n i m p
bra d o _ c l e a n | g o c l e a n a n d e x i t
ofuf_con :
moveb ( % a7 ) ,V E R _ T M P ( % a6 ) | s a v e v e r s i o n n u m b e r
cmpib #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | c h e c k f o r b u s y f r a m e
beqs b u s y _ f r | i f u n i m p , g r o w t o b u s y
cmpib #V E R _ 40 ,( % a7 ) | t e s t f o r o r i g u n i m p f r a m e
bnes t r y _ 4 1 | i f n o t , t e s t f o r r e v f r a m e
moveql #13 ,% d0 | n e e d t o z e r o 1 4 l w o r d s
bras o f u f _ f i n
try_41 :
cmpib #V E R _ 41 ,( % a7 ) | t e s t f o r r e v u n i m p f r a m e
bnel f p s p _ f m t _ e r r o r | i f n e i t h e r , e x i t w i t h e r r o r
moveql #11 ,% d0 | n e e d t o z e r o 1 2 l w o r d s
ofuf_fin :
clrl ( % a7 )
loop1 :
clrl - ( % a7 ) | c l e a r a n d d e c a7
dbra % d0 ,l o o p1
moveb V E R _ T M P ( % a6 ) ,( % a7 )
moveb #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | w r i t e b u s y f m t w o r d .
busy_fr :
movel F P _ S C R 1 ( % a6 ) ,W B T E M P _ E X ( % a6 ) | w r i t e
movel F P _ S C R 1 + 4 ( % a6 ) ,W B T E M P _ H I ( % a6 ) | e x c e p t i o n a l o p t o
movel F P _ S C R 1 + 8 ( % a6 ) ,W B T E M P _ L O ( % a6 ) | w b t e m p
bsetb #E 3 ,E _ B Y T E ( % a6 ) | s e t E 3 f l a g
bclrb #E 1 ,E _ B Y T E ( % a6 ) | m a k e s u r e E 1 i s c l e a r
bclrb #U F L A G , T _ B Y T E ( % a 6 ) | c l r U f l a g
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a6 )
orl #s x _ m a s k , E _ B Y T E ( % a 6 )
movel C M D R E G 1 B ( % a6 ) ,% d0 | f i x c m d1 b t o m a k e i t
andl #0x03c30000 ,% d0 | w o r k f o r c m d3 b
bfextu C M D R E G 1 B ( % a6 ) { #13 : #1 } ,% d1 | e x t r a c t b i t 2
lsll #5 ,% d1
swap % d1
orl % d1 ,% d0 | p u t i t i n t h e r i g h t p l a c e
bfextu C M D R E G 1 B ( % a6 ) { #10 : #3 } ,% d1 | e x t r a c t b i t 3 ,4 ,5
lsll #2 ,% d1
swap % d1
orl % d1 ,% d0 | p u t t h e m i n t h e r i g h t p l a c e
movel % d0 ,C M D R E G 3 B ( % a6 ) | i n t h e b u s y f r a m e
|
| Check i f t h e f r a m e t o b e r e s t o r e d i s b u s y o r u n i m p .
| * * NOTE * * * B u g f i x f o r e r r a t a ( 0 d43 b #3 )
| If t h e f r a m e i s u n i m p , w e m u s t c r e a t e a b u s y f r a m e t o
| fix t h e b u g w i t h t h e n m n e x c b i t s i n c a s e s i n w h i c h t h e y
| are s e t b y a p r e v i o u s i n s t r u c t i o n a n d n o t c l e a r e d b y
| the s a v e . T h e f r a m e w i l l b e u n i m p o n l y i f t h e f i n a l
| instruction i n a n e m u l a t i o n r o u t i n e c a u s e d t h e e x c e p t i o n
| by d o i n g a n f m o v e < e a > ,f p0 . T h e e x c e p t i o n o p e r a n d , i n
| internal f o r m a t , i s i n f p t e m p .
|
do_clean :
cmpib #U N I M P _ 40 _ S I Z E - 4 ,1 ( % a7 )
bnes d o _ c o n
moveql #13 ,% d0 | i n o r i g , n e e d t o z e r o 1 4 l w o r d s
bras d o _ b u i l d
do_con :
cmpib #U N I M P _ 41 _ S I Z E - 4 ,1 ( % a7 )
bnes d o _ r e s t o r e | f r a m e m u s t b e b u s y
moveql #11 ,% d0 | i n r e v , n e e d t o z e r o 1 2 l w o r d s
do_build :
moveb ( % a7 ) ,V E R _ T M P ( % a6 )
clrl ( % a7 )
loop2 :
clrl - ( % a7 ) | c l e a r a n d d e c a7
dbra % d0 ,l o o p2
|
| Use a1 a s p o i n t e r i n t o n e w f r a m e . a6 i s n o t c o r r e c t i f a n u n i m p o r
| busy f r a m e w a s c r e a t e d a s t h e r e s u l t o f a n e x c e p t i o n o n t h e f i n a l
| instruction o f a n e m u l a t i o n r o u t i n e .
|
| We n e e d t o s e t t h e n m c e x c b i t s i f t h e e x c e p t i o n i s E 1 . O t h e r w i s e ,
| the e x c t a k e n w i l l b e i n e x2 .
|
leal B U S Y _ S I Z E + L O C A L _ S I Z E ( % a7 ) ,% a1 | i n i t a1 f o r n e w f r a m e
moveb V E R _ T M P ( % a6 ) ,( % a7 ) | w r i t e b u s y f m t w o r d
moveb #B U S Y _ S I Z E - 4 ,1 ( % a7 )
movel F P _ S C R 1 ( % a6 ) ,W B T E M P _ E X ( % a1 ) | w r i t e
movel F P _ S C R 1 + 4 ( % a6 ) ,W B T E M P _ H I ( % a1 ) | e x c e p t i o n a l o p t o
movel F P _ S C R 1 + 8 ( % a6 ) ,W B T E M P _ L O ( % a1 ) | w b t e m p
| btst. b #E 1 ,E _ B Y T E ( % a1 )
| beq. b d o _ r e s t o r e
bfextu U S E R _ F P S R ( % a6 ) { #17 : #4 } ,% d0 | g e t s n a n / o p e r r / o v f l / u n f l b i t s
bfins % d0 ,N M C E X C ( % a1 ) { #4 : #4 } | a n d i n s e r t t h e m i n n m c e x c
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a1 ) | s e t e x c b i t s
orl #s x _ m a s k , E _ B Y T E ( % a 1 )
do_restore :
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
frestore ( % a7 ) +
tstb R E S _ F L G ( % a6 ) | R E S _ F L G i n d i c a t e s a " c o n t i n u a t i o n " f r a m e
beq c o n t
bsr b u g 1 3 8 4
cont :
unlk % a6
|
| If t r a c e m o d e e n a b l e d , t h e n g o t o t r a c e h a n d l e r . T h i s h a n d l e r
| cannot h a v e a n y f p i n s t r u c t i o n s . I f t h e r e a r e f p i n s t ' s a n d a n
| exception h a s b e e n r e s t o r e d i n t o t h e m a c h i n e t h e n t h e e x c e p t i o n
| will o c c u r u p o n e x e c u t i o n o f t h e f p i n s t . T h i s i s n o t d e s i r a b l e
| in t h e k e r n e l ( s u p e r v i s o r m o d e ) . S e e M C 6 8 0 4 0 m a n u a l S e c t i o n 9 . 3 . 8 .
|
finish_up :
btstb #7 ,( % a7 ) | t e s t T 1 i n S R
bnes g _ t r a c e
btstb #6 ,( % a7 ) | t e s t T 0 i n S R
bnes g _ t r a c e
bral f p s p _ d o n e
|
| Change i n t e g e r s t a c k t o l o o k l i k e t r a c e s t a c k
| The a d d r e s s o f t h e i n s t r u c t i o n t h a t c a u s e d t h e
| exception i s a l r e a d y i n t h e i n t e g e r s t a c k ( i s
| the s a m e a s t h e s a v e d f r i a r )
|
| If t h e c u r r e n t f r a m e i s a l r e a d y a 6 - w o r d s t a c k t h e n a l l
| that n e e d s t o b e d o n e i s t o c h a n g e t h e v e c t o r # t o T R A C E .
| If t h e f r a m e i s o n l y a 4 - w o r d s t a c k ( m e a n i n g w e g o t h e r e
| on a n U n s u p p o r t e d d a t a t y p e e x c e p t i o n ) , t h e n w e n e e d t o g r o w
| the s t a c k a n e x t r a 2 w o r d s a n d g e t t h e F P I A R f r o m t h e F P U .
|
g_trace :
bftst E X C _ V E C - 4 ( % s p ) { #0 : #4 }
bne g _ e a s y
subw #4 ,% s p | m a k e r o o m
movel 4 ( % s p ) ,( % s p )
movel 8 ( % s p ) ,4 ( % s p )
subw #B U S Y _ S I Z E , % s p
fsave ( % s p )
fmovel % f p i a r ,B U S Y _ S I Z E + E X C _ E A - 4 ( % s p )
frestore ( % s p )
addw #B U S Y _ S I Z E , % s p
g_easy :
movew #T R A C E _ V E C , E X C _ V E C - 4 ( % a7 )
bral r e a l _ t r a c e
|
| This i s a w o r k - a r o u n d f o r h a r d w a r e b u g 1 3 8 4 .
|
bug1384 :
link % a5 ,#0
fsave - ( % s p )
cmpib #0x41 ,( % s p ) | c h e c k f o r c o r r e c t f r a m e
beq f r a m e _ 4 1
bgt n o f i x | i f m o r e a d v a n c e d m a s k , d o n a d a
frame_40 :
tstb 1 ( % s p ) | c h e c k t o s e e i f i d l e
bne n o t i d l e
idle40 :
clrl ( % s p ) | g e t r i d o f o l d f s a v e f r a m e
movel % d1 ,U S E R _ D 1 ( % a6 ) | s a v e d1
movew #8 ,% d1 | p l a c e u n i m p f r a m e i n s t e a d
loop40 : clrl - ( % s p )
dbra % d1 ,l o o p40
movel U S E R _ D 1 ( % a6 ) ,% d1 | r e s t o r e d1
movel #0x40280000 ,- ( % s p )
frestore ( % s p ) +
unlk % a5
rts
frame_41 :
tstb 1 ( % s p ) | c h e c k t o s e e i f i d l e
bne n o t i d l e
idle41 :
clrl ( % s p ) | g e t r i d o f o l d f s a v e f r a m e
movel % d1 ,U S E R _ D 1 ( % a6 ) | s a v e d1
movew #10 ,% d1 | p l a c e u n i m p f r a m e i n s t e a d
loop41 : clrl - ( % s p )
dbra % d1 ,l o o p41
movel U S E R _ D 1 ( % a6 ) ,% d1 | r e s t o r e d1
movel #0x41300000 ,- ( % s p )
frestore ( % s p ) +
unlk % a5
rts
notidle :
bclrb #e t e m p 15 _ b i t ,- 4 0 ( % a5 )
frestore ( % s p ) +
unlk % a5
rts
nofix :
frestore ( % s p ) +
unlk % a5
rts
| end