From d60ef0c40dc3f6005511a672dc4038efd918c5a3 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 21 Sep 2013 14:27:55 +0300 Subject: [PATCH] 2700b8 --- blkdev.cpp | 35 ++++- cd32_fmv.cpp | 2 +- cia.cpp | 25 +--- custom.cpp | 132 ++++++++++++------- drawing.cpp | 13 +- gfxboard.cpp | 2 +- inputdevice.cpp | 2 +- jit/compemu_fpp.cpp | 2 - memory.cpp | 2 + newcpu.cpp | 16 ++- od-win32/build68k_msvc/build68k_msvc.vcxproj | 2 +- od-win32/gencomp_msvc/gencomp_msvc.vcxproj | 2 +- od-win32/gencpu_msvc/gencpu_msvc.vcxproj | 2 +- od-win32/resources/winuae.exe.manifest | 1 + od-win32/resources/winuae64.exe.manifest | 1 + od-win32/screenshot.cpp | 6 +- od-win32/srcrelease.cmd | 2 + od-win32/win32.cpp | 5 +- od-win32/win32.h | 4 +- od-win32/win32gfx.cpp | 32 +++-- od-win32/win32gui.cpp | 8 +- od-win32/winuae_msvc11/winuae_msvc.vcxproj | 4 +- od-win32/winuaechangelog.txt | 68 ++++++++++ rommgr.cpp | 4 +- scsi.cpp | 3 +- table68k | 2 +- zfile_archive.cpp | 4 +- 27 files changed, 271 insertions(+), 110 deletions(-) diff --git a/blkdev.cpp b/blkdev.cpp index f693e3e2..15909661 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -1220,6 +1220,8 @@ static int scsi_read_cd_data (int unitnum, uae_u8 *scsi_data, uae_u32 offset, ua { struct blkdevstate *st = &state[unitnum]; if (len == 0) { + if (offset >= di->sectorspertrack * di->cylinders * di->trackspercylinder) + return -1; *scsi_len = 0; return 0; } else { @@ -1379,8 +1381,12 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, int pc = cmdbuf[2] >> 6; int pcode = cmdbuf[2] & 0x3f; int dbd = cmdbuf[1] & 8; - if (cmdbuf[0] == 0x5a) + + if (atapi) { + if (!sense10) + goto err; dbd = 1; + } if (log_scsiemu) write_log (_T("MODE SENSE PC=%d CODE=%d DBD=%d\n"), pc, pcode, dbd); p = r; @@ -1478,9 +1484,10 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, r[3] = bdsize & 0xff; r[0] = totalsize & 0xff; } - scsi_len = lr = totalsize + 1; + scsi_len = totalsize + 1; if (scsi_len > maxlen) scsi_len = maxlen; + lr = scsi_len; } break; case 0x01: /* REZERO UNIT */ @@ -1515,6 +1522,18 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, scsi_len = lr = 8; } break; + case 0x0b: /* SEEK (6) */ + { + if (nodisk (&di)) + goto nodisk; + stopplay (unitnum); + offset = ((cmdbuf[1] & 31) << 16) | (cmdbuf[2] << 8) | cmdbuf[3]; + struct cd_toc *t = gettoc (&di.toc, offset); + v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len); + if (v == -1) + goto outofbounds; + } + break; case 0x08: /* READ (6) */ { if (nodisk (&di)) @@ -1540,6 +1559,18 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, break; case 0x0a: /* WRITE (6) */ goto readprot; + case 0x2b: /* SEEK (10) */ + { + if (nodisk (&di)) + goto nodisk; + stopplay (unitnum); + offset = rl (cmdbuf + 2); + struct cd_toc *t = gettoc (&di.toc, offset); + v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len); + if (v == -1) + goto outofbounds; + } + break; case 0x28: /* READ (10) */ { if (nodisk (&di)) diff --git a/cd32_fmv.cpp b/cd32_fmv.cpp index d7230c3c..6836c0a9 100644 --- a/cd32_fmv.cpp +++ b/cd32_fmv.cpp @@ -379,7 +379,7 @@ static addrbank fmv_bank = { void cd32_fmv_init (uaecptr start) { - int ids[] = { 23, -1 }; + int ids[] = { 23, 74, -1 }; struct romlist *rl = getromlistbyids (ids); struct romdata *rd; struct zfile *z; diff --git a/cia.cpp b/cia.cpp index 30a1a35f..c61382c0 100644 --- a/cia.cpp +++ b/cia.cpp @@ -68,7 +68,6 @@ static unsigned int ciaaicr, ciaaimask, ciabicr, ciabimask; static unsigned int ciaacra, ciaacrb, ciabcra, ciabcrb; static unsigned int ciaastarta, ciaastartb, ciabstarta, ciabstartb; -static unsigned int ciaaicr_reg, ciabicr_reg; /* Values of the CIA timers. */ static unsigned long ciaata, ciaatb, ciabta, ciabtb; @@ -129,7 +128,6 @@ static void RethinkICRA (void) #endif if (!(ciaaicr & 0x80)) { ciaaicr |= 0x80; - ciaaicr_reg |= 0x80; if (currprefs.cpu_cycle_exact) event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x0008, ICRA); else @@ -146,7 +144,6 @@ static void RethinkICRB (void) #endif if (!(ciabicr & 0x80)) { ciabicr |= 0x80; - ciabicr_reg |= 0x80; if (currprefs.cpu_cycle_exact) event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x2000, ICRB); else @@ -356,8 +353,6 @@ static int CIA_update_check (void) if (bsp) { ciabicr |= 8; icr |= 2; } - ciaaicr_reg |= ciaaicr; - ciabicr_reg |= ciabicr; return icr; } static void CIA_update (void) @@ -446,13 +441,11 @@ void CIA_handler (void) void cia_diskindex (void) { - ciabicr_reg |= 0x10; ciabicr |= 0x10; RethinkICRB (); } void cia_parallelack (void) { - ciaaicr_reg |= 0x10; ciaaicr |= 0x10; RethinkICRA (); } @@ -491,7 +484,6 @@ STATIC_INLINE bool ciab_checkalarm (bool inc, bool irq) write_log (_T("CIAB tod %08x %08x\n"), ciabtod, ciabalarm); #endif if (irq) { - ciabicr_reg |= 4; ciabicr |= 4; RethinkICRB (); } @@ -507,7 +499,6 @@ STATIC_INLINE void ciaa_checkalarm (bool inc) #if CIAA_DEBUG_IRQ write_log (_T("CIAA tod %08x %08x\n"), ciaatod, ciaaalarm); #endif - ciaaicr_reg |= 4; ciaaicr |= 4; RethinkICRA (); } @@ -605,7 +596,6 @@ static void sendrw (void) ciaasdr = kbcode; kblostsynccnt = 8 * maxvpos * 8; // 8 frames * 8 bits. ciaaicr |= 8; - ciaaicr_reg |= 8; RethinkICRA (); write_log (_T("KB: sent reset warning code (phase=%d)\n"), resetwarning_phase); } @@ -676,7 +666,6 @@ static void keyreq (void) ciaasdr = kbcode; kblostsynccnt = 8 * maxvpos * 8; // 8 frames * 8 bits. ciaaicr |= 8; - ciaaicr_reg |= 8; RethinkICRA (); } @@ -739,7 +728,7 @@ void CIAB_tod_handler (int hoffset) void CIA_hsync_posthandler (bool dotod) { // Previous line was supposed to increase TOD but - // no one cared. Do it now at the start of next line. + // no one cared. Do it now. if (ciab_tod_event_state == 1) CIAB_tod_inc (0); ciab_tod_event_state = 0; @@ -1005,10 +994,8 @@ static uae_u8 ReadCIAA (unsigned int addr) #endif return ciaasdr; case 13: - tmp = ciaaicr_reg & ~0x40; + tmp = ciaaicr & ~0x40; ciaaicr = 0; - ciaaicr_reg = 0; - //RethinkICRA (); return tmp; case 14: return ciaacra; @@ -1118,10 +1105,8 @@ static uae_u8 ReadCIAB (unsigned int addr) case 12: return ciabsdr; case 13: - tmp = ciabicr_reg & ~0x40; + tmp = ciabicr & ~0x40; ciabicr = 0; - ciabicr_reg = 0; - //RethinkICRB (); return tmp; case 14: //write_log (_T("CIABCRA READ %d %x\n"), ciabcra, M68K_GETPC); @@ -1273,6 +1258,7 @@ static void WriteCIAA (uae_u16 addr, uae_u8 val) break; case 13: setclr (&ciaaimask,val); + RethinkICRA (); break; case 14: CIA_update (); @@ -1436,6 +1422,7 @@ static void WriteCIAB (uae_u16 addr, uae_u8 val) break; case 13: setclr (&ciabimask, val); + RethinkICRB (); break; case 14: CIA_update (); @@ -1492,7 +1479,7 @@ void CIA_reset (void) ciaatlatch = ciabtlatch = 0; ciaapra = 0; ciaadra = 0; ciaatod = ciabtod = 0; ciaatodon = ciabtodon = 0; - ciaaicr = ciaaicr_reg = ciabicr = ciabicr_reg = ciaaimask = ciabimask = 0; + ciaaicr = ciabicr = ciaaimask = ciabimask = 0; ciaacra = ciaacrb = ciabcra = ciabcrb = 0x4; /* outmode = toggle; */ ciaala = ciaalb = ciabla = ciablb = ciaata = ciaatb = ciabta = ciabtb = 0xFFFF; ciaaalarm = ciabalarm = 0; diff --git a/custom.cpp b/custom.cpp index 9c8d5d68..14442926 100644 --- a/custom.cpp +++ b/custom.cpp @@ -385,7 +385,7 @@ static uae_u32 thisline_changed; #endif static struct decision thisline_decision; -static int fetch_cycle, fetch_modulo_cycle; +static int fetch_cycle, fetch_modulo_cycle, fetch_align; enum plfstate { @@ -727,7 +727,7 @@ static void finish_playfield_line (void) are contained in an indivisible block during which ddf is active. E.g. if DDF starts at 0x30, and fetchunit is 8, then possible DDF stops are 0x30 + n * 8. */ -static int fetchunit, fetchunit_mask; +static int fetchunit, fetchunit_mask, fetchunit_align_mask; /* The delay before fetching the same bitplane again. Can be larger than the number of bitplanes; in that case there are additional empty cycles with no data fetch (this happens for high fetchmodes and low @@ -853,7 +853,7 @@ static uae_u32 fetched_aga1[MAX_PLANES]; #endif /* Expansions from bplcon0/bplcon1. */ -static int toscr_res, toscr_nr_planes, toscr_nr_planes2, fetchwidth; +static int toscr_res, toscr_nr_planes, toscr_nr_planes2, toscr_nr_planes_agnus, fetchwidth; static int toscr_delay1, toscr_delay2; /* The number of bits left from the last fetched words. @@ -865,7 +865,7 @@ we can do more work at once. */ static int toscr_nbits; /* undocumented bitplane delay hardware feature */ -static int delayoffset; +static int delayoffset, delayoffset2; STATIC_INLINE void compute_delay_offset (void) { @@ -958,9 +958,34 @@ static void update_denise (int hpos) } } +/* Expand bplcon0/bplcon1 into the toscr_xxx variables. */ +static void compute_toscr_delay_1 (int bplcon1) +{ + int delay1 = (bplcon1 & 0x0f) | ((bplcon1 & 0x0c00) >> 6); + int delay2 = ((bplcon1 >> 4) & 0x0f) | (((bplcon1 >> 4) & 0x0c00) >> 6); + int shdelay1 = (bplcon1 >> 12) & 3; + int shdelay2 = (bplcon1 >> 8) & 3; + int delaymask; + int fetchwidth = 16 << fetchmode; + + delay1 += delayoffset + delayoffset2; + delay2 += delayoffset + delayoffset2; + delaymask = (fetchwidth - 1) >> toscr_res; + toscr_delay1 = (delay1 & delaymask) << toscr_res; + toscr_delay1 |= shdelay1 >> (RES_MAX - toscr_res); + toscr_delay2 = (delay2 & delaymask) << toscr_res; + toscr_delay2 |= shdelay2 >> (RES_MAX - toscr_res); +} + +static void compute_toscr_delay (int hpos, int bplcon1) +{ + update_denise (hpos); + compute_toscr_delay_1 (bplcon1); +} + static int bpldmasetuphpos; static int bpldmasetupphase; - +static void update_toscr_planes (void); /* set currently active Agnus bitplane DMA sequence */ static void setup_fmodes (int hpos) { @@ -983,6 +1008,7 @@ static void setup_fmodes (int hpos) bplcon0_planes_limit = GET_PLANES_LIMIT (bplcon0); fetchunit = fetchunits[fetchmode * 4 + bplcon0_res]; fetchunit_mask = fetchunit - 1; + fetchunit_align_mask = fetchunit >> 1; fetchstart_shift = fetchstarts[fetchmode * 4 + bplcon0_res]; fetchstart = 1 << fetchstart_shift; fetchstart_mask = fetchstart - 1; @@ -997,6 +1023,11 @@ static void setup_fmodes (int hpos) record_dma_event (DMA_EVENT_BPLFETCHUPDATE, hpos, vpos); bpldmasetuphpos = -1; bpldmasetupphase = 0; + toscr_nr_planes_agnus = bplcon0_planes; + if (isocs7planes ()) { + if (toscr_nr_planes_agnus < 6) + toscr_nr_planes_agnus = 6; + } ddf_change = vpos; } @@ -1047,31 +1078,6 @@ static void bpldmainitdelay (int hpos) } } -/* Expand bplcon0/bplcon1 into the toscr_xxx variables. */ -static void compute_toscr_delay_1 (int bplcon1) -{ - int delay1 = (bplcon1 & 0x0f) | ((bplcon1 & 0x0c00) >> 6); - int delay2 = ((bplcon1 >> 4) & 0x0f) | (((bplcon1 >> 4) & 0x0c00) >> 6); - int shdelay1 = (bplcon1 >> 12) & 3; - int shdelay2 = (bplcon1 >> 8) & 3; - int delaymask; - int fetchwidth = 16 << fetchmode; - - delay1 += delayoffset; - delay2 += delayoffset; - delaymask = (fetchwidth - 1) >> toscr_res; - toscr_delay1 = (delay1 & delaymask) << toscr_res; - toscr_delay1 |= shdelay1 >> (RES_MAX - toscr_res); - toscr_delay2 = (delay2 & delaymask) << toscr_res; - toscr_delay2 |= shdelay2 >> (RES_MAX - toscr_res); -} - -static void compute_toscr_delay (int hpos, int bplcon1) -{ - update_denise (hpos); - compute_toscr_delay_1 (bplcon1); -} - STATIC_INLINE void clear_fetchbuffer (uae_u32 *ptr, int nwords) { int i; @@ -1089,11 +1095,23 @@ STATIC_INLINE void clear_fetchbuffer (uae_u32 *ptr, int nwords) static void update_toscr_planes (void) { - if (toscr_nr_planes2 > thisline_decision.nr_planes) { + // This must be called just before new bitplane block starts, + // not when depth value changes. Depth can change early and can leave + // 16+ pixel horizontal line of old data visible. + if (toscr_nr_planes_agnus > thisline_decision.nr_planes) { int j; - for (j = thisline_decision.nr_planes; j < toscr_nr_planes2; j++) + for (j = thisline_decision.nr_planes; j < toscr_nr_planes_agnus; j++) { clear_fetchbuffer ((uae_u32 *)(line_data[next_lineno] + 2 * MAX_WORDS_PER_LINE * j), out_offs); - thisline_decision.nr_planes = toscr_nr_planes2; + if (thisline_decision.plfleft >= 0) { + todisplay[j][0] = 0; +#ifdef AGA + todisplay[j][1] = 0; + todisplay[j][2] = 0; + todisplay[j][3] = 0; +#endif + } + } + thisline_decision.nr_planes = toscr_nr_planes_agnus; } } @@ -1414,6 +1432,7 @@ STATIC_INLINE void beginning_of_plane_block (int hpos, int fm) #endif update_denise (hpos); + update_toscr_planes (); maybe_first_bpl1dat (hpos); bplcon1t2 = bplcon1t; @@ -1761,17 +1780,29 @@ STATIC_INLINE int one_fetch_cycle_0 (int pos, int ddfstop_to_test, int dma, int } break; case 4: - switch (cycle_start) { - case 0: fetch (3, fm, pos); break; - case 1: fetch (1, fm, pos); break; - case 2: fetch (2, fm, pos); break; - case 3: fetch (0, fm, pos); break; + if ((fetch_cycle & fetchunit_align_mask) == fetch_align) { + switch (cycle_start) { + case 0: fetch (3, fm, pos); break; + case 1: fetch (1, fm, pos); break; + case 2: fetch (2, fm, pos); break; + case 3: + fetch (0, fm, pos); + fetch_align += fetchunit_align_mask; + fetch_align &= fetchunit_align_mask; + break; + } } break; case 2: - switch (cycle_start) { - case 0: fetch (1, fm, pos); break; - case 1: fetch (0, fm, pos); break; + if ((fetch_cycle & fetchunit_align_mask) == fetch_align) { + switch (cycle_start) { + case 0: fetch (1, fm, pos); break; + case 1: + fetch (0, fm, pos); + fetch_align += fetchunit_align_mask; + fetch_align &= fetchunit_align_mask; + break; + } } break; } @@ -1876,8 +1907,6 @@ STATIC_INLINE void update_fetch (int until, int fm) if (ddfstop >= last_fetch_hpos && plfstop < ddfstop_to_test) ddfstop_to_test = plfstop; - update_toscr_planes (); - pos = last_fetch_hpos; cycle_diagram_shift = last_fetch_hpos - fetch_cycle; @@ -1901,7 +1930,6 @@ STATIC_INLINE void update_fetch (int until, int fm) if (one_fetch_cycle (pos, ddfstop_to_test, dma, fm)) return; } - #ifdef SPEEDUP /* Unrolled version of the for loop below. */ if (plf_state < plf_passed_stop && ddf_change != vpos && ddf_change + 1 != vpos @@ -1923,7 +1951,6 @@ STATIC_INLINE void update_fetch (int until, int fm) int count; count = stop - pos; - if (count >= fetchstart) { count &= ~fetchstart_mask; @@ -1947,10 +1974,8 @@ STATIC_INLINE void update_fetch (int until, int fm) add_modulos (); pos += count; fetch_cycle += count; + fetch_align ^= count & fetchunit_align_mask; } - } else { -#endif -#ifdef SPEEDUP } #endif for (; pos < until; pos++) { @@ -2027,6 +2052,7 @@ static void start_bpl_dma (int hpos, int hstart) plfstrt_sprite = plfstrt; fetch_cycle = 0; + fetch_align = 0; compute_toscr_delay (last_fetch_hpos, bplcon1); /* If someone already wrote BPL1DAT, clear the area between that point and the real fetch start. */ @@ -4133,6 +4159,8 @@ static void BPLCON0 (int hpos, uae_u16 v) if (bplcon0 == v) return; + ddf_change = vpos; + if (!issyncstopped ()) { vpos_previous = vpos; hpos_previous = hpos; @@ -5109,7 +5137,6 @@ static void update_copper (int until_hpos) if (copper_cant_read (old_hpos, 0)) continue; - hp = ch_comp & (cop_state.saved_i2 & 0xFE); if (vp == cop_state.vcmp && hp < cop_state.hcmp) break; @@ -6531,8 +6558,9 @@ static void hsync_handler_post (bool onvsync) #else static int cia_hsync; if (cia_hsync < maxhpos) { + int newcount; CIAA_tod_inc (cia_hsync); - int newcount = (vblank_hz * MAXVPOS_PAL * MAXHPOS_PAL) / (currprefs.cs_ciaatod == 2 ? 60 : 50); + newcount = (vblank_hz * (2 * maxvpos + (interlace_seen ? 1 : 0)) * (2 * maxhpos + (islinetoggle () ? 1 : 0))) / ((currprefs.cs_ciaatod == 2 ? 60 : 50) * 4); cia_hsync += newcount; } else { cia_hsync -= maxhpos; @@ -8469,6 +8497,9 @@ void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v) void do_cycles_ce (unsigned long cycles) { + unsigned long c; + + c = cycles + extra_cycle; while (cycles >= CYCLE_UNIT) { int hpos = current_hpos () + 1; sync_copper (hpos); @@ -8479,6 +8510,7 @@ void do_cycles_ce (unsigned long cycles) do_cycles (1 * CYCLE_UNIT); cycles -= CYCLE_UNIT; } + extra_cycle = c; } void do_cycles_ce020 (unsigned long cycles) diff --git a/drawing.cpp b/drawing.cpp index 00f2cb0c..19e98e11 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -738,8 +738,11 @@ static void pfield_init_linetoscr (void) native_ddf_left = coord_hw_to_window_x (ddf_left); native_ddf_right = coord_hw_to_window_x (ddf_right); +#if 0 + // this breaks Blerkenwiegel/Scoopex if (native_ddf_left < 0) native_ddf_left = 0; +#endif if (native_ddf_right < native_ddf_left) native_ddf_right = native_ddf_left; @@ -780,11 +783,11 @@ static void pfield_init_linetoscr (void) if (playfield_end < linetoscr_diw_end && hblank_right_stop > playfield_end) { playfield_end = linetoscr_diw_end; } - int end = coord_hw_to_window_x (dp_for_drawing->plfleft * 2); - if (end < visible_left_border) - end = visible_left_border; - if (end < playfield_start && end > linetoscr_diw_start) { - playfield_start = end; + int left = coord_hw_to_window_x (dp_for_drawing->plfleft * 2); + if (left < visible_left_border) + left = visible_left_border; + if (left < playfield_start && left >= linetoscr_diw_start) { + playfield_start = left; } } diff --git a/gfxboard.cpp b/gfxboard.cpp index a03bc4c9..8f1e5e2b 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -552,7 +552,7 @@ static void reset_pci (void) static void picassoiv_checkswitch (void) { if (ISP4()) { - monswitch = (picassoiv_flifi & 1) == 0 && (vga.vga.cr[0x51] & 8) == 0; + monswitch = (picassoiv_flifi & 1) == 0 || (vga.vga.cr[0x51] & 8) == 0; } } diff --git a/inputdevice.cpp b/inputdevice.cpp index 458fbdd7..b941343a 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -1436,7 +1436,7 @@ static void inputdevice_mh_abs (int x, int y, uae_u32 buttonbits) x -= mouseoffset_x + 1; y -= mouseoffset_y + 2; - //write_log (_T("%dx%d %08x\n"), x, y, buttonbits); + write_log (_T("%04dx%04d %08x\n"), x, y, buttonbits); p[MH_ABSX] = x >> 8; p[MH_ABSX + 1] = x; diff --git a/jit/compemu_fpp.cpp b/jit/compemu_fpp.cpp index 096b5948..ce1e8dac 100644 --- a/jit/compemu_fpp.cpp +++ b/jit/compemu_fpp.cpp @@ -8,8 +8,6 @@ * Modified 2005 Peter Keunecke */ -#include - #include "sysconfig.h" #include "sysdeps.h" diff --git a/memory.cpp b/memory.cpp index 7ac5d1dd..bdaff4d7 100644 --- a/memory.cpp +++ b/memory.cpp @@ -701,10 +701,12 @@ static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b) addr &= kickmem_bank.mask; m = (uae_u32 *)(kickmem_bank.baseaddr + addr); do_put_mem_long (m, b); +#if 0 if (addr == 524288-4) { rom_write_enabled = false; write_log (_T("ROM write disabled\n")); } +#endif } else if (a1000_kickstart_mode) { if (addr >= 0xfc0000) { addr &= kickmem_bank.mask; diff --git a/newcpu.cpp b/newcpu.cpp index 7e46cd72..88dc0c6d 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -2623,7 +2623,7 @@ static void Exception_mmu (int nr, uaecptr oldpc) Exception_build_stack_frame(oldpc, currpc, regs.mmu_fslw, nr, 0x4); } else if (nr == 3) { // address error Exception_build_stack_frame(last_fault_for_exception_3, currpc, 0, nr, 0x2); - write_log (_T("Exception %d (%x) at %x -> %x! %s at %d\n"), nr, last_fault_for_exception_3, currpc, get_long (regs.vbr + 4 * nr), __FILE__, __LINE__); + write_log (_T("Exception %d (%x) at %x -> %x!\n"), nr, last_fault_for_exception_3, currpc, get_long (regs.vbr + 4 * nr)); } else if (nr == 5 || nr == 6 || nr == 7 || nr == 9) { Exception_build_stack_frame(oldpc, currpc, regs.mmu_ssw, nr, 0x2); } else if (regs.m && nr >= 24 && nr < 32) { /* M + Interrupt */ @@ -5672,12 +5672,24 @@ uae_u8 *restore_cpu (uae_u8 *src) return src; } +static void fill_prefetch_quick (void) +{ + if (currprefs.cpu_model >= 68020) { + fill_prefetch (); + return; + } + // old statefile compatibility, this needs to done, + // even in 68000 cycle-exact mode + regs.ir = get_word (m68k_getpc ()); + regs.irc = get_word (m68k_getpc () + 2); +} + void restore_cpu_finish (void) { init_m68k (); m68k_setpc (regs.pc); doint (); - fill_prefetch (); + fill_prefetch_quick (); set_cycles (start_cycles); events_schedule (); if (regs.stopped) diff --git a/od-win32/build68k_msvc/build68k_msvc.vcxproj b/od-win32/build68k_msvc/build68k_msvc.vcxproj index efb96115..39748af1 100644 --- a/od-win32/build68k_msvc/build68k_msvc.vcxproj +++ b/od-win32/build68k_msvc/build68k_msvc.vcxproj @@ -49,7 +49,7 @@ Application false Unicode - v110 + v120_xp Application diff --git a/od-win32/gencomp_msvc/gencomp_msvc.vcxproj b/od-win32/gencomp_msvc/gencomp_msvc.vcxproj index bbd1c0fe..c7be7710 100644 --- a/od-win32/gencomp_msvc/gencomp_msvc.vcxproj +++ b/od-win32/gencomp_msvc/gencomp_msvc.vcxproj @@ -50,7 +50,7 @@ false false Unicode - v110 + v120_xp Application diff --git a/od-win32/gencpu_msvc/gencpu_msvc.vcxproj b/od-win32/gencpu_msvc/gencpu_msvc.vcxproj index 51f9f42a..29974897 100644 --- a/od-win32/gencpu_msvc/gencpu_msvc.vcxproj +++ b/od-win32/gencpu_msvc/gencpu_msvc.vcxproj @@ -43,7 +43,7 @@ Application false Unicode - v110 + v120_xp Application diff --git a/od-win32/resources/winuae.exe.manifest b/od-win32/resources/winuae.exe.manifest index 80f71119..a978602a 100644 --- a/od-win32/resources/winuae.exe.manifest +++ b/od-win32/resources/winuae.exe.manifest @@ -23,6 +23,7 @@ + diff --git a/od-win32/resources/winuae64.exe.manifest b/od-win32/resources/winuae64.exe.manifest index c3dae2bd..519c571f 100644 --- a/od-win32/resources/winuae64.exe.manifest +++ b/od-win32/resources/winuae64.exe.manifest @@ -23,6 +23,7 @@ + diff --git a/od-win32/screenshot.cpp b/od-win32/screenshot.cpp index 5b769ac1..da5dabcc 100644 --- a/od-win32/screenshot.cpp +++ b/od-win32/screenshot.cpp @@ -156,7 +156,7 @@ static int screenshot_prepare (int imagemode, struct vidbuffer *vb) bi->bmiHeader.biXPelsPerMeter = 0; bi->bmiHeader.biYPelsPerMeter = 0; bi->bmiHeader.biClrUsed = bits <= 8 ? (1 << bits) : 0; - bi->bmiHeader.biClrImportant = bi->bmiHeader.biClrUsed; + bi->bmiHeader.biClrImportant = 0; if (bits <= 8) { for (int i = 0; i < bi->bmiHeader.biClrUsed; i++) { bi->bmiColors[i].rgbRed = pal[i * 3 + 0]; @@ -372,12 +372,12 @@ static int savebmp (FILE *fp) bfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + bi->bmiHeader.biClrUsed * sizeof RGBQUAD; if (fwrite (&bfh, 1, sizeof (BITMAPFILEHEADER), fp) < sizeof (BITMAPFILEHEADER)) return 0; // failed to write bitmap file header + if (fwrite (bi, 1, sizeof (BITMAPINFOHEADER), fp) < sizeof (BITMAPINFOHEADER)) + return 0; // failed to write bitmap infomation header if (bi->bmiHeader.biClrUsed) { if (fwrite (bi->bmiColors, 1, bi->bmiHeader.biClrUsed * sizeof RGBQUAD, fp) < bi->bmiHeader.biClrUsed * sizeof RGBQUAD) return 0; // failed to write bitmap file header } - if (fwrite (bi, 1, sizeof (BITMAPINFOHEADER), fp) < sizeof (BITMAPINFOHEADER)) - return 0; // failed to write bitmap infomation header if (fwrite (lpvBits, 1, bi->bmiHeader.biSizeImage, fp) < bi->bmiHeader.biSizeImage) return 0; // failed to write the bitmap return 1; diff --git a/od-win32/srcrelease.cmd b/od-win32/srcrelease.cmd index ae03e71c..093b98aa 100644 --- a/od-win32/srcrelease.cmd +++ b/od-win32/srcrelease.cmd @@ -11,6 +11,8 @@ mkdir bak\include copy c:\projects\winuae\src\include\* c:\projects\winuae_bak\bak\include\ mkdir bak\jit copy c:\projects\winuae\src\jit\* c:\projects\winuae_bak\bak\jit\ +copy /s c:\projects\winuae\src\qemuvga\* c:\projects\winuae_bak\bak\qemuvga\ +copy /s c:\projects\winuae\src\slirp\* c:\projects\winuae_bak\bak\slirp\ copy /s c:\projects\winuae\src\od-win32\* c:\projects\winuae_bak\bak\od-win32\ copy d:\amiga\amiga\filesys.asm c:\projects\winuae_bak\bak diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 96be79e5..d8867f0a 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -506,11 +506,14 @@ bool setpaused (int priority) void setminimized (void) { - minimized = 1; + if (!minimized) + minimized = 1; set_inhibit_frame (IHF_WINDOWHIDDEN); } void unsetminimized (void) { + if (minimized < 0) + WIN32GFX_DisplayChangeRequested (2); minimized = 0; clear_inhibit_frame (IHF_WINDOWHIDDEN); } diff --git a/od-win32/win32.h b/od-win32/win32.h index 3995fb61..74b9c519 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,11 +19,11 @@ #define LANG_DLL 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("7") +#define WINUAEBETA _T("8") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2013, 9, 1) +#define WINUAEDATE MAKEBD(2013, 9, 21) #define WINUAEEXTRA _T("") //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 6b6e02b1..7b15c6c4 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1814,14 +1814,18 @@ int check_prefs_changed_gfx (void) } if (display_change_requested) { - c = 2; - keepfsmode = 0; - if (display_change_requested <= -1) { - dontcapture = true; - if (display_change_requested == -2) - setpause = true; - if (pause_emulation) - setpause = true; + if (display_change_requested == 2) { + c = 512; + } else { + c = 2; + keepfsmode = 0; + if (display_change_requested <= -1) { + dontcapture = true; + if (display_change_requested == -2) + setpause = true; + if (pause_emulation) + setpause = true; + } } display_change_requested = 0; } @@ -3709,6 +3713,18 @@ static int create_windows_2 (void) RECT r; int w, h, x, y; int nw, nh, nx, ny; + + if (minimized) { + minimized = -1; + return 1; + } +#if 0 + if (minimized && hMainWnd) { + unsetminimized (); + ShowWindow (hMainWnd, SW_SHOW); + ShowWindow (hMainWnd, SW_RESTORE); + } +#endif GetWindowRect (hAmigaWnd, &r); x = r.left; y = r.top; diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index a7630764..315425b5 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -8857,7 +8857,7 @@ static INT_PTR CALLBACK CPUDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l if (workprefs.cpu_clock_multiplier >= 1 << 8) { idx = 0; while (idx < 3) { - if (workprefs.cpu_clock_multiplier < (1 << 8) << idx) + if (workprefs.cpu_clock_multiplier <= (1 << 8) << idx) break; idx++; } @@ -8898,9 +8898,9 @@ static INT_PTR CALLBACK CPUDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l case WM_HSCROLL: recursive++; - values_from_cpudlg( hDlg ); - enable_for_cpudlg( hDlg ); - values_to_cpudlg( hDlg ); + values_from_cpudlg (hDlg); + enable_for_cpudlg ( hDlg); + values_to_cpudlg (hDlg); recursive--; break; } diff --git a/od-win32/winuae_msvc11/winuae_msvc.vcxproj b/od-win32/winuae_msvc11/winuae_msvc.vcxproj index 28b205bb..935362d8 100644 --- a/od-win32/winuae_msvc11/winuae_msvc.vcxproj +++ b/od-win32/winuae_msvc11/winuae_msvc.vcxproj @@ -51,13 +51,13 @@ Application false Unicode - v110_xp + v120_xp Application false Unicode - v110_xp + v120_xp Application diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 98434a9e..3198125a 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,6 +1,74 @@ - restore only single input target to default. +Beta 8: + +NOTE: Still no 68020/030 CE mode changes. Do not use. + +- Added CD32 MPEG ROM 40.22 (part number 391777-01) to ROM scanner. +- GUI 1x/2x/4x/custom CPU speed setting showed incorrect selection (b7) +- Added "I am Windows 8.1 compatible" manifest entry. +- Workaround for Blerkenwiegel/Scoopex breakage (261b1). May cause side-effects. +- 68000 mode "CPU trace" state file restore errors should be gone (270b4) +- 260b15 sprite update off-by-one fix. (Missing vertical sprite line in Prurient/Rebels and others) +- Enabling hires bitplanes (by writing to BPLCON0 or enabling DMA) during first 4 hires + fetch units didn't wait for next complete fetch unit block (should have skipped next 4 + "unaligned" hires fetch units) causing shifted graphics. Partially fixes RAF Megademo + single line of shifted scroller in vector part. +- Short horizontal line of incorrect graphics was visible in some very rare situations, + internal buffer was not correctly cleared. (SillyScroller / Phenomena) +- ATAPI MODE SENSE (10) returned too much data if request size was small enough. +- Return INVALID COMMAND error if ATAPI and command was MODE SENSE (6). ATAPI only supports + 10 byte variant of MODE SENSE. +- Added SEEK(6) and SEEK(10) commands to SCSI CD emulation. +- Some decompression formats (at least lha) were not compatible with file type detection. + (for example lha containing executable didn't mount as a floppy image) +- BTST Dn,#data was accidentally marked as invalid addressing mode in b7. +- Power supply TOD counting accuracy was not that good in earlier update. +- 8-bit bmp screenshots were broken (Only created when capturing 8-bit RTG mode) +- Ignore window size changes if emulation window is minimized. Readjust size (if needed) when unminimized. +- Picasso IV flifi/VGA output enable logic tweak (Linux Cirrus Logic console) + +Beta 7: READ NOTE BELOW BEFORE USING! + +- SCSI UNIT ATTENTION/MEDIA MAY HAVE CHANGED clears when TEST UNIT READY is executed, not + when UA status is read by using REQUEST SENSE. Fixes ATAPI CD disk change issues with + some AOS ATAPI drivers. +- Accessing real CD (or CD emulator) in non-SPTI mode returned read errors depending on what + kind of imaginary geometry IOCTL_CDROM_GET_DRIVE_GEOMETRY returned. +- Memory bank change (reset) removed new memwatch debugger watchpoints. +- Built-in lzx decompressor didn't always decompress last byte of file correctly... +- b4 drive spinup update change: also don't enumerate drives if new config entry is found but + drive path fails to open and returns "not found" error (for example USB card reader not connected) +- When switching from RTG to native fullscreen or vice versa, re-open fullscreen mode if number + of backbuffers, selected monitor, refreshrate or vsync mode is different. +- New adf or hdf path was not converted to relative in relative path mode. +- Added VID 0x79d, PID 0x0201 ("USB ADAPTOR") analog joystick to USB adapter to rawinput blacklist. +- "Error log" button becomes visible in bottom part of GUI if any kind of config error was detected + or config required fixing, for example directory or harddrive failed to open, attempting to enable + Z3 fast with 24-bit address space CPU etc. (Currently many messages can be confusing and not all + important messages are enabled) +- Tape drive LOAD/UNLOAD SCSI command fix, error message during Amix 2.1 retension tape command. +- Picasso IV in Z2 mode + Z2 Fast RAM enabled used incorrect internal memory mapping + (missing graphics etc..) +- Only call D3D SetMaximumFrameLatency() when buffer flipping mode is immediate. Vsync waited flipping + caused major slowdown if emulation created frames faster than current display refresh rate. +- Increased "CPU slot" Max RAM size from 64M to 128M. + +- Removed 68040+ "cycle-exact" support. It was useless and does not fit in new 68020/030 ce handling + without creating new CPU emulation core. +- Added 68020 and 68030 instruction cache dump command to debugger ("rc"). * = data valid. +- JIT + more compatible problem fixed. + +!IMPORTANT NOTE! +Following is work in progress. Do not use 68020/030 cycle-exact modes. Timing is broken. Other modes work fine. + +- Added 68030 manual head/tail/clocks timing values to table68k, gencpu automatically calculates + final values for 68020 (=68030 + 1 wait state added) and 68030 cores using table68k values and + EA timing formulas. Only includes 680x0 common instruction so far, 68020+ only instructions and + addressing modes and rarely used instructions do not have cycle-exact timing yet. + + Beta 6: - Enabled Cirrus Logic RTG VRAM size configuration. CL VRAM memory bank setups used by VRAM size diff --git a/rommgr.cpp b/rommgr.cpp index 3194d132..ab93b590 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -89,7 +89,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 74 +#define NEXT_ROM_ID 75 static struct romheader romheaders[] = { { _T("Freezer Cartridges"), 1 }, @@ -192,6 +192,8 @@ static struct romdata roms[] = { { _T("CD32 MPEG Cartridge ROM"), 3, 1, 40, 30, _T("CD32FMV\0"), 262144, 23, 1, 0, ROMTYPE_CD32CART, 0, 0, NULL, 0xc35c37bf, 0x03ca81c7,0xa7b259cf,0x64bc9582,0x863eca0f,0x6529f435 }, + { _T("CD32 MPEG Cartridge ROM"), 3, 1, 40, 22, _T("CD32FMV\0"), 262144, 74, 1, 0, ROMTYPE_CD32CART, 0, 0, _T("391777-01"), + 0xe57d05fe, 0x56077abd,0x82b652f0,0x54f76002,0xdde2bcd5,0x33198cc2 }, { _T("CDTV extended ROM v1.00"), 1, 0, 1, 0, _T("CDTV\0"), 262144, 20, 0, 0, ROMTYPE_EXTCDTV, 0, 0, NULL, 0x42baa124, 0x7BA40FFA,0x17E500ED,0x9FED041F,0x3424BD81,0xD9C907BE }, diff --git a/scsi.cpp b/scsi.cpp index 6d6e7256..880761ad 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -18,7 +18,7 @@ static int outcmd[] = { 0x0a, 0x2a, 0x2f, 0xaa, 0x15, 0x55, -1 }; static int incmd[] = { 0x01, 0x03, 0x05, 0x08, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xbd, -1 }; -static int nonecmd[] = { 0x00, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1e, 0x35, -1 }; +static int nonecmd[] = { 0x00, 0x0b, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1e, 0x2b, 0x35, -1 }; static int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 10 }; static int scsi_data_dir(struct scsi_data *sd) @@ -102,6 +102,7 @@ static void showsense(struct scsi_data *sd) static void copysense(struct scsi_data *sd) { int len = sd->cmd[4]; + //write_log (_T("REQUEST SENSE length %d (%d)\n"), len, sd->sense_len); memset(sd->buffer, 0, len); memcpy(sd->buffer, sd->sense, sd->sense_len > len ? len : sd->sense_len); if (sd->sense_len == 0) diff --git a/table68k b/table68k index 60f4421a..fb3722c7 100644 --- a/table68k +++ b/table68k @@ -132,7 +132,7 @@ 0000 rrr1 11dd dDDD:050:-----:-----:12: MVPRM.L Dr,d[Areg-Ad16] 0000 rrr1 00ss sSSS:000:--Z--:-----:11: BTST Dr,s[Dreg] - 4 0 4 -0000 rrr1 00ss sSSS:000:--Z--:-----:11: BTST Dr,s[!Areg,Dreg,Immd] +0000 rrr1 00ss sSSS:000:--Z--:-----:11: BTST Dr,s[!Areg,Dreg] - 0 0 4 fea 0000 rrr1 01ss sSSS:000:--Z--:-----:13: BCHG Dr,s[Dreg] - 6 0 6 diff --git a/zfile_archive.cpp b/zfile_archive.cpp index f2b6c950..0b87b607 100644 --- a/zfile_archive.cpp +++ b/zfile_archive.cpp @@ -2168,7 +2168,9 @@ struct zfile *archive_getzfile (struct znode *zn, unsigned int id, int flags) zf = archive_access_tar (zn); break; } - if (zf) + if (zf) { zf->archiveid = id; + zfile_fseek (zf, 0, SEEK_SET); + } return zf; } -- 2.47.3