]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc2020b3.zip
authorToni Wilen <twilen@winuae.net>
Sun, 10 Jan 2010 11:00:08 +0000 (13:00 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:50:32 +0000 (21:50 +0200)
custom.c
debug.c
drawing.c
gencpu.c
newcpu.c
od-win32/keyboard_win32.c
od-win32/win32.h
od-win32/win32gui.c
od-win32/winuaechangelog.txt

index 251ba6e995f12f9d0e8e1254a8e48058951e1d20..2ee9ac65ebd58e58e52fa5bc088e44238a5f4686 100644 (file)
--- a/custom.c
+++ b/custom.c
@@ -4192,12 +4192,6 @@ static void update_copper (int until_hpos)
                else
                        c_hpos += 2;
 
-               if (cop_state.strobe) {
-                       if (cop_state.strobe > 0)
-                               cop_state.ip = cop_state.strobe == 1 ? cop1lc : cop2lc;
-                       cop_state.strobe = 0;
-               }
-
                switch (cop_state.state)
                {
                case COP_wait_in2:
@@ -4224,6 +4218,7 @@ static void update_copper (int until_hpos)
                        if (debug_dma)
                                record_dma (0x8c, chipmem_agnus_wget (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
 #endif
+                       cop_state.ip += 2;
                        break;
                case COP_strobe_delay2:
                        // second cycle after COPJMP is like second read cycle except
@@ -4234,7 +4229,13 @@ static void update_copper (int until_hpos)
                        cop_state.state = COP_read1;
                        alloc_cycle (old_hpos, CYCLE_COPPER);
                        if (debug_dma)
-                               record_dma (0x1fe, chipmem_agnus_wget (cop_state.ip + 2), cop_state.ip + 2, old_hpos, vpos, DMARECORD_COPPER);
+                               record_dma (0x1fe, chipmem_agnus_wget (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                       // next cycle finally reads from new pointer
+                       if (cop_state.strobe == 1)
+                               cop_state.ip = cop1lc;
+                       else
+                               cop_state.ip = cop2lc;
+                       cop_state.strobe = 0;
                        break;
                case COP_start_delay:
                        if (copper_cant_read (old_hpos, 1))
@@ -4243,6 +4244,7 @@ static void update_copper (int until_hpos)
                        alloc_cycle (old_hpos, CYCLE_COPPER);
                        if (debug_dma)
                                record_dma (0x1fe, 0, 0xffffffff, old_hpos, vpos, DMARECORD_COPPER);
+                       cop_state.ip = cop1lc;
                        break;
 
                case COP_read1:
@@ -4300,10 +4302,10 @@ static void update_copper (int until_hpos)
                                cop_state.last_write = reg;
                                cop_state.last_write_hpos = old_hpos;
                                if (reg == 0x88) {
-                                       cop_state.ip = cop1lc;
+                                       cop_state.strobe = 1;
                                        cop_state.state = COP_strobe_delay1;
-                               } else if (reg == 0x8A) {
-                                       cop_state.ip = cop2lc;
+                               } else if (reg == 0x8a) {
+                                       cop_state.strobe = 2;
                                        cop_state.state = COP_strobe_delay1;
                                } else {
                                        // FIX: all copper writes happen 1 cycle later than CPU writes
@@ -6833,12 +6835,11 @@ STATIC_INLINE void decide_fetch_ce (int hpos)
 // at least 4 cycles (all DMA cycles count, not just blitter cycles, even
 // blitter idle cycles do count!)
 
-STATIC_INLINE int dma_cycle (int *waited)
+STATIC_INLINE int dma_cycle (void)
 {
        int hpos, hpos_old;
 
        blitter_nasty = 1;
-       *waited = 0;
        for (;;) {
                int bpldma;
                int blitpri = dmacon & DMA_BLITPRI;
@@ -6861,7 +6862,6 @@ STATIC_INLINE int dma_cycle (int *waited)
                        alloc_cycle (hpos_old, CYCLE_CPU);
                        break;
                }
-               *waited = 1;
                regs.ce020memcycles -= CYCLE_UNIT;
                do_cycles (1 * CYCLE_UNIT);
                /* bus was allocated to dma channel, wait for next cycle.. */
@@ -6878,16 +6878,22 @@ STATIC_INLINE void checknasty (int hpos, int vpos)
 uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode)
 {
        uae_u32 v = 0;
-       int hpos, waited;
+       int hpos;
        struct dma_rec *dr;
 
-       hpos = dma_cycle (&waited);
-       if (waited)
-               do_cycles_ce (CYCLE_UNIT);
+       hpos = dma_cycle ();
+       do_cycles_ce (CYCLE_UNIT);
 
 #ifdef DEBUGGER
        if (debug_dma) {
-               dr = record_dma (0x1000, v, addr, hpos, vpos, DMARECORD_CPU);
+               int reg = 0x1000;
+               if (mode < 0)
+                       reg |= 4;
+               else if (mode > 0)
+                       reg |= 2;
+               else
+                       reg |= 1;
+               dr = record_dma (reg, v, addr, hpos, vpos, DMARECORD_CPU);
                checknasty (hpos, vpos);
        }
 #endif
@@ -6903,31 +6909,65 @@ uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode)
                dr->dat = v;
 #endif
 
-       if (!waited)
-               do_cycles_ce (2 * CYCLE_UNIT);
-       else
-               do_cycles_ce (CYCLE_UNIT);
-       regs.ce020memcycles -= 2 * CYCLE_UNIT;
+       do_cycles_ce (CYCLE_UNIT);
        return v;
 }
 
 uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode)
 {
-       return wait_cpu_cycle_read (addr, mode);
+       uae_u32 v = 0;
+       int hpos;
+       struct dma_rec *dr;
+
+       hpos = dma_cycle ();
+       do_cycles_ce (CYCLE_UNIT);
+
+#ifdef DEBUGGER
+       if (debug_dma) {
+               int reg = 0x1000;
+               if (mode < 0)
+                       reg |= 4;
+               else if (mode > 0)
+                       reg |= 2;
+               else
+                       reg |= 1;
+               dr = record_dma (reg, v, addr, hpos, vpos, DMARECORD_CPU);
+               checknasty (hpos, vpos);
+       }
+#endif
+       if (mode < 0)
+               v = get_long (addr);
+       else if (mode > 0)
+               v = get_word (addr);
+       else if (mode == 0)
+               v = get_byte (addr);
+
+#ifdef DEBUGGER
+       if (debug_dma)
+               dr->dat = v;
+#endif
+
+       regs.ce020memcycles -= CYCLE_UNIT;
+       return v;
 }
 
 void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v)
 {
        int hpos;
-       int waited;
 
-       hpos = dma_cycle (&waited);
-       if (waited)
-               do_cycles_ce (CYCLE_UNIT);
+       hpos = dma_cycle ();
+       do_cycles_ce (CYCLE_UNIT);
 
 #ifdef DEBUGGER
        if (debug_dma) {
-               record_dma (0x1001, v, addr, hpos, vpos, DMARECORD_CPU);
+               int reg = 0x1100;
+               if (mode < 0)
+                       reg |= 4;
+               else if (mode > 0)
+                       reg |= 2;
+               else
+                       reg |= 1;
+               record_dma (reg, v, addr, hpos, vpos, DMARECORD_CPU);
                checknasty (hpos, vpos);
        }
 #endif
@@ -6938,16 +6978,38 @@ void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v)
                put_word (addr, v);
        else if (mode == 0)
                put_byte (addr, v);
-       if (!waited)
-               do_cycles_ce (2 * CYCLE_UNIT);
-       else
-               do_cycles_ce (CYCLE_UNIT);
-       regs.ce020memcycles -= 2 * CYCLE_UNIT;
+       do_cycles_ce (CYCLE_UNIT);
 }
 
 void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v)
 {
-       wait_cpu_cycle_write (addr, mode, v);
+       int hpos;
+
+       hpos = dma_cycle ();
+       do_cycles_ce (CYCLE_UNIT);
+
+#ifdef DEBUGGER
+       if (debug_dma) {
+               int reg = 0x1100;
+               if (mode < 0)
+                       reg |= 4;
+               else if (mode > 0)
+                       reg |= 2;
+               else
+                       reg |= 1;
+               record_dma (reg, v, addr, hpos, vpos, DMARECORD_CPU);
+               checknasty (hpos, vpos);
+       }
+#endif
+
+       if (mode < 0)
+               put_long (addr, v);
+       else if (mode > 0)
+               put_word (addr, v);
+       else if (mode == 0)
+               put_byte (addr, v);
+
+       regs.ce020memcycles -= CYCLE_UNIT;
 }
 
 void do_cycles_ce (long cycles)
diff --git a/debug.c b/debug.c
index 58a0766a7549a023e6449bfa90d801ea8db5eb1a..db1325c9b8d2357351a392f4512ffe86eebc9dca 100644 (file)
--- a/debug.c
+++ b/debug.c
@@ -880,16 +880,39 @@ static void decode_dma_record (int hpos, int vpos, int toggle)
                TCHAR l4[81];
                for (i = 0; i < cols && h < maxh; i++, h++, dr++) {
                        int cl = i * col, cl2;
-
+                       int r = dr->reg;
+                       TCHAR *sr;
+
+                       sr = L"    ";
+                       if (dr->type == DMARECORD_COPPER)
+                               sr = L"COP ";
+                       else if (dr->type == DMARECORD_BLITTER)
+                               sr = L"BLT ";
+                       else if (dr->type == DMARECORD_REFRESH)
+                               sr = L"RFS ";
+                       else if (dr->type == DMARECORD_AUDIO)
+                               sr = L"AUD ";
+                       else if (dr->type == DMARECORD_DISK)
+                               sr = L"DSK ";
+                       else if (dr->type == DMARECORD_SPRITE)
+                               sr = L"SPR ";
                        _stprintf (l1 + cl, L"[%02X %3d]", h, h);
                        _tcscpy (l4 + cl, L"        ");
-                       if (dr->reg != 0xffff) {
-                               if ((dr->reg & 0x1001) == 0x1000)
-                                       _tcscpy (l2 + cl, L"   CPU-R ");
-                               else if ((dr->reg & 0x1001) == 0x1001)
-                                       _tcscpy (l2 + cl, L"   CPU-W ");
-                               else
-                                       _stprintf (l2 + cl, L"     %03X", dr->reg);
+                       if (r != 0xffff) {
+                               if (r & 0x1000) {
+                                       if ((r & 0x0100) == 0x0000)
+                                               _tcscpy (l2 + cl, L"  CPU-R  ");
+                                       else if ((r & 0x0100) == 0x0100)
+                                               _tcscpy (l2 + cl, L"  CPU-W  ");
+                                       if ((r & 0xff) == 4)
+                                               l2[cl + 7] = 'L';
+                                       if ((r & 0xff) == 2)
+                                               l2[cl + 7] = 'W';
+                                       if ((r & 0xff) == 1)
+                                               l2[cl + 7] = 'B';
+                               } else {
+                                       _stprintf (l2 + cl, L"%4s %03X", sr, r);
+                               }
                                _stprintf (l3 + cl, L"    %04X", dr->dat);
                                if (dr->addr != 0xffffffff)
                                        _stprintf (l4 + cl, L"%08X", dr->addr & 0x00ffffff);
@@ -899,19 +922,19 @@ static void decode_dma_record (int hpos, int vpos, int toggle)
                        }
                        cl2 = cl;
                        if (dr->evt & DMA_EVENT_BLITNASTY)
-                               l2[cl2++] = 'N';
+                               l3[cl2++] = 'N';
                        if (dr->evt & DMA_EVENT_BLITFINISHED)
-                               l2[cl2++] = 'B';
+                               l3[cl2++] = 'B';
                        if (dr->evt & DMA_EVENT_BLITIRQ)
-                               l2[cl2++] = 'b';
+                               l3[cl2++] = 'b';
                        if (dr->evt & DMA_EVENT_BPLFETCHUPDATE)
-                               l2[cl2++] = 'p';
+                               l3[cl2++] = 'p';
                        if (dr->evt & DMA_EVENT_COPPERWAKE)
-                               l2[cl2++] = 'W';
+                               l3[cl2++] = 'W';
                        if (dr->evt & DMA_EVENT_CPUIRQ)
-                               l2[cl2++] = 'I';
+                               l3[cl2++] = 'I';
                        if (dr->evt & DMA_EVENT_INTREQ)
-                               l2[cl2++] = 'i';
+                               l3[cl2++] = 'i';
                        if (i < cols - 1 && h < maxh - 1) {
                                l1[cl + col - 1] = 32;
                                l2[cl + col - 1] = 32;
index 1f3592877ad822073516fbf935a71f04dc9d50a6..2e5ac4aebfbe4fa1c956e56d3a406d4d0559b36d 100644 (file)
--- a/drawing.c
+++ b/drawing.c
@@ -625,9 +625,10 @@ static void pfield_init_linetoscr (void)
        if (sprite_first_x < sprite_last_x) {
                if (sprite_first_x < 0)
                        sprite_first_x = 0;
-               if (sprite_last_x >= MAX_PIXELS_PER_LINE)
-                       sprite_last_x = MAX_PIXELS_PER_LINE - 1;
-               memset (spritepixels + sprite_first_x, 0, sizeof (struct spritepixelsbuf) * (sprite_last_x - sprite_first_x + 1));
+               if (sprite_last_x >= MAX_PIXELS_PER_LINE - 1)
+                       sprite_last_x = MAX_PIXELS_PER_LINE - 2;
+               if (sprite_first_x < sprite_last_x)
+                       memset (spritepixels + sprite_first_x, 0, sizeof (struct spritepixelsbuf) * (sprite_last_x - sprite_first_x + 1));
        }
        sprite_last_x = 0;
        sprite_first_x = MAX_PIXELS_PER_LINE - 1;
@@ -1315,8 +1316,10 @@ static int ham_decode_pixel;
 static unsigned int ham_lastcolor;
 
 /* Decode HAM in the invisible portion of the display (left of VISIBLE_LEFT_BORDER),
-but don't draw anything in.  This is done to prepare HAM_LASTCOLOR for later,
-when decode_ham runs.  */
+ * but don't draw anything in.  This is done to prepare HAM_LASTCOLOR for later,
+ * when decode_ham runs.
+ *
+ */
 static void init_ham_decoding (void)
 {
        int unpainted_amiga = unpainted;
@@ -1493,11 +1496,12 @@ STATIC_INLINE void draw_sprites_1 (struct sprite_entry *e, int dualpf, int has_a
        if (spr_pos < sprite_first_x)
                sprite_first_x = spr_pos;
 
-       for (pos = e->pos; pos < e->max; pos++) {
-               spritepixels[spr_pos].data = buf[pos];
-               spritepixels[spr_pos].stdata = stbuf[pos];
-               spritepixels[spr_pos].attach = has_attach;
-               spr_pos++;
+       for (pos = e->pos; pos < e->max; pos++, spr_pos++) {
+               if (spr_pos >= 0 && spr_pos < MAX_PIXELS_PER_LINE) {
+                       spritepixels[spr_pos].data = buf[pos];
+                       spritepixels[spr_pos].stdata = stbuf[pos];
+                       spritepixels[spr_pos].attach = has_attach;
+               }
        }
 
        if (spr_pos > sprite_last_x)
index 16a9366d1116f9b701dfe7d341bfbaeb8d499005..55548cf3d8acde948e01eaaaf763b077b6ade5d4 100644 (file)
--- a/gencpu.c
+++ b/gencpu.c
@@ -48,6 +48,7 @@ static int optimized_flags;
 #define GF_NOREFILL 8
 #define GF_PREFETCH 16
 #define GF_FC 32
+#define GF_MOVE 64
 
 /* For the current opcode, the next lower level that will have different code.
 * Initialized to -1 for each opcode. If it remains unchanged, indicates we
@@ -220,7 +221,7 @@ static const char *bit_mask (int size)
        return 0;
 }
 
-static void gen_nextilong (char *type, char *name, int norefill)
+static void gen_nextilong (char *type, char *name, int flags)
 {
        int r = m68k_pc_offset;
        m68k_pc_offset += 4;
@@ -231,7 +232,7 @@ static void gen_nextilong (char *type, char *name, int norefill)
        } else if (using_ce) {
                printf ("\t%s %s;\n", type, name);
                /* we must do this because execution order of (something | something2) is not defined */
-               if (norefill) {
+               if (flags & GF_NOREFILL) {
                        printf ("\t%s = get_word_ce_prefetch (%d) << 16;\n", name, r + 2);
                        count_read++;
                        printf ("\t%s |= regs.irc;\n", name);
@@ -243,7 +244,7 @@ static void gen_nextilong (char *type, char *name, int norefill)
                }
        } else {
                if (using_prefetch) {
-                       if (norefill) {
+                       if (flags & GF_NOREFILL) {
                                printf ("\t%s %s;\n", type, name);
                                printf ("\t%s = get_word_prefetch (%d) << 16;\n", name, r + 2);
                                count_read++;
@@ -268,7 +269,7 @@ static void gen_nextilong (char *type, char *name, int norefill)
        }
 }
 
-static const char *gen_nextiword (int norefill)
+static const char *gen_nextiword (int flags)
 {
        static char buffer[80];
        int r = m68k_pc_offset;
@@ -278,7 +279,7 @@ static const char *gen_nextiword (int norefill)
                sprintf (buffer, "get_word_ce020_prefetch (%d)", r);
                count_read++;
        } else if (using_ce) {
-               if (norefill) {
+               if (flags & GF_NOREFILL) {
                        strcpy (buffer, "regs.irc");
                } else {
                        sprintf (buffer, "get_word_ce_prefetch (%d)", r + 2);
@@ -286,7 +287,7 @@ static const char *gen_nextiword (int norefill)
                }
        } else {
                if (using_prefetch) {
-                       if (norefill) {
+                       if (flags & GF_NOREFILL) {
                                sprintf (buffer, "regs.irc", r);
                        } else {
                                sprintf (buffer, "get_word_prefetch (%d)", r + 2);
@@ -307,7 +308,7 @@ static const char *gen_nextiword (int norefill)
        return buffer;
 }
 
-static const char *gen_nextibyte (int norefill)
+static const char *gen_nextibyte (int flags)
 {
        static char buffer[80];
        int r = m68k_pc_offset;
@@ -317,7 +318,7 @@ static const char *gen_nextibyte (int norefill)
                sprintf (buffer, "(uae_u8)get_word_ce020_prefetch (%d)", r);
                count_read++;
        } else if (using_ce) {
-               if (norefill) {
+               if (flags & GF_NOREFILL) {
                        strcpy (buffer, "(uae_u8)regs.irc");
                } else {
                        sprintf (buffer, "(uae_u8)get_word_ce_prefetch (%d)", r + 2);
@@ -326,7 +327,7 @@ static const char *gen_nextibyte (int norefill)
        } else {
                insn_n_cycles += 4;
                if (using_prefetch) {
-                       if (norefill) {
+                       if (flags & GF_NOREFILL) {
                                sprintf (buffer, "(uae_u8)regs.irc", r);
                        } else {
                                sprintf (buffer, "(uae_u8)get_word_prefetch (%d)", r + 2);
@@ -489,6 +490,18 @@ static void gen_set_fault_pc (void)
        m68k_pc_offset = 0;
 }
 
+static void syncmovepc (int getv, int flags)
+{
+#if 0
+       if (!(flags & GF_MOVE))
+               return;
+       if (getv == 1) {
+               sync_m68k_pc ();
+               //fill_prefetch_next ();
+       }
+#endif
+}
+
 /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
 * the calling routine handles Apdi and Aipi modes.
 * gb-- movem == 2 means the same thing but for a MOVE16 instruction */
@@ -500,7 +513,7 @@ static void gen_set_fault_pc (void)
 * side effect in case a bus fault is generated by any memory access.
 * XJ - 2006/11/13 */
 
-static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags, int fixup, int e3fudge)
+static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags, int fixup)
 {
        char namea[100];
        int m68k_pc_offset_last = m68k_pc_offset;
@@ -535,6 +548,7 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                        default:
                                abort ();
                }
+               syncmovepc (getv, flags);
                return;
        case Areg:
                if (movem)
@@ -550,6 +564,7 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                        default:
                                abort ();
                }
+               syncmovepc (getv, flags);
                return;
        case Aind: // (An)
                printf ("\tuaecptr %sa = m68k_areg (regs, %s);\n", name, reg);
@@ -582,7 +597,7 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                }
                break;
        case Ad16: // (d16,An)
-               printf ("\tuaecptr %sa = m68k_areg (regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword (flags & GF_NOREFILL));
+               printf ("\tuaecptr %sa = m68k_areg (regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword (flags));
                count_read_ea++; 
                break;
        case Ad8r: // (d8,An,Xn)
@@ -601,18 +616,18 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                        else
                                printf ("\t%sa = get_disp_ea_020 (m68k_areg (regs, %s), next_iword ());\n", name, reg);
                } else {
-                       printf ("\t%sa = get_disp_ea_000 (m68k_areg (regs, %s), %s);\n", name, reg, gen_nextiword (flags & GF_NOREFILL));
+                       if (!(flags & GF_AD8R)) {
+                               addcycles000 (2);
+                               insn_n_cycles += 2;
+                               count_cycles_ea += 2;
+                       }
+                       printf ("\t%sa = get_disp_ea_000 (m68k_areg (regs, %s), %s);\n", name, reg, gen_nextiword (flags));
                        count_read_ea++; 
                }
-               if (!(flags & GF_AD8R)) {
-                       addcycles000 (2);
-                       insn_n_cycles += 2;
-                       count_cycles_ea += 2;
-               }
                break;
        case PC16: // (d16,PC,Xn)
                printf ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset);
-               printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword (flags & GF_NOREFILL));
+               printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword (flags));
                break;
        case PC8r: // (d8,PC,Xn)
                printf ("\tuaecptr tmppc;\n");
@@ -633,20 +648,20 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                                printf ("\t%sa = get_disp_ea_020 (tmppc, next_iword ());\n", name);
                } else {
                        printf ("\ttmppc = m68k_getpc () + %d;\n", m68k_pc_offset);
-                       printf ("\t%sa = get_disp_ea_000 (tmppc, %s);\n", name, gen_nextiword (flags & GF_NOREFILL));
-               }
-               if (!(flags & GF_PC8R)) {
-                       addcycles000 (2);
-                       insn_n_cycles += 2;
-                       count_cycles_ea += 2;
+                       if (!(flags & GF_PC8R)) {
+                               addcycles000 (2);
+                               insn_n_cycles += 2;
+                               count_cycles_ea += 2;
+                       }
+                       printf ("\t%sa = get_disp_ea_000 (tmppc, %s);\n", name, gen_nextiword (flags));
                }
 
                break;
        case absw:
-               printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword (flags & GF_NOREFILL));
+               printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword (flags));
                break;
        case absl:
-               gen_nextilong ("uaecptr", namea, flags & GF_NOREFILL);
+               gen_nextilong ("uaecptr", namea, flags);
                count_read_ea += 2;
                break;
        case imm:
@@ -655,55 +670,67 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
                insn_n_cycles020++;
                switch (size) {
                case sz_byte:
-                       printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte (flags & GF_NOREFILL));
+                       printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte (flags));
                        count_read_ea++;
                        break;
                case sz_word:
-                       printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword (flags & GF_NOREFILL));
+                       printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword (flags));
                        count_read_ea++;
                        break;
                case sz_long:
-                       gen_nextilong ("uae_s32", name, flags & GF_NOREFILL);
+                       gen_nextilong ("uae_s32", name, flags);
                        count_read_ea += 2;
                        break;
                default:
                        abort ();
                }
+               syncmovepc (getv, flags);
                return;
        case imm0:
                if (getv != 1)
                        abort ();
-               printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte (flags & GF_NOREFILL));
+               printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte (flags));
                count_read_ea++;
+               syncmovepc (getv, flags);
                return;
        case imm1:
                if (getv != 1)
                        abort ();
-               printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword (flags & GF_NOREFILL));
+               printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword (flags));
                count_read_ea++;
+               syncmovepc (getv, flags);
                return;
        case imm2:
                if (getv != 1)
                        abort ();
-               gen_nextilong ("uae_s32", name, flags & GF_NOREFILL);
+               gen_nextilong ("uae_s32", name, flags);
                count_read_ea += 2;
+               syncmovepc (getv, flags);
                return;
        case immi:
                if (getv != 1)
                        abort ();
                printf ("\tuae_u32 %s = %s;\n", name, reg);
+               syncmovepc (getv, flags);
                return;
        default:
                abort ();
        }
 
+       syncmovepc (getv, flags);
+
        /* We get here for all non-reg non-immediate addressing modes to
        * actually fetch the value. */
 
        if ((using_prefetch || using_ce) && using_exception_3 && getv != 0 && size != sz_byte) {
+               int offset = 0;
+               if (flags & GF_MOVE)
+                       offset = m68k_pc_offset;
+               else
+                       offset = m68k_pc_offset_last;
                printf ("\tif (%sa & 1) {\n", name);
                printf ("\t\texception3 (opcode, m68k_getpc () + %d, %sa);\n",
-                       m68k_pc_offset_last + e3fudge, name);
+                       offset, name);
                printf ("\t\tgoto %s;\n", endlabelstr);
                printf ("\t}\n");
                need_endlabel = 1;
@@ -793,7 +820,7 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g
 static void genamode_fixup (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags, int fixup)
 {
        if (fixup != 2) {
-               genamode2 (mode, reg, size, name, getv, movem, flags, fixup, 0);
+               genamode2 (mode, reg, size, name, getv, movem, flags, fixup);
        } else {
                if (!movem) {
                        switch (mode)
@@ -809,7 +836,7 @@ static void genamode_fixup (amodes mode, char *reg, wordsizes size, char *name,
 
 static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags)
 {
-       genamode2 (mode, reg, size, name, getv, movem, flags, 0, 0);
+       genamode2 (mode, reg, size, name, getv, movem, flags, 0);
 }
 static void genamode_pre (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags)
 {
@@ -820,10 +847,6 @@ static void genamode_post (amodes mode, char *reg, wordsizes size, char *name, i
        if (using_mmu)
                genamode_fixup (mode, reg, size, name, getv, movem, flags, 2);
 }
-static void genamode_e3 (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem, int flags, int e3fudge)
-{
-       genamode2 (mode, reg, size, name, getv, movem, flags, 0, e3fudge);
-}
 
 static void genastore_2 (char *from, amodes mode, char *reg, wordsizes size, char *to, int store_dir, int flags)
 {
@@ -1539,10 +1562,10 @@ static void gen_opcode (unsigned long int opcode)
                        if (curi->smode == imm || curi->smode == Dreg)
                                c += 2;
                }
+               fill_prefetch_next ();
                if (c > 0)
                        addcycles000 (c);
-               fill_prefetch_next ();
-               genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
+               genastore_rev ("src", curi->dmode, "dstreg", curi->size, "dst");
                break;
        }
        case i_ORSR:
@@ -1569,42 +1592,45 @@ static void gen_opcode (unsigned long int opcode)
                printf ("\tMakeFromSR ();\n");
                break;
        case i_SUB:
+       {
+               int c = 0;
                genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0, 0);
                if (curi->dmode == Dreg) {
-                       int c = 0;
                        if (curi->size == sz_long) {
                                c += 2;
                                if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg)
                                        c += 2;
                        }
-                       if (c > 0)
-                               addcycles000 (c);
                }
                fill_prefetch_next ();
+               if (c > 0)
+                       addcycles000 (c);
                start_brace ();
                genflags (flag_sub, curi->size, "newv", "src", "dst");
-               genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
+               genastore_rev ("newv", curi->dmode, "dstreg", curi->size, "dst");
                break;
+       }
        case i_SUBA:
+       {
+               int c = 0;
                genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0, 0);
                if (curi->smode == immi) {
-                       int c = 4;
-                       if (c > 0)
-                               addcycles000 (c);
+                       c = 4;
                } else {
-                       int c = curi->size == sz_long ? 2 : 4;
+                       c = curi->size == sz_long ? 2 : 4;
                        if (islongimm (curi))
                                c += 2;
-                       if (c > 0)
-                               addcycles000 (c);
                }
                fill_prefetch_next ();
+               if (c > 0)
+                       addcycles000 (c);
                start_brace ();
                printf ("\tuae_u32 newv = dst - src;\n");
                genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
                break;
+       }
        case i_SUBX:
                genamode_pre (curi->smode, "srcreg", curi->size, "src", 1, 0, GF_AA);
                genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0, GF_AA);
