@@ -218,6 +218,18 @@ static uint64_t m68k_read_safe_64(const m68k_info *info, const uint64_t address)
218218 return m68k_read_disassembler_64 (info , addr );
219219}
220220
221+ static void m68k_read_safe_96 (const m68k_info * info , const uint64_t address ,
222+ uint8_t * dst )
223+ {
224+ const uint64_t addr = (address - info -> baseAddress ) &
225+ info -> address_mask ;
226+ if (info -> code_len < addr + 12 ) {
227+ memset (dst , 0xaa , 12 );
228+ return ;
229+ }
230+ memcpy (dst , info -> code + addr , 12 );
231+ }
232+
221233/* ======================================================================== */
222234/* =============================== PROTOTYPES ============================= */
223235/* ======================================================================== */
@@ -306,6 +318,10 @@ static unsigned long long peek_imm_64(const m68k_info *info)
306318{
307319 return m68k_read_safe_64 ((info ), (info )-> pc );
308320}
321+ static void peek_imm_96 (const m68k_info * info , uint8_t * dst )
322+ {
323+ m68k_read_safe_96 (info , info -> pc , dst );
324+ }
309325
310326static unsigned int read_imm_8 (m68k_info * info )
311327{
@@ -331,6 +347,11 @@ static unsigned long long read_imm_64(m68k_info *info)
331347 (info )-> pc += 8 ;
332348 return value & 0xffffffffffffffff ;
333349}
350+ static void read_imm_96 (m68k_info * info , uint8_t * dst )
351+ {
352+ peek_imm_96 (info , dst );
353+ info -> pc += 12 ;
354+ }
334355
335356/* Fake a split interface */
336357#define get_ea_mode_str_8 (instruction ) get_ea_mode_str(instruction, 0)
@@ -611,6 +632,8 @@ static void get_ea_mode_op(m68k_info *info, cs_m68k_op *op,
611632 op -> imm = read_imm_16 (info );
612633 else if (size == 4 )
613634 op -> imm = read_imm_32 (info );
635+ else if (size == 12 )
636+ read_imm_96 (info , op -> fp_ext .ximm );
614637 else
615638 op -> imm = read_imm_64 (info );
616639
@@ -2374,12 +2397,16 @@ static void d68020_fpu(m68k_info *info)
23742397 ext -> op_size .type = M68K_SIZE_TYPE_FPU ;
23752398 ext -> op_size .fpu_size = M68K_FPU_SIZE_EXTENDED ;
23762399 get_ea_mode_op (info , op0 , info -> ir , 12 );
2400+ if (op0 -> type == M68K_OP_IMM )
2401+ op0 -> type = M68K_OP_FP_EXTENDED ;
23772402 break ;
23782403
23792404 case 0x03 : // packed decimal
23802405 ext -> op_size .type = M68K_SIZE_TYPE_FPU_PACKED ;
23812406 ext -> op_size .fpu_size = M68K_FPU_SIZE_PACKED ;
23822407 get_ea_mode_op (info , op0 , info -> ir , 12 );
2408+ if (op0 -> type == M68K_OP_IMM )
2409+ op0 -> type = M68K_OP_FP_EXTENDED ;
23832410 break ;
23842411
23852412 default :
0 commit comments