1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 #include "fp_emu.h"
  39 #include "fp_decode.h"
  40 
  41 | set flags for decode macros for fmovem
  42 do_fmovem=1
  43 
  44         .globl  fp_fmovem_fp, fp_fmovem_cr
  45 
  46 | %d1 contains the mask and count of the register list
  47 | for other register usage see fp_decode.h
  48 
  49 fp_fmovem_fp:
  50         printf  PDECODE,"fmovem.x "
  51         | get register list and count them
  52         btst    #11,%d2
  53         jne     1f
  54         bfextu  %d2{#24,#8},%d0         | static register list
  55         jra     2f
  56 1:      bfextu  %d2{#25,#3},%d0         | dynamic register list
  57         jsr     fp_get_data_reg
  58 2:      move.l  %d0,%d1
  59         swap    %d1
  60         jra     2f
  61 1:      addq.w  #1,%d1                  | count the # of registers in
  62 2:      lsr.b   #1,%d0                  | register list and keep it in %d1
  63         jcs     1b
  64         jne     2b
  65         printf  PDECODE,"#%08x",1,%d1
  66 #ifdef FPU_EMU_DEBUG
  67         btst    #12,%d2
  68         jne     1f
  69         printf  PDECODE,"-"             | decremental move
  70         jra     2f
  71 1:      printf  PDECODE,"+"             | incremental move
  72 2:      btst    #13,%d2
  73         jeq     1f
  74         printf  PDECODE,"->"            | fpu -> cpu
  75         jra     2f
  76 1:      printf  PDECODE,"<-"            | fpu <- cpu
  77 2:
  78 #endif
  79 
  80         | decode address mode
  81         fp_decode_addr_mode
  82 
  83         .long   fp_ill, fp_ill
  84         .long   fpr_indirect, fpr_postinc
  85         .long   fpr_predecr, fpr_disp16
  86         .long   fpr_extmode0, fpr_extmode1
  87 
  88         | addressing mode: address register indirect
  89 fpr_indirect:
  90         fp_mode_addr_indirect
  91         jra     fpr_do_movem
  92 
  93         | addressing mode: address register indirect with postincrement
  94 fpr_postinc:
  95         fp_mode_addr_indirect_postinc
  96         jra     fpr_do_movem
  97 
  98 fpr_predecr:
  99         fp_mode_addr_indirect_predec
 100         jra     fpr_do_movem
 101 
 102         | addressing mode: address register/programm counter indirect
 103         |                  with 16bit displacement
 104 fpr_disp16:
 105         fp_mode_addr_indirect_disp16
 106         jra     fpr_do_movem
 107 
 108 fpr_extmode0:
 109         fp_mode_addr_indirect_extmode0
 110         jra     fpr_do_movem
 111 
 112 fpr_extmode1:
 113         fp_decode_addr_reg
 114         jmp     ([0f:w,%pc,%d0*4])
 115 
 116         .align  4
 117 0:
 118         .long   fpr_absolute_short, fpr_absolute_long
 119         .long   fpr_disp16, fpr_extmode0
 120         .long   fp_ill, fp_ill
 121         .long   fp_ill, fp_ill
 122 
 123 fpr_absolute_short:
 124         fp_mode_abs_short
 125         jra     fpr_do_movem
 126 
 127 fpr_absolute_long:
 128         fp_mode_abs_long
 129 |       jra     fpr_do_movem
 130 
 131 fpr_do_movem:
 132         swap    %d1                     | get fpu register list
 133         lea     (FPD_FPREG,FPDATA),%a1
 134         moveq   #12,%d0
 135         btst    #12,%d2
 136         jne     1f
 137         lea     (-12,%a1,%d0*8),%a1
 138         neg.l   %d0
 139 1:      btst    #13,%d2
 140         jne     4f
 141         | move register from memory into fpu
 142         jra     3f
 143 1:      printf  PMOVEM,"(%p>%p)",2,%a0,%a1
 144         getuser.l (%a0)+,%d2,fp_err_ua1,%a0
 145         lsr.l   #8,%d2
 146         lsr.l   #7,%d2
 147         lsr.w   #1,%d2
 148         move.l  %d2,(%a1)+
 149         getuser.l (%a0)+,%d2,fp_err_ua1,%a0
 150         move.l  %d2,(%a1)+
 151         getuser.l (%a0),%d2,fp_err_ua1,%a0
 152         move.l  %d2,(%a1)
 153         subq.l  #8,%a0
 154         subq.l  #8,%a1
 155         add.l   %d0,%a0
 156 2:      add.l   %d0,%a1
 157 3:      lsl.b   #1,%d1
 158         jcs     1b
 159         jne     2b
 160         jra     5f
 161         | move register from fpu into memory
 162 1:      printf  PMOVEM,"(%p>%p)",2,%a1,%a0
 163         move.l  (%a1)+,%d2
 164         lsl.w   #1,%d2
 165         lsl.l   #7,%d2
 166         lsl.l   #8,%d2
 167         putuser.l %d2,(%a0)+,fp_err_ua1,%a0
 168         move.l  (%a1)+,%d2
 169         putuser.l %d2,(%a0)+,fp_err_ua1,%a0
 170         move.l  (%a1),%d2
 171         putuser.l %d2,(%a0),fp_err_ua1,%a0
 172         subq.l  #8,%a1
 173         subq.l  #8,%a0
 174         add.l   %d0,%a0
 175 2:      add.l   %d0,%a1
 176 4:      lsl.b   #1,%d1
 177         jcs     1b
 178         jne     2b
 179 5:
 180         printf  PDECODE,"\n"
 181 #if 0
 182         lea     (FPD_FPREG,FPDATA),%a0
 183         printf  PMOVEM,"fp:"
 184         printx  PMOVEM,%a0@(0)
 185         printx  PMOVEM,%a0@(12)
 186         printf  PMOVEM,"\n   "
 187         printx  PMOVEM,%a0@(24)
 188         printx  PMOVEM,%a0@(36)
 189         printf  PMOVEM,"\n   "
 190         printx  PMOVEM,%a0@(48)
 191         printx  PMOVEM,%a0@(60)
 192         printf  PMOVEM,"\n   "
 193         printx  PMOVEM,%a0@(72)
 194         printx  PMOVEM,%a0@(84)
 195         printf  PMOVEM,"\n"
 196 #endif
 197         jra     fp_end
 198 
 199 | set flags for decode macros for fmovem control register
 200 do_fmovem=1
 201 do_fmovem_cr=1
 202 
 203 fp_fmovem_cr:
 204         printf  PDECODE,"fmovem.cr "
 205         | get register list and count them
 206         bfextu  %d2{#19,#3},%d0
 207         move.l  %d0,%d1
 208         swap    %d1
 209         jra     2f
 210 1:      addq.w  #1,%d1
 211 2:      lsr.l   #1,%d0
 212         jcs     1b
 213         jne     2b
 214         printf  PDECODE,"#%08x",1,%d1
 215 #ifdef FPU_EMU_DEBUG
 216         btst    #13,%d2
 217         jeq     1f
 218         printf  PDECODE,"->"            | fpu -> cpu
 219         jra     2f
 220 1:      printf  PDECODE,"<-"            | fpu <- cpu
 221 2:
 222 #endif
 223 
 224         | decode address mode
 225         fp_decode_addr_mode
 226 
 227         .long   fpc_data, fpc_addr
 228         .long   fpc_indirect, fpc_postinc
 229         .long   fpc_predecr, fpc_disp16
 230         .long   fpc_extmode0, fpc_extmode1
 231 
 232 fpc_data:
 233         fp_mode_data_direct
 234         move.w  %d0,%d1
 235         bfffo   %d2{#19,#3},%d0
 236         sub.w   #19,%d0
 237         lea     (FPD_FPCR,FPDATA,%d0.w*4),%a1
 238         btst    #13,%d2
 239         jne     1f
 240         move.w  %d1,%d0
 241         jsr     fp_get_data_reg
 242         move.l  %d0,(%a1)
 243         jra     fpc_movem_fin
 244 1:      move.l  (%a1),%d0
 245         jsr     fp_put_data_reg
 246         jra     fpc_movem_fin
 247 
 248 fpc_addr:
 249         fp_decode_addr_reg
 250         printf  PDECODE,"a%d",1,%d0
 251         btst    #13,%d2
 252         jne     1f
 253         jsr     fp_get_addr_reg
 254         move.l  %a0,(FPD_FPIAR,FPDATA)
 255         jra     fpc_movem_fin
 256 1:      move.l  (FPD_FPIAR,FPDATA),%a0
 257         jsr     fp_put_addr_reg
 258         jra     fpc_movem_fin
 259 
 260 fpc_indirect:
 261         fp_mode_addr_indirect
 262         jra     fpc_do_movem
 263 
 264 fpc_postinc:
 265         fp_mode_addr_indirect_postinc
 266         jra     fpc_do_movem
 267 
 268 fpc_predecr:
 269         fp_mode_addr_indirect_predec
 270         jra     fpc_do_movem
 271 
 272 fpc_disp16:
 273         fp_mode_addr_indirect_disp16
 274         jra     fpc_do_movem
 275 
 276 fpc_extmode0:
 277         fp_mode_addr_indirect_extmode0
 278         jra     fpc_do_movem
 279 
 280 fpc_extmode1:
 281         fp_decode_addr_reg
 282         jmp     ([0f:w,%pc,%d0*4])
 283 
 284         .align  4
 285 0:
 286         .long   fpc_absolute_short, fpc_absolute_long
 287         .long   fpc_disp16, fpc_extmode0
 288         .long   fpc_immediate, fp_ill
 289         .long   fp_ill, fp_ill
 290 
 291 fpc_absolute_short:
 292         fp_mode_abs_short
 293         jra     fpc_do_movem
 294 
 295 fpc_absolute_long:
 296         fp_mode_abs_long
 297         jra     fpc_do_movem
 298 
 299 fpc_immediate:
 300         fp_get_pc %a0
 301         lea     (%a0,%d1.w*4),%a1
 302         fp_put_pc %a1
 303         printf  PDECODE,"#imm"
 304 |       jra     fpc_do_movem
 305 #if 0
 306         swap    %d1
 307         lsl.l   #5,%d1
 308         lea     (FPD_FPCR,FPDATA),%a0
 309         jra     3f
 310 1:      move.l  %d0,(%a0)
 311 2:      addq.l  #4,%a0
 312 3:      lsl.b   #1,%d1
 313         jcs     1b
 314         jne     2b
 315         jra     fpc_movem_fin
 316 #endif
 317 
 318 fpc_do_movem:
 319         swap    %d1                     | get fpu register list
 320         lsl.l   #5,%d1
 321         lea     (FPD_FPCR,FPDATA),%a1
 322 1:      btst    #13,%d2
 323         jne     4f
 324 
 325         | move register from memory into fpu
 326         jra     3f
 327 1:      printf  PMOVEM,"(%p>%p)",2,%a0,%a1
 328         getuser.l (%a0)+,%d0,fp_err_ua1,%a0
 329         move.l  %d0,(%a1)
 330 2:      addq.l  #4,%a1
 331 3:      lsl.b   #1,%d1
 332         jcs     1b
 333         jne     2b
 334         jra     fpc_movem_fin
 335 
 336         | move register from fpu into memory
 337 1:      printf  PMOVEM,"(%p>%p)",2,%a1,%a0
 338         move.l  (%a1),%d0
 339         putuser.l %d0,(%a0)+,fp_err_ua1,%a0
 340 2:      addq.l  #4,%a1
 341 4:      lsl.b   #1,%d1
 342         jcs     1b
 343         jne     2b
 344 
 345 fpc_movem_fin:
 346         and.l   #0x0000fff0,(FPD_FPCR,FPDATA)
 347         and.l   #0x0ffffff8,(FPD_FPSR,FPDATA)
 348         move.l  (FPD_FPCR,FPDATA),%d0
 349         lsr.l   #4,%d0
 350         moveq   #3,%d1
 351         and.l   %d0,%d1
 352         move.w  %d1,(FPD_RND,FPDATA)
 353         lsr.l   #2,%d0
 354         moveq   #3,%d1
 355         and.l   %d0,%d1
 356         move.w  %d1,(FPD_PREC,FPDATA)
 357         printf  PDECODE,"\n"
 358 #if 0
 359         printf  PMOVEM,"fpcr : %08x\n",1,FPDATA@(FPD_FPCR)
 360         printf  PMOVEM,"fpsr : %08x\n",1,FPDATA@(FPD_FPSR)
 361         printf  PMOVEM,"fpiar: %08x\n",1,FPDATA@(FPD_FPIAR)
 362         clr.l   %d0
 363         move.w  (FPD_PREC,FPDATA),%d0
 364         printf  PMOVEM,"prec : %04x\n",1,%d0
 365         move.w  (FPD_RND,FPDATA),%d0
 366         printf  PMOVEM,"rnd  : %04x\n",1,%d0
 367 #endif
 368         jra     fp_end