@@ -1648,44 +1674,45 @@ static void gen_opcode (unsigned long int opcode)
                genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
                break;
        case i_ADD:
+       {
+               int c = 0;
                genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0, 0);
                if (curi->dmode == Dreg) {
-                       int c = 0;
                        if (curi->size == sz_long) {
                                c += 2;
                                if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg)
                                        c += 2;
                        }
-                       if (c > 0)
-                               addcycles000 (c);
                }
                fill_prefetch_next ();
+               if (c > 0)
+                       addcycles000 (c);
                start_brace ();
                genflags (flag_add, curi->size, "newv", "src", "dst");
-               genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
+               genastore_rev ("newv", curi->dmode, "dstreg", curi->size, "dst");
                break;
+       }
        case i_ADDA:
+       {
+               int c = 0;
                genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0, 0);
                if (curi->smode == immi) {
-                       int c = curi->size == sz_long ? 4 : 0;
-                       if (islongimm (curi))
-                               c += 2;
-                       if (c > 0)
-                               addcycles000 (c);
+                       c += 4;
                } else {
-                       int c = curi->size == sz_long ? 2 : 4;
+                       c = curi->size == sz_long ? 2 : 4;
                        if (islongimm (curi))
                                c += 2;
-                       if (c > 0)
-                               addcycles000 (c);
                }
                fill_prefetch_next ();
