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

Comparing BasiliskII/src/uae_cpu/gencpu.c (file contents):
Revision 1.6 by cebix, 1999-10-28T15:33:20Z vs.
Revision 1.12 by gbeauche, 2001-03-19T13:11:40Z

# Line 221 | Line 221 | static void sync_m68k_pc (void)
221   }
222  
223   /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
224 < * the calling routine handles Apdi and Aipi modes. */
224 > * the calling routine handles Apdi and Aipi modes.
225 > * gb-- movem == 2 means the same thing but for a MOVE16 instruction */
226   static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem)
227   {
228      start_brace ();
# Line 232 | Line 233 | static void genamode (amodes mode, char
233          if (getv == 1)
234              switch (size) {
235               case sz_byte:
236 < #ifdef AMIGA
236 > #if defined(AMIGA) && !defined(WARPUP)
237                  /* sam: I don't know why gcc.2.7.2.1 produces a code worse */
238                  /* if it is not done like that: */
239                  printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg);
# Line 241 | Line 242 | static void genamode (amodes mode, char
242   #endif
243                  break;
244               case sz_word:
245 < #ifdef AMIGA
245 > #if defined(AMIGA) && !defined(WARPUP)
246                  printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg);
247   #else
248                  printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg);
# Line 2452 | Line 2453 | static void gen_opcode (unsigned long in
2453       case i_CPUSHA:
2454          break;
2455       case i_MOVE16:
2456 <        printf ("\tuaecptr mems = m68k_areg(regs, srcreg) & ~15, memd;\n");
2457 <        printf ("\tdstreg = (%s >> 12) & 7;\n", gen_nextiword());
2458 <        printf ("\tmemd = m68k_areg(regs, dstreg) & ~15;\n");
2459 <        printf ("\tput_long(memd, get_long(mems));\n");
2460 <        printf ("\tput_long(memd+4, get_long(mems+4));\n");
2461 <        printf ("\tput_long(memd+8, get_long(mems+8));\n");
2462 <        printf ("\tput_long(memd+12, get_long(mems+12));\n");
2463 <        printf ("\tm68k_areg(regs, srcreg) += 16;\n");
2464 <        printf ("\tm68k_areg(regs, dstreg) += 16;\n");
2456 >        if ((opcode & 0xfff8) == 0xf620) {
2457 >                /* MOVE16 (Ax)+,(Ay)+ */
2458 >                printf ("\tuaecptr mems = m68k_areg(regs, srcreg) & ~15, memd;\n");
2459 >                printf ("\tdstreg = (%s >> 12) & 7;\n", gen_nextiword());
2460 >                printf ("\tmemd = m68k_areg(regs, dstreg) & ~15;\n");
2461 >                printf ("\tput_long(memd, get_long(mems));\n");
2462 >                printf ("\tput_long(memd+4, get_long(mems+4));\n");
2463 >                printf ("\tput_long(memd+8, get_long(mems+8));\n");
2464 >                printf ("\tput_long(memd+12, get_long(mems+12));\n");
2465 >                printf ("\tif (srcreg != dstreg)\n");
2466 >                printf ("\tm68k_areg(regs, srcreg) += 16;\n");
2467 >                printf ("\tm68k_areg(regs, dstreg) += 16;\n");
2468 >        }
2469 >        else {
2470 >                /* Other variants */
2471 >                genamode (curi->smode, "srcreg", curi->size, "mems", 0, 2);
2472 >                genamode (curi->dmode, "dstreg", curi->size, "memd", 0, 2);
2473 >                printf ("\tmemsa &= ~15;\n");
2474 >                printf ("\tmemda &= ~15;\n");
2475 >                printf ("\tput_long(memda, get_long(memsa));\n");
2476 >                printf ("\tput_long(memda+4, get_long(memsa+4));\n");
2477 >                printf ("\tput_long(memda+8, get_long(memsa+8));\n");
2478 >                printf ("\tput_long(memda+12, get_long(memsa+12));\n");
2479 >                if ((opcode & 0xfff8) == 0xf600)
2480 >                printf ("\tm68k_areg(regs, srcreg) += 16;\n");
2481 >                else if ((opcode & 0xfff8) == 0xf608)
2482 >                printf ("\tm68k_areg(regs, dstreg) += 16;\n");
2483 >        }
2484          break;
2485       case i_MMUOP:
2486          genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
# Line 2514 | Line 2534 | static void generate_one_opcode (int rp)
2534      }
2535      fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, postfix, opcode, lookuptab[i].name);
2536      fprintf (headerfile, "extern cpuop_func op_%lx_%d;\n", opcode, postfix);
2537 <    printf ("unsigned long REGPARAM2 op_%lx_%d(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, lookuptab[i].name);
2537 >    printf ("void REGPARAM2 op_%lx_%d(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, lookuptab[i].name);
2538  
2539      switch (table68k[opcode].stype) {
2540       case 0: smsk = 7; break;
# Line 2523 | Line 2543 | static void generate_one_opcode (int rp)
2543       case 3: smsk = 7; break;
2544       case 4: smsk = 7; break;
2545       case 5: smsk = 63; break;
2546 +         case 7: smsk = 3; break;
2547       default: abort ();
2548      }
2549      dmsk = 7;
# Line 2628 | Line 2649 | static void generate_one_opcode (int rp)
2649      gen_opcode (opcode);
2650      if (need_endlabel)
2651          printf ("%s: ;\n", endlabelstr);
2631    printf ("return %d;\n", insn_n_cycles);
2652      printf ("}\n");
2653      opcode_next_clev[rp] = next_cpu_level;
2654      opcode_last_postfix[rp] = postfix;
# Line 2640 | Line 2660 | static void generate_func (void)
2660  
2661      using_prefetch = 0;
2662      using_exception_3 = 0;
2663 + #if !USE_PREFETCH_BUFFER
2664 +        /* gb-- No need for a prefetch buffer, nor exception 3 handling */
2665 +        /* Anyway, Basilisk2 does not use the op_smalltbl_5 table... */
2666 +    for (i = 0; i <= 4; i++) {
2667 + #else
2668      for (i = 0; i < 6; i++) {
2669 + #endif
2670          cpu_level = 4 - i;
2671          if (i == 5) {
2672              cpu_level = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines