From: Toni Wilen Date: Sun, 10 Jan 2010 11:00:08 +0000 (+0200) Subject: imported winuaesrc2020b3.zip X-Git-Tag: 2100~37 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=46946109e7e83c5c784ce4fb95312ec9d9e69a4f;p=francis%2Fwinuae.git imported winuaesrc2020b3.zip --- diff --git a/custom.c b/custom.c index 251ba6e9..2ee9ac65 100644 --- 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 58a0766a..db1325c9 100644 --- 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; diff --git a/drawing.c b/drawing.c index 1f359287..2e5ac4ae 100644 --- 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) diff --git a/gencpu.c b/gencpu.c index 16a9366d..55548cf3 100644 --- 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 ,-(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"); diff --git a/newcpu.c b/newcpu.c index 6c604734..ee27ae39 100644 --- 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; } diff --git a/od-win32/keyboard_win32.c b/od-win32/keyboard_win32.c index 9db90110..0f78ba96 100644 --- a/od-win32/keyboard_win32.c +++ b/od-win32/keyboard_win32.c @@ -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; diff --git a/od-win32/win32.h b/od-win32/win32.h index 6e3c1a78..69bac1fc 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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"" diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index d1a0e1ec..d3de097d 100644 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -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; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index cb775d68..18007c58 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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