From 3649b6782b23d8b8261ba1311c2aed9acf54ce13 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Tue, 3 Aug 2010 18:50:09 +0300 Subject: [PATCH] 2300b9 --- akiko.cpp | 32 +++- audio.cpp | 6 +- blkdev.cpp | 115 ++++++++---- cfgfile.cpp | 197 +++++++++----------- consolehook.cpp | 2 +- custom.cpp | 6 +- debug.cpp | 2 +- disk.cpp | 104 +++++------ drawing.cpp | 1 + driveclick.cpp | 59 +++--- include/gfxfilter.h | 18 +- include/options.h | 15 +- include/zfile.h | 2 + inputdevice.cpp | 4 +- main.cpp | 8 +- newcpu.cpp | 12 +- od-win32/avioutput.cpp | 2 +- od-win32/blkdev_win32_aspi.cpp | 6 +- od-win32/clipboard_win32.cpp | 5 +- od-win32/debug_win32.cpp | 6 +- od-win32/direct3d.cpp | 233 +++++++++++++++-------- od-win32/direct3d.h | 2 +- od-win32/keyboard_win32.cpp | 6 +- od-win32/lib/prowizard.lib | Bin 1138468 -> 1138408 bytes od-win32/mp3decoder.cpp | 22 ++- od-win32/resources/resource | 9 +- od-win32/resources/winuae.rc | 10 +- od-win32/rp.cpp | 2 +- od-win32/screenshot.cpp | 6 +- od-win32/win32.cpp | 51 ++++-- od-win32/win32.h | 4 +- od-win32/win32_scaler.cpp | 75 ++++---- od-win32/win32gfx.cpp | 18 +- od-win32/win32gui.cpp | 325 ++++++++++++++++++--------------- od-win32/winuaechangelog.txt | 24 ++- od-win32/writelog.cpp | 2 +- prowizard/rippers/SkytPacker.c | 189 +++++++++++-------- uaelib.cpp | 8 +- zfile.cpp | 84 ++++++++- zfile_archive.cpp | 3 + 40 files changed, 997 insertions(+), 678 deletions(-) diff --git a/akiko.cpp b/akiko.cpp index 06a292ff..b0b26e46 100644 --- a/akiko.cpp +++ b/akiko.cpp @@ -456,8 +456,9 @@ static void cdaudiostop_do (void) static void cdaudiostop (void) { - cdrom_playing = 0; + cdrom_audiotimeout = 0; cdrom_paused = 0; + cdrom_playing = 0; write_comm_pipe_u32 (&requests, 0x0104, 1); } @@ -543,7 +544,7 @@ static int cd_play_audio (int startlsn, int endlsn, int scan) if (!cdrom_toc_cd_buffer.points) return 0; - for (i = 0; i < cdrom_toc_cd_buffer.points; i++) { + for (i = cdrom_toc_cd_buffer.first_track_offset; i <= cdrom_toc_cd_buffer.last_track_offset; i++) { s = &cdrom_toc_cd_buffer.toc[i]; addr = s->paddress; if (s->track > 0 && s->track < 100 && addr >= startlsn) @@ -557,6 +558,7 @@ static int cd_play_audio (int startlsn, int endlsn, int scan) endlsn = s->paddress; return 0; } + qcode_valid = 0; last_play_end = endlsn; cdrom_audiotimeout = 0; cdrom_paused = 0; @@ -579,6 +581,9 @@ static int cd_qcode (uae_u8 *d) last_play_pos = 0; buf = qcode_buf; as = buf[1]; + buf[2] = 0x80; + if (!qcode_valid) + return 0; if (cdrom_playing) // fake it! as = AUDIO_STATUS_IN_PROGRESS; if (as != AUDIO_STATUS_IN_PROGRESS && as != AUDIO_STATUS_PAUSED && as != AUDIO_STATUS_PLAY_COMPLETE && as != AUDIO_STATUS_NO_STATUS) /* audio status ok? */ @@ -587,6 +592,7 @@ static int cd_qcode (uae_u8 *d) last_play_pos = msf2lsn (fromlongbcd (s + 7)); if (!d) return 0; + buf[2] = 0; /* ??? */ d[0] = 0; /* CtlAdr */ @@ -614,6 +620,8 @@ static int cd_qcode (uae_u8 *d) d[10] = tobcd ((uae_u8)(msf >> 0)); } } +// write_log (L"%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n", +// d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11]); return 0; } @@ -869,11 +877,11 @@ static int cdrom_command_multi (void) write_log (L"PLAY FROM %06X (%d) to %06X (%d) SCAN=%d\n", seekpos, msf2lsn (seekpos), endpos, msf2lsn (endpos), scan); #endif + cdrom_playing = 1; + cdrom_result_buffer[1] |= CDS_PLAYING; if (!cd_play_audio (seekpos, endpos, 0)) { - cdrom_result_buffer[1] = CDS_ERROR; - } else { - cdrom_playing = 1; - cdrom_result_buffer[1] |= CDS_PLAYING; + // play didn't start, report it in next status packet + cdrom_audiotimeout = -3; } } else { #if AKIKO_DEBUG_IO_CMD @@ -887,10 +895,10 @@ static int cdrom_command_multi (void) return 2; } -static int cdrom_playend_notify (void) +static int cdrom_playend_notify (int err) { cdrom_result_buffer[0] = 4; - cdrom_result_buffer[1] = 0x80; + cdrom_result_buffer[1] = err ? 0x80 : 0x00; return 2; } @@ -1093,7 +1101,11 @@ static void akiko_handler (void) } } if (cdrom_audiotimeout == -2 && qcode_buf[1] != AUDIO_STATUS_IN_PROGRESS) { - cdrom_start_return_data (cdrom_playend_notify ()); + cdrom_start_return_data (cdrom_playend_notify (0)); + cdrom_audiotimeout = 0; + } + if (cdrom_audiotimeout == -3) { + cdrom_start_return_data (cdrom_playend_notify (1)); cdrom_audiotimeout = 0; } @@ -1616,7 +1628,7 @@ void akiko_reset (void) cdcomtxinx = 0; cdcomrxinx = 0; cdcomtxcmp = 0; - lastmediastate = 0; + lastmediastate = -1; } cdrom_led = 0; cdrom_receive_started = 0; diff --git a/audio.cpp b/audio.cpp index b9f0c203..dbaecb1f 100644 --- a/audio.cpp +++ b/audio.cpp @@ -204,8 +204,10 @@ void audio_sampleripper (int mode) rs->changed = 0; fetch_ripperpath (path, sizeof (path)); name[0] = 0; - if (currprefs.dfxtype[0] >= 0) - _tcscpy (name, currprefs.df[0]); + if (currprefs.floppyslots[0].dfxtype >= 0) + _tcscpy (name, currprefs.floppyslots[0].df); + else if (currprefs.cdslots[0].inuse) + _tcscpy (name, currprefs.cdslots[0].name); if (!name[0]) underline[0] = 0; namesplit (name); diff --git a/blkdev.cpp b/blkdev.cpp index 7a06304e..390b1f4a 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -20,11 +20,14 @@ #include "rp.h" #endif +#define PRE_INSERT_DELAY (3 * (currprefs.ntscmode ? 60 : 50)) + static int scsiemu[MAX_TOTAL_SCSI_DEVICES]; static struct device_functions *device_func[MAX_TOTAL_SCSI_DEVICES]; static int openlist[MAX_TOTAL_SCSI_DEVICES]; static int waspaused[MAX_TOTAL_SCSI_DEVICES], wasslow[MAX_TOTAL_SCSI_DEVICES]; +static int delayed[MAX_TOTAL_SCSI_DEVICES]; /* convert minutes, seconds and frames -> logical sector number */ int msf2lsn (int msf) @@ -232,9 +235,50 @@ static int sys_command_open_internal (int unitnum, const TCHAR *ident, cd_standa return ret; } -int get_standard_cd_unit (enum cd_standard_unit csu) +static int getunitinfo (int unitnum, int drive, cd_standard_unit csu, int *isaudio) +{ + struct device_info di; + if (sys_command_info (unitnum, &di, 0)) { + write_log (L"Scanning drive %s: ", di.label); + if (di.media_inserted) { + if (isaudiotrack (&di.toc, 0)) { + if (*isaudio == 0) + *isaudio = drive; + write_log (L"CDA"); + } + uae_u8 buffer[2048]; + if (sys_command_cd_read (unitnum, buffer, 16, 1)) { + if (!memcmp (buffer + 8, "CDTV", 4) || !memcmp (buffer + 8, "CD32", 4)) { + uae_u32 crc; + write_log (L"CD32 or CDTV"); + if (sys_command_cd_read (unitnum, buffer, 21, 1)) { + crc = get_crc32 (buffer, sizeof buffer); + if (crc == 0xe56c340f) { + write_log (L" [CD32.TM]"); + if (csu == CD_STANDARD_UNIT_CD32) { + write_log (L"\n"); + return 1; + } + } + } + if (csu == CD_STANDARD_UNIT_CDTV || csu == CD_STANDARD_UNIT_CD32) { + write_log (L"\n"); + return 1; + } + } + } + } else { + write_log (L"no media"); + } + } + write_log (L"\n"); + return 0; +} + +static int get_standard_cd_unit2 (cd_standard_unit csu) { int unitnum = 0; + int isaudio = 0; if (currprefs.cdslots[unitnum].name[0] || currprefs.cdslots[unitnum].inuse) { device_func_init (SCSI_UNIT_IOCTL); if (!sys_command_open_internal (unitnum, currprefs.cdslots[unitnum].name, csu)) { @@ -242,9 +286,9 @@ int get_standard_cd_unit (enum cd_standard_unit csu) if (!sys_command_open_internal (unitnum, currprefs.cdslots[unitnum].name, csu)) goto fallback; } + getunitinfo (unitnum, 0, csu, &isaudio); return unitnum; } - int isaudio = 0; device_func_init (SCSI_UNIT_IOCTL); for (int drive = 'C'; drive <= 'Z'; ++drive) { TCHAR vol[100]; @@ -252,41 +296,8 @@ int get_standard_cd_unit (enum cd_standard_unit csu) int drivetype = GetDriveType (vol); if (drivetype == DRIVE_CDROM) { if (sys_command_open_internal (unitnum, vol, csu)) { - struct device_info di; - write_log (L"Scanning drive %s: ", vol); - if (sys_command_info (unitnum, &di, 0)) { - if (di.media_inserted) { - if (isaudiotrack (&di.toc, 0)) { - if (isaudio == 0) - isaudio = drive; - write_log (L"CDA"); - } - uae_u8 buffer[2048]; - if (sys_command_cd_read (unitnum, buffer, 16, 1)) { - if (!memcmp (buffer + 8, "CDTV", 4) || !memcmp (buffer + 8, "CD32", 4)) { - uae_u32 crc; - write_log (L"CD32 or CDTV"); - if (sys_command_cd_read (unitnum, buffer, 21, 1)) { - crc = get_crc32 (buffer, sizeof buffer); - if (crc == 0xe56c340f) { - write_log (L" [CD32.TM]"); - if (csu == CD_STANDARD_UNIT_CD32) { - write_log (L"\n"); - return unitnum; - } - } - } - if (csu == CD_STANDARD_UNIT_CDTV || csu == CD_STANDARD_UNIT_CD32) { - write_log (L"\n"); - return unitnum; - } - } - } - } else { - write_log (L"no media"); - } - } - write_log (L"\n"); + if (getunitinfo (unitnum, drive, csu, &isaudio)) + return unitnum; sys_command_close (unitnum); } } @@ -305,6 +316,19 @@ fallback: } return unitnum; } + +int get_standard_cd_unit (cd_standard_unit csu) +{ + int unitnum = get_standard_cd_unit2 (csu); + if (unitnum < 0) + return -1; + delayed[unitnum] = 0; + if (currprefs.cdslots[unitnum].delayed) { + delayed[unitnum] = PRE_INSERT_DELAY; + } + return unitnum; +} + void close_standard_cd_unit (int unitnum) { sys_command_close (unitnum); @@ -390,6 +414,16 @@ static void check_changes (int unitnum) { bool changed = false; + if (device_func[unitnum] == NULL) + return; + + if (delayed[unitnum]) { + delayed[unitnum]--; + if (delayed[unitnum] == 0) + write_log (L"CD: startup delayed insert '%s'\n", currprefs.cdslots[unitnum].name[0] ? currprefs.cdslots[unitnum].name : L""); + return; + } + if (_tcscmp (changed_prefs.cdslots[unitnum].name, currprefs.cdslots[unitnum].name) != 0) changed = true; if (!changed && changed_prefs.cdslots[unitnum].name[0] == 0 && changed_prefs.cdslots[unitnum].inuse != currprefs.cdslots[unitnum].inuse) @@ -676,6 +710,8 @@ int sys_command_ismedia (int unitnum, int quick) { if (failunit (unitnum)) return -1; + if (delayed[unitnum]) + return 0; if (device_func[unitnum] == NULL) { uae_u8 cmd[6] = { 0, 0, 0, 0, 0, 0 }; return do_scsi (unitnum, cmd, sizeof cmd); @@ -688,7 +724,10 @@ struct device_info *sys_command_info (int unitnum, struct device_info *di, int q { if (failunit (unitnum)) return NULL; - return device_func[unitnum]->info (unitnum, di, quick); + struct device_info *di2 = device_func[unitnum]->info (unitnum, di, quick); + if (di2 && delayed[unitnum]) + di2->media_inserted = 0; + return di2; } #define MODE_SELECT_6 0x15 diff --git a/cfgfile.cpp b/cfgfile.cpp index d72fcc89..75bbdbfe 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -144,7 +144,7 @@ static const TCHAR *lorestype1[] = { L"lores", L"hires", L"superhires" }; static const TCHAR *lorestype2[] = { L"true", L"false" }; static const TCHAR *loresmode[] = { L"normal", L"filtered", 0 }; #ifdef GFXFILTER -static const TCHAR *filtermode2[] = { L"0x", L"1x", L"2x", L"3x", L"4x", 0 }; +static const TCHAR *filtermode2[] = { L"1x", L"2x", L"3x", L"4x", 0 }; #endif static const TCHAR *cartsmode[] = { L"none", L"hrtmon", 0 }; static const TCHAR *idemode[] = { L"none", L"a600/a1200", L"a4000", 0 }; @@ -543,19 +543,19 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) p->nr_floppies = 4; for (i = 0; i < 4; i++) { - str = cfgfile_subst_path (p->path_floppy, UNEXPANDED, p->df[i]); + str = cfgfile_subst_path (p->path_floppy, UNEXPANDED, p->floppyslots[i].df); _stprintf (tmp, L"floppy%d", i); cfgfile_write_str (f, tmp, str); xfree (str); _stprintf (tmp, L"floppy%dtype", i); - cfgfile_dwrite (f, tmp, L"%d", p->dfxtype[i]); + cfgfile_dwrite (f, tmp, L"%d", p->floppyslots[i].dfxtype); _stprintf (tmp, L"floppy%dsound", i); - cfgfile_dwrite (f, tmp, L"%d", p->dfxclick[i]); - if (p->dfxclick[i] < 0 && p->dfxclickexternal[i][0]) { + cfgfile_dwrite (f, tmp, L"%d", p->floppyslots[i].dfxclick); + if (p->floppyslots[i].dfxclick < 0 && p->floppyslots[i].dfxclickexternal[0]) { _stprintf (tmp, L"floppy%dsoundext", i); - cfgfile_dwrite (f, tmp, p->dfxclickexternal[i]); + cfgfile_dwrite (f, tmp, p->floppyslots[i].dfxclickexternal); } - if (p->dfxtype[i] < 0 && p->nr_floppies > i) + if (p->floppyslots[i].dfxtype < 0 && p->nr_floppies > i) p->nr_floppies = i; } for (i = 0; i < MAX_SPARE_DRIVES; i++) { @@ -570,9 +570,15 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) TCHAR tmp2[MAX_DPATH]; _stprintf (tmp, L"cdimage%d", i); _tcscpy (tmp2, p->cdslots[i].name); - if (p->cdslots[i].type != SCSI_UNIT_DEFAULT || _tcschr (p->cdslots[i].name, ',')) { + if (p->cdslots[i].type != SCSI_UNIT_DEFAULT || _tcschr (p->cdslots[i].name, ',') || p->cdslots[i].delayed) { _tcscat (tmp2, L","); - _tcscat (tmp2, cdmodes[p->cdslots[i].type + 1]); + if (p->cdslots[i].delayed) { + _tcscat (tmp2, L"delay"); + _tcscat (tmp2, L":"); + } + if (p->cdslots[i].type != SCSI_UNIT_DEFAULT) { + _tcscat (tmp2, cdmodes[p->cdslots[i].type + 1]); + } } cfgfile_write_str (f, tmp, tmp2); } @@ -722,29 +728,13 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) uf = &uaefilters[i]; if (uf->type == p->gfx_filter) { cfgfile_dwrite_str (f, L"gfx_filter", uf->cfgname); - if (uf->type == p->gfx_filter) { - if (uf->x[0]) { - cfgfile_dwrite_str (f, L"gfx_filter_mode", filtermode2[1]); - } else { - int mt[4], i = 0; - if (uf->x[1]) - mt[i++] = 1; - if (uf->x[2]) - mt[i++] = 2; - if (uf->x[3]) - mt[i++] = 3; - if (uf->x[4]) - mt[i++] = 4; - cfgfile_dwrite (f, L"gfx_filter_mode", L"%dx", mt[p->gfx_filter_filtermode]); - } - } } i++; } } else { cfgfile_dwrite (f, L"gfx_filter", L"no"); } - + cfgfile_dwrite_str (f, L"gfx_filter_mode", filtermode2[p->gfx_filter_filtermode]); cfgfile_dwrite (f, L"gfx_filter_vert_zoom", L"%d", p->gfx_filter_vert_zoom); cfgfile_dwrite (f, L"gfx_filter_horiz_zoom", L"%d", p->gfx_filter_horiz_zoom); cfgfile_dwrite (f, L"gfx_filter_vert_zoom_mult", L"%d", p->gfx_filter_vert_zoom_mult); @@ -1152,22 +1142,36 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) TCHAR tmp[20]; _stprintf (tmp, L"cdimage%d", i); if (!_tcsicmp (option, tmp)) { + p->cdslots[i].delayed = false; TCHAR *next = _tcsrchr (value, ','); int type = SCSI_UNIT_DEFAULT; int mode = 0; int unitnum = 0; - if (next) { + for (;;) { + if (!next) + break; *next++ = 0; TCHAR *next2 = _tcschr (next, ':'); if (next2) *next2++ = 0; int tmpval = 0; + if (!_tcsicmp (next, L"delay")) { + p->cdslots[i].delayed = true; + next = next2; + if (!next) + break; + next2 = _tcschr (next, ':'); + if (next2) + *next2++ = 0; + } type = match_string (cdmodes, next); if (type < 0) type = SCSI_UNIT_DEFAULT; else type--; next = next2; + if (!next) + break; next2 = _tcschr (next, ':'); if (next2) *next2++ = 0; @@ -1175,12 +1179,14 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) if (mode < 0) mode = 0; next = next2; + if (!next) + break; next2 = _tcschr (next, ':'); if (next2) *next2++ = 0; cfgfile_intval (option, next, tmp, &unitnum, 1); } - _tcsncpy (p->cdslots[i].name, value, sizeof p->cdslots[i].name); + _tcsncpy (p->cdslots[i].name, value, sizeof p->cdslots[i].name / sizeof (TCHAR)); p->cdslots[i].name[sizeof p->cdslots[i].name - 1] = 0; p->cdslots[i].inuse = true; p->cdslots[i].type = type; @@ -1248,18 +1254,18 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || cfgfile_intval (option, value, L"gfx_gamma", &p->gfx_gamma, 1) || cfgfile_string (option, value, L"gfx_filter_mask", p->gfx_filtermask, sizeof p->gfx_filtermask / sizeof (TCHAR)) #endif - || cfgfile_intval (option, value, L"floppy0sound", &p->dfxclick[0], 1) - || cfgfile_intval (option, value, L"floppy1sound", &p->dfxclick[1], 1) - || cfgfile_intval (option, value, L"floppy2sound", &p->dfxclick[2], 1) - || cfgfile_intval (option, value, L"floppy3sound", &p->dfxclick[3], 1) + || cfgfile_intval (option, value, L"floppy0sound", &p->floppyslots[0].dfxclick, 1) + || cfgfile_intval (option, value, L"floppy1sound", &p->floppyslots[1].dfxclick, 1) + || cfgfile_intval (option, value, L"floppy2sound", &p->floppyslots[2].dfxclick, 1) + || cfgfile_intval (option, value, L"floppy3sound", &p->floppyslots[3].dfxclick, 1) || cfgfile_intval (option, value, L"floppy_channel_mask", &p->dfxclickchannelmask, 1) || cfgfile_intval (option, value, L"floppy_volume", &p->dfxclickvolume, 1)) return 1; - if (cfgfile_path (option, value, L"floppy0soundext", p->dfxclickexternal[0], sizeof p->dfxclickexternal[0] / sizeof (TCHAR)) - || cfgfile_path (option, value, L"floppy1soundext", p->dfxclickexternal[1], sizeof p->dfxclickexternal[1] / sizeof (TCHAR)) - || cfgfile_path (option, value, L"floppy2soundext", p->dfxclickexternal[2], sizeof p->dfxclickexternal[2] / sizeof (TCHAR)) - || cfgfile_path (option, value, L"floppy3soundext", p->dfxclickexternal[3], sizeof p->dfxclickexternal[3] / sizeof (TCHAR)) + if (cfgfile_path (option, value, L"floppy0soundext", p->floppyslots[0].dfxclickexternal, sizeof p->floppyslots[0].dfxclickexternal / sizeof (TCHAR)) + || cfgfile_path (option, value, L"floppy1soundext", p->floppyslots[1].dfxclickexternal, sizeof p->floppyslots[1].dfxclickexternal / sizeof (TCHAR)) + || cfgfile_path (option, value, L"floppy2soundext", p->floppyslots[2].dfxclickexternal, sizeof p->floppyslots[2].dfxclickexternal / sizeof (TCHAR)) + || cfgfile_path (option, value, L"floppy3soundext", p->floppyslots[3].dfxclickexternal, sizeof p->floppyslots[3].dfxclickexternal / sizeof (TCHAR)) || cfgfile_string (option, value, L"gfx_display_name", p->gfx_display_name, sizeof p->gfx_display_name / sizeof (TCHAR)) || cfgfile_string (option, value, L"config_info", p->info, sizeof p->info / sizeof (TCHAR)) || cfgfile_string (option, value, L"config_description", p->description, sizeof p->description / sizeof (TCHAR))) @@ -1414,37 +1420,10 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) return 1; } if (_tcscmp (option, L"gfx_filter_mode") == 0) { - p->gfx_filter_filtermode = 0; - if (p->gfx_filter > 0) { - struct uae_filter *uf; - int i = 0; - while(uaefilters[i].name) { - uf = &uaefilters[i]; - if (uf->type == p->gfx_filter) { - if (!uf->x[0]) { - int mt[4], j; - i = 0; - if (uf->x[1]) - mt[i++] = 1; - if (uf->x[2]) - mt[i++] = 2; - if (uf->x[3]) - mt[i++] = 3; - if (uf->x[4]) - mt[i++] = 4; - cfgfile_strval (option, value, L"gfx_filter_mode", &i, filtermode2, 0); - for (j = 0; j < i; j++) { - if (mt[j] == i) - p->gfx_filter_filtermode = j; - } - } - break; - } - i++; - } - } + cfgfile_strval (option, value, L"gfx_filter_mode", &p->gfx_filter_filtermode, filtermode2, 0); return 1; } + if (cfgfile_string (option, value, L"gfx_filter_aspect_ratio", tmpbuf, sizeof tmpbuf / sizeof (TCHAR))) { int v1, v2; TCHAR *s; @@ -1909,10 +1888,10 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va || cfgfile_intval (option, value, L"floppy_random_bits_min", &p->floppy_random_bits_min, 1) || cfgfile_intval (option, value, L"floppy_random_bits_max", &p->floppy_random_bits_max, 1) || cfgfile_intval (option, value, L"nr_floppies", &p->nr_floppies, 1) - || cfgfile_intval (option, value, L"floppy0type", &p->dfxtype[0], 1) - || cfgfile_intval (option, value, L"floppy1type", &p->dfxtype[1], 1) - || cfgfile_intval (option, value, L"floppy2type", &p->dfxtype[2], 1) - || cfgfile_intval (option, value, L"floppy3type", &p->dfxtype[3], 1) + || cfgfile_intval (option, value, L"floppy0type", &p->floppyslots[0].dfxtype, 1) + || cfgfile_intval (option, value, L"floppy1type", &p->floppyslots[1].dfxtype, 1) + || cfgfile_intval (option, value, L"floppy2type", &p->floppyslots[2].dfxtype, 1) + || cfgfile_intval (option, value, L"floppy3type", &p->floppyslots[3].dfxtype, 1) || cfgfile_intval (option, value, L"maprom", &p->maprom, 1) || cfgfile_intval (option, value, L"parallel_autoflush", &p->parallel_autoflush_time, 1) || cfgfile_intval (option, value, L"uae_hide", &p->uae_hide, 1) @@ -1968,7 +1947,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va for (i = 0; i < 4; i++) { _stprintf (tmpbuf, L"floppy%d", i); - if (cfgfile_path (option, value, tmpbuf, p->df[i], sizeof p->df[i] / sizeof (TCHAR))) + if (cfgfile_path (option, value, tmpbuf, p->floppyslots[i].df, sizeof p->floppyslots[i].df / sizeof (TCHAR))) return 1; } @@ -2544,7 +2523,7 @@ static int cfgfile_load_2 (struct uae_prefs *p, const TCHAR *filename, bool real } for (i = 0; i < 4; i++) - subst (p->path_floppy, p->df[i], sizeof p->df[i] / sizeof (TCHAR)); + subst (p->path_floppy, p->floppyslots[i].df, sizeof p->floppyslots[i].df / sizeof (TCHAR)); subst (p->path_rom, p->romfile, sizeof p->romfile / sizeof (TCHAR)); subst (p->path_rom, p->romextfile, sizeof p->romextfile / sizeof (TCHAR)); @@ -2896,10 +2875,10 @@ int parse_cmdline_option (struct uae_prefs *p, TCHAR c, const TCHAR *arg) switch (c) { case 'h': usage (); exit (0); - case '0': cmdpath (p->df[0], arg, 255); break; - case '1': cmdpath (p->df[1], arg, 255); break; - case '2': cmdpath (p->df[2], arg, 255); break; - case '3': cmdpath (p->df[3], arg, 255); break; + case '0': cmdpath (p->floppyslots[0].df, arg, 255); break; + case '1': cmdpath (p->floppyslots[1].df, arg, 255); break; + case '2': cmdpath (p->floppyslots[2].df, arg, 255); break; + case '3': cmdpath (p->floppyslots[3].df, arg, 255); break; case 'r': cmdpath (p->romfile, arg, 255); break; case 'K': cmdpath (p->romextfile, arg, 255); break; case 'p': _tcsncpy (p->prtname, arg, 255); p->prtname[255] = 0; break; @@ -3432,8 +3411,8 @@ static void default_prefs_mini (struct uae_prefs *p, int type) _tcscpy (p->description, L"UAE default A500 configuration"); p->nr_floppies = 1; - p->dfxtype[0] = DRV_35_DD; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_35_DD; + p->floppyslots[1].dfxtype = DRV_NONE; p->cpu_model = 68000; p->address_space_24 = 1; p->chipmem_size = 0x00080000; @@ -3601,10 +3580,10 @@ void default_prefs (struct uae_prefs *p, int type) p->gfx_filter_keep_aspect = 0; p->gfx_filter_autoscale = 0; - _tcscpy (p->df[0], L"df0.adf"); - _tcscpy (p->df[1], L"df1.adf"); - _tcscpy (p->df[2], L"df2.adf"); - _tcscpy (p->df[3], L"df3.adf"); + _tcscpy (p->floppyslots[0].df, L"df0.adf"); + _tcscpy (p->floppyslots[1].df, L"df1.adf"); + _tcscpy (p->floppyslots[2].df, L"df2.adf"); + _tcscpy (p->floppyslots[3].df, L"df3.adf"); configure_rom (p, roms, 0); _tcscpy (p->romextfile, L""); @@ -3649,10 +3628,10 @@ void default_prefs (struct uae_prefs *p, int type) p->custom_memory_sizes[1] = 0; p->nr_floppies = 2; - p->dfxtype[0] = DRV_35_DD; - p->dfxtype[1] = DRV_35_DD; - p->dfxtype[2] = DRV_NONE; - p->dfxtype[3] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_35_DD; + p->floppyslots[1].dfxtype = DRV_35_DD; + p->floppyslots[2].dfxtype = DRV_NONE; + p->floppyslots[3].dfxtype = DRV_NONE; p->floppy_speed = 100; p->floppy_write_length = 0; p->floppy_random_bits_min = 1; @@ -3713,12 +3692,12 @@ static void buildin_default_prefs (struct uae_prefs *p) { buildin_default_host_prefs (p); - p->dfxtype[0] = DRV_35_DD; + p->floppyslots[0].dfxtype = DRV_35_DD; if (p->nr_floppies != 1 && p->nr_floppies != 2) p->nr_floppies = 2; - p->dfxtype[1] = p->nr_floppies >= 2 ? DRV_35_DD : DRV_NONE; - p->dfxtype[2] = DRV_NONE; - p->dfxtype[3] = DRV_NONE; + p->floppyslots[1].dfxtype = p->nr_floppies >= 2 ? DRV_35_DD : DRV_NONE; + p->floppyslots[2].dfxtype = DRV_NONE; + p->floppyslots[3].dfxtype = DRV_NONE; p->floppy_speed = 100; p->fpu_model = 0; @@ -3855,7 +3834,7 @@ static int bip_a3000 (struct uae_prefs *p, int config, int compa, int romcheck) p->immediate_blits = 0; p->produce_sound = 2; p->cachesize = 8192; - p->dfxtype[0] = DRV_35_HD; + p->floppyslots[0].dfxtype = DRV_35_HD; p->floppy_speed = 0; p->cpu_idle = 150; p->cs_compatible = CP_A3000; @@ -3887,8 +3866,8 @@ static int bip_a4000 (struct uae_prefs *p, int config, int compa, int romcheck) p->immediate_blits = 0; p->produce_sound = 2; p->cachesize = 8192; - p->dfxtype[0] = DRV_35_HD; - p->dfxtype[1] = DRV_35_HD; + p->floppyslots[0].dfxtype = DRV_35_HD; + p->floppyslots[1].dfxtype = DRV_35_HD; p->floppy_speed = 0; p->cpu_idle = 150; p->cs_compatible = CP_A4000; @@ -3919,8 +3898,8 @@ static int bip_a4000t (struct uae_prefs *p, int config, int compa, int romcheck) p->immediate_blits = 0; p->produce_sound = 2; p->cachesize = 8192; - p->dfxtype[0] = DRV_35_HD; - p->dfxtype[1] = DRV_35_HD; + p->floppyslots[0].dfxtype = DRV_35_HD; + p->floppyslots[1].dfxtype = DRV_35_HD; p->floppy_speed = 0; p->cpu_idle = 150; p->cs_compatible = CP_A4000T; @@ -3940,7 +3919,7 @@ static int bip_a1000 (struct uae_prefs *p, int config, int compa, int romcheck) p->bogomem_size = 0; p->sound_filter = FILTER_SOUND_ON; set_68000_compa (p, compa); - p->dfxtype[1] = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; p->cs_compatible = CP_A1000; p->cs_slowmemisfast = 1; p->cs_dipagnus = 1; @@ -3976,10 +3955,10 @@ static int bip_cdtv (struct uae_prefs *p, int config, int compa, int romcheck) p->cs_cdtvcard = 64; p->cs_rtc = 1; p->nr_floppies = 0; - p->dfxtype[0] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_NONE; if (config > 0) - p->dfxtype[0] = DRV_35_DD; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_35_DD; + p->floppyslots[1].dfxtype = DRV_NONE; set_68000_compa (p, compa); p->cs_compatible = CP_CDTV; built_in_chipset_prefs (p); @@ -4011,8 +3990,8 @@ static int bip_cd32 (struct uae_prefs *p, int config, int compa, int romcheck) } p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 1; p->nr_floppies = 0; - p->dfxtype[0] = DRV_NONE; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; set_68020_compa (p, compa, 1); p->cs_compatible = CP_CD32; built_in_chipset_prefs (p); @@ -4112,7 +4091,7 @@ static int bip_a500 (struct uae_prefs *p, int config, int compa, int romcheck) p->bogomem_size = 0; p->chipset_mask = 0; p->cs_rtc = 0; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; break; case 4: // KS 1.2, OCS Agnus, 0.5M Chip roms[0] = 5; @@ -4121,7 +4100,7 @@ static int bip_a500 (struct uae_prefs *p, int config, int compa, int romcheck) p->bogomem_size = 0; p->chipset_mask = 0; p->cs_rtc = 0; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; break; case 5: // KS 1.2, OCS Agnus, 0.5M Chip + 0.5M Slow roms[0] = 5; @@ -4160,8 +4139,8 @@ static int bip_super (struct uae_prefs *p, int config, int compa, int romcheck) p->immediate_blits = 1; p->produce_sound = 2; p->cachesize = 8192; - p->dfxtype[0] = DRV_35_HD; - p->dfxtype[1] = DRV_35_HD; + p->floppyslots[0].dfxtype = DRV_35_HD; + p->floppyslots[1].dfxtype = DRV_35_HD; p->floppy_speed = 0; p->cpu_idle = 150; p->scsi = 1; @@ -4186,8 +4165,8 @@ static int bip_arcadia (struct uae_prefs *p, int config, int compa, int romcheck p->chipset_mask = 0; p->cs_rtc = 0; p->nr_floppies = 0; - p->dfxtype[0] = DRV_NONE; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[0].dfxtype = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; set_68000_compa (p, compa); p->cs_compatible = CP_A500; built_in_chipset_prefs (p); @@ -4219,7 +4198,7 @@ static int bip_arcadia (struct uae_prefs *p, int config, int compa, int romcheck int built_in_prefs (struct uae_prefs *p, int model, int config, int compa, int romcheck) { - int v = 0, i; + int v = 0; buildin_default_prefs (p); switch (model) @@ -4261,10 +4240,6 @@ int built_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r v = bip_super (p, config, compa, romcheck); break; } - for (i = 0; i < 4; i++) { - if (p->dfxtype[i] < 0) - p->df[i][0] = DRV_35_DD; - } return v; } diff --git a/consolehook.cpp b/consolehook.cpp index c8897d4a..a492556f 100644 --- a/consolehook.cpp +++ b/consolehook.cpp @@ -40,7 +40,7 @@ void consolehook_config (struct uae_prefs *p) p->fastmem_size = 0x00800000; p->bogomem_size = 0; p->nr_floppies = 1; - p->dfxtype[1] = DRV_NONE; + p->floppyslots[1].dfxtype = DRV_NONE; p->floppy_speed = 0; p->start_gui = 0; p->gfx_size_win.width = 320; diff --git a/custom.cpp b/custom.cpp index 4a995fcc..d42f8464 100644 --- a/custom.cpp +++ b/custom.cpp @@ -5620,9 +5620,9 @@ static void hsync_handler (void) } while (input_recording < 0 && inprec_pstart (INPREC_DISKINSERT)) { int drv = inprec_pu8 (); - inprec_pstr (currprefs.df[drv]); - _tcscpy (changed_prefs.df[drv], currprefs.df[drv]); - disk_insert_force (drv, currprefs.df[drv]); + inprec_pstr (currprefs.floppyslots[drv].df); + _tcscpy (changed_prefs.floppyslots[drv].df, currprefs.floppyslots[drv].df); + disk_insert_force (drv, currprefs.floppyslots[drv].df); inprec_pend (); } diff --git a/debug.cpp b/debug.cpp index 7e67ff08..cbb05e57 100644 --- a/debug.cpp +++ b/debug.cpp @@ -2050,7 +2050,7 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num) struct memwatch_node *mwn; if (buf) - memset (buf, 0, bufsize); + memset (buf, 0, bufsize * sizeof (TCHAR)); for (i = 0; i < MEMWATCH_TOTAL; i++) { if ((num >= 0 && num == i) || (num < 0)) { mwn = &mwnodes[i]; diff --git a/disk.cpp b/disk.cpp index 8778c7bb..2ef4e976 100644 --- a/disk.cpp +++ b/disk.cpp @@ -515,7 +515,7 @@ static TCHAR *drive_id_name(drive *drv) */ static void drive_settype_id (drive *drv) { - int t = currprefs.dfxtype[drv - &floppy[0]]; + int t = currprefs.floppyslots[drv - &floppy[0]].dfxtype; switch (t) { @@ -571,13 +571,13 @@ static void drive_image_free (drive *drv) static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR *fname); -static void reset_drive_gui (int i) +static void reset_drive_gui (int num) { - gui_data.drive_disabled[i] = 0; - gui_data.df[i][0] = 0; - gui_data.crc32[i] = 0; - if (currprefs.dfxtype[i] < 0) - gui_data.drive_disabled[i] = 1; + gui_data.drive_disabled[num] = 0; + gui_data.df[num][0] = 0; + gui_data.crc32[num] = 0; + if (currprefs.floppyslots[num].dfxtype < 0) + gui_data.drive_disabled[num] = 1; } static void setamax (void) @@ -600,33 +600,33 @@ static void setamax (void) #endif } -static void reset_drive (int i) +static void reset_drive (int num) { - drive *drv = &floppy[i]; + drive *drv = &floppy[num]; drv->amax = 0; drive_image_free (drv); drv->motoroff = 1; - disabled &= ~(1 << i); - if (currprefs.dfxtype[i] < 0) - disabled |= 1 << i; - reset_drive_gui(i); + disabled &= ~(1 << num); + if (currprefs.floppyslots[num].dfxtype < 0) + disabled |= 1 << num; + reset_drive_gui (num); /* most internal Amiga floppy drives won't enable * diskready until motor is running at full speed * and next indexsync has been passed */ drv->indexhackmode = 0; - if (i == 0 && currprefs.dfxtype[i] == 0) + if (num == 0 && currprefs.floppyslots[num].dfxtype == 0) drv->indexhackmode = 1; drv->dskchange_time = 0; drv->buffered_cyl = -1; drv->buffered_side = -1; - gui_led (i + LED_DF0, 0); + gui_led (num + LED_DF0, 0); drive_settype_id (drv); - _tcscpy (currprefs.df[i], changed_prefs.df[i]); + _tcscpy (currprefs.floppyslots[num].df, changed_prefs.floppyslots[num].df); drv->newname[0] = 0; - if (!drive_insert (drv, &currprefs, i, currprefs.df[i])) - disk_eject (i); + if (!drive_insert (drv, &currprefs, num, currprefs.floppyslots[num].df)) + disk_eject (num); } /* code for track display */ @@ -640,9 +640,9 @@ static void update_drive_gui (int num) && side == gui_data.drive_side && drv->crc32 == gui_data.crc32[num] && writ == gui_data.drive_writing[num] - && !_tcscmp (gui_data.df[num], currprefs.df[num])) + && !_tcscmp (gui_data.df[num], currprefs.floppyslots[num].df)) return; - _tcscpy (gui_data.df[num], currprefs.df[num]); + _tcscpy (gui_data.df[num], currprefs.floppyslots[num].df); gui_data.crc32[num] = drv->crc32; gui_data.drive_motor[num] = drv->state; gui_data.drive_track[num] = drv->cyl; @@ -808,7 +808,7 @@ static int openwritefile (drive *drv, int create) { bool wrprot = 0; - drv->writediskfile = getwritefile (currprefs.df[drv - &floppy[0]], &wrprot); + drv->writediskfile = getwritefile (currprefs.floppyslots[drv - &floppy[0]].df, &wrprot); if (drv->writediskfile) { drv->wrprot = wrprot; if (!read_header_ext2 (drv->writediskfile, drv->writetrackdata, &drv->write_num_tracks, 0)) { @@ -881,7 +881,7 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR DISK_validate_filename (fname, 1, &drv->wrprot, &drv->crc32, &drv->diskfile); drv->ddhd = 1; drv->num_secs = 0; - drv->hard_num_cyls = p->dfxtype[dnum] == DRV_525_SD ? 40 : 80; + drv->hard_num_cyls = p->floppyslots[dnum].dfxtype == DRV_525_SD ? 40 : 80; drv->tracktiming[0] = 0; drv->useturbo = 0; drv->indexoffset = 0; @@ -910,10 +910,10 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR inprec_rend (); } - _tcsncpy (currprefs.df[dnum], fname, 255); - currprefs.df[dnum][255] = 0; - _tcsncpy (changed_prefs.df[dnum], fname, 255); - changed_prefs.df[dnum][255] = 0; + _tcsncpy (currprefs.floppyslots[dnum].df, fname, 255); + currprefs.floppyslots[dnum].df[255] = 0; + _tcsncpy (changed_prefs.floppyslots[dnum].df, fname, 255); + changed_prefs.floppyslots[dnum].df[255] = 0; _tcscpy (drv->newname, fname); gui_filename (dnum, fname); @@ -2212,7 +2212,7 @@ void disk_eject (int num) config_changed = 1; gui_filename (num, L""); drive_eject (floppy + num); - *currprefs.df[num] = *changed_prefs.df[num] = 0; + *currprefs.floppyslots[num].df = *changed_prefs.floppyslots[num].df = 0; floppy[num].newname[0] = 0; update_drive_gui (num); } @@ -2286,10 +2286,10 @@ static void disk_insert_2 (int num, const TCHAR *name, int forced) drive_insert (drv, &currprefs, num, name); return; } - if (!_tcscmp (currprefs.df[num], name)) + if (!_tcscmp (currprefs.floppyslots[num].df, name)) return; _tcscpy (drv->newname, name); - _tcscpy (currprefs.df[num], name); + _tcscpy (currprefs.floppyslots[num].df, name); DISK_history_add (name, -1, HISTORY_FLOPPY, 0); if (name[0] == 0) { disk_eject (num); @@ -2325,15 +2325,15 @@ void DISK_check_change (void) for (i = 0; i < MAX_FLOPPY_DRIVES; i++) { drive *drv = floppy + i; gui_lock (); - if (currprefs.dfxtype[i] != changed_prefs.dfxtype[i]) { - currprefs.dfxtype[i] = changed_prefs.dfxtype[i]; + if (currprefs.floppyslots[i].dfxtype != changed_prefs.floppyslots[i].dfxtype) { + currprefs.floppyslots[i].dfxtype = changed_prefs.floppyslots[i].dfxtype; reset_drive (i); #ifdef RETROPLATFORM - rp_floppydrive_change (i, currprefs.dfxtype[i] >= 0 ? 1 : 0); + rp_floppydrive_change (i, currprefs.floppyslots[i].dfxtype >= 0 ? 1 : 0); #endif } - if (drv->dskchange_time == 0 && _tcscmp (currprefs.df[i], changed_prefs.df[i])) - disk_insert (i, changed_prefs.df[i]); + if (drv->dskchange_time == 0 && _tcscmp (currprefs.floppyslots[i].df, changed_prefs.floppyslots[i].df)) + disk_insert (i, changed_prefs.floppyslots[i].df); gui_unlock (); if (drv->dskready_down_time > 0) drv->dskready_down_time--; @@ -2481,13 +2481,13 @@ uae_u8 DISK_status (void) st &= ~0x20; #endif } else { - if (drv->dskready && !drv->indexhack && currprefs.dfxtype[dr] != DRV_35_DD_ESCOM) + if (drv->dskready && !drv->indexhack && currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM) st &= ~0x20; } } else { if (currprefs.cs_df0idhw || dr > 0) { /* report drive ID */ - if (drv->idbit && currprefs.dfxtype[dr] != DRV_35_DD_ESCOM) + if (drv->idbit && currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM) st &= ~0x20; } else { /* non-ID internal drive: mirror real dskready */ @@ -2507,7 +2507,7 @@ uae_u8 DISK_status (void) if (catweasel_disk_changed (drv->catweasel)) st &= ~4; #endif - } else if (drv->dskchange && currprefs.dfxtype[dr] != DRV_525_SD) { + } else if (drv->dskchange && currprefs.floppyslots[dr].dfxtype != DRV_525_SD) { st &= ~4; } } else if (!(selected & (1 << dr))) { @@ -3343,7 +3343,7 @@ void DISK_init (void) drive *drv = &floppy[dr]; /* reset all drive types to 3.5 DD */ drive_settype_id (drv); - if (!drive_insert (drv, &currprefs, dr, currprefs.df[dr])) + if (!drive_insert (drv, &currprefs, dr, currprefs.floppyslots[dr].df)) disk_eject (dr); } if (disk_empty (0)) @@ -3380,7 +3380,7 @@ int DISK_examine_image (struct uae_prefs *p, int num, uae_u32 *crc32) drv->cyl = 0; side = 0; *crc32 = 0; - if (!drive_insert (drv, p, num, p->df[num])) + if (!drive_insert (drv, p, num, p->floppyslots[num].df)) return 1; if (!drv->diskfile) return 1; @@ -3424,7 +3424,7 @@ end: drive_image_free (drv); if (wasdelayed > 1) { drive_eject (drv); - currprefs.df[num][0] = 0; + currprefs.floppyslots[num].df[0] = 0; drv->dskchange_time = wasdelayed; disk_insert (num, drv->newname); } @@ -3482,7 +3482,7 @@ uae_u8 *restore_disk (int num,uae_u8 *src) disabled |= 1 << num; if (changed_prefs.nr_floppies > num) changed_prefs.nr_floppies = num; - changed_prefs.dfxtype[num] = -1; + changed_prefs.floppyslots[num].dfxtype = -1; } else { drv->motoroff = (state & 1) ? 0 : 1; drv->idbit = (state & 4) ? 1 : 0; @@ -3500,10 +3500,10 @@ uae_u8 *restore_disk (int num,uae_u8 *src) dfxtype = DRV_35_DD; break; } - changed_prefs.dfxtype[num] = dfxtype; + changed_prefs.floppyslots[num].dfxtype = dfxtype; } drv->indexhackmode = 0; - if (num == 0 && currprefs.dfxtype[num] == 0) + if (num == 0 && currprefs.floppyslots[num].dfxtype == 0) drv->indexhackmode = 1; drv->buffered_cyl = -1; drv->buffered_side = -1; @@ -3515,19 +3515,19 @@ uae_u8 *restore_disk (int num,uae_u8 *src) drv->dskchange_time = 0; restore_u32 (); s = restore_string (); - _tcscpy (old, currprefs.df[num]); - _tcsncpy (changed_prefs.df[num], s, 255); + _tcscpy (old, currprefs.floppyslots[num].df); + _tcsncpy (changed_prefs.floppyslots[num].df, s, 255); xfree (s); - newis = changed_prefs.df[num][0] ? 1 : 0; + newis = changed_prefs.floppyslots[num].df[0] ? 1 : 0; if (!(disabled & (1 << num))) { if (!newis) { drv->dskchange = 1; } else { - drive_insert (floppy + num, &currprefs, num, changed_prefs.df[num]); + drive_insert (floppy + num, &currprefs, num, changed_prefs.floppyslots[num].df); if (drive_empty (floppy + num)) { if (newis && old[0]) { - _tcscpy (changed_prefs.df[num], old); - drive_insert (floppy + num, &currprefs, num, changed_prefs.df[num]); + _tcscpy (changed_prefs.floppyslots[num].df, old); + drive_insert (floppy + num, &currprefs, num, changed_prefs.floppyslots[num].df); if (drive_empty (floppy + num)) drv->dskchange = 1; } @@ -3575,7 +3575,7 @@ uae_u8 *save_disk (int num, int *len, uae_u8 *dstptr) save_u8 (drv->drive_id_scnt); /* id mode position */ save_u32 (drv->mfmpos); /* disk position */ save_u32 (getadfcrc (drv)); /* CRC of disk image */ - save_string (currprefs.df[num]);/* image name */ + save_string (currprefs.floppyslots[num].df);/* image name */ *len = dst - dstbak; return dstbak; @@ -3782,12 +3782,12 @@ int disk_prevnext (int drive, int dir) { TCHAR img[MAX_DPATH]; - _tcscpy (img, currprefs.df[drive]); + _tcscpy (img, currprefs.floppyslots[drive].df); if (!img[0]) return 0; disk_prevnext_name (img, dir); - _tcscpy (changed_prefs.df[drive], img); + _tcscpy (changed_prefs.floppyslots[drive].df, img); return 1; } diff --git a/drawing.cpp b/drawing.cpp index 628f9002..da4c2a6d 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -2188,6 +2188,7 @@ static void center_image (void) } else { visible_left_border = max_diwlastword - gfxvidinfo.width; } + if (currprefs.gfx_xcenter_pos >= 0) { int val = currprefs.gfx_xcenter_pos >> RES_MAX; #if 0 diff --git a/driveclick.cpp b/driveclick.cpp index 4b177ab9..ad7da8b1 100644 --- a/driveclick.cpp +++ b/driveclick.cpp @@ -141,56 +141,57 @@ void driveclick_init (void) driveclick_free (); vv = 0; for (i = 0; i < 4; i++) { + struct floppyslot *fs = &currprefs.floppyslots[i]; for (j = 0; j < CLICK_TRACKS; j++) { drvs[i][DS_CLICK].indexes[j] = 0; drvs[i][DS_CLICK].lengths[j] = 0; } - if (currprefs.dfxclick[i]) { - if (currprefs.dfxclick[i] > 0) { + if (fs->dfxclick) { + if (fs->dfxclick > 0) { v = 0; - switch(currprefs.dfxclick[i]) + switch(fs->dfxclick) { case 1: - if (driveclick_loadresource (drvs[i], currprefs.dfxclick[i])) + if (driveclick_loadresource (drvs[i], fs->dfxclick)) v = 3; for (j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; wave_initialized = 1; break; default: - if (driveclick_fdrawcmd_open (currprefs.dfxclick[i] - 2)) + if (driveclick_fdrawcmd_open (fs->dfxclick - 2)) v = 1; break; } - } else if (currprefs.dfxclick[i] == -1) { + } else if (fs->dfxclick == -1) { TCHAR path2[MAX_DPATH]; wave_initialized = 1; for (j = 0; j < CLICK_TRACKS; j++) drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; get_plugin_path (path2, sizeof path2 / sizeof (TCHAR), L"floppysounds"); _stprintf (tmp, L"%sdrive_click_%s", - path2, currprefs.dfxclickexternal[i]); + path2, fs->dfxclickexternal); v = loadsample (tmp, &drvs[i][DS_CLICK]); if (v) processclicks (&drvs[i][DS_CLICK]); _stprintf (tmp, L"%sdrive_spin_%s", - path2, currprefs.dfxclickexternal[i]); + path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SPIN]); _stprintf (tmp, L"%sdrive_spinnd_%s", - path2, currprefs.dfxclickexternal[i]); + path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SPINND]); _stprintf (tmp, L"%sdrive_startup_%s", - path2, currprefs.dfxclickexternal[i]); + path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_START]); _stprintf (tmp, L"%sdrive_snatch_%s", - path2, currprefs.dfxclickexternal[i]); + path2, fs->dfxclickexternal); v += loadsample (tmp, &drvs[i][DS_SNATCH]); } if (v == 0) { int j; for (j = 0; j < DS_END; j++) freesample (&drvs[i][j]); - currprefs.dfxclick[i] = changed_prefs.dfxclick[i] = 0; + fs->dfxclick = changed_prefs.floppyslots[i].dfxclick = 0; } else { vv++; } @@ -239,7 +240,7 @@ static int driveclick_active (void) { int i; for (i = 0; i < 4; i++) { - if (currprefs.dfxclick[i]) { + if (currprefs.floppyslots[i].dfxclick) { if (drv_spinning[i] || drv_starting[i]) return 1; } @@ -253,7 +254,7 @@ STATIC_INLINE uae_s16 getsample (void) int div = 0, i; for (i = 0; i < 4; i++) { - if (currprefs.dfxclick[i]) { + if (currprefs.floppyslots[i].dfxclick) { struct drvsample *ds_start = &drvs[i][DS_START]; struct drvsample *ds_spin = drv_has_disk[i] ? &drvs[i][DS_SPIN] : &drvs[i][DS_SPINND]; struct drvsample *ds_click = &drvs[i][DS_CLICK]; @@ -422,14 +423,14 @@ void driveclick_click (int drive, int cyl) if (!click_initialized) return; - if (!currprefs.dfxclick[drive]) + if (!currprefs.floppyslots[drive].dfxclick) return; if (prevcyl[drive] == 0 && cyl == 0) // "noclick" check return; dr_audio_activate (); prevcyl[drive] = cyl; if (!wave_initialized) { - driveclick_fdrawcmd_seek (currprefs.dfxclick[drive] - 2, cyl); + driveclick_fdrawcmd_seek (currprefs.floppyslots[drive].dfxclick - 2, cyl); return; } mix (); @@ -441,10 +442,10 @@ void driveclick_motor (int drive, int running) { if (!click_initialized) return; - if (!currprefs.dfxclick[drive]) + if (!currprefs.floppyslots[drive].dfxclick) return; if (!wave_initialized) { - driveclick_fdrawcmd_motor (currprefs.dfxclick[drive] - 2, running); + driveclick_fdrawcmd_motor (currprefs.floppyslots[drive].dfxclick - 2, running); return; } mix (); @@ -471,7 +472,7 @@ void driveclick_insert (int drive, int eject) return; if (!wave_initialized) return; - if (!currprefs.dfxclick[drive]) + if (!currprefs.floppyslots[drive].dfxclick) return; if (eject) drv_has_spun[drive] = 0; @@ -490,19 +491,19 @@ void driveclick_check_prefs (void) if (driveclick_active ()) dr_audio_activate (); if (currprefs.dfxclickvolume != changed_prefs.dfxclickvolume || - currprefs.dfxclick[0] != changed_prefs.dfxclick[0] || - currprefs.dfxclick[1] != changed_prefs.dfxclick[1] || - currprefs.dfxclick[2] != changed_prefs.dfxclick[2] || - currprefs.dfxclick[3] != changed_prefs.dfxclick[3] || - _tcscmp (currprefs.dfxclickexternal[0], changed_prefs.dfxclickexternal[0]) || - _tcscmp (currprefs.dfxclickexternal[1], changed_prefs.dfxclickexternal[1]) || - _tcscmp (currprefs.dfxclickexternal[2], changed_prefs.dfxclickexternal[2]) || - _tcscmp (currprefs.dfxclickexternal[3], changed_prefs.dfxclickexternal[3])) + currprefs.floppyslots[0].dfxclick != changed_prefs.floppyslots[0].dfxclick || + currprefs.floppyslots[1].dfxclick != changed_prefs.floppyslots[1].dfxclick || + currprefs.floppyslots[2].dfxclick != changed_prefs.floppyslots[2].dfxclick || + currprefs.floppyslots[3].dfxclick != changed_prefs.floppyslots[3].dfxclick || + _tcscmp (currprefs.floppyslots[0].dfxclickexternal, changed_prefs.floppyslots[0].dfxclickexternal) || + _tcscmp (currprefs.floppyslots[1].dfxclickexternal, changed_prefs.floppyslots[1].dfxclickexternal) || + _tcscmp (currprefs.floppyslots[2].dfxclickexternal, changed_prefs.floppyslots[2].dfxclickexternal) || + _tcscmp (currprefs.floppyslots[3].dfxclickexternal, changed_prefs.floppyslots[3].dfxclickexternal)) { currprefs.dfxclickvolume = changed_prefs.dfxclickvolume; for (i = 0; i < 4; i++) { - currprefs.dfxclick[i] = changed_prefs.dfxclick[i]; - _tcscpy (currprefs.dfxclickexternal[i], changed_prefs.dfxclickexternal[i]); + currprefs.floppyslots[i].dfxclick = changed_prefs.floppyslots[i].dfxclick; + _tcscpy (currprefs.floppyslots[i].dfxclickexternal, changed_prefs.floppyslots[i].dfxclickexternal); } driveclick_init (); } diff --git a/include/gfxfilter.h b/include/gfxfilter.h index 423817be..73150e5e 100644 --- a/include/gfxfilter.h +++ b/include/gfxfilter.h @@ -7,7 +7,7 @@ typedef unsigned long u32; extern void S2X_refresh (void); extern void S2X_render (void); -extern void S2X_init (int dw, int dh, int aw, int ah, int mult, int ad, int dd); +extern void S2X_init (int dw, int dh, int aw, int ah, int ad, int dd); extern void S2X_free (void); extern int S2X_getmult (void); @@ -49,12 +49,14 @@ extern "C" #define UAE_FILTER_NULL 1 #define UAE_FILTER_SCALE2X 2 -#define UAE_FILTER_HQ 3 -#define UAE_FILTER_SUPEREAGLE 4 -#define UAE_FILTER_SUPER2XSAI 5 -#define UAE_FILTER_2XSAI 6 -#define UAE_FILTER_PAL 7 -#define UAE_FILTER_LAST 7 +#define UAE_FILTER_HQ2X 3 +#define UAE_FILTER_HQ3X 4 +#define UAE_FILTER_HQ4X 5 +#define UAE_FILTER_SUPEREAGLE 6 +#define UAE_FILTER_SUPER2XSAI 7 +#define UAE_FILTER_2XSAI 8 +#define UAE_FILTER_PAL 9 +#define UAE_FILTER_LAST 9 #define UAE_FILTER_MODE_16 16 #define UAE_FILTER_MODE_16_16 16 @@ -68,7 +70,7 @@ struct uae_filter { int type, yuv, intmul; TCHAR *name, *cfgname; - int x[6]; + int flags; }; extern struct uae_filter uaefilters[]; diff --git a/include/options.h b/include/options.h index 76379520..3dfd5d62 100644 --- a/include/options.h +++ b/include/options.h @@ -73,8 +73,16 @@ struct cdslot { TCHAR name[MAX_DPATH]; bool inuse; + bool delayed; int type; }; +struct floppyslot +{ + TCHAR df[MAX_DPATH]; + int dfxtype; + int dfxclick; + TCHAR dfxclickexternal[256]; +}; struct wh { int x, y; @@ -276,8 +284,6 @@ struct uae_prefs { bool cs_dipagnus; bool cs_agnusbltbusybug; - TCHAR df[4][MAX_DPATH]; - TCHAR dfxlist[MAX_SPARE_DRIVES][MAX_DPATH]; TCHAR romfile[MAX_DPATH]; TCHAR romident[256]; TCHAR romextfile[MAX_DPATH]; @@ -332,9 +338,8 @@ struct uae_prefs { struct uaedev_config_info mountconfig[MOUNT_CONFIG_SIZE]; int nr_floppies; - int dfxtype[4]; - int dfxclick[4]; - TCHAR dfxclickexternal[4][256]; + struct floppyslot floppyslots[4]; + TCHAR dfxlist[MAX_SPARE_DRIVES][MAX_DPATH]; int dfxclickvolume; int dfxclickchannelmask; diff --git a/include/zfile.h b/include/zfile.h index 4fef64eb..e7ae0b60 100644 --- a/include/zfile.h +++ b/include/zfile.h @@ -101,6 +101,7 @@ extern const TCHAR *uae_ignoreextensions[]; extern const TCHAR *uae_diskimageextensions[]; extern struct zvolume *zfile_fopen_archive (const TCHAR *filename); +extern struct zvolume *zfile_fopen_archive (const TCHAR *filename, bool norecurse); extern struct zvolume *zfile_fopen_archive_root (const TCHAR *filename); extern void zfile_fclose_archive (struct zvolume *zv); extern int zfile_fs_usage_archive (const TCHAR *path, const TCHAR *disk, struct fs_usage *fsp); @@ -108,6 +109,7 @@ extern int zfile_stat_archive (const TCHAR *path, struct _stat64 *statbuf); extern struct zdirectory *zfile_opendir_archive (const TCHAR *path); extern void zfile_closedir_archive (struct zdirectory *); extern int zfile_readdir_archive (struct zdirectory *, TCHAR*); +extern int zfile_readdir_archive (struct zdirectory *, TCHAR*, bool fullpath); extern void zfile_resetdir_archive (struct zdirectory *); extern int zfile_fill_file_attrs_archive (const TCHAR *path, int *isdir, int *flags, TCHAR **comment); extern uae_s64 zfile_lseek_archive (struct zfile *d, uae_s64 offset, int whence); diff --git a/inputdevice.cpp b/inputdevice.cpp index 5e1e0e00..15074d00 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -2226,7 +2226,7 @@ void handle_cd32_joystick_cia (uae_u8 pra, uae_u8 dra) uae_u8 but = 0x40 << i; uae_u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */ uae_u16 p5dat = 0x0100 << (i * 4); /* data P5 */ - if (!(potgo_value & p5dir) || !(potgo_value & p5dat)) { + if (cd32padmode (p5dir, p5dat)) { if ((dra & but) && (pra & but) != oldstate[i]) { if (!(pra & but)) { cd32_shifter[i]--; @@ -2714,7 +2714,7 @@ void inputdevice_handle_inputcode (void) case AKS_DISKSWAPPER_INSERT1: case AKS_DISKSWAPPER_INSERT2: case AKS_DISKSWAPPER_INSERT3: - _tcscpy (changed_prefs.df[code - AKS_DISKSWAPPER_INSERT0], currprefs.dfxlist[swapperslot]); + _tcscpy (changed_prefs.floppyslots[code - AKS_DISKSWAPPER_INSERT0].df, currprefs.dfxlist[swapperslot]); config_changed = 1; break; diff --git a/main.cpp b/main.cpp index 1917238e..702b818d 100644 --- a/main.cpp +++ b/main.cpp @@ -309,10 +309,10 @@ void fixup_prefs (struct uae_prefs *p) if (p->nr_floppies < 0 || p->nr_floppies > 4) { write_log (L"Invalid number of floppies. Using 4.\n"); p->nr_floppies = 4; - p->dfxtype[0] = 0; - p->dfxtype[1] = 0; - p->dfxtype[2] = 0; - p->dfxtype[3] = 0; + p->floppyslots[0].dfxtype = 0; + p->floppyslots[1].dfxtype = 0; + p->floppyslots[2].dfxtype = 0; + p->floppyslots[3].dfxtype = 0; err = 1; } if (p->floppy_speed > 0 && p->floppy_speed < 10) { diff --git a/newcpu.cpp b/newcpu.cpp index bc703f3f..2962088e 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -2792,20 +2792,20 @@ static void out_cd32io (uae_u32 pc) { case 0xe57cc0: case 0xf04c34: - _stprintf (out, "opendevice"); + _stprintf (out, L"opendevice"); break; case 0xe57ce6: case 0xf04c56: - _stprintf (out, "closedevice"); + _stprintf (out, L"closedevice"); break; case 0xe57e44: case 0xf04f2c: - _stprintf (out, "beginio"); + _stprintf (out, L"beginio"); ioreq = 1; break; case 0xe57ef2: case 0xf0500e: - _stprintf (out, "abortio"); + _stprintf (out, L"abortio"); ioreq = -1; break; } @@ -2819,7 +2819,7 @@ static void out_cd32io (uae_u32 pc) if (ioreq) { static int cnt = 0; int cmd = get_word (request + 28); -#if 1 +#if 0 if (cmd == 37) { cnt--; if (cnt <= 0) @@ -3032,7 +3032,7 @@ static void opcodedebug (uae_u32 pc, uae_u16 opcode) if (!fault) { TCHAR buf[100]; write_log (L"mmufixup=%d %04x %04x\n", mmufixup[0].reg, regs.wb3_status, regs.mmu_ssw); - m68k_disasm_2 (buf, 100, addr, NULL, 1, NULL, NULL, 0); + m68k_disasm_2 (buf, sizeof buf / sizeof (TCHAR), addr, NULL, 1, NULL, NULL, 0); write_log (L"%s\n", buf); m68k_dumpstate (stdout, NULL); } diff --git a/od-win32/avioutput.cpp b/od-win32/avioutput.cpp index 4841d403..194a2239 100644 --- a/od-win32/avioutput.cpp +++ b/od-win32/avioutput.cpp @@ -922,7 +922,7 @@ void AVIOutput_WriteVideo (void) v = getFromBuffer (ae, 1); } else { #if defined (GFXFILTER) - if (!usedfilter || (usedfilter && usedfilter->x[0]) || WIN32GFX_IsPicassoScreen ()) + if (!usedfilter || WIN32GFX_IsPicassoScreen ()) v = getFromDC (ae); else v = getFromBuffer (ae, 0); diff --git a/od-win32/blkdev_win32_aspi.cpp b/od-win32/blkdev_win32_aspi.cpp index ac1d4b34..15a675b5 100644 --- a/od-win32/blkdev_win32_aspi.cpp +++ b/od-win32/blkdev_win32_aspi.cpp @@ -770,6 +770,8 @@ static uae_u8 *execscsicmd_out (int unitnum, uae_u8 *data, int len) SCSI *scgp = si[unitnum].handle; int v; + if (!scgp) + return NULL; uae_sem_wait (&scgp_sem); memset(scgp->scmd, 0, sizeof(struct scg_cmd)); scgp->scmd->cdb_len = len; @@ -795,6 +797,8 @@ static uae_u8 *execscsicmd_in (int unitnum, uae_u8 *data, int len, int *outlen) SCSI *scgp = si[unitnum].handle; int v; + if (!scgp) + return NULL; uae_sem_wait (&scgp_sem); memset(scgp->scmd, 0, sizeof(struct scg_cmd)); scgp->scmd->cdb_len = len; @@ -812,7 +816,7 @@ static uae_u8 *execscsicmd_in (int unitnum, uae_u8 *data, int len, int *outlen) aspi_led (unitnum); uae_sem_post (&scgp_sem); if (v) - return 0; + return NULL; if (outlen) *outlen = scgp->scmd->size; return si[unitnum].buf; diff --git a/od-win32/clipboard_win32.cpp b/od-win32/clipboard_win32.cpp index 7ff7a03f..a739d40b 100644 --- a/od-win32/clipboard_win32.cpp +++ b/od-win32/clipboard_win32.cpp @@ -239,7 +239,8 @@ static void to_iff_ilbm (HBITMAP hbmp) w = bmp.bmWidth; h = bmp.bmHeight; bpp = bmp.bmBitsPixel; - if (bpp < 8) + + if (bpp != 8 && bpp != 32) return; bmpw = (w * bpp / 8 + 3) & ~3; size = bmpw * h; @@ -363,7 +364,7 @@ static void to_iff_ilbm (HBITMAP hbmp) p += ((w + 15) & ~15) / 8; } } - } else { + } else if (bpp == 32) { for (y = 0; y < h; y++) { uae_u32 *s = (uae_u32*)(((uae_u8*)bmp.bmBits) + y * bmpw); int b, bb; diff --git a/od-win32/debug_win32.cpp b/od-win32/debug_win32.cpp index 26431382..9c6db138 100644 --- a/od-win32/debug_win32.cpp +++ b/od-win32/debug_win32.cpp @@ -518,7 +518,7 @@ static void ShowBreakpoints(void) for (i = 0; i < BREAKPOINT_TOTAL; i++) { if (!bpnodes[i].enabled) continue; - m68k_disasm_2(outbp, sizeof(outbp), bpnodes[i].addr, NULL, 1, NULL, NULL, 0); + m68k_disasm_2(outbp, sizeof outbp / sizeof (TCHAR), bpnodes[i].addr, NULL, 1, NULL, NULL, 0); ULBS(outbp); got = 1; } @@ -531,7 +531,7 @@ static void ShowBreakpoints(void) for (i = 0; i < MEMWATCH_TOTAL; i++) { if (mwnodes[i].size == 0) continue; - memwatch_dump2(outw, sizeof(outw), i); + memwatch_dump2(outw, sizeof outw / sizeof (TCHAR), i); ULBS(outw); got = 1; } @@ -620,7 +620,7 @@ static void ShowDasm(int direction) lines_old = SendMessage(hDasm, LB_GETCOUNT, 0, 0); lines_new = GetLBOutputLines(hDasm); for (i = 0; i < lines_new; i++) { - m68k_disasm_2(out, sizeof(out), addr, &addr, 1, NULL, NULL, 0); + m68k_disasm_2(out, sizeof out / sizeof (TCHAR), addr, &addr, 1, NULL, NULL, 0); if (addr > dbgpage[currpage].dasmaddr) UpdateListboxString(hDasm, i, out, FALSE); else diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index 02f486bf..f17f7556 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -9,6 +9,7 @@ #define EFFECT_VERSION 2 #define D3DX9DLL L"d3dx9_43.dll" +#define TWOPASS 1 #include "options.h" #include "xwin.h" @@ -64,9 +65,9 @@ static D3DXMATRIX postproj; static D3DXVECTOR4 maskmult, maskshift; static int ledwidth, ledheight; -static int twidth, theight, max_texture_w, max_texture_h; -static int tin_w, tin_h, window_h, window_w; -static int t_depth, mult; +static int max_texture_w, max_texture_h; +static int tin_w, tin_h, tout_w, tout_h, window_h, window_w; +static int t_depth, mult, multx; static int required_sl_texture_w, required_sl_texture_h; static int vsync2, guimode; static int resetcount; @@ -89,12 +90,12 @@ static void ddraw_fs_hack_free (void) if (!ddraw_fs) return; if (ddraw_fs == 2) - IDirectDraw7_RestoreDisplayMode (ddraw); - hr = IDirectDraw7_SetCooperativeLevel (ddraw, d3dhwnd, DDSCL_NORMAL); + ddraw->RestoreDisplayMode (); + hr = ddraw->SetCooperativeLevel (d3dhwnd, DDSCL_NORMAL); if (FAILED (hr)) { write_log (L"IDirectDraw7_SetCooperativeLevel CLEAR: %s\n", DXError (hr)); } - IDirectDraw7_Release (ddraw); + ddraw->Release (); ddraw = NULL; ddraw_fs = 0; @@ -115,13 +116,13 @@ static int ddraw_fs_hack_init (void) return 0; } ddraw_fs = 1; - hr = IDirectDraw7_SetCooperativeLevel (ddraw, d3dhwnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + hr = ddraw->SetCooperativeLevel (d3dhwnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (FAILED (hr)) { write_log (L"IDirectDraw7_SetCooperativeLevel SET: %s\n", DXError (hr)); ddraw_fs_hack_free (); return 0; } - hr = IDirectDraw7_SetDisplayMode (ddraw, dpp.BackBufferWidth, dpp.BackBufferHeight, t_depth, dpp.FullScreen_RefreshRateInHz, 0); + hr = ddraw->SetDisplayMode (dpp.BackBufferWidth, dpp.BackBufferHeight, t_depth, dpp.FullScreen_RefreshRateInHz, 0); if (FAILED (hr)) { write_log (L"IDirectDraw7_SetDisplayMode: %s\n", DXError (hr)); ddraw_fs_hack_free (); @@ -179,11 +180,14 @@ static TCHAR *D3DX_ErrorString (HRESULT hr, LPD3DXBUFFER Errors) static TCHAR buffer[1000]; TCHAR *s = NULL; + buffer[0] = 0; if (Errors) s = au ((char*)Errors->GetBufferPointer ()); - _tcscpy (buffer, D3D_ErrorString (hr)); + if (hr != S_OK) + _tcscpy (buffer, D3D_ErrorString (hr)); if (s) { - _tcscat (buffer, L" "); + if (buffer[0]) + _tcscat (buffer, L" "); _tcscat (buffer, s); } xfree (s); @@ -264,8 +268,12 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX INT Depth = D3DX_DEFAULT; hParam = effect->GetParameter (NULL, iParam); - effect->GetParameterDesc (hParam, &ParamDesc); - + hr = effect->GetParameterDesc (hParam, &ParamDesc); + if (FAILED (hr)) { + write_log (L"GetParameterDescParm(%d) failed: %s\n", D3DHEAD, iParam, D3DX_ErrorString (hr, NULL)); + return 0; + } + hr = S_OK; if(ParamDesc.Semantic != NULL) { if(ParamDesc.Class == D3DXPC_MATRIX_ROWS || ParamDesc.Class == D3DXPC_MATRIX_COLUMNS) { if(strcmpi(ParamDesc.Semantic, "world") == 0) @@ -287,7 +295,7 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX m_TexelSizeEffectHandle = hParam; } else if(ParamDesc.Class == D3DXPC_SCALAR && ParamDesc.Type == D3DXPT_FLOAT) { if(strcmpi(ParamDesc.Semantic, "SCALING") == 0) - effect->GetFloat(hParam, &m_scale); + hr = effect->GetFloat(hParam, &m_scale); } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_TEXTURE) { if(strcmpi(ParamDesc.Semantic, "SOURCETEXTURE") == 0) m_SourceTextureEffectHandle = hParam; @@ -301,39 +309,52 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX LPCSTR pstrTechnique = NULL; if(strcmpi(ParamDesc.Semantic, "COMBINETECHNIQUE") == 0) { - effect->GetString(hParam, &pstrTechnique); + hr = effect->GetString(hParam, &pstrTechnique); m_CombineTechniqueEffectHandle = effect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE") == 0) { - effect->GetString(hParam, &pstrTechnique); + hr = effect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique1EffectHandle = effect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE1") == 0) { - effect->GetString(hParam, &pstrTechnique); + hr = effect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique2EffectHandle = effect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "NAME") == 0) - effect->GetString(hParam, &m_strName); + hr = effect->GetString(hParam, &m_strName); + } + if (FAILED (hr)) { + write_log (L"ParamDesc.Semantic failed: %s\n", D3DHEAD, D3DX_ErrorString (hr, NULL)); + return 0; } } for(iAnnot = 0; iAnnot < ParamDesc.Annotations; iAnnot++) { hAnnot = effect->GetAnnotation (hParam, iAnnot); - effect->GetParameterDesc(hAnnot, &AnnotDesc); + hr = effect->GetParameterDesc(hAnnot, &AnnotDesc); + if (FAILED (hr)) { + write_log (L"GetParameterDescAnnot(%d) failed: %s\n", D3DHEAD, iAnnot, D3DX_ErrorString (hr, NULL)); + return 0; + } + hr = S_OK; if(strcmpi(AnnotDesc.Name, "name") == 0) - effect->GetString(hAnnot, &pstrName); + hr = effect->GetString(hAnnot, &pstrName); else if(strcmpi(AnnotDesc.Name, "function") == 0) - effect->GetString(hAnnot, &pstrFunction); + hr = effect->GetString(hAnnot, &pstrFunction); else if(strcmpi(AnnotDesc.Name, "target") == 0) - effect->GetString(hAnnot, &pstrTarget); + hr = effect->GetString(hAnnot, &pstrTarget); else if(strcmpi(AnnotDesc.Name, "width") == 0) - effect->GetInt(hAnnot, &Width); + hr = effect->GetInt(hAnnot, &Width); else if(strcmpi(AnnotDesc.Name, "height") == 0) - effect->GetInt(hAnnot, &Height); + hr = effect->GetInt(hAnnot, &Height); else if(strcmpi(AnnotDesc.Name, "depth") == 0) - effect->GetInt(hAnnot, &Depth); + hr = effect->GetInt(hAnnot, &Depth); else if(strcmpi(AnnotDesc.Name, "type") == 0) - effect->GetString(hAnnot, &pstrTextureType); + hr = effect->GetString(hAnnot, &pstrTextureType); + if (FAILED (hr)) { + write_log (L"GetString/GetInt(%d) failed: %s\n", D3DHEAD, iAnnot, D3DX_ErrorString (hr, NULL)); + return 0; + } } if(pstrFunction != NULL) { @@ -725,6 +746,7 @@ static LPD3DXEFFECT psEffect_LoadEffect (const TCHAR *shaderfile, int full) } } } else { + write_log (L"%s: Attempting to load '%s'\n", D3DHEAD, tmp); hr = D3DXCreateEffectCompilerFromFile (tmp, NULL, NULL, compileflags, &EffectCompiler, &Errors); if (FAILED (hr)) { write_log (L"%s: D3DXCreateEffectCompilerFromFile failed: %s\n", D3DHEAD, D3DX_ErrorString (hr, Errors)); @@ -732,14 +754,21 @@ static LPD3DXEFFECT psEffect_LoadEffect (const TCHAR *shaderfile, int full) } } + if (Errors) { + write_log (L"%s: '%s' warning: %s\n", D3DHEAD, shaderfile, D3DX_ErrorString (hr, Errors)); + Errors->Release(); + Errors = NULL; + } + hr = EffectCompiler->CompileEffect (0, &BufferEffect, &Errors); if (FAILED (hr)) { write_log (L"%s: CompileEffect failed: %s\n", D3DHEAD, D3DX_ErrorString (hr, Errors)); goto end; } + void *bp = BufferEffect->GetBufferPointer (); + int bplen = BufferEffect->GetBufferSize (); hr = D3DXCreateEffect (d3ddev, - BufferEffect->GetBufferPointer (), - BufferEffect->GetBufferSize (), + bp, bplen, NULL, NULL, 0, NULL, &effect, &Errors); @@ -747,7 +776,11 @@ static LPD3DXEFFECT psEffect_LoadEffect (const TCHAR *shaderfile, int full) write_log (L"%s: D3DXCreateEffect failed: %s\n", D3DHEAD, D3DX_ErrorString (hr, Errors)); goto end; } - effect->GetDesc (&EffectDesc); + hr = effect->GetDesc (&EffectDesc); + if (FAILED (hr)) { + write_log (L"%s: effect->GetDesc() failed: %s\n", D3DHEAD, D3DX_ErrorString (hr, Errors)); + goto end; + } if (full) { if (!psEffect_ParseParameters (EffectCompiler, effect)) goto end; @@ -1000,29 +1033,36 @@ static LPDIRECT3DTEXTURE9 createtext (int w, int h, D3DFORMAT format) return t; } -static int createtexture (int w, int h) +static int createtexture (int iw, int ih, int ow, int oh, int win_w, int win_h) { HRESULT hr; - texture = createtext (w, h, tformat); + texture = createtext (iw, ih, tformat); if (!texture) return 0; - twidth = w; - theight = h; - write_log (L"%s: %d*%d texture allocated, bits per pixel %d\n", D3DHEAD, w, h, t_depth); + write_log (L"%s: %d*%d texture allocated, bits per pixel %d\n", D3DHEAD, iw, ih, t_depth); + int w, h; + if (ow > win_w * multx && oh > win_h * multx) { + w = ow; + h = oh; + } else { + w = win_w * multx; + h = win_h * multx; + } if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpTempTexture, NULL))) { write_log (L"%s: Failed to create working texture1: %s\n", D3DHEAD, D3D_ErrorString (hr)); return 0; } + write_log (L"%s: %d*%d working texture allocated, bits per pixel %d\n", D3DHEAD, w, h, t_depth); if (psActive) { D3DLOCKED_BOX lockedBox; - if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, + if (FAILED (hr = d3ddev->CreateTexture (iw, ih, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpWorkTexture1, NULL))) { write_log (L"%s: Failed to create temp texture: %s\n", D3DHEAD, D3D_ErrorString (hr)); return 0; } - if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, + if (FAILED (hr = d3ddev->CreateTexture (iw, ih, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpWorkTexture2, NULL))) { write_log (L"%s: Failed to create working texture2: %s\n", D3DHEAD, D3D_ErrorString (hr)); return 0; @@ -1036,7 +1076,7 @@ static int createtexture (int w, int h) write_log (L"%s: Failed to lock box of volume texture: %s\n", D3DHEAD, D3D_ErrorString (hr)); return 0; } - BuildHq2xLookupTexture (w, h, w, h, (unsigned char*)lockedBox.pBits); + BuildHq2xLookupTexture (w, h, iw, ih, (unsigned char*)lockedBox.pBits); lpHq2xLookupTexture->UnlockBox (0); } @@ -1336,7 +1376,7 @@ static void setupscenecoords (void) float dw, dh; static RECT sr2, dr2, zr2; - //write_log (L"%dx%d %dx%d %dx%d\n", twidth, theight, tin_w, tin_h, window_w, window_h); + //write_log (L"%dx%d %dx%d %dx%d\n", tin_w, tin_h, tin_w, tin_h, window_w, window_h); getfilterrect2 (&dr, &sr, &zr, window_w, window_h, tin_w / mult, tin_h / mult, mult, tin_w, tin_h); @@ -1357,7 +1397,6 @@ static void setupscenecoords (void) w = sr.right - sr.left; h = sr.bottom - sr.top; - //write_log (L"%.1fx%.1f %.1fx%.1f\n", dw, dh, w, h); MatrixOrthoOffCenterLH (&m_matProj, 0, w, 0, h, 0.0f, 1.0f); @@ -1366,13 +1405,47 @@ static void setupscenecoords (void) +0.5f + dh * tin_h / window_h / 2 - zr.top - (tin_h - 2 * zr.top - h) + sr.top, // <- ??? 0); - float sw = dw * tin_w / window_w + 0.5f; - float sh = dh * tin_h / window_h + 0.5f; + float sw = dw * tin_w / window_w; + float sh = dh * tin_h / window_h; MatrixScaling (&m_matWorld, sw, sh, 1.0f); +#if 0 + + MatrixOrthoOffCenterLH (&m_matProj, 0, w, 0, h, 0.0f, 1.0f); + + float ww = dw * tin_w / window_w; + float hh = dh * tin_h / window_h; + + MatrixTranslation (&m_matView, + -0.5f + ww / 2 - zr.left - sr.left, // - (tin_w - 2 * zr.left - w), + 0.5f + hh / 2- zr.top - (tin_h - 2 * zr.top - h) + sr.top, // <- ??? + 0); + + MatrixOrthoOffCenterLH (&m_matProj, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); + MatrixOrthoOffCenterLH (&m_matProj, 0, dw, 0, dh, 0.0f, 1.0f); + + float mx = w / ww; + float my = h / hh; + + MatrixTranslation (&m_matView, 0.5f - 0.5f / window_w, 0.5f + 0.5f / window_h, 0.0f); + MatrixTranslation (&m_matView, + 0.5f + (dw / 2) - (zr.left - sr.left), + 0.5f + (dh / 2) - (zr.top - (tin_h - 2 * zr.top - h) + sr.top) * 0, // <- ??? + 0); + + + MatrixScaling (&m_matWorld, ww / w * dw, hh / h * dh, 1.0f); +#endif + + + //write_log (L"%.1fx%.1f %.1fx%.1f %.1fx%.1f\n", dw, dh, w, h, ww, hh); + + float ww = dw * tin_w / window_w; + float hh = dh * tin_h / window_h; + // ratio between Amiga texture and overlay texture - maskmult.x = sw * maskmult_x / w; - maskmult.y = sh * maskmult_y / h; + maskmult.x = ww * maskmult_x / w; + maskmult.y = hh * maskmult_y / h; maskshift.x = 1.0f / maskmult_x; maskshift.y = 1.0f / maskmult_y; @@ -1390,7 +1463,7 @@ uae_u8 *getfilterbuffer3d (int *widthp, int *heightp, int *pitch, int *depth) int w, h; *depth = t_depth; - getfilterrect2 (&dr, &sr, &zr, window_w, window_h, tin_w, tin_h, mult, tin_w, tin_h); + getfilterrect2 (&dr, &sr, &zr, window_w, window_h, tin_w / mult, tin_h / mult, mult, tin_w, tin_h); w = sr.right - sr.left; h = sr.bottom - sr.top; p = gfxvidinfo.bufmem; @@ -1408,8 +1481,8 @@ static void createvertex (void) struct TLVERTEX *vertices; float sizex, sizey; - sizex = 1.0; - sizey = 1.0; + sizex = 1.0f; + sizey = 1.0f; if (FAILED (hr = vertexBuffer->Lock (0, 0, (void**)&vertices, 0))) { write_log (L"%s: Vertexbuffer lock failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); return; @@ -1448,10 +1521,14 @@ static void settransform (void) // Projection is (0,0,0) -> (1,1,1) MatrixOrthoOffCenterLH (&m_matPreProj, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); // Align texels with pixels - MatrixTranslation (&m_matPreView, -0.5f / twidth, 0.5f / theight, 0.0f); + MatrixTranslation (&m_matPreView, -0.5f / tin_w, 0.5f / tin_h, 0.0f); // Identity for world D3DXMatrixIdentity (&m_matPreWorld); psEffect_SetMatrices (&m_matProj, &m_matView, &m_matWorld); + + MatrixOrthoOffCenterLH (&m_matProj2, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); + MatrixTranslation (&m_matView2, 0.5f - 0.5f / window_w, 0.5f + 0.5f / window_h, 0.0f); + D3DXMatrixIdentity (&m_matWorld2); } static void invalidatedeviceobjects (void) @@ -1539,7 +1616,7 @@ static int restoredeviceobjects (void) HRESULT hr; invalidatedeviceobjects (); - while (shaderon) { + while (shaderon > 0) { postEffect = psEffect_LoadEffect (psEnabled ? L"_winuae.fx" : L"_winuae_old.fx", false); if (!postEffect) { shaderon = 0; @@ -1548,7 +1625,6 @@ static int restoredeviceobjects (void) if (currprefs.gfx_filtershader[0]) { if (!(pEffect = psEffect_LoadEffect (currprefs.gfx_filtershader, true))) { currprefs.gfx_filtershader[0] = changed_prefs.gfx_filtershader[0] = 0; - shaderon = 0; break; } } @@ -1564,7 +1640,7 @@ static int restoredeviceobjects (void) createmask2texture (currprefs.gfx_filteroverlay); - if (!createtexture (tin_w, tin_h)) + if (!createtexture (tin_w, tin_h, tout_w, tout_h, window_w, window_h)) return 0; createledtexture (); @@ -1625,7 +1701,7 @@ void D3D_free (void) ddraw_fs_hack_free (); } -const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth) +const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth, int mmult) { HRESULT ret, hr; static TCHAR errmsg[100] = { 0 }; @@ -1779,7 +1855,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth write_log (L"%s\n", errmsg); write_log (L"%s: Retrying fullscreen with DirectDraw\n", D3DHEAD); if (ddraw_fs_hack_init ()) { - const TCHAR *err2 = D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth); + const TCHAR *err2 = D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth, mult); if (err2) ddraw_fs_hack_free (); return err2; @@ -1788,7 +1864,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth if (d3d_ex && D3DEX) { write_log (L"%s\n", errmsg); D3DEX = 0; - return D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth); + return D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth, mult); } D3D_free (); return errmsg; @@ -1829,20 +1905,25 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth if ((d3dCaps.PixelShaderVersion < D3DPS_VERSION(3,0) || d3dCaps.VertexShaderVersion < D3DVS_VERSION(3,0) || !psEnabled || max_texture_w < 4096 || max_texture_h < 4096 || !shaderon) && d3d_ex) { D3DEX = 0; write_log (L"Disabling D3D9Ex\n"); - return D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth); + return D3D_init (ahwnd, w_w, w_h, t_w, t_h, depth, mult); } if (!shaderon) write_log (L"Using non-shader version\n"); + multx = mmult; mult = S2X_getmult (); - t_w *= mult; - t_h *= mult; + tin_w = t_w * mult; + tin_h = t_h * mult; + tout_w = tin_w * multx; + tout_h = tin_h * multx; - if (max_texture_w < t_w || max_texture_h < t_h) { + if (max_texture_w < w_w || max_texture_h < w_h) { _stprintf (errmsg, L"%s: %d * %d or bigger texture support required\nYour card's maximum texture size is only %d * %d", D3DHEAD, t_w, t_h, max_texture_w, max_texture_h); return errmsg; } + while (multx > 1 && (w_w * multx > max_texture_w || w_h * multx > max_texture_h)) + multx--; required_sl_texture_w = w_w; required_sl_texture_h = w_h; @@ -1868,15 +1949,9 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth } window_w = w_w; window_h = w_h; - tin_w = t_w; - tin_h = t_h; changed_prefs.leds_on_screen = currprefs.leds_on_screen = currprefs.leds_on_screen | STATUSLINE_TARGET; - MatrixOrthoOffCenterLH (&m_matProj2, 0, window_w, 0, window_h, 0.0f, 1.0f); - MatrixTranslation (&m_matView2, -0.5f + window_w / 2, 0.5f + window_h / 2, 0); - MatrixScaling (&m_matWorld2, window_w, window_h, 1.0f); - if (!restoredeviceobjects ()) { D3D_free (); _stprintf (errmsg, L"%s: initialization failed.", D3DHEAD); @@ -1971,15 +2046,13 @@ static void D3D_render22 (void) if (!isd3d ()) return; - setupscenecoords (); - hr = d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, d3ddebug ? 0x80 : 0, 0), 0, 0); if (FAILED (hr = d3ddev->BeginScene ())) { write_log (L"%s: BeginScene: %s\n", D3DHEAD, D3D_ErrorString (hr)); return; } - if (shaderon && postEffect) { + if (shaderon > 0 && postEffect) { if (psActive) { LPDIRECT3DSURFACE9 lpRenderTarget; LPDIRECT3DSURFACE9 lpNewRenderTarget; @@ -2014,27 +2087,27 @@ static void D3D_render22 (void) } psEffect_End (pEffect); } + if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget))) + write_log (L"%s: Effect RenderTarget reset failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); + lpNewRenderTarget->Release (); + lpNewRenderTarget = NULL; if (psEffect_hasPreProcess2 () && lpWorkTexture == lpWorkTexture1) { lpWorkTexture = lpWorkTexture2; - lpNewRenderTarget->Release (); - lpNewRenderTarget = NULL; goto pass2; } - if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget))) - write_log (L"%s: Effect RenderTarget reset failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); lpRenderTarget->Release (); lpRenderTarget = NULL; - lpNewRenderTarget->Release (); - lpNewRenderTarget = NULL; } psEffect_SetMatrices (&m_matProj2, &m_matView2, &m_matWorld2); +#if TWOPASS if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget))) write_log (L"%s: GetRenderTarget: %s\n", D3DHEAD, D3D_ErrorString (hr)); if (FAILED (hr = lpTempTexture->GetSurfaceLevel (0, &lpNewRenderTarget))) write_log (L"%s: GetSurfaceLevel: %s\n", D3DHEAD, D3D_ErrorString (hr)); if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget))) write_log (L"%s: SetRenderTarget: %s\n", D3DHEAD, D3D_ErrorString (hr)); +#endif hr = d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, d3ddebug ? 0x80 : 0), 0, 0); uPasses = 0; @@ -2048,11 +2121,12 @@ static void D3D_render22 (void) } psEffect_End (pEffect); } - +#if TWOPASS if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget))) write_log (L"%s: SetRenderTarget: %s\n", D3DHEAD, D3D_ErrorString (hr)); lpNewRenderTarget->Release (); lpRenderTarget->Release (); +#endif srctex = lpTempTexture; } else { @@ -2061,6 +2135,10 @@ static void D3D_render22 (void) } + } +#if TWOPASS + if (shaderon > 0 && postEffect) { + if (masktexture) { if (FAILED (hr = postEffect->SetTechnique (postTechnique))) write_log (L"%s: SetTechnique(postTechnique) failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); @@ -2099,10 +2177,11 @@ static void D3D_render22 (void) } else { // non-shader version + setupscenecoords (); hr = d3ddev->SetTransform (D3DTS_PROJECTION, &m_matProj); hr = d3ddev->SetTransform (D3DTS_VIEW, &m_matView); hr = d3ddev->SetTransform (D3DTS_WORLD, &m_matWorld); - hr = d3ddev->SetTexture (0, texture); + hr = d3ddev->SetTexture (0, srctex); hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 0, 2); int bl = currprefs.gfx_filter_bilinear ? D3DTEXF_LINEAR : D3DTEXF_POINT; hr = d3ddev->SetSamplerState (0, D3DSAMP_MINFILTER, bl); @@ -2123,7 +2202,7 @@ static void D3D_render22 (void) if (cursorsurfaced3d && cursor_v) { D3DXMATRIX t; - MatrixScaling (&t, ((float)(window_w) / (tin_w + 2 * cursor_offset_x)), ((float)(window_h) / (tin_h + 2 * cursor_offset_y)), 0); + MatrixScaling (&t, ((float)(window_w) / (tout_w + 2 * cursor_offset_x)), ((float)(window_h) / (tout_h + 2 * cursor_offset_y)), 0); v.x = cursor_x + cursor_offset_x; v.y = cursor_y + cursor_offset_y; v.z = 0; @@ -2185,7 +2264,7 @@ static void D3D_render22 (void) } sprite->End (); } - +#endif hr = d3ddev->EndScene (); if (FAILED (hr)) @@ -2238,9 +2317,9 @@ void D3D_flushtexture (int miny, int maxy) RECT r; maxy++; r.left = 0; - r.right = twidth; + r.right = tin_w; r.top = miny <= 0 ? 0 : miny; - r.bottom = maxy <= theight ? maxy : theight; + r.bottom = maxy <= tin_h ? maxy : tin_h; if (r.top <= r.bottom) { HRESULT hr = texture->AddDirtyRect (&r); if (FAILED (hr)) diff --git a/od-win32/direct3d.h b/od-win32/direct3d.h index 4f5c3a6e..04d5d64c 100644 --- a/od-win32/direct3d.h +++ b/od-win32/direct3d.h @@ -1,6 +1,6 @@ extern void D3D_resize (int width, int height); extern void D3D_free (void); -extern const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth); +extern const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth, int mult); extern void D3D_getpixelformat (int depth,int *rb, int *bb, int *gb, int *rs, int *bs, int *gs, int *ab, int *ar, int *a); extern void D3D_refresh (void); extern void D3D_flip (void); diff --git a/od-win32/keyboard_win32.cpp b/od-win32/keyboard_win32.cpp index 7fdd8f07..f5bdf926 100644 --- a/od-win32/keyboard_win32.cpp +++ b/od-win32/keyboard_win32.cpp @@ -362,10 +362,10 @@ void my_kbd_handler (int keyboard, int scancode, int newstate) } else { int i; for (i = 0; i < 4; i++) { - if (!_tcscmp (currprefs.df[i], currprefs.dfxlist[num])) - changed_prefs.df[i][0] = 0; + if (!_tcscmp (currprefs.floppyslots[i].df, currprefs.dfxlist[num])) + changed_prefs.floppyslots[i].df[0] = 0; } - _tcscpy (changed_prefs.df[swapperdrive], currprefs.dfxlist[num]); + _tcscpy (changed_prefs.floppyslots[swapperdrive].df, currprefs.dfxlist[num]); config_changed = 1; } } diff --git a/od-win32/lib/prowizard.lib b/od-win32/lib/prowizard.lib index 9ad0d0d779b30077fd9e02230eda5d914cfd6205..46893986b29ce1ab37692f7b85ad71f85feded90 100644 GIT binary patch delta 52735 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±<>90hX!9=(;B^O(Iw?6v8S__}Iv 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 Jd7W_`{s+fsxD@~Z delta 53444 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 3) & 3; - if (ver == 1) + if (ver == 1) { + write_log (L"MP3: ver==1?!\n"); return 0; + } if (ver == 0) ver = 2; else if (ver == 2) @@ -240,13 +242,17 @@ uae_u32 mp3decoder::getsize (struct zfile *zf) else if (ver == 3) ver = 0; layer = 4 - ((header[1] >> 1) & 3); - if (layer == 4) + if (layer == 4) { + write_log (L"MP3: layer==4?!\n"); return 0; + } iscrc = ((header[1] >> 0) & 1) ? 0 : 2; bitrateidx = (header[2] >> 4) & 15; freq = mp3_frequencies[(header[2] >> 2) & 3]; - if (!freq) + if (!freq) { + write_log (L"MP3: reserved frequency?!\n"); return 0; + } channelmode = (header[3] >> 6) & 3; isstereo = channelmode != 3; if (ver == 0) { @@ -258,14 +264,18 @@ uae_u32 mp3decoder::getsize (struct zfile *zf) bitindex = 4; } bitrate = mp3_bitrates[bitindex * 16 + bitrateidx] * 1000; - if (bitrate <= 0) + if (bitrate <= 0) { + write_log (L"MP3: reserved bitrate?!\n"); return 0; + } padding = (header[2] >> 1) & 1; samplerate = mp3_samplesperframe[(layer - 1) * 3 + ver]; framelen = ((samplerate / 8 * bitrate) / freq) + padding; - if (framelen <= 4) + if (framelen <= 4) { + write_log (L"MP3: too small frame size?!\n"); return 0; - zfile_fseek(zf, framelen + iscrc - 4, SEEK_CUR); + } + zfile_fseek(zf, framelen - 4, SEEK_CUR); frames++; if (timelen > 0) { size = ((uae_u64)timelen * freq * 2 * (isstereo ? 2 : 1)) / 1000; diff --git a/od-win32/resources/resource b/od-win32/resources/resource index b366c9ed..ce6eb8d9 100644 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -262,6 +262,7 @@ #define IDS_QS_CD_IMAGE 267 #define IDS_REMAPTITLE 268 #define IDS_FILTER_NOOVERLAYS 269 +#define IDS_STMENUNOCD 270 #define IDS_NUMSG_NEEDEXT2 300 #define IDS_NUMSG_NOROMKEY 301 #define IDS_NUMSG_KSROMCRCERROR 302 @@ -1018,7 +1019,6 @@ #define IDC_RTG_24BIT 1789 #define IDC_ASSOCIATELIST 1789 #define IDC_PORT_TABLET 1789 -#define IDC_PATHS_CONFIGCACHE2 1789 #define IDC_PATHS_RELATIVE 1789 #define IDC_RTG_32BIT 1790 #define IDC_ASSOCIATE_OFF 1790 @@ -1084,6 +1084,11 @@ #define ID_DBG_TOGGLEBP 40042 #define ID_DBG_DELETEBPS 40043 #define ID_DBG_SETTOPC 40044 +#define ID_MENU_CDDRIVES 40045 +#define ID_CDDRIVES_EJECT 40046 +#define ID_ST_CDEJECTALL 40047 +#define ID_CDDRIVES_CD 40048 +#define ID_ST_CD0 40049 // Next default values for new objects // @@ -1092,7 +1097,7 @@ #define _APS_NO_MFC 1 #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 356 -#define _APS_NEXT_COMMAND_VALUE 40045 +#define _APS_NEXT_COMMAND_VALUE 40050 #define _APS_NEXT_CONTROL_VALUE 1808 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 805acf16..4cd76b47 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -742,8 +742,8 @@ STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN GROUPBOX "Filter Settings",-1,0,1,295,134 - COMBOBOX IDC_FILTERMODE,20,15,103,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_FILTERFILTER,132,15,83,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERMODE,20,15,149,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILTERFILTER,176,15,39,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,221,15,67,14 RTEXT "Horiz. size:",-1,7,61,46,10,SS_CENTERIMAGE CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,54,152,19 @@ -1110,6 +1110,11 @@ BEGIN MENUITEM "DF2:", ID_ST_DF2 MENUITEM "DF3:", ID_ST_DF3 END + POPUP "CD drives" + BEGIN + MENUITEM "Eject", ID_ST_CDEJECTALL + MENUITEM "CD", ID_ST_CD0 + END MENUITEM "Reset", ID_ST_RESET MENUITEM "Help", ID_ST_HELP MENUITEM "Quit WinUAE", ID_ST_QUIT @@ -1446,6 +1451,7 @@ BEGIN IDS_QS_CD_IMAGE "Image mode" IDS_REMAPTITLE "Input captured. F12 = Exit. F11 = Skip current event in Remap mode." IDS_FILTER_NOOVERLAYS "No overlays available" + IDS_STMENUNOCD "No CD inserted" END STRINGTABLE diff --git a/od-win32/rp.cpp b/od-win32/rp.cpp index 865306d4..872c4221 100644 --- a/od-win32/rp.cpp +++ b/od-win32/rp.cpp @@ -805,7 +805,7 @@ void rp_fixup_options (struct uae_prefs *p) /* floppy drives */ floppy_mask = 0; for (i = 0; i < 4; i++) { - if (p->dfxtype[i] >= 0) + if (p->floppyslots[i].dfxtype >= 0) floppy_mask |= 1 << i; } RPSendMessagex (RPIPCGM_DEVICES, RP_DEVICE_FLOPPY, floppy_mask, NULL, 0, &guestinfo, NULL); diff --git a/od-win32/screenshot.cpp b/od-win32/screenshot.cpp index c1061cd5..be06ab32 100644 --- a/od-win32/screenshot.cpp +++ b/od-win32/screenshot.cpp @@ -347,8 +347,10 @@ int screenshotf (const TCHAR *spath, int mode, int doprepare) fetch_path (L"ScreenshotPath", path, sizeof (path) / sizeof (TCHAR)); CreateDirectory (path, NULL); name[0] = 0; - if (currprefs.dfxtype[0] >= 0) - _tcscpy (name, currprefs.df[0]); + if (currprefs.floppyslots[0].dfxtype >= 0) + _tcscpy (name, currprefs.floppyslots[0].df); + else if (currprefs.cdslots[0].inuse) + _tcscpy (name, currprefs.cdslots[0].name); if (!name[0]) underline[0] = 0; namesplit (name); diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 13ae05e6..ec482f91 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -1211,9 +1211,9 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam, num -= 7; if (nm->code == NM_RCLICK) { disk_eject (num); - } else if (changed_prefs.dfxtype[num] >= 0) { + } else if (changed_prefs.floppyslots[num].dfxtype >= 0) { DiskSelection (hWnd, IDC_DF0 + num, 0, &changed_prefs, 0); - disk_insert (num, changed_prefs.df[num]); + disk_insert (num, changed_prefs.floppyslots[num].df); } } else if (num == 4) { if (nm->code == NM_CLICK) // POWER @@ -1538,6 +1538,15 @@ static LRESULT CALLBACK HiddenWindowProc (HWND hWnd, UINT message, WPARAM wParam case ID_ST_RESET: uae_reset (0); break; + + case ID_ST_CDEJECTALL: + changed_prefs.cdslots[0].name[0] = 0; + changed_prefs.cdslots[0].inuse = false; + break; + case ID_ST_CD0: + DiskSelection (isfullscreen() > 0 ? NULL : hWnd, IDC_CD_SELECT, 17, &changed_prefs, 0); + break; + case ID_ST_EJECTALL: disk_eject (0); disk_eject (1); @@ -1546,20 +1555,21 @@ static LRESULT CALLBACK HiddenWindowProc (HWND hWnd, UINT message, WPARAM wParam break; case ID_ST_DF0: DiskSelection (isfullscreen() > 0 ? NULL : hWnd, IDC_DF0, 0, &changed_prefs, 0); - disk_insert (0, changed_prefs.df[0]); + disk_insert (0, changed_prefs.floppyslots[0].df); break; case ID_ST_DF1: DiskSelection (isfullscreen() > 0 ? NULL : hWnd, IDC_DF1, 0, &changed_prefs, 0); - disk_insert (1, changed_prefs.df[0]); + disk_insert (1, changed_prefs.floppyslots[0].df); break; case ID_ST_DF2: DiskSelection (isfullscreen() > 0 ? NULL : hWnd, IDC_DF2, 0, &changed_prefs, 0); - disk_insert (2, changed_prefs.df[0]); + disk_insert (2, changed_prefs.floppyslots[0].df); break; case ID_ST_DF3: DiskSelection (isfullscreen() > 0 ? NULL : hWnd, IDC_DF3, 0, &changed_prefs, 0); - disk_insert (3, changed_prefs.df[0]); + disk_insert (3, changed_prefs.floppyslots[0].df); break; + } break; } @@ -4998,30 +5008,47 @@ void systray (HWND hwnd, int remove) static void systraymenu (HWND hwnd) { POINT pt; - HMENU menu, menu2, drvmenu; + HMENU menu, menu2, drvmenu, cdmenu; int drvs[] = { ID_ST_DF0, ID_ST_DF1, ID_ST_DF2, ID_ST_DF3, -1 }; int i; - TCHAR text[100]; + TCHAR text[100], text2[100]; WIN32GUI_LoadUIString (IDS_STMENUNOFLOPPY, text, sizeof (text) / sizeof (TCHAR)); + WIN32GUI_LoadUIString (IDS_STMENUNOCD, text2, sizeof (text2) / sizeof (TCHAR)); GetCursorPos (&pt); menu = LoadMenu (hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDM_SYSTRAY)); if (!menu) return; menu2 = GetSubMenu (menu, 0); drvmenu = GetSubMenu (menu2, 1); + cdmenu = GetSubMenu (menu2, 2); EnableMenuItem (menu2, ID_ST_HELP, pHtmlHelp ? MF_ENABLED : MF_GRAYED); i = 0; while (drvs[i] >= 0) { TCHAR s[MAX_DPATH]; - if (currprefs.df[i][0]) - _stprintf (s, L"DF%d: [%s]", i, currprefs.df[i]); + if (currprefs.floppyslots[i].df[0]) + _stprintf (s, L"DF%d: [%s]", i, currprefs.floppyslots[i].df); else _stprintf (s, L"DF%d: [%s]", i, text); ModifyMenu (drvmenu, drvs[i], MF_BYCOMMAND | MF_STRING, drvs[i], s); - EnableMenuItem (menu2, drvs[i], currprefs.dfxtype[i] < 0 ? MF_GRAYED : MF_ENABLED); + EnableMenuItem (menu2, drvs[i], currprefs.floppyslots[i].dfxtype < 0 ? MF_GRAYED : MF_ENABLED); i++; } + { + TCHAR s[MAX_DPATH]; + if (currprefs.cdslots[0].inuse && currprefs.cdslots[0].name[0]) + _stprintf (s, L"CD: [%s]", currprefs.cdslots[0].name); + else + _stprintf (s, L"CD: [%s]", text2); + ModifyMenu (cdmenu, ID_ST_CD0, MF_BYCOMMAND | MF_STRING, ID_ST_CD0, s); + int open = 0; + struct device_info di; + if (sys_command_info (0, &di, 1) && di.open) + open = 1; + EnableMenuItem (menu2, ID_ST_CD0, open == 0 ? MF_GRAYED : MF_ENABLED); + } + + if (isfullscreen () <= 0) SetForegroundWindow (hwnd); TrackPopupMenu (menu2, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, @@ -5030,7 +5057,7 @@ static void systraymenu (HWND hwnd) DestroyMenu (menu); } -static void LLError(HMODULE m, const TCHAR *s) +static void LLError (HMODULE m, const TCHAR *s) { DWORD err; diff --git a/od-win32/win32.h b/od-win32/win32.h index 1fc9b9fd..0563258a 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -18,8 +18,8 @@ #define WINUAEPUBLICBETA 1 #define LANG_DLL 1 -#define WINUAEBETA L"8" -#define WINUAEDATE MAKEBD(2010, 7, 30) +#define WINUAEBETA L"9" +#define WINUAEDATE MAKEBD(2010, 8, 3) #define WINUAEEXTRA L"" #define WINUAEREV L"" diff --git a/od-win32/win32_scaler.cpp b/od-win32/win32_scaler.cpp index f220bba5..b07e91c7 100644 --- a/od-win32/win32_scaler.cpp +++ b/od-win32/win32_scaler.cpp @@ -20,19 +20,23 @@ struct uae_filter uaefilters[] = { - { UAE_FILTER_NULL, 0, 1, L"Null filter", L"null", 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32, 0, 0, 0 }, + { UAE_FILTER_NULL, 0, 1, L"Null filter", L"null", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32 }, - { UAE_FILTER_SCALE2X, 0, 2, L"Scale2X", L"scale2x", 0, 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32, 0, 0, 0 }, + { UAE_FILTER_SCALE2X, 0, 2, L"Scale2X", L"scale2x", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32 }, - { UAE_FILTER_HQ, 0, 2, L"hq2x/3x/4x", L"hqx", 0, 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, + { UAE_FILTER_HQ2X, 0, 2, L"hq2x", L"hq2x", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, }, - { UAE_FILTER_SUPEREAGLE, 0, 2, L"SuperEagle", L"supereagle", 0, 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, 0, 0 }, + { UAE_FILTER_HQ3X, 0, 3, L"hq3x", L"hq3x", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, - { UAE_FILTER_SUPER2XSAI, 0, 2, L"Super2xSaI", L"super2xsai", 0, 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, 0, 0 }, + { UAE_FILTER_HQ4X, 0, 4, L"hq4x", L"hq4x", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, - { UAE_FILTER_2XSAI, 0, 2, L"2xSaI", L"2xsai", 0, 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32, 0, 0 }, + { UAE_FILTER_SUPEREAGLE, 0, 2, L"SuperEagle", L"supereagle", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, - { UAE_FILTER_PAL, 1, 1, L"PAL", L"pal", 0, UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32, 0, 0, 0 }, + { UAE_FILTER_SUPER2XSAI, 0, 2, L"Super2xSaI", L"super2xsai", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, + + { UAE_FILTER_2XSAI, 0, 2, L"2xSaI", L"2xsai", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_16_32 }, + + { UAE_FILTER_PAL, 1, 1, L"PAL", L"pal", UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32 }, { 0 } }; @@ -107,7 +111,7 @@ static int vblscale2 (int v) static void fixh (int *ah, int *th) { if (!(beamcon0 & 0x80)) { - int max = (572 / 2) << currprefs.gfx_vresolution; + int max = ((572 / 2) * scale) << currprefs.gfx_vresolution; if (*ah > max) *ah = max; if (*th > max) @@ -508,9 +512,10 @@ void S2X_free (void) filteroffsety = 0; filterxmult = 1000; filterymult = 1000; + scale = 1; } -void S2X_init (int dw, int dh, int aw, int ah, int mult, int ad, int dd) +void S2X_init (int dw, int dh, int aw, int ah, int ad, int dd) { int flags = 0; int res_shift; @@ -530,12 +535,13 @@ void S2X_init (int dw, int dh, int aw, int ah, int mult, int ad, int dd) if (!currprefs.gfx_filter || !usedfilter) { usedfilter = &uaefilters[0]; - mult = 1; - } else if (mult) { - flags = usedfilter->x[mult]; + scale = 1; + } else { + scale = usedfilter->intmul; + flags = usedfilter->flags; if ((ad == 16 && !(flags & UAE_FILTER_MODE_16)) || (ad == 32 && !(flags & UAE_FILTER_MODE_32))) { usedfilter = &uaefilters[0]; - mult = 1; + scale = 1; changed_prefs.gfx_filter = usedfilter->type; } } @@ -553,11 +559,13 @@ void S2X_init (int dw, int dh, int aw, int ah, int mult, int ad, int dd) amiga_width = aw; amiga_height = ah; amiga_depth = ad; - scale = mult; if (d3d) { - temp_width = dst_width * mult; - temp_height = dst_height * mult; + int m = currprefs.gfx_filter_filtermode + 1; + if (m < scale) + m = scale; + temp_width = dst_width * m; + temp_height = dst_height * m; } else { temp_width = dst_width * 3; if (temp_width > dxcaps.maxwidth) @@ -571,7 +579,7 @@ void S2X_init (int dw, int dh, int aw, int ah, int mult, int ad, int dd) temp_height = dst_height; } - if (usedfilter->type == UAE_FILTER_HQ) { + if (usedfilter->type == UAE_FILTER_HQ2X || usedfilter->type == UAE_FILTER_HQ3X || usedfilter->type == UAE_FILTER_HQ4X) { int w = amiga_width > dst_width ? amiga_width : dst_width; int h = amiga_height > dst_height ? amiga_height : dst_height; tempsurf2 = xmalloc (uae_u8, w * h * (amiga_depth / 8) * ((scale + 1) / 2)); @@ -648,7 +656,7 @@ void S2X_render (void) ok = 1; } - } else if (usedfilter->type == UAE_FILTER_HQ) { /* 32/2X+3X+4X */ + } else if (usedfilter->type == UAE_FILTER_HQ2X || usedfilter->type == UAE_FILTER_HQ3X || usedfilter->type == UAE_FILTER_HQ4X) { /* 32/2X+3X+4X */ #ifndef CPU_64_BIT @@ -664,19 +672,19 @@ void S2X_render (void) sptr += gfxvidinfo.rowbytes; } if (amiga_depth == 16 && dst_depth == 32) { - if (scale == 2) + if (usedfilter->type == UAE_FILTER_HQ2X) hq2x_32 (tempsurf2, tempsurf3, aw, ah, aws * 4); - else if (scale == 3) + else if (usedfilter->type == UAE_FILTER_HQ3X) hq3x_32 (tempsurf2, tempsurf3, aw, ah, aws * 4); - else if (scale == 4) + else if (usedfilter->type == UAE_FILTER_HQ4X) hq4x_32 (tempsurf2, tempsurf3, aw, ah, aws * 4); ok = 1; } else if (amiga_depth == 16 && dst_depth == 16) { - if (scale == 2) + if (usedfilter->type == UAE_FILTER_HQ2X) hq2x_16 (tempsurf2, tempsurf3, aw, ah, aws * 2); - else if (scale == 3) + else if (usedfilter->type == UAE_FILTER_HQ3X) hq3x_16 (tempsurf2, tempsurf3, aw, ah, aws * 2); - else if (scale == 4) + else if (usedfilter->type == UAE_FILTER_HQ4X) hq4x_16 (tempsurf2, tempsurf3, aw, ah, aws * 2); ok = 1; } @@ -781,26 +789,9 @@ void S2X_refresh (void) int S2X_getmult (void) { - int j, i; - if (!usedfilter) return 1; - j = 0; - for (i = 1; i <= 4; i++) { - if (usedfilter->x[i]) - j++; - } - i = currprefs.gfx_filter_filtermode; - if (i >= j) - i = 0; - j = 0; - while (i >= 0) { - while (!usedfilter->x[j]) - j++; - if(i-- > 0) - j++; - } - return j; + return usedfilter->intmul; } #endif diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 26603c21..d7a5c249 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1100,11 +1100,9 @@ static void updatemodes (void) flags |= DM_W_FULLSCREEN; #if defined (GFXFILTER) if (usedfilter) { - if (!usedfilter->x[0]) { - flags |= DM_SWSCALE; - if (currentmode->current_depth < 15) - currentmode->current_depth = 16; - } + flags |= DM_SWSCALE; + if (currentmode->current_depth < 15) + currentmode->current_depth = 16; } #endif if (currprefs.gfx_api) { @@ -2367,7 +2365,6 @@ static BOOL doInit (void) RGBFTYPE colortype; int tmp_depth; int ret = 0; - int mult = 0; if (wasfullwindow_a == 0) wasfullwindow_a = currprefs.gfx_afullscreen == GFX_FULLWINDOW ? 1 : -1; @@ -2444,11 +2441,10 @@ static BOOL doInit (void) if (currentmode->amiga_height > 960) currentmode->amiga_height = 960; if (usedfilter) { - mult = S2X_getmult (); - if ((usedfilter->x[mult] & (UAE_FILTER_MODE_16 | UAE_FILTER_MODE_32)) == (UAE_FILTER_MODE_16 | UAE_FILTER_MODE_32)) { + if ((usedfilter->flags & (UAE_FILTER_MODE_16 | UAE_FILTER_MODE_32)) == (UAE_FILTER_MODE_16 | UAE_FILTER_MODE_32)) { currentmode->current_depth = currentmode->native_depth; } else { - currentmode->current_depth = (usedfilter->x[mult] & UAE_FILTER_MODE_32) ? 32 : 16; + currentmode->current_depth = (usedfilter->flags & UAE_FILTER_MODE_32) ? 32 : 16; } } currentmode->pitch = currentmode->amiga_width * currentmode->current_depth >> 3; @@ -2523,12 +2519,12 @@ static BOOL doInit (void) if (currentmode->flags & DM_SWSCALE) { S2X_init (currentmode->native_width, currentmode->native_height, currentmode->amiga_width, currentmode->amiga_height, - mult, currentmode->current_depth, currentmode->native_depth); + currentmode->current_depth, currentmode->native_depth); } #ifdef D3D if (currentmode->flags & DM_D3D) { const TCHAR *err = D3D_init (hAmigaWnd, currentmode->native_width, currentmode->native_height, - currentmode->amiga_width, currentmode->amiga_height, currentmode->current_depth); + currentmode->amiga_width, currentmode->amiga_height, currentmode->current_depth, currprefs.gfx_filter_filtermode + 1); if (err) { D3D_free (); gui_message (err); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index e1c3f08b..57c321b5 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -940,22 +940,22 @@ static TCHAR *favoritepopup (HWND hwnd, int drive) if (srcdrive >= 0 && srcdrive <= 4) { if (!morefiles) { for (i = 0; i < 4; i++) { - if (workprefs.df[i][0] && srcdrive != i) { + if (workprefs.floppyslots[i].df[0] && srcdrive != i) { TCHAR tmp[100]; _stprintf (tmp, L"[DF%c:]", i + '0'); fitem[idx].value = my_strdup (tmp); - fitem[idx].path = my_strdup (workprefs.df[i]); + fitem[idx].path = my_strdup (workprefs.floppyslots[i].df); fitem[idx].type = 3 + i; idx++; fitem[idx].type = 0; } } } - if (workprefs.df[srcdrive][0]) { + if (workprefs.floppyslots[srcdrive].df[0]) { if (morefiles > 0) { - idx = getdeepfavdiskimage (workprefs.df[srcdrive], fitem, idx); + idx = getdeepfavdiskimage (workprefs.floppyslots[srcdrive].df, fitem, idx); } else { - idx = getfavdiskimage (workprefs.df[srcdrive], fitem, idx); + idx = getfavdiskimage (workprefs.floppyslots[srcdrive].df, fitem, idx); morefiles = -1; } } @@ -967,8 +967,8 @@ static TCHAR *favoritepopup (HWND hwnd, int drive) break; if (ret <= idx) { if (fitem[ret - 1].type == 2) { - _tcscpy (workprefs.df[dstdrive], fitem[ret - 1].value); - disk_insert (dstdrive, workprefs.df[dstdrive]); + _tcscpy (workprefs.floppyslots[dstdrive].df, fitem[ret - 1].value); + disk_insert (dstdrive, workprefs.floppyslots[dstdrive].df); ret = 0; } break; @@ -1956,7 +1956,7 @@ static void ejectfloppy (int n) if (iscd (n)) { eject_cd (); } else { - workprefs.df[n][0] = 0; + workprefs.floppyslots[n].df[0] = 0; } } @@ -1977,9 +1977,9 @@ static void selectdisk (struct uae_prefs *prefs, HWND hDlg, int num, int id, con return; } SetDlgItemText (hDlg, id, full_path); - _tcscpy(prefs->df[num], full_path); - fullpath (prefs->df[num], sizeof prefs->df[num] / sizeof (TCHAR)); - DISK_history_add (prefs->df[num], -1, HISTORY_FLOPPY, 0); + _tcscpy(prefs->floppyslots[num].df, full_path); + fullpath (prefs->floppyslots[num].df, sizeof prefs->floppyslots[num].df / sizeof (TCHAR)); + DISK_history_add (prefs->floppyslots[num].df, -1, HISTORY_FLOPPY, 0); } static void setdpath (const TCHAR *name, const TCHAR *path) @@ -3238,7 +3238,7 @@ static int disk_in_drive (int entry) { int i; for (i = 0; i < 4; i++) { - if (_tcslen (workprefs.dfxlist[entry]) > 0 && !_tcscmp (workprefs.dfxlist[entry], workprefs.df[i])) + if (_tcslen (workprefs.dfxlist[entry]) > 0 && !_tcscmp (workprefs.dfxlist[entry], workprefs.floppyslots[i].df)) return i; } return -1; @@ -3255,36 +3255,36 @@ static int disk_swap (int entry, int mode) } if ((drv = disk_in_drive (entry)) >= 0) { if (mode < 0) { - workprefs.df[drv][0] = 0; + workprefs.floppyslots[drv].df[0] = 0; return 1; } - if (_tcscmp (workprefs.df[drv], currprefs.df[drv])) { - _tcscpy (workprefs.df[drv], currprefs.df[drv]); - disk_insert (drv, workprefs.df[drv]); + if (_tcscmp (workprefs.floppyslots[drv].df, currprefs.floppyslots[drv].df)) { + _tcscpy (workprefs.floppyslots[drv].df, currprefs.floppyslots[drv].df); + disk_insert (drv, workprefs.floppyslots[drv].df); } else { - workprefs.df[drv][0] = 0; + workprefs.floppyslots[drv].df[0] = 0; } if (drvs[0] < 0 || drvs[1] < 0 || drvs[2] < 0 || drvs[3] < 0) { drv++; while (drv < 4 && drvs[drv] >= 0) drv++; - if (drv < 4 && workprefs.dfxtype[drv] >= 0) { - _tcscpy (workprefs.df[drv], workprefs.dfxlist[entry]); - disk_insert (drv, workprefs.df[drv]); + if (drv < 4 && workprefs.floppyslots[drv].dfxtype >= 0) { + _tcscpy (workprefs.floppyslots[drv].df, workprefs.dfxlist[entry]); + disk_insert (drv, workprefs.floppyslots[drv].df); } } return 1; } for (i = 0; i < 4; i++) { - if (drvs[i] < 0 && workprefs.dfxtype[i] >= 0) { - _tcscpy (workprefs.df[i], workprefs.dfxlist[entry]); - disk_insert (i, workprefs.df[i]); + if (drvs[i] < 0 && workprefs.floppyslots[i].dfxtype >= 0) { + _tcscpy (workprefs.floppyslots[i].df, workprefs.dfxlist[entry]); + disk_insert (i, workprefs.floppyslots[i].df); return 1; } } - _tcscpy (workprefs.df[0], workprefs.dfxlist[entry]); - disk_insert (0, workprefs.df[0]); + _tcscpy (workprefs.floppyslots[0].df, workprefs.dfxlist[entry]); + disk_insert (0, workprefs.floppyslots[0].df); return 1; } @@ -4774,7 +4774,7 @@ static void load_quickstart (HWND hDlg, int romcheck) workprefs.nr_floppies = quickstart_floppy; quickstart_ok = built_in_prefs (&workprefs, quickstart_model, quickstart_conf, quickstart_compa, romcheck); workprefs.ntscmode = quickstart_ntsc != 0; - quickstart_cd = workprefs.dfxtype[1] == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9); + quickstart_cd = workprefs.floppyslots[1].dfxtype == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9); enable_for_quickstart (hDlg); addfloppytype (hDlg, 0); addfloppytype (hDlg, 1); @@ -4829,10 +4829,10 @@ static void init_quickstartdlg (HWND hDlg) regquerystr (NULL, L"QuickStartCDDrive", quickstart_cddrive, &size); regqueryint (NULL, L"QuickStartNTSC", &quickstart_ntsc); if (quickstart) { - workprefs.df[0][0] = 0; - workprefs.df[1][0] = 0; - workprefs.df[2][0] = 0; - workprefs.df[3][0] = 0; + workprefs.floppyslots[0].df[0] = 0; + workprefs.floppyslots[1].df[0] = 0; + workprefs.floppyslots[2].df[0] = 0; + workprefs.floppyslots[3].df[0] = 0; workprefs.cdslots[0].name[0] = 0; workprefs.cdslots[0].inuse = quickstart_cdtype > 0; load_quickstart (hDlg, 1); @@ -4944,11 +4944,11 @@ static void testimage (HWND hDlg, int num) floppytooltip (hDlg, num, 0); quickstart_ok_floppy = 0; - if (workprefs.dfxtype[0] < 0) { + if (workprefs.floppyslots[0].dfxtype < 0) { quickstart_ok_floppy = 1; return; } - if (!workprefs.df[num][0]) + if (!workprefs.floppyslots[num].df[0]) return; ret = DISK_examine_image (&workprefs, num, &crc32); if (!ret) @@ -5006,12 +5006,12 @@ static void addallfloppies (HWND hDlg); static void setfloppytexts (HWND hDlg, int qs) { - SetDlgItemText (hDlg, IDC_DF0TEXT, workprefs.df[0]); - SetDlgItemText (hDlg, IDC_DF1TEXT, workprefs.df[1]); - SetDlgItemText (hDlg, IDC_DF2TEXT, workprefs.df[2]); - SetDlgItemText (hDlg, IDC_DF3TEXT, workprefs.df[3]); - SetDlgItemText (hDlg, IDC_DF0TEXTQ, workprefs.df[0]); - SetDlgItemText (hDlg, IDC_DF1TEXTQ, workprefs.df[1]); + SetDlgItemText (hDlg, IDC_DF0TEXT, workprefs.floppyslots[0].df); + SetDlgItemText (hDlg, IDC_DF1TEXT, workprefs.floppyslots[1].df); + SetDlgItemText (hDlg, IDC_DF2TEXT, workprefs.floppyslots[2].df); + SetDlgItemText (hDlg, IDC_DF3TEXT, workprefs.floppyslots[3].df); + SetDlgItemText (hDlg, IDC_DF0TEXTQ, workprefs.floppyslots[0].df); + SetDlgItemText (hDlg, IDC_DF1TEXTQ, workprefs.floppyslots[1].df); if (!qs) addallfloppies (hDlg); } @@ -5192,15 +5192,15 @@ static INT_PTR CALLBACK QuickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, L } if (recursive == 0 && quickstart) { recursive++; - if (_tcscmp (workprefs.df[0], df0) || workprefs.dfxtype[0] != dfxtype[0]) { - _tcscpy (df0, workprefs.df[0]); - dfxtype[0] = workprefs.dfxtype[0]; + if (_tcscmp (workprefs.floppyslots[0].df, df0) || workprefs.floppyslots[0].dfxtype != dfxtype[0]) { + _tcscpy (df0, workprefs.floppyslots[0].df); + dfxtype[0] = workprefs.floppyslots[0].dfxtype; testimage (hDlg, 0); enable_for_quickstart (hDlg); } - if (_tcscmp (workprefs.df[1], df1) || workprefs.dfxtype[1] != dfxtype[1]) { - _tcscpy (df1, workprefs.df[1]); - dfxtype[1] = workprefs.dfxtype[1]; + if (_tcscmp (workprefs.floppyslots[1].df, df1) || workprefs.floppyslots[1].dfxtype != dfxtype[1]) { + _tcscpy (df1, workprefs.floppyslots[1].df); + dfxtype[1] = workprefs.floppyslots[1].dfxtype; testimage (hDlg, 1); } recursive--; @@ -8183,11 +8183,11 @@ static void values_to_sounddlg (HWND hDlg) p += _tcslen (p) + 1; } } - if (workprefs.dfxclick[idx] < 0) { + if (workprefs.floppyslots[idx].dfxclick < 0) { p = drivesounds; i = DS_BUILD_IN_SOUNDS + (driveclick_pcdrivemask ? 2 : 0) + 1; while (p && p[0]) { - if (!_tcsicmp (p, workprefs.dfxclickexternal[idx])) { + if (!_tcsicmp (p, workprefs.floppyslots[idx].dfxclickexternal)) { SendDlgItemMessage (hDlg, IDC_SOUNDDRIVESELECT, CB_SETCURSEL, i, 0); break; } @@ -8196,7 +8196,7 @@ static void values_to_sounddlg (HWND hDlg) } } else { - SendDlgItemMessage (hDlg, IDC_SOUNDDRIVESELECT, CB_SETCURSEL, workprefs.dfxclick[idx], 0); + SendDlgItemMessage (hDlg, IDC_SOUNDDRIVESELECT, CB_SETCURSEL, workprefs.floppyslots[idx].dfxclick, 0); } update_soundgui (hDlg); @@ -8295,11 +8295,11 @@ static void values_from_sounddlg (HWND hDlg) TCHAR *p = drivesounds; while (j-- > 0) p += _tcslen (p) + 1; - workprefs.dfxclick[idx] = -1; - _tcscpy (workprefs.dfxclickexternal[idx], p); + workprefs.floppyslots[idx].dfxclick = -1; + _tcscpy (workprefs.floppyslots[idx].dfxclickexternal, p); } else { - workprefs.dfxclick[idx] = res; - workprefs.dfxclickexternal[idx][0] = 0; + workprefs.floppyslots[idx].dfxclick = res; + workprefs.floppyslots[idx].dfxclickexternal[0] = 0; } } } @@ -9421,8 +9421,8 @@ static void addfloppyhistory_2 (HWND hDlg, int n, int f_text, int type) nn = 1; text = workprefs.cdslots[0].name; } else { - nn = workprefs.dfxtype[n] + 1; - text = workprefs.df[n]; + nn = workprefs.floppyslots[n].dfxtype + 1; + text = workprefs.floppyslots[n].df; } SendDlgItemMessage (hDlg, f_text, WM_SETTEXT, 0, (LPARAM)text); fkey = read_disk_history (type); @@ -9524,7 +9524,7 @@ static void addcdtype (HWND hDlg, int id) static void addfloppytype (HWND hDlg, int n) { int state, chk; - int nn = workprefs.dfxtype[n] + 1; + int nn = workprefs.floppyslots[n].dfxtype + 1; int showcd = 0; TCHAR *text; @@ -9537,7 +9537,7 @@ static void addfloppytype (HWND hDlg, int n) int f_si = floppybuttons[n][6]; int f_enable = floppybuttons[n][7]; - text = workprefs.df[n]; + text = workprefs.floppyslots[n].df; if (currentpage == QUICKSTART_ID) { TCHAR tmp[MAX_DPATH]; f_text = floppybuttonsq[n][0]; @@ -9614,8 +9614,8 @@ static void getfloppytype (HWND hDlg, int n) int f_type = floppybuttons[n][3]; LRESULT val = SendDlgItemMessage (hDlg, f_type, CB_GETCURSEL, 0, 0L); - if (val != CB_ERR && workprefs.dfxtype[n] != val - 1) { - workprefs.dfxtype[n] = (int)val - 1; + if (val != CB_ERR && workprefs.floppyslots[n].dfxtype != val - 1) { + workprefs.floppyslots[n].dfxtype = (int)val - 1; addfloppytype (hDlg, n); } } @@ -9629,8 +9629,8 @@ static void getfloppytypeq (HWND hDlg, int n) if (iscd (n)) return; chk = ischecked (hDlg, f_enable) ? 0 : -1; - if (chk != workprefs.dfxtype[n]) { - workprefs.dfxtype[n] = chk; + if (chk != workprefs.floppyslots[n].dfxtype) { + workprefs.floppyslots[n].dfxtype = chk; addfloppytype (hDlg, n); } if (currentpage == QUICKSTART_ID) { @@ -9685,7 +9685,7 @@ static void getfloppyname (HWND hDlg, int n, int cd, int f_text) if (getfloppybox (hDlg, f_text, tmp, sizeof (tmp) / sizeof (TCHAR), cd ? HISTORY_CD : HISTORY_FLOPPY)) { if (!cd) { disk_insert (n, tmp); - _tcscpy (workprefs.df[n], tmp); + _tcscpy (workprefs.floppyslots[n].df, tmp); } else { if (quickstart_cddrive[0]) eject_cd (); @@ -9712,7 +9712,7 @@ static void addallfloppies (HWND hDlg) static void floppysetwriteprotect (HWND hDlg, int n, int protect) { if (!iscd (n)) { - disk_setwriteprotect (n, workprefs.df[n], protect); + disk_setwriteprotect (n, workprefs.floppyslots[n].df, protect); addfloppytype (hDlg, n); } } @@ -9722,7 +9722,7 @@ static void deletesaveimage (HWND hDlg, int num) TCHAR *p; if (!iscd (num)) return; - p = DISK_get_saveimagepath (workprefs.df[num]); + p = DISK_get_saveimagepath (workprefs.floppyslots[num].df); if (zfile_exists (p)) { DeleteFile (p); DISK_reinsert (num); @@ -9735,10 +9735,10 @@ static void diskselect (HWND hDlg, WPARAM wParam, struct uae_prefs *p, int drv, int cd = iscd (drv); MultiDiskSelection (hDlg, wParam, cd ? 17 : 0, &workprefs, defaultpath); if (!cd) { - disk_insert (0, p->df[0]); - disk_insert (1, p->df[1]); - disk_insert (2, p->df[2]); - disk_insert (3, p->df[3]); + disk_insert (0, p->floppyslots[0].df); + disk_insert (1, p->floppyslots[1].df); + disk_insert (2, p->floppyslots[2].df); + disk_insert (3, p->floppyslots[3].df); } addfloppytype (hDlg, drv); addfloppyhistory (hDlg); @@ -10031,6 +10031,46 @@ static void addswapperfile (HWND hDlg, int entry, TCHAR *newpath) } } +static void diskswapper_addfile2 (struct uae_prefs *prefs, const TCHAR *file) +{ + int list = 0; + while (list < MAX_SPARE_DRIVES) { + if (!strcasecmp (prefs->dfxlist[list], file)) + break; + list++; + } + if (list == MAX_SPARE_DRIVES) { + list = 0; + while (list < MAX_SPARE_DRIVES) { + if (!prefs->dfxlist[list][0]) { + _tcscpy (prefs->dfxlist[list], file); + break; + } + list++; + } + } +} + +static void diskswapper_addfile (struct uae_prefs *prefs, const TCHAR *file) +{ + struct zdirectory *zd = zfile_opendir_archive (file); + if (zd) { + TCHAR out[MAX_DPATH]; + while (zfile_readdir_archive (zd, out, true)) { + struct zfile *zf = zfile_fopen (out, L"rb", ZFD_NORMAL); + if (zf) { + int type = zfile_gettype (zf); + if (type == ZFILE_DISKIMAGE) + diskswapper_addfile2 (prefs, out); + zfile_fclose (zf); + } + } + zfile_closedir_archive (zd); + } else { + diskswapper_addfile2 (prefs, file); + } +} + static INT_PTR CALLBACK SwapperDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static int recursive = 0; @@ -10135,13 +10175,13 @@ static INT_PTR CALLBACK SwapperDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR { int drv = LOWORD (wParam) - 10201; int i; - if (workprefs.dfxtype[drv] >= 0 && entry >= 0) { + if (workprefs.floppyslots[drv].dfxtype >= 0 && entry >= 0) { for (i = 0; i < 4; i++) { - if (!_tcscmp (workprefs.df[i], workprefs.dfxlist[entry])) - workprefs.df[i][0] = 0; + if (!_tcscmp (workprefs.floppyslots[i].df, workprefs.dfxlist[entry])) + workprefs.floppyslots[i].df[0] = 0; } - _tcscpy (workprefs.df[drv], workprefs.dfxlist[entry]); - disk_insert (drv, workprefs.df[drv]); + _tcscpy (workprefs.floppyslots[drv].df, workprefs.dfxlist[entry]); + disk_insert (drv, workprefs.floppyslots[drv].df); InitializeListView (hDlg); swapperhili (hDlg, entry); } @@ -10153,7 +10193,7 @@ static INT_PTR CALLBACK SwapperDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR case 10208: { int drv = LOWORD (wParam) - 10201; - workprefs.df[drv][0] = 0; + workprefs.floppyslots[drv].df[0] = 0; InitializeListView (hDlg); swapperhili (hDlg, entry); } @@ -11944,7 +11984,7 @@ static int filterpreset_selected = -1, filterpreset_builtin = -1; static void enable_for_hw3ddlg (HWND hDlg) { int v = workprefs.gfx_filter ? TRUE : FALSE; - int vv = FALSE, vv2 = FALSE, vv3 = FALSE, vv4 = FALSE; + int vv = FALSE, vv2 = FALSE, vv3 = FALSE; int as = workprefs.gfx_filter_autoscale == 1 || workprefs.gfx_filter_autoscale == 2; struct uae_filter *uf; int i, isfilter; @@ -11960,16 +12000,12 @@ static void enable_for_hw3ddlg (HWND hDlg) } i++; } - if (v && (uf->x[0] || uf->x[1] || uf->x[2] || uf->x[3] || uf->x[4])) + if (v && uf->intmul) vv = TRUE; - if (v && (uf->x[0] || uf->yuv)) + if (v && uf->yuv) vv2 = TRUE; - if (v && (uf->x[0] && !uf->yuv)) - vv3 = TRUE; - if (v && uf->x[0]) - vv4 = TRUE; if (workprefs.gfx_api) - v = vv = vv2 = vv3 = vv4 = TRUE; + v = vv = vv2 = vv3 = TRUE; ew (hDlg, IDC_FILTERHZ, v); ew (hDlg, IDC_FILTERVZ, v); @@ -11982,7 +12018,7 @@ static void enable_for_hw3ddlg (HWND hDlg) ew (hDlg, IDC_FILTERXLV, vv2); ew (hDlg, IDC_FILTERXTRA, vv2); ew (hDlg, IDC_FILTERDEFAULT, v); - ew (hDlg, IDC_FILTERFILTER, vv); + ew (hDlg, IDC_FILTERFILTER, workprefs.gfx_api); ew (hDlg, IDC_FILTERKEEPASPECT, v); ew (hDlg, IDC_FILTERASPECT, v); ew (hDlg, IDC_FILTERASPECT2, v && workprefs.gfx_filter_keep_aspect); @@ -11994,19 +12030,6 @@ static void enable_for_hw3ddlg (HWND hDlg) ew (hDlg, IDC_FILTERPRESETDELETE, filterpreset_selected > 0 && filterpreset_builtin < 0); } -static void makefilter (TCHAR *s, int x, int flags) -{ - _stprintf (s, L"%dx", x); - if ((flags & (UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32)) == (UAE_FILTER_MODE_16_16 | UAE_FILTER_MODE_32_32)) { - _tcscat (s, L" (16bit/32bit)"); - return; - } - if (flags & UAE_FILTER_MODE_16) - _tcscat (s, L" (16bit)"); - if (flags & UAE_FILTER_MODE_32) - _tcscat (s, L" (32bit)"); -} - static TCHAR *filtermultnames[] = { L"FS", L"1/2x", L"1x", L"2x", L"4x", L"6x", L"8x", NULL }; static int filtermults[] = { 0, 2000, 1000, 500, 250, 167, 125 }; struct filterxtra { @@ -12077,7 +12100,7 @@ static struct filterpreset filterpresets[] = { NULL } }; -static int getfiltermult(HWND hDlg, DWORD dlg) +static int getfiltermult (HWND hDlg, DWORD dlg) { TCHAR tmp[100]; LRESULT v = SendDlgItemMessage (hDlg, dlg, CB_GETCURSEL, 0, 0L); @@ -12126,7 +12149,7 @@ static void setfiltermult (HWND hDlg) static void values_to_hw3ddlg (HWND hDlg) { TCHAR txt[100], tmp[100]; - int i, j, fltnum, modenum; + int i, j, fltnum; struct uae_filter *uf; int fxidx, fxcnt; UAEREG *fkey; @@ -12243,26 +12266,24 @@ static void values_to_hw3ddlg (HWND hDlg) fxidx = 0; filter_extra[fxidx] = NULL; - SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_RESETCONTENT, 0, 0L); if (workprefs.gfx_api) { filter_extra[fxidx++] = filter_3d_extra; filter_extra[fxidx] = NULL; } - ew (hDlg, IDC_FILTERFILTER, uf != NULL); - if (uf && !uf->x[0]) { - modenum = 0; - for (i = 1; i <= 4; i++) { - if (uf->x[i]) { - makefilter (tmp, i, uf->x[i]); - SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_ADDSTRING, 0, (LPARAM)tmp); - modenum++; - } - } - if (uf->yuv) { - filter_extra[fxidx++] = filter_pal_extra; - filter_extra[fxidx] = NULL; + int filtermodenum = 0; + SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_RESETCONTENT, 0, 0L); + if (workprefs.gfx_api) { + for (i = 0; i < 4; i++) { + TCHAR tmp[100]; + _stprintf (tmp, L"%dx", i + 1); + SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_ADDSTRING, 0, (LPARAM)tmp); + filtermodenum++; } } + if (uf && uf->yuv) { + filter_extra[fxidx++] = filter_pal_extra; + filter_extra[fxidx] = NULL; + } SendDlgItemMessage (hDlg, IDC_FILTERXL, TBM_SETRANGE, TRUE, MAKELONG ( 0, +1000)); SendDlgItemMessage (hDlg, IDC_FILTERXL, TBM_SETPAGESIZE, 0, 1); if (filter_extra[0]) { @@ -12298,11 +12319,9 @@ static void values_to_hw3ddlg (HWND hDlg) SendDlgItemMessage (hDlg, IDC_FILTERXL, TBM_SETPOS, TRUE, *(filter_selected->varw)); SetDlgItemInt (hDlg, IDC_FILTERXLV, *(filter_selected->varw), TRUE); } - - if (workprefs.gfx_filter_filtermode >= modenum) + if (workprefs.gfx_filter_filtermode >= filtermodenum) workprefs.gfx_filter_filtermode = 0; SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_SETCURSEL, workprefs.gfx_filter_filtermode, 0); - setfiltermult (hDlg); SendDlgItemMessage (hDlg, IDC_FILTERSLR, CB_RESETCONTENT, 0, 0L); @@ -12462,14 +12481,20 @@ static void filter_handle (HWND hDlg) { LRESULT item = SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_GETCURSEL, 0, 0L); if (item != CB_ERR) { - TCHAR tmp[MAX_DPATH]; + TCHAR tmp[MAX_DPATH], oldsh[MAX_DPATH]; int of = workprefs.gfx_filter; int off = workprefs.gfx_filter_filtermode; tmp[0] = 0; + _tcscpy (oldsh, workprefs.gfx_filtershader); SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_GETLBTEXT, (WPARAM)item, (LPARAM)tmp); workprefs.gfx_filtershader[0] = 0; workprefs.gfx_filter = 0; workprefs.gfx_filter_filtermode = 0; + if (workprefs.gfx_api) { + LRESULT item2 = SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_GETCURSEL, 0, 0L); + if (item2 != CB_ERR) + workprefs.gfx_filter_filtermode = (int)item2; + } if (item > 0) { if (item > UAE_FILTER_LAST) { _stprintf (workprefs.gfx_filtershader, L"%s.fx", tmp + 5); @@ -12477,11 +12502,6 @@ static void filter_handle (HWND hDlg) item--; workprefs.gfx_filter = uaefilters[item].type; } - if (workprefs.gfx_filter) { - item = SendDlgItemMessage (hDlg, IDC_FILTERFILTER, CB_GETCURSEL, 0, 0L); - if (item != CB_ERR) - workprefs.gfx_filter_filtermode = (int)item; - } if (of != workprefs.gfx_filter || off != workprefs.gfx_filter_filtermode) { values_to_hw3ddlg (hDlg); hw3d_changed = 1; @@ -13460,6 +13480,42 @@ static void centerWindow (HWND hDlg) SetWindowPos (hDlg, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); } +static int floppyslot_addfile2 (struct uae_prefs *prefs, const TCHAR *file, int drv, int firstdrv, int maxdrv) +{ + _tcscpy (workprefs.floppyslots[drv].df, file); + disk_insert (drv, workprefs.floppyslots[drv].df); + drv++; + if (drv >= (currentpage == QUICKSTART_ID ? 2 : 4)) + drv = 0; + if (workprefs.floppyslots[drv].dfxtype < 0) + drv = 0; + if (drv == firstdrv) + return -1; + return drv; +} +static int floppyslot_addfile (struct uae_prefs *prefs, const TCHAR *file, int drv, int firstdrv, int maxdrv) +{ + struct zdirectory *zd = zfile_opendir_archive (file); + if (zd) { + TCHAR out[MAX_DPATH]; + while (zfile_readdir_archive (zd, out, true)) { + struct zfile *zf = zfile_fopen (out, L"rb", ZFD_NORMAL); + if (zf) { + int type = zfile_gettype (zf); + if (type == ZFILE_DISKIMAGE) { + drv = floppyslot_addfile2 (prefs, out, drv, firstdrv, maxdrv); + if (drv < 0) + break; + } + } + } + zfile_closedir_archive (zd); + } else { + drv = floppyslot_addfile2 (prefs, file, drv, firstdrv, maxdrv); + } + return drv; +} + static int do_filesys_insert (const TCHAR *root) { if (filesys_insert (-1, NULL, root, 0, 0) == 0) @@ -13469,7 +13525,7 @@ static int do_filesys_insert (const TCHAR *root) int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int currentpage) { - int cnt, i, drv, harddrive, drvdrag, firstdrv, list; + int cnt, i, drv, harddrive, drvdrag, firstdrv; TCHAR file[MAX_DPATH]; int dfxtext[] = { IDC_DF0TEXT, IDC_DF0TEXTQ, IDC_DF1TEXT, IDC_DF1TEXTQ, IDC_DF2TEXT, -1, IDC_DF3TEXT, -1 }; POINT pt; @@ -13502,7 +13558,7 @@ int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int currentpage) } else if (currentpage == FLOPPY_ID || currentpage == QUICKSTART_ID) { for (i = 0; i < 4; i++) { int id = dfxtext[i * 2 + (currentpage == QUICKSTART_ID ? 1 : 0)]; - if (workprefs.dfxtype[i] >= 0 && id >= 0) { + if (workprefs.floppyslots[i].dfxtype >= 0 && id >= 0) { if (GetPanelRect (GetDlgItem (panelDlg, id), &r)) { if (PtInRect (&r, pt)) { drv = i; @@ -13562,34 +13618,13 @@ int dragdrop (HWND hDlg, HDROP hd, struct uae_prefs *prefs, int currentpage) { case ZFILE_DISKIMAGE: if (currentpage == DISK_ID) { - list = 0; - while (list < MAX_SPARE_DRIVES) { - if (!strcasecmp (prefs->dfxlist[list], file)) - break; - list++; - } - if (list == MAX_SPARE_DRIVES) { - list = 0; - while (list < MAX_SPARE_DRIVES) { - if (!prefs->dfxlist[list][0]) { - _tcscpy (prefs->dfxlist[list], file); - break; - } - list++; - } - } + diskswapper_addfile (prefs, file); } else if (currentpage == HARDDISK_ID) { add_filesys_config (&workprefs, -1, NULL, L"", file, 0, 0, 0, 0, 0, 0, NULL, 0, 0); } else { - _tcscpy (workprefs.df[drv], file); - disk_insert (drv, workprefs.df[drv]); - drv++; - if (drv >= (currentpage == QUICKSTART_ID ? 2 : 4)) - drv = 0; - if (workprefs.dfxtype[drv] < 0) - drv = 0; - if (drv == firstdrv) + drv = floppyslot_addfile (prefs, file, drv, firstdrv, i); + if (drv < 0) i = cnt; } break; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index e4ad02f4..61a665f7 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,26 @@ +- when attempting to play CD32 data track: return normal "playing" status and "play ended + with error" flag in next status packet (Mission Impossible 2025 CD32) +- return error status when CD32 qcode command packet is received and currently played CD + audio track is about to change (jumping "laser" in CD32 built-in CD player) +- new D3D filter stupid design fault corrected, all 2x or higher D3D shader filters had + bad image quality because both internal source and destination textures had identical + size.. +- select box next to filter name is now D3D shader filter supersampling mode, + 1x = normal, 2x = internal texture is twice the size of display etc.. Big texture + support required, makes some shader filters look more smoother when combined with + bilinear filtering (for example hq2x) +- crash when entering or exiting GUI when ASPI SCSI mode enabled (b6) +- cd32 pad shift register should stay in reset state in 2-button mode (F17 Challenge CD32) +- added cd insert/eject to systray menu +- added configuration file delayed cd insert, add "delay" to end of path ("cdimage0=,delay"), + waits 3 seconds before inserting the cd, workaround for stupid CD32 games that only work + if CD is inserted after boot screen (F17 Challenge and Last Ninja 3, maybe others) +- fixed cue+mp3 size detection if mp3 frames included checksum data +- only accept 8 or 32-bit Windows clipboard image input (instead of crashing..) +- diskswapper and floppy/quickstart archive dragndrop: add all disk images inside the + archive (I don't know why this was done ages ago..) + Beta 8: - GUI configuration panel crash fix (b7) @@ -7,7 +29,7 @@ Beta 8: - removed obsolete 15-bit fullscreen mode support code - statefile restore failed if rarely used 68020 M status register bit was set - added protection against starting new transparent clipboard conversion - if previous hasn't fully finished yet + if previous operation has not finished yet Beta 7: diff --git a/od-win32/writelog.cpp b/od-win32/writelog.cpp index 597892c0..e65ac284 100644 --- a/od-win32/writelog.cpp +++ b/od-win32/writelog.cpp @@ -489,7 +489,7 @@ TCHAR* buf_out (TCHAR *buffer, int *bufsize, const TCHAR *format, ...) if (buffer == NULL) return 0; - count = _vsntprintf (buffer, (*bufsize) / sizeof (TCHAR) - 1, format, parms); + count = _vsntprintf (buffer, (*bufsize) - 1, format, parms); va_end (parms); *bufsize -= _tcslen (buffer); return buffer + _tcslen (buffer); diff --git a/prowizard/rippers/SkytPacker.c b/prowizard/rippers/SkytPacker.c index d7695497..30224247 100644 --- a/prowizard/rippers/SkytPacker.c +++ b/prowizard/rippers/SkytPacker.c @@ -60,7 +60,7 @@ void Rip_SKYT ( void ) Save_Rip ( "SKYT Packed module", SKYT_packer ); if ( Save_Status == GOOD ) - PW_i += (OutputSize - 261); /* 260 could be enough */ + PW_i += 257; } @@ -80,18 +80,21 @@ void Rip_SKYT ( void ) * (thx to Thomas Neumann) * 29 Nov 2003 : Update * - another bug removed :(. + * 2 Aug 2010 : + * - cleaned up a bit + * - track 0 was not correctly handled + * 3 Aug 2010 : + * - rewrote patternlist generation */ void Depack_SKYT ( void ) { - Uchar Pat_Pos; - Uchar *Whatever; + Uchar *Header, *Pattern; Uchar poss[37][2]; - long i=0,j=0,k=0; + long i=0,j=0,k=0,l=0,m=0; long Total_Sample_Size=0; - long Track_Values[128][4]; - long Track_Address; - long Where=PW_Start_Address; /* main pointer to prevent fread() */ + unsigned long ReadTrkPat[128][4], ReadPat[128]; + long Where=PW_Start_Address; long Highest_Track = 0; FILE *out; @@ -100,116 +103,148 @@ void Depack_SKYT ( void ) if ( Save_Status == BAD ) return; - BZERO ( Track_Values , 128*16 ); - sprintf ( Depacked_OutName , "%ld.mod" , Cpt_Filename-1 ); out = PW_fopen ( Depacked_OutName , "w+b" ); - /* write title */ - Whatever = (Uchar *) malloc (1024); - BZERO ( Whatever , 1024 ); - /* title */ - fwrite ( Whatever , 20 , 1 , out ); + Header = (Uchar *)malloc(1084); + Pattern = (Uchar *)malloc(1024); + BZERO ( Header , 1084 ); + BZERO ( Pattern , 1024 ); /* read and write sample descriptions */ for ( i=0 ; i<31 ; i++ ) { - /*sample name*/ - fwrite ( Whatever , 22 , 1 , out ); Total_Sample_Size += (((in_data[Where]*256)+in_data[Where+1])*2); /* write Size,Fine,Vol & Loop start */ - fwrite ( &in_data[Where] , 6 , 1 , out ); + Header[42+i*30] = in_data[Where]; + Header[43+i*30] = in_data[Where+1]; + Header[44+i*30] = in_data[Where+2]; + Header[45+i*30] = in_data[Where+3]; + Header[46+i*30] = in_data[Where+4]; + Header[47+i*30] = in_data[Where+5]; + Header[48+i*30] = in_data[Where+6]; + Header[49+i*30] = in_data[Where+7]; /* loop size */ - Whatever[32] = in_data[Where+7]; if ( (in_data[Where+6] == 0x00) && (in_data[Where+7] == 0x00) ) - Whatever[32] = 0x01; - fwrite ( &in_data[Where+6] , 1 , 1 , out ); - fwrite ( &Whatever[32] , 1 , 1 , out ); + Header[49+i*30] = 0x01; Where += 8; } /*printf ( "Whole sample size : %ld\n" , Total_Sample_Size );*/ - /* bypass 8 empty bytes and bypass "SKYT" ID*/ + /* go to track addresses list */ Where = PW_Start_Address + 260; /* pattern table lenght */ - Pat_Pos = in_data[Where]+1; + Header[950] = in_data[Where]+1; Where += 1; - fwrite ( &Pat_Pos , 1 , 1 , out ); - /*printf ( "Size of pattern list : %d\n" , Pat_Pos );*/ + /*printf ( "Size of pattern list : %d\n" , Header[950] );*/ /* write NoiseTracker byte */ - Whatever[32] = 0x7f; - fwrite ( &Whatever[32] , 1 , 1 , out ); + Header[951] = 0x7F; - /* read track numbers ... and deduce pattern list */ - for ( i=0 ; i Highest_Track ) - Highest_Track = Track_Values[i][j]; - Where += 2; - } + ReadPat[i] = (in_data[Where+i*8+1]*256*256*256) + + (in_data[Where+3+i*8]*256*256) + + (in_data[Where+5+i*8]*256) + + in_data[Where+7+i*8]; + ReadTrkPat[i][0] = in_data[Where+i*8+1]-1; + ReadTrkPat[i][1] = in_data[Where+i*8+3]-1; + ReadTrkPat[i][2] = in_data[Where+i*8+5]-1; + ReadTrkPat[i][3] = in_data[Where+i*8+7]-1; + if ((ReadTrkPat[i][0] != 0xffffffff) && (ReadTrkPat[i][0] > Highest_Track)) + Highest_Track = ReadTrkPat[i][0]; + if ((ReadTrkPat[i][1] != 0xffffffff) && (ReadTrkPat[i][1] > Highest_Track)) + Highest_Track = ReadTrkPat[i][1]; + if ((ReadTrkPat[i][2] != 0xffffffff) && (ReadTrkPat[i][2] > Highest_Track)) + Highest_Track = ReadTrkPat[i][2]; + if ((ReadTrkPat[i][3] != 0xffffffff) && (ReadTrkPat[i][3] > Highest_Track)) + Highest_Track = ReadTrkPat[i][3]; + /*printf ("%x-%x-%x-%x\n",ReadTrkPat[i][0],ReadTrkPat[i][1],ReadTrkPat[i][2],ReadTrkPat[i][3]);*/ } - /*printf ( "\nHighest track : %ld\n", Highest_Track );*/ + /*printf ("highest track nbr : %lx\n", Highest_Track);*/ + + /* sorting ?*/ + k = 0; /* next min */ + l = 0; - /* write pseudo pattern list */ - for ( Whatever[0]=0x00 ; Whatever[0]k)) + m = ReadPat[i]; + /* if k == m then an already existing ref was found */ + if (k==m) + continue; + /* m is the next minimum */ + k = m; + for (i=0; i 37) + printf ("\nbad note '%x' at %lx (ptk:%lx)(pattern:%ld)(voice:%ld)(row:%ld)(track:%lx)", + note, Where+(ReadTrkPat[j][k]*256)+d*4, k*4+d*16, i,k,d,ReadTrkPat[j][k]);*/ + Pattern[k*4+d*16] = poss[note][0]; + Pattern[k*4+d*16+1] = poss[note][1]; + /* samples */ + Pattern[k*4+d*16] |= (in_data[Where+(ReadTrkPat[j][k]*256)+d*4+1])&0xf0; + Pattern[k*4+d*16+2] = (in_data[Where+(ReadTrkPat[j][k]*256)+d*4+1])<<4; + Pattern[k*4+d*16+2] += in_data[Where+(ReadTrkPat[j][k]*256)+d*4+2]; + Pattern[k*4+d*16+3] = in_data[Where+(ReadTrkPat[j][k]*256)+d*4+3]; } } - fwrite ( Whatever , 1024 , 1 , out ); - /*printf ( "+" );*/ + fwrite ( Pattern , 1024 , 1 , out ); } - free ( Whatever ); - /*printf ( "\n" );*/ + free ( Pattern ); + free ( Header ); /* sample data */ - Where = Track_Address + Highest_Track*256; + Where += (Highest_Track+1)*256; + /*printf ("address of sample data : %ld\n",Where);*/ fwrite ( &in_data[Where] , Total_Sample_Size , 1 , out ); /* crap */ diff --git a/uaelib.cpp b/uaelib.cpp index 983c50ed..7a5cc278 100644 --- a/uaelib.cpp +++ b/uaelib.cpp @@ -198,7 +198,7 @@ static uae_u32 emulib_InsertDisk (uaecptr name, uae_u32 drive) return 0; /* ENAMETOOLONG */ s = au (real_name); - _tcscpy (changed_prefs.df[drive], s); + _tcscpy (changed_prefs.floppyslots[drive].df, s); xfree (s); return 1; @@ -246,7 +246,7 @@ static uae_u32 emulib_GetUaeConfig (uaecptr place) put_byte (place + 35, 1); for (j = 0; j < 4; j++) { - char *s = ua (currprefs.df[j]); + char *s = ua (currprefs.floppyslots[j].df); for (i = 0; i < 256; i++) put_byte (place + 36 + i + j * 256, s[i]); xfree (s); @@ -273,8 +273,8 @@ static uae_u32 emulib_GetDisk (uae_u32 drive, uaecptr name) if (drive > 3) return 0; - for (i = 0;i < 256; i++) { - put_byte (name + i, currprefs.df[drive][i]); + for (i = 0; i < 256; i++) { + put_byte (name + i, currprefs.floppyslots[drive].df[i]); } return 1; } diff --git a/zfile.cpp b/zfile.cpp index ad540aea..c19e16cf 100644 --- a/zfile.cpp +++ b/zfile.cpp @@ -2848,7 +2848,7 @@ struct zvolume *zfile_fopen_directory (const TCHAR *dirname) return zv; } -struct zvolume *zfile_fopen_archive (const TCHAR *filename) +struct zvolume *zfile_fopen_archive (const TCHAR *filename, bool norecurse) { struct zvolume *zv = NULL; struct zfile *zf = zfile_fopen_nozip (filename, L"rb"); @@ -2871,11 +2871,11 @@ struct zvolume *zfile_fopen_archive (const TCHAR *filename) } #endif /* pointless but who cares? */ - if (!zv) + if (!zv && !norecurse) zv = archive_directory_plain (zf); #if RECURSIVE_ARCHIVES - if (zv) + if (zv && !norecurse) zfile_fopen_archive_recurse (zv); #endif @@ -2886,6 +2886,10 @@ struct zvolume *zfile_fopen_archive (const TCHAR *filename) return zv; } +struct zvolume *zfile_fopen_archive (const TCHAR *filename) +{ + return zfile_fopen_archive (filename, false); +} struct zvolume *zfile_fopen_archive_root (const TCHAR *filename) { @@ -2977,19 +2981,34 @@ void zfile_fclose_archive (struct zvolume *zv) } struct zdirectory { + TCHAR *parentpath; struct znode *first; struct znode *n; + bool doclose; + struct zvolume *zv; + int cnt; + int offset; + TCHAR **filenames; }; struct zdirectory *zfile_opendir_archive (const TCHAR *path) { struct zvolume *zv = get_zvolume (path); + bool created = false; + if (zv == NULL) { + zv = zfile_fopen_archive (path, true); + created = true; + } struct znode *zn = get_znode (zv, path, TRUE); struct zdirectory *zd; - - if (!zn || (!zn->child && !zn->vchild)) + if (!zn || (!zn->child && !zn->vchild)) { + if (created) + zfile_fclose_archive (zv); return NULL; - zd = xmalloc (struct zdirectory, 1); + } + zd = xcalloc (struct zdirectory, 1); + if (created) + zd->zv = zv; if (zn->child) { zd->n = zn->child; } else { @@ -3002,23 +3021,68 @@ struct zdirectory *zfile_opendir_archive (const TCHAR *path) } zd->n = zn->vchild->root.next; } + zd->parentpath = my_strdup (path); zd->first = zd->n; return zd; } void zfile_closedir_archive (struct zdirectory *zd) { + if (!zd) + return; + zfile_fclose_archive (zd->zv); + xfree (zd->parentpath); + xfree (zd->filenames); xfree (zd); } -int zfile_readdir_archive (struct zdirectory *zd, TCHAR *out) +int zfile_readdir_archive (struct zdirectory *zd, TCHAR *out, bool fullpath) { - if (!zd->n) + out[0] = 0; + if (!zd->n || (zd->filenames != NULL && zd->offset >= zd->cnt)) return 0; - _tcscpy (out, zd->n->name); - zd->n = zd->n->sibling; + if (zd->filenames == NULL) { + struct znode *n = zd->first; + int cnt = 0, len = 0; + while (n) { + cnt++; + len += _tcslen (n->name) + 1; + n = n->sibling; + } + n = zd->first; + uae_u8 *buf = xmalloc (uae_u8, cnt * sizeof (TCHAR*) + len * sizeof (TCHAR) * cnt); + zd->filenames = (TCHAR**)buf; + buf += cnt * sizeof (TCHAR*); + for (int i = 0; i < cnt; i++) { + zd->filenames[i] = (TCHAR*)buf; + _tcscpy ((TCHAR*)buf, n->name); + buf += (_tcslen (n->name) + 1) * sizeof (TCHAR); + n = n->sibling; + } + for (int i = 0; i < cnt; i++) { + for (int j = i + 1; j < cnt; j++) { + if (_tcscmp (zd->filenames[i], zd->filenames[j]) > 0) { + TCHAR *tmp = zd->filenames[i]; + zd->filenames[i] = zd->filenames[j]; + zd->filenames[j] = tmp; + } + } + } + zd->cnt = cnt; + } + if (fullpath) { + _tcscpy (out, zd->parentpath); + _tcscat (out, L"\\"); + } + _tcscat (out, zd->filenames[zd->offset]); + zd->offset++; return 1; } +int zfile_readdir_archive (struct zdirectory *zd, TCHAR *out) +{ + return zfile_readdir_archive (zd, out, false); +} void zfile_resetdir_archive (struct zdirectory *zd) { + zd->offset = 0; zd->n = zd->first; } diff --git a/zfile_archive.cpp b/zfile_archive.cpp index 6d35afe0..cb080c26 100644 --- a/zfile_archive.cpp +++ b/zfile_archive.cpp @@ -25,6 +25,9 @@ #include #define unpack_log write_log +#undef unpack_log +#define unpack_log + static time_t fromdostime (uae_u32 dd) { -- 2.47.3