ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/newcpu.cpp
(Generate patch)

Comparing BasiliskII/src/uae_cpu/newcpu.cpp (file contents):
Revision 1.4 by cebix, 1999-10-31T23:18:42Z vs.
Revision 1.11 by gbeauche, 2002-03-18T21:25:07Z

# Line 22 | Line 22 | extern int intlev(void);       // From baisili
22   #include "memory.h"
23   #include "readcpu.h"
24   #include "newcpu.h"
25 < #include "compiler.h"
25 >
26 > #if ENABLE_MON
27 > #include "mon.h"
28 > #include "mon_disass.h"
29 > #endif
30  
31   int quit_program = 0;
32   int debugging = 0;
# Line 48 | Line 52 | int fpp_movem_next[256];
52  
53   cpuop_func *cpufunctbl[65536];
54  
55 + #define FLIGHT_RECORDER 0
56 +
57 + #if FLIGHT_RECORDER
58 + struct rec_step {
59 +        uae_u32 d[8];
60 +        uae_u32 a[8];
61 +        uae_u32 pc;
62 + };
63 +
64 + const int LOG_SIZE = 8192;
65 + static rec_step log[LOG_SIZE];
66 + static int log_ptr = -1; // First time initialization
67 +
68 + static const char *log_filename(void)
69 + {
70 +        const char *name = getenv("M68K_LOG_FILE");
71 +        return name ? name : "log.68k";
72 + }
73 +
74 + static void record_step(uaecptr pc)
75 + {
76 +        for (int i = 0; i < 8; i++) {
77 +                log[log_ptr].d[i] = m68k_dreg(regs, i);
78 +                log[log_ptr].a[i] = m68k_areg(regs, i);
79 +        }
80 +        log[log_ptr].pc = pc;
81 +        log_ptr = (log_ptr + 1) % LOG_SIZE;
82 + }
83 +
84 + static void dump_log(void)
85 + {
86 +        FILE *f = fopen(log_filename(), "w");
87 +        if (f == NULL)
88 +                return;
89 +        for (int i = 0; i < LOG_SIZE; i++) {
90 +                int j = (i + log_ptr) % LOG_SIZE;
91 +                fprintf(f, "pc %08x\n", log[j].pc);
92 +                fprintf(f, "d0 %08x d1 %08x d2 %08x d3 %08x\n", log[j].d[0], log[j].d[1], log[j].d[2], log[j].d[3]);
93 +                fprintf(f, "d4 %08x d5 %08x d6 %08x d7 %08x\n", log[j].d[4], log[j].d[5], log[j].d[6], log[j].d[7]);
94 +                fprintf(f, "a0 %08x a1 %08x a2 %08x a3 %08x\n", log[j].a[0], log[j].a[1], log[j].a[2], log[j].a[3]);
95 +                fprintf(f, "a4 %08x a5 %08x a6 %08x a7 %08x\n", log[j].a[4], log[j].a[5], log[j].a[6], log[j].a[7]);
96 + #if ENABLE_MON
97 +                disass_68k(f, log[j].pc);
98 + #endif
99 +        }
100 +        fclose(f);
101 + }
102 + #endif
103 +
104   #define COUNT_INSTRS 0
105  
106   #if COUNT_INSTRS
# Line 183 | Line 236 | void init_m68k (void)
236          for (j = 7 ; j >= 0 ; j--) {
237                  if (i & (1 << j)) break;
238          }
239 <        fpp_movem_index1[i] = j;
240 <        fpp_movem_index2[i] = 7-j;
239 >        fpp_movem_index1[i] = 7-j;
240 >        fpp_movem_index2[i] = j;
241          fpp_movem_next[i] = i & (~(1 << j));
242      }
243   #if COUNT_INSTRS
# Line 207 | Line 260 | void init_m68k (void)
260      do_merges ();
261  
262      build_cpufunctbl ();
263 +    
264 +    fpu_init ();
265 +    fpu_set_integral_fpu (CPUType == 4);
266 + }
267 +
268 + void exit_m68k (void)
269 + {
270 +        fpu_exit ();
271   }
272  
273   struct regstruct regs, lastint_regs;
# Line 215 | Line 276 | static int backup_pointer = 0;
276   static long int m68kpc_offset;
277   int lastint_no;
278  
279 + #if REAL_ADDRESSING || DIRECT_ADDRESSING
280 + #define get_ibyte_1(o) get_byte(get_virtual_address(regs.pc_p) + (o) + 1)
281 + #define get_iword_1(o) get_word(get_virtual_address(regs.pc_p) + (o))
282 + #define get_ilong_1(o) get_long(get_virtual_address(regs.pc_p) + (o))
283 + #else
284   #define get_ibyte_1(o) get_byte(regs.pc + (regs.pc_p - regs.pc_oldp) + (o) + 1)
285   #define get_iword_1(o) get_word(regs.pc + (regs.pc_p - regs.pc_oldp) + (o))
286   #define get_ilong_1(o) get_long(regs.pc + (regs.pc_p - regs.pc_oldp) + (o))
287 + #endif
288  
289   uae_s32 ShowEA (int reg, amodes mode, wordsizes size, char *buf)
290   {
# Line 250 | Line 317 | uae_s32 ShowEA (int reg, amodes mode, wo
317          disp16 = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
318          addr = m68k_areg(regs,reg) + (uae_s16)disp16;
319          sprintf (buffer,"(A%d,$%04x) == $%08lx", reg, disp16 & 0xffff,
320 <                                        (long unsigned int)addr);
320 >                                        (unsigned long)addr);
321          break;
322       case Ad8r:
323          dp = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
# Line 283 | Line 350 | uae_s32 ShowEA (int reg, amodes mode, wo
350                      dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W',
351                      1 << ((dp >> 9) & 3),
352                      disp,outer,
353 <                    (long unsigned int)addr);
353 >                    (unsigned long)addr);
354          } else {
355            addr = m68k_areg(regs,reg) + (uae_s32)((uae_s8)disp8) + dispreg;
356            sprintf (buffer,"(A%d, %c%d.%c*%d, $%02x) == $%08lx", reg,
357                 dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W',
358                 1 << ((dp >> 9) & 3), disp8,
359 <               (long unsigned int)addr);
359 >               (unsigned long)addr);
360          }
361          break;
362       case PC16:
363          addr = m68k_getpc () + m68kpc_offset;
364          disp16 = get_iword_1 (m68kpc_offset); m68kpc_offset += 2;
365          addr += (uae_s16)disp16;
366 <        sprintf (buffer,"(PC,$%04x) == $%08lx", disp16 & 0xffff,(long unsigned int)addr);
366 >        sprintf (buffer,"(PC,$%04x) == $%08lx", disp16 & 0xffff,(unsigned long)addr);
367          break;
368       case PC8r:
369          addr = m68k_getpc () + m68kpc_offset;
# Line 330 | Line 397 | uae_s32 ShowEA (int reg, amodes mode, wo
397                      dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W',
398                      1 << ((dp >> 9) & 3),
399                      disp,outer,
400 <                    (long unsigned int)addr);
400 >                    (unsigned long)addr);
401          } else {
402            addr += (uae_s32)((uae_s8)disp8) + dispreg;
403            sprintf (buffer,"(PC, %c%d.%c*%d, $%02x) == $%08lx", dp & 0x8000 ? 'A' : 'D',
404                  (int)r, dp & 0x800 ? 'L' : 'W',  1 << ((dp >> 9) & 3),
405 <                disp8, (long unsigned int)addr);
405 >                disp8, (unsigned long)addr);
406          }
407          break;
408       case absw:
409 <        sprintf (buffer,"$%08lx", (long unsigned int)(uae_s32)(uae_s16)get_iword_1 (m68kpc_offset));
409 >        sprintf (buffer,"$%08lx", (unsigned long)(uae_s32)(uae_s16)get_iword_1 (m68kpc_offset));
410          m68kpc_offset += 2;
411          break;
412       case absl:
413 <        sprintf (buffer,"$%08lx", (long unsigned int)get_ilong_1 (m68kpc_offset));
413 >        sprintf (buffer,"$%08lx", (unsigned long)get_ilong_1 (m68kpc_offset));
414          m68kpc_offset += 4;
415          break;
416       case imm:
# Line 357 | Line 424 | uae_s32 ShowEA (int reg, amodes mode, wo
424              m68kpc_offset += 2;
425              break;
426           case sz_long:
427 <            sprintf (buffer,"#$%08lx", (long unsigned int)(get_ilong_1 (m68kpc_offset)));
427 >            sprintf (buffer,"#$%08lx", (unsigned long)(get_ilong_1 (m68kpc_offset)));
428              m68kpc_offset += 4;
429              break;
430           default:
# Line 377 | Line 444 | uae_s32 ShowEA (int reg, amodes mode, wo
444       case imm2:
445          offset = (uae_s32)get_ilong_1 (m68kpc_offset);
446          m68kpc_offset += 4;
447 <        sprintf (buffer,"#$%08lx", (long unsigned int)offset);
447 >        sprintf (buffer,"#$%08lx", (unsigned long)offset);
448          break;
449       case immi:
450          offset = (uae_s32)(uae_s8)(reg & 0xff);
451 <        sprintf (buffer,"#$%08lx", (long unsigned int)offset);
451 >        sprintf (buffer,"#$%08lx", (unsigned long)offset);
452          break;
453       default:
454          break;
# Line 645 | Line 712 | void MakeFromSR (void)
712  
713   void Exception(int nr, uaecptr oldpc)
714   {
715 <    compiler_flush_jsr_stack();
715 >    uae_u32 currpc = m68k_getpc ();
716      MakeSR();
717      if (!regs.s) {
718          regs.usp = m68k_areg(regs, 7);
# Line 674 | Line 741 | void Exception(int nr, uaecptr oldpc)
741              m68k_areg(regs, 7) -= 2;
742              put_word (m68k_areg(regs, 7), nr * 4);
743              m68k_areg(regs, 7) -= 4;
744 <            put_long (m68k_areg(regs, 7), m68k_getpc ());
744 >            put_long (m68k_areg(regs, 7), currpc);
745              m68k_areg(regs, 7) -= 2;
746              put_word (m68k_areg(regs, 7), regs.sr);
747              regs.sr |= (1 << 13);
# Line 700 | Line 767 | void Exception(int nr, uaecptr oldpc)
767          }
768      }
769      m68k_areg(regs, 7) -= 4;
770 <    put_long (m68k_areg(regs, 7), m68k_getpc ());
770 >    put_long (m68k_areg(regs, 7), currpc);
771   kludge_me_do:
772      m68k_areg(regs, 7) -= 2;
773      put_word (m68k_areg(regs, 7), regs.sr);
# Line 723 | Line 790 | static void Interrupt(int nr)
790  
791   static int caar, cacr, tc, itt0, itt1, dtt0, dtt1;
792  
793 < void m68k_move2c (int regno, uae_u32 *regp)
793 > int m68k_move2c (int regno, uae_u32 *regp)
794   {
795 <    if (CPUType == 1 && (regno & 0x7FF) > 1)
795 >  if ((CPUType == 1 && (regno & 0x7FF) > 1)
796 >  || (CPUType < 4 && (regno & 0x7FF) > 2)
797 >  || (CPUType == 4 && regno == 0x802))
798 >  {
799          op_illg (0x4E7B);
800 <    else
800 >        return 0;
801 >  } else {
802          switch (regno) {
803           case 0: regs.sfc = *regp & 7; break;
804           case 1: regs.dfc = *regp & 7; break;
805 <         case 2: cacr = *regp & 0x3; break;     /* ignore C and CE */
805 >         case 2: cacr = *regp & (CPUType < 4 ? 0x3 : 0x80008000); break;
806           case 3: tc = *regp & 0xc000; break;
807           case 4: itt0 = *regp & 0xffffe364; break;
808           case 5: itt1 = *regp & 0xffffe364; break;
# Line 744 | Line 815 | void m68k_move2c (int regno, uae_u32 *re
815           case 0x804: regs.isp = *regp; if (regs.m == 0) m68k_areg(regs, 7) = regs.isp; break;
816           default:
817              op_illg (0x4E7B);
818 <            break;
818 >            return 0;
819          }
820 +  }
821 +  return 1;
822   }
823  
824 < void m68k_movec2 (int regno, uae_u32 *regp)
824 > int m68k_movec2 (int regno, uae_u32 *regp)
825   {
826 <    if (CPUType == 1 && (regno & 0x7FF) > 1)
826 >    if ((CPUType == 1 && (regno & 0x7FF) > 1)
827 >        || (CPUType < 4 && (regno & 0x7FF) > 2)
828 >        || (CPUType == 4 && regno == 0x802))
829 >    {
830          op_illg (0x4E7A);
831 <    else
831 >        return 0;
832 >    } else {
833          switch (regno) {
834           case 0: *regp = regs.sfc; break;
835           case 1: *regp = regs.dfc; break;
# Line 769 | Line 846 | void m68k_movec2 (int regno, uae_u32 *re
846           case 0x804: *regp = regs.m == 0 ? m68k_areg(regs, 7) : regs.isp; break;
847           default:
848              op_illg (0x4E7A);
849 <            break;
849 >            return 0;
850 >        }
851          }
852 +        return 1;
853   }
854  
855   static __inline__ int
# Line 1047 | Line 1126 | void m68k_reset (void)
1126      regs.spcflags = 0;
1127      regs.intmask = 7;
1128      regs.vbr = regs.sfc = regs.dfc = 0;
1129 <    regs.fpcr = regs.fpsr = regs.fpiar = 0;
1129 >    /* gb-- moved into {fpp,fpu_x86}.cpp::fpu_init()
1130 >    regs.fpcr = regs.fpsr = regs.fpiar = 0; */
1131 >    fpu_reset();
1132 >        
1133 > #if FLIGHT_RECORDER
1134 > #if ENABLE_MON
1135 >        if (log_ptr == -1) {
1136 >                // Install "log" command in mon
1137 >                mon_add_command("log", dump_log, "log                      Dump m68k emulation log\n");
1138 >        }
1139 > #endif
1140 >        log_ptr = 0;
1141 >        memset(log, 0, sizeof(log));
1142 > #endif
1143   }
1144  
1145   void REGPARAM2 op_illg (uae_u32 opcode)
1146   {
1147      uaecptr pc = m68k_getpc ();
1148  
1057    compiler_flush_jsr_stack ();
1058
1149          if ((opcode & 0xFF00) == 0x7100) {
1150                  struct M68kRegisters r;
1151                  int i;
1152  
1153 <                // Return from Execute68k()?
1153 >                // Return from Exectue68k()?
1154                  if (opcode == M68K_EXEC_RETURN) {
1155                          regs.spcflags |= SPCFLAG_BRK;
1156                          quit_program = 1;
# Line 1119 | Line 1209 | static uaecptr last_trace_ad = 0;
1209  
1210   static void do_trace (void)
1211   {
1212 <    if (regs.t0) {
1212 >    if (regs.t0 && CPUType >= 2) {
1213         uae_u16 opcode;
1214         /* should also include TRAP, CHK, SR modification FPcc */
1215         /* probably never used so why bother */
# Line 1156 | Line 1246 | static void do_trace (void)
1246   static int do_specialties (void)
1247   {
1248      /*n_spcinsns++;*/
1159    run_compiled_code();
1249      if (regs.spcflags & SPCFLAG_DOTRACE) {
1250          Exception (9,last_trace_ad);
1251      }
# Line 1197 | Line 1286 | static void m68k_run_1 (void)
1286   {
1287          for (;;) {
1288                  uae_u32 opcode = GET_OPCODE;
1289 + #if FLIGHT_RECORDER
1290 +                record_step(m68k_getpc());
1291 + #endif
1292                  (*cpufunctbl[opcode])(opcode);
1293                  if (regs.spcflags) {
1294                          if (do_specialties())

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines