2005-04-17 02:20:36 +04:00
|
| bugfix. s a 3 . 2 1 / 3 1 / 9 1
|
|
| This f i l e c o n t a i n s w o r k a r o u n d s f o r b u g s i n t h e 0 4 0
| relating t o t h e 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 ( F P S P )
|
| Fixes f o r b u g s : 1 2 3 8
|
| Bug : 1 2 3 8
|
|
| / * The f o l l o w i n g d i r t y _ b i t c l e a r s h o u l d b e l e f t i n
| * the h a n d l e r p e r m a n e n t l y t o i m p r o v e t h r o u g h p u t .
| * The d i r t y _ b i t s a r e l o c a t e d a t b i t s [ 2 3 : 1 6 ] i n
| * longword $ 0 8 i n t h e b u s y f r a m e $ 4 x60 . B i t 1 6
| * corresponds t o F P 0 , b i t 1 7 c o r r e s p o n d s t o F P 1 ,
| * and s o o n .
| * /
| if ( E 3 _ e x c e p t i o n _ j u s t _ s e r v i c e d ) {
| dirty_ b i t [ c m d r e g 3 b [ 9 : 7 ] ] = 0 ;
| }
|
| if ( f s a v e _ f o r m a t _ v e r s i o n ! = $ 4 0 ) { g o t o N O F I X }
|
| if ! ( E 3 _ e x c e p t i o n _ j u s t _ s e r v i c e d ) { g o t o N O F I X }
| if ( c u p c = = 0 0 0 0 0 0 0 ) { g o t o N O F I X }
| if ( ( c m d r e g 1 b [ 1 5 : 1 3 ] ! = 0 0 0 ) & &
| ( cmdreg1 b [ 1 5 : 1 0 ] ! = 0 1 0 0 0 1 ) ) { g o t o N O F I X }
| if ( ( ( c m d r e g 1 b [ 1 5 : 1 3 ] ! = 0 0 0 ) | | ( ( c m d r e g 1 b [ 1 2 : 1 0 ] ! = c m d r e g 2 b [ 9 : 7 ] ) & &
| ( cmdreg1 b [ 1 2 : 1 0 ] ! = c m d r e g 3 b [ 9 : 7 ] ) ) ) & &
| ( ( cmdreg1 b [ 9 : 7 ] ! = c m d r e g 2 b [ 9 : 7 ] ) & &
| ( cmdreg1 b [ 9 : 7 ] ! = c m d r e g 3 b [ 9 : 7 ] ) ) ) { g o t o N O F I X }
|
| / * Note : for 6 d43 b o r 8 d43 b , y o u m a y w a n t t o a d d t h e f o l l o w i n g c o d e
| * to g e t b e t t e r c o v e r a g e . ( I f y o u d o n o t i n s e r t t h i s c o d e , t h e p a r t
| * won' t l o c k u p ; it will simply get the wrong answer.)
| * Do N O T i n s e r t t h i s c o d e f o r 1 0 d43 b o r l a t e r p a r t s .
| *
| * if ( f p i a r c u = = i n t e g e r s t a c k r e t u r n a d d r e s s ) {
| * cupc = 0 0 0 0 0 0 0 ;
| * goto N O F I X ;
| * }
| * /
|
| if ( c m d r e g 1 b [ 1 5 : 1 3 ] ! = 0 0 0 ) { g o t o F I X _ O P C L A S S 2 }
| FIX_OPCLASS0 :
| if ( ( ( c m d r e g 1 b [ 1 2 : 1 0 ] = = c m d r e g 2 b [ 9 : 7 ] ) | |
| ( cmdreg1 b [ 9 : 7 ] = = c m d r e g 2 b [ 9 : 7 ] ) ) & &
| ( cmdreg1 b [ 1 2 : 1 0 ] ! = c m d r e g 3 b [ 9 : 7 ] ) & &
| ( cmdreg1 b [ 9 : 7 ] ! = c m d r e g 3 b [ 9 : 7 ] ) ) { / * x u c o n f l i c t o n l y * /
| / * We e x e c u t e t h e f o l l o w i n g c o d e i f t h e r e i s a n
| xu c o n f l i c t a n d N O T a n n u c o n f l i c t * /
|
| /* first save some values on the fsave frame */
| stag_ t e m p = S T A G [ f s a v e _ f r a m e ] ;
| cmdreg1 b _ t e m p = C M D R E G 1 B [ f s a v e _ f r a m e ] ;
| dtag_ t e m p = D T A G [ f s a v e _ f r a m e ] ;
| ete1 5 _ t e m p = E T E 1 5 [ f s a v e _ f r a m e ] ;
|
| CUPC[ f s a v e _ f r a m e ] = 0 0 0 0 0 0 0 ;
| FRESTORE
| FSAVE
|
| / * If t h e x u i n s t r u c t i o n i s e x c e p t i o n a l , w e p u n t .
| * Otherwise, w e w o u l d h a v e t o i n c l u d e O V F L / U N F L h a n d l e r
| * code h e r e t o g e t t h e c o r r e c t a n s w e r .
| * /
| if ( f s a v e _ f r a m e _ f o r m a t = = $ 4 0 6 0 ) { g o t o K I L L _ P R O C E S S }
|
| fsave_ f r a m e = / * b u i l d a l o n g f r a m e o f a l l z e r o s * /
| fsave_ f r a m e _ f o r m a t = $ 4 0 6 0 ; /* label it as long frame */
|
| /* load it with the temps we saved */
| STAG[ f s a v e _ f r a m e ] = s t a g _ t e m p ;
| CMDREG1 B [ f s a v e _ f r a m e ] = c m d r e g 1 b _ t e m p ;
| DTAG[ f s a v e _ f r a m e ] = d t a g _ t e m p ;
| ETE1 5 [ f s a v e _ f r a m e ] = e t e 1 5 _ t e m p ;
|
| / * Make s u r e t h a t t h e c m d r e g 3 b d e s t r e g i s n o t g o i n g t o
| * be d e s t r o y e d b y a F M O V E M a t t h e e n d o f a l l t h i s c o d e .
| * If i t i s , y o u s h o u l d m o v e t h e c u r r e n t v a l u e o f t h e r e g
| * onto t h e s t a c k s o t h a t t h e r e g w i l l l o a d e d w i t h t h a t v a l u e .
| * /
|
| /* All done. Proceed with the code below */
| }
|
| etemp = F P _ r e g _ [ c m d r e g 1 b [ 1 2 : 1 0 ] ] ;
| ete1 5 = ~ e t e 1 4 ;
| cmdreg1 b [ 1 5 : 1 0 ] = 0 1 0 0 1 0 ;
| clear( b u g _ f l a g _ p r o c I D x x x x ) ;
| FRESTORE a n d r e t u r n ;
|
|
| FIX_OPCLASS2 :
| if ( ( c m d r e g 1 b [ 9 : 7 ] = = c m d r e g 2 b [ 9 : 7 ] ) & &
| ( cmdreg1 b [ 9 : 7 ] ! = c m d r e g 3 b [ 9 : 7 ] ) ) { / * x u c o n f l i c t o n l y * /
| / * We e x e c u t e t h e f o l l o w i n g c o d e i f t h e r e i s a n
| xu c o n f l i c t a n d N O T a n n u c o n f l i c t * /
|
| /* first save some values on the fsave frame */
| stag_ t e m p = S T A G [ f s a v e _ f r a m e ] ;
| cmdreg1 b _ t e m p = C M D R E G 1 B [ f s a v e _ f r a m e ] ;
| dtag_ t e m p = D T A G [ f s a v e _ f r a m e ] ;
| ete1 5 _ t e m p = E T E 1 5 [ f s a v e _ f r a m e ] ;
| etemp_ t e m p = E T E M P [ f s a v e _ f r a m e ] ;
|
| CUPC[ f s a v e _ f r a m e ] = 0 0 0 0 0 0 0 ;
| FRESTORE
| FSAVE
|
|
| / * If t h e x u i n s t r u c t i o n i s e x c e p t i o n a l , w e p u n t .
| * Otherwise, w e w o u l d h a v e t o i n c l u d e O V F L / U N F L h a n d l e r
| * code h e r e t o g e t t h e c o r r e c t a n s w e r .
| * /
| if ( f s a v e _ f r a m e _ f o r m a t = = $ 4 0 6 0 ) { g o t o K I L L _ P R O C E S S }
|
| fsave_ f r a m e = / * b u i l d a l o n g f r a m e o f a l l z e r o s * /
| fsave_ f r a m e _ f o r m a t = $ 4 0 6 0 ; /* label it as long frame */
|
| /* load it with the temps we saved */
| STAG[ f s a v e _ f r a m e ] = s t a g _ t e m p ;
| CMDREG1 B [ f s a v e _ f r a m e ] = c m d r e g 1 b _ t e m p ;
| DTAG[ f s a v e _ f r a m e ] = d t a g _ t e m p ;
| ETE1 5 [ f s a v e _ f r a m e ] = e t e 1 5 _ t e m p ;
| ETEMP[ f s a v e _ f r a m e ] = e t e m p _ t e m p ;
|
| / * Make s u r e t h a t t h e c m d r e g 3 b d e s t r e g i s n o t g o i n g t o
| * be d e s t r o y e d b y a F M O V E M a t t h e e n d o f a l l t h i s c o d e .
| * If i t i s , y o u s h o u l d m o v e t h e c u r r e n t v a l u e o f t h e r e g
| * onto t h e s t a c k s o t h a t t h e r e g w i l l l o a d e d w i t h t h a t v a l u e .
| * /
|
| /* All done. Proceed with the code below */
| }
|
| if ( e t e m p _ e x p o n e n t = = m i n _ s g l ) e t e m p _ e x p o n e n t = m i n _ d b l ;
| if ( e t e m p _ e x p o n e n t = = m a x _ s g l ) e t e m p _ e x p o n e n t = m a x _ d b l ;
| cmdreg1 b [ 1 5 : 1 0 ] = 0 1 0 1 0 1 ;
| clear( b u g _ f l a g _ p r o c I D x x x x ) ;
| FRESTORE a n d r e t u r n ;
|
|
| NOFIX :
| clear( b u g _ f l a g _ p r o c I D x x x x ) ;
| FRESTORE a n d r e t u r 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
| BUGFIX 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 "
| xref f p s p _ f m t _ e r r o r
.global b1238_fix
b1238_fix :
|
| This c o d e i s e n t e r e d o n l y o n c o m p l e t i o n o f t h e h a n d l i n g o f a n
| nu- g e n e r a t e d o v f l , u n f l , o r i n e x e x c e p t i o n . I f t h e v e r s i o n
| number o f t h e f s a v e i s n o t $ 4 0 , t h i s h a n d l e r i s n o t n e c e s s a r y .
| Simply b r a n c h t o f i x _ d o n e a n d e x i t n o r m a l l y .
|
cmpib #V E R _ 40 ,4 ( % a7 )
bne f i x _ d o n e
|
| Test f o r c u _ s a v e p c e q u a l t o z e r o . I f n o t , t h i s i s n o t a b u g
| # 1 2 3 8 case.
|
moveb C U _ S A V E P C ( % a6 ) ,% d0
andib #0xFE ,% d0
beq f i x _ d o n e | i f z e r o , t h i s i s n o t b u g #1238
|
| Test t h e r e g i s t e r c o n f l i c t a s p e c t . I f o p c l a s s0 , c h e c k f o r
| cu s r c e q u a l t o x u d e s t o r e q u a l t o n u d e s t . I f s o , g o t o
| op0 . E l s e , o r i f o p c l a s s2 , c h e c k f o r c u d e s t e q u a l t o
| xu d e s t o r e q u a l t o n u d e s t . I f s o , g o t o t s t _ o p c l . E l s e ,
| exit, i t i s n o t t h e b u g c a s e .
|
| Check f o r o p c l a s s 0 . I f n o t , g o a n d c h e c k f o r o p c l a s s 2 a n d s g l .
|
movew C M D R E G 1 B ( % a6 ) ,% d0
andiw #0xE000 ,% d0 | s t r i p a l l b u t o p c l a s s
bne o p2 s g l | n o t o p c l a s s 0 , c h e c k o p2
|
| Check f o r c u a n d n u r e g i s t e r c o n f l i c t . I f o n e e x i s t s , t h i s t a k e s
| priority o v e r a c u a n d x u c o n f l i c t .
|
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d0 | g e t 1 s t s r c
bfextu C M D R E G 3 B ( % a6 ) { #6 : #3 } ,% d1 | g e t 3 r d d e s t
cmpb % d0 ,% d1
beqs o p0 | i f e q u a l , c o n t i n u e b u g f i x
|
| Check f o r c u d e s t e q u a l t o n u d e s t . I f s o , g o a n d f i x t h e
| bug c o n d i t i o n . O t h e r w i s e , e x i t .
|
bfextu C M D R E G 1 B ( % a6 ) { #6 : #3 } ,% d0 | g e t 1 s t d e s t
cmpb % d0 ,% d1 | c m p 1 s t d e s t w i t h 3 r d d e s t
beqs o p0 | i f e q u a l , c o n t i n u e b u g f i x
|
| Check f o r c u a n d x u r e g i s t e r c o n f l i c t .
|
bfextu C M D R E G 2 B ( % a6 ) { #6 : #3 } ,% d1 | g e t 2 n d d e s t
cmpb % d0 ,% d1 | c m p 1 s t d e s t w i t h 2 n d d e s t
beqs o p0 _ x u | i f e q u a l , c o n t i n u e b u g f i x
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d0 | g e t 1 s t s r c
cmpb % d0 ,% d1 | c m p 1 s t s r c w i t h 2 n d d e s t
beq o p0 _ x u
bne f i x _ d o n e | i f t h e r e g c h e c k s f a i l , e x i t
|
| We h a v e t h e o p c l a s s 0 s i t u a t i o n .
|
op0 :
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d0 | g e t s o u r c e r e g i s t e r n o
movel #7 ,% d1
subl % d0 ,% d1
clrl % d0
bsetl % d1 ,% d0
fmovemx % d0 ,E T E M P ( % a6 ) | l o a d s o u r c e t o E T E M P
moveb #0x12 ,% d0
bfins % d0 ,C M D R E G 1 B ( % a6 ) { #0 : #6 } | o p c l a s s 2 , e x t e n d e d
|
| Set E T E M P e x p o n e n t b i t 1 5 a s t h e o p p o s i t e o f e t e 1 4
|
btst #6 ,E T E M P _ E X ( % a6 ) | c h e c k e t e m p e x p o n e n t b i t 1 4
beq s e t e t e 1 5
bclr #e t e m p 15 _ b i t ,S T A G ( % a6 )
bra f i n i s h
setete15 :
bset #e t e m p 15 _ b i t ,S T A G ( % a6 )
bra f i n i s h
|
| We h a v e t h e c a s e i n w h i c h a c o n f l i c t e x i s t s b e t w e e n t h e c u s r c o r
| dest a n d t h e d e s t o f t h e x u . W e m u s t c l e a r t h e i n s t r u c t i o n i n
| the c u a n d r e s t o r e t h e s t a t e , a l l o w i n g t h e i n s t r u c t i o n i n t h e
| xu t o c o m p l e t e . R e m e m b e r , t h e i n s t r u c t i o n i n t h e n u
| was e x c e p t i o n a l , a n d w a s c o m p l e t e d b y t h e a p p r o p r i a t e h a n d l e r .
| If t h e r e s u l t o f t h e x u i n s t r u c t i o n i s n o t e x c e p t i o n a l , w e c a n
| restore t h e i n s t r u c t i o n f r o m t h e c u t o t h e f r a m e a n d c o n t i n u e
| processing t h e o r i g i n a l e x c e p t i o n . I f t h e r e s u l t i s a l s o
| exceptional, w e c h o o s e t o k i l l t h e p r o c e s s .
|
| Items s a v e d f r o m t h e s t a c k :
|
| $ 3 c s t a g - L _ S C R 1
| $ 4 0 cmdreg1 b - L _ S C R 2
| $ 4 4 dtag - L _ S C R 3
|
| The c u s a v e p c i s s e t t o z e r o , a n d t h e f r a m e i s r e s t o r e d t o t h e
| fpu.
|
op0_xu :
movel S T A G ( % a6 ) ,L _ S C R 1 ( % a6 )
movel C M D R E G 1 B ( % a6 ) ,L _ S C R 2 ( % a6 )
movel D T A G ( % a6 ) ,L _ S C R 3 ( % a6 )
andil #0xe0000000 ,L _ S C R 3 ( % a6 )
moveb #0 ,C U _ S A V E P C ( % a6 )
movel ( % a7 ) + ,% d1 | s a v e r e t u r n a d d r e s s f r o m b s r
frestore ( % a7 ) +
fsave - ( % a7 )
|
| Check i f t h e i n s t r u c t i o n w h i c h j u s t c o m p l e t e d w a s e x c e p t i o n a l .
|
cmpw #0x4060 ,( % a7 )
beq o p0 _ x b
|
| It i s n e c e s s a r y t o i s o l a t e t h e r e s u l t o f t h e i n s t r u c t i o n i n t h e
| xu i f i t i s t o f p0 - f p3 a n d w r i t e t h a t v a l u e t o t h e U S E R _ F P n
| locations o n t h e s t a c k . T h e c o r r e c t d e s t i n a t i o n r e g i s t e r i s i n
| cmdreg2 b .
|
bfextu C M D R E G 2 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g i s t e r n o
cmpil #3 ,% d0
bgts o p0 _ x i
beqs o p0 _ f p3
cmpil #1 ,% d0
blts o p0 _ f p0
beqs o p0 _ f p1
op0_fp2 :
fmovemx % f p2 - % f p2 ,U S E R _ F P 2 ( % a6 )
bras o p0 _ x i
op0_fp1 :
fmovemx % f p1 - % f p1 ,U S E R _ F P 1 ( % a6 )
bras o p0 _ x i
op0_fp0 :
fmovemx % f p0 - % f p0 ,U S E R _ F P 0 ( % a6 )
bras o p0 _ x i
op0_fp3 :
fmovemx % f p3 - % f p3 ,U S E R _ F P 3 ( % a6 )
|
| The f r a m e r e t u r n e d i s i d l e . W e m u s t b u i l d a b u s y f r a m e t o h o l d
| the c u s t a t e i n f o r m a t i o n a n d s e t u p e t e m p .
|
op0_xi :
movel #22 ,% d0 | c l e a r 2 3 l w o r d s
clrl ( % a7 )
op0_loop :
clrl - ( % a7 )
dbf % d0 ,o p0 _ l o o p
movel #0x40600000 ,- ( % a7 )
movel L _ S C R 1 ( % a6 ) ,S T A G ( % a6 )
movel L _ S C R 2 ( % a6 ) ,C M D R E G 1 B ( % a6 )
movel L _ S C R 3 ( % a6 ) ,D T A G ( % a6 )
moveb #0x6 ,C U _ S A V E P C ( % a6 )
movel % d1 ,- ( % a7 ) | r e t u r n b s r r e t u r n a d d r e s s
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d0 | g e t s o u r c e r e g i s t e r n o
movel #7 ,% d1
subl % d0 ,% d1
clrl % d0
bsetl % d1 ,% d0
fmovemx % d0 ,E T E M P ( % a6 ) | l o a d s o u r c e t o E T E M P
moveb #0x12 ,% d0
bfins % d0 ,C M D R E G 1 B ( % a6 ) { #0 : #6 } | o p c l a s s 2 , e x t e n d e d
|
| Set E T E M P e x p o n e n t b i t 1 5 a s t h e o p p o s i t e o f e t e 1 4
|
btst #6 ,E T E M P _ E X ( % a6 ) | c h e c k e t e m p e x p o n e n t b i t 1 4
beq o p0 _ s e t e 1 5
bclr #e t e m p 15 _ b i t ,S T A G ( % a6 )
bra f i n i s h
op0_sete15 :
bset #e t e m p 15 _ b i t ,S T A G ( % a6 )
bra f i n i s h
|
| The f r a m e r e t u r n e d i s b u s y . I t i s n o t p o s s i b l e t o r e c o n s t r u c t
| the c o d e s e q u e n c e t o a l l o w c o m p l e t i o n . W e w i l l j u m p t o
| fpsp_ f m t _ e r r o r a n d a l l o w t h e k e r n e l t o k i l l t h e p r o c e s s .
|
op0_xb :
jmp f p s p _ f m t _ e r r o r
|
| Check f o r o p c l a s s 2 a n d s i n g l e s i z e . I f n o t b o t h , e x i t .
|
op2sgl :
movew C M D R E G 1 B ( % a6 ) ,% d0
andiw #0xFC00 ,% d0 | s t r i p a l l b u t o p c l a s s a n d s i z e
cmpiw #0x4400 ,% d0 | t e s t f o r o p c l a s s 2 a n d s i z e =sgl
bne f i x _ d o n e | i f n o t , i t i s n o t b u g 1 2 3 8
|
| Check f o r c u d e s t e q u a l t o n u d e s t o r e q u a l t o x u d e s t , w i t h
| a c u a n d n u c o n f l i c t t a k i n g p r i o r i t y a n n u c o n f l i c t . I f e i t h e r ,
| go a n d f i x t h e b u g c o n d i t i o n . O t h e r w i s e , e x i t .
|
bfextu C M D R E G 1 B ( % a6 ) { #6 : #3 } ,% d0 | g e t 1 s t d e s t
bfextu C M D R E G 3 B ( % a6 ) { #6 : #3 } ,% d1 | g e t 3 r d d e s t
cmpb % d0 ,% d1 | c m p 1 s t d e s t w i t h 3 r d d e s t
beq o p2 _ c o m | i f e q u a l , c o n t i n u e b u g f i x
bfextu C M D R E G 2 B ( % a6 ) { #6 : #3 } ,% d1 | g e t 2 n d d e s t
cmpb % d0 ,% d1 | c m p 1 s t d e s t w i t h 2 n d d e s t
bne f i x _ d o n e | i f t h e r e g c h e c k s f a i l , e x i t
|
| We h a v e t h e c a s e i n w h i c h a c o n f l i c t e x i s t s b e t w e e n t h e c u s r c o r
| dest a n d t h e d e s t o f t h e x u . W e m u s t c l e a r t h e i n s t r u c t i o n i n
| the c u a n d r e s t o r e t h e s t a t e , a l l o w i n g t h e i n s t r u c t i o n i n t h e
| xu t o c o m p l e t e . R e m e m b e r , t h e i n s t r u c t i o n i n t h e n u
| was e x c e p t i o n a l , a n d w a s c o m p l e t e d b y t h e a p p r o p r i a t e h a n d l e r .
| If t h e r e s u l t o f t h e x u i n s t r u c t i o n i s n o t e x c e p t i o n a l , w e c a n
| restore t h e i n s t r u c t i o n f r o m t h e c u t o t h e f r a m e a n d c o n t i n u e
| processing t h e o r i g i n a l e x c e p t i o n . I f t h e r e s u l t i s a l s o
| exceptional, w e c h o o s e t o k i l l t h e p r o c e s s .
|
| Items s a v e d f r o m t h e s t a c k :
|
| $ 3 c s t a g - L _ S C R 1
| $ 4 0 cmdreg1 b - L _ S C R 2
| $ 4 4 dtag - L _ S C R 3
| etemp - F P _ S C R 2
|
| The c u s a v e p c i s s e t t o z e r o , a n d t h e f r a m e i s r e s t o r e d t o t h e
| fpu.
|
op2_xu :
movel S T A G ( % a6 ) ,L _ S C R 1 ( % a6 )
movel C M D R E G 1 B ( % a6 ) ,L _ S C R 2 ( % a6 )
movel D T A G ( % a6 ) ,L _ S C R 3 ( % a6 )
andil #0xe0000000 ,L _ S C R 3 ( % a6 )
moveb #0 ,C U _ S A V E P C ( % a6 )
movel E T E M P ( % a6 ) ,F P _ S C R 2 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,F P _ S C R 2 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,F P _ S C R 2 + 8 ( % a6 )
movel ( % a7 ) + ,% d1 | s a v e r e t u r n a d d r e s s f r o m b s r
frestore ( % a7 ) +
fsave - ( % a7 )
|
| Check i f t h e i n s t r u c t i o n w h i c h j u s t c o m p l e t e d w a s e x c e p t i o n a l .
|
cmpw #0x4060 ,( % a7 )
beq o p2 _ x b
|
| It i s n e c e s s a r y t o i s o l a t e t h e r e s u l t o f t h e i n s t r u c t i o n i n t h e
| xu i f i t i s t o f p0 - f p3 a n d w r i t e t h a t v a l u e t o t h e U S E R _ F P n
| locations o n t h e s t a c k . T h e c o r r e c t d e s t i n a t i o n r e g i s t e r i s i n
| cmdreg2 b .
|
bfextu C M D R E G 2 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g i s t e r n o
cmpil #3 ,% d0
bgts o p2 _ x i
beqs o p2 _ f p3
cmpil #1 ,% d0
blts o p2 _ f p0
beqs o p2 _ f p1
op2_fp2 :
fmovemx % f p2 - % f p2 ,U S E R _ F P 2 ( % a6 )
bras o p2 _ x i
op2_fp1 :
fmovemx % f p1 - % f p1 ,U S E R _ F P 1 ( % a6 )
bras o p2 _ x i
op2_fp0 :
fmovemx % f p0 - % f p0 ,U S E R _ F P 0 ( % a6 )
bras o p2 _ x i
op2_fp3 :
fmovemx % f p3 - % f p3 ,U S E R _ F P 3 ( % a6 )
|
| The f r a m e r e t u r n e d i s i d l e . W e m u s t b u i l d a b u s y f r a m e t o h o l d
| the c u s t a t e i n f o r m a t i o n a n d f i x u p e t e m p .
|
op2_xi :
movel #22 ,% d0 | c l e a r 2 3 l w o r d s
clrl ( % a7 )
op2_loop :
clrl - ( % a7 )
dbf % d0 ,o p2 _ l o o p
movel #0x40600000 ,- ( % a7 )
movel L _ S C R 1 ( % a6 ) ,S T A G ( % a6 )
movel L _ S C R 2 ( % a6 ) ,C M D R E G 1 B ( % a6 )
movel L _ S C R 3 ( % a6 ) ,D T A G ( % a6 )
moveb #0x6 ,C U _ S A V E P C ( % a6 )
movel F P _ S C R 2 ( % a6 ) ,E T E M P ( % a6 )
movel F P _ S C R 2 + 4 ( % a6 ) ,E T E M P _ H I ( % a6 )
movel F P _ S C R 2 + 8 ( % a6 ) ,E T E M P _ L O ( % a6 )
movel % d1 ,- ( % a7 )
bra o p2 _ c o m
|
| We h a v e t h e o p c l a s s 2 s i n g l e s o u r c e s i t u a t i o n .
|
op2_com :
moveb #0x15 ,% d0
bfins % d0 ,C M D R E G 1 B ( % a6 ) { #0 : #6 } | o p c l a s s 2 , d o u b l e
cmpw #0x407F ,E T E M P _ E X ( % a6 ) | s i n g l e + m a x
bnes c a s e 2
movew #0x43FF ,E T E M P _ E X ( % a6 ) | t o d o u b l e + m a x
bra f i n i s h
case2 :
cmpw #0xC07F ,E T E M P _ E X ( % a6 ) | s i n g l e - m a x
bnes c a s e 3
movew #0xC3FF ,E T E M P _ E X ( % a6 ) | t o d o u b l e - m a x
bra f i n i s h
case3 :
cmpw #0x3F80 ,E T E M P _ E X ( % a6 ) | s i n g l e + m i n
bnes c a s e 4
movew #0x3C00 ,E T E M P _ E X ( % a6 ) | t o d o u b l e + m i n
bra f i n i s h
case4 :
cmpw #0xBF80 ,E T E M P _ E X ( % a6 ) | s i n g l e - m i n
bne f i x _ d o n e
movew #0xBC00 ,E T E M P _ E X ( % a6 ) | t o d o u b l e - m i n
bra f i n i s h
|
| The f r a m e r e t u r n e d i s b u s y . I t i s n o t p o s s i b l e t o r e c o n s t r u c t
| the c o d e s e q u e n c e t o a l l o w c o m p l e t i o n . f p s p _ f m t _ e r r o r c a u s e s
| an f l i n e i l l e g a l i n s t r u c t i o n t o b e e x e c u t e d .
|
| You s h o u l d r e p l a c e t h e j u m p t o f p s p _ f m t _ e r r o r w i t h a j u m p
| to t h e e n t r y p o i n t u s e d t o k i l l a p r o c e s s .
|
op2_xb :
jmp f p s p _ f m t _ e r r o r
|
| Enter h e r e i f t h e c a s e i s n o t o f t h e s i t u a t i o n s a f f e c t e d b y
| bug #1238 , o r i f t h e f i x i s c o m p l e t e d , a n d e x i t .
|
finish :
fix_done :
rts
| end