+               if (c > 0)
+                       addcycles000 (c);
                start_brace ();
                printf ("\tuae_u32 newv = dst + src;\n");
                genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
                break;
+       }
        case i_ADDX:
                genamode_pre (curi->smode, "srcreg", curi->size, "src", 1, 0, GF_AA);
                genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0, GF_AA);
@@ -1839,9 +1866,9 @@ static void gen_opcode (unsigned long int opcode)
        case i_CMP:
                genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0, 0);
+               fill_prefetch_next ();
                if (curi->dmode == Dreg && curi->size == sz_long)
                        addcycles000 (2);
-               fill_prefetch_next ();
                start_brace ();
                genflags (flag_cmp, curi->size, "newv", "src", "dst");
                break;
@@ -1885,19 +1912,20 @@ static void gen_opcode (unsigned long int opcode)
        case i_MOVE:
        case i_MOVEA:
                {
-                       /* 2 MOVE instructions have special prefetch sequence:
+                       /* 2 MOVE instruction variants have special prefetch sequence:
                        * - MOVE <ea>,-(An) = prefetch is before writes (Apdi)
-                       * - MOVE memory,(xxx).L, the most stupid ever. 2 prefetches after write
+                       * - MOVE memory,(xxx).L = 2 prefetches after write
                        * - all others = prefetch is done after writes
                        *
                        * - move.x xxx,[at least 1 extension word here] = fetch 1 extension word before (xxx)
+                       *
+                       * - current theory: moves are build from 3 separate microcode subroutines, fetch, move and write
                        */
                        int prefetch_done = 0, flags;
                        int dualprefetch = curi->dmode == absl && (curi->smode != Dreg && curi->smode != Areg && curi->smode != imm);
-                       genamode_pre (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
+                       genamode_pre (curi->smode, "srcreg", curi->size, "src", 1, 0, GF_MOVE);
                        flags = 1 | (dualprefetch ? GF_NOREFILL : 0);
-                       /* MOVE.L dx,(ax) exception3 PC points to next instruction. hackhackhack */
-                       genamode_e3 (curi->dmode, "dstreg", curi->size, "dst", 2, 0, flags, curi->smode == Dreg && curi->dmode == Aind ? 2 : 0);
+                       genamode2 (curi->dmode, "dstreg", curi->size, "dst", 2, 0, flags, 0);
                        genamode_post (curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                        if (curi->mnemo == i_MOVEA && curi->size == sz_word)
                                printf ("\tsrc = (uae_s32)(uae_s16)src;\n");
index 6c6047347fc8f9f1d1cdfdc1c922010973bea16e..ee27ae39ee0a46f1dcf9db187f2a52214668c567 100644 (file)
--- a/newcpu.c
+++ b/newcpu.c
@@ -2717,6 +2717,8 @@ STATIC_INLINE int do_specialties (int cycles)
 void prepare_interrupt (void)
 {
        interrupt_cycles = get_cycles () + 5 * CYCLE_UNIT + CYCLE_UNIT / 2;
+       if (vpos == 0 && current_hpos () == 0)
+               interrupt_cycles -= CYCLE_UNIT; // vblank int hpos=-1
        interrupt_cycles_active = 1;
 }
 
index 9db90110b6627d0bd8f8498897fe7ea2d2ad1452..0f78ba96e2f9d94684374407d808c1154fc5f106 100644 (file)
@@ -407,6 +407,13 @@ void my_kbd_handler (int keyboard, int scancode, int newstate)
                        }
                        break;
                case DIK_F5:
+#if 0
+                       {
+                               extern int crap;
+                               crap++;
+                               write_log (L"%d\n", crap);
+                       }
+#endif
                        if (specialpressed ()) {
                                if (shiftpressed ())
                                        code = AKS_STATESAVEDIALOG;
index 6e3c1a783b1162b7e8fd1a7c0d11bda6e494ba6c..69bac1fc3a023d20152b6d8dfea96cef50e54c57 100644 (file)
@@ -18,8 +18,8 @@
 #define WINUAEPUBLICBETA 1
 #define LANG_DLL 1
 
-#define WINUAEBETA L"Beta 2"
-#define WINUAEDATE MAKEBD(2010, 1, 9)
+#define WINUAEBETA L"Beta 3"
+#define WINUAEDATE MAKEBD(2010, 1, 10)
 #define WINUAEEXTRA L""
 #define WINUAEREV L""
 
index d1a0e1ec8d6704ef4b11fbc35a79cc96a807cfe5..d3de097de86bf6fe63cab5f658da2ba2996cd5ac 100644 (file)
@@ -1526,16 +1526,19 @@ static UINT_PTR CALLBACK ofnhook (HWND hDlg, UINT message, WPARAM wParam, LPARAM
        }
        if (!doit)
                return FALSE;
+       write_log (L"OFNHOOK\n");
        md = getdisplay (&currprefs);
        if (!md)
                return FALSE;
        w2 = WIN32GFX_GetWidth ();
        h2 = WIN32GFX_GetHeight ();
-       if (w2 == prevwidth && h2 == prevheight)
+       if (w2 == prevwidth && h2 == prevheight) {
+               write_log (L"SAME %dx%d\n", w2, h2);
                return FALSE;
+       }
        prevwidth = w2;
        prevheight = h2;
-       //write_log (L"%dx%d %dx%d (%dx%d)\n", md->rect.left, md->rect.top, md->rect.right, md->rect.bottom, w2, h2);
+       write_log (L"MOVEWINDOW %dx%d %dx%d (%dx%d)\n", md->rect.left, md->rect.top, md->rect.right, md->rect.bottom, w2, h2);
        hWnd = GetParent (hDlg);
        GetWindowRect (hWnd, &windowRect);
        width = windowRect.right - windowRect.left;
index cb775d68eac8d863670b6ffb0be2bd324b32e15d..18007c58933c34b361b1bba2c5364e4be7c1d8c6 100644 (file)
@@ -1,4 +1,25 @@
 
+Beta 3:
+
+- Shadow Fighter AGA graphics priority issue really fixed now
+- COPJMP cycles in DMA debugger shown correctly, no functional
+  change (after COPJMPx access copper does dummy move cycle before
+  COPxLC changes, dummy data and addresses shown now correctly)
+- show CPU access type (byte, word or long if 32-bit bus) in DMA
+  debugger. TODO: separate instruction and data fetches without
+  slowing everything down..
+- added DMA channel names to DMA debugger (COP, BLT etc..)  
+- few hours of boring logic analyzer CPU cycle usage checks..
+- 68000 AND.L, OR.L, EOR.L, ADD.L, SUB.L also write data in reverse
+  order (like NOT.L, CLR.L and NEG.L do, R+0, R+2, W+2, W+0)
+- CMP idle cycle and prefetch swapped (previously only CMPA)
+- AND/OR/EOR/ADD/SUB #x,Dn idle cycle and prefetch swapped
+- ADDQ.L #x,An had wrong cycle count
+- 68000 interrupt startup cycle counting updated
+- MOVE address error handling may be temporarily broken
+- 68020 ce-mode cpu chip bus access used a500-like timing
+- above changes seems to have fixed some demo glitches
+
 Beta 2:
 
 - ioctl cd drive detection corrupted memory if more than 8 drives