From 8cf3512e8365b50eb744afc041dbae3534d2becb Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 14 May 2014 20:27:21 +0300 Subject: [PATCH] 2810b1 --- audio.cpp | 45 ++-- blitter.cpp | 15 +- blkdev_cdimage.cpp | 2 +- cfgfile.cpp | 16 +- cia.cpp | 88 +++++-- custom.cpp | 133 +++++++--- debug.cpp | 184 +++++++++---- disk.cpp | 48 ++-- events.cpp | 10 + filesys.cpp | 371 +++++++++++++++++++++++---- gencpu.cpp | 5 + include/debug.h | 41 ++- include/events.h | 12 +- include/fsdb.h | 1 + include/inputdevice.h | 2 +- include/memory.h | 2 +- include/options.h | 2 +- inputdevice.cpp | 187 +++++++++++--- newcpu.cpp | 16 +- od-win32/caps/CapsAPI.h | 13 +- od-win32/dinput.cpp | 2 + od-win32/direct3d.cpp | 4 +- od-win32/direct3d.h | 2 +- od-win32/makeexe.cmd | 4 +- od-win32/resources/resource.h | 13 +- od-win32/resources/winuae.rc | 35 ++- od-win32/resources/winuae_minimal.rc | 258 ++++++++++--------- od-win32/rp.cpp | 6 +- od-win32/srcrelease.cmd | 4 +- od-win32/win32.cpp | 2 +- od-win32/win32.h | 6 +- od-win32/win32_scaler.cpp | 12 +- od-win32/win32gfx.cpp | 4 +- od-win32/win32gui.cpp | 61 ++++- od-win32/winuaechangelog.txt | 27 ++ od-win32/wix/Product.wxs | 2 +- 36 files changed, 1212 insertions(+), 423 deletions(-) diff --git a/audio.cpp b/audio.cpp index 1ab0a21a..6c0b13ff 100644 --- a/audio.cpp +++ b/audio.cpp @@ -66,20 +66,11 @@ static bool debugchannel (int ch) } #endif -STATIC_INLINE bool usehacks1 (void) +STATIC_INLINE bool usehacks(void) { return currprefs.cpu_model >= 68020 || currprefs.m68k_speed != 0; } -#if 0 -STATIC_INLINE bool usehacks2 (void) -{ - if (currprefs.cpu_cycle_exact && currprefs.cpu_model <= 68020) - return false; - return currprefs.cpu_model >= 68020 || currprefs.m68k_speed != 0; -} -#endif - #define SINC_QUEUE_MAX_AGE 2048 /* Queue length 256 implies minimum emulated period of 8. This should be * sufficient for all imaginable purposes. This must be power of two. */ @@ -122,6 +113,7 @@ struct audio_channel_data { uaecptr ptx; bool ptx_written; bool ptx_tofetch; + int dmaofftime_active; }; static int samplecnt; @@ -1058,6 +1050,7 @@ static void zerostate (int nr) cdp->evtime = MAX_EV; cdp->intreq2 = 0; cdp->dmaenstore = false; + cdp->dmaofftime_active = 0; #if TEST_AUDIO > 0 cdp->have_dat = false; #endif @@ -1265,18 +1258,24 @@ static void audio_state_channel2 (int nr, bool perfin) } audio_activate (); - if ((cdp->state == 2 || cdp->state == 3) && usehacks1 () && !chan_ena && old_dma) { - // DMA switched off, state=2/3 and "too fast CPU": kill DMA instantly - // or CPU timed DMA wait routines in common tracker players will lose notes + if ((cdp->state == 2 || cdp->state == 3) && usehacks()) { + if (!chan_ena && old_dma) { + // DMA switched off, state=2/3 and "too fast CPU": set flag + cdp->dmaofftime_active = true; + } + if (cdp->dmaofftime_active && !old_dma && chan_ena) { + // We are still in state=2/3 and program is going to re-enable + // DMA. Force state to zero to prevent CPU timed DMA wait + // routines in common tracker players to lose notes. #if DEBUG_AUDIO_HACK > 0 - if (debugchannel (nr)) - write_log (_T("%d: INSTADMAOFF\n"), nr, M68K_GETPC); + if (debugchannel (nr)) + write_log (_T("%d: INSTADMAOFF\n"), nr, M68K_GETPC); #endif - newsample (nr, (cdp->dat2 >> 0) & 0xff); - if (napnav) - setirq (nr, 91); - zerostate (nr); - return; + newsample (nr, (cdp->dat2 >> 0) & 0xff); +// if (napnav) +// setirq (nr, 91); + zerostate (nr); + } } #if DEBUG_AUDIO > 0 @@ -1312,7 +1311,7 @@ static void audio_state_channel2 (int nr, bool perfin) cdp->state = 2; setirq (nr, 0); loaddat (nr); - if (usehacks1 () && cdp->per < 10 * CYCLE_UNIT) { + if (usehacks() && cdp->per < 10 * CYCLE_UNIT) { // make sure audio.device AUDxDAT startup returns to idle state before DMA is enabled newsample (nr, (cdp->dat2 >> 0) & 0xff); zerostate (nr); @@ -1864,7 +1863,7 @@ void AUDxLCH (int nr, uae_u16 v) // someone wants to update PT but DSR has not yet been processed. // too fast CPU and some tracker players: enable DMA, CPU delay, update AUDxPT with loop position - if (usehacks1 () && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) { + if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) { cdp->ptx = cdp->lc; cdp->ptx_written = true; #if DEBUG_AUDIO_HACK > 0 @@ -1885,7 +1884,7 @@ void AUDxLCL (int nr, uae_u16 v) struct audio_channel_data *cdp = audio_channel + nr; audio_activate (); update_audio (); - if (usehacks1 () && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) { + if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) { cdp->ptx = cdp->lc; cdp->ptx_written = true; #if DEBUG_AUDIO_HACK > 0 diff --git a/blitter.cpp b/blitter.cpp index c99cf032..3a993586 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -273,6 +273,16 @@ STATIC_INLINE void record_dma_blit (uae_u16 reg, uae_u16 dat, uae_u32 addr, int type = DMARECORD_BLITTER; if (debug_dma) record_dma (reg, dat, addr, hpos, vpos, type); + if (memwatch_enabled) { + if (reg == 0) + debug_wputpeekdma_chipram(addr, dat, MW_MASK_BLITTER_D, reg); + else if (reg == 0x70) + debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_C, reg); + else if (reg == 0x72) + debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_B, reg); + else if (reg == 0x74) + debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_A, reg); + } #endif } @@ -427,7 +437,7 @@ STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w) //last_custom_value1 = w; blitter writes are not stored if (!(log_blitter & 4)) { chipmem_wput_indirect (addr, w); - debug_wputpeekdma_chipram (addr, w, 0x000); + debug_wputpeekdma_chipram (addr, w, MW_MASK_BLITTER_D, 0x000); } } @@ -636,6 +646,7 @@ STATIC_INLINE void blitter_read (void) if (!dmaen (DMA_BLITTER)) return; blt_info.bltcdat = chipmem_wget_indirect (bltcpt); + debug_wgetpeekdma_chipram (bltcpt, blt_info.bltcdat, MW_MASK_BLITTER_C, 0x070); last_custom_value1 = blt_info.bltcdat; } bltstate = BLT_work; @@ -651,7 +662,7 @@ STATIC_INLINE void blitter_write (void) return; //last_custom_value1 = blt_info.bltddat; blitter writes are not stored chipmem_wput_indirect (bltdpt, blt_info.bltddat); - debug_wputpeekdma_chipram (bltdpt, blt_info.bltddat, 0x000); + debug_wputpeekdma_chipram (bltdpt, blt_info.bltddat, MW_MASK_BLITTER_D, 0x000); } bltstate = BLT_next; } diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 9a75331b..4480dadb 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -1301,7 +1301,7 @@ static int parseccd (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img) TCHAR fname[MAX_DPATH]; write_log (_T("CCD TOC: '%s'\n"), img); - _tcscpy (fname, img); + _tcscpy (fname, zfile_getname(zcue)); TCHAR *ext = _tcsrchr (fname, '.'); if (ext) *ext = 0; diff --git a/cfgfile.cpp b/cfgfile.cpp index d09c3c9c..425c887c 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -2453,27 +2453,27 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) } if (_tcscmp (option, _T("joyportfriendlyname0")) == 0 || _tcscmp (option, _T("joyportfriendlyname1")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname0")) == 0 ? 0 : 1, -1, 2); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname0")) == 0 ? 0 : 1, -1, 2, true); return 1; } if (_tcscmp (option, _T("joyportfriendlyname2")) == 0 || _tcscmp (option, _T("joyportfriendlyname3")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname2")) == 0 ? 2 : 3, -1, 2); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname2")) == 0 ? 2 : 3, -1, 2, true); return 1; } if (_tcscmp (option, _T("joyportname0")) == 0 || _tcscmp (option, _T("joyportname1")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname0")) == 0 ? 0 : 1, -1, 1); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname0")) == 0 ? 0 : 1, -1, 1, true); return 1; } if (_tcscmp (option, _T("joyportname2")) == 0 || _tcscmp (option, _T("joyportname3")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname2")) == 0 ? 2 : 3, -1, 1); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname2")) == 0 ? 2 : 3, -1, 1, true); return 1; } if (_tcscmp (option, _T("joyport0")) == 0 || _tcscmp (option, _T("joyport1")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport0")) == 0 ? 0 : 1, -1, 0); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport0")) == 0 ? 0 : 1, -1, 0, true); return 1; } if (_tcscmp (option, _T("joyport2")) == 0 || _tcscmp (option, _T("joyport3")) == 0) { - inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport2")) == 0 ? 2 : 3, -1, 0); + inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport2")) == 0 ? 2 : 3, -1, 0, true); return 1; } if (cfgfile_strval (option, value, _T("joyport0mode"), &p->jports[0].mode, joyportmodes, 0)) @@ -6006,6 +6006,10 @@ int built_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r } if ((p->cpu_model >= 68020 || !p->cpu_cycle_exact) && !p->immediate_blits) p->waiting_blits = 1; + if (p->sound_filter_type == FILTER_SOUND_TYPE_A500 && (p->chipset_mask & CSMASK_AGA)) + p->sound_filter_type = FILTER_SOUND_TYPE_A1200; + else if (p->sound_filter_type == FILTER_SOUND_TYPE_A1200 && !(p->chipset_mask & CSMASK_AGA)) + p->sound_filter_type = FILTER_SOUND_TYPE_A500; return v; } diff --git a/cia.cpp b/cia.cpp index 6e88bed1..6c55a595 100644 --- a/cia.cpp +++ b/cia.cpp @@ -105,17 +105,37 @@ static void setclr (unsigned int *p, unsigned int val) } } +static int cia_interrupt_disabled; + +static bool access_last_eclock(void) +{ + if (!currprefs.cpu_cycle_exact) + return false; + return true; +} + static void ICR (uae_u32 data) { INTREQ_0 (0x8000 | data); } static void ICRA (uae_u32 data) { + if (cia_interrupt_disabled & 1) { + event2_newevent_xx (-1, 4 * CYCLE_UNIT, data, ICRA); + return; + } ICR (data); ciaaicr |= 0x40; } static void ICRB (uae_u32 data) { + if (cia_interrupt_disabled & 2) { +#if CIAB_DEBUG_IRQ + write_log(_T("ciab interrupt disabled ICR=%02X PC=%x\n"), ciabicr, M68K_GETPC); +#endif + event2_newevent_xx (-1, 4 * CYCLE_UNIT, data, ICRB); + return; + } ICR (data); ciabicr |= 0x40; } @@ -128,10 +148,11 @@ static void RethinkICRA (void) #endif if (!(ciaaicr & 0x80)) { ciaaicr |= 0x80; - if (currprefs.cpu_cycle_exact) + if (currprefs.cpu_cycle_exact) { event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x0008, ICRA); - else + } else { ICRA (0x0008); + } } } } @@ -144,10 +165,11 @@ static void RethinkICRB (void) #endif if (!(ciabicr & 0x80)) { ciabicr |= 0x80; - if (currprefs.cpu_cycle_exact) + if (currprefs.cpu_cycle_exact) { event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x2000, ICRB); - else + } else { ICRB (0x2000); + } } } } @@ -1127,7 +1149,7 @@ static uae_u8 ReadCIAB (unsigned int addr) case 13: #if CIAB_DEBUG_IRQ if (ciabicr & (0x80 | 0x40)) - write_log (_T("CIAB IRQ cleared\n")); + write_log (_T("CIAB IRQ cleared PC=%x\n"), M68K_GETPC); #endif tmp = ciabicr & ~0x40; ciabicr = 0; @@ -1580,11 +1602,15 @@ STATIC_INLINE bool isgayle (void) return currprefs.cs_ide || currprefs.cs_pcmcia; } -static void cia_wait_pre (void) +static void cia_wait_pre (int cianummask) { if (currprefs.cachesize) return; + if (currprefs.cpu_cycle_exact) { + cia_interrupt_disabled |= cianummask; + } + #ifndef CUSTOM_SIMPLE int div = (get_cycles () - eventtab[ev_cia].oldcycles) % DIV10; int cycles; @@ -1607,7 +1633,7 @@ static void cia_wait_pre (void) #endif } -static void cia_wait_post (uae_u32 value) +static void cia_wait_post (int cianummask, uae_u32 value) { if (currprefs.cachesize) { do_cycles (8 * CYCLE_UNIT /2); @@ -1617,6 +1643,9 @@ static void cia_wait_post (uae_u32 value) x_do_cycles_post (c, value); else do_cycles (c); + if (currprefs.cpu_cycle_exact) { + cia_interrupt_disabled &= ~cianummask; + } } } @@ -1654,34 +1683,43 @@ static uae_u32 REGPARAM2 cia_bget (uaecptr addr) if (!isgaylenocia (addr)) return v; - cia_wait_pre (); switch ((addr >> 12) & 3) { case 0: - if (!issinglecia ()) + if (!issinglecia ()) { + cia_wait_pre (1 | 2); v = (addr & 1) ? ReadCIAA (r) : ReadCIAB (r); + cia_wait_post (1 | 2, v); + } break; case 1: - if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) + cia_wait_pre (2); + if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) { v = (addr & 1) ? regs.irc : ReadCIAB (r); - else + } else { v = (addr & 1) ? 0xff : ReadCIAB (r); + } + cia_wait_post (2, v); break; case 2: + cia_wait_pre (1); if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) v = (addr & 1) ? ReadCIAA (r) : regs.irc >> 8; else v = (addr & 1) ? ReadCIAA (r) : 0xff; + cia_wait_post (1, v); break; case 3: - if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) + if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) { + cia_wait_pre (0); v = (addr & 1) ? regs.irc : regs.irc >> 8; + cia_wait_post (0, v); + } if (warned > 0 || currprefs.illegal_mem) { write_log (_T("cia_bget: unknown CIA address %08X=%02X PC=%08X\n"), addr, v & 0xff, M68K_GETPC); warned--; } break; } - cia_wait_post (v); return v; } @@ -1701,29 +1739,37 @@ static uae_u32 REGPARAM2 cia_wget (uaecptr addr) if (!isgaylenocia (addr)) return v; - cia_wait_pre (); switch ((addr >> 12) & 3) { case 0: - if (!issinglecia ()) + if (!issinglecia ()) { + cia_wait_pre (1 | 2); v = (ReadCIAB (r) << 8) | ReadCIAA (r); + cia_wait_post (1 | 2, v); + } break; case 1: + cia_wait_pre (2); v = (ReadCIAB (r) << 8) | 0xff; + cia_wait_post (2, v); break; case 2: + cia_wait_pre (1); v = (0xff << 8) | ReadCIAA (r); + cia_wait_post (1, v); break; case 3: - if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) + if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) { + cia_wait_pre (0); v = regs.irc; + cia_wait_post (0, v); + } if (warned > 0 || currprefs.illegal_mem) { write_log (_T("cia_wget: unknown CIA address %08X=%04X PC=%08X\n"), addr, v & 0xffff, M68K_GETPC); warned--; } break; } - cia_wait_post (v); return v; } @@ -1764,18 +1810,18 @@ static void REGPARAM2 cia_bput (uaecptr addr, uae_u32 value) if (!isgaylenocia (addr)) return; - cia_wait_pre (); if (!issinglecia () || (addr & 0x3000) != 0) { + cia_wait_pre (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0)); if ((addr & 0x2000) == 0) WriteCIAB (r, value); if ((addr & 0x1000) == 0) WriteCIAA (r, value); + cia_wait_post (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0), value); if (((addr & 0x3000) == 0x3000) && (warned > 0 || currprefs.illegal_mem)) { write_log (_T("cia_bput: unknown CIA address %08X=%082X PC=%08X\n"), addr, value & 0xff, M68K_GETPC); warned--; } } - cia_wait_post (value); } static void REGPARAM2 cia_wput (uaecptr addr, uae_u32 value) @@ -1794,18 +1840,18 @@ static void REGPARAM2 cia_wput (uaecptr addr, uae_u32 value) if (!isgaylenocia (addr)) return; - cia_wait_pre (); if (!issinglecia () || (addr & 0x3000) != 0) { + cia_wait_pre (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0)); if ((addr & 0x2000) == 0) WriteCIAB (r, value >> 8); if ((addr & 0x1000) == 0) WriteCIAA (r, value & 0xff); + cia_wait_post (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0), value); if (((addr & 0x3000) == 0x3000) && (warned > 0 || currprefs.illegal_mem)) { write_log (_T("cia_wput: unknown CIA address %08X=%04X %08X\n"), addr, value & 0xffff, M68K_GETPC); warned--; } } - cia_wait_post (value); } static void REGPARAM2 cia_lput (uaecptr addr, uae_u32 value) diff --git a/custom.cpp b/custom.cpp index e4618ac4..318e37ba 100644 --- a/custom.cpp +++ b/custom.cpp @@ -131,6 +131,7 @@ static int rpt_did_reset; struct ev eventtab[ev_max]; struct ev2 eventtab2[ev2_max]; +int hpos_offset; int vpos; static int vpos_count, vpos_count_diff; int lof_store; // real bit in custom registers @@ -141,6 +142,7 @@ static int next_lineno, prev_lineno; static enum nln_how nextline_how; static int lof_changed = 0, lof_changing = 0, interlace_changed = 0; static int lof_changed_previous_field; +static int vposw_change; static bool lof_lace; static bool bplcon0_interlace_seen; static int scandoubled_line; @@ -184,7 +186,7 @@ static uae_u16 cregs[256]; uae_u16 intena, intreq; uae_u16 dmacon; uae_u16 adkcon; /* used by audio code */ -uae_u16 last_custom_value1; +uae_u32 last_custom_value1; static uae_u32 cop1lc, cop2lc, copcon; @@ -215,7 +217,7 @@ static int ciavsyncmode; static int diw_hstrt, diw_hstop; static int diw_hcounter; -#define HSYNCTIME (maxhpos * CYCLE_UNIT); +#define HSYNCTIME (maxhpos * CYCLE_UNIT) struct sprite { uaecptr pt; @@ -528,7 +530,7 @@ STATIC_INLINE uae_u8 *pfield_xlateptr (uaecptr plpt, int bytecount) if (!chipmem_check_indirect (plpt, bytecount)) { static int count = 0; if (!count) - count++, write_log (_T("Warning: Bad playfield pointer\n")); + count++, write_log (_T("Warning: Bad playfield pointer %08x\n"), plpt); return NULL; } return chipmem_xlate_indirect (plpt); @@ -1274,6 +1276,8 @@ static void fetch (int nr, int fm, int hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x110 + nr * 2, chipmem_wget_indirect (p), p, hpos, vpos, DMARECORD_BITPLANE); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(p, chipmem_wget_indirect (p), MW_MASK_BPL_0 << nr, 0x110 + nr * 2); #endif switch (fm) { @@ -1284,12 +1288,14 @@ static void fetch (int nr, int fm, int hpos) #ifdef AGA case 1: fetched_aga[nr] = chipmem_lget_indirect (p); - last_custom_value1 = fetched[nr] = (uae_u16)fetched_aga[nr]; + last_custom_value1 = fetched_aga[nr]; + fetched[nr] = (uae_u16)fetched_aga[nr]; break; case 2: fetched_aga[nr] = ((uae_u64)chipmem_lget_indirect (p)) << 32; fetched_aga[nr] |= chipmem_lget_indirect (p + 4); - last_custom_value1 = fetched[nr] = (uae_u16)fetched_aga[nr]; + last_custom_value1 = (uae_u32)fetched_aga[nr]; + fetched[nr] = (uae_u16)fetched_aga[nr]; break; #endif } @@ -3935,6 +3941,7 @@ void init_hz (bool fullinit) hsyncstartpos = maxhpos_short + 13; hsyncendpos = 24; } + hpos_offset = 0; eventtab[ev_hsync].oldcycles = get_cycles (); eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME; events_schedule (); @@ -4214,6 +4221,8 @@ static void VPOSW (uae_u16 v) if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS)) v &= 1; vpos |= v << 8; + if (vpos != oldvpos) + vposw_change++; if (vpos < oldvpos) vpos = oldvpos; } @@ -4222,24 +4231,49 @@ static void VPOSW (uae_u16 v) static void VHPOSW (uae_u16 v) { int oldvpos = vpos; + bool changed = false; #if 0 if (M68K_GETPC < 0xf00000 || 1) write_log (_T("VHPOSW %04X PC=%08x\n"), v, M68K_GETPC); #endif + #if 0 - int hp = v & 0xff; - int oldhp = current_hpos (); - if (hp != oldhp) { - if (hp >= maxhpos) - hp = maxhpos - 1; - eventtab[ev_hsync].oldcycles = get_cycles () - hp * CYCLE_UNIT; - eventtab[ev_hsync].evtime = eventtab[ev_hsync].oldcycles + HSYNCTIME; - events_schedule (); + /* This is not that easy, need to decouple denise and paula hpos counters + * from master counter. + * All this just to fix Upfront-CoolFridge Smooth Copper part.. + */ + if (oldhpos != newhpos) { + oldhpos = current_hpos(); + int newhpos = v & 0xff; + if (newhpos >= maxhpos) + newhpos = maxhpos - 1; + hpos_offset = newhpos - oldhpos; + eventtab[ev_hsync].evtime = get_cycles() + HSYNCTIME - (newhpos * CYCLE_UNIT); + eventtab[ev_hsync].oldcycles = get_cycles() - newhpos * CYCLE_UNIT; + events_schedule(); + newhpos2 = current_hpos(); +#ifdef CPUEMU_13 + if (currprefs.cpu_cycle_exact || currprefs.blitter_cycle_exact) { + memset(cycle_line + newhpos, 0, maxhpos - newhpos); + int hp = maxhpos - 1, i; + for (i = 0; i < 4; i++) { + alloc_cycle (hp, i == 0 ? CYCLE_STROBE : CYCLE_REFRESH); + hp += 2; + if (hp >= maxhpos) + hp -= maxhpos; + } } #endif - v >>= 8; // lets ignore hpos for now + vposw_change++; + changed = true; + } +#endif + + v >>= 8; vpos &= 0xff00; vpos |= v; + if (vpos != oldvpos && !changed) + vposw_change++; if (vpos < oldvpos) { vpos = oldvpos; } else if (vpos < minfirstline && oldvpos < minfirstline) { @@ -5675,7 +5709,7 @@ static int custom_wput_copper (int hpos, uaecptr addr, uae_u32 value, int noget) { int v; - value = debug_wputpeekdma_chipset (0xdff000 + addr, value, 0x08c); + value = debug_wputpeekdma_chipset (0xdff000 + addr, value, MW_MASK_COPPER, 0x08c); copper_access = 1; v = custom_wput_1 (hpos, addr, value, noget); copper_access = 0; @@ -5798,6 +5832,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x8c, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x8c); #endif if (old_hpos == maxhpos - 2) { // if COP_strobe_delay2 would cross scanlines (positioned immediately @@ -5822,6 +5858,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x1fe, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x1fe); #endif } cop_state.state = COP_read1; @@ -5848,6 +5886,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x1fe, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x1fe); #endif cop_state.state = COP_read1; // Next cycle finally reads from new pointer @@ -5869,6 +5909,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x1fe, cop_state.i1, cop_state.ip, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip, cop_state.i1, MW_MASK_COPPER, 0x1fe); #endif cop_state.ip = cop1lc; break; @@ -5881,6 +5923,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x8c, cop_state.i1, cop_state.ip, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip, cop_state.i1, MW_MASK_COPPER, 0x8c); #endif cop_state.ip += 2; cop_state.state = COP_read2; @@ -5905,6 +5949,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (0x8c, cop_state.i2, cop_state.ip - 2, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip - 2, cop_state.i2, MW_MASK_COPPER, 0x8c); #endif } else { // MOVE #ifdef DEBUGGER @@ -5916,6 +5962,8 @@ static void update_copper (int until_hpos) #ifdef DEBUGGER if (debug_dma) record_dma (reg, data, cop_state.ip - 2, old_hpos, vpos, DMARECORD_COPPER); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(cop_state.ip - 2, data, MW_MASK_COPPER, reg); #endif test_copper_dangerous (reg); if (! copper_enabled_thisline) @@ -6197,6 +6245,8 @@ static uae_u16 sprite_fetch(struct sprite *s, int dma, int hpos, int cycle, int #ifdef DEBUGGER if (debug_dma) record_dma ((s - &spr[0]) * 8 + 0x140 + mode * 4 + cycle * 2, data, s->pt, hpos, vpos, DMARECORD_SPRITE); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(s->pt, data, MW_MASK_SPR_0 << (s - &spr[0]), (s - &spr[0]) * 8 + 0x140 + mode * 4 + cycle * 2); #endif } s->pt += 2; @@ -7130,13 +7180,14 @@ static void vsync_handler_post (void) if (varsync_changed || (beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80))) { init_hz (); - } else if (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1) { + } else if (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1 && vposw_change < 4) { init_hz (); } else if (interlace_changed || changed_chipset_refresh () || lof_changed) { compute_framesync (); } lof_changed = 0; + vposw_change = 0; bplcon0_interlace_seen = false; COPJMP (1, 1); @@ -7264,6 +7315,8 @@ static void dmal_emu (uae_u32 v) #ifdef DEBUGGER if (debug_dma) record_dma (0xaa + nr * 16, dat, pt, hpos, vpos, DMARECORD_AUDIO); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(pt, dat, MW_MASK_AUDIO_0 << nr, 0xaa + nr * 16); #endif last_custom_value1 = dat; AUDxDAT (nr, dat, pt); @@ -7289,6 +7342,8 @@ static void dmal_emu (uae_u32 v) #ifdef DEBUGGER if (debug_dma) record_dma (w ? 0x26 : 0x08, dat, pt, hpos, vpos, DMARECORD_DISK); + if (memwatch_enabled) + debug_wgetpeekdma_chipram(pt, dat, MW_MASK_DISK, w ? 0x26 : 0x08); #endif } } @@ -7367,6 +7422,7 @@ static bool is_custom_vsync (void) static void set_hpos (void) { maxhpos = maxhpos_short + lol; + hpos_offset = 0; eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME; eventtab[ev_hsync].oldcycles = get_cycles (); } @@ -8231,9 +8287,8 @@ writeonly: * OCS-only special case: DFF000 (BLTDDAT) will always return whatever was left in bus * * AGA: - * only writes to custom registers change last value, read returns - * last value which then changes to all ones (following read will return - * all ones) + * Can also return last CPU accessed value + * Remembers old last_custom_value1 */ v = last_custom_value1; line_cyclebased = vpos; @@ -8241,32 +8296,46 @@ writeonly: int r, c, bmdma; uae_u16 l; - // last chip bus value (read or write) is written to register - if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) { - if (isbyte) - l = (regs.chipset_latch_rw << 8) | (regs.chipset_latch_rw & 0xff); - else - l = regs.chipset_latch_rw; + if (currprefs.chipset_mask & CSMASK_AGA) { + l = 0; } else { - l = regs.chipset_latch_rw; + // last chip bus value (read or write) is written to register + if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) { + if (isbyte) + l = (regs.chipset_latch_rw << 8) | (regs.chipset_latch_rw & 0xff); + else + l = regs.chipset_latch_rw; + } else { + l = regs.chipset_latch_rw; + } } decide_line (hpos); decide_fetch_safe (hpos); debug_wputpeek (0xdff000 + addr, l); r = custom_wput_1 (hpos, addr, l, 1); - // cpu gets back + // CPU gets back (OCS/ECS only): // - if last cycle was DMA cycle: DMA cycle data // - if last cycle was not DMA cycle: FFFF or some ANDed old data. // c = cycle_line[hpos] & CYCLE_MASK; bmdma = is_bitplane_dma(hpos); - if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) { - v = last_custom_value1; + if (currprefs.chipset_mask & CSMASK_AGA) { + if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) { + v = last_custom_value1; + } else if (c == CYCLE_CPU) { + v = regs.db; + } else { + v = last_custom_value1 >> ((addr & 2) ? 0 : 16); + } } else { - // refresh checked because refresh cycles do not always - // set last_custom_value1 for performance reasons. - v = 0xffff; + if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) { + v = last_custom_value1; + } else { + // refresh checked because refresh cycles do not always + // set last_custom_value1 for performance reasons. + v = 0xffff; + } } #if CUSTOM_DEBUG > 0 write_log (_T("%08X read = %04X. Value written=%04X PC=%08x\n"), 0xdff000 | addr, v, l, M68K_GETPC); diff --git a/debug.cpp b/debug.cpp index 7dda4138..dd3d89a3 100644 --- a/debug.cpp +++ b/debug.cpp @@ -46,7 +46,8 @@ static int skipaddr_doskip; static uae_u32 skipins; static int do_skip; static int debug_rewind; -static int memwatch_enabled, memwatch_triggered; +static int memwatch_triggered; +int memwatch_enabled; static uae_u16 sr_bpmask, sr_bpvalue; int debugging; int exception_debugging; @@ -1190,6 +1191,7 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile) for (i = 0; i < cols && h < maxh; i++, h++, dr++) { int cl = i * col, cl2; int r = dr->reg; + bool longsize = false; TCHAR *sr; sr = _T(" "); @@ -1215,8 +1217,10 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile) _tcscpy (l2 + cl, _T(" CPU-R ")); else if ((r & 0x0100) == 0x0100) _tcscpy (l2 + cl, _T(" CPU-W ")); - if ((r & 0xff) == 4) + if ((r & 0xff) == 4) { l2[cl + 7] = 'L'; + longsize = true; + } if ((r & 0xff) == 2) l2[cl + 7] = 'W'; if ((r & 0xff) == 1) @@ -1224,7 +1228,7 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile) } else { _stprintf (l2 + cl, _T("%4s %03X"), sr, r); } - _stprintf (l3 + cl, _T(" %04X"), dr->dat); + _stprintf (l3 + cl, longsize ? _T("%08X") : _T(" %04X"), dr->dat); if (dr->addr != 0xffffffff) _stprintf (l4 + cl, _T("%08X"), dr->addr & 0x00ffffff); } else { @@ -2004,6 +2008,8 @@ uae_u8 *save_debug_memwatch (int *len, uae_u8 *dstptr) save_u32 (m->val_size); save_u32 (m->val); save_u32 (m->pc); + save_u32 (m->access_mask); + save_u32 (m->reg); save_store_size (); } *len = dst - dstbak; @@ -2031,6 +2037,8 @@ uae_u8 *restore_debug_memwatch (uae_u8 *src) m->val_size = restore_u32 (); m->val = restore_u32 (); m->pc = restore_u32 (); + m->access_mask = restore_u32(); + m->reg = restore_u32(); restore_store_size (); } return src; @@ -2048,7 +2056,7 @@ void restore_debug_memwatch_finish (void) } } -static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp) +static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp, uae_u32 accessmask, uae_u32 reg) { int i, brk; uae_u32 val = *valp; @@ -2075,6 +2083,9 @@ static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp) continue; if (!(rwi & rwi2)) continue; + if (!(m->access_mask & accessmask)) + continue; + if (addr >= addr2 && addr < addr3) brk = 1; if (!brk && size == 2 && (addr + 1 >= addr2 && addr + 1 < addr3)) @@ -2173,6 +2184,8 @@ static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp) mwhit.rwi = rwi; mwhit.size = size; mwhit.val = 0; + mwhit.access_mask = accessmask; + mwhit.reg = reg; if (mwhit.rwi & 2) mwhit.val = val; memwatch_triggered = i + 1; @@ -2233,7 +2246,7 @@ static uae_u32 REGPARAM2 debug_lget (uaecptr addr) uae_u32 off = debug_mem_off (&addr); uae_u32 v; v = debug_mem_banks[off]->lget (addr); - memwatch_func (addr, 1, 4, &v); + memwatch_func (addr, 1, 4, &v, MW_MASK_CPU, 0); return v; } static uae_u32 REGPARAM2 mmu_lgeti (uaecptr addr) @@ -2258,7 +2271,7 @@ static uae_u32 REGPARAM2 debug_wget (uaecptr addr) int off = debug_mem_off (&addr); uae_u32 v; v = debug_mem_banks[off]->wget (addr); - memwatch_func (addr, 1, 2, &v); + memwatch_func (addr, 1, 2, &v, MW_MASK_CPU, 0); return v; } static uae_u32 REGPARAM2 debug_bget (uaecptr addr) @@ -2266,7 +2279,7 @@ static uae_u32 REGPARAM2 debug_bget (uaecptr addr) int off = debug_mem_off (&addr); uae_u32 v; v = debug_mem_banks[off]->bget (addr); - memwatch_func (addr, 1, 1, &v); + memwatch_func (addr, 1, 1, &v, MW_MASK_CPU, 0); return v; } static uae_u32 REGPARAM2 debug_lgeti (uaecptr addr) @@ -2274,7 +2287,7 @@ static uae_u32 REGPARAM2 debug_lgeti (uaecptr addr) int off = debug_mem_off (&addr); uae_u32 v; v = debug_mem_banks[off]->lgeti (addr); - memwatch_func (addr, 4, 4, &v); + memwatch_func (addr, 4, 4, &v, MW_MASK_CPU, 0); return v; } static uae_u32 REGPARAM2 debug_wgeti (uaecptr addr) @@ -2282,25 +2295,25 @@ static uae_u32 REGPARAM2 debug_wgeti (uaecptr addr) int off = debug_mem_off (&addr); uae_u32 v; v = debug_mem_banks[off]->wgeti (addr); - memwatch_func (addr, 4, 2, &v); + memwatch_func (addr, 4, 2, &v, MW_MASK_CPU, 0); return v; } static void REGPARAM2 debug_lput (uaecptr addr, uae_u32 v) { int off = debug_mem_off (&addr); - if (memwatch_func (addr, 2, 4, &v)) + if (memwatch_func (addr, 2, 4, &v, MW_MASK_CPU, 0)) debug_mem_banks[off]->lput (addr, v); } static void REGPARAM2 debug_wput (uaecptr addr, uae_u32 v) { int off = debug_mem_off (&addr); - if (memwatch_func (addr, 2, 2, &v)) + if (memwatch_func (addr, 2, 2, &v, MW_MASK_CPU, 0)) debug_mem_banks[off]->wput (addr, v); } static void REGPARAM2 debug_bput (uaecptr addr, uae_u32 v) { int off = debug_mem_off (&addr); - if (memwatch_func (addr, 2, 1, &v)) + if (memwatch_func (addr, 2, 1, &v, MW_MASK_CPU, 0)) debug_mem_banks[off]->bput (addr, v); } static int REGPARAM2 debug_check (uaecptr addr, uae_u32 size) @@ -2312,16 +2325,16 @@ static uae_u8 *REGPARAM2 debug_xlate (uaecptr addr) return debug_mem_banks[munge24 (addr) >> 16]->xlateaddr (addr); } -uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, int reg) +uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, uae_u32 mask, int reg) { if (!memwatch_enabled) return v; addr &= 0x1fe; addr += 0xdff000; - memwatch_func (addr, 2, 2, &v); + memwatch_func (addr, 2, 2, &v, mask, reg); return v; } -uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg) +uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg) { if (!memwatch_enabled) return v; @@ -2329,10 +2342,10 @@ uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg) return v; if (!currprefs.z3chipmem_size) addr &= chipmem_bank.mask; - memwatch_func (addr & chipmem_bank.mask, 2, 2, &v); + memwatch_func (addr & chipmem_bank.mask, 2, 2, &v, mask, reg); return v; } -uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg) +uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg) { uae_u32 vv = v; if (!memwatch_enabled) @@ -2341,7 +2354,7 @@ uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg) return v; if (!currprefs.z3chipmem_size) addr &= chipmem_bank.mask; - memwatch_func (addr, 1, 2, &vv); + memwatch_func (addr, 1, 2, &vv, mask, reg); return vv; } @@ -2349,40 +2362,40 @@ void debug_putlpeek (uaecptr addr, uae_u32 v) { if (!memwatch_enabled) return; - memwatch_func (addr, 2, 4, &v); + memwatch_func (addr, 2, 4, &v, MW_MASK_CPU, 0); } void debug_wputpeek (uaecptr addr, uae_u32 v) { if (!memwatch_enabled) return; - memwatch_func (addr, 2, 2, &v); + memwatch_func (addr, 2, 2, &v, MW_MASK_CPU, 0); } void debug_bputpeek (uaecptr addr, uae_u32 v) { if (!memwatch_enabled) return; - memwatch_func (addr, 2, 1, &v); + memwatch_func (addr, 2, 1, &v, MW_MASK_CPU, 0); } void debug_bgetpeek (uaecptr addr, uae_u32 v) { uae_u32 vv = v; if (!memwatch_enabled) return; - memwatch_func (addr, 1, 1, &vv); + memwatch_func (addr, 1, 1, &vv, MW_MASK_CPU, 0); } void debug_wgetpeek (uaecptr addr, uae_u32 v) { uae_u32 vv = v; if (!memwatch_enabled) return; - memwatch_func (addr, 1, 2, &vv); + memwatch_func (addr, 1, 2, &vv, MW_MASK_CPU, 0); } void debug_lgetpeek (uaecptr addr, uae_u32 v) { uae_u32 vv = v; if (!memwatch_enabled) return; - memwatch_func (addr, 1, 4, &vv); + memwatch_func (addr, 1, 4, &vv, MW_MASK_CPU, 0); } struct membank_store @@ -2570,6 +2583,53 @@ int debug_bankchange (int mode) return -1; } +struct mw_acc +{ + uae_u32 mask; + const TCHAR *name; +}; + +static const struct mw_acc memwatch_access_masks[] = +{ + { MW_MASK_ALL, _T("ALL") }, + { MW_MASK_ALL & ~MW_MASK_CPU, _T("DMA") }, + { MW_MASK_BLITTER_A | MW_MASK_BLITTER_B | MW_MASK_BLITTER_C | MW_MASK_BLITTER_D, _T("BLT") }, + { MW_MASK_AUDIO_0 | MW_MASK_AUDIO_1 | MW_MASK_AUDIO_2 | MW_MASK_AUDIO_3, _T("AUD") }, + { MW_MASK_BPL_0 | MW_MASK_BPL_1 | MW_MASK_BPL_2 | MW_MASK_BPL_3 | + MW_MASK_BPL_4 | MW_MASK_BPL_5 | MW_MASK_BPL_6 | MW_MASK_BPL_7 , _T("BPL") }, + { MW_MASK_SPR_0 | MW_MASK_SPR_1 | MW_MASK_SPR_2 | MW_MASK_SPR_3 | + MW_MASK_SPR_4 | MW_MASK_SPR_5 | MW_MASK_SPR_6 | MW_MASK_SPR_7, _T("SPR") }, + + { MW_MASK_CPU, _T("CPU") }, + { MW_MASK_COPPER, _T("COP") }, + { MW_MASK_BLITTER_A, _T("BLTA") }, + { MW_MASK_BLITTER_B, _T("BLTB") }, + { MW_MASK_BLITTER_C, _T("BLTC") }, + { MW_MASK_BLITTER_D, _T("BLTD") }, + { MW_MASK_DISK, _T("DSK") }, + { MW_MASK_AUDIO_0, _T("AUD0") }, + { MW_MASK_AUDIO_1, _T("AUD1") }, + { MW_MASK_AUDIO_2, _T("AUD2") }, + { MW_MASK_AUDIO_3, _T("AUD3") }, + { MW_MASK_BPL_0, _T("BPL0") }, + { MW_MASK_BPL_1, _T("BPL1") }, + { MW_MASK_BPL_2, _T("BPL2") }, + { MW_MASK_BPL_3, _T("BPL3") }, + { MW_MASK_BPL_4, _T("BPL4") }, + { MW_MASK_BPL_5, _T("BPL5") }, + { MW_MASK_BPL_6, _T("BPL6") }, + { MW_MASK_BPL_7, _T("BPL7") }, + { MW_MASK_SPR_0, _T("SPR0") }, + { MW_MASK_SPR_1, _T("SPR1") }, + { MW_MASK_SPR_2, _T("SPR2") }, + { MW_MASK_SPR_3, _T("SPR3") }, + { MW_MASK_SPR_4, _T("SPR4") }, + { MW_MASK_SPR_5, _T("SPR5") }, + { MW_MASK_SPR_6, _T("SPR6") }, + { MW_MASK_SPR_7, _T("SPR7") }, + NULL +}; + static TCHAR *getsizechar (int size) { if (size == 4) @@ -2592,6 +2652,7 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num) memset (buf, 0, bufsize * sizeof (TCHAR)); for (i = 0; i < MEMWATCH_TOTAL; i++) { if ((num >= 0 && num == i) || (num < 0)) { + uae_u32 usedmask = 0; mwn = &mwnodes[i]; if (mwn->size == 0) continue; @@ -2599,13 +2660,21 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num) i, mwn->addr, mwn->addr + (mwn->size - 1), mwn->size, (mwn->rwi & 1) ? 'R' : ' ', (mwn->rwi & 2) ? 'W' : ' ', (mwn->rwi & 4) ? 'I' : ' '); if (mwn->frozen) - buf = buf_out (buf, &bufsize, _T("F")); + buf = buf_out (buf, &bufsize, _T(" F")); if (mwn->val_enabled) buf = buf_out (buf, &bufsize, _T(" =%X%s"), mwn->val, getsizechar (mwn->val_size)); if (mwn->modval_written) buf = buf_out (buf, &bufsize, _T(" =M")); if (mwn->mustchange) buf = buf_out (buf, &bufsize, _T(" C")); + for (int j = 0; memwatch_access_masks[j].mask; j++) { + uae_u32 mask = memwatch_access_masks[j].mask; + if ((mwn->access_mask & mask) == mask && (usedmask & mask) == 0) { + buf = buf_out(buf, &bufsize, _T(" ")); + buf = buf_out(buf, &bufsize, memwatch_access_masks[j].name); + usedmask |= mask; + } + } buf = buf_out (buf, &bufsize, _T("\n")); } } @@ -2693,6 +2762,9 @@ static void memwatch (TCHAR **c) mwn->rwi = 7; mwn->val_enabled = 0; mwn->val_mask = 0xffffffff; + mwn->val = 0; + mwn->access_mask = 0; + mwn->reg = 0xffffffff; mwn->frozen = 0; mwn->modval_written = 0; ignore_ws (c); @@ -2700,25 +2772,45 @@ static void memwatch (TCHAR **c) mwn->size = readhex (c); ignore_ws (c); if (more_params (c)) { - for (;;) { - TCHAR ncc = peek_next_char(c); - TCHAR nc = _totupper (next_char (c)); - if (mwn->rwi == 7) - mwn->rwi = 0; - if (nc == 'F') - mwn->frozen = 1; - if (nc == 'W') - mwn->rwi |= 2; - if (nc == 'I') - mwn->rwi |= 4; - if (nc == 'R') - mwn->rwi |= 1; - if (ncc == ' ') - break; - if (!more_params(c)) - break; + TCHAR *cs = *c; + while (*cs) { + for (int i = 0; memwatch_access_masks[i].mask; i++) { + const TCHAR *n = memwatch_access_masks[i].name; + int len = _tcslen(n); + if (!_tcsnicmp(cs, n, len)) { + if (cs[len] == 0 || cs[len] == 10 || cs[len] == 13) { + mwn->access_mask |= memwatch_access_masks[i].mask; + while (len > 0) { + len--; + cs[len] = ' '; + } + } + } + } + cs++; } ignore_ws (c); + if (more_params(c)) { + for (;;) { + TCHAR ncc = peek_next_char(c); + TCHAR nc = _totupper (next_char (c)); + if (mwn->rwi == 7) + mwn->rwi = 0; + if (nc == 'F') + mwn->frozen = 1; + if (nc == 'W') + mwn->rwi |= 2; + if (nc == 'I') + mwn->rwi |= 4; + if (nc == 'R') + mwn->rwi |= 1; + if (ncc == ' ') + break; + if (!more_params(c)) + break; + } + ignore_ws (c); + } if (more_params (c)) { if (_totupper (**c) == 'M') { mwn->modval_written = 1; @@ -2731,6 +2823,8 @@ static void memwatch (TCHAR **c) } } } + if (!mwn->access_mask) + mwn->access_mask = MW_MASK_CPU; if (mwn->frozen && mwn->rwi == 0) mwn->rwi = 3; memwatch_setup (); @@ -4346,10 +4440,14 @@ void debug (void) } } } else { - console_out_f (_T("Memwatch %d: break at %08X.%c %c%c%c %08X PC=%08X\n"), memwatch_triggered - 1, mwhit.addr, + console_out_f (_T("Memwatch %d: break at %08X.%c %c%c%c %08X PC=%08X "), memwatch_triggered - 1, mwhit.addr, mwhit.size == 1 ? 'B' : (mwhit.size == 2 ? 'W' : 'L'), (mwhit.rwi & 1) ? 'R' : ' ', (mwhit.rwi & 2) ? 'W' : ' ', (mwhit.rwi & 4) ? 'I' : ' ', mwhit.val, mwhit.pc); + for (i = 0; memwatch_access_masks[i].mask; i++) { + if (mwhit.access_mask == memwatch_access_masks[i].mask) + console_out_f (_T("%s (%03x)\n"), memwatch_access_masks[i].name, mwhit.reg); + } memwatch_triggered = 0; } if (skipaddr_doskip > 0) { diff --git a/disk.cpp b/disk.cpp index 4111c9ff..ac01d7c3 100644 --- a/disk.cpp +++ b/disk.cpp @@ -994,18 +994,18 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR return 0; } - if (!fake) + if (!fake) { inprec_recorddiskchange (dnum, fname, drv->wrprot); - - _tcsncpy (currprefs.floppyslots[dnum].df, fname, 255); - currprefs.floppyslots[dnum].df[255] = 0; - currprefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect; - _tcsncpy (changed_prefs.floppyslots[dnum].df, fname, 255); - changed_prefs.floppyslots[dnum].df[255] = 0; - changed_prefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect; - _tcscpy (drv->newname, fname); - drv->newnamewriteprotected = forcedwriteprotect; - gui_filename (dnum, fname); + _tcsncpy (currprefs.floppyslots[dnum].df, fname, 255); + currprefs.floppyslots[dnum].df[255] = 0; + currprefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect; + _tcsncpy (changed_prefs.floppyslots[dnum].df, fname, 255); + changed_prefs.floppyslots[dnum].df[255] = 0; + changed_prefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect; + _tcscpy (drv->newname, fname); + drv->newnamewriteprotected = forcedwriteprotect; + gui_filename (dnum, fname); + } memset (buffer, 0, sizeof buffer); size = 0; @@ -1240,11 +1240,13 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR drv->mfmpos |= (uaerand () << 16); drv->mfmpos %= drv->tracklen; drv->prevtracklen = 0; + if (!fake) { #ifdef DRIVESOUND - if (isfloppysound (drv)) - driveclick_insert (drv - floppy, 0); + if (isfloppysound (drv)) + driveclick_insert (drv - floppy, 0); #endif - update_drive_gui (drv - floppy, false); + update_drive_gui (drv - floppy, false); + } return 1; } @@ -1351,6 +1353,7 @@ static int drive_writeprotected (drive * drv) if (drv->catweasel) return 1; #endif + //write_log(_T("df%d: %d %d %d %x %s\n"), drv-&floppy[0],currprefs.floppy_read_only, drv->wrprot, drv->forcedwrprot, drv->diskfile, drv->diskfile ? zfile_getname(drv->diskfile) : _T("none")); return currprefs.floppy_read_only || drv->wrprot || drv->forcedwrprot || drv->diskfile == NULL; } @@ -2463,14 +2466,20 @@ static void diskfile_readonly (const TCHAR *name, bool readonly) struct mystat st; int mode, oldmode; - if (!my_stat (name, &st)) + if (!my_stat (name, &st)) { + write_log (_T("failed to access '%s'\n"), name); return; + } + write_log(_T("'%s': old mode = %x\n"), name, st.mode); oldmode = mode = st.mode; mode &= ~FILEFLAG_WRITE; if (!readonly) mode |= FILEFLAG_WRITE; - if (mode != oldmode) - my_chmod (name, mode); + if (mode != oldmode) { + if (!my_chmod (name, mode)) + write_log(_T("chmod failed!\n")); + } + write_log(_T("'%s': new mode = %x\n"), name, mode); } static void setdskchangetime (drive *drv, int dsktime) @@ -2504,10 +2513,15 @@ int disk_setwriteprotect (struct uae_prefs *p, int num, const TCHAR *name, bool TCHAR *name2; drive_type drvtype; + write_log(_T("disk_setwriteprotect %d '%s' %d\n"), num, name, writeprotected); + oldprotect = diskfile_iswriteprotect (p, name, &needwritefile, &drvtype); DISK_validate_filename (p, name, 1, &wrprot1, NULL, &zf1); if (!zf1) return 0; + + write_log(_T("old = %d writeprot = %d master = %d\n"), oldprotect, wrprot1, p->floppy_read_only); + if (wrprot1 && p->floppy_read_only) return 0; if (zfile_iscompressed (zf1)) diff --git a/events.cpp b/events.cpp index 4563424c..4a227a1d 100644 --- a/events.cpp +++ b/events.cpp @@ -176,3 +176,13 @@ void event2_newevent_xx (int no, evt t, uae_u32 data, evfunc2 func) MISC_handler (); } +int current_hpos (void) +{ + int hp = current_hpos_safe (); + if (hp < 0 || hp >= 256) { + gui_message(_T("hpos = %d!?\n"), hp); + hp = 0; + } + return hp; +} + diff --git a/filesys.cpp b/filesys.cpp index a49a0c01..536481ed 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -994,11 +994,23 @@ struct hardfiledata *get_hardfile_data (int nr) #define ACTION_READ_LINK 1024 +/* OS4 64-bit filesize packets */ #define ACTION_CHANGE_FILE_POSITION64 8001 #define ACTION_GET_FILE_POSITION64 8002 #define ACTION_CHANGE_FILE_SIZE64 8003 #define ACTION_GET_FILE_SIZE64 8004 +/* MOS 64-bit filesize packets */ +#define ACTION_SEEK64 26400 +#define ACTION_SET_FILE_SIZE64 26401 +#define ACTION_LOCK_RECORD64 26402 +#define ACTION_FREE_RECORD64 26403 +#define ACTION_QUERY_ATTR 26407 +#define ACTION_EXAMINE_OBJECT64 26408 +#define ACTION_EXAMINE_NEXT64 26409 +#define ACTION_EXAMINE_FH64 26410 + + /* not supported */ #define ACTION_MAKE_LINK 1021 @@ -1018,8 +1030,8 @@ struct lockrecord { struct lockrecord *next; uae_u32 packet; - uae_u32 pos; - uae_u32 len; + uae_u64 pos; + uae_u64 len; uae_u32 mode; uae_u32 timeout; uae_u32 msg; @@ -1131,6 +1143,20 @@ typedef struct _unit { static uae_u32 a_uniq, key_uniq; +static void set_quadp(uaecptr p, uae_s64 v) +{ + if (!valid_address(p, 8)) + return; + put_long(p, v >> 32); + put_long(p + 4, (uae_u64)v); +} +static uae_u64 get_quadp(uaecptr p) +{ + if (!valid_address(p, 8)) + return 0; + return ((uae_u64)get_long(p) << 32) | get_long(p + 4); +} + typedef uaecptr dpacket; #define PUT_PCK_RES1(p,v) do { put_long ((p) + dp_Res1, (v)); } while (0) #define PUT_PCK_RES2(p,v) do { put_long ((p) + dp_Res2, (v)); } while (0) @@ -3643,27 +3669,32 @@ static void move_exkeys (Unit *unit, a_inode *from, a_inode *to) from->locked_children = 0; } +static bool get_statinfo(Unit *unit, a_inode *aino, struct mystat *statbuf) +{ + bool ok = true; + memset (statbuf, 0, sizeof statbuf); + /* No error checks - this had better work. */ + if (unit->volflags & MYVOLUMEINFO_ARCHIVE) + ok = zfile_stat_archive (aino->nname, statbuf) != 0; + else if (unit->volflags & MYVOLUMEINFO_CDFS) + ok = isofs_stat (unit->ui.cdfs_superblock, aino->uniq_external, statbuf); + else + my_stat (aino->nname, statbuf); + return ok; +} + static void - get_fileinfo (Unit *unit, dpacket packet, uaecptr info, a_inode *aino) + get_fileinfo (Unit *unit, dpacket packet, uaecptr info, a_inode *aino, bool longfilesize) { struct mystat statbuf; int days, mins, ticks; int i, n, entrytype, blocksize; + uae_s64 numblocks; int fsdb_can = fsdb_cando (unit); TCHAR *xs; char *x, *x2; - bool ok = true; - - memset (&statbuf, 0, sizeof statbuf); - /* No error checks - this had better work. */ - if (unit->volflags & MYVOLUMEINFO_ARCHIVE) - ok = zfile_stat_archive (aino->nname, &statbuf) != 0; - else if (unit->volflags & MYVOLUMEINFO_CDFS) - ok = isofs_stat (unit->ui.cdfs_superblock, aino->uniq_external, &statbuf); - else - my_stat (aino->nname, &statbuf); - if (!ok) { + if (!get_statinfo(unit, aino, &statbuf)) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_NOT_A_DOS_DISK); return; @@ -3699,13 +3730,27 @@ static void xfree (x2); put_long (info + 116, fsdb_can ? aino->amigaos_mode : fsdb_mode_supported (aino)); - put_long (info + 124, statbuf.size > MAXFILESIZE32 ? MAXFILESIZE32 : (uae_u32)statbuf.size); -#ifdef HAVE_ST_BLOCKS - put_long (info + 128, statbuf.st_blocks); -#else + + if (kickstart_version >= 36) { + put_word (info + 224, 0); // OwnerUID + put_word (info + 226, 0); // OwnerGID + } + blocksize = (unit->volflags & MYVOLUMEINFO_CDFS) ? 2048 : 512; - put_long (info + 128, (statbuf.size + blocksize - 1) / blocksize); -#endif + numblocks = (statbuf.size + blocksize - 1) / blocksize; + put_long (info + 128, numblocks > MAXFILESIZE32 ? MAXFILESIZE32 : numblocks); + + if (longfilesize) { + /* MorphOS 64-bit file length support */ + put_long (info + 124, statbuf.size > MAXFILESIZE32 ? 0 : (uae_u32)statbuf.size); + put_long (info + 228, statbuf.size >> 32); + put_long (info + 232, (uae_u32)statbuf.size); + put_long (info + 236, numblocks >> 32); + put_long (info + 240, (uae_u32)numblocks); + } else { + put_long (info + 124, statbuf.size > MAXFILESIZE32 ? MAXFILESIZE32 : (uae_u32)statbuf.size); + } + timeval_to_amiga (&statbuf.mtime, &days, &mins, &ticks); put_long (info + 132, days); put_long (info + 136, mins); @@ -3747,13 +3792,12 @@ int get_native_path (uae_u32 lock, TCHAR *out) return -1; } - #define REC_EXCLUSIVE 0 #define REC_EXCLUSIVE_IMMED 1 #define REC_SHARED 2 #define REC_SHARED_IMMED 3 -static struct lockrecord *new_record (uae_u32 packet, uae_u32 pos, uae_u32 len, uae_u32 mode, uae_u32 timeout, uae_u32 msg) +static struct lockrecord *new_record (uae_u32 packet, uae_u64 pos, uae_u64 len, uae_u32 mode, uae_u32 timeout, uae_u32 msg) { struct lockrecord *lr = xcalloc (struct lockrecord, 1); lr->packet = packet; @@ -3765,7 +3809,7 @@ static struct lockrecord *new_record (uae_u32 packet, uae_u32 pos, uae_u32 len, return lr; } -static bool record_hit (Unit *unit, Key *k, uae_u32 pos, uae_u32 len, uae_u32 mode) +static bool record_hit (Unit *unit, Key *k, uae_u64 pos, uae_u64 len, uae_u32 mode) { bool exclusive = mode == REC_EXCLUSIVE || mode == REC_EXCLUSIVE_IMMED; for (Key *k2 = unit->keys; k2; k2 = k2->next) { @@ -3775,10 +3819,10 @@ static bool record_hit (Unit *unit, Key *k, uae_u32 pos, uae_u32 len, uae_u32 mo for (struct lockrecord *lr = k2->record; lr; lr = lr->next) { bool exclusive2 = lr->mode == REC_EXCLUSIVE || lr->mode == REC_EXCLUSIVE_IMMED; if (exclusive || exclusive2) { - uae_u32 a1 = pos; - uae_u32 a2 = pos + len; - uae_u32 b1 = lr->pos; - uae_u32 b2 = lr->pos + lr->len; + uae_u64 a1 = pos; + uae_u64 a2 = pos + len; + uae_u64 b1 = lr->pos; + uae_u64 b2 = lr->pos + lr->len; if (len && lr->len) { bool hit = (a1 >= b1 && a1 < b2) || (a2 > b1 && a2 < b2) || (b1 >= a1 && b1 < a2) || (b2 > a1 && b2 < a2); if (hit) @@ -3810,7 +3854,7 @@ static void record_timeout (Unit *unit) prev->next = lr->next; else unit->waitingrecords = lr->next; - write_log (_T("queued record timed out '%s',%d,%d,%d,%d\n"), k ? k->aino->nname : _T("NULL"), lr->pos, lr->len, lr->mode, lr->timeout); + write_log (_T("queued record timed out '%s',%lld,%lld,%d,%d\n"), k ? k->aino->nname : _T("NULL"), lr->pos, lr->len, lr->mode, lr->timeout); xfree (lr); retry = true; break; @@ -4022,6 +4066,9 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec uid = 0; gid = 0; } + if (type >= 8) { + size2 += 8; + } i = get_long (control + 0); while (i > 0) { @@ -4068,6 +4115,11 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec put_word (exp + 36, uid); put_word (exp + 38, gid); } + if (type >= 8) { + put_long (exp + 40, statbuf.size >> 32); + put_long (exp + 44, (uae_u32)statbuf.size); + } + put_long (control + 0, get_long (control + 0) + 1); ret = 1; end: @@ -4190,7 +4242,7 @@ static int action_examine_all (Unit *unit, dpacket packet) if (kickstart_version < 36) return 0; - if (type == 0 || type > 7) { + if (type == 0 || type > 8) { doserr = ERROR_BAD_NUMBER; goto fail; } @@ -4334,7 +4386,7 @@ static void action_examine_object (Unit *unit, dpacket packet) if (aino == 0) aino = &unit->rootnode; - get_fileinfo (unit, packet, info, aino); + get_fileinfo (unit, packet, info, aino, false); if (aino->dir) { put_long (info, 0xFFFFFFFF); } else @@ -4389,14 +4441,14 @@ static void populate_directory (Unit *unit, a_inode *base) fs_closedir (d); } -static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info) +static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info, bool longfilesize) { for (;;) { TCHAR *name; if (ek->curr_file == 0) break; name = ek->curr_file->nname; - get_fileinfo (unit, packet, info, ek->curr_file); + get_fileinfo (unit, packet, info, ek->curr_file, longfilesize); ek->curr_file = ek->curr_file->sibling; if (!(unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS)) && !fsdb_exists(name)) { TRACE ((_T("%s orphaned"), name)); @@ -4412,7 +4464,7 @@ static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info PUT_PCK_RES2 (packet, ERROR_NO_MORE_ENTRIES); } -static void action_examine_next (Unit *unit, dpacket packet) +static void action_examine_next (Unit *unit, dpacket packet, bool largefilesize) { uaecptr lock = GET_PCK_ARG1 (packet) << 2; uaecptr info = GET_PCK_ARG2 (packet) << 2; @@ -4420,7 +4472,7 @@ static void action_examine_next (Unit *unit, dpacket packet) ExamineKey *ek; uae_u32 uniq; - TRACE((_T("ACTION_EXAMINE_NEXT(0x%lx,0x%lx)\n"), lock, info)); + TRACE((_T("ACTION_EXAMINE_NEXT(0x%lx,0x%lx,%d)\n"), lock, info, largefilesize)); gui_flicker_led (UNIT_LED(unit), unit->unit, 1); DUMPLOCK(unit, lock); @@ -4460,7 +4512,7 @@ static void action_examine_next (Unit *unit, dpacket packet) if (!ek->curr_file) goto no_more_entries; } - do_examine (unit, packet, ek, info); + do_examine (unit, packet, ek, info, largefilesize); return; no_more_entries: @@ -4931,7 +4983,7 @@ static void temppos = pos; if (whence == SEEK_END) temppos = filesize + pos; - if (filesize < temppos) { + if (filesize < temppos || temppos < 0) { PUT_PCK_RES1 (packet, -1); PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR); return; @@ -5235,14 +5287,14 @@ static void } static void - action_examine_fh (Unit *unit, dpacket packet) + action_examine_fh (Unit *unit, dpacket packet, bool largefilesize) { Key *k; a_inode *aino = 0; uaecptr info = GET_PCK_ARG2 (packet) << 2; - TRACE((_T("ACTION_EXAMINE_FH(0x%lx,0x%lx)\n"), - GET_PCK_ARG1 (packet), GET_PCK_ARG2 (packet) )); + TRACE((_T("ACTION_EXAMINE_FH(0x%lx,0x%lx,%d)\n"), + GET_PCK_ARG1 (packet), GET_PCK_ARG2 (packet), largefilesize )); k = lookup_key (unit, GET_PCK_ARG1 (packet)); if (k != 0) @@ -5250,7 +5302,7 @@ static void if (aino == 0) aino = &unit->rootnode; - get_fileinfo (unit, packet, info, aino); + get_fileinfo (unit, packet, info, aino, largefilesize); if (aino->dir) put_long (info, 0xFFFFFFFF); else @@ -5283,6 +5335,13 @@ static void return; } + /* Fail if file is >=2G, it is not safe operation. */ + if (fs_fsize64 (k->fd) > MAXFILESIZE32) { + PUT_PCK_RES1 (packet, DOS_TRUE); + PUT_PCK_RES2 (packet, ERROR_BAD_NUMBER); /* ? */ + return; + } + gui_flicker_led (UNIT_LED(unit), unit->unit, 1); k->notifyactive = 1; /* If any open files have file pointers beyond this size, truncate only @@ -5307,7 +5366,7 @@ static void * the requested size, the truncate guarantees that it can't be larger. * If we were to write one byte earlier we'd clobber file data. */ if (my_truncate (k->aino->nname, offset) == -1) { - PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES1 (packet, DOS_TRUE); PUT_PCK_RES2 (packet, dos_errno ()); return; } @@ -5659,6 +5718,8 @@ static void } } +/* OS4 */ + static void action_change_file_position64 (Unit *unit, dpacket packet) { Key *k = lookup_key (unit, GET_PCK64_ARG1 (packet)); @@ -5712,7 +5773,6 @@ static void action_change_file_position64 (Unit *unit, dpacket packet) k->file_pos = fs_lseek64 (k->fd, 0, SEEK_CUR); } TRACE((_T("= oldpos %lld newpos %lld\n"), cur, k->file_pos)); - } static void action_get_file_position64 (Unit *unit, dpacket packet) @@ -5783,7 +5843,6 @@ static void action_change_file_size64 (Unit *unit, dpacket packet) PUT_PCK64_RES2 (packet, 0); } - static void action_get_file_size64 (Unit *unit, dpacket packet) { Key *k = lookup_key (unit, GET_PCK64_ARG1 (packet)); @@ -5807,6 +5866,217 @@ static void action_get_file_size64 (Unit *unit, dpacket packet) PUT_PCK64_RES2 (packet, ERROR_SEEK_ERROR); } +/* MOS */ + +static void action_examine_object64(Unit *unit, dpacket packet) +{ + uaecptr lock = GET_PCK_ARG1 (packet) << 2; + uaecptr info = GET_PCK_ARG2 (packet) << 2; + a_inode *aino = 0; + + TRACE((_T("ACTION_EXAMINE_OBJECT(0x%lx,0x%lx)\n"), lock, info)); + DUMPLOCK(unit, lock); + + if (lock != 0) + aino = aino_from_lock (unit, lock); + if (aino == 0) + aino = &unit->rootnode; + + get_fileinfo (unit, packet, info, aino, true); + if (aino->dir) { + put_long (info, 0xFFFFFFFF); + } else + put_long (info, 0); +} + +static void action_set_file_size64(Unit *unit, dpacket packet) +{ + Key *k, *k1; + uae_s64 offset = get_quadp(GET_PCK_ARG2 (packet)); + long mode = (uae_s32)GET_PCK_ARG3 (packet); + int whence = SEEK_CUR; + + if (mode > 0) + whence = SEEK_END; + if (mode < 0) + whence = SEEK_SET; + + TRACE((_T("ACTION_SET_FILE_SIZE64(0x%lx, %lld, 0x%x)\n"), GET_PCK_ARG1 (packet), offset, mode)); + + k = lookup_key (unit, GET_PCK_ARG1 (packet)); + if (k == 0) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_OBJECT_NOT_AROUND); + return; + } + + gui_flicker_led (UNIT_LED(unit), unit->unit, 1); + k->notifyactive = 1; + /* If any open files have file pointers beyond this size, truncate only + * so far that these pointers do not become invalid. */ + for (k1 = unit->keys; k1; k1 = k1->next) { + if (k != k1 && k->aino == k1->aino) { + if (k1->file_pos > offset) + offset = k1->file_pos; + } + } + + /* Write one then truncate: that should give the right size in all cases. */ + fs_lseek (k->fd, offset, whence); + offset = fs_lseek64 (k->fd, offset, whence); + fs_write (k->fd, /* whatever */(uae_u8*)&k1, 1); + if (k->file_pos > offset) + k->file_pos = offset; + fs_lseek64 (k->fd, k->file_pos, SEEK_SET); + + if (my_truncate (k->aino->nname, offset) == -1) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, dos_errno ()); + return; + } + + PUT_PCK_RES1 (packet, DOS_TRUE); + set_quadp(GET_PCK_ARG4(packet), offset); +} + +static void action_seek64(Unit *unit, dpacket packet) +{ + Key *k = lookup_key(unit, GET_PCK_ARG1(packet)); + uae_s64 pos = get_quadp(GET_PCK64_ARG2(packet)); + long mode = GET_PCK_ARG3(packet); + long whence = SEEK_CUR; + uae_s64 res, cur; + + if (k == 0) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_INVALID_LOCK); + return; + } + + if (mode > 0) + whence = SEEK_END; + if (mode < 0) + whence = SEEK_SET; + + TRACE((_T("ACTION_SEEK64(%s,%lld,%d)\n"), k->aino->nname, pos, mode)); + gui_flicker_led (UNIT_LED(unit), unit->unit, 1); + + cur = k->file_pos; + { + uae_s64 temppos; + uae_s64 filesize = fs_fsize64 (k->fd); + + if (whence == SEEK_CUR) + temppos = cur + pos; + if (whence == SEEK_SET) + temppos = pos; + if (whence == SEEK_END) + temppos = filesize + pos; + if (filesize < temppos) { + res = -1; + PUT_PCK_RES1 (packet, res); + PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR); + return; + } + } + res = fs_lseek64 (k->fd, pos, whence); + + if (-1 == res) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR); + } else { + PUT_PCK_RES1 (packet, TRUE); + set_quadp(GET_PCK_ARG3(packet), cur); + k->file_pos = fs_lseek64 (k->fd, 0, SEEK_CUR); + } + TRACE((_T("= oldpos %lld newpos %lld\n"), cur, k->file_pos)); +} + +static int action_lock_record64(Unit *unit, dpacket packet, uae_u32 msg) +{ + Key *k = lookup_key(unit, GET_PCK_ARG1(packet)); + uae_u64 pos = get_quadp(GET_PCK_ARG2(packet)); + uae_u64 len = get_quadp(GET_PCK_ARG3(packet)); + uae_u32 mode = GET_PCK_ARG4(packet); + uae_u32 timeout = GET_PCK_ARG5(packet); + + bool exclusive = mode == REC_EXCLUSIVE || mode == REC_EXCLUSIVE_IMMED; + + write_log (_T("action_lock_record64('%s',%lld,%lld,%d,%d)\n"), k ? k->aino->nname : _T("null"), pos, len, mode, timeout); + + if (!k || mode > REC_SHARED_IMMED) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_OBJECT_WRONG_TYPE); + return 1; + } + + if (mode == REC_EXCLUSIVE_IMMED || mode == REC_SHARED_IMMED) + timeout = 0; + + if (record_hit (unit, k, pos, len, mode)) { + if (timeout && msg) { + // queue it and do not reply + struct lockrecord *lr = new_record (packet, pos, len, mode, timeout, msg); + if (unit->waitingrecords) { + lr->next = unit->waitingrecords; + unit->waitingrecords = lr; + } else { + unit->waitingrecords = lr; + } + write_log (_T("-> collision, timeout queued\n")); + return -1; + } + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_LOCK_COLLISION); + write_log (_T("-> ERROR_LOCK_COLLISION\n")); + return 1; + } + + struct lockrecord *lr = new_record (GET_PCK_ARG1(packet), pos, len, mode, timeout, 0); + if (k->record) { + lr->next = k->record; + k->record = lr; + } else { + k->record = lr; + } + PUT_PCK_RES1 (packet, DOS_TRUE); + write_log (_T("-> OK\n")); + return 1; +} + +static void action_free_record64(Unit *unit, dpacket packet) +{ + Key *k = lookup_key(unit, GET_PCK_ARG1(packet)); + uae_u64 pos = get_quadp(GET_PCK_ARG2(packet)); + uae_u64 len = get_quadp(GET_PCK_ARG3 (packet)); + + write_log (_T("action_free_record('%s',%lld,%lld)\n"), k ? k->aino->nname : _T("null"), pos, len); + + if (!k) { + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_OBJECT_WRONG_TYPE); + return; + } + + struct lockrecord *prev = NULL; + for (struct lockrecord *lr = k->record; lr; lr = lr->next) { + if (lr->pos == pos && lr->len == len) { + if (prev) + prev->next = lr->next; + else + k->record = lr->next; + xfree (lr); + write_log (_T("->OK\n")); + record_check_waiting (unit); + PUT_PCK_RES1 (packet, DOS_TRUE); + return; + } + } + write_log (_T("-> ERROR_RECORD_NOT_LOCKED\n")); + PUT_PCK_RES1 (packet, DOS_FALSE); + PUT_PCK_RES2 (packet, ERROR_RECORD_NOT_LOCKED); +} + /* We don't want multiple interrupts to be active at the same time. I don't * know whether AmigaOS takes care of that, but this does. */ static uae_sem_t singlethread_int_sem; @@ -5982,7 +6252,7 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg) case ACTION_DISK_INFO: action_disk_info (unit, pck); break; case ACTION_INFO: action_info (unit, pck); break; case ACTION_EXAMINE_OBJECT: action_examine_object (unit, pck); break; - case ACTION_EXAMINE_NEXT: action_examine_next (unit, pck); break; + case ACTION_EXAMINE_NEXT: action_examine_next (unit, pck, false); break; case ACTION_FIND_INPUT: action_find_input (unit, pck); break; case ACTION_FIND_WRITE: action_find_write (unit, pck); break; case ACTION_FIND_OUTPUT: action_find_output (unit, pck); break; @@ -6008,7 +6278,7 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg) /* 2.0+ packet types */ case ACTION_SET_FILE_SIZE: action_set_file_size (unit, pck); break; - case ACTION_EXAMINE_FH: action_examine_fh (unit, pck); break; + case ACTION_EXAMINE_FH: action_examine_fh (unit, pck, false); break; case ACTION_FH_FROM_LOCK: action_fh_from_lock (unit, pck); break; case ACTION_COPY_DIR_FH: action_lock_from_fh (unit, pck); break; case ACTION_CHANGE_MODE: action_change_mode (unit, pck); break; @@ -6022,12 +6292,21 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg) case ACTION_READ_LINK: action_read_link (unit, pck); break; case ACTION_MAKE_LINK: action_make_link (unit, pck); break; - /* OS4+ packet types */ + /* OS4 packet types */ case ACTION_CHANGE_FILE_POSITION64: action_change_file_position64 (unit, pck); break; case ACTION_GET_FILE_POSITION64: action_get_file_position64 (unit, pck); break; case ACTION_CHANGE_FILE_SIZE64: action_change_file_size64 (unit, pck); break; case ACTION_GET_FILE_SIZE64: action_get_file_size64 (unit, pck); break; + /* MOS packet types */ + case ACTION_SEEK64: action_seek64(unit, pck); break; + case ACTION_SET_FILE_SIZE64: action_set_file_size64(unit, pck); break; + case ACTION_EXAMINE_OBJECT64: action_examine_object64(unit, pck); break; + case ACTION_EXAMINE_NEXT64: action_examine_next(unit, pck, true); break; + case ACTION_EXAMINE_FH64: action_examine_fh(unit, pck, true); break; + case ACTION_LOCK_RECORD64: return action_lock_record64(unit, pck, msg); break; + case ACTION_FREE_RECORD64: action_free_record64(unit, pck); break; + /* unsupported packets */ case ACTION_FORMAT: write_log (_T("FILESYS: UNSUPPORTED PACKET %x\n"), type); diff --git a/gencpu.cpp b/gencpu.cpp index 2496efb8..3c694661 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -44,6 +44,7 @@ static int count_read_ea, count_write_ea, count_cycles_ea; static const char *mmu_postfix; static int memory_cycle_cnt; static int did_prefetch; +static int ipl_fetched; static int optimized_flags; @@ -517,8 +518,11 @@ static void makefromsr (void) static void check_ipl (void) { + if (ipl_fetched) + return; if (using_ce || using_ce020) printf ("\tipl_fetch ();\n"); + ipl_fetched = true; } static void irc2ir (bool dozero) @@ -5042,6 +5046,7 @@ static void gen_opcode (unsigned long int opcode) fill_prefetch_finish (); sync_m68k_pc (); did_prefetch = 0; + ipl_fetched = 0; } static void generate_includes (FILE * f, int id) diff --git a/include/debug.h b/include/debug.h index 268cbdb8..99b55e33 100644 --- a/include/debug.h +++ b/include/debug.h @@ -13,6 +13,7 @@ #define MAX_LINEWIDTH 100 extern int debugging; +extern int memwatch_enabled; extern int exception_debugging; extern int debug_copper; extern int debug_dma; @@ -57,26 +58,56 @@ struct breakpoint_node { }; extern struct breakpoint_node bpnodes[BREAKPOINT_TOTAL]; +#define MW_MASK_CPU 0x00000001 +#define MW_MASK_BLITTER_A 0x00000002 +#define MW_MASK_BLITTER_B 0x00000004 +#define MW_MASK_BLITTER_C 0x00000008 +#define MW_MASK_BLITTER_D 0x00000010 +#define MW_MASK_COPPER 0x00000020 +#define MW_MASK_DISK 0x00000040 +#define MW_MASK_AUDIO_0 0x00000080 +#define MW_MASK_AUDIO_1 0x00000100 +#define MW_MASK_AUDIO_2 0x00000200 +#define MW_MASK_AUDIO_3 0x00000400 +#define MW_MASK_BPL_0 0x00000800 +#define MW_MASK_BPL_1 0x00001000 +#define MW_MASK_BPL_2 0x00002000 +#define MW_MASK_BPL_3 0x00004000 +#define MW_MASK_BPL_4 0x00008000 +#define MW_MASK_BPL_5 0x00010000 +#define MW_MASK_BPL_6 0x00020000 +#define MW_MASK_BPL_7 0x00040000 +#define MW_MASK_SPR_0 0x00080000 +#define MW_MASK_SPR_1 0x00100000 +#define MW_MASK_SPR_2 0x00200000 +#define MW_MASK_SPR_3 0x00400000 +#define MW_MASK_SPR_4 0x00800000 +#define MW_MASK_SPR_5 0x01000000 +#define MW_MASK_SPR_6 0x02000000 +#define MW_MASK_SPR_7 0x04000000 +#define MW_MASK_ALL (0x08000000 - 1) + #define MEMWATCH_TOTAL 20 struct memwatch_node { uaecptr addr; int size; int rwi; - uae_u32 val, val_mask; + uae_u32 val, val_mask, access_mask; int val_size, val_enabled; int mustchange; uae_u32 modval; int modval_written; int frozen; + uae_u32 reg; uaecptr pc; }; extern struct memwatch_node mwnodes[MEMWATCH_TOTAL]; extern void memwatch_dump2 (TCHAR *buf, int bufsize, int num); -uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg); -uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg); -uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, int reg); +uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg); +uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg); +uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, uae_u32 mask, int reg); void debug_lgetpeek (uaecptr addr, uae_u32 v); void debug_wgetpeek (uaecptr addr, uae_u32 v); void debug_bgetpeek (uaecptr addr, uae_u32 v); @@ -97,7 +128,7 @@ void debugtest (enum debugtest_item, const TCHAR *, ...); struct dma_rec { uae_u16 reg; - uae_u16 dat; + uae_u32 dat; uae_u32 addr; uae_u16 evt; int type; diff --git a/include/events.h b/include/events.h index 78d48393..413150d2 100644 --- a/include/events.h +++ b/include/events.h @@ -76,6 +76,8 @@ extern struct ev2 eventtab2[ev2_max]; extern volatile bool vblank_found_chipset; extern volatile bool vblank_found_rtg; +extern int hpos_offset; +extern int maxhpos; STATIC_INLINE void cycles_do_special (void) { @@ -116,15 +118,7 @@ STATIC_INLINE int current_hpos_safe (void) return hp; } -STATIC_INLINE int current_hpos (void) -{ - int hp = current_hpos_safe (); - if (hp < 0 || hp >= 256) { - gui_message(_T("hpos = %d!?\n"), hp); - hp = 0; - } - return hp; -} +extern int current_hpos(void); STATIC_INLINE bool cycles_in_range (unsigned long endcycles) { diff --git a/include/fsdb.h b/include/fsdb.h index 4ada269c..4abc48b5 100644 --- a/include/fsdb.h +++ b/include/fsdb.h @@ -18,6 +18,7 @@ /* AmigaOS errors */ #define ERROR_NO_FREE_STORE 103 #define ERROR_BAD_NUMBER 115 +#define ERROR_LINE_TOO_LONG 120 #define ERROR_OBJECT_IN_USE 202 #define ERROR_OBJECT_EXISTS 203 #define ERROR_DIR_NOT_FOUND 204 diff --git a/include/inputdevice.h b/include/inputdevice.h index 2f27a9f6..25d80dc2 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -269,7 +269,7 @@ extern void read_inputdevice_config (struct uae_prefs *p, const TCHAR *option, T extern void reset_inputdevice_config (struct uae_prefs *pr); extern void store_inputdevice_config (struct uae_prefs *pr); extern void restore_inputdevice_config (struct uae_prefs *p, int portnum); -extern int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type); +extern int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type, bool validate); extern int inputdevice_getjoyportdevice (int port, int val); extern void inputdevice_validate_jports (struct uae_prefs *p, int changedport); diff --git a/include/memory.h b/include/memory.h index 6f809ee6..66947466 100644 --- a/include/memory.h +++ b/include/memory.h @@ -226,7 +226,7 @@ extern void expamem_init (void); extern void expamem_reset (void); extern void expamem_next (void); -extern uae_u16 last_custom_value1; +extern uae_u32 last_custom_value1; /* Default memory access functions */ diff --git a/include/options.h b/include/options.h index b555e95d..fc04c8d5 100644 --- a/include/options.h +++ b/include/options.h @@ -12,7 +12,7 @@ #define UAEMAJOR 2 #define UAEMINOR 8 -#define UAESUBREV 0 +#define UAESUBREV 1 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang; diff --git a/inputdevice.cpp b/inputdevice.cpp index 3dc2cac0..c1677f14 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -3562,6 +3562,8 @@ static int getoldport (struct uae_input_device *id) return -1; } +#define SWITCHDEBUG_DEBUG 0 + static int switchdevice (struct uae_input_device *id, int num, bool buttonmode) { int i, j; @@ -3572,7 +3574,9 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode) int otherbuttonpressed = 0; int acc = input_acquired; - //write_log (_T("switchdevice '%s' %d %d\n"), id->name, num, buttonmode); +#if SWITCHDEBUG_DEBUG + write_log (_T("switchdevice '%s' %d %d\n"), id->name, num, buttonmode); +#endif if (num >= 4) return 0; @@ -3600,82 +3604,172 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode) flags = idev[IDTYPE_MOUSE].get_flags (i); } } - if (!name) + if (!name) { +#if SWITCHDEBUG_DEBUG + write_log(_T("device not found!?\n")); +#endif return 0; + } if (buttonmode) { if (num == 0 && otherbuttonpressed) newport = newport ? 0 : 1; } else { newport = num ? 1 : 0; } - //write_log (_T("newport = %d\n"), newport); +#if SWITCHDEBUG_DEBUG + write_log (_T("newport = %d ismouse=%d flags=%d name=%s\n"), newport, ismouse, flags, name); +#endif /* "GamePorts" switch if in GamePorts mode or Input mode and GamePorts port was not NONE */ if (currprefs.input_selected_setting == GAMEPORT_INPUT_SETTINGS || currprefs.jports[newport].id != JPORT_NONE) { - //write_log (_T("GAMEPORTS MODE\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("GAMEPORTS MODE %d %d\n"), currprefs.input_selected_setting, currprefs.jports[newport].id); +#endif if ((num == 0 || num == 1) && currprefs.jports[newport].id != JPORT_CUSTOM) { - //write_log (_T("Port supported\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("Port supported\n")); +#endif + bool issupermouse = false; int om = jsem_ismouse (num, &currprefs); int om1 = jsem_ismouse (0, &currprefs); int om2 = jsem_ismouse (1, &currprefs); if ((om1 >= 0 || om2 >= 0) && ismouse) { - //write_log (_T("END3\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("END3\n")); +#endif return 0; } if (flags) { - //write_log (_T("END2\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("END2\n")); +#endif return 0; } - if (name) { #if 1 - if (ismouse) { - int nummouse = 0; // count number of non-supermouse mice - int supermouse = -1; - for (i = 0; i < idev[IDTYPE_MOUSE].get_num (); i++) { - if (!idev[IDTYPE_MOUSE].get_flags (i)) - nummouse++; - else - supermouse = i; + if (ismouse) { + int nummouse = 0; // count number of non-supermouse mice + int supermouse = -1; + for (i = 0; i < idev[IDTYPE_MOUSE].get_num (); i++) { + if (!idev[IDTYPE_MOUSE].get_flags (i)) + nummouse++; + else + supermouse = i; + } +#if SWITCHDEBUG_DEBUG + write_log (_T("inputdevice gameports change supermouse=%d num=%d\n"), supermouse, nummouse); +#endif + if (supermouse >= 0 && nummouse == 1) { + TCHAR *oldname = name; + name = idev[IDTYPE_MOUSE].get_uniquename (supermouse); + issupermouse = true; +#if SWITCHDEBUG_DEBUG + write_log (_T("inputdevice gameports change '%s' -> '%s'\n"), oldname, name); +#endif + } + } +#endif +#if SWITCHDEBUG_DEBUG + write_log (_T("inputdevice gameports change '%s':%d->%d %d,%d\n"), name, num, newport, currprefs.input_selected_setting, currprefs.jports[newport].id); +#endif + inputdevice_unacquire (); + + if (currprefs.input_selected_setting != GAMEPORT_INPUT_SETTINGS && currprefs.jports[newport].id > JPORT_NONE) { + // disable old device + int devnum; + devnum = jsem_ismouse(newport, &currprefs); +#if SWITCHDEBUG_DEBUG + write_log(_T("ismouse num = %d supermouse=%d\n"), devnum, issupermouse); +#endif + if (devnum >= 0) { + if (changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].enabled) { + changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].enabled = false; +#if SWITCHDEBUG_DEBUG + write_log(_T("input panel mouse device '%s' disabled\n"), changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].name); +#endif + } + } + for (int l = 0; l < idev[IDTYPE_MOUSE].get_num(); l++) { + if (changed_prefs.mouse_settings[currprefs.input_selected_setting][l].enabled) { + if (idev[IDTYPE_MOUSE].get_flags(l)) { +#if SWITCHDEBUG_DEBUG + write_log (_T("enabled supermouse %d detected\n"), l); +#endif + issupermouse = true; + } } - if (supermouse >= 0 && nummouse == 1) { - name = idev[IDTYPE_MOUSE].get_uniquename (supermouse); + } + if (issupermouse) { + // new mouse is supermouse, disable all other mouse devices + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + changed_prefs.mouse_settings[currprefs.input_selected_setting][l].enabled = false; } } + + devnum = jsem_isjoy(newport, &currprefs); +#if SWITCHDEBUG_DEBUG + write_log(_T("isjoy num = %d\n"), devnum); #endif - write_log (_T("inputdevice change '%s':%d->%d\n"), name, num, newport); - inputdevice_unacquire (); - inputdevice_joyport_config (&changed_prefs, name, newport, -1, 2); - inputdevice_validate_jports (&changed_prefs, -1); - inputdevice_copyconfig (&changed_prefs, &currprefs); - if (acc) - inputdevice_acquire (TRUE); - return 1; + if (devnum >= 0) { + if (changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].enabled) { + changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].enabled = false; +#if SWITCHDEBUG_DEBUG + write_log(_T("input panel joystick device '%s' disabled\n"), changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].name); +#endif + } + } } + + inputdevice_joyport_config (&changed_prefs, name, newport, -1, 2, false); + inputdevice_validate_jports (&changed_prefs, -1); + inputdevice_copyconfig (&changed_prefs, &currprefs); + if (acc) + inputdevice_acquire (TRUE); + return 1; } - //write_log (_T("END1\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("END1\n")); +#endif return 0; } else { - //write_log (_T("INPUTPANEL MODE\n")); +#if SWITCHDEBUG_DEBUG + write_log (_T("INPUTPANEL MODE %d\n"), flags); +#endif int oldport = getoldport (id); int k, evt; - struct inputevent *ie, *ie2; + struct inputevent *ie, *ie2; if (flags) return 0; - if (oldport <= 0) + if (oldport <= 0) { +#if SWITCHDEBUG_DEBUG + write_log(_T("OLDPORT %d\n"), oldport); +#endif return 0; + } newport++; /* do not switch if switching mouse and any "supermouse" mouse enabled */ if (ismouse) { for (i = 0; i < MAX_INPUT_SETTINGS; i++) { - if (mice[i].enabled && idev[IDTYPE_MOUSE].get_flags (i)) + if (mice[i].enabled && idev[IDTYPE_MOUSE].get_flags (i)) { +#if SWITCHDEBUG_DEBUG + write_log(_T("SUPERMOUSE %d enabled\n"), i); +#endif return 0; + } } } for (i = 0; i < MAX_INPUT_SETTINGS; i++) { - if (getoldport (&joysticks[i]) == newport) + if (getoldport (&joysticks[i]) == newport) { joysticks[i].enabled = 0; - if (getoldport (&mice[i]) == newport) +#if SWITCHDEBUG_DEBUG + write_log(_T("Joystick %d disabled\n"), i); +#endif + } + if (getoldport (&mice[i]) == newport) { mice[i].enabled = 0; +#if SWITCHDEBUG_DEBUG + write_log(_T("Mouse %d disabled\n"), i); +#endif + } } id->enabled = 1; for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { @@ -3707,7 +3801,7 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode) } } } - write_log (_T("inputdevice change '%s':%d->%d\n"), name, num, newport); + write_log (_T("inputdevice input change '%s':%d->%d\n"), name, num, newport); inputdevice_unacquire (); inputdevice_copyconfig (&currprefs, &changed_prefs); inputdevice_validate_jports (&changed_prefs, -1); @@ -5567,13 +5661,13 @@ void inputdevice_devicechange (struct uae_prefs *prefs) for (i = 0; i < MAX_JPORTS; i++) { freejport (prefs, i); if (jportid[i] == JPORT_CUSTOM) { - inputdevice_joyport_config (prefs, _T("custom"), i, jportsmode[i], 0); + inputdevice_joyport_config (prefs, _T("custom"), i, jportsmode[i], 0, true); } else if (jports[i]) { - inputdevice_joyport_config (prefs, jports[i], i, jportsmode[i], 2); + inputdevice_joyport_config (prefs, jports[i], i, jportsmode[i], 2, true); } else if (jportskb[i] >= 0) { TCHAR tmp[10]; _stprintf (tmp, _T("kbd%d"), jportskb[i]); - inputdevice_joyport_config (prefs, tmp, i, jportsmode[i], 0); + inputdevice_joyport_config (prefs, tmp, i, jportsmode[i], 0, true); } prefs->jports[i].autofire = jportaf[i]; xfree (jports[i]); @@ -7098,6 +7192,10 @@ static void fixjport (struct jport *port, int add) vv = 0; vv += JSEM_KBDLAYOUT; } +#if 0 + if (port->id != vv) + write_log(_T("fixjport %d %d %d\n"), port->id, vv, add); +#endif port->id = vv; } @@ -7116,8 +7214,10 @@ void inputdevice_validate_jports (struct uae_prefs *p, int changedport) continue; if (p->jports[i].id == p->jports[j].id) { if (i == changedport) { + //write_log(_T("inputdevice_validate_jports restore i %d %d\n"), i, j); restore_inputdevice_config (p, j); } else if (j == changedport) { + //write_log(_T("inputdevice_validate_jports restore j %d %d\n"), i, j); restore_inputdevice_config (p, i); } int cnt = 0; @@ -7140,7 +7240,7 @@ void inputdevice_validate_jports (struct uae_prefs *p, int changedport) } } -static void inputdevice_inserted (struct uae_prefs *p, int portnum, int id, int mode, int type) +static void inputdevice_inserted (struct uae_prefs *p, int portnum, int id, int type) { for (int k = 0; k < MAX_JPORTS; k++) { if (p->jports[k].id == id && k != portnum) { @@ -7169,7 +7269,7 @@ void restore_inputdevice_config (struct uae_prefs *p, int portnum) memcpy (&p->jports[portnum], &stored_ports[portnum], sizeof (struct jport)); } -int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type) +int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type, bool validate) { switch (type) { @@ -7189,7 +7289,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por for (i = 0; i < idf->get_num (); i++) { TCHAR *name2 = idf->get_uniquename (i); if (name2 && !_tcscmp (name2, value)) { - inputdevice_inserted (p, portnum, idnum + i, mode, type); + if (validate) + inputdevice_inserted (p, portnum, idnum + i, type); p->jports[portnum].id = idnum + i; if (mode >= 0) p->jports[portnum].mode = mode; @@ -7200,7 +7301,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por for (i = 0; i < idf->get_num (); i++) { TCHAR *name1 = idf->get_friendlyname (i); if (name1 && !_tcscmp (name1, value)) { - inputdevice_inserted (p, portnum, idnum + i, mode, type); + if (validate) + inputdevice_inserted (p, portnum, idnum + i, type); p->jports[portnum].id = idnum + i; if (mode >= 0) p->jports[portnum].mode = mode; @@ -7254,7 +7356,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por } } if (got == 2) { - inputdevice_inserted (p, portnum, start, mode, type); + if (validate) + inputdevice_inserted (p, portnum, start, type); p->jports[portnum].id = start; if (mode >= 0) p->jports[portnum].mode = mode; diff --git a/newcpu.cpp b/newcpu.cpp index 4cd7485a..3d88104b 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -61,6 +61,7 @@ int mmu_enabled, mmu_triggered; int cpu_cycles; static int baseclock; bool m68k_pc_indirect; +static int cpu_prefs_changed_flag; int cpucycleunit; int cpu_tracer; @@ -1315,16 +1316,16 @@ static int check_prefs_changed_cpu2(void) || currprefs.fpu_no_unimplemented != changed_prefs.fpu_no_unimplemented || currprefs.cpu_compatible != changed_prefs.cpu_compatible || currprefs.cpu_cycle_exact != changed_prefs.cpu_cycle_exact) { - changed |= 1; + cpu_prefs_changed_flag |= 1; } if (changed || currprefs.m68k_speed != changed_prefs.m68k_speed || currprefs.m68k_speed_throttle != changed_prefs.m68k_speed_throttle || currprefs.cpu_clock_multiplier != changed_prefs.cpu_clock_multiplier || currprefs.cpu_frequency != changed_prefs.cpu_frequency) { - changed |= 2; + cpu_prefs_changed_flag |= 2; } - return changed; + return cpu_prefs_changed_flag; } @@ -4193,6 +4194,7 @@ void m68k_go (int may_quit) set_cpu_tracer (false); + cpu_prefs_changed_flag = 0; in_m68k_go++; for (;;) { void (*run_func)(void); @@ -4297,20 +4299,20 @@ void m68k_go (int may_quit) } if (regs.spcflags & SPCFLAG_MODE_CHANGE) { - int v = check_prefs_changed_cpu2(); - if (v & 1) { + if (cpu_prefs_changed_flag & 1) { uaecptr pc = m68k_getpc(); prefs_changed_cpu(); build_cpufunctbl(); m68k_setpc_normal(pc); fill_prefetch(); } - if (v & 2) { + if (cpu_prefs_changed_flag & 2) { fixup_cpu(&changed_prefs); currprefs.m68k_speed = changed_prefs.m68k_speed; currprefs.m68k_speed_throttle = changed_prefs.m68k_speed_throttle; update_68k_cycles(); } + cpu_prefs_changed_flag = 0; } set_x_funcs(); @@ -5844,7 +5846,7 @@ uae_u32 get_word_ce020_prefetch (int o) regs.db = regs.prefetch020[0] >> 16; } else { v = regs.prefetch020[0] >> 16; - regs.db = regs.prefetch020[0]; + regs.db = regs.prefetch020[1] >> 16; } do_cycles_ce020 (2); return v; diff --git a/od-win32/caps/CapsAPI.h b/od-win32/caps/CapsAPI.h index 796819fa..0d5bc9d6 100644 --- a/od-win32/caps/CapsAPI.h +++ b/od-win32/caps/CapsAPI.h @@ -238,12 +238,13 @@ enum { // recognized image types enum { - citError=0, // error preventing the type identification - citUnknown, // unknown image type - citIPF, // IPF image - citCTRaw, // CT Raw image - citKFStream, // KryoFlux stream files - citDraft // Draft image + citError=0, // error preventing the type identification + citUnknown, // unknown image type + citIPF, // IPF image + citCTRaw, // CT Raw image + citKFStream, // KryoFlux stream files + citKFStreamCue, // KryoFlux stream cue file + citDraft // Draft image }; // image error status diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 3cf881e7..9ce63a48 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -3074,6 +3074,8 @@ static void read_mouse (void) static int get_mouse_flags (int num) { + if (!rawinput_enabled_mouse && !num) + return 1; if (di_mouse[num].rawinput || !rawinput_enabled_mouse) return 0; if (di_mouse[num].catweasel) diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index 31d97685..58c14f62 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -3183,7 +3183,7 @@ void D3D_flushtexture (int miny, int maxy) } } -uae_u8 *D3D_locktexture (int *pitch, bool fullupdate) +uae_u8 *D3D_locktexture (int *pitch, int *height, bool fullupdate) { D3DLOCKED_RECT lock; HRESULT hr; @@ -3219,6 +3219,8 @@ uae_u8 *D3D_locktexture (int *pitch, bool fullupdate) locked = 1; fulllocked = fullupdate; *pitch = lock.Pitch; + if (height) + *height = tin_h; return (uae_u8*)lock.pBits; } diff --git a/od-win32/direct3d.h b/od-win32/direct3d.h index 4646082c..77a5555c 100644 --- a/od-win32/direct3d.h +++ b/od-win32/direct3d.h @@ -7,7 +7,7 @@ extern void D3D_refresh (void); extern bool D3D_renderframe (bool); extern void D3D_showframe (void); extern void D3D_showframe_special (int); -extern uae_u8 *D3D_locktexture(int*, bool); +extern uae_u8 *D3D_locktexture(int*, int*, bool); extern void D3D_unlocktexture(void); extern void D3D_flushtexture (int miny, int maxy); extern void D3D_guimode (bool); diff --git a/od-win32/makeexe.cmd b/od-win32/makeexe.cmd index 18c5df34..0446ccd4 100644 --- a/od-win32/makeexe.cmd +++ b/od-win32/makeexe.cmd @@ -1,6 +1,6 @@ del *.zip copy d:\amiga\winuae.exe c:\projects\winuae\distribution -# "c:\program files (x86)\NSIS\makensis.exe" winuae_install +;# "c:\program files (x86)\NSIS\makensis.exe" winuae_install cd c:\projects\winuae\distribution copy docs\windows\translation.txt d:\amiga zip -9 -r c:\projects\winuae\src\od-win32\winuae.zip * @@ -12,6 +12,6 @@ cdd d:\amiga zip -9 WinUAE%1_translation WinUAE_default.dll translation.txt del translation.txt cdd c:\projects\winuae\src\od-win32 -zip -9 winuaedebug%1 winuae_msvc10\release\winuae.pdb winuae_msvc10\fullrelease\winuae.pdb +;zip -9 winuaedebug%1 winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb copy winuaedebug%1.zip d:\amiga\winuaepackets del *.zip diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index cdb18826..fa5c7d77 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -381,6 +381,17 @@ #define IDD_DISKINFO 390 #define IDS_SELECTTAPE 391 #define IDS_TAPE 392 +#define IDS_SCREEN_NATIVE 392 +#define IDS_STRING393 393 +#define IDS_SCREEN_RTG 393 +#define IDS_DISPLAYMODE_NATIVE 394 +#define IDS_CURRENT_CONFIGURATION 395 +#define IDS_SELECT_MENU 396 +#define IDS_SCSI_EMULATION 397 +#define IDS_SLIRP 398 +#define IDS_SLIRP_INBOUND 399 +#define IDS_FILTER_PAL_EXTRA 400 +#define IDS_FILTER_3D_EXTRA 401 #define IDS_QS_MODELS 1000 #define IDS_QS_MODEL_A500 1001 #define IDS_QS_MODEL_A500P 1002 @@ -1224,7 +1235,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 391 +#define _APS_NEXT_RESOURCE_VALUE 398 #define _APS_NEXT_COMMAND_VALUE 40050 #define _APS_NEXT_CONTROL_VALUE 1840 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index ae9cf77a..12ece70f 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -131,9 +131,12 @@ BEGIN RTEXT "RTG:",IDC_STATIC,8,115,49,15,SS_CENTERIMAGE COMBOBOX IDC_SCREENMODE_RTG,61,118,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_SCREENMODE_RTG2,142,118,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10 - CONTROL "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10 - CONTROL "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10 + CONTROL "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK, + "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10 + CONTROL "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10 + CONTROL "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10 RTEXT "Resolution:",IDC_STATIC,24,170,110,8,SS_CENTERIMAGE COMBOBOX IDC_LORES,142,169,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "Resolution autoswitch:",IDC_STATIC,92,190,110,8,SS_CENTERIMAGE @@ -1193,8 +1196,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,8,0,0 - PRODUCTVERSION 2,8,0,0 + FILEVERSION 2,8,1,0 + PRODUCTVERSION 2,8,1,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -1210,12 +1213,12 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "WinUAE" - VALUE "FileVersion", "2.8.0.0" + VALUE "FileVersion", "2.8.1.0" VALUE "InternalName", "WinUAE" - VALUE "LegalCopyright", "© 1996-2013 under the GNU Public License (GPL)" + VALUE "LegalCopyright", "© 1996-2014 under the GNU Public License (GPL)" VALUE "OriginalFilename", "WinUAE.exe" VALUE "ProductName", "WinUAE" - VALUE "ProductVersion", "2.8.0.0" + VALUE "ProductVersion", "2.8.1.0" END END BLOCK "VarFileInfo" @@ -1891,10 +1894,24 @@ BEGIN IDS_WSTYLE_EXTENDED "Extended" IDS_MISCLISTITEMS1 "Untrap = middle button\nShow GUI on startup\nUse CTRL-F11 to quit\nDon't show taskbar button\nDon't show notification icon\n" IDS_MISCLISTITEMS2 "Always on top\nDisable screensaver\nSynchronize clock\nFaster RTG\nClipboard sharing\nAllow native code\n" - IDS_MISCLISTITEMS3 "Native on-screen display\nRTG on-screen display\nCreate winuaelog.txt log\nLog illegal memory accesses\nBlank unused displays\nStart mouse uncaptured\nStart minimized\nMinimize when focus is lost\n" + IDS_MISCLISTITEMS3 "Native on-screen display\nRTG on-screen display\nCreate winuaelog.txt log\nLog illegal memory accesses\nBlank unused displays\nStart mouse uncaptured\nStart minimized\nMinimize when focus is lost\n100/120Hz VSync black frame insertion\nMaster floppy write protection\nHide all UAE autoconfig boards\n" IDS_JOYMODE_WHEELMOUSE "Wheel Mouse" IDS_NUMSG_KS68030PLUS "The selected system ROM requires a 68030 or higher CPU." IDS_SELECTTAPE "Select a Tape directory or archive file..." + IDS_SCREEN_NATIVE "Native" + IDS_SCREEN_RTG "RTG" + IDS_DISPLAYMODE_NATIVE "Native" + IDS_CURRENT_CONFIGURATION "Current Configuration" + IDS_SELECT_MENU "Select" + IDS_SCSI_EMULATION "SCSI Emulation *" + IDS_SLIRP "SLIRP User Mode NAT" + IDS_SLIRP_INBOUND "SLIRP + Open ports (21-23,80)" +END + +STRINGTABLE +BEGIN + IDS_FILTER_PAL_EXTRA "Brightness\nContrast\nSaturation\nGamma\nScanlines\nBlurriness\nNoise\n" + IDS_FILTER_3D_EXTRA "Point/Bilinear\nScanline opacity\nScanline level\n" END #endif // English resources diff --git a/od-win32/resources/winuae_minimal.rc b/od-win32/resources/winuae_minimal.rc index 03c15ac9..d8d3a5f2 100644 --- a/od-win32/resources/winuae_minimal.rc +++ b/od-win32/resources/winuae_minimal.rc @@ -76,7 +76,7 @@ END // Dialog // -IDD_KICKSTART DIALOGEX 0, 0, 396, 217 +IDD_KICKSTART DIALOGEX 0, 0, 396, 243 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD EXSTYLE WS_EX_CONTEXTHELP FONT 8, "MS Sans Serif", 0, 0, 0x1 @@ -92,7 +92,7 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,87,77,104,12 CONTROL "ShapeShifter support [] Patches the system ROM for ShapeShifter compatibility.",IDC_KICKSHIFTER, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,77,106,13 - GROUPBOX "Miscellaneous",IDC_STATIC,1,98,394,116 + GROUPBOX "Miscellaneous",IDC_STATIC,1,98,394,143 LTEXT "Cartridge ROM file:",IDC_FLASHTEXT2,12,112,265,10 COMBOBOX IDC_CARTFILE,12,125,361,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "...",IDC_CARTCHOOSER,376,124,10,15 @@ -102,9 +102,15 @@ BEGIN LTEXT "Real Time Clock file",IDC_STATIC,12,174,313,15,SS_CENTERIMAGE EDITTEXT IDC_RTCFILE,12,191,361,12,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_RTCCHOOSER,376,189,10,15 + COMBOBOX IDC_A2091ROMFILE,12,222,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_A2091ROMCHOOSER,187,221,10,15 + LTEXT "A590/A2091 SCSI ROM file:",IDC_STATIC,12,207,170,15,SS_CENTERIMAGE + LTEXT "A4091 SCSI ROM file:",IDC_STATIC,203,207,170,15,SS_CENTERIMAGE + COMBOBOX IDC_A4091ROMFILE,202,222,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_A4091ROMCHOOSER,376,221,10,15 END -IDD_DISPLAY DIALOGEX 0, 0, 396, 279 +IDD_DISPLAY DIALOGEX 0, 0, 396, 298 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN @@ -118,42 +124,47 @@ BEGIN EDITTEXT IDC_XSIZE,59,56,56,12,ES_NUMBER EDITTEXT IDC_YSIZE,122,56,56,12,ES_NUMBER COMBOBOX IDC_DISPLAY_BUFFERCNT,266,56,119,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Settings",IDC_SETTINGSTEXT,1,86,283,144 + GROUPBOX "Settings",IDC_SETTINGSTEXT,1,86,283,163 RTEXT "Native:",IDC_STATIC,9,98,48,15,SS_CENTERIMAGE COMBOBOX IDC_SCREENMODE_NATIVE,61,98,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_SCREENMODE_NATIVE2,142,98,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "RTG:",IDC_STATIC,8,115,49,15,SS_CENTERIMAGE COMBOBOX IDC_SCREENMODE_RTG,61,118,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_SCREENMODE_RTG2,142,118,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Blacker than black",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,142,10 - CONTROL "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,140,116,10 - CONTROL "Remove interlace artifacts",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,142,10 - CONTROL "Resolution autoswitch",IDC_AUTORESOLUTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,154,116,10 - RTEXT "Resolution:",IDC_STATIC,27,170,110,8,SS_CENTERIMAGE + CONTROL "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10 + CONTROL "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10 + CONTROL "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10 + RTEXT "Resolution:",IDC_STATIC,24,170,110,8,SS_CENTERIMAGE COMBOBOX IDC_LORES,142,169,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - RTEXT "Refresh:",IDC_REFRESHTEXT,11,190,57,8 - CONTROL "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,185,99,20 - COMBOBOX IDC_RATE2BOX,181,190,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - RTEXT "FPS adj.:",IDC_REFRESH2TEXT,9,211,61,8 - CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,206,99,20 - EDITTEXT IDC_RATE2TEXT,181,210,46,12,ES_AUTOHSCROLL - CONTROL "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,211,8,10 + RTEXT "Resolution autoswitch:",IDC_STATIC,92,190,110,8,SS_CENTERIMAGE + COMBOBOX IDC_AUTORESOLUTIONSELECT,210,189,59,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + RTEXT "Refresh:",IDC_REFRESHTEXT,11,209,57,8 + CONTROL "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,204,99,20 + COMBOBOX IDC_RATE2BOX,210,209,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + RTEXT "FPS adj.:",IDC_REFRESH2TEXT,9,230,61,8 + CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,225,99,20 + EDITTEXT IDC_RATE2TEXT,210,229,46,12,ES_AUTOHSCROLL + CONTROL "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,230,8,10 + COMBOBOX IDC_DA_MODE,15,260,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,96,256,96,20 + EDITTEXT IDC_DA_TEXT,205,260,56,12,ES_AUTOHSCROLL | ES_READONLY + PUSHBUTTON "Reset to defaults",IDC_DA_RESET,156,278,106,14 GROUPBOX "Centering",IDC_STATIC,289,86,105,46 CONTROL "Horizontal",IDC_XCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,100,90,10 CONTROL "Vertical",IDC_YCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,116,90,10 - GROUPBOX "Line mode",IDC_STATIC,290,134,104,63 - CONTROL "Single",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,150,90,10 - CONTROL "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,166,90,10 - CONTROL "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,182,90,10 - GROUPBOX "Interlaced line mode",IDC_STATIC,290,199,104,70 - CONTROL "Single",IDC_LM_INORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,214,90,10 - CONTROL "Double, frames",IDC_LM_IDOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,228,90,10 - CONTROL "Double, fields",IDC_LM_IDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,241,90,10 - CONTROL "Double, fields+",IDC_LM_IDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,254,90,10 - COMBOBOX IDC_DA_MODE,15,245,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,96,241,96,20 - EDITTEXT IDC_DA_TEXT,205,245,56,12,ES_AUTOHSCROLL | ES_READONLY - PUSHBUTTON "Reset to defaults",IDC_DA_RESET,156,263,106,14 + GROUPBOX "Line mode",IDC_STATIC,290,134,104,81 + CONTROL "Single",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,148,90,10 + CONTROL "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,161,90,10 + CONTROL "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,174,90,10 + CONTROL "Double, fields",IDC_LM_PDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,187,90,10 + CONTROL "Double, fields+",IDC_LM_PDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,200,90,10 + GROUPBOX "Interlaced line mode",IDC_STATIC,290,222,104,70 + CONTROL "Single",IDC_LM_INORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,238,90,10 + CONTROL "Double, frames",IDC_LM_IDOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,251,90,10 + CONTROL "Double, fields",IDC_LM_IDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,264,90,10 + CONTROL "Double, fields+",IDC_LM_IDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,277,90,10 + CONTROL "VGA mode resolution autoswitch [] Automatically selects between hires and superhires in programmed display modes, keeping correct aspect ratio.",IDC_AUTORESOLUTIONVGA, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,154,124,10 END IDD_MEMORY DIALOGEX 0, 0, 396, 206 @@ -206,6 +217,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,128,120,11 CONTROL "MMU [] 68030, 68040 and 68060 MMU emulation. Not compatible with JIT.",IDC_MMUENABLE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,142,120,11 + CONTROL "Unimplemented CPU emu [] Emulate 68060 unimplemented integer instructions",IDC_CPU_UNIMPLEMENTED, + "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,156,118,10 GROUPBOX "CPU Emulation Speed",IDC_STATIC,136,3,258,111 CONTROL "Fastest possible",IDC_CS_HOST,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,143,24,195,10 CONTROL "Approximate A500/A1200 or cycle-exact",IDC_CS_68000, @@ -226,6 +239,8 @@ BEGIN CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,236,93,10 CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU, "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,252,117,10 + CONTROL "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED, + "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,265,116,10 GROUPBOX "Advanced JIT Settings",IDC_STATIC,136,181,258,99 RTEXT "Cache size:",IDC_STATIC,143,200,66,10,SS_CENTERIMAGE CONTROL "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,212,194,115,20 @@ -236,10 +251,6 @@ BEGIN CONTROL "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,227,68,11 CONTROL "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,315,227,72,10 CONTROL "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,315,241,72,10 - CONTROL "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED, - "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,265,116,10 - CONTROL "Unimplemented CPU emu [] Emulate 68060 unimplemented integer instructions",IDC_CPU_UNIMPLEMENTED, - "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,156,118,10 END IDD_FLOPPY DIALOGEX 0, 0, 396, 261 @@ -252,6 +263,7 @@ BEGIN COMBOBOX IDC_DF0TYPE,152,14,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Write-protected",IDC_STATIC,221,17,74,10,SS_CENTERIMAGE CONTROL "",IDC_DF0WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,13,10,15 + PUSHBUTTON "?",IDC_INFO0,323,12,17,15 PUSHBUTTON "Eject",IDC_EJECT0,345,12,30,15 PUSHBUTTON "...",IDC_DF0,379,12,10,15 COMBOBOX IDC_DF0TEXT,6,31,384,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP @@ -260,6 +272,7 @@ BEGIN COMBOBOX IDC_DF1TYPE,152,51,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Write-protected",IDC_STATIC,221,53,74,10,SS_CENTERIMAGE CONTROL "",IDC_DF1WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,50,10,15 + PUSHBUTTON "?",IDC_INFO1,323,49,17,15 PUSHBUTTON "Eject",IDC_EJECT1,345,49,30,15 PUSHBUTTON "...",IDC_DF1,379,49,10,15 COMBOBOX IDC_DF1TEXT,6,68,383,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP @@ -268,6 +281,7 @@ BEGIN COMBOBOX IDC_DF2TYPE,152,87,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Write-protected",IDC_STATIC,222,88,73,10,SS_CENTERIMAGE CONTROL "",IDC_DF2WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,86,9,15 + PUSHBUTTON "?",IDC_INFO2,323,85,17,15 PUSHBUTTON "Eject",IDC_EJECT2,345,85,30,15 PUSHBUTTON "...",IDC_DF2,379,85,10,15 COMBOBOX IDC_DF2TEXT,6,104,384,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP @@ -276,6 +290,7 @@ BEGIN COMBOBOX IDC_DF3TYPE,152,123,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Write-protected",IDC_STATIC,222,125,73,10,SS_CENTERIMAGE CONTROL "",IDC_DF3WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,123,9,15 + PUSHBUTTON "?",IDC_INFO3,323,122,17,15 PUSHBUTTON "Eject",IDC_EJECT3,345,121,30,15 PUSHBUTTON "...",IDC_DF3,379,121,10,15 COMBOBOX IDC_DF3TEXT,6,140,383,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP @@ -290,10 +305,6 @@ BEGIN EDITTEXT IDC_CREATE_NAME,130,243,97,13,ES_AUTOHSCROLL CONTROL "Bootblock",IDC_FLOPPY_BOOTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,235,242,59,15 CONTROL "FFS",IDC_FLOPPY_FFS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,242,34,15 - PUSHBUTTON "?",IDC_INFO0,323,12,17,15 - PUSHBUTTON "?",IDC_INFO1,323,49,17,15 - PUSHBUTTON "?",IDC_INFO2,323,85,17,15 - PUSHBUTTON "?",IDC_INFO3,323,122,17,15 END IDD_HARDDISK DIALOGEX 0, 0, 396, 315 @@ -305,6 +316,8 @@ BEGIN PUSHBUTTON "Add &Directory or Archive...",IDC_NEW_FS,1,157,128,15 PUSHBUTTON "Add &Hardfile...",IDC_NEW_HF,135,157,126,15 PUSHBUTTON "Add Ha&rd Drive...",IDC_NEW_HD,267,157,127,15 + PUSHBUTTON "Add SCSI/IDE CD Drive",IDC_NEW_CD,1,176,128,15 + PUSHBUTTON "Add SCSI Tape Drive",IDC_NEW_TAPE,135,176,126,15 PUSHBUTTON "&Properties",IDC_EDIT,267,176,60,15 PUSHBUTTON "Remove",IDC_REMOVE,334,176,60,15 GROUPBOX "Options",IDC_STATIC,1,191,393,72 @@ -325,8 +338,6 @@ BEGIN COMBOBOX IDC_CD_TYPE,282,279,71,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Eject",IDC_CD_EJECT,360,278,30,15 COMBOBOX IDC_CD_TEXT,5,297,386,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Add SCSI/IDE CD Drive",IDC_NEW_CD,1,176,128,15 - PUSHBUTTON "Add SCSI Tape Drive",IDC_NEW_TAPE,135,176,126,15 END IDD_SOUND DIALOGEX 0, 0, 396, 288 @@ -340,8 +351,12 @@ BEGIN CONTROL "Enabled",IDC_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,71,108,10 CONTROL "Automatic switching",IDC_SOUND_AUTO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,13,89,108,10 GROUPBOX "Volume",IDC_STATIC,139,19,255,69 + RTEXT "Paula Audio",IDC_STATIC,152,38,51,10,SS_CENTERIMAGE CONTROL "",IDC_SOUNDVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,32,105,20 EDITTEXT IDC_SOUNDVOLUME2,329,35,48,12,ES_CENTER | ES_READONLY + RTEXT "CD Audio",IDC_STATIC,152,67,51,10,SS_CENTERIMAGE + CONTROL "",IDC_SOUNDVOLUMECD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,61,105,20 + EDITTEXT IDC_SOUNDVOLUMECD2,329,64,48,12,ES_CENTER | ES_READONLY GROUPBOX "Sound Buffer Size",IDC_STATIC,140,90,254,42 CONTROL "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,106,105,20 EDITTEXT IDC_SOUNDBUFFERMEM,329,109,48,12,ES_CENTER | ES_READONLY @@ -370,10 +385,6 @@ BEGIN CONTROL "WASAPI",IDC_SOUND_WASAPI,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,240,98,10 CONTROL "OpenAL",IDC_SOUND_OPENAL,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,253,98,10 CONTROL "PortAudio",IDC_SOUND_PORTAUDIO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,266,98,10 - CONTROL "",IDC_SOUNDVOLUMECD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,61,105,20 - EDITTEXT IDC_SOUNDVOLUMECD2,329,64,48,12,ES_CENTER | ES_READONLY - RTEXT "CD Audio",IDC_STATIC,152,67,51,10,SS_CENTERIMAGE - RTEXT "Paula Audio",IDC_STATIC,152,38,51,10,SS_CENTERIMAGE END IDD_LOADSAVE DIALOGEX 0, 0, 396, 318 @@ -424,14 +435,14 @@ BEGIN CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT, "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,181,171,83,12 CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,275,171,108,12 + GROUPBOX "MIDI",IDC_STATIC,1,191,393,54,BS_LEFT RTEXT "Out:",IDC_MIDI,22,202,32,15,SS_CENTERIMAGE COMBOBOX IDC_MIDIOUTLIST,58,204,145,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "In:",IDC_MIDI2,204,201,31,15,SS_CENTERIMAGE COMBOBOX IDC_MIDIINLIST,239,203,145,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,227,170,12 GROUPBOX "Protection Dongle",IDC_STATIC,1,252,393,41,BS_LEFT - GROUPBOX "MIDI",IDC_STATIC,1,191,393,54,BS_LEFT COMBOBOX IDC_DONGLELIST,58,270,232,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,227,170,12 END IDD_GAMEPORTS DIALOGEX 0, 0, 396, 288 @@ -462,9 +473,11 @@ BEGIN CONTROL "Magic Mouse",IDC_PORT_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,235,160,11 RTEXT "Magic Mouse cursor mode:",IDC_STATIC,45,254,138,10,SS_CENTERIMAGE COMBOBOX IDC_PORT_TABLET_CURSOR,195,251,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,48,270,136,11 + CONTROL "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,270,116,11 CONTROL "Full tablet input emulation",IDC_PORT_TABLET_FULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,270,160,11 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,270,106,11 + CONTROL "Tablet.library emulation",IDC_PORT_TABLET_LIBRARY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,271,117,11 END IDD_CONTRIBUTORS DIALOGEX 0, 0, 530, 345 @@ -482,8 +495,8 @@ CAPTION "Configuration error log" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,176,322,65,15 - CONTROL "",IDC_ERRORLOGMESSAGE,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,521,309 PUSHBUTTON "Clear log",IDC_ERRORLOGCLEAR,288,322,65,15 + CONTROL "",IDC_ERRORLOGMESSAGE,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,521,309 END IDD_ABOUT DIALOGEX 0, 0, 345, 258 @@ -559,6 +572,7 @@ BEGIN CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,74,67,10 CONTROL "Bootable",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,74,67,10 CONTROL "Do not mount",IDC_HDF_DONOTMOUNT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,74,67,10 + CONTROL "Global filesystem",IDC_HDF_ADDFSRES,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,298,74,82,10 RTEXT "Boot priority:",IDC_HARDFILE_BOOTPRI_TEXT,26,94,78,10 EDITTEXT IDC_HARDFILE_BOOTPRI,109,90,44,15 RTEXT "Surfaces:",IDC_SURFACES_TEXT,160,94,48,10 @@ -572,6 +586,7 @@ BEGIN RTEXT "Block size:",IDC_BLOCKSIZE_TEXT,261,113,50,10 EDITTEXT IDC_BLOCKSIZE,317,111,40,15,ES_NUMBER EDITTEXT IDC_HDFINFO,5,131,385,12,ES_CENTER | ES_READONLY + EDITTEXT IDC_HDFINFO2,5,147,385,12,ES_CENTER | ES_READONLY GROUPBOX "New hard disk image file",IDC_STATIC,2,171,392,62 PUSHBUTTON "Create",IDC_HF_CREATE,58,187,80,14 COMBOBOX IDC_HF_TYPE,58,211,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP @@ -583,8 +598,6 @@ BEGIN CONTROL "Dynamic HDF",IDC_HF_DYNAMIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,280,208,87,10 PUSHBUTTON "OK",IDOK,147,242,50,14 PUSHBUTTON "Cancel",IDCANCEL,203,242,50,14 - EDITTEXT IDC_HDFINFO2,5,147,385,12,ES_CENTER | ES_READONLY - CONTROL "Global filesystem",IDC_HDF_ADDFSRES,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,298,74,82,10 END IDD_FILESYS DIALOGEX 15, 25, 396, 111 @@ -677,32 +690,30 @@ BEGIN CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,41,68,86,10 CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,133,68,109,10 CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,249,68,116,10 - GROUPBOX "Chipset Features",IDC_STATIC,1,88,393,158 + GROUPBOX "Chipset Features",IDC_STATIC,0,88,393,110 CONTROL "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,102,104,11 CONTROL "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,116,104,11 CONTROL "CDTV CD",IDC_CS_CDTVCD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,105,11 CONTROL "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,143,104,11 CONTROL "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,157,104,11 CONTROL "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,171,104,11 - LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,17,202,247,8,SS_CENTERIMAGE - CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,104,11 - CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,104,11 + CONTROL "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11 CONTROL "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,102,121,11 CONTROL "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,116,121,11 CONTROL "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,129,121,11 CONTROL "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,143,121,11 CONTROL "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,157,121,11 CONTROL "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,171,121,11 - CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,216,121,11 - CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,229,121,11 CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,102,125,11 CONTROL "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,116,125,11 CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,129,125,11 CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,125,11 CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,157,125,11 CONTROL "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,171,125,11 - CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,216,125,11 - CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,229,125,11 + GROUPBOX "Internal SCSI Hardware",IDC_STATIC,0,201,393,45 + CONTROL "A3000 WD33C93 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,216,121,11 + CONTROL "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,229,121,11 + CONTROL "A4000T NCR53C710 SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,216,125,11 GROUPBOX "Chipset Revision",IDC_STATIC,1,249,393,46 CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,261,97,11 CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,275,97,11 @@ -712,7 +723,6 @@ BEGIN CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,275,107,11 EDITTEXT IDC_CS_AGNUSREV,311,260,45,13,ES_AUTOHSCROLL EDITTEXT IDC_CS_DENISEREV,311,275,45,13,ES_AUTOHSCROLL - CONTROL "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11 END IDD_AVIOUTPUT DIALOGEX 0, 0, 396, 260 @@ -777,48 +787,49 @@ BEGIN PUSHBUTTON "Swap 1<>2",IDC_INPUTSWAP,324,303,70,14 END -IDD_FILTER DIALOGEX 0, 0, 396, 288 +IDD_FILTER DIALOGEX 0, 0, 396, 295 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - GROUPBOX "Filter Settings",-1,1,1,393,146 - COMBOBOX IDC_FILTERMODE,9,15,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_FILTERFILTER,215,15,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,283,15,106,14 - COMBOBOX IDC_FILTEROVERLAYTYPE,9,36,118,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_FILTEROVERLAY,134,36,145,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_FILTERAUTOSCALE,284,36,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - RTEXT "Horiz. size:",-1,7,63,81,10,SS_CENTERIMAGE - COMBOBOX IDC_FILTERHZMULT,92,62,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,56,152,19 - EDITTEXT IDC_FILTERHZV,316,58,42,12,ES_CENTER | ES_READONLY - RTEXT "Vert. size:",-1,7,84,81,10,SS_CENTERIMAGE - COMBOBOX IDC_FILTERVZMULT,92,83,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,77,152,19 - EDITTEXT IDC_FILTERVZV,316,79,42,12,ES_CENTER | ES_READONLY - RTEXT "Horiz. position:",-1,5,105,81,10,SS_CENTERIMAGE - CONTROL "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,98,151,19 - EDITTEXT IDC_FILTERHOV,316,100,42,12,ES_CENTER | ES_READONLY - RTEXT "Vert. position:",-1,5,125,81,10,SS_CENTERIMAGE - CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,119,151,19 - EDITTEXT IDC_FILTERVOV,316,121,42,12,ES_CENTER | ES_READONLY - GROUPBOX "Aspect Ratio Correction",-1,1,152,144,89 - COMBOBOX IDC_FILTERASPECT,14,169,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Filter Settings",-1,1,1,393,160 + COMBOBOX IDC_FILTERMODE,9,31,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERSTACK,182,31,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERFILTER,215,31,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,283,31,106,14 + COMBOBOX IDC_FILTEROVERLAYTYPE,9,52,118,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTEROVERLAY,134,52,145,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERAUTOSCALE,284,52,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + RTEXT "Horiz. size:",-1,7,79,81,10,SS_CENTERIMAGE + COMBOBOX IDC_FILTERHZMULT,92,78,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + RTEXT "Vert. size:",-1,7,100,81,10,SS_CENTERIMAGE + COMBOBOX IDC_FILTERVZMULT,92,99,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + RTEXT "Horiz. position:",-1,5,121,81,10,SS_CENTERIMAGE + RTEXT "Vert. position:",-1,5,141,81,10,SS_CENTERIMAGE + CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,72,152,19 + EDITTEXT IDC_FILTERHZV,316,74,42,12,ES_CENTER | ES_READONLY + CONTROL "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,93,152,19 + EDITTEXT IDC_FILTERVZV,316,95,42,12,ES_CENTER | ES_READONLY + CONTROL "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,114,151,19 + EDITTEXT IDC_FILTERHOV,316,116,42,12,ES_CENTER | ES_READONLY + CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,135,151,19 + EDITTEXT IDC_FILTERVOV,316,137,42,12,ES_CENTER | ES_READONLY + GROUPBOX "Aspect Ratio Correction",-1,1,165,144,89 + COMBOBOX IDC_FILTERASPECT,14,182,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CONTROL "Keep autoscale aspect",IDC_FILTERKEEPAUTOSCALEASPECT, - "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,189,126,11 - CONTROL "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,204,126,11 - COMBOBOX IDC_FILTERASPECT2,14,220,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Extra Settings",-1,154,152,240,89 - COMBOBOX IDC_FILTERXTRA,177,172,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_FILTERSLR,327,172,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,195,141,19 - EDITTEXT IDC_FILTERXLV,327,197,41,12,ES_CENTER | ES_READONLY - GROUPBOX "Presets",-1,1,245,393,36 - COMBOBOX IDC_FILTERPRESETS,13,260,183,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Load",IDC_FILTERPRESETLOAD,205,259,55,14 - PUSHBUTTON "Save",IDC_FILTERPRESETSAVE,265,259,55,14 - PUSHBUTTON "Delete",IDC_FILTERPRESETDELETE,325,259,55,14 - COMBOBOX IDC_FILTERSTACK,182,15,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,202,126,11 + CONTROL "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,217,126,11 + COMBOBOX IDC_FILTERASPECT2,14,233,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Extra Settings",-1,154,165,240,89 + COMBOBOX IDC_FILTERXTRA,177,185,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERSLR,327,185,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,208,141,19 + EDITTEXT IDC_FILTERXLV,327,210,41,12,ES_CENTER | ES_READONLY + GROUPBOX "Presets",-1,1,258,393,36 + COMBOBOX IDC_FILTERPRESETS,13,273,183,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Load",IDC_FILTERPRESETLOAD,205,272,55,14 + PUSHBUTTON "Save",IDC_FILTERPRESETSAVE,265,272,55,14 + PUSHBUTTON "Delete",IDC_FILTERPRESETDELETE,325,272,55,14 + COMBOBOX IDC_FILTER_NATIVERTG,284,12,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP END IDD_HARDDRIVE DIALOGEX 0, 0, 396, 109 @@ -828,6 +839,8 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN LTEXT "Hard drive:",IDC_STATIC,7,11,80,10 COMBOBOX IDC_HARDDRIVE,49,9,339,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_HDFINFO,5,29,385,12,ES_CENTER | ES_READONLY + EDITTEXT IDC_HDFINFO2,5,46,385,12,ES_CENTER | ES_READONLY DEFPUSHBUTTON "Create hard disk image file",IDC_HARDDRIVE_IMAGE,49,67,115,14 EDITTEXT IDC_PATH_NAME,183,67,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE RTEXT "HD Controller:",IDC_STATIC,12,90,65,10,SS_CENTERIMAGE @@ -835,8 +848,6 @@ BEGIN CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,90,60,10 DEFPUSHBUTTON "Add hard drive",IDOK,236,87,73,14 PUSHBUTTON "Cancel",IDCANCEL,316,87,73,14 - EDITTEXT IDC_HDFINFO,5,29,385,12,ES_CENTER | ES_READONLY - EDITTEXT IDC_HDFINFO2,5,46,385,12,ES_CENTER | ES_READONLY END IDD_MISC2 DIALOGEX 0, 0, 396, 263 @@ -887,10 +898,10 @@ BEGIN PUSHBUTTON "Reset",IDC_RESETAMIGA,3,328,47,14 PUSHBUTTON "Quit",IDC_QUITEMU,55,328,47,14 PUSHBUTTON "Restart",IDC_RESTARTEMU,107,328,47,14,NOT WS_VISIBLE + PUSHBUTTON "Error log",IDC_ERRORLOG,322,328,47,14,NOT WS_VISIBLE DEFPUSHBUTTON "OK",IDOK,375,328,47,14 PUSHBUTTON "Cancel",IDCANCEL,427,328,47,14 PUSHBUTTON "Help",IDHELP,479,328,47,14,WS_DISABLED - PUSHBUTTON "Error log",IDC_ERRORLOG,322,328,47,14,NOT WS_VISIBLE END IDD_PATHS DIALOGEX 0, 0, 396, 303 @@ -957,20 +968,20 @@ BEGIN PUSHBUTTON "Select image file",IDC_DF0QQ,93,148,98,15 RTEXT "Write-protected",IDC_DF0WPTEXTQ,196,151,69,10,SS_CENTERIMAGE CONTROL "",IDC_DF0WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,270,149,10,15 + PUSHBUTTON "?",IDC_INFO0Q,334,148,19,15 PUSHBUTTON "Eject",IDC_EJECT0Q,358,148,30,15 COMBOBOX IDC_DF0TEXTQ,9,167,379,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "Floppy drive DF1:",IDC_DF1QENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,186,77,15 PUSHBUTTON "Select image file",IDC_DF1QQ,93,186,98,15 RTEXT "Write-protected",IDC_DF1WPTEXTQ,195,189,69,10,SS_CENTERIMAGE + COMBOBOX IDC_CD0Q_TYPE,199,187,74,50,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_DF1WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,270,185,10,15 + PUSHBUTTON "?",IDC_INFO1Q,334,186,19,15 PUSHBUTTON "Eject",IDC_EJECT1Q,358,186,30,15 COMBOBOX IDC_DF1TEXTQ,9,204,379,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Set configuration",IDC_QUICKSTART_SETCONFIG,9,239,88,15,NOT WS_VISIBLE GROUPBOX "Mode",IDC_STATIC,250,231,144,28,BS_LEFT CONTROL "Start in Quickstart mode",IDC_QUICKSTARTMODE,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,259,242,131,12 - COMBOBOX IDC_CD0Q_TYPE,199,187,74,50,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "?",IDC_INFO0Q,334,148,19,15 - PUSHBUTTON "?",IDC_INFO1Q,334,186,19,15 END IDD_FRONTEND DIALOGEX 0, 0, 420, 242 @@ -1048,7 +1059,7 @@ BEGIN CTEXT "Enter address",IDC_DBG_ADDRINPUTTXT,20,1,100,10,SS_CENTERIMAGE | WS_TABSTOP END -IDD_EXPANSION DIALOGEX 0, 0, 396, 278 +IDD_EXPANSION DIALOGEX 0, 0, 396, 289 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN @@ -1063,6 +1074,7 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,67,212,10 CONTROL "Always scale in windowed mode",IDC_RTG_SCALE_ALLOW, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,80,212,10 + CONTROL "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,93,212,10 CONTROL "Hardware vertical blank interrupt",IDC_RTG_VBINTERRUPT, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,106,157,10 CONTROL "Hardware sprite emulation",IDC_RTG_HWSPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,106,148,10 @@ -1078,11 +1090,14 @@ BEGIN COMBOBOX IDC_RTG_BUFFERCNT,153,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CTEXT "Aspect ratio:",IDC_STATIC,282,149,83,10,SS_CENTERIMAGE COMBOBOX IDC_RTG_SCALE_ASPECTRATIO,282,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Miscellaneous Expansions",IDC_STATIC,1,197,172,80 + GROUPBOX "Miscellaneous Expansions",IDC_STATIC,1,197,172,87 CONTROL "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,216,147,11 CONTROL "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,229,147,11 - GROUPBOX "Network",IDC_STATIC,181,197,213,80 + CONTROL "A590/A2091 WD33C93 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,242,147,11 + CONTROL "A4091 NCR53C710 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,255,151,11 + CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,268,147,11 + GROUPBOX "Network",IDC_STATIC,181,197,213,86 CONTROL "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,216,187,11 CONTROL "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2, @@ -1090,7 +1105,6 @@ BEGIN CONTROL "A2065 Z2 [] A2065 Ethernet Zorro II card emulation.",IDC_A2065, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,242,187,11 COMBOBOX IDC_NETDEVICE,202,257,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,93,212,10 END IDD_INPUTMAP DIALOGEX 0, 0, 421, 341 @@ -1102,13 +1116,13 @@ BEGIN CONTROL "",IDC_INPUTMAPLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,1,1,418,257 EDITTEXT IDC_INPUTMAPOUT,1,261,418,14,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED EDITTEXT IDC_INPUTMAPOUTM,1,277,418,29,ES_MULTILINE | ES_READONLY | WS_DISABLED - PUSHBUTTON "Remap",IDC_INPUTMAP_CAPTURE,86,324,80,14 + COMBOBOX IDC_INPUTMAPADD,2,309,345,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Add",IDC_INPUTMAP_CUSTOM,351,308,66,14 + PUSHBUTTON "Test",IDC_INPUTMAP_TEST,2,324,80,14 + PUSHBUTTON "Remap",IDC_INPUTMAP_CAPTURE,86,324,80,14 PUSHBUTTON "Delete",IDC_INPUTMAP_DELETE,170,324,80,14 PUSHBUTTON "Delete all",IDC_INPUTMAP_DELETEALL,254,324,80,14 - PUSHBUTTON "Test",IDC_INPUTMAP_TEST,2,324,80,14 PUSHBUTTON "Exit",IDC_INPUTMAP_EXIT,338,324,80,14 - COMBOBOX IDC_INPUTMAPADD,2,309,345,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP END IDD_INFOBOX DIALOGEX 0, 0, 420, 68 @@ -1151,15 +1165,15 @@ STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | CAPTION "Tape Drive Settings" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "Add Tape Drive",IDOK,201,58,88,14 - PUSHBUTTON "Cancel",IDCANCEL,300,58,87,14 - RTEXT "HD Controller:",IDC_STATIC,35,61,65,10,SS_CENTERIMAGE - COMBOBOX IDC_HDF_CONTROLLER,115,59,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH_NAME,52,15,334,15,ES_AUTOHSCROLL RTEXT "Path:",IDC_STATIC,4,18,43,10,SS_CENTERIMAGE + EDITTEXT IDC_PATH_NAME,52,15,334,15,ES_AUTOHSCROLL PUSHBUTTON "Select Directory",IDC_TAPE_SELECT_DIR,19,36,123,15 PUSHBUTTON "Select Archive or Plain File",IDC_TAPE_SELECT_FILE,160,36,123,15 CONTROL "Read/write",IDC_TAPE_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,313,39,67,10 + RTEXT "HD Controller:",IDC_STATIC,35,61,65,10,SS_CENTERIMAGE + COMBOBOX IDC_HDF_CONTROLLER,115,59,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Add Tape Drive",IDOK,201,58,88,14 + PUSHBUTTON "Cancel",IDCANCEL,300,58,87,14 END IDD_DISKINFO DIALOGEX 0, 0, 491, 323 @@ -1168,8 +1182,8 @@ CAPTION "Disk image information" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,220,303,50,14 - EDITTEXT IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL PUSHBUTTON "Save bootblock",IDC_SAVEBOOTBLOCK,397,303,89,14,NOT WS_VISIBLE + EDITTEXT IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -1179,8 +1193,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,7,0,0 - PRODUCTVERSION 2,7,0,0 + FILEVERSION 2,8,0,0 + PRODUCTVERSION 2,8,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -1196,12 +1210,12 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "WinUAE" - VALUE "FileVersion", "2.7.0.0" + VALUE "FileVersion", "2.8.0.0" VALUE "InternalName", "WinUAE" VALUE "LegalCopyright", "© 1996-2013 under the GNU Public License (GPL)" VALUE "OriginalFilename", "WinUAE.exe" VALUE "ProductName", "WinUAE" - VALUE "ProductVersion", "2.7.0.0" + VALUE "ProductVersion", "2.8.0.0" END END BLOCK "VarFileInfo" @@ -1297,7 +1311,6 @@ BEGIN END END - ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -1308,6 +1321,7 @@ GUIDELINES DESIGNINFO BEGIN IDD_KICKSTART, DIALOG BEGIN + BOTTOMMARGIN, 217 END IDD_DISPLAY, DIALOG @@ -1393,6 +1407,7 @@ BEGIN IDD_FILTER, DIALOG BEGIN + BOTTOMMARGIN, 288 END IDD_HARDDRIVE, DIALOG @@ -1847,6 +1862,7 @@ BEGIN IDS_INPUTQUALIFIER "Qualifiers" IDS_GENERIC "Generic" IDS_AUTODETECT "Autodetect" + IDS_OFF "off" END STRINGTABLE diff --git a/od-win32/rp.cpp b/od-win32/rp.cpp index 45adeab6..9ce8fc21 100644 --- a/od-win32/rp.cpp +++ b/od-win32/rp.cpp @@ -377,7 +377,7 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC inputdevice_compa_clear (&changed_prefs, inputmap_port); if (_tcslen (name) == 0) { - inputdevice_joyport_config (&changed_prefs, _T("none"), inputmap_port, 0, 0); + inputdevice_joyport_config (&changed_prefs, _T("none"), inputmap_port, 0, 0, true); return TRUE; } devicetype2 = -1; @@ -399,10 +399,10 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC _stprintf (tmp2, _T("KeyboardLayout%d"), i); if (!_tcscmp (tmp2, name)) { _stprintf (tmp2, _T("kbd%d"), i + 1); - return inputdevice_joyport_config (&changed_prefs, tmp2, inputmap_port, devicetype2, 0); + return inputdevice_joyport_config (&changed_prefs, tmp2, inputmap_port, devicetype2, 0, true); } } - return inputdevice_joyport_config (&changed_prefs, name, inputmap_port, devicetype2, 1); + return inputdevice_joyport_config (&changed_prefs, name, inputmap_port, devicetype2, 1, true); } static int cd_insert (int num, const TCHAR *name) diff --git a/od-win32/srcrelease.cmd b/od-win32/srcrelease.cmd index 240ac41f..37722c29 100644 --- a/od-win32/srcrelease.cmd +++ b/od-win32/srcrelease.cmd @@ -197,7 +197,7 @@ zip -9 -r winuaesrc * copy winuaesrc.zip d:\amiga\winuaepackets\winuaesrc%1.zip move winuaesrc.zip d:\amiga cd c:\projects\winuae\src\od-win32 -zip -9 winuaedebug%1 winuae_msvc10\fullrelease\winuae.pdb winuae_msvc10\x64\fullrelease\winuae.pdb +zip -9 winuaedebug%1 winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb move winuaedebug%1.zip d:\amiga\winuaepackets\debug\ -copy winuae_msvc10\fullrelease\winuae.pdb d:\amiga\dump +copy winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb d:\amiga\dump copy d:\amiga\winuae.exe d:\amiga\dump diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index dd80f9b0..9c734856 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -2522,7 +2522,7 @@ void logging_init (void) SystemInfo.wProcessorArchitecture, SystemInfo.wProcessorLevel, SystemInfo.wProcessorRevision, SystemInfo.dwNumberOfProcessors, filedate); write_log (_T("\n(c) 1995-2001 Bernd Schmidt - Core UAE concept and implementation.") - _T("\n(c) 1998-2013 Toni Wilen - Win32 port, core code updates.") + _T("\n(c) 1998-2014 Toni Wilen - Win32 port, core code updates.") _T("\n(c) 1996-2001 Brian King - Win32 port, Picasso96 RTG, and GUI.") _T("\n(c) 1996-1999 Mathias Ortmann - Win32 port and bsdsocket support.") _T("\n(c) 2000-2001 Bernd Meyer - JIT engine.") diff --git a/od-win32/win32.h b/od-win32/win32.h index 86c2b132..a0db59d6 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -15,15 +15,15 @@ #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100) #define GETBDD(x) ((x) % 100) -#define WINUAEPUBLICBETA 0 +#define WINUAEPUBLICBETA 1 #define LANG_DLL 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("0") +#define WINUAEBETA _T("1") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2014, 5, 5) +#define WINUAEDATE MAKEBD(2014, 5, 14) #define WINUAEEXTRA _T("") //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32_scaler.cpp b/od-win32/win32_scaler.cpp index ea92e195..fa1f89e8 100644 --- a/od-win32/win32_scaler.cpp +++ b/od-win32/win32_scaler.cpp @@ -844,7 +844,7 @@ void S2X_render (void) int ok = 0; RECT sr, dr, zr; DDSURFACEDESC2 desc; - int pitch; + int pitch, surf_height; uae_u8 *surfstart; aw = amiga_width; @@ -862,7 +862,7 @@ void S2X_render (void) bufmem_ptr = sptr; if (d3d) { - surfstart = D3D_locktexture (&pitch, true); + surfstart = D3D_locktexture (&pitch, &surf_height, true); if (surfstart == NULL) return; } else { @@ -876,9 +876,10 @@ void S2X_render (void) return; pitch = desc.lPitch; surfstart = (uae_u8*)desc.lpSurface; + surf_height = desc.dwHeight; } dptr = surfstart; - enddptr = dptr + pitch * temp_height; + enddptr = dptr + pitch * surf_height; if (!d3d) { dptr = getfilterrect1 (&sr, &dr, dst_width, dst_height, dst_depth, aw, ah, scale, temp_width, temp_height, dptr, pitch); } @@ -1003,8 +1004,9 @@ void S2X_render (void) if (amiga_depth == dst_depth) { int y; - for (y = 0; y < ah; y++) { - memcpy (dptr, sptr, aw * dst_depth / 8); + int w = aw * dst_depth / 8; + for (y = 0; y < ah && dptr + w <= enddptr; y++) { + memcpy (dptr, sptr, w); sptr += vb->rowbytes; dptr += pitch; } diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 1e032007..09f31509 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1120,7 +1120,7 @@ int lockscr (struct vidbuffer *vb, bool fullupdate) ret = 1; } else { ret = 0; - vb->bufmem = D3D_locktexture (&vb->rowbytes, fullupdate); + vb->bufmem = D3D_locktexture (&vb->rowbytes, NULL, fullupdate); if (vb->bufmem) { init_row_map (); ret = 1; @@ -1301,7 +1301,7 @@ static uae_u8 *gfx_lock_picasso2 (bool fullupdate) { if (currprefs.gfx_api) { int pitch; - uae_u8 *p = D3D_locktexture (&pitch, fullupdate); + uae_u8 *p = D3D_locktexture (&pitch, NULL, fullupdate); picasso_vidinfo.rowbytes = pitch; return p; } else { diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 0709571e..fffaf7e2 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -5210,7 +5210,8 @@ static INT_PTR CALLBACK PathsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_RESETCONTENT, 0, 0); SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("winuaebootlog.txt")); SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("winuaelog.txt")); - SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("Current configuration")); + WIN32GUI_LoadUIString (IDS_CURRENT_CONFIGURATION, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)tmp); SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_SETCURSEL, 0, 0); CheckDlgButton (hDlg, IDC_LOGENABLE, winuaelog_temporary_enable || (full_property_sheet == 0 && currprefs.win32_logfile)); ew (hDlg, IDC_LOGENABLE, winuaelog_temporary_enable == false && full_property_sheet); @@ -6472,7 +6473,7 @@ static void values_to_displaydlg (HWND hDlg) static void init_resolution_combo (HWND hDlg) { int i, idx; - TCHAR tmp[64]; + TCHAR tmp[MAX_DPATH]; struct MultiDisplay *md = getdisplay (&workprefs); idx = -1; @@ -6486,7 +6487,8 @@ static void init_resolution_combo (HWND hDlg) idx = md->DisplayModes[i].residx; } } - SendDlgItemMessage(hDlg, IDC_RESOLUTION, CB_ADDSTRING, 0, (LPARAM)_T("Native")); + WIN32GUI_LoadUIString (IDS_DISPLAYMODE_NATIVE, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage(hDlg, IDC_RESOLUTION, CB_ADDSTRING, 0, (LPARAM)tmp); } static void init_displays_combo (HWND hDlg, bool rtg) @@ -7709,6 +7711,18 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP if (!enumerated) { ethernet_enumerate (ndd, NULL); + for (int i = 0; ndd[i]; i++) { + struct netdriverdata *n = ndd[i]; + if (!n->active) + continue; + if (n->type == UAENET_SLIRP) { + WIN32GUI_LoadUIString (IDS_SLIRP, tmp, sizeof tmp / sizeof (TCHAR)); + n->desc = my_strdup(tmp); + } else if (n->type == UAENET_SLIRP_INBOUND) { + WIN32GUI_LoadUIString (IDS_SLIRP_INBOUND, tmp, sizeof tmp / sizeof (TCHAR)); + n->desc = my_strdup(tmp); + } + } enumerated = 1; } expansion_net (hDlg); @@ -8391,8 +8405,11 @@ static void misc_addpri (HWND hDlg, int v, int pri) static void misc_scsi (HWND hDlg) { + TCHAR tmp[MAX_DPATH]; + SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_RESETCONTENT, 0, 0); - SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SCSI Emulation *")); + WIN32GUI_LoadUIString (IDS_SCSI_EMULATION, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)tmp); SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SPTI")); SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SPTI + SCSI SCAN")); SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_SETCURSEL, workprefs.win32_uaescsimode, 0); @@ -8426,7 +8443,8 @@ static void misc_lang (HWND hDlg) SendDlgItemMessage (hDlg, IDC_LANGUAGE, CB_SETCURSEL, idx, 0); SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_RESETCONTENT, 0, 0); - SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("Select")); + WIN32GUI_LoadUIString (IDS_SELECT_MENU, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)tmp); SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("140%")); SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("130%")); SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("120%")); @@ -14810,13 +14828,38 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM { static int recursive; LRESULT item; - TCHAR tmp[100]; + TCHAR tmp[MAX_DPATH]; int i; static int filteroverlaypos = -1; + static bool firstinit; switch (msg) { case WM_INITDIALOG: + if (!firstinit) { + WIN32GUI_LoadUIString (IDS_FILTER_PAL_EXTRA, tmp, sizeof tmp / sizeof (TCHAR)); + TCHAR *p1 = tmp; + for (i = 0; filter_pal_extra[i].label; i++) { + TCHAR *p2 = _tcschr (p1, '\n'); + if (!p2 || *p2 == 0) + break; + *p2++ = 0; + filter_pal_extra[i].label = my_strdup(p1); + p1 = p2; + } + WIN32GUI_LoadUIString (IDS_FILTER_3D_EXTRA, tmp, sizeof tmp / sizeof (TCHAR)); + p1 = tmp; + for (i = 0; filter_3d_extra[i].label; i++) { + TCHAR *p2 = _tcschr (p1, '\n'); + if (!p2 || *p2 == 0) + break; + *p2++ = 0; + filter_3d_extra[i].label = my_strdup(p1); + p1 = p2; + } + firstinit = true; + } + pages[HW3D_ID] = hDlg; currentpage = HW3D_ID; SendDlgItemMessage (hDlg, IDC_FILTERASPECT, CB_RESETCONTENT, 0, 0); @@ -14833,8 +14876,10 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM SendDlgItemMessage (hDlg, IDC_FILTERASPECT2, CB_ADDSTRING, 0, (LPARAM)_T("TV")); SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_RESETCONTENT, 0, 0L); - SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)_T("Native")); - SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)_T("RTG")); + WIN32GUI_LoadUIString (IDS_SCREEN_NATIVE, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)tmp); + WIN32GUI_LoadUIString (IDS_SCREEN_RTG, tmp, sizeof tmp / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)tmp); SendDlgItemMessage (hDlg, IDC_FILTERHZMULT, CB_RESETCONTENT, 0, 0L); SendDlgItemMessage (hDlg, IDC_FILTERVZMULT, CB_RESETCONTENT, 0, 0L); diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 19164b2f..f3bbaa15 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -11,6 +11,33 @@ - restore only single input target to default. +Beta 1: + +- Audio DMA CPU wait hack (that tries to prevent missing samples if program has CPU timed audio DMA wait) + improved, now compatible with programs that really need delay after DMA switch off (for example switches + DMA off, then clears interrupt request, and then finally waits for audio interrupt). +- CPU on the fly mode changes were unreliable (2.8.0b15) +- Fixed some GUI strings that didn't support translation. +- .ccd CD images didn't automatically load from archive if file was not in archive root. +- Disk insert after emulation has been started may have internally set disk as write protected even + if disk image is write enabled. (broken since GUI "?" button was added) +- Added DMA channel support to memwatch points. Add DMA channel name (or more than one) at the end of + debugger w command line, for example COP, BLT (or BLTA if you only want A channel reads) and so on.. + No parameter = CPU accesses only. +- Null filter didn't check display bounds, fixes possible DirectDraw mode crash when display size changes. +- Directory filesystem ACTION SET FILE SIZE will now fail if target file size is >= 2G. (Prevents accidental + truncation if program does not support large files) +- Added directory filesystem MorphOS compatible 64-bit file size packets: ACTION_SEEK64, ACTION_SET_FILE_SIZE64, + ACTION_LOCK_RECORD64, ACTION_FREE_RECORD64, ACTION_EXAMINE_OBJECT64, ACTION_EXAMINE_NEXT64, ACTION_EXAMINE_FH64 and + ACTION_EXAMINE_ALL ED_SIZE64. (OS4 packets were implemented long time ago) +- AGA and reading non-existing or write-only custom registers work differently than on A500, don't use new more + A500 compatible method added in 2.8.0 with AGA configurations. (This is far from accurate) +- Mouse device autoswitching was unreliable if rawinput was not supported or was disabled. +- If Quickstart mode and sound filter is set to A500 or A1200 emulated or always on: automatically match it with + selected config. +- DMA debugger now shows CPU and DMA 32-bit chip ram accesses, previously data was truncated to 16-bits. 64-bit + DMA is stil truncated to 32-bit. + 2.8.0 - Lowered floppy drive step limit again a bit more, fixes Elektrica / Cascade. diff --git a/od-win32/wix/Product.wxs b/od-win32/wix/Product.wxs index 9144fe22..4ec290af 100644 --- a/od-win32/wix/Product.wxs +++ b/od-win32/wix/Product.wxs @@ -1,6 +1,6 @@ - + -- 2.47.3