From dc880b1045134acb0590eac68dd7e518913ad87a Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 15 May 2010 13:20:53 +0300 Subject: [PATCH] 2200b1 --- ar.cpp | 2 +- audio.cpp | 2 +- blkdev_cdimage.cpp | 2 +- cfgfile.cpp | 236 +- cia.cpp | 65 +- consolehook.cpp | 4 +- custom.cpp | 92 +- debug.cpp | 9 +- disk.cpp | 46 +- drawing.cpp | 58 +- expansion.cpp | 3 +- filesys.cpp | 715 +-- fpp.cpp | 261 +- gencpu.cpp | 142 +- genlinetoscr.cpp | 2 +- include/autoconf.h | 10 +- include/cpu_prefetch.h | 108 +- include/custom.h | 6 +- include/disk.h | 2 +- include/drawing.h | 186 +- include/epsonprinter.h | 4 +- include/gui.h | 10 +- include/inputdevice.h | 39 +- include/keybuf.h | 1 - include/memory.h | 13 +- include/newcpu.h | 61 +- include/options.h | 664 +- include/rommgr.h | 2 +- include/uae.h | 2 +- include/xwin.h | 2 +- include/zarchive.h | 23 +- include/zfile.h | 1 + inputdevice.cpp | 1589 +++-- inputevents.def | 2 +- jit/compemu.h | 3 - jit/compemu_raw_x86.cpp | 5363 ++++++++--------- jit/compemu_support.cpp | 11 +- keybuf.cpp | 139 +- main.cpp | 252 +- memory.cpp | 22 +- native2amiga.cpp | 10 +- newcpu.cpp | 721 ++- od-win32/dinput.cpp | 247 +- od-win32/direct3d.cpp | 43 +- od-win32/gencpu_msvc/gencpu_msvc.vcxproj | 1 + od-win32/hardfile_win32.cpp | 6 +- od-win32/ioport.cpp | 2 +- od-win32/keyboard_win32.cpp | 114 +- od-win32/lib/prowizard.lib | Bin 0 -> 1138468 bytes od-win32/lib/prowizard_x64.lib | Bin 0 -> 1304832 bytes od-win32/mman.cpp | 119 +- od-win32/picasso96_win.cpp | 4 +- od-win32/prowizard/prowizard.vcxproj | 26 +- od-win32/resources/resource | 30 +- od-win32/resources/winuae.rc | 181 +- od-win32/sounddep/sound.cpp | 36 +- od-win32/srcrelease.cmd | 7 + od-win32/sysconfig.h | 3 +- od-win32/uaeunp/uaeunp.vcxproj | 40 +- od-win32/uaeunp/uaeunp.vcxproj.filters | 166 +- od-win32/unpackers/unpackers.vcxproj | 159 + od-win32/unpackers/unpackers.vcxproj.filters | 17 + od-win32/win32.cpp | 45 +- od-win32/win32.h | 6 +- od-win32/win32_filesys.cpp | 8 +- od-win32/win32gfx.cpp | 39 +- od-win32/win32gfx.h | 1 - od-win32/win32gui.cpp | 1233 +++- od-win32/winuae_msvc10/winuae_msvc.sln | 11 + od-win32/winuae_msvc10/winuae_msvc.vcxproj | 109 +- .../winuae_msvc10/winuae_msvc.vcxproj.filters | 131 +- rommgr.cpp | 10 +- zfile.cpp | 37 +- zfile_archive.cpp | 133 +- 74 files changed, 7661 insertions(+), 6188 deletions(-) create mode 100644 od-win32/lib/prowizard.lib create mode 100644 od-win32/lib/prowizard_x64.lib create mode 100644 od-win32/unpackers/unpackers.vcxproj create mode 100644 od-win32/unpackers/unpackers.vcxproj.filters diff --git a/ar.cpp b/ar.cpp index 67450f97..6895c185 100644 --- a/ar.cpp +++ b/ar.cpp @@ -265,7 +265,7 @@ static void cartridge_exit (void) { #ifdef PICASSO96 if (stored_picasso_on >= 0) - picasso_requested_on = stored_picasso_on; + picasso_requested_on = stored_picasso_on != 0; stored_picasso_on = -1; #endif } diff --git a/audio.cpp b/audio.cpp index 6a3ddb28..844acd9a 100644 --- a/audio.cpp +++ b/audio.cpp @@ -1892,7 +1892,7 @@ void audio_vsync (void) { #if SOUNDSTUFF > 0 int max, min; - int vsync = isfullscreen () > 0 && currprefs.gfx_avsync > 0; + int vsync = isfullscreen () > 0 && currprefs.gfx_avsync; static int lastdir; if (!vsync) { diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 8336f3fb..fb8c83de 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -740,7 +740,7 @@ static int parse_image (void) if (!img) return 0; - zcue = zfile_fopen (img, L"rb", ZFD_ARCHIVE); + zcue = zfile_fopen (img, L"rb", ZFD_ARCHIVE | ZFD_CD); if (!zcue) return 0; diff --git a/cfgfile.cpp b/cfgfile.cpp index 8e3e7ab9..4525f2bf 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -166,7 +166,8 @@ static const TCHAR *maxvert[] = { L"nointerlace", L"interlace", 0 }; static const TCHAR *abspointers[] = { L"none", L"mousehack", L"tablet", 0 }; static const TCHAR *magiccursors[] = { L"both", L"native", L"host", 0 }; static const TCHAR *autoscale[] = { L"none", L"scale", L"resize", 0 }; -static const TCHAR *joyportmodes[] = { NULL, L"mouse", L"djoy", L"ajoy", L"cdtvjoy", L"cd32joy", L"lightpen", 0 }; +static const TCHAR *joyportmodes[] = { L"", L"mouse", L"djoy", L"ajoy", L"cdtvjoy", L"cd32joy", L"lightpen", 0 }; +static const TCHAR *joyaf[] = { L"none", L"pushpull", L"toggle", 0 }; static const TCHAR *epsonprinter[] = { L"none", L"ascii", L"epson_matrix_9pin", L"epson_matrix_24pin", L"epson_matrix_48pin", 0 }; static const TCHAR *aspects[] = { L"none", L"vga", L"tv", 0 }; static const TCHAR *vsyncmodes[] = { L"false", L"true", L"autoswitch", 0 }; @@ -186,7 +187,8 @@ static const TCHAR *obsolete[] = { L"gfx_test_speed", L"gfxlib_replacement", L"enforcer", L"catweasel_io", L"kickstart_key_file", L"fast_copper", L"sound_adjust", L"serial_hardware_dtrdsr", L"gfx_filter_upscale", - L"gfx_correct_aspect", L"gfx_autoscale", + L"gfx_correct_aspect", L"gfx_autoscale", L"parallel_sampler", L"parallel_ascii_emulation", + L"avoid_vid", L"avoid_dga", NULL }; @@ -302,14 +304,18 @@ end: xfree (tmp1); } -void cfgfile_write_bool (struct zfile *f, const TCHAR *option, int b) +void cfgfile_write_bool (struct zfile *f, const TCHAR *option, bool b) { cfg_dowrite (f, option, b ? L"true" : L"false", 0, 0); } -void cfgfile_dwrite_bool (struct zfile *f, const TCHAR *option, int b) +void cfgfile_dwrite_bool (struct zfile *f, const TCHAR *option, bool b) { cfg_dowrite (f, option, b ? L"true" : L"false", 1, 0); } +void cfgfile_dwrite_bool (struct zfile *f, const TCHAR *option, int b) +{ + cfgfile_dwrite_bool (f, option, b != 0); +} void cfgfile_write_str (struct zfile *f, const TCHAR *option, const TCHAR *value) { cfg_dowrite (f, option, value, 0, 0); @@ -319,11 +325,11 @@ void cfgfile_dwrite_str (struct zfile *f, const TCHAR *option, const TCHAR *valu cfg_dowrite (f, option, value, 1, 0); } -void cfgfile_target_write_bool (struct zfile *f, const TCHAR *option, int b) +void cfgfile_target_write_bool (struct zfile *f, const TCHAR *option, bool b) { cfg_dowrite (f, option, b ? L"true" : L"false", 0, 1); } -void cfgfile_target_dwrite_bool (struct zfile *f, const TCHAR *option, int b) +void cfgfile_target_dwrite_bool (struct zfile *f, const TCHAR *option, bool b) { cfg_dowrite (f, option, b ? L"true" : L"false", 1, 1); } @@ -377,6 +383,27 @@ void cfgfile_target_dwrite (struct zfile *f, const TCHAR *option, const TCHAR *f va_end (parms); } +static void cfgfile_write_rom (struct zfile *f, const TCHAR *path, const TCHAR *romfile, const TCHAR *name) +{ + TCHAR *str = cfgfile_subst_path (path, UNEXPANDED, romfile); + cfgfile_write_str (f, name, str); + struct zfile *zf = zfile_fopen (str, L"rb", ZFD_ALL); + if (zf) { + struct romdata *rd = getromdatabyzfile (zf); + if (rd) { + TCHAR name2[MAX_DPATH], str2[MAX_DPATH]; + _tcscpy (name2, name); + _tcscat (name2, L"_id"); + _stprintf (str2, L"%08X,%s", rd->crc32, rd->name); + cfgfile_write_str (f, name2, str2); + } + zfile_fclose (zf); + } + xfree (str); + +} + + static void write_filesys_config (struct uae_prefs *p, const TCHAR *unexpanded, const TCHAR *default_path, struct zfile *f) { @@ -453,7 +480,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_str (f, L"config_description", p->description); cfgfile_write_bool (f, L"config_hardware", type & CONFIG_TYPE_HARDWARE); - cfgfile_write_bool (f, L"config_host", type & CONFIG_TYPE_HOST); + cfgfile_write_bool (f, L"config_host", !!(type & CONFIG_TYPE_HOST)); if (p->info[0]) cfgfile_write (f, L"config_info", p->info); cfgfile_write (f, L"config_version", L"%d.%d.%d", UAEMAJOR, UAEMINOR, UAESUBREV); @@ -480,14 +507,10 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_str (f, L"use_gui", guimode1[p->start_gui]); cfgfile_write_bool (f, L"use_debugger", p->start_debugger); - str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->romfile); - cfgfile_write_str (f, L"kickstart_rom_file", str); - xfree (str); + cfgfile_write_rom (f, p->path_rom, p->romfile, L"kickstart_rom_file"); + cfgfile_write_rom (f, p->path_rom, p->romextfile, L"kickstart_ext_rom_file"); if (p->romident[0]) cfgfile_dwrite_str (f, L"kickstart_rom", p->romident); - str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->romextfile); - cfgfile_write_str (f, L"kickstart_ext_rom_file", str); - xfree (str); if (p->romextident[0]) cfgfile_write_str (f, L"kickstart_ext_rom=", p->romextident); str = cfgfile_subst_path (p->path_rom, UNEXPANDED, p->flashfile); @@ -573,17 +596,15 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_bool (f, L"comp_midopt", p->comp_midopt); cfgfile_write_bool (f, L"comp_lowopt", p->comp_lowopt); cfgfile_write_bool (f, L"avoid_cmov", p->avoid_cmov); - cfgfile_write_bool (f, L"avoid_dga", p->avoid_dga); - cfgfile_write_bool (f, L"avoid_vid", p->avoid_vid); cfgfile_write (f, L"cachesize", L"%d", p->cachesize); - if (p->override_dga_address) - cfgfile_write (f, L"override_dga_address", L"0x%08x", p->override_dga_address); for (i = 0; i < MAX_JPORTS; i++) { struct jport *jp = &p->jports[i]; int v = jp->id; TCHAR tmp1[MAX_DPATH], tmp2[MAX_DPATH]; - if (v < 0) { + if (v == JPORT_CUSTOM) { + _tcscpy (tmp2, L"custom"); + } else if (v == JPORT_NONE) { _tcscpy (tmp2, L"none"); } else if (v < JSEM_JOYS) { _stprintf (tmp2, L"kbd%d", v + 1); @@ -597,15 +618,17 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) if (i < 2 || jp->id >= 0) { _stprintf (tmp1, L"joyport%d", i); cfgfile_write (f, tmp1, tmp2); + _stprintf (tmp1, L"joyport%dautofire", i); + cfgfile_write (f, tmp1, joyaf[jp->autofire]); if (i < 2 && jp->mode > 0) { _stprintf (tmp1, L"joyport%dmode", i); cfgfile_write (f, tmp1, joyportmodes[jp->mode]); } - if (jp->name) { + if (jp->name[0]) { _stprintf (tmp1, L"joyportfriendlyname%d", i); cfgfile_write (f, tmp1, jp->name); } - if (jp->configname) { + if (jp->configname[0]) { _stprintf (tmp1, L"joyportname%d", i); cfgfile_write (f, tmp1, jp->configname); } @@ -646,7 +669,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write (f, L"gfx_width_fullscreen", L"%d", p->gfx_size_fs.width); cfgfile_write (f, L"gfx_height_fullscreen", L"%d", p->gfx_size_fs.height); cfgfile_write (f, L"gfx_refreshrate", L"%d", p->gfx_refreshrate); - cfgfile_write (f, L"gfx_autoresolution", L"%d", p->gfx_autoresolution); + cfgfile_write_bool (f, L"gfx_autoresolution", p->gfx_autoresolution); cfgfile_write_str (f, L"gfx_vsync", vsyncmodes[p->gfx_avsync]); cfgfile_write_bool (f, L"gfx_vsync_picasso", p->gfx_pvsync); cfgfile_write_bool (f, L"gfx_lores", p->gfx_resolution == 0); @@ -710,7 +733,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite (f, L"gfx_filter_gamma", L"%d", p->gfx_filter_gamma); cfgfile_dwrite (f, L"gfx_filter_blur", L"%d", p->gfx_filter_blur); cfgfile_dwrite (f, L"gfx_filter_noise", L"%d", p->gfx_filter_noise); - cfgfile_dwrite_bool (f, L"gfx_filter_bilinear", p->gfx_filter_bilinear); + cfgfile_dwrite_bool (f, L"gfx_filter_bilinear", p->gfx_filter_bilinear != 0); cfgfile_dwrite_str (f, L"gfx_filter_keep_aspect", aspects[p->gfx_filter_keep_aspect]); cfgfile_dwrite_str (f, L"gfx_filter_autoscale", autoscale[p->gfx_filter_autoscale]); cfgfile_dwrite (f, L"gfx_filter_aspect_ratio", L"%d:%d", @@ -725,8 +748,8 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_bool (f, L"immediate_blits", p->immediate_blits); cfgfile_write_bool (f, L"ntsc", p->ntscmode); cfgfile_write_bool (f, L"genlock", p->genlock); - cfgfile_dwrite_bool (f, L"show_leds", p->leds_on_screen & STATUSLINE_CHIPSET); - cfgfile_dwrite_bool (f, L"show_leds_rtg", p->leds_on_screen & STATUSLINE_RTG); + cfgfile_dwrite_bool (f, L"show_leds", !!(p->leds_on_screen & STATUSLINE_CHIPSET)); + cfgfile_dwrite_bool (f, L"show_leds_rtg", !!(p->leds_on_screen & STATUSLINE_RTG)); cfgfile_dwrite (f, L"keyboard_leds", L"numlock:%s,capslock:%s,scrolllock:%s", kbleds[p->keyboard_leds[0]], kbleds[p->keyboard_leds[1]], kbleds[p->keyboard_leds[2]]); if (p->chipset_mask & CSMASK_AGA) @@ -837,8 +860,6 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_bool (f, L"filesys_no_fsdb", p->filesys_no_uaefsdb); #endif write_inputdevice_config (p, f); - - /* Don't write gfxlib/gfx_test_speed options. */ } int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location) @@ -857,6 +878,18 @@ int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, i } return 1; } +int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, bool *location) +{ + int val; + int ret = cfgfile_yesno (option, value, name, &val); + if (ret == 0) + return 0; + if (ret < 0) + *location = false; + else + *location = val != 0; + return 1; +} int cfgfile_intval (const TCHAR *option, const TCHAR *value, const TCHAR *name, unsigned int *location, int scale) { @@ -912,6 +945,15 @@ int cfgfile_strval (const TCHAR *option, const TCHAR *value, const TCHAR *name, return 1; } +int cfgfile_strboolval (const TCHAR *option, const TCHAR *value, const TCHAR *name, bool *location, const TCHAR *table[], int more) +{ + int locationint; + if (!cfgfile_strval (option, value, name, &locationint, table, more)) + return 0; + *location = locationint != 0; + return 1; +} + int cfgfile_string (const TCHAR *option, const TCHAR *value, const TCHAR *name, TCHAR *location, int maxsz) { if (_tcscmp (option, name) != 0) @@ -932,6 +974,33 @@ int cfgfile_path (const TCHAR *option, const TCHAR *value, const TCHAR *name, TC return 1; } +int cfgfile_rom (const TCHAR *option, const TCHAR *value, const TCHAR *name, TCHAR *location, int maxsz) +{ + TCHAR id[MAX_DPATH]; + if (!cfgfile_string (option, value, name, id, sizeof id / sizeof (TCHAR))) + return 0; + if (zfile_exists (location)) + return 1; + TCHAR *p = _tcschr (id, ','); + if (p) { + TCHAR *endptr, tmp; + *p = 0; + tmp = id[4]; + id[4] = 0; + uae_u32 crc32 = _tcstol (id, &endptr, 16) << 16; + id[4] = tmp; + crc32 |= _tcstol (id + 4, &endptr, 16); + struct romdata *rd = getromdatabycrc (crc32); + if (rd) { + struct romlist *rl = getromlistbyromdata (rd); + if (rl) { + write_log (L"%s: %s -> %s\n", name, location, rl->path); + _tcsncpy (location, rl->path, maxsz); + } + } + } + return 1; +} static int getintval (TCHAR **p, int *result, int delim) { @@ -997,7 +1066,8 @@ static void set_chipset_mask (struct uae_prefs *p, int val) static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) { - int i, v; + int i; + bool vb; TCHAR *section = 0; TCHAR *tmpp; TCHAR tmpbuf[CONFIG_BLEN]; @@ -1063,7 +1133,7 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || cfgfile_intval (option, value, L"gfx_width_fullscreen", &p->gfx_size_fs.width, 1) || cfgfile_intval (option, value, L"gfx_height_fullscreen", &p->gfx_size_fs.height, 1) || cfgfile_intval (option, value, L"gfx_refreshrate", &p->gfx_refreshrate, 1) - || cfgfile_intval (option, value, L"gfx_autoresolution", &p->gfx_autoresolution, 1) + || cfgfile_yesno (option, value, L"gfx_autoresolution", &p->gfx_autoresolution) || cfgfile_intval (option, value, L"gfx_backbuffers", &p->gfx_backbuffers, 1) || cfgfile_intval (option, value, L"gfx_center_horizontal_position", &p->gfx_xcenter_pos, 1) @@ -1097,8 +1167,7 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || 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"floppy_volume", &p->dfxclickvolume, 1) - || cfgfile_intval (option, value, L"override_dga_address", &p->override_dga_address, 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)) @@ -1116,8 +1185,6 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || cfgfile_yesno (option, value, L"sound_stereo_swap_ahi", &p->sound_stereo_swap_ahi) || cfgfile_yesno (option, value, L"state_replay", &p->statecapture) || cfgfile_yesno (option, value, L"avoid_cmov", &p->avoid_cmov) - || cfgfile_yesno (option, value, L"avoid_dga", &p->avoid_dga) - || cfgfile_yesno (option, value, L"avoid_vid", &p->avoid_vid) || cfgfile_yesno (option, value, L"log_illegal_mem", &p->illegal_mem) || cfgfile_yesno (option, value, L"filesys_no_fsdb", &p->filesys_no_uaefsdb) || cfgfile_yesno (option, value, L"gfx_vsync_picasso", &p->gfx_pvsync) @@ -1135,9 +1202,9 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || cfgfile_strval (option, value, L"sound_interpol", &p->sound_interpol, interpolmode, 0) || cfgfile_strval (option, value, L"sound_filter", &p->sound_filter, soundfiltermode1, 0) || cfgfile_strval (option, value, L"sound_filter_type", &p->sound_filter_type, soundfiltermode2, 0) - || cfgfile_strval (option, value, L"use_gui", &p->start_gui, guimode1, 1) - || cfgfile_strval (option, value, L"use_gui", &p->start_gui, guimode2, 1) - || cfgfile_strval (option, value, L"use_gui", &p->start_gui, guimode3, 0) + || cfgfile_strboolval (option, value, L"use_gui", &p->start_gui, guimode1, 1) + || cfgfile_strboolval (option, value, L"use_gui", &p->start_gui, guimode2, 1) + || cfgfile_strboolval (option, value, L"use_gui", &p->start_gui, guimode3, 0) || cfgfile_strval (option, value, L"gfx_resolution", &p->gfx_resolution, lorestype1, 0) || cfgfile_strval (option, value, L"gfx_lores", &p->gfx_resolution, lorestype2, 0) || cfgfile_strval (option, value, L"gfx_lores_mode", &p->gfx_lores_mode, loresmode, 0) @@ -1164,18 +1231,18 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) if (_tcscmp (option, L"gfx_vsync") == 0) { - if (cfgfile_strval (option, value, L"gfx_vsync", &p->gfx_avsync, vsyncmodes, 0) >= 0) + if (cfgfile_strboolval (option, value, L"gfx_vsync", &p->gfx_avsync, vsyncmodes, 0) >= 0) return 1; return cfgfile_yesno (option, value, L"gfx_vsync", &p->gfx_avsync); } - if (cfgfile_yesno (option, value, L"show_leds", &v)) { - if (v) + if (cfgfile_yesno (option, value, L"show_leds", &vb)) { + if (vb) p->leds_on_screen |= STATUSLINE_CHIPSET; return 1; } - if (cfgfile_yesno (option, value, L"show_leds_rtg", &v)) { - if (v) + if (cfgfile_yesno (option, value, L"show_leds_rtg", &vb)) { + if (vb) p->leds_on_screen |= STATUSLINE_RTG; return 1; } @@ -1317,6 +1384,14 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) return 1; if (cfgfile_strval (option, value, L"joyport3mode", &p->jports[3].mode, joyportmodes, 0)) return 1; + if (cfgfile_strval (option, value, L"joyport0autofire", &p->jports[0].autofire, joyaf, 0)) + return 1; + if (cfgfile_strval (option, value, L"joyport1autofire", &p->jports[1].autofire, joyaf, 0)) + return 1; + if (cfgfile_strval (option, value, L"joyport2autofire", &p->jports[2].autofire, joyaf, 0)) + return 1; + if (cfgfile_strval (option, value, L"joyport3autofire", &p->jports[3].autofire, joyaf, 0)) + return 1; if (cfgfile_path (option, value, L"statefile", tmpbuf, sizeof (tmpbuf) / sizeof (TCHAR))) { _tcscpy (savestate_fname, tmpbuf); @@ -1497,7 +1572,7 @@ static struct uaedev_config_info *getuci(struct uae_prefs *p) } struct uaedev_config_info *add_filesys_config (struct uae_prefs *p, int index, - TCHAR *devname, TCHAR *volname, TCHAR *rootdir, int readonly, + TCHAR *devname, TCHAR *volname, TCHAR *rootdir, bool readonly, int secspertrack, int surfaces, int reserved, int blocksize, int bootpri, TCHAR *filesysdir, int hdc, int flags) @@ -1587,6 +1662,7 @@ static void parse_addmem (struct uae_prefs *p, TCHAR *buf, int num) static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *value) { int tmpval, dummyint, i; + bool tmpbool, dummybool; TCHAR *section = 0; TCHAR tmpbuf[CONFIG_BLEN]; @@ -1597,10 +1673,10 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va /* we don't want cycle-exact in 68020/40+JIT modes */ return 1; } - if (cfgfile_yesno (option, value, L"cycle_exact", &tmpval)) { - p->cpu_cycle_exact = p->blitter_cycle_exact = tmpval ? 1 : 0; + if (cfgfile_yesno (option, value, L"cycle_exact", &tmpbool)) { + p->cpu_cycle_exact = p->blitter_cycle_exact = tmpbool; if (p->cpu_model >= 68020 && p->cachesize > 0) - p->cpu_cycle_exact = p->blitter_cycle_exact = 0; + p->cpu_cycle_exact = p->blitter_cycle_exact = false; return 1; } @@ -1610,13 +1686,13 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va } - if (cfgfile_yesno (option, value, L"scsi_a3000", &dummyint)) { - if (dummyint) + if (cfgfile_yesno (option, value, L"scsi_a3000", &dummybool)) { + if (dummybool) p->cs_mbdmac = 1; return 1; } - if (cfgfile_yesno (option, value, L"scsi_a4000t", &dummyint)) { - if (dummyint) + if (cfgfile_yesno (option, value, L"scsi_a4000t", &dummybool)) { + if (dummybool) p->cs_mbdmac = 2; return 1; } @@ -1659,7 +1735,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va || cfgfile_yesno (option, value, L"comp_nf", &p->compnf) || cfgfile_yesno (option, value, L"comp_constjump", &p->comp_constjump) || cfgfile_yesno (option, value, L"comp_oldsegv", &p->comp_oldsegv) - || cfgfile_yesno (option, value, L"compforcesettings", &dummyint) + || cfgfile_yesno (option, value, L"compforcesettings", &dummybool) || cfgfile_yesno (option, value, L"compfpu", &p->compfpu) || cfgfile_yesno (option, value, L"fpu_strict", &p->fpu_strict) || cfgfile_yesno (option, value, L"comp_midopt", &p->comp_midopt) @@ -1701,7 +1777,6 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va if (cfgfile_strval (option, value, L"comp_trustbyte", &p->comptrustbyte, compmode, 0) || cfgfile_strval (option, value, L"chipset_compatible", &p->cs_compatible, cscompa, 0) || cfgfile_strval (option, value, L"rtc", &p->cs_rtc, rtctype, 0) - || cfgfile_strval (option, value, L"ksmirror", &p->cs_ksmirror_e0, ksmirrortype, 0) || cfgfile_strval (option, value, L"ciaatod", &p->cs_ciaatod, ciaatodmode, 0) || cfgfile_strval (option, value, L"ide", &p->cs_ide, idemode, 0) || cfgfile_strval (option, value, L"scsi", &p->scsi, scsimode, 0) @@ -1710,11 +1785,13 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va || cfgfile_strval (option, value, L"comp_trustnaddr", &p->comptrustnaddr, compmode, 0) || cfgfile_strval (option, value, L"collision_level", &p->collision_level, collmode, 0) || cfgfile_strval (option, value, L"parallel_matrix_emulation", &p->parallel_matrix_emulation, epsonprinter, 0) - || cfgfile_strval (option, value, L"comp_flushmode", &p->comp_hardflush, flushmode, 0)) + || cfgfile_strboolval (option, value, L"comp_flushmode", &p->comp_hardflush, flushmode, 0)) return 1; if (cfgfile_path (option, value, L"kickstart_rom_file", p->romfile, sizeof p->romfile / sizeof (TCHAR)) || cfgfile_path (option, value, L"kickstart_ext_rom_file", p->romextfile, sizeof p->romextfile / sizeof (TCHAR)) + || cfgfile_rom (option, value, L"kickstart_rom_file_id", p->romfile, sizeof p->romfile / sizeof (TCHAR)) + || cfgfile_rom (option, value, L"kickstart_ext_rom_file_id", p->romextfile, sizeof p->romextfile / sizeof (TCHAR)) || cfgfile_path (option, value, L"amax_rom_file", p->amaxromfile, sizeof p->amaxromfile / sizeof (TCHAR)) || cfgfile_path (option, value, L"flash_file", p->flashfile, sizeof p->flashfile / sizeof (TCHAR)) || cfgfile_path (option, value, L"cart_file", p->cartfile, sizeof p->cartfile / sizeof (TCHAR)) @@ -1878,7 +1955,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va if (_tcscmp (option, L"filesystem") == 0 || _tcscmp (option, L"hardfile") == 0) { - int secs, heads, reserved, bs, ro; + int secs, heads, reserved, bs; + bool ro; TCHAR *aname, *root; TCHAR *tmpp = _tcschr (value, ','); TCHAR *str; @@ -1893,11 +1971,11 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va if (_tcscmp (value, L"1") == 0 || strcasecmp (value, L"ro") == 0 || strcasecmp (value, L"readonly") == 0 || strcasecmp (value, L"read-only") == 0) - ro = 1; + ro = true; else if (_tcscmp (value, L"0") == 0 || strcasecmp (value, L"rw") == 0 || strcasecmp (value, L"readwrite") == 0 || strcasecmp (value, L"read-write") == 0) - ro = 0; + ro = false; else goto invalid_fs; secs = 0; heads = 0; reserved = 0; bs = 0; @@ -1931,7 +2009,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va if (_tcscmp (option, L"filesystem2") == 0 || _tcscmp (option, L"hardfile2") == 0) { - int secs, heads, reserved, bs, ro, bp, hdcv; + int secs, heads, reserved, bs, bp, hdcv; + bool ro; TCHAR *dname = NULL, *aname = L"", *root = NULL, *fs = NULL, *hdc; TCHAR *tmpp = _tcschr (value, ','); TCHAR *str = NULL; @@ -1942,9 +2021,9 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, TCHAR *option, TCHAR *va *tmpp++ = '\0'; if (strcasecmp (value, L"ro") == 0) - ro = 1; + ro = true; else if (strcasecmp (value, L"rw") == 0) - ro = 0; + ro = false; else goto invalid_fs; secs = 0; heads = 0; reserved = 0; bs = 0; bp = 0; @@ -2240,14 +2319,15 @@ static char *cfg_fgets (char *line, int max, struct zfile *fh) return 0; } -static int cfgfile_load_2 (struct uae_prefs *p, const TCHAR *filename, int real, int *type) +static int cfgfile_load_2 (struct uae_prefs *p, const TCHAR *filename, bool real, int *type) { int i; struct zfile *fh; char linea[CONFIG_BLEN]; TCHAR line[CONFIG_BLEN], line1b[CONFIG_BLEN], line2b[CONFIG_BLEN]; struct strlist *sl; - int type1 = 0, type2 = 0, askedtype = 0; + bool type1 = false, type2 = false; + int askedtype = 0; if (type) { askedtype = *type; @@ -2256,7 +2336,7 @@ static int cfgfile_load_2 (struct uae_prefs *p, const TCHAR *filename, int real, if (real) { p->config_version = 0; config_newfilesystem = 0; - reset_inputdevice_config (p); + //reset_inputdevice_config (p); } fh = zfile_fopen (filename, L"r", ZFD_NORMAL); @@ -2533,7 +2613,7 @@ bad: p->jports[1].id = v1; } -static void parse_filesys_spec (struct uae_prefs *p, int readonly, const TCHAR *spec) +static void parse_filesys_spec (struct uae_prefs *p, bool readonly, const TCHAR *spec) { TCHAR buf[256]; TCHAR *s2; @@ -2667,15 +2747,9 @@ int parse_cmdline_option (struct uae_prefs *p, TCHAR c, const TCHAR *arg) case 'W': parse_hardfile_spec (p, arg); break; case 'S': parse_sound_spec (p, arg); break; case 'R': p->gfx_framerate = _tstoi (arg); break; - case 'x': p->no_xhair = 1; break; case 'i': p->illegal_mem = 1; break; case 'J': parse_joy_spec (p, arg); break; - case 't': p->test_drawing_speed = 1; break; -#ifdef USE_X11_GFX - case 'L': p->x11_use_low_bandwidth = 1; break; - case 'T': p->x11_use_mitshm = 1; break; -#endif case 'w': p->m68k_speed = _tstoi (arg); break; /* case 'g': p->use_gfxlib = 1; break; */ @@ -3214,6 +3288,7 @@ void default_prefs (struct uae_prefs *p, int type) TCHAR zero = 0; struct zfile *f; + reset_inputdevice_config (p); memset (p, 0, sizeof (*p)); _tcscpy (p->description, L"UAE default configuration"); p->config_hardware_path[0] = 0; @@ -3228,7 +3303,6 @@ void default_prefs (struct uae_prefs *p, int type) * to behave identically on all platforms if possible. * (TW says: maybe it is time to update default config..) */ p->illegal_mem = 0; - p->no_xhair = 0; p->use_serial = 0; p->serial_demand = 0; p->serial_hwctsrts = 1; @@ -3274,11 +3348,8 @@ void default_prefs (struct uae_prefs *p, int type) p->fpu_strict = 0; p->cachesize = 0; p->avoid_cmov = 0; - p->avoid_dga = 0; - p->avoid_vid = 0; p->comp_midopt = 0; p->comp_lowopt = 0; - p->override_dga_address = 0; for (i = 0;i < 10; i++) p->optcount[i] = -1; @@ -3314,14 +3385,6 @@ void default_prefs (struct uae_prefs *p, int type) p->gfx_blackerthanblack = 0; p->gfx_backbuffers = 2; - p->x11_use_low_bandwidth = 0; - p->x11_use_mitshm = 0; - p->x11_hide_cursor = 1; - - p->svga_no_linear = 0; - - p->curses_reverse_video = 0; - target_default_options (p, type); p->immediate_blits = 0; @@ -3354,8 +3417,9 @@ void default_prefs (struct uae_prefs *p, int type) p->cs_mbdmac = 0; p->cs_a2091 = 0; p->cs_a4091 = 0; - p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 0; - p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = 0; + p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = false; + p->cs_cdtvcd = p->cs_cdtvram = false; + p->cs_cdtvcard = 0; p->cs_pcmcia = 0; p->cs_ksmirror_e0 = 1; p->cs_ksmirror_a8 = 0; @@ -3526,16 +3590,16 @@ static void buildin_default_prefs (struct uae_prefs *p) p->gfxmem_size = 0x00000000; p->cs_rtc = 0; - p->cs_a1000ram = 0; + p->cs_a1000ram = false; p->cs_fatgaryrev = -1; p->cs_ramseyrev = -1; p->cs_agnusrev = -1; p->cs_deniserev = -1; p->cs_mbdmac = 0; - p->cs_a2091 = 0; - p->cs_a4091 = 0; - p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 0; - p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = 0; + p->cs_a2091 = false; + p->cs_a4091 = false; + p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = false; + p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = false; p->cs_ide = 0; p->cs_pcmcia = 0; p->cs_ksmirror_e0 = 1; diff --git a/cia.cpp b/cia.cpp index a3728c7e..e31b5f39 100644 --- a/cia.cpp +++ b/cia.cpp @@ -59,7 +59,10 @@ static unsigned long ciaata_passed, ciaatb_passed, ciabta_passed, ciabtb_passed; static unsigned long ciaatod, ciabtod, ciaatol, ciabtol, ciaaalarm, ciabalarm; static int ciaatlatch, ciabtlatch; -static int oldled, oldovl, oldcd32mute, led_changed; +static bool oldled, oldovl, oldcd32mute; +static bool led; +static int led_old_brightness; +static unsigned long led_cycles_on, led_cycles_off, led_cycle; unsigned int ciabpra; @@ -524,37 +527,40 @@ void CIA_hsync_handler (int dotod) } } -static int led_times; -static unsigned long led_on, led_cycle; - - static void calc_led (int old_led) { unsigned long c = get_cycles (); - unsigned long t = c - led_cycle; + unsigned long t = (c - led_cycle) / CYCLE_UNIT; if (old_led) - led_on += t; - led_times++; + led_cycles_on += t; + else + led_cycles_off += t; led_cycle = c; } static void led_vsync (void) { - gui_data.powerled_brightness = gui_data.powerled ? 255 : 0; - calc_led (gui_data.powerled); - if (led_on > 0 && led_times > 2) { - int v = led_on / CYCLE_UNIT * 256 / (maxhpos * maxvpos_nom); - if (v < 0) - v = 0; - if (v > 255) - v = 255; - gui_data.powerled_brightness = v; - } - led_on = 0; - led_times = 0; - if (led_changed) + int v; + + calc_led (led); + if (led_cycles_on && !led_cycles_off) + v = 255; + else if (led_cycles_off && !led_cycles_on) + v = 0; + else + v = led_cycles_on * 255 / led_cycles_off; + if (v < 0) + v = 0; + if (v > 255) + v = 255; + gui_data.powerled_brightness = v; + led_cycles_on = 0; + led_cycles_off = 0; + if (led_old_brightness != gui_data.powerled_brightness) { + gui_data.powerled = gui_data.powerled_brightness > 127; gui_led (LED_POWER, gui_data.powerled); - led_changed = 0; + } + led_old_brightness = gui_data.powerled_brightness; led_cycle = get_cycles (); } @@ -575,15 +581,14 @@ void CIA_vsync_handler (int dotod) static void bfe001_change (void) { uae_u8 v = ciaapra; - int led; + bool led2; v |= ~ciaadra; /* output is high when pin's direction is input */ - led = (v & 2) ? 0 : 1; - if (led != oldled) { - calc_led (oldled); - oldled = led; - gui_data.powerled = led; - led_changed = 1; + led2 = (v & 2) ? 0 : 1; + if (led2 != led) { + calc_led (led); + led = led2; + led_old_brightness = -1; led_filter_audio (); } if (currprefs.cs_ciaoverlay && (v & 1) != oldovl) { @@ -1162,7 +1167,7 @@ void CIA_reset (void) serbits = 0; oldovl = 1; oldcd32mute = 1; - oldled = -1; + oldled = true; resetwarning_phase = resetwarning_timer = 0; if (!savestate_state) { diff --git a/consolehook.cpp b/consolehook.cpp index e503e1cc..8543a76d 100644 --- a/consolehook.cpp +++ b/consolehook.cpp @@ -45,8 +45,8 @@ void consolehook_config (struct uae_prefs *p) p->gfx_size_win.width = 320; p->gfx_size_win.height = 256; p->turbo_emulation = 0; - p->win32_automount_drives = 2; - p->win32_automount_cddrives = 2; + //p->win32_automount_drives = 2; + //p->win32_automount_cddrives = 2; add_filesys_config (p, -1, L"DH0", L"CLIBOOT", L".", 1, 0, 0, 0, 0, 15, NULL, 0, 0); } diff --git a/custom.cpp b/custom.cpp index de6a622e..6e96f0c9 100644 --- a/custom.cpp +++ b/custom.cpp @@ -66,7 +66,7 @@ #define SPRBORDER 0 -STATIC_INLINE int nocustom (void) +STATIC_INLINE bool nocustom (void) { if (picasso_on && currprefs.picasso96_nocustom) return 1; @@ -135,7 +135,9 @@ extern uae_u8* compiled_code; int vpos; static int vpos_count, vpos_count_prev; -static int lof_store, lof_current, lol; +static int lof_store; // real bit in custom registers +static int lof_current; // what display device thinks +static int lol; static int next_lineno, prev_lineno; static enum nln_how nextline_how; static int lof_changed = 0; @@ -256,6 +258,7 @@ enum diw_states static int plffirstline, plflastline; int plffirstline_total, plflastline_total; +static int autoscale_bordercolors; static int plfstrt_start, plfstrt, plfstop; static int sprite_minx, sprite_maxx; static int first_bpl_vpos; @@ -835,7 +838,10 @@ STATIC_INLINE void compute_delay_offset (void) static void record_color_change2 (int hpos, int regno, unsigned long value) { - curr_color_changes[next_color_change].linepos = hpos * 2; + int pos = hpos * 2; + if (regno == 0x1000 + 0x10c) + pos++; // BPLCON4 change needs 1 lores pixel delay + curr_color_changes[next_color_change].linepos = pos; curr_color_changes[next_color_change].regno = regno; curr_color_changes[next_color_change++].value = value; curr_color_changes[next_color_change].regno = -1; @@ -1790,11 +1796,11 @@ static void start_bpl_dma (int hpos, int hstart) if (doflickerfix () && interlace_seen && !scandoubled_line) { int i; for (i = 0; i < 8; i++) { - prevbpl[lof_store][vpos][i] = bplptx[i]; - if (!lof_store && (bplcon0 & 4)) - bplpt[i] = prevbpl[1 - lof_store][vpos][i]; - if (!(bplcon0 & 4) || interlace_seen < 0) - prevbpl[1 - lof_store][vpos][i] = prevbpl[lof_store][vpos][i] = 0; + prevbpl[lof_current][vpos][i] = bplptx[i]; + if (!lof_current && (bplcon0 & 4)) + bplpt[i] = prevbpl[1 - lof_current][vpos][i]; + if (!(bplcon0 & 4) || interlace_seen < 0) + prevbpl[1 - lof_current][vpos][i] = prevbpl[lof_current][vpos][i] = 0; } } @@ -1928,12 +1934,20 @@ static void record_color_change (int hpos, int regno, unsigned long value) } record_color_change2 (hpos, regno, value); - if (regno == 0 && value != 0 && vpos >= 32) { + if (regno == 0 && value != 0 && vpos >= 20) { // autoscale if COLOR00 changes in top or bottom of screen - if (vpos < first_planes_vpos || vpos < plffirstline_total) - plffirstline_total = first_planes_vpos = vpos - 2; - if (vpos > last_planes_vpos || vpos > plflastline_total) - plflastline_total = last_planes_vpos = vpos + 3; + if (vpos >= minfirstline) { + int vpos2 = autoscale_bordercolors ? minfirstline : vpos; + if (first_planes_vpos == 0) + first_planes_vpos = vpos2 - 2; + if (plffirstline_total == maxvpos) + plffirstline_total = vpos2 - 2; + if (vpos2 > last_planes_vpos || vpos2 > plflastline_total) + plflastline_total = last_planes_vpos = vpos2 + 3; + autoscale_bordercolors = 0; + } else { + autoscale_bordercolors++; + } } } @@ -2686,7 +2700,7 @@ void compute_vsynctime (void) updatedisplayarea (); } if (currprefs.produce_sound > 1) - update_sound (fake_vblank_hz, (bplcon0 & 4) ? -1 : lof_current, islinetoggle ()); + update_sound (fake_vblank_hz, (bplcon0 & 4) ? -1 : lof_store, islinetoggle ()); } @@ -2710,7 +2724,7 @@ void init_hz (void) int ovblank = vblank_hz; int hzc = 0; - if (vsync_switchmode (-1, 0) > 0) + if (vsync_switchmode (-1, 0)) currprefs.gfx_avsync = changed_prefs.gfx_avsync = vsync_switchmode (-1, 0); if (!isvsync () && ((currprefs.chipset_refreshrate == 50 && !currprefs.ntscmode) || @@ -2902,8 +2916,8 @@ static uae_u32 REGPARAM2 timehack_helper (TrapContext *context) timehack_alive = 10; gettimeofday (&tv, NULL); - put_long (m68k_areg (regs, 0), tv.tv_sec - (((365 * 8 + 2) * 24) * 60 * 60)); - put_long (m68k_areg (regs, 0) + 4, tv.tv_usec); + x_put_long (m68k_areg (regs, 0), tv.tv_sec - (((365 * 8 + 2) * 24) * 60 * 60)); + x_put_long (m68k_areg (regs, 0) + 4, tv.tv_usec); return 0; #else return 2; @@ -2984,7 +2998,7 @@ STATIC_INLINE uae_u16 VPOSR (void) if (hp + HPOS_OFFSET >= maxhpos) { vp++; - if (vp >= maxvpos + lof_current) + if (vp >= maxvpos + lof_store) vp = 0; } vp = (vp >> 8) & 7; @@ -3004,11 +3018,11 @@ STATIC_INLINE uae_u16 VPOSR (void) if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS)) vp &= 1; - vp = vp | (lof_current ? 0x8000 : 0) | csbit; + vp = vp | (lof_store ? 0x8000 : 0) | csbit; if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) vp |= lol ? 0x80 : 0; #if 0 - if (M68K_GETPC < 0xf00000) + if (M68K_GETPC < 0x00f00000 || M68K_GETPC >= 0x10000000) write_log (L"VPOSR %04x at %08x\n", vp, M68K_GETPC); #endif if (currprefs.cpu_model >= 68020) @@ -3022,9 +3036,9 @@ static void VPOSW (uae_u16 v) if (M68K_GETPC < 0xf00000 || 1) write_log (L"VPOSW %04X PC=%08x\n", v, M68K_GETPC); #endif - if (lof_current != ((v & 0x8000) ? 1 : 0)) { + if (lof_store != ((v & 0x8000) ? 1 : 0)) { lof_changed = 1; - lof_current = (v & 0x8000) ? 1 : 0; + lof_store = (v & 0x8000) ? 1 : 0; } if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) lol = (v & 0x0080) ? 1 : 0; @@ -3057,7 +3071,7 @@ STATIC_INLINE uae_u16 VHPOSR (void) if (hp >= maxhpos) { hp -= maxhpos; vp++; - if (vp >= maxvpos + lof_current) + if (vp >= maxvpos + lof_store) vp = 0; } hp += 1; @@ -3069,7 +3083,7 @@ STATIC_INLINE uae_u16 VHPOSR (void) if (currprefs.cpu_model >= 68020) hsyncdelay (); #if 0 - if (M68K_GETPC < 0xf00000 && (vpos >= maxhpos || vpos <= 1)) + if (M68K_GETPC < 0x00f00000 || M68K_GETPC >= 0x10000000) write_log (L"VPOS %04x %04x at %08x\n", VPOSR (), vp, M68K_GETPC); #endif return vp; @@ -4701,7 +4715,8 @@ STATIC_INLINE void do_sprites_1 (int num, int cycle, int hpos) write_log (L"%d:%d:SPR%d STOP\n", vpos, hpos, num); #endif s->dmastate = 0; -#if 1 +#if 0 + // roots 2.0 flower zoomer bottom part missing if this enabled if (vpos == s->vstop) { spr_arm (num, 0); //return; @@ -4878,6 +4893,7 @@ static void init_hardware_frame (void) ddflastword_total = 0; plflastline_total = 0; plffirstline_total = maxvpos; + autoscale_bordercolors = 0; for (i = 0; i < MAX_SPRITES; i++) spr[i].ptxhpos = MAXHPOS; } @@ -5042,8 +5058,8 @@ static void vsync_handler (void) write_log (L"vblank interrupt not cleared\n"); #endif if (bplcon0 & 4) - lof_current = lof_current ? 0 : 1; - lof_store = lof_current; + lof_store = lof_store ? 0 : 1; + lof_current = lof_store; #ifdef PICASSO96 picasso_handle_vsync (); @@ -5286,6 +5302,12 @@ static void hsync_handler (void) if (islinetoggle ()) lol ^= 1; + if (vpos == equ_vblank_endline + 1 && lof_current != lof_store) { + // argh, line=0 field decision was wrong, someone did + // something stupid and changed LOF + // lof_current = lof_store; + // don't really know what to do here exactly without corrupt display + } maxhpos = maxhpos_short + lol; eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME; @@ -5328,7 +5350,7 @@ static void hsync_handler (void) vpos_count++; if (vpos >= maxvpos_total) vpos = 0; - if (vpos == maxvpos + lof_current || vpos == maxvpos + lof_current + 1 || vpos_count >= MAXVPOS) { + if (vpos == maxvpos + lof_store || vpos == maxvpos + lof_store + 1 || vpos_count >= MAXVPOS) { // vpos_count >= MAXVPOS just to not crash if VPOSW writes prevent vsync completely if ((bplcon0 & 8) && !lightpen_triggered) { vpos_lpen = vpos - 1; @@ -5378,7 +5400,7 @@ static void hsync_handler (void) strobe = 0x38; else if (vpos < minfirstline) strobe = 0x3a; - else if (vpos + 1 == maxvpos + lof_current) + else if (vpos + 1 == maxvpos + lof_store) strobe = 0x38; else if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && lol) strobe = 0x3e; @@ -5411,7 +5433,7 @@ static void hsync_handler (void) } } else { #endif - is_lastline = vpos + 1 == maxvpos + lof_current && currprefs.m68k_speed == -1; + is_lastline = vpos + 1 == maxvpos + lof_store && currprefs.m68k_speed == -1; #ifdef JIT } #endif @@ -5428,8 +5450,8 @@ static void hsync_handler (void) } else if (currprefs.gfx_linedbl && (doublescan <= 0 || interlace_seen > 0)) { lineno *= 2; nextline_how = currprefs.gfx_linedbl == 1 ? nln_doubled : nln_nblack; - if ((bplcon0 & 4) || (interlace_seen > 0 && !lof_store)) { - if (!lof_store) { + if ((bplcon0 & 4) || (interlace_seen > 0 && !lof_current)) { + if (!lof_current) { lineno++; nextline_how = nln_lower; } else { @@ -6341,7 +6363,7 @@ uae_u8 *restore_custom (uae_u8 *src) dsklen = RW; /* 024 DSKLEN */ RW; /* 026 DSKDAT */ RW; /* 028 REFPTR */ - i = RW; lof_current = (i & 0x8000) ? 1 : 0; lol = (i & 0x0080) ? 1 : 0; /* 02A VPOSW */ + i = RW; lof_store = lof_current = (i & 0x8000) ? 1 : 0; lol = (i & 0x0080) ? 1 : 0; /* 02A VPOSW */ RW; /* 02C VHPOSW */ COPCON (RW); /* 02E COPCON */ RW; /* 030 SERDAT* */ @@ -6499,7 +6521,7 @@ uae_u8 *save_custom (int *len, uae_u8 *dstptr, int full) SW (dsklen); /* 024 DSKLEN */ SW (0); /* 026 DSKDAT */ SW (0); /* 028 REFPTR */ - SW ((lof_current ? 0x8001 : 0) | (lol ? 0x0080 : 0));/* 02A VPOSW */ + SW ((lof_store ? 0x8001 : 0) | (lol ? 0x0080 : 0));/* 02A VPOSW */ SW (0); /* 02C VHPOSW */ SW (copcon); /* 02E COPCON */ SW (serper); /* 030 SERDAT * */ @@ -6987,7 +7009,7 @@ int is_cycle_ce (void) #endif -int ispal (void) +bool ispal (void) { if (beamcon0 & 0x80) return currprefs.ntscmode == 0; diff --git a/debug.cpp b/debug.cpp index 02773695..01b7cee1 100644 --- a/debug.cpp +++ b/debug.cpp @@ -2191,12 +2191,13 @@ static uae_u8 *dump_xlate (uae_u32 addr) static void memory_map_dump_2 (int log) { - int i, j, max, im; + bool imold; + int i, j, max; addrbank *a1 = mem_banks[0]; TCHAR txt[256]; - im = currprefs.illegal_mem; - currprefs.illegal_mem = 0; + imold = currprefs.illegal_mem; + currprefs.illegal_mem = false; max = currprefs.address_space_24 ? 256 : 65536; j = 0; for (i = 0; i < max + 1; i++) { @@ -2260,7 +2261,7 @@ static void memory_map_dump_2 (int log) a1 = a2; } } - currprefs.illegal_mem = im; + currprefs.illegal_mem = imold; } void memory_map_dump (void) { diff --git a/disk.cpp b/disk.cpp index 13920bc5..f0eb267b 100644 --- a/disk.cpp +++ b/disk.cpp @@ -143,10 +143,10 @@ typedef struct { trackid writetrackdata[MAX_TRACKS]; int buffered_cyl, buffered_side; int cyl; - int motoroff; + bool motoroff; int motordelay; /* dskrdy needs some clock cycles before it changes after switching off motor */ - int state; - int wrprot; + bool state; + bool wrprot; uae_u16 bigmfmbuf[0x4000 * DDHDMULT]; uae_u16 tracktiming[0x4000 * DDHDMULT]; int multi_revolution; @@ -160,9 +160,9 @@ typedef struct { int dmalen; int num_tracks, write_num_tracks, num_secs; int hard_num_cyls; - int dskchange; + bool dskchange; int dskchange_time; - int dskready; + bool dskready; int dskready_time; int dskready_down_time; int writtento; @@ -634,7 +634,7 @@ static void reset_drive (int i) static void update_drive_gui (int num) { drive *drv = floppy + num; - int writ = dskdmaen == 3 && drv->state && !(selected & (1 << num)); + bool writ = dskdmaen == 3 && drv->state && !(selected & (1 << num)); if (drv->state == gui_data.drive_motor[num] && drv->cyl == gui_data.drive_track[num] @@ -654,7 +654,7 @@ static void update_drive_gui (int num) static void drive_fill_bigbuf (drive * drv,int); -int DISK_validate_filename (const TCHAR *fname, int leave_open, int *wrprot, uae_u32 *crc32, struct zfile **zf) +int DISK_validate_filename (const TCHAR *fname, int leave_open, bool *wrprot, uae_u32 *crc32, struct zfile **zf) { if (zf) *zf = NULL; @@ -775,7 +775,7 @@ TCHAR *DISK_get_saveimagepath (const TCHAR *name) return name1; } -static struct zfile *getwritefile (const TCHAR *name, int *wrprot) +static struct zfile *getwritefile (const TCHAR *name, bool *wrprot) { struct zfile *zf; DISK_validate_filename (DISK_get_saveimagepath (name), 1, wrprot, NULL, &zf); @@ -785,7 +785,7 @@ static struct zfile *getwritefile (const TCHAR *name, int *wrprot) static int iswritefileempty (const TCHAR *name) { struct zfile *zf; - int wrprot; + bool wrprot; uae_char buffer[8]; trackid td[MAX_TRACKS]; int tracks, ddhd, i, ret; @@ -807,7 +807,7 @@ static int iswritefileempty (const TCHAR *name) static int openwritefile (drive *drv, int create) { - int wrprot = 0; + bool wrprot = 0; drv->writediskfile = getwritefile (currprefs.df[drv - &floppy[0]], &wrprot); if (drv->writediskfile) { @@ -826,10 +826,10 @@ static int openwritefile (drive *drv, int create) return drv->writediskfile ? 1 : 0; } -static int diskfile_iswriteprotect (const TCHAR *fname, int *needwritefile, drive_type *drvtype) +static bool diskfile_iswriteprotect (const TCHAR *fname, int *needwritefile, drive_type *drvtype) { struct zfile *zf1, *zf2; - int wrprot1 = 0, wrprot2 = 1; + bool wrprot1 = 0, wrprot2 = 1; uae_char buffer[25]; *needwritefile = 0; @@ -1236,7 +1236,7 @@ static void motordelay_func (uae_u32 v) floppy[v].motordelay = 0; } -static void drive_motor (drive * drv, int off) +static void drive_motor (drive * drv, bool off) { if (drv->motoroff && !off) { drv->dskready_time = DSKREADY_TIME; @@ -2175,7 +2175,8 @@ int disk_setwriteprotect (int num, const TCHAR *name, int protect) { int needwritefile, oldprotect; struct zfile *zf1, *zf2; - int wrprot1, wrprot2, i; + bool wrprot1, wrprot2; + int i; TCHAR *name2; drive_type drvtype; @@ -2230,15 +2231,26 @@ int DISK_history_add (const TCHAR *name, int idx, int type, int donotcheck) if (name[0] == 0) return 0; if (!donotcheck) { - if (!zfile_exists (name)) + if (!zfile_exists (name)) { + for (i = 0; i < MAX_PREVIOUS_FLOPPIES; i++) { + if (!_tcsicmp (dfxhistory[type][i], name)) { + while (i < MAX_PREVIOUS_FLOPPIES - 1) { + _tcscpy (dfxhistory[type][i], dfxhistory[type][i + 1]); + i++; + } + dfxhistory[type][MAX_PREVIOUS_FLOPPIES - 1][0] = 0; + break; + } + } return 0; + } } if (idx >= 0) { if (idx >= MAX_PREVIOUS_FLOPPIES) return 0; dfxhistory[type][idx][0] = 0; for (i = 0; i < MAX_PREVIOUS_FLOPPIES; i++) { - if (!_tcscmp (dfxhistory[type][i], name)) + if (!_tcsicmp (dfxhistory[type][i], name)) return 0; } _tcscpy (dfxhistory[type][idx], name); @@ -3466,7 +3478,7 @@ uae_u8 *restore_disk (int num,uae_u8 *src) drv->buffered_cyl = -1; drv->buffered_side = -1; drv->cyl = restore_u8 (); - drv->dskready = restore_u8 (); + drv->dskready = restore_u8 () != 0; drv->drive_id_scnt = restore_u8 (); drv->mfmpos = restore_u32 (); drv->dskchange = 0; diff --git a/drawing.cpp b/drawing.cpp index 8f34aa86..0016a171 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -69,8 +69,8 @@ static void lores_reset (void) sprite_buffer_res++; } -int aga_mode; /* mirror of chipset_mask & CSMASK_AGA */ -int direct_rgb; +bool aga_mode; /* mirror of chipset_mask & CSMASK_AGA */ +bool direct_rgb; /* The shift factor to apply when converting between Amiga coordinates and window coordinates. Zero if the resolution is the same, positive if window coordinates @@ -214,8 +214,8 @@ static uae_u32 plf_sprite_mask; static int sbasecol[2] = { 16, 16 }; static int brdsprt, brdblank, brdblank_changed; -int picasso_requested_on; -int picasso_on; +bool picasso_requested_on; +bool picasso_on; uae_sem_t gui_sem; int inhibit_frame; @@ -659,10 +659,6 @@ static void pfield_init_linetoscr (void) } } -STATIC_INLINE uae_u8 merge_2pixel8 (uae_u8 p1, uae_u8 p2) -{ - return p1; -} STATIC_INLINE uae_u16 merge_2pixel16 (uae_u16 p1, uae_u16 p2) { uae_u16 v = ((((p1 >> xredcolor_s) & xredcolor_m) + ((p2 >> xredcolor_s) & xredcolor_m)) / 2) << xredcolor_s; @@ -678,29 +674,6 @@ STATIC_INLINE uae_u32 merge_2pixel32 (uae_u32 p1, uae_u32 p2) return v; } -static void fill_line_8 (uae_u8 *buf, unsigned int start, unsigned int stop) -{ - uae_u8 *b = (uae_u8 *)buf; - unsigned int i; - unsigned int rem = 0; - xcolnr col = brdblank ? 0 : colors_for_drawing.acolors[0]; - while (((long)&b[start]) & 3) { - b[start++] = (uae_u8)col; - if (start == stop) - return; - } - if (((long)&b[stop]) & 3) { - rem = ((long)&b[stop]) & 3; - stop -= rem; - } - for (i = start; i < stop; i += 4) { - uae_u32 *b2 = (uae_u32 *)&b[i]; - *b2 = col; - } - while (rem--) - b[stop++] = (uae_u8) col; -} - static void fill_line_16 (uae_u8 *buf, unsigned int start, unsigned int stop) { uae_u16 *b = (uae_u16 *)buf; @@ -736,7 +709,6 @@ static void pfield_do_fill_line (int start, int stop) { xlinecheck(start, stop); switch (gfxvidinfo.pixbytes) { - case 1: fill_line_8 (xlinebuffer, start, stop); break; case 2: fill_line_16 (xlinebuffer, start, stop); break; case 4: fill_line_32 (xlinebuffer, start, stop); break; } @@ -1241,32 +1213,27 @@ static void pfield_do_linetoscr (int start, int stop) if (issprites) { if (res_shift == 0) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_spr (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_spr (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_spr (src_pixel, start, stop); break; } } else if (res_shift == 2) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_stretch2_spr (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_stretch2_spr (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_stretch2_spr (src_pixel, start, stop); break; } } else if (res_shift == 1) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_stretch1_spr (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_stretch1_spr (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_stretch1_spr (src_pixel, start, stop); break; } } else if (res_shift == -1) { if (currprefs.gfx_lores_mode) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_shrink1f_spr (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_shrink1f_spr (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_shrink1f_spr (src_pixel, start, stop); break; } } else { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_shrink1_spr (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_shrink1_spr (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_shrink1_spr (src_pixel, start, stop); break; } @@ -1275,32 +1242,27 @@ static void pfield_do_linetoscr (int start, int stop) } else { if (res_shift == 0) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8 (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16 (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32 (src_pixel, start, stop); break; } } else if (res_shift == 2) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_stretch2 (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_stretch2 (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_stretch2 (src_pixel, start, stop); break; } } else if (res_shift == 1) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_stretch1 (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_stretch1 (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_stretch1 (src_pixel, start, stop); break; } } else if (res_shift == -1) { if (currprefs.gfx_lores_mode) { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_shrink1f (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_shrink1f (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_shrink1f (src_pixel, start, stop); break; } } else { switch (gfxvidinfo.pixbytes) { - case 1: src_pixel = linetoscr_8_shrink1 (src_pixel, start, stop); break; case 2: src_pixel = linetoscr_16_shrink1 (src_pixel, start, stop); break; case 4: src_pixel = linetoscr_32_shrink1 (src_pixel, start, stop); break; } @@ -1862,7 +1824,7 @@ static void pfield_expand_dp_bplcon (void) #endif } -static int isham (uae_u16 bplcon0) +static bool isham (uae_u16 bplcon0) { int p = GET_PLANES (bplcon0); if (!(bplcon0 & 0x800)) @@ -2296,6 +2258,7 @@ static int frame_res_cnt; static void init_drawing_frame (void) { int i, maxline; +#if 1 static int frame_res_old; if (FRAMES_UNTIL_RES_SWITCH > 0 && frame_res_old == frame_res * 2 + frame_res_lace) { @@ -2345,6 +2308,7 @@ static void init_drawing_frame (void) can_use_lores++; lores_reset (); } +#endif init_hardware_for_drawing_frame (); @@ -2375,9 +2339,7 @@ static void init_drawing_frame (void) first_drawn_line = 32767; first_block_line = last_block_line = NO_BLOCK; - if (currprefs.test_drawing_speed) - frame_redraw_necessary = 1; - else if (frame_redraw_necessary) + if (frame_redraw_necessary) frame_redraw_necessary--; center_image (); @@ -2509,10 +2471,8 @@ void draw_status_line_single (uae_u8 *buf, int bpp, int y, int totalwidth, uae_u side = gui_data.drive_side; } else if (led == LED_POWER) { pos = 3; - //on = gui_data.powerled_brightness > 0; on_rgb = ((gui_data.powerled_brightness * 10 / 16) + 0x33) << 16; - on = gui_data.powerled; - //on_rgb = 0xcc0000; + on = 1; off_rgb = 0x330000; } else if (led == LED_CD) { pos = 5; diff --git a/expansion.cpp b/expansion.cpp index bc06e345..bd8e1896 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -131,7 +131,8 @@ uaecptr ROM_filesys_resname, ROM_filesys_resid; uaecptr ROM_filesys_diagentry; uaecptr ROM_hardfile_resname, ROM_hardfile_resid; uaecptr ROM_hardfile_init; -int uae_boot_rom, uae_boot_rom_size; /* size = code size only */ +bool uae_boot_rom; +int uae_boot_rom_size; /* size = code size only */ /* ********************************************************** */ diff --git a/filesys.cpp b/filesys.cpp index 69eb53b5..8f561586 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -112,7 +112,7 @@ static int automountunit = -1; #define DEVNAMES_PER_HDF 32 typedef struct { - int open; + bool open; TCHAR *devname; /* device name, e.g. UAE0: */ uaecptr devname_amiga; uaecptr startup; @@ -121,13 +121,14 @@ typedef struct { TCHAR *rootdir; /* root native directory/hdf. empty drive if invalid path */ struct zvolume *zarchive; TCHAR *rootdirdiff; /* "diff" file/directory */ - int readonly; /* disallow write access? */ + bool readonly; /* disallow write access? */ + bool locked; /* action write protect */ int bootpri; /* boot priority. -128 = no autoboot, -129 = no mount */ int devno; int controller; - int wasisempty; /* if true, this unit was created empty */ - int canremove; /* if true, this unit can be safely ejected and remounted */ - int configureddrive; /* if true, this is drive that was manually configured */ + bool wasisempty; /* if true, this unit was created empty */ + bool canremove; /* if true, this unit can be safely ejected and remounted */ + bool configureddrive; /* if true, this is drive that was manually configured */ struct hardfiledata hf; @@ -252,14 +253,14 @@ int get_filesys_unitconfig (struct uae_prefs *p, int index, struct mountedinfo * } if (my_getvolumeinfo (uci->rootdir) < 0) return -1; - mi->ismedia = 1; + mi->ismedia = true; return FILESYS_VIRTUAL; } else { - ui->hf.readonly = 1; + ui->hf.readonly = true; ui->hf.blocksize = uci->blocksize; if (!hdf_open (&ui->hf, uci->rootdir)) { - mi->ismedia = 0; - mi->ismounted = 1; + mi->ismedia = false; + mi->ismounted = true; if (uci->reserved == 0 && uci->sectors == 0 && uci->surfaces == 0) { if (ui->hf.flags & 1) return FILESYS_HARDDRIVE; @@ -267,7 +268,7 @@ int get_filesys_unitconfig (struct uae_prefs *p, int index, struct mountedinfo * } return -1; } - mi->ismedia = 1; + mi->ismedia = true; if (ui->hf.drive_empty) mi->ismedia = 0; hdf_close (&ui->hf); @@ -276,9 +277,9 @@ int get_filesys_unitconfig (struct uae_prefs *p, int index, struct mountedinfo * if (!ui->controller || (ui->controller && p->cs_ide)) { mi->ismounted = 1; if (uci->ishdf) - mi->ismedia = ui->hf.drive_empty ? 0 : 1; + mi->ismedia = ui->hf.drive_empty ? false : true; else - mi->ismedia = 1; + mi->ismedia = true; } } mi->size = ui->hf.virtsize; @@ -396,7 +397,7 @@ TCHAR *filesys_createvolname (const TCHAR *volname, const TCHAR *rootdir, const return nvol; } -static int set_filesys_volume (const TCHAR *rootdir, int *flags, int *readonly, int *emptydrive, struct zvolume **zvp) +static int set_filesys_volume (const TCHAR *rootdir, int *flags, bool *readonly, bool *emptydrive, struct zvolume **zvp) { *emptydrive = 0; if (my_existsfile (rootdir)) { @@ -425,14 +426,14 @@ static int set_filesys_volume (const TCHAR *rootdir, int *flags, int *readonly, } static int set_filesys_unit_1 (int nr, - TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, int readonly, + TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, bool readonly, int secspertrack, int surfaces, int reserved, - int blocksize, int bootpri, int donotmount, int autoboot, + int blocksize, int bootpri, bool donotmount, bool autoboot, TCHAR *filesysdir, int hdc, int flags) { UnitInfo *ui; int i; - int emptydrive = 0; + bool emptydrive = false; if (hdc) return -1; @@ -477,6 +478,7 @@ static int set_filesys_unit_1 (int nr, ui->volname = 0; ui->hf.readonly = readonly; if (!hdf_open (&ui->hf, rootdir) && !readonly) { + write_log (L"Attempting to open in read-only mode\n"); ui->hf.readonly = readonly = 1; hdf_open (&ui->hf, rootdir); } @@ -532,9 +534,9 @@ err: } static int set_filesys_unit (int nr, - TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, int readonly, + TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, bool readonly, int secspertrack, int surfaces, int reserved, - int blocksize, int bootpri, int donotmount, int autoboot, + int blocksize, int bootpri, bool donotmount, bool autoboot, TCHAR *filesysdir, int hdc, int flags) { int ret; @@ -545,9 +547,9 @@ static int set_filesys_unit (int nr, return ret; } -static int add_filesys_unit (TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, int readonly, +static int add_filesys_unit (TCHAR *devname, TCHAR *volname, const TCHAR *rootdir, bool readonly, int secspertrack, int surfaces, int reserved, - int blocksize, int bootpri, int donotmount, int autoboot, + int blocksize, int bootpri, bool donotmount, bool autoboot, TCHAR *filesysdir, int hdc, int flags) { int ret; @@ -851,45 +853,45 @@ typedef struct _unit { int volflags; uae_u32 lockkey; - int inhibited; - int canremovable; + bool inhibited; + bool canremovable; int mountcount; struct zvolume *zarchive; int reinsertdelay; TCHAR *newvolume; TCHAR *newrootdir; - int newreadonly; + bool newreadonly; int newflags; } Unit; static uae_u32 a_uniq, key_uniq; -typedef uae_u8 *dpacket; -#define PUT_PCK_RES1(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp_Res1), (v)); } while (0) -#define PUT_PCK_RES2(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp_Res2), (v)); } while (0) -#define GET_PCK_TYPE(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Type)))) -#define GET_PCK_RES1(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Res1)))) -#define GET_PCK_RES2(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Res2)))) -#define GET_PCK_ARG1(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg1)))) -#define GET_PCK_ARG2(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg2)))) -#define GET_PCK_ARG3(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg3)))) -#define GET_PCK_ARG4(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg4)))) -#define GET_PCK_ARG5(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg5)))) - -#define PUT_PCK64_RES0(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res0), (v)); } while (0) -#define PUT_PCK64_RES1(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res1), (((uae_u64)v) >> 32)); do_put_mem_long ((uae_u32 *)((p) + dp64_Res1 + 4), ((uae_u32)v)); } while (0) -#define PUT_PCK64_RES2(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res2), (v)); } while (0) - -#define GET_PCK64_TYPE(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Type)))) -#define GET_PCK64_RES0(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Res0)))) -#define GET_PCK64_RES1(p) ( (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Res1)))) << 32) | (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Res1 + 4)))) << 0) ) -#define GET_PCK64_ARG1(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg1)))) -#define GET_PCK64_ARG2(p) ( (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg2)))) << 32) | (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg2 + 4)))) << 0) ) -#define GET_PCK64_ARG3(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg3)))) -#define GET_PCK64_ARG4(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg4)))) -#define GET_PCK64_ARG5(p) ( (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg5)))) << 32) | (((uae_s64)(do_get_mem_long ((uae_u32 *)((p) + dp64_Arg5 + 4)))) << 0) ) +typedef uaecptr dpacket; +#define PUT_PCK_RES1(p,v) do { x_put_long ((p) + dp_Res1, (v)); } while (0) +#define PUT_PCK_RES2(p,v) do { x_put_long ((p) + dp_Res2, (v)); } while (0) +#define GET_PCK_TYPE(p) ((uae_s32)(x_get_long ((p) + dp_Type))) +#define GET_PCK_RES1(p) ((uae_s32)(x_get_long ((p) + dp_Res1))) +#define GET_PCK_RES2(p) ((uae_s32)(x_get_long ((p) + dp_Res2))) +#define GET_PCK_ARG1(p) ((uae_s32)(x_get_long ((p) + dp_Arg1))) +#define GET_PCK_ARG2(p) ((uae_s32)(x_get_long ((p) + dp_Arg2))) +#define GET_PCK_ARG3(p) ((uae_s32)(x_get_long ((p) + dp_Arg3))) +#define GET_PCK_ARG4(p) ((uae_s32)(x_get_long ((p) + dp_Arg4))) +#define GET_PCK_ARG5(p) ((uae_s32)(x_get_long ((p) + dp_Arg5))) + +#define PUT_PCK64_RES0(p,v) do { x_put_long ((p) + dp64_Res0, (v)); } while (0) +#define PUT_PCK64_RES1(p,v) do { x_put_long ((p) + dp64_Res1, (((uae_u64)v) >> 32)); x_put_long ((p) + dp64_Res1 + 4, ((uae_u32)v)); } while (0) +#define PUT_PCK64_RES2(p,v) do { x_put_long ((p) + dp64_Res2, (v)); } while (0) + +#define GET_PCK64_TYPE(p) ((uae_s32)(x_get_long ((p) + dp64_Type))) +#define GET_PCK64_RES0(p) ((uae_s32)(x_get_long ((p) + dp64_Res0))) +#define GET_PCK64_RES1(p) ( (((uae_s64)(x_get_long ((p) + dp64_Res1))) << 32) | (((uae_s64)(x_get_long ((p) + dp64_Res1 + 4))) << 0) ) +#define GET_PCK64_ARG1(p) ((uae_s32)(x_get_long ((p) + dp64_Arg1))) +#define GET_PCK64_ARG2(p) ( (((uae_s64)(x_get_long ((p) + dp64_Arg2))) << 32) | (((uae_s64)(x_get_long ((p) + dp64_Arg2 + 4))) << 0) ) +#define GET_PCK64_ARG3(p) ((uae_s32)(x_get_long ((p) + dp64_Arg3))) +#define GET_PCK64_ARG4(p) ((uae_s32)(x_get_long ((p) + dp64_Arg4))) +#define GET_PCK64_ARG5(p) ( (((uae_s64)(x_get_long ((p) + dp64_Arg5))) << 32) | (((uae_s64)(x_get_long ((p) + dp64_Arg5 + 4))) << 0) ) static int flush_cache (Unit *unit, int num); @@ -899,7 +901,7 @@ static TCHAR *char1 (uaecptr addr) static TCHAR bufx[1024]; unsigned int i = 0; do { - buf[i] = get_byte (addr); + buf[i] = x_get_byte (addr); addr++; } while (buf[i++] && i < sizeof (buf)); return au_fs_copy (bufx, sizeof (bufx) / sizeof (TCHAR), buf); @@ -910,11 +912,11 @@ static TCHAR *bstr1 (uaecptr addr) static TCHAR bufx[257]; static uae_char buf[257]; int i; - int n = get_byte (addr); + int n = x_get_byte (addr); addr++; for (i = 0; i < n; i++, addr++) - buf[i] = get_byte (addr); + buf[i] = x_get_byte (addr); buf[i] = 0; return au_fs_copy (bufx, sizeof (bufx) / sizeof (TCHAR), buf); } @@ -922,12 +924,12 @@ static TCHAR *bstr1 (uaecptr addr) static TCHAR *bstr (Unit *unit, uaecptr addr) { int i; - int n = get_byte (addr); + int n = x_get_byte (addr); uae_char buf[257]; addr++; for (i = 0; i < n; i++, addr++) - buf[i] = get_byte (addr); + buf[i] = x_get_byte (addr); buf[i] = 0; au_fs_copy (unit->tmpbuf3, sizeof (unit->tmpbuf3) / sizeof (TCHAR), buf); return unit->tmpbuf3; @@ -937,13 +939,13 @@ static TCHAR *bstr_cut (Unit *unit, uaecptr addr) { TCHAR *p = unit->tmpbuf3; int i, colon_seen = 0, off; - int n = get_byte (addr); + int n = x_get_byte (addr); uae_char buf[257]; off = 0; addr++; for (i = 0; i < n; i++, addr++) { - uae_u8 c = get_byte (addr); + uae_u8 c = x_get_byte (addr); buf[i] = c; if (c == '/' || (c == ':' && colon_seen++ == 0)) off = i + 1; @@ -1041,10 +1043,10 @@ static void set_volume_name (Unit *unit) s = ua_fs (unit->ui.volname, -1); namelen = strlen (s); - put_byte (unit->volume + 44, namelen); + x_put_byte (unit->volume + 44, namelen); for (i = 0; i < namelen; i++) - put_byte (unit->volume + 45 + i, s[i]); - put_byte (unit->volume + 45 + namelen, 0); + x_put_byte (unit->volume + 45 + i, s[i]); + x_put_byte (unit->volume + 45 + namelen, 0); xfree (s); unit->rootnode.aname = unit->ui.volname; unit->rootnode.nname = unit->ui.rootdir; @@ -1053,7 +1055,7 @@ static void set_volume_name (Unit *unit) static int filesys_isvolume (Unit *unit) { - return get_byte (unit->volume + 44); + return x_get_byte (unit->volume + 44); } static void clear_exkeys (Unit *unit) @@ -1105,8 +1107,8 @@ int filesys_eject (int nr) u->mountcount++; write_log (L"FILESYS: removed volume '%s'\n", u->ui.volname); flush_cache (u, -1); - put_byte (u->volume + 172 - 32, -2); - uae_Signal (get_long (u->volume + 176 - 32), 1 << 13); + x_put_byte (u->volume + 172 - 32, -2); + uae_Signal (x_get_long (u->volume + 176 - 32), 1 << 13); return 1; } @@ -1127,7 +1129,7 @@ void filesys_vsync (void) } } } -static void filesys_delayed_change (Unit *u, int frames, const TCHAR *rootdir, const TCHAR *volume, int readonly, int flags) +static void filesys_delayed_change (Unit *u, int frames, const TCHAR *rootdir, const TCHAR *volume, bool readonly, int flags) { u->reinsertdelay = 50; u->newflags = flags; @@ -1204,7 +1206,7 @@ int filesys_media_change (const TCHAR *rootdir, int inserted, struct uaedev_conf /* new volume inserted and it was previously mounted? */ if (nr >= 0) { if (!filesys_isvolume (u)) /* not going to mount twice */ - return filesys_insert (nr, volptr, rootdir, -1, -1); + return filesys_insert (nr, volptr, rootdir, false, -1); return 0; } if (inserted < 0) /* -1 = only mount if already exists */ @@ -1249,10 +1251,10 @@ int hardfile_remount (int nr) return 1; } -int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, int readonly, int flags) +int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, bool readonly, int flags) { struct uaedev_config_info *uci; - int emptydrive = 0; + bool emptydrive = false; UnitInfo *ui; Unit *u; @@ -1310,11 +1312,11 @@ int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, int readonly, i ui->volflags = u->volflags = u->ui.volflags = flags; _tcscpy (uci->volname, ui->volname); _tcscpy (uci->rootdir, rootdir); - if (readonly >= 0) + if (flags >= 0) uci->readonly = ui->readonly = u->ui.readonly = readonly; - put_byte (u->volume + 44, 0); - put_byte (u->volume + 172 - 32, 1); - uae_Signal (get_long (u->volume + 176 - 32), 1 << 13); + x_put_byte (u->volume + 44, 0); + x_put_byte (u->volume + 172 - 32, 1); + uae_Signal (x_get_long (u->volume + 176 - 32), 1 << 13); return 100 + nr; } @@ -2120,13 +2122,13 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context) /* Just got the startup packet. It's in A4. DosBase is in A2, * our allocated volume structure is in A3, A5 is a pointer to * our port. */ - uaecptr rootnode = get_long (m68k_areg (regs, 2) + 34); - uaecptr dos_info = get_long (rootnode + 24) << 2; + uaecptr rootnode = x_get_long (m68k_areg (regs, 2) + 34); + uaecptr dos_info = x_get_long (rootnode + 24) << 2; uaecptr pkt = m68k_dreg (regs, 3); - uaecptr arg2 = get_long (pkt + dp_Arg2); + uaecptr arg2 = x_get_long (pkt + dp_Arg2); uaecptr devnode; int i; - TCHAR *devname = bstr1 (get_long (pkt + dp_Arg1) << 2); + TCHAR *devname = bstr1 (x_get_long (pkt + dp_Arg1) << 2); TCHAR *s; Unit *unit; UnitInfo *uinfo; @@ -2150,8 +2152,8 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context) if (i == MAX_FILESYSTEM_UNITS) { write_log (L"Failed attempt to mount device '%s'\n", devname); - put_long (pkt + dp_Res1, DOS_FALSE); - put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED); + x_put_long (pkt + dp_Res1, DOS_FALSE); + x_put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED); return 0; } uinfo = mountinfo.ui + i; @@ -2161,8 +2163,8 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context) if (!uinfo->wasisempty && !ef && !ed) { write_log (L"Failed attempt to mount device '%s'\n", devname); - put_long (pkt + dp_Res1, DOS_FALSE); - put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED); + x_put_long (pkt + dp_Res1, DOS_FALSE); + x_put_long (pkt + dp_Res2, ERROR_DEVICE_NOT_MOUNTED); return 0; } @@ -2179,13 +2181,13 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context) unit->ui.volname, unit->volflags, uinfo->wasisempty, ed, ef, unit->ui.rootdir); /* fill in our process in the device node */ - devnode = get_long (pkt + dp_Arg3) << 2; - put_long (devnode + 8, unit->port); + devnode = x_get_long (pkt + dp_Arg3) << 2; + x_put_long (devnode + 8, unit->port); unit->dosbase = m68k_areg (regs, 2); /* make new volume */ unit->volume = m68k_areg (regs, 3) + 32; - put_long (unit->volume + 180 - 32, devnode); + x_put_long (unit->volume + 180 - 32, devnode); #ifdef UAE_FILESYS_THREADS unit->locklist = m68k_areg (regs, 3) + 8; #else @@ -2193,26 +2195,26 @@ static uae_u32 REGPARAM2 startup_handler (TrapContext *context) #endif unit->dummy_message = m68k_areg (regs, 3) + 12; - put_long (unit->dummy_message + 10, 0); + x_put_long (unit->dummy_message + 10, 0); - put_long (unit->volume + 4, 2); /* Type = dt_volume */ - put_long (unit->volume + 12, 0); /* Lock */ - put_long (unit->volume + 16, 3800 + i); /* Creation Date */ - put_long (unit->volume + 20, 0); - put_long (unit->volume + 24, 0); - put_long (unit->volume + 28, 0); /* lock list */ - put_long (unit->volume + 40, (unit->volume + 44) >> 2); /* Name */ + x_put_long (unit->volume + 4, 2); /* Type = dt_volume */ + x_put_long (unit->volume + 12, 0); /* Lock */ + x_put_long (unit->volume + 16, 3800 + i); /* Creation Date */ + x_put_long (unit->volume + 20, 0); + x_put_long (unit->volume + 24, 0); + x_put_long (unit->volume + 28, 0); /* lock list */ + x_put_long (unit->volume + 40, (unit->volume + 44) >> 2); /* Name */ - put_byte (unit->volume + 44, 0); + x_put_byte (unit->volume + 44, 0); if (!uinfo->wasisempty) { set_volume_name (unit); fsdb_clean_dir (&unit->rootnode); } - put_long (unit->volume + 8, unit->port); - put_long (unit->volume + 32, DISK_TYPE); + x_put_long (unit->volume + 8, unit->port); + x_put_long (unit->volume + 32, DISK_TYPE); - put_long (pkt + dp_Res1, DOS_TRUE); + x_put_long (pkt + dp_Res1, DOS_TRUE); return 1 | (late ? 2 : 0); } @@ -2232,15 +2234,15 @@ static void PUT_PCK_RES2 (packet, dos_errno ()); return; } - put_long (info, 0); /* errors */ - put_long (info + 4, unit->unit); /* unit number */ - put_long (info + 8, unit->ui.readonly ? 80 : 82); /* state */ - put_long (info + 12, fsu.fsu_blocks ); /* numblocks */ - put_long (info + 16, fsu.fsu_blocks - fsu.fsu_bavail); /* inuse */ - put_long (info + 20, 1024); /* bytesperblock */ - put_long (info + 24, DISK_TYPE); /* disk type */ - put_long (info + 28, unit->volume >> 2); /* volume node */ - put_long (info + 32, 0); /* inuse */ + x_put_long (info, 0); /* errors */ + x_put_long (info + 4, unit->unit); /* unit number */ + x_put_long (info + 8, unit->ui.readonly || unit->ui.locked ? 80 : 82); /* state */ + x_put_long (info + 12, fsu.fsu_blocks ); /* numblocks */ + x_put_long (info + 16, fsu.fsu_blocks - fsu.fsu_bavail); /* inuse */ + x_put_long (info + 20, 1024); /* bytesperblock */ + x_put_long (info + 24, DISK_TYPE); /* disk type */ + x_put_long (info + 28, unit->volume >> 2); /* volume node */ + x_put_long (info + 32, 0); /* inuse */ PUT_PCK_RES1 (packet, DOS_TRUE); } @@ -2316,10 +2318,10 @@ static void return; } TRACE((L"{ next=0x%lx, mode=%ld, handler=0x%lx, volume=0x%lx, aino %lx ", - get_long (lock) << 2, get_long (lock+8), - get_long (lock+12), get_long (lock+16), - get_long (lock + 4))); - a = lookup_aino (unit, get_long (lock + 4)); + x_get_long (lock) << 2, x_get_long (lock+8), + x_get_long (lock+12), x_get_long (lock+16), + x_get_long (lock + 4))); + a = lookup_aino (unit, x_get_long (lock + 4)); if (a == 0) { TRACE((L"not found!")); } else { @@ -2333,7 +2335,7 @@ static a_inode *find_aino (Unit *unit, uaecptr lock, const TCHAR *name, int *err a_inode *a; if (lock) { - a_inode *olda = lookup_aino (unit, get_long (lock + 4)); + a_inode *olda = lookup_aino (unit, x_get_long (lock + 4)); if (olda == 0) { /* That's the best we can hope to do. */ a = get_aino (unit, &unit->rootnode, name, err); @@ -2357,18 +2359,18 @@ static uaecptr make_lock (Unit *unit, uae_u32 uniq, long mode) /* allocate lock from the list kept by the assembly code */ uaecptr lock; - lock = get_long (unit->locklist); - put_long (unit->locklist, get_long (lock)); + lock = x_get_long (unit->locklist); + x_put_long (unit->locklist, x_get_long (lock)); lock += 4; - put_long (lock + 4, uniq); - put_long (lock + 8, mode); - put_long (lock + 12, unit->port); - put_long (lock + 16, unit->volume >> 2); + x_put_long (lock + 4, uniq); + x_put_long (lock + 8, mode); + x_put_long (lock + 12, unit->port); + x_put_long (lock + 16, unit->volume >> 2); /* prepend to lock chain */ - put_long (lock, get_long (unit->volume + 28)); - put_long (unit->volume + 28, lock >> 2); + x_put_long (lock, x_get_long (unit->volume + 28)); + x_put_long (unit->volume + 28, lock >> 2); DUMPLOCK(unit, lock); return lock; @@ -2386,16 +2388,16 @@ static uaecptr make_lock (Unit *unit, uae_u32 uniq, long mode) static void notify_send (Unit *unit, Notify *n) { uaecptr nr = n->notifyrequest; - int flags = get_long (nr + 12); + int flags = x_get_long (nr + 12); if (flags & NRF_SEND_MESSAGE) { if (!(flags & NRF_WAIT_REPLY) || ((flags & NRF_WAIT_REPLY) && !(flags & NRF_MAGIC))) { uae_NotificationHack (unit->port, nr); } else if (flags & NRF_WAIT_REPLY) { - put_long (nr + 12, get_long (nr + 12) | NRF_MAGIC); + x_put_long (nr + 12, x_get_long (nr + 12) | NRF_MAGIC); } } else if (flags & NRF_SEND_SIGNAL) { - uae_Signal (get_long (nr + 16), 1 << get_byte (nr + 20)); + uae_Signal (x_get_long (nr + 16), 1 << x_get_byte (nr + 20)); } } @@ -2436,8 +2438,8 @@ static void TRACE((L"ACTION_ADD_NOTIFY\n")); - name = my_strdup (char1 (get_long (nr + 4))); - flags = get_long (nr + 12); + name = my_strdup (char1 (x_get_long (nr + 4))); + flags = x_get_long (nr + 12); if (!(flags & (NRF_SEND_MESSAGE | NRF_SEND_SIGNAL))) { PUT_PCK_RES1 (packet, DOS_FALSE); @@ -2447,14 +2449,14 @@ static void #if 0 write_log (L"Notify:\n"); - write_log (L"nr_Name '%s'\n", char1 (get_long (nr + 0))); + write_log (L"nr_Name '%s'\n", char1 (x_get_long (nr + 0))); write_log (L"nr_FullName '%s'\n", name); - write_log (L"nr_UserData %08X\n", get_long (nr + 8)); + write_log (L"nr_UserData %08X\n", x_get_long (nr + 8)); write_log (L"nr_Flags %08X\n", flags); if (flags & NRF_SEND_MESSAGE) { - write_log (L"Message NotifyRequest, port = %08X\n", get_long (nr + 16)); + write_log (L"Message NotifyRequest, port = %08X\n", x_get_long (nr + 16)); } else if (flags & NRF_SEND_SIGNAL) { - write_log (L"Signal NotifyRequest, Task = %08X signal = %d\n", get_long (nr + 16), get_long (nr + 20)); + write_log (L"Signal NotifyRequest, Task = %08X signal = %d\n", x_get_long (nr + 16), x_get_long (nr + 20)); } else { write_log (L"corrupt NotifyRequest\n"); } @@ -2508,13 +2510,13 @@ static void free_lock (Unit *unit, uaecptr lock) if (! lock) return; - if (lock == get_long (unit->volume + 28) << 2) { - put_long (unit->volume + 28, get_long (lock)); + if (lock == x_get_long (unit->volume + 28) << 2) { + x_put_long (unit->volume + 28, x_get_long (lock)); } else { - uaecptr current = get_long (unit->volume + 28); + uaecptr current = x_get_long (unit->volume + 28); uaecptr next = 0; while (current) { - next = get_long (current << 2); + next = x_get_long (current << 2); if (lock == next << 2) break; current = next; @@ -2523,11 +2525,11 @@ static void free_lock (Unit *unit, uaecptr lock) write_log (L"tried to unlock non-existing lock %x\n", lock); return; } - put_long (current << 2, get_long (lock)); + x_put_long (current << 2, x_get_long (lock)); } lock -= 4; - put_long (lock, get_long (unit->locklist)); - put_long (unit->locklist, lock); + x_put_long (lock, x_get_long (unit->locklist)); + x_put_long (unit->locklist, lock); } static void @@ -2572,7 +2574,7 @@ static void action_free_lock (Unit *unit, dpacket packet) TRACE((L"ACTION_FREE_LOCK(0x%lx)\n", lock)); DUMPLOCK(unit, lock); - a = lookup_aino (unit, get_long (lock + 4)); + a = lookup_aino (unit, x_get_long (lock + 4)); if (a == 0) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_OBJECT_NOT_AROUND); @@ -2624,7 +2626,7 @@ static void PUT_PCK_RES1 (packet, 0); return; } - action_dup_lock_2 (unit, packet, get_long (lock + 4)); + action_dup_lock_2 (unit, packet, x_get_long (lock + 4)); } @@ -2800,9 +2802,9 @@ static void entrytype = aino->dir ? 2 : -3; xs = aino->aname; } - put_long (info + 4, entrytype); + x_put_long (info + 4, entrytype); /* AmigaOS docs say these have to contain the same value. */ - put_long (info + 120, entrytype); + x_put_long (info + 120, entrytype); TRACE((L"name=\"%s\"\n", xs)); x2 = x = ua_fs (xs, -1); @@ -2810,26 +2812,26 @@ static void if (n > 106) n = 106; i = 8; - put_byte (info + i, n); i++; + x_put_byte (info + i, n); i++; while (n--) - put_byte (info + i, *x), i++, x++; + x_put_byte (info + i, *x), i++, x++; while (i < 108) - put_byte (info + i, 0), i++; + x_put_byte (info + i, 0), i++; xfree (x2); - put_long (info + 116, fsdb_can ? aino->amigaos_mode : fsdb_mode_supported (aino)); - put_long (info + 124, statbuf.st_size > MAXFILESIZE32 ? MAXFILESIZE32 : statbuf.st_size); + x_put_long (info + 116, fsdb_can ? aino->amigaos_mode : fsdb_mode_supported (aino)); + x_put_long (info + 124, statbuf.st_size > MAXFILESIZE32 ? MAXFILESIZE32 : statbuf.st_size); #ifdef HAVE_ST_BLOCKS - put_long (info + 128, statbuf.st_blocks); + x_put_long (info + 128, statbuf.st_blocks); #else - put_long (info + 128, (statbuf.st_size + 511) / 512); + x_put_long (info + 128, (statbuf.st_size + 511) / 512); #endif get_time (statbuf.st_mtime, &days, &mins, &ticks); - put_long (info + 132, days); - put_long (info + 136, mins); - put_long (info + 140, ticks); + x_put_long (info + 132, days); + x_put_long (info + 136, mins); + x_put_long (info + 140, ticks); if (aino->comment == 0 || !fsdb_can) - put_long (info + 144, 0); + x_put_long (info + 144, 0); else { TRACE((L"comment=\"%s\"\n", aino->comment)); i = 144; @@ -2840,11 +2842,11 @@ static void n = strlen (x); if (n > 78) n = 78; - put_byte (info + i, n); i++; + x_put_byte (info + i, n); i++; while (n--) - put_byte (info + i, *x), i++, x++; + x_put_byte (info + i, *x), i++, x++; while (i < 224) - put_byte (info + i, 0), i++; + x_put_byte (info + i, 0), i++; xfree (x2); } PUT_PCK_RES1 (packet, DOS_TRUE); @@ -2855,7 +2857,7 @@ int get_native_path (uae_u32 lock, TCHAR *out) int i = 0; for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) { if (mountinfo.ui[i].self) { - a_inode *a = lookup_aino (mountinfo.ui[i].self, get_long ((lock << 2) + 4)); + a_inode *a = lookup_aino (mountinfo.ui[i].self, x_get_long ((lock << 2) + 4)); if (a) { _tcscpy (out, a->nname); return 0; @@ -2956,9 +2958,9 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec gid = 0; } - i = get_long (control + 0); + i = x_get_long (control + 0); while (i > 0) { - exp = get_long (exp); /* ed_Next */ + exp = x_get_long (exp); /* ed_Next */ i--; } @@ -2967,41 +2969,41 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec #if EXALL_DEBUG > 0 write_log (L"ID=%d, %d, %08x: '%s'%s\n", - get_long (control + 4), get_long (control + 0), exp, xs, aino->dir ? L" [DIR]" : L""); + x_get_long (control + 4), x_get_long (control + 0), exp, xs, aino->dir ? L" [DIR]" : L""); #endif - put_long (exp, exp + size + size2); /* ed_Next */ + x_put_long (exp, exp + size + size2); /* ed_Next */ if (type >= 1) { - put_long (exp + 4, exp + size2); + x_put_long (exp + 4, exp + size2); for (i = 0; i <= strlen (x); i++) { - put_byte (exp + size2, x[i]); + x_put_byte (exp + size2, x[i]); size2++; } } if (type >= 2) - put_long (exp + 8, entrytype); + x_put_long (exp + 8, entrytype); if (type >= 3) - put_long (exp + 12, statbuf.st_size > MAXFILESIZE32 ? MAXFILESIZE32 : statbuf.st_size); + x_put_long (exp + 12, statbuf.st_size > MAXFILESIZE32 ? MAXFILESIZE32 : statbuf.st_size); if (type >= 4) - put_long (exp + 16, flags); + x_put_long (exp + 16, flags); if (type >= 5) { - put_long (exp + 20, days); - put_long (exp + 24, mins); - put_long (exp + 28, ticks); + x_put_long (exp + 20, days); + x_put_long (exp + 24, mins); + x_put_long (exp + 28, ticks); } if (type >= 6) { - put_long (exp + 32, exp + size2); - put_byte (exp + size2, strlen (comment)); + x_put_long (exp + 32, exp + size2); + x_put_byte (exp + size2, strlen (comment)); for (i = 0; i <= strlen (comment); i++) { - put_byte (exp + size2, comment[i]); + x_put_byte (exp + size2, comment[i]); size2++; } } if (type >= 7) { - put_word (exp + 36, uid); - put_word (exp + 38, gid); + x_put_word (exp + 36, uid); + x_put_word (exp + 38, gid); } - put_long (control + 0, get_long (control + 0) + 1); + x_put_long (control + 0, x_get_long (control + 0) + 1); ret = 1; end: xfree (x); @@ -3018,7 +3020,7 @@ static int action_examine_all_do (Unit *unit, uaecptr lock, ExAllKey *eak, uaecp TCHAR fn[MAX_DPATH]; if (lock != 0) - base = lookup_aino (unit, get_long (lock + 4)); + base = lookup_aino (unit, x_get_long (lock + 4)); if (base == 0) base = &unit->rootnode; for (;;) { @@ -3041,7 +3043,7 @@ static int action_examine_all_do (Unit *unit, uaecptr lock, ExAllKey *eak, uaecp if (!aino) return 0; eak->id = unit->exallid++; - put_long (control + 4, eak->id); + x_put_long (control + 4, eak->id); if (!exalldo (exalldata, exalldatasize, type, control, unit, aino)) { eak->fn = my_strdup (fn); /* no space in exallstruct, save current entry */ break; @@ -3059,7 +3061,7 @@ static int action_examine_all_end (Unit *unit, dpacket packet) if (kickstart_version < 36) return 0; - id = get_long (control + 4); + id = x_get_long (control + 4); eak = getexall (unit, control, id); #if EXALL_DEBUG > 0 write_log (L"EXALL_END ID=%d %x\n", id, eak); @@ -3104,10 +3106,10 @@ static int action_examine_all (Unit *unit, dpacket packet) write_log (L"exall: %08x %08x-%08x %d %d %08x\n", lock, exalldata, exalldata + exalldatasize, exalldatasize, type, control); write_log (L"exall: MatchString %08x, MatchFunc %08x\n", - get_long (control + 8), get_long (control + 12)); + x_get_long (control + 8), x_get_long (control + 12)); #endif - put_long (control + 0, 0); /* eac_Entries */ + x_put_long (control + 0, 0); /* eac_Entries */ /* EXAMINE ALL might use dos.library MatchPatternNoCase() which is >=36 */ if (kickstart_version < 36) @@ -3119,7 +3121,7 @@ static int action_examine_all (Unit *unit, dpacket packet) } PUT_PCK_RES1 (packet, DOS_TRUE); - id = get_long (control + 4); + id = x_get_long (control + 4); if (id == EXALL_END) { write_log (L"FILESYS: EXALL called twice with ERROR_NO_MORE_ENTRIES\n"); goto fail; /* already ended exall() */ @@ -3133,7 +3135,7 @@ static int action_examine_all (Unit *unit, dpacket packet) } if (!action_examine_all_do (unit, lock, eak, exalldata, exalldatasize, type, control)) goto fail; - if (get_long (control + 0) == 0) { + if (x_get_long (control + 0) == 0) { /* uh, no space for first entry.. */ doserr = ERROR_NO_FREE_STORE; goto fail; @@ -3145,7 +3147,7 @@ static int action_examine_all (Unit *unit, dpacket packet) if (!eak) goto fail; if (lock != 0) - base = lookup_aino (unit, get_long (lock + 4)); + base = lookup_aino (unit, x_get_long (lock + 4)); if (base == 0) base = &unit->rootnode; #if EXALL_DEBUG > 0 @@ -3155,10 +3157,10 @@ static int action_examine_all (Unit *unit, dpacket packet) if (!d) goto fail; eak->dirhandle = d; - put_long (control + 4, eak->id); + x_put_long (control + 4, eak->id); if (!action_examine_all_do (unit, lock, eak, exalldata, exalldatasize, type, control)) goto fail; - if (get_long (control + 0) == 0) { + if (x_get_long (control + 0) == 0) { /* uh, no space for first entry.. */ doserr = ERROR_NO_FREE_STORE; goto fail; @@ -3170,18 +3172,18 @@ static int action_examine_all (Unit *unit, dpacket packet) fail: /* Clear last ed_Next. This "list" is quite non-Amiga like.. */ exp = exalldata; - i = get_long (control + 0); + i = x_get_long (control + 0); for (;;) { if (i <= 1) { if (exp) - put_long (exp, 0); + x_put_long (exp, 0); break; } - exp = get_long (exp); /* ed_Next */ + exp = x_get_long (exp); /* ed_Next */ i--; } #if EXALL_DEBUG > 0 - write_log("ok=%d, err=%d, eac_Entries = %d\n", ok, ok ? -1 : doserr, get_long (control + 0)); + write_log("ok=%d, err=%d, eac_Entries = %d\n", ok, ok ? -1 : doserr, x_get_long (control + 0)); #endif if (!ok) { @@ -3195,7 +3197,7 @@ fail: eak->fn = NULL; } if (doserr == ERROR_NO_MORE_ENTRIES) - put_long (control + 4, EXALL_END); + x_put_long (control + 4, EXALL_END); } return 1; } @@ -3205,8 +3207,8 @@ static uae_u32 REGPARAM2 exall_helper (TrapContext *context) int i; Unit *u; uaecptr packet = m68k_areg (regs, 4); - uaecptr control = get_long (packet + dp_Arg5); - uae_u32 id = get_long (control + 4); + uaecptr control = x_get_long (packet + dp_Arg5); + uae_u32 id = x_get_long (control + 4); #if EXALL_DEBUG > 0 write_log (L"FILESYS: EXALL extra round ID=%d\n", id); @@ -3216,7 +3218,7 @@ static uae_u32 REGPARAM2 exall_helper (TrapContext *context) for (u = units; u; u = u->next) { for (i = 0; i < EXALLKEYS; i++) { if (u->exalls[i].id == id && u->exalls[i].control == control) { - action_examine_all (u, get_real_address (packet)); + action_examine_all (u, packet); } } } @@ -3233,15 +3235,15 @@ static void action_examine_object (Unit *unit, dpacket packet) DUMPLOCK(unit, lock); if (lock != 0) - aino = lookup_aino (unit, get_long (lock + 4)); + aino = lookup_aino (unit, x_get_long (lock + 4)); if (aino == 0) aino = &unit->rootnode; get_fileinfo (unit, packet, info, aino); if (aino->dir) { - put_long (info, 0xFFFFFFFF); + x_put_long (info, 0xFFFFFFFF); } else - put_long (info, 0); + x_put_long (info, 0); } /* Read a directory's contents, create a_inodes for each file, and @@ -3323,11 +3325,11 @@ static void action_examine_next (Unit *unit, dpacket packet) DUMPLOCK(unit, lock); if (lock != 0) - aino = lookup_aino (unit, get_long (lock + 4)); + aino = lookup_aino (unit, x_get_long (lock + 4)); if (aino == 0) aino = &unit->rootnode; for(;;) { - uniq = get_long (info); + uniq = x_get_long (info); if (uniq == 0) { write_log (L"ExNext called for a file! (Houston?)\n"); goto no_more_entries; @@ -3345,13 +3347,13 @@ static void action_examine_next (Unit *unit, dpacket packet) } } else { TRACE((L"Looking up ExKey\n")); - ek = lookup_exkey (unit, get_long (info)); + ek = lookup_exkey (unit, x_get_long (info)); } if (ek == 0) { write_log (L"Couldn't find a matching ExKey. Prepare for trouble.\n"); goto no_more_entries; } - put_long (info, ek->uniq); + x_put_long (info, ek->uniq); if (!ek->curr_file || ek->curr_file->mountcount == unit->mountcount) break; ek->curr_file = ek->curr_file->sibling; @@ -3408,14 +3410,14 @@ static void do_find (Unit *unit, dpacket packet, int mode, int create, int fallb return; } if (create != 2) { - if ((((mode & aino->amigaos_mode) & A_FIBF_WRITE) != 0 || unit->ui.readonly) + if ((((mode & aino->amigaos_mode) & A_FIBF_WRITE) != 0 || unit->ui.readonly || unit->ui.locked) && fallback) { mode &= ~A_FIBF_WRITE; } /* Kick 1.3 doesn't check read and write access bits - maybe it would be * simpler just not to do that either. */ - if ((mode & A_FIBF_WRITE) != 0 && unit->ui.readonly) { + if ((mode & A_FIBF_WRITE) != 0 && (unit->ui.readonly || unit->ui.locked)) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3476,7 +3478,7 @@ static void do_find (Unit *unit, dpacket packet, int mode, int create, int fallb if (create && isarch) fsdb_set_file_attrs (aino); - put_long (fh + 36, k->uniq); + x_put_long (fh + 36, k->uniq); if (create == 2) { aino->elock = 1; // clear comment if file already existed @@ -3513,7 +3515,7 @@ static void return; } - aino = lookup_aino (unit, get_long (lock + 4)); + aino = lookup_aino (unit, x_get_long (lock + 4)); if (aino == 0) aino = &unit->rootnode; mode = aino->amigaos_mode; /* Use same mode for opened filehandle as existing Lock() */ @@ -3526,7 +3528,7 @@ static void : O_RDWR)); /* the files on CD really can have the write-bit set. */ - if (unit->ui.readonly) + if (unit->ui.readonly || unit->ui.locked) openmode = O_RDONLY; fd = fs_open (unit, aino->nname, openmode | O_BINARY); @@ -3540,7 +3542,7 @@ static void k->fd = fd; k->aino = aino; - put_long (fh + 36, k->uniq); + x_put_long (fh + 36, k->uniq); /* I don't think I need to play with shlock count here, because I'm opening from an existing lock ??? */ @@ -3559,7 +3561,7 @@ static void static void action_find_output (Unit *unit, dpacket packet) { - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3570,7 +3572,7 @@ static void static void action_find_write (Unit *unit, dpacket packet) { - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3663,6 +3665,7 @@ static void PUT_PCK_RES1 (packet, actual); k->file_pos += actual; } + flush_dcache (addr, size); } else { uae_u8 *buf; off_t old, filesize; @@ -3691,7 +3694,7 @@ static void int i; PUT_PCK_RES1 (packet, actual); for (i = 0; i < actual; i++) - put_byte (addr + i, buf[i]); + x_put_byte (addr + i, buf[i]); k->file_pos += actual; } xfree (buf); @@ -3718,7 +3721,7 @@ static void gui_flicker_led (LED_HD, unit->unit, 2); TRACE((L"ACTION_WRITE(%s,0x%lx,%ld)\n", k->aino->nname, addr, size)); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3740,7 +3743,7 @@ static void } for (i = 0; i < size; i++) - buf[i] = get_byte (addr + i); + buf[i] = x_get_byte (addr + i); actual = fs_write (k->fd, buf, size); xfree (buf); @@ -3823,7 +3826,7 @@ static void TRACE((L"ACTION_SET_PROTECT(0x%lx,\"%s\",0x%lx)\n", lock, bstr (unit, name), mask)); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3859,7 +3862,7 @@ static void action_set_comment (Unit * unit, dpacket packet) a_inode *a; int err; - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -3919,7 +3922,7 @@ static void if (!lock1 || !lock2) { PUT_PCK_RES1 (packet, lock1 == lock2 ? DOS_TRUE : DOS_FALSE); } else { - PUT_PCK_RES1 (packet, get_long (lock1 + 4) == get_long (lock2 + 4) ? DOS_TRUE : DOS_FALSE); + PUT_PCK_RES1 (packet, x_get_long (lock1 + 4) == x_get_long (lock2 + 4) ? DOS_TRUE : DOS_FALSE); } } @@ -3948,9 +3951,9 @@ static void } if (type == CHANGE_LOCK) { - uniq = get_long (object + 4); + uniq = x_get_long (object + 4); } else { - Key *k = lookup_key (unit, get_long (object + 36)); + Key *k = lookup_key (unit, x_get_long (object + 36)); if (!k) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_OBJECT_NOT_AROUND); @@ -4034,7 +4037,7 @@ static void PUT_PCK_RES1 (packet, 0); PUT_PCK_RES2 (packet, 0); } else { - action_parent_common (unit, packet, get_long (lock + 4)); + action_parent_common (unit, packet, x_get_long (lock + 4)); } TRACE((L"=%x %d\n", GET_PCK_RES1 (packet), GET_PCK_RES2 (packet))); } @@ -4049,7 +4052,7 @@ static void TRACE((L"ACTION_CREATE_DIR(0x%lx,\"%s\")\n", lock, bstr (unit, name))); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -4107,9 +4110,9 @@ static void get_fileinfo (unit, packet, info, aino); if (aino->dir) - put_long (info, 0xFFFFFFFF); + x_put_long (info, 0xFFFFFFFF); else - put_long (info, 0); + x_put_long (info, 0); } /* For a nice example of just how contradictory documentation can be, see the @@ -4229,7 +4232,7 @@ static void TRACE((L"ACTION_DELETE_OBJECT(0x%lx,\"%s\")\n", lock, bstr (unit, name))); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -4291,14 +4294,14 @@ static void TRACE((L"ACTION_SET_DATE(0x%lx,\"%s\")\n", lock, bstr (unit, name))); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; } - ut.actime = ut.modtime = put_time (get_long (date), get_long (date + 4), - get_long (date + 8)); + ut.actime = ut.modtime = put_time (x_get_long (date), x_get_long (date + 4), + x_get_long (date + 8)); a = find_aino (unit, lock, bstr (unit, name), &err); if (err == 0 && utime (a->nname, &ut) == -1) err = dos_errno (); @@ -4327,7 +4330,7 @@ static void TRACE((L"ACTION_RENAME_OBJECT(0x%lx,\"%s\",", lock1, bstr (unit, name1))); TRACE((L"0x%lx,\"%s\")\n", lock2, bstr (unit, name2))); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -4434,7 +4437,7 @@ static void TRACE((L"ACTION_RENAME_DISK(\"%s\")\n", bstr (unit, name))); - if (unit->ui.readonly) { + if (unit->ui.readonly || unit->ui.locked) { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, ERROR_DISK_WRITE_PROTECTED); return; @@ -4477,7 +4480,7 @@ static void { PUT_PCK_RES1 (packet, DOS_TRUE); flush_cache (unit, 0); - unit->inhibited = GET_PCK_ARG1 (packet); + unit->inhibited = GET_PCK_ARG1 (packet) != 0; TRACE((L"ACTION_INHIBIT(%d:%d)\n", unit->unit, unit->inhibited)); } @@ -4487,14 +4490,14 @@ static void TRACE((L"ACTION_WRITE_PROTECT()\n")); PUT_PCK_RES1 (packet, DOS_TRUE); if (GET_PCK_ARG1 (packet)) { - if (!(unit->ui.readonly & 2)) { - unit->ui.readonly |= 2; + if (!unit->ui.locked) { + unit->ui.locked = true; unit->lockkey = GET_PCK_ARG2 (packet); } } else { - if (unit->ui.readonly & 2) { + if (unit->ui.locked) { if (unit->lockkey == GET_PCK_ARG2 (packet) || unit->lockkey == 0) { - unit->ui.readonly &= ~2; + unit->ui.locked = false; } else { PUT_PCK_RES1 (packet, DOS_FALSE); PUT_PCK_RES2 (packet, 0); @@ -4699,17 +4702,17 @@ static uae_u32 REGPARAM2 exter_int_helper (TrapContext *context) int cnt = 0; locks = read_comm_pipe_int_blocking (unit->ui.back_pipe); lockend = locks; - while (get_long (lockend) != 0) { - if (get_long (lockend) == lockend) { + while (x_get_long (lockend) != 0) { + if (x_get_long (lockend) == lockend) { write_log (L"filesystem lock queue corrupted!\n"); break; } - lockend = get_long (lockend); + lockend = x_get_long (lockend); cnt++; } TRACE((L"message_lock: %d %x %x %x\n", cnt, locks, lockend, m68k_areg (regs, 3))); - put_long (lockend, get_long (m68k_areg (regs, 3))); - put_long (m68k_areg (regs, 3), locks); + x_put_long (lockend, x_get_long (m68k_areg (regs, 3))); + x_put_long (m68k_areg (regs, 3), locks); } } #else @@ -4891,12 +4894,12 @@ static void *filesys_thread (void *unit_v) uae_set_thread_priority (NULL, 1); for (;;) { - uae_u8 *pck; - uae_u8 *msg; + dpacket pck; + uaecptr msg; uae_u32 morelocks; - pck = (uae_u8 *)read_comm_pipe_pvoid_blocking (ui->unit_pipe); - msg = (uae_u8 *)read_comm_pipe_pvoid_blocking (ui->unit_pipe); + pck = read_comm_pipe_u32_blocking (ui->unit_pipe); + msg = read_comm_pipe_u32_blocking (ui->unit_pipe); morelocks = (uae_u32)read_comm_pipe_int_blocking (ui->unit_pipe); if (ui->reset_state == FS_GO_DOWN) { @@ -4908,14 +4911,14 @@ static void *filesys_thread (void *unit_v) return 0; } - put_long (get_long (morelocks), get_long (ui->self->locklist)); - put_long (ui->self->locklist, morelocks); + x_put_long (x_get_long (morelocks), x_get_long (ui->self->locklist)); + x_put_long (ui->self->locklist, morelocks); if (! handle_packet (ui->self, pck)) { PUT_PCK_RES1 (pck, DOS_FALSE); PUT_PCK_RES2 (pck, ERROR_ACTION_NOT_KNOWN); } /* Mark the packet as processed for the list scan in the assembly code. */ - do_put_mem_long ((uae_u32 *)(msg + 4), -1); + x_put_long (msg + 4, 0xffffffff); /* Acquire the message lock, so that we know we can safely send the * message. */ ui->self->cmds_sent++; @@ -4923,9 +4926,9 @@ static void *filesys_thread (void *unit_v) * happens. */ do_uae_int_requested(); /* Send back the locks. */ - if (get_long (ui->self->locklist) != 0) - write_comm_pipe_int (ui->back_pipe, (int)(get_long (ui->self->locklist)), 0); - put_long (ui->self->locklist, 0); + if (x_get_long (ui->self->locklist) != 0) + write_comm_pipe_int (ui->back_pipe, (int)(x_get_long (ui->self->locklist)), 0); + x_put_long (ui->self->locklist, 0); } return 0; @@ -4938,16 +4941,12 @@ static uae_u32 REGPARAM2 filesys_handler (TrapContext *context) Unit *unit = find_unit (m68k_areg (regs, 5)); uaecptr packet_addr = m68k_dreg (regs, 3); uaecptr message_addr = m68k_areg (regs, 4); - uae_u8 *pck; - uae_u8 *msg; if (! valid_address (packet_addr, 36) || ! valid_address (message_addr, 14)) { write_log (L"FILESYS: Bad address %x/%x passed for packet.\n", packet_addr, message_addr); goto error2; } - pck = get_real_address (packet_addr); - msg = get_real_address (message_addr); - do_put_mem_long ((uae_u32 *)(msg + 4), -1); + x_put_long (message_addr + 4, 0xffffffff); if (!unit || !unit->volume) { write_log (L"FILESYS: was not initialized.\n"); goto error; @@ -4958,26 +4957,26 @@ static uae_u32 REGPARAM2 filesys_handler (TrapContext *context) if (!unit->ui.unit_pipe) goto error; /* Get two more locks and hand them over to the other thread. */ - morelocks = get_long (m68k_areg (regs, 3)); - put_long (m68k_areg (regs, 3), get_long (get_long (morelocks))); - put_long (get_long (morelocks), 0); + morelocks = x_get_long (m68k_areg (regs, 3)); + x_put_long (m68k_areg (regs, 3), x_get_long (x_get_long (morelocks))); + x_put_long (x_get_long (morelocks), 0); /* The packet wasn't processed yet. */ - do_put_mem_long ((uae_u32 *)(msg + 4), 0); - write_comm_pipe_pvoid (unit->ui.unit_pipe, (void *)pck, 0); - write_comm_pipe_pvoid (unit->ui.unit_pipe, (void *)msg, 0); + x_put_long (message_addr + 4, 0); + write_comm_pipe_u32 (unit->ui.unit_pipe, packet_addr, 0); + write_comm_pipe_u32 (unit->ui.unit_pipe, message_addr, 0); write_comm_pipe_int (unit->ui.unit_pipe, (int)morelocks, 1); /* Don't reply yet. */ return 1; } #endif - if (! handle_packet (unit, pck)) { + if (! handle_packet (unit, packet_addr)) { error: - PUT_PCK_RES1 (pck, DOS_FALSE); - PUT_PCK_RES2 (pck, ERROR_ACTION_NOT_KNOWN); + PUT_PCK_RES1 (packet_addr, DOS_FALSE); + PUT_PCK_RES2 (packet_addr, ERROR_ACTION_NOT_KNOWN); } - TRACE((L"reply: %8lx, %ld\n", GET_PCK_RES1 (pck), GET_PCK_RES2 (pck))); + TRACE((L"reply: %8lx, %ld\n", GET_PCK_RES1 (packet_addr), GET_PCK_RES2 (packet_addr))); error2: @@ -5113,14 +5112,14 @@ static uae_u32 REGPARAM2 filesys_diagentry (TrapContext *context) if (ROM_hardfile_resid != 0) { /* Build a struct Resident. This will set up and initialize * the uae.device */ - put_word (resaddr + 0x0, 0x4AFC); - put_long (resaddr + 0x2, resaddr); - put_long (resaddr + 0x6, resaddr + 0x1A); /* Continue scan here */ - put_word (resaddr + 0xA, 0x8101); /* RTF_AUTOINIT|RTF_COLDSTART; Version 1 */ - put_word (resaddr + 0xC, 0x0305); /* NT_DEVICE; pri 05 */ - put_long (resaddr + 0xE, ROM_hardfile_resname); - put_long (resaddr + 0x12, ROM_hardfile_resid); - put_long (resaddr + 0x16, ROM_hardfile_init); /* calls filesys_init */ + x_put_word (resaddr + 0x0, 0x4AFC); + x_put_long (resaddr + 0x2, resaddr); + x_put_long (resaddr + 0x6, resaddr + 0x1A); /* Continue scan here */ + x_put_word (resaddr + 0xA, 0x8101); /* RTF_AUTOINIT|RTF_COLDSTART; Version 1 */ + x_put_word (resaddr + 0xC, 0x0305); /* NT_DEVICE; pri 05 */ + x_put_long (resaddr + 0xE, ROM_hardfile_resname); + x_put_long (resaddr + 0x12, ROM_hardfile_resid); + x_put_long (resaddr + 0x16, ROM_hardfile_init); /* calls filesys_init */ } resaddr += 0x1A; tmp = resaddr; @@ -5148,26 +5147,26 @@ static uae_u32 REGPARAM2 filesys_diagentry (TrapContext *context) /* scan for Residents and return pointer to array of them */ residents = resaddr; while (tmp < residents && tmp > start) { - if (get_word (tmp) == 0x4AFC && - get_long (tmp + 0x2) == tmp) { - put_word (resaddr, 0x227C); /* movea.l #tmp,a1 */ - put_long (resaddr + 2, tmp); - put_word (resaddr + 6, 0x7200); /* moveq.l #0,d1 */ - put_long (resaddr + 8, 0x4EAEFF9A); /* jsr -$66(a6) ; InitResident */ + if (x_get_word (tmp) == 0x4AFC && + x_get_long (tmp + 0x2) == tmp) { + x_put_word (resaddr, 0x227C); /* movea.l #tmp,a1 */ + x_put_long (resaddr + 2, tmp); + x_put_word (resaddr + 6, 0x7200); /* moveq.l #0,d1 */ + x_put_long (resaddr + 8, 0x4EAEFF9A); /* jsr -$66(a6) ; InitResident */ resaddr += 12; - tmp = get_long (tmp + 0x6); + tmp = x_get_long (tmp + 0x6); } else { tmp++; } } /* call setup_exter */ - put_word (resaddr + 0, 0x2079); - put_long (resaddr + 2, rtarea_base + bootrom_header + 4 + 5 * 4); /* move.l RTAREA_BASE+setup_exter,a0 */ - put_word (resaddr + 6, 0xd1fc); - put_long (resaddr + 8, rtarea_base + bootrom_header); /* add.l #RTAREA_BASE+bootrom_header,a0 */ - put_word (resaddr + 12, 0x4e90); /* jsr (a0) */ - put_word (resaddr + 14, 0x7001); /* moveq.l #1,d0 */ - put_word (resaddr + 16, RTS); + x_put_word (resaddr + 0, 0x2079); + x_put_long (resaddr + 2, rtarea_base + bootrom_header + 4 + 5 * 4); /* move.l RTAREA_BASE+setup_exter,a0 */ + x_put_word (resaddr + 6, 0xd1fc); + x_put_long (resaddr + 8, rtarea_base + bootrom_header); /* add.l #RTAREA_BASE+bootrom_header,a0 */ + x_put_word (resaddr + 12, 0x4e90); /* jsr (a0) */ + x_put_word (resaddr + 14, 0x7001); /* moveq.l #1,d0 */ + x_put_word (resaddr + 16, RTS); m68k_areg (regs, 0) = residents; return 1; @@ -5185,7 +5184,7 @@ static uae_u32 REGPARAM2 filesys_dev_bootfilesys (TrapContext *context) { uaecptr devicenode = m68k_areg (regs, 3); uaecptr parmpacket = m68k_areg (regs, 1); - uaecptr fsres = get_long (parmpacket + PP_FSRES); + uaecptr fsres = x_get_long (parmpacket + PP_FSRES); uaecptr fsnode; uae_u32 dostype, dostype2; UnitInfo *uip = mountinfo.ui; @@ -5195,20 +5194,20 @@ static uae_u32 REGPARAM2 filesys_dev_bootfilesys (TrapContext *context) if (type == FILESYS_VIRTUAL) return 0; - dostype = get_long (parmpacket + 80); - fsnode = get_long (fsres + 18); - while (get_long (fsnode)) { - dostype2 = get_long (fsnode + 14); + dostype = x_get_long (parmpacket + 80); + fsnode = x_get_long (fsres + 18); + while (x_get_long (fsnode)) { + dostype2 = x_get_long (fsnode + 14); if (dostype2 == dostype) { int i; - uae_u32 pf = get_long (fsnode + 22); // fse_PatchFlags + uae_u32 pf = x_get_long (fsnode + 22); // fse_PatchFlags for (i = 0; i < 32; i++) { if (pf & (1 << i)) - put_long (devicenode + 4 + i * 4, get_long (fsnode + 22 + 4 + i * 4)); + x_put_long (devicenode + 4 + i * 4, x_get_long (fsnode + 22 + 4 + i * 4)); } return 1; } - fsnode = get_long (fsnode); + fsnode = x_get_long (fsnode); } return 0; } @@ -5246,15 +5245,15 @@ static uae_u32 REGPARAM2 filesys_dev_remember (TrapContext *context) uaecptr parmpacket = m68k_areg (regs, 1); /* copy filesystem loaded from RDB */ - if (get_long (parmpacket + PP_FSPTR)) { + if (x_get_long (parmpacket + PP_FSPTR)) { for (i = 0; i < uip->rdb_filesyssize; i++) - put_byte (get_long (parmpacket + PP_FSPTR) + i, uip->rdb_filesysstore[i]); + x_put_byte (x_get_long (parmpacket + PP_FSPTR) + i, uip->rdb_filesysstore[i]); xfree (uip->rdb_filesysstore); uip->rdb_filesysstore = 0; uip->rdb_filesyssize = 0; } if (m68k_dreg (regs, 3) >= 0) - uip->startup = get_long (devicenode + 28); + uip->startup = x_get_long (devicenode + 28); return devicenode; } @@ -5300,17 +5299,17 @@ static int device_isdup (uaecptr expbase, TCHAR *devname) int len, i; TCHAR dname[256]; - bnode = get_long (expbase + 74); /* expansion.library bootnode list */ - while (get_long (bnode)) { - dnode = get_long (bnode + 16); /* device node */ - name = get_long (dnode + 40) << 2; /* device name BSTR */ - len = get_byte (name); + bnode = x_get_long (expbase + 74); /* expansion.library bootnode list */ + while (x_get_long (bnode)) { + dnode = x_get_long (bnode + 16); /* device node */ + name = x_get_long (dnode + 40) << 2; /* device name BSTR */ + len = x_get_byte (name); for (i = 0; i < len; i++) - dname[i] = get_byte (name + 1 + i); + dname[i] = x_get_byte (name + 1 + i); dname[len] = 0; if (!_tcsicmp (devname, dname)) return 1; - bnode = get_long (bnode); + bnode = x_get_long (bnode); } return 0; } @@ -5339,19 +5338,19 @@ static TCHAR *device_dupfix (uaecptr expbase, TCHAR *devname) static void dump_partinfo (uae_u8 *name, int num, uaecptr pp, int partblock) { TCHAR *s = au ((char*)name); - uae_u32 dostype = get_long (pp + 80); + uae_u32 dostype = x_get_long (pp + 80); uae_u64 size; - size = ((uae_u64)get_long (pp + 20)) * 4 * get_long (pp + 28) * get_long (pp + 36) * (get_long (pp + 56) - get_long (pp + 52) + 1); + size = ((uae_u64)x_get_long (pp + 20)) * 4 * x_get_long (pp + 28) * x_get_long (pp + 36) * (x_get_long (pp + 56) - x_get_long (pp + 52) + 1); write_log (L"RDB: '%s' dostype=%08X. PartBlock=%d\n", s, dostype, partblock); write_log (L"BlockSize: %d, Surfaces: %d, SectorsPerBlock %d\n", - get_long (pp + 20) * 4, get_long (pp + 28), get_long (pp + 32)); + x_get_long (pp + 20) * 4, x_get_long (pp + 28), x_get_long (pp + 32)); write_log (L"SectorsPerTrack: %d, Reserved: %d, LowCyl %d, HighCyl %d, Size %dM\n", - get_long (pp + 36), get_long (pp + 40), get_long (pp + 52), get_long (pp + 56), (uae_u32)(size >> 20)); + x_get_long (pp + 36), x_get_long (pp + 40), x_get_long (pp + 52), x_get_long (pp + 56), (uae_u32)(size >> 20)); write_log (L"Buffers: %d, BufMemType: %08x, MaxTransfer: %08x, BootPri: %d\n", - get_long (pp + 60), get_long (pp + 64), get_long (pp + 68), get_long (pp + 76)); + x_get_long (pp + 60), x_get_long (pp + 64), x_get_long (pp + 68), x_get_long (pp + 76)); xfree (s); } @@ -5465,16 +5464,16 @@ static int rdb_mount (UnitInfo *uip, int unit_no, int partnum, uaecptr parmpacke buf[37 + buf[36]] = 0; /* zero terminate BSTR */ s = au ((char*)buf + 37); - uip->rdb_devname_amiga[partnum] = ds (device_dupfix (get_long (parmpacket + PP_EXPLIB), s)); + uip->rdb_devname_amiga[partnum] = ds (device_dupfix (x_get_long (parmpacket + PP_EXPLIB), s)); xfree (s); - put_long (parmpacket, uip->rdb_devname_amiga[partnum]); /* name */ - put_long (parmpacket + 4, ROM_hardfile_resname); - put_long (parmpacket + 8, uip->devno); - put_long (parmpacket + 12, 0); /* Device flags */ + x_put_long (parmpacket, uip->rdb_devname_amiga[partnum]); /* name */ + x_put_long (parmpacket + 4, ROM_hardfile_resname); + x_put_long (parmpacket + 8, uip->devno); + x_put_long (parmpacket + 12, 0); /* Device flags */ for (i = 0; i < PP_MAXSIZE; i++) - put_byte (parmpacket + 16 + i, buf[128 + i]); + x_put_byte (parmpacket + 16 + i, buf[128 + i]); dump_partinfo (buf + 37, uip->devno, parmpacket, partblock); - dostype = get_long (parmpacket + 80); + dostype = x_get_long (parmpacket + 80); if (dostype == 0) { write_log (L"RDB: mount failed, dostype=0\n"); @@ -5491,21 +5490,21 @@ static int rdb_mount (UnitInfo *uip, int unit_no, int partnum, uaecptr parmpacke if (fileblock == -1 || !legalrdbblock (uip, fileblock)) goto error; - fsres = get_long (parmpacket + PP_FSRES); + fsres = x_get_long (parmpacket + PP_FSRES); if (!fsres) { write_log (L"RDB: FileSystem.resource not found, this shouldn't happen!\n"); goto error; } - fsnode = get_long (fsres + 18); - while (get_long (fsnode)) { - if (get_long (fsnode + 14) == dostype) + fsnode = x_get_long (fsres + 18); + while (x_get_long (fsnode)) { + if (x_get_long (fsnode + 14) == dostype) break; - fsnode = get_long (fsnode); + fsnode = x_get_long (fsnode); } oldversion = oldrevision = -1; - if (get_long (fsnode)) { - oldversion = get_word (fsnode + 18); - oldrevision = get_word (fsnode + 20); + if (x_get_long (fsnode)) { + oldversion = x_get_word (fsnode + 18); + oldrevision = x_get_word (fsnode + 20); } else { fsnode = 0; } @@ -5543,8 +5542,8 @@ static int rdb_mount (UnitInfo *uip, int unit_no, int partnum, uaecptr parmpacke } for (i = 0; i < 140; i++) - put_byte (parmpacket + PP_FSHDSTART + i, buf[32 + i]); - put_long (parmpacket + PP_FSHDSTART, dostype); + x_put_byte (parmpacket + PP_FSHDSTART + i, buf[32 + i]); + x_put_long (parmpacket + PP_FSHDSTART, dostype); /* we found required FSHD block */ fsmem = xmalloc (uae_u8, 262144); lsegblock = rl (buf + 72); @@ -5568,7 +5567,7 @@ static int rdb_mount (UnitInfo *uip, int unit_no, int partnum, uaecptr parmpacke break; } write_log (L"RDB: Filesystem loaded, %d bytes\n", i * (blocksize - 20)); - put_long (parmpacket + PP_FSSIZE, i * (blocksize - 20)); /* RDB filesystem size hack */ + x_put_long (parmpacket + PP_FSSIZE, i * (blocksize - 20)); /* RDB filesystem size hack */ uip->rdb_filesysstore = fsmem; uip->rdb_filesyssize = i * (blocksize - 20); xfree (buf); @@ -5584,11 +5583,11 @@ static void addfakefilesys (uaecptr parmpacket, uae_u32 dostype) int i; for (i = 0; i < 140; i++) - put_byte (parmpacket + PP_FSHDSTART + i, 0); - put_long (parmpacket + 80, dostype); - put_long (parmpacket + PP_FSHDSTART, dostype); - put_long (parmpacket + PP_FSHDSTART + 8, 0x100 | (dostype == 0x444f5300 ? 0x0 : 0x80)); - put_long (parmpacket + PP_FSHDSTART + 44, 0xffffffff); + x_put_byte (parmpacket + PP_FSHDSTART + i, 0); + x_put_long (parmpacket + 80, dostype); + x_put_long (parmpacket + PP_FSHDSTART, dostype); + x_put_long (parmpacket + PP_FSHDSTART + 8, 0x100 | (dostype == 0x444f5300 ? 0x0 : 0x80)); + x_put_long (parmpacket + PP_FSHDSTART + 44, 0xffffffff); } static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) @@ -5604,10 +5603,10 @@ static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) dostype = (buf[0] << 24) | (buf[1] << 16) |(buf[2] << 8) | buf[3]; if (dostype == 0) return FILESYS_HARDFILE; - fsres = get_long (parmpacket + PP_FSRES); - fsnode = get_long (fsres + 18); - while (get_long (fsnode)) { - if (get_long (fsnode + 14) == dostype) { + fsres = x_get_long (parmpacket + PP_FSRES); + fsnode = x_get_long (fsres + 18); + while (x_get_long (fsnode)) { + if (x_get_long (fsnode + 14) == dostype) { if (kickstart_version < 36) { addfakefilesys (parmpacket, dostype); } else if ((dostype & 0xffffff00) != 0x444f5300) { @@ -5615,7 +5614,7 @@ static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) } return FILESYS_HARDFILE; } - fsnode = get_long (fsnode); + fsnode = x_get_long (fsnode); } tmp[0] = 0; @@ -5654,7 +5653,7 @@ static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) } zfile_fclose (zf); uip->rdb_filesyssize = size; - put_long (parmpacket + PP_FSSIZE, uip->rdb_filesyssize); + x_put_long (parmpacket + PP_FSSIZE, uip->rdb_filesyssize); addfakefilesys (parmpacket, dostype); write_log (L"HDF: faked RDB filesystem %08X loaded\n", dostype); return FILESYS_HARDFILE; @@ -5663,7 +5662,7 @@ static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) static void get_new_device (int type, uaecptr parmpacket, TCHAR **devname, uaecptr *devname_amiga, int unit_no) { TCHAR buffer[80]; - uaecptr expbase = get_long (parmpacket + PP_EXPLIB); + uaecptr expbase = x_get_long (parmpacket + PP_EXPLIB); if (*devname == 0 || _tcslen (*devname) == 0) { int un = unit_no; @@ -5705,27 +5704,38 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *context) write_log (L"Mounting uaehf.device %d (%d):\n", unit_no, sub_no); get_new_device (type, parmpacket, &uip[unit_no].devname, &uip[unit_no].devname_amiga, unit_no); uip[unit_no].devno = unit_no; - put_long (parmpacket, uip[unit_no].devname_amiga); - put_long (parmpacket + 4, type != FILESYS_VIRTUAL ? ROM_hardfile_resname : fsdevname); - put_long (parmpacket + 8, uip[unit_no].devno); - put_long (parmpacket + 12, 0); /* Device flags */ - put_long (parmpacket + 16, 16); /* Env. size */ - put_long (parmpacket + 20, uip[unit_no].hf.blocksize >> 2); /* longwords per block */ - put_long (parmpacket + 24, 0); /* unused */ - put_long (parmpacket + 28, uip[unit_no].hf.surfaces); /* heads */ - put_long (parmpacket + 32, 1); /* sectors per block */ - put_long (parmpacket + 36, uip[unit_no].hf.secspertrack); /* sectors per track */ - put_long (parmpacket + 40, uip[unit_no].hf.reservedblocks); /* reserved blocks */ - put_long (parmpacket + 44, 0); /* unused */ - put_long (parmpacket + 48, 0); /* interleave */ - put_long (parmpacket + 52, 0); /* lowCyl */ - put_long (parmpacket + 56, uip[unit_no].hf.nrcyls <= 0 ? 0 : uip[unit_no].hf.nrcyls - 1); /* hiCyl */ - put_long (parmpacket + 60, 50); /* Number of buffers */ - put_long (parmpacket + 64, 0); /* Buffer mem type */ - put_long (parmpacket + 68, 0x7FFFFFFF); /* largest transfer */ - put_long (parmpacket + 72, ~1); /* addMask (?) */ - put_long (parmpacket + 76, uip[unit_no].bootpri); /* bootPri */ - put_long (parmpacket + 80, 0x444f5300); /* DOS\0 */ + x_put_long (parmpacket, uip[unit_no].devname_amiga); + x_put_long (parmpacket + 8, uip[unit_no].devno); + x_put_long (parmpacket + 12, 0); /* Device flags */ + x_put_long (parmpacket + 16, 16); /* Env. size */ + x_put_long (parmpacket + 24, 0); /* unused */ + x_put_long (parmpacket + 44, 0); /* unused */ + x_put_long (parmpacket + 48, 0); /* interleave */ + x_put_long (parmpacket + 60, 50); /* Number of buffers */ + x_put_long (parmpacket + 64, 0); /* Buffer mem type */ + x_put_long (parmpacket + 68, 0x7FFFFFFF); /* largest transfer */ + x_put_long (parmpacket + 72, ~1); /* addMask (?) */ + x_put_long (parmpacket + 76, uip[unit_no].bootpri); /* bootPri */ + x_put_long (parmpacket + 80, 0x444f5300); /* DOS\0 */ + if (type == FILESYS_VIRTUAL) { + x_put_long (parmpacket + 4, fsdevname); + x_put_long (parmpacket + 20, 1024 >> 2); /* longwords per block */ + x_put_long (parmpacket + 28, 15); /* heads */ + x_put_long (parmpacket + 32, 1); /* sectors per block */ + x_put_long (parmpacket + 36, 127); /* sectors per track */ + x_put_long (parmpacket + 40, 2); /* reserved blocks */ + x_put_long (parmpacket + 52, 0); /* lowCyl */ + x_put_long (parmpacket + 56, 1); /* hiCyl */ + } else { + x_put_long (parmpacket + 4, ROM_hardfile_resname); + x_put_long (parmpacket + 20, uip[unit_no].hf.blocksize >> 2); /* longwords per block */ + x_put_long (parmpacket + 28, uip[unit_no].hf.surfaces); /* heads */ + x_put_long (parmpacket + 32, 1); /* sectors per block */ + x_put_long (parmpacket + 36, uip[unit_no].hf.secspertrack); /* sectors per track */ + x_put_long (parmpacket + 40, uip[unit_no].hf.reservedblocks); /* reserved blocks */ + x_put_long (parmpacket + 52, 0); /* lowCyl */ + x_put_long (parmpacket + 56, uip[unit_no].hf.nrcyls <= 0 ? 0 : uip[unit_no].hf.nrcyls - 1); /* hiCyl */ + } if (type == FILESYS_HARDFILE) type = dofakefilesys (&uip[unit_no], parmpacket); if (uip[unit_no].bootpri < -127) @@ -5764,7 +5774,7 @@ static uae_u32 REGPARAM2 mousehack_done (TrapContext *context) consolehook_ret (m68k_areg (regs, 1), m68k_areg (regs, 2)); } else if (mode == 102) { uaecptr ret = consolehook_beginio (m68k_areg (regs, 1)); - put_long (m68k_areg (regs, 7) + 4 * 4, ret); + x_put_long (m68k_areg (regs, 7) + 4 * 4, ret); } else { write_log (L"Unknown mousehack hook %d\n", mode); } @@ -6446,7 +6456,8 @@ uae_u8 *restore_filesys (uae_u8 *src) int type, devno; UnitInfo *ui; TCHAR *devname = 0, *volname = 0, *rootdir = 0, *filesysdir = 0; - int bootpri, readonly; + int bootpri; + bool readonly; if (restore_u32 () != 2) return src; @@ -6457,7 +6468,7 @@ uae_u8 *restore_filesys (uae_u8 *src) volname = restore_string (); filesysdir = restore_string (); bootpri = restore_u8 (); - readonly = restore_u8 (); + readonly = restore_u8 () != 0; ui = &mountinfo.ui[devno]; ui->startup = restore_u32 (); filesys_configdev = restore_u32 (); @@ -6468,7 +6479,7 @@ uae_u8 *restore_filesys (uae_u8 *src) } if (set_filesys_unit (devno, devname, volname, rootdir, readonly, ui->hf.secspertrack, ui->hf.surfaces, ui->hf.reservedblocks, ui->hf.blocksize, - bootpri, 0, 1, filesysdir[0] ? filesysdir : NULL, 0, 0) < 0) { + bootpri, false, true, filesysdir[0] ? filesysdir : NULL, 0, 0) < 0) { write_log (L"filesys '%s' failed to restore\n", rootdir); goto end; } diff --git a/fpp.cpp b/fpp.cpp index 94c4f497..82980c99 100644 --- a/fpp.cpp +++ b/fpp.cpp @@ -141,79 +141,6 @@ typedef uae_s64 tointtype; typedef uae_s32 tointtype; #endif -STATIC_INLINE uae_u32 next_ilong_fpu (void) -{ - if (currprefs.mmu_model) - return next_ilong_mmu (); - else if (currprefs.cpu_cycle_exact) - return next_ilong_020ce (); - else - return next_ilong (); -} -STATIC_INLINE uae_u32 next_iword_fpu (void) -{ - if (currprefs.mmu_model) - return next_iword_mmu (); - else if (currprefs.cpu_cycle_exact) - return next_iword_020ce (); - else - return next_iword (); -} -STATIC_INLINE void put_long_fpu (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_long_mmu (addr, v); - else if (currprefs.cpu_cycle_exact) - put_long_ce020 (addr, v); - else - put_long (addr, v); -} -STATIC_INLINE uae_u32 get_long_fpu (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_long_mmu (addr); - else if (currprefs.cpu_cycle_exact) - return get_long_ce020 (addr); - else - return get_long (addr); -} -STATIC_INLINE void put_word_fpu (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_word_mmu (addr, v); - else if (currprefs.cpu_cycle_exact) - put_word_ce020 (addr, v); - else - put_word (addr, v); -} -STATIC_INLINE uae_u32 get_word_fpu (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_word_mmu (addr); - else if (currprefs.cpu_cycle_exact) - return get_word_ce020 (addr); - else - return get_word (addr); -} -STATIC_INLINE void put_byte_fpu (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_byte_mmu (addr, v); - else if (currprefs.cpu_cycle_exact) - put_byte_ce020 (addr, v); - else - put_byte (addr, v); -} -STATIC_INLINE uae_u32 get_byte_fpu (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_byte_mmu (addr); - else if (currprefs.cpu_cycle_exact) - return get_byte_ce020 (addr); - else - return get_byte (addr); -} - static void fpu_op_illg (uae_u32 opcode, int pcoffset) { if ((currprefs.cpu_model == 68060 && (currprefs.fpu_model == 0 || (regs.pcr & 2))) @@ -230,17 +157,17 @@ static void fpu_op_illg (uae_u32 opcode, int pcoffset) } regs.s = 1; m68k_areg (regs, 7) -= 4; - put_long_fpu (m68k_areg (regs, 7), oldpc); + x_put_long (m68k_areg (regs, 7), oldpc); m68k_areg (regs, 7) -= 4; - put_long_fpu (m68k_areg (regs, 7), oldpc); + x_put_long (m68k_areg (regs, 7), oldpc); m68k_areg (regs, 7) -= 2; - put_word_fpu (m68k_areg (regs, 7), 0x4000 + 11 * 4); + x_put_word (m68k_areg (regs, 7), 0x4000 + 11 * 4); m68k_areg (regs, 7) -= 4; - put_long_fpu (m68k_areg (regs, 7), newpc); + x_put_long (m68k_areg (regs, 7), newpc); m68k_areg (regs, 7) -= 2; - put_word_fpu (m68k_areg (regs, 7), regs.sr); + x_put_word (m68k_areg (regs, 7), regs.sr); write_log (L"68040/060 FPU disabled exception PC=%x\n", newpc); - newpc = get_long_fpu (regs.vbr + 11 * 4); + newpc = x_get_long (regs.vbr + 11 * 4); m68k_setpc (newpc); #ifdef JIT set_special (SPCFLAG_END_COMPILE); @@ -507,27 +434,27 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src) ad = m68k_areg (regs, reg); break; case 5: - ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) next_iword_fpu (); + ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword (); break; case 6: - ad = get_disp_ea_020 (m68k_areg (regs, reg), next_iword_fpu ()); + ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ()); break; case 7: switch (reg) { case 0: - ad = (uae_s32) (uae_s16) next_iword_fpu (); + ad = (uae_s32) (uae_s16) x_next_iword (); break; case 1: - ad = next_ilong_fpu (); + ad = x_next_ilong (); break; case 2: ad = m68k_getpc (); - ad += (uae_s32) (uae_s16) next_iword_fpu (); + ad += (uae_s32) (uae_s16) x_next_iword (); break; case 3: tmppc = m68k_getpc (); - tmp = next_iword_fpu (); - ad = get_disp_ea_020 (tmppc, tmp); + tmp = x_next_iword (); + ad = x_get_disp_ea_020 (tmppc, tmp); break; case 4: ad = m68k_getpc (); @@ -541,44 +468,44 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src) } switch (size) { case 0: - *src = (fptype) (uae_s32) get_long_fpu (ad); + *src = (fptype) (uae_s32) x_get_long (ad); break; case 1: - *src = to_single (get_long_fpu (ad)); + *src = to_single (x_get_long (ad)); break; case 2:{ uae_u32 wrd1, wrd2, wrd3; - wrd1 = get_long_fpu (ad); + wrd1 = x_get_long (ad); ad += 4; - wrd2 = get_long_fpu (ad); + wrd2 = x_get_long (ad); ad += 4; - wrd3 = get_long_fpu (ad); + wrd3 = x_get_long (ad); *src = to_exten (wrd1, wrd2, wrd3); } break; case 3:{ uae_u32 wrd1, wrd2, wrd3; - wrd1 = get_long_fpu (ad); + wrd1 = x_get_long (ad); ad += 4; - wrd2 = get_long_fpu (ad); + wrd2 = x_get_long (ad); ad += 4; - wrd3 = get_long_fpu (ad); + wrd3 = x_get_long (ad); *src = to_pack (wrd1, wrd2, wrd3); } break; case 4: - *src = (fptype) (uae_s16) get_word_fpu (ad); + *src = (fptype) (uae_s16) x_get_word (ad); break; case 5:{ uae_u32 wrd1, wrd2; - wrd1 = get_long_fpu (ad); + wrd1 = x_get_long (ad); ad += 4; - wrd2 = get_long_fpu (ad); + wrd2 = x_get_long (ad); *src = to_double (wrd1, wrd2); } break; case 6: - *src = (fptype) (uae_s8) get_byte_fpu (ad); + *src = (fptype) (uae_s8) x_get_byte (ad); break; default: return 0; @@ -642,27 +569,27 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra) ad = m68k_areg (regs, reg); break; case 5: - ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) next_iword_fpu (); + ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword (); break; case 6: - ad = get_disp_ea_020 (m68k_areg (regs, reg), next_iword_fpu ()); + ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ()); break; case 7: switch (reg) { case 0: - ad = (uae_s32) (uae_s16) next_iword_fpu (); + ad = (uae_s32) (uae_s16) x_next_iword (); break; case 1: - ad = next_ilong_fpu (); + ad = x_next_ilong (); break; case 2: ad = m68k_getpc (); - ad += (uae_s32) (uae_s16) next_iword_fpu (); + ad += (uae_s32) (uae_s16) x_next_iword (); break; case 3: tmppc = m68k_getpc (); - tmp = next_iword_fpu (); - ad = get_disp_ea_020 (tmppc, tmp); + tmp = x_next_iword (); + ad = x_get_disp_ea_020 (tmppc, tmp); break; case 4: ad = m68k_getpc (); @@ -674,46 +601,46 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra) } switch (size) { case 0: - put_long_fpu (ad, (uae_u32)toint (value, -2147483648.0, 2147483647.0)); + x_put_long (ad, (uae_u32)toint (value, -2147483648.0, 2147483647.0)); break; case 1: - put_long_fpu (ad, from_single (value)); + x_put_long (ad, from_single (value)); break; case 2: { uae_u32 wrd1, wrd2, wrd3; from_exten (value, &wrd1, &wrd2, &wrd3); - put_long_fpu (ad, wrd1); + x_put_long (ad, wrd1); ad += 4; - put_long_fpu (ad, wrd2); + x_put_long (ad, wrd2); ad += 4; - put_long_fpu (ad, wrd3); + x_put_long (ad, wrd3); } break; case 3: { uae_u32 wrd1, wrd2, wrd3; from_pack (value, &wrd1, &wrd2, &wrd3); - put_long_fpu (ad, wrd1); + x_put_long (ad, wrd1); ad += 4; - put_long_fpu (ad, wrd2); + x_put_long (ad, wrd2); ad += 4; - put_long_fpu (ad, wrd3); + x_put_long (ad, wrd3); } break; case 4: - put_word_fpu (ad, (uae_s16) toint (value, -32768.0, 32767.0)); + x_put_word (ad, (uae_s16) toint (value, -32768.0, 32767.0)); break; case 5:{ uae_u32 wrd1, wrd2; from_double (value, &wrd1, &wrd2); - put_long_fpu (ad, wrd1); + x_put_long (ad, wrd1); ad += 4; - put_long_fpu (ad, wrd2); + x_put_long (ad, wrd2); } break; case 6: - put_byte_fpu (ad, (uae_s8)toint (value, -128.0, 127.0)); + x_put_byte (ad, (uae_s8)toint (value, -128.0, 127.0)); break; default: return 0; @@ -744,27 +671,27 @@ STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad) *ad = m68k_areg (regs, reg); break; case 5: - *ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) next_iword_fpu (); + *ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword (); break; case 6: - *ad = get_disp_ea_020 (m68k_areg (regs, reg), next_iword_fpu ()); + *ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ()); break; case 7: switch (reg) { case 0: - *ad = (uae_s32) (uae_s16) next_iword_fpu (); + *ad = (uae_s32) (uae_s16) x_next_iword (); break; case 1: - *ad = next_ilong_fpu (); + *ad = x_next_ilong (); break; case 2: *ad = m68k_getpc (); - *ad += (uae_s32) (uae_s16) next_iword_fpu (); + *ad += (uae_s32) (uae_s16) x_next_iword (); break; case 3: tmppc = m68k_getpc (); - tmp = next_iword_fpu (); - *ad = get_disp_ea_020 (tmppc, tmp); + tmp = x_next_iword (); + *ad = x_get_disp_ea_020 (tmppc, tmp); break; default: return 0; @@ -868,7 +795,7 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra) if (fault_if_no_fpu (opcode, 4)) return; - disp = (uae_s32) (uae_s16) next_iword_fpu (); + disp = (uae_s32) (uae_s16) x_next_iword (); cc = fpp_cond (extra & 0x3f); if (cc == -1) { fpu_op_illg (opcode, 4); @@ -904,7 +831,7 @@ void fpuop_scc (uae_u32 opcode, uae_u16 extra) m68k_setpc (m68k_getpc () - 4); op_illg (opcode); } else - put_byte_fpu (ad, cc ? 0xff : 0x00); + x_put_byte (ad, cc ? 0xff : 0x00); } } @@ -971,47 +898,47 @@ void fpuop_save (uae_u32 opcode) /* 12 byte 68060 IDLE frame. */ if (incr < 0) { ad -= 4; - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); ad -= 4; - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); ad -= 4; - put_long_fpu (ad, 0x00006000); + x_put_long (ad, 0x00006000); } else { - put_long_fpu (ad, 0x00006000); + x_put_long (ad, 0x00006000); ad += 4; - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); ad += 4; - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); ad += 4; } } else if (currprefs.fpu_model == 68040) { /* 4 byte 68040 IDLE frame. */ if (incr < 0) { ad -= 4; - put_long_fpu (ad, fpu_version << 24); + x_put_long (ad, fpu_version << 24); } else { - put_long_fpu (ad, fpu_version << 24); + x_put_long (ad, fpu_version << 24); ad += 4; } } else { /* 68881/68882 */ int idle_size = currprefs.fpu_model == 68882 ? 0x38 : 0x18; if (incr < 0) { ad -= 4; - put_long_fpu (ad, 0x70000000); + x_put_long (ad, 0x70000000); for (i = 0; i < (idle_size - 1) / 4; i++) { ad -= 4; - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); } ad -= 4; - put_long_fpu (ad, (fpu_version << 24) | (idle_size << 16)); + x_put_long (ad, (fpu_version << 24) | (idle_size << 16)); } else { - put_long_fpu (ad, (fpu_version << 24) | (idle_size << 16)); + x_put_long (ad, (fpu_version << 24) | (idle_size << 16)); ad += 4; for (i = 0; i < (idle_size - 1) / 4; i++) { - put_long_fpu (ad, 0x00000000); + x_put_long (ad, 0x00000000); ad += 4; } - put_long_fpu (ad, 0x70000000); + x_put_long (ad, 0x70000000); ad += 4; } } @@ -1043,10 +970,10 @@ void fpuop_restore (uae_u32 opcode) /* all 68060 FPU frames are 12 bytes */ if (incr < 0) { ad -= 4; - d = get_long_fpu (ad); + d = x_get_long (ad); ad -= 8; } else { - d = get_long_fpu (ad); + d = x_get_long (ad); ad += 4; ad += 8; } @@ -1056,7 +983,7 @@ void fpuop_restore (uae_u32 opcode) if (incr < 0) { /* @@@ This may be wrong. */ ad -= 4; - d = get_long_fpu (ad); + d = x_get_long (ad); if ((d & 0xff000000) != 0) { /* Not a NULL frame? */ if ((d & 0x00ff0000) == 0) { /* IDLE */ } else if ((d & 0x00ff0000) == 0x00300000) { /* UNIMP */ @@ -1066,7 +993,7 @@ void fpuop_restore (uae_u32 opcode) } } } else { - d = get_long_fpu (ad); + d = x_get_long (ad); ad += 4; if ((d & 0xff000000) != 0) { /* Not a NULL frame? */ if ((d & 0x00ff0000) == 0) { /* IDLE */ @@ -1080,7 +1007,7 @@ void fpuop_restore (uae_u32 opcode) } else { /* 68881/68882 */ if (incr < 0) { ad -= 4; - d = get_long_fpu (ad); + d = x_get_long (ad); if ((d & 0xff000000) != 0) { if ((d & 0x00ff0000) == 0x00180000) ad -= 6 * 4; @@ -1090,7 +1017,7 @@ void fpuop_restore (uae_u32 opcode) ad -= 45 * 4; } } else { - d = get_long_fpu (ad); + d = x_get_long (ad); ad += 4; if ((d & 0xff000000) != 0) { if ((d & 0x00ff0000) == 0x00180000) @@ -1175,13 +1102,13 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) } else if ((opcode & 0x3f) == 0x3c) { if ((extra & 0x2000) == 0) { if (extra & 0x1000) { - regs.fpcr = next_ilong_fpu (); + regs.fpcr = x_next_ilong (); native_set_fpucw (regs.fpcr); } if (extra & 0x0800) - set_fpsr (next_ilong_fpu ()); + set_fpsr (x_next_ilong ()); if (extra & 0x0400) - regs.fpiar = next_ilong_fpu (); + regs.fpiar = x_next_ilong (); } } else if (extra & 0x2000) { /* FMOVEM FPP->memory */ @@ -1203,15 +1130,15 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) } ad -= incr; if (extra & 0x1000) { - put_long_fpu (ad, regs.fpcr & 0xffff); + x_put_long (ad, regs.fpcr & 0xffff); ad += 4; } if (extra & 0x0800) { - put_long_fpu (ad, get_fpsr()); + x_put_long (ad, get_fpsr()); ad += 4; } if (extra & 0x0400) { - put_long_fpu (ad, regs.fpiar); + x_put_long (ad, regs.fpiar); ad += 4; } ad -= incr; @@ -1239,16 +1166,16 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ad = ad - incr; } if (extra & 0x1000) { - regs.fpcr = get_long_fpu (ad); + regs.fpcr = x_get_long (ad); native_set_fpucw (regs.fpcr); ad += 4; } if (extra & 0x0800) { - set_fpsr(get_long_fpu (ad)); + set_fpsr(x_get_long (ad)); ad += 4; } if (extra & 0x0400) { - regs.fpiar = get_long_fpu (ad); + regs.fpiar = x_get_long (ad); ad += 4; } if ((opcode & 0x38) == 0x18) @@ -1294,11 +1221,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) if (list & 0x80) { from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3); ad -= 4; - put_long_fpu (ad, wrd3); + x_put_long (ad, wrd3); ad -= 4; - put_long_fpu (ad, wrd2); + x_put_long (ad, wrd2); ad -= 4; - put_long_fpu (ad, wrd1); + x_put_long (ad, wrd1); } list <<= 1; } @@ -1307,11 +1234,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) uae_u32 wrd1, wrd2, wrd3; if (list & 0x80) { from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3); - put_long_fpu (ad, wrd1); + x_put_long (ad, wrd1); ad += 4; - put_long_fpu (ad, wrd2); + x_put_long (ad, wrd2); ad += 4; - put_long_fpu (ad, wrd3); + x_put_long (ad, wrd3); ad += 4; } list <<= 1; @@ -1351,11 +1278,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) uae_u32 wrd1, wrd2, wrd3; if (list & 0x80) { ad -= 4; - wrd3 = get_long_fpu (ad); + wrd3 = x_get_long (ad); ad -= 4; - wrd2 = get_long_fpu (ad); + wrd2 = x_get_long (ad); ad -= 4; - wrd1 = get_long_fpu (ad); + wrd1 = x_get_long (ad); regs.fp[reg] = to_exten(wrd1, wrd2, wrd3); } list <<= 1; @@ -1364,11 +1291,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) for (reg = 0; reg <= 7; reg++) { uae_u32 wrd1, wrd2, wrd3; if (list & 0x80) { - wrd1 = get_long_fpu (ad); + wrd1 = x_get_long (ad); ad += 4; - wrd2 = get_long_fpu (ad); + wrd2 = x_get_long (ad); ad += 4; - wrd3 = get_long_fpu (ad); + wrd3 = x_get_long (ad); ad += 4; regs.fp[reg] = to_exten(wrd1, wrd2, wrd3); } diff --git a/gencpu.cpp b/gencpu.cpp index 72c20150..476d5312 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -221,13 +221,19 @@ static const char *bit_mask (int size) return 0; } +static char *srcl, *dstl; +static char *srcw, *dstw; +static char *srcb, *dstb; +static char *ce020_prefetch_long; +static char *ce020_prefetch_word; + static void gen_nextilong (char *type, char *name, int flags) { int r = m68k_pc_offset; m68k_pc_offset += 4; if (using_ce020) { - printf ("\t%s %s = get_long_ce020_prefetch (%d);\n", type, name, r); + printf ("\t%s %s = %s (%d);\n", type, name, ce020_prefetch_long, r); count_read += 2; } else if (using_ce) { printf ("\t%s %s;\n", type, name); @@ -276,7 +282,7 @@ static const char *gen_nextiword (int flags) m68k_pc_offset += 2; if (using_ce020) { - sprintf (buffer, "get_word_ce020_prefetch (%d)", r); + sprintf (buffer, "%s (%d)", ce020_prefetch_word, r); count_read++; } else if (using_ce) { if (flags & GF_NOREFILL) { @@ -315,7 +321,7 @@ static const char *gen_nextibyte (int flags) m68k_pc_offset += 2; if (using_ce020) { - sprintf (buffer, "(uae_u8)get_word_ce020_prefetch (%d)", r); + sprintf (buffer, "(uae_u8)%s (%d)", ce020_prefetch_word, r); count_read++; } else if (using_ce) { if (flags & GF_NOREFILL) { @@ -625,10 +631,8 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g start_brace (); /* This would ordinarily be done in gen_nextiword, which we bypass. */ insn_n_cycles += 4; - if (using_ce020) - printf ("\t%sa = get_disp_ea_020ce (m68k_areg (regs, %s), next_iword_020ce ());\n", name, reg); - else if (using_mmu) - printf ("\t%sa = get_disp_ea_040mmu (m68k_areg (regs, %s), next_iword_mmu ());\n", name, reg); + if (using_ce020 || using_mmu) + printf ("\t%sa = x_get_disp_ea_020 (m68k_areg (regs, %s), x_next_iword ());\n", name, reg); else printf ("\t%sa = get_disp_ea_020 (m68k_areg (regs, %s), next_iword ());\n", name, reg); } else { @@ -656,10 +660,8 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g /* This would ordinarily be done in gen_nextiword, which we bypass. */ insn_n_cycles += 4; printf ("\ttmppc = m68k_getpc ();\n"); - if (using_ce020) - printf ("\t%sa = get_disp_ea_020ce (tmppc, next_iword_020ce ());\n", name); - else if (using_mmu) - printf ("\t%sa = get_disp_ea_040mmu (tmppc, next_iword_mmu ());\n", name); + if (using_ce020 || using_mmu) + printf ("\t%sa = x_get_disp_ea_020 (tmppc, x_next_iword ());\n", name); else printf ("\t%sa = get_disp_ea_020 (tmppc, next_iword ());\n", name); } else { @@ -763,9 +765,9 @@ static void genamode2 (amodes mode, char *reg, wordsizes size, char *name, int g start_brace (); if (using_ce020) { switch (size) { - case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = get_byte_ce020 (%sa);\n", name, name); count_read++; break; - case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = get_word_ce020 (%sa);\n", name, name); count_read++; break; - case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = get_long_ce020 (%sa);\n", name, name); count_read += 2; break; + case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcb, name); count_read++; break; + case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcw, name); count_read++; break; + case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srcl, name); count_read += 2; break; default: abort (); } } else if (using_ce) { @@ -910,19 +912,19 @@ static void genastore_2 (char *from, amodes mode, char *reg, wordsizes size, cha if (using_ce020) { switch (size) { case sz_byte: - printf ("\tput_byte_ce020 (%sa, %s);\n", to, from); + printf ("\t%s (%sa, %s);\n", dstb, to, from); count_write++; break; case sz_word: if (cpu_level < 2 && (mode == PC16 || mode == PC8r)) abort (); - printf ("\tput_word_ce020 (%sa, %s);\n", to, from); + printf ("\t%s (%sa, %s);\n", dstw, to, from); count_write++; break; case sz_long: if (cpu_level < 2 && (mode == PC16 || mode == PC8r)) abort (); - printf ("\tput_long_ce020 (%sa, %s);\n", to, from); + printf ("\t%s (%sa, %s);\n", dstl, to, from); count_write += 2; break; default: @@ -1038,18 +1040,10 @@ static void genmovemel (uae_u16 opcode) char getcode[100]; int size = table68k[opcode].size == sz_long ? 4 : 2; - if (using_mmu) { - if (table68k[opcode].size == sz_long) { - strcpy (getcode, "get_long_mmu (srca)"); - } else { - strcpy (getcode, "(uae_s32)(uae_s16)get_word_mmu (srca)"); - } + if (table68k[opcode].size == sz_long) { + sprintf (getcode, "%s (srca)", srcl); } else { - if (table68k[opcode].size == sz_long) { - strcpy (getcode, "get_long (srca)"); - } else { - strcpy (getcode, "(uae_s32)(uae_s16)get_word (srca)"); - } + sprintf (getcode, "(uae_s32)(uae_s16)%s (srca)", srcw); } count_read += table68k[opcode].size == sz_long ? 2 : 1; printf ("\tuae_u16 mask = %s;\n", gen_nextiword (0)); @@ -1100,21 +1094,13 @@ static void genmovemel_ce (uae_u16 opcode) static void genmovemle (uae_u16 opcode) { - char *putcode; + char putcode[100]; int size = table68k[opcode].size == sz_long ? 4 : 2; - if (using_mmu) { - if (table68k[opcode].size == sz_long) { - putcode = "put_long_mmu (srca"; - } else { - putcode = "put_word_mmu (srca"; - } + if (table68k[opcode].size == sz_long) { + sprintf (putcode, "%s (srca", dstl); } else { - if (table68k[opcode].size == sz_long) { - putcode = "put_long (srca"; - } else { - putcode = "put_word (srca"; - } + sprintf (putcode, "%s (srca", dstw); } count_write += table68k[opcode].size == sz_long ? 2 : 1; @@ -1500,19 +1486,29 @@ static int islongimm (struct instr *curi) static void gen_opcode (unsigned long int opcode) { struct instr *curi = table68k + opcode; - char *srcl, *dstl; - char *srcw, *dstw; - char *srcb, *dstb; insn_n_cycles = using_prefetch ? 0 : 4; if (using_ce020) { - srcl = "get_long_ce020"; - dstl = "put_long_ce020"; - srcw = "get_word_ce020"; - dstw = "put_word_ce020"; - srcb = "get_byte_ce020"; - dstb = "put_byte_ce020"; + if (using_ce020 == 2) { + ce020_prefetch_long = "get_long_ce030_prefetch"; + ce020_prefetch_word = "get_word_ce030_prefetch"; + srcl = "get_long_ce030"; + dstl = "put_long_ce030"; + srcw = "get_word_ce030"; + dstw = "put_word_ce030"; + srcb = "get_byte_ce030"; + dstb = "put_byte_ce030"; + } else { + ce020_prefetch_long = "get_long_ce020_prefetch"; + ce020_prefetch_word = "get_word_ce020_prefetch"; + srcl = "get_long_ce020"; + dstl = "put_long_ce020"; + srcw = "get_word_ce020"; + dstw = "put_word_ce020"; + srcb = "get_byte_ce020"; + dstb = "put_byte_ce020"; + } } else if (using_mmu) { srcl = "get_long_mmu"; dstl = "put_long_mmu"; @@ -1636,7 +1632,8 @@ static void gen_opcode (unsigned long int opcode) genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0); genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0, 0); if (curi->smode == immi) { - c = 4; + c = curi->size == sz_long ? 2 : 4; + c += 4; } else { c = curi->size == sz_long ? 2 : 4; if (islongimm (curi)) @@ -1721,6 +1718,7 @@ static void gen_opcode (unsigned long int opcode) genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0); genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0, 0); if (curi->smode == immi) { + c = curi->size == sz_long ? 2 : 4; c += 4; } else { c = curi->size == sz_long ? 2 : 4; @@ -2072,6 +2070,8 @@ static void gen_opcode (unsigned long int opcode) break; case i_NOP: fill_prefetch_next (); + if (using_ce020) + printf ("\tdo_cycles_ce (6 * CYCLE_UNIT);\n"); break; case i_STOP: if (using_prefetch) { @@ -2205,7 +2205,11 @@ static void gen_opcode (unsigned long int opcode) } break; case i_RTS: - if (using_ce) + if (using_ce020 == 1) + printf ("\tm68k_do_rts_ce020 ();\n"); + else if (using_ce020 == 2) + printf ("\tm68k_do_rts_ce030 ();\n"); + else if (using_ce) printf ("\tm68k_do_rts_ce ();\n"); else if (using_indirect) printf ("\tm68k_do_rtsi ();\n"); @@ -2301,7 +2305,11 @@ static void gen_opcode (unsigned long int opcode) need_endlabel = 1; } addcycles000 (2); - if (using_ce) { + if (using_ce020 == 1) { + printf ("\tm68k_do_bsr_ce020 (m68k_getpc () + %d, s);\n", m68k_pc_offset); + } else if (using_ce020 == 2) { + printf ("\tm68k_do_bsr_ce030 (m68k_getpc () + %d, s);\n", m68k_pc_offset); + } else if (using_ce) { printf ("\tm68k_do_bsr_ce (m68k_getpc () + %d, s);\n", m68k_pc_offset); } else if (using_indirect) { printf ("\tm68k_do_bsri (m68k_getpc () + %d, s);\n", m68k_pc_offset); @@ -3198,12 +3206,9 @@ static void gen_opcode (unsigned long int opcode) { char *getb, *putb; - if (using_mmu) { - getb = "get_bitfield_040mmu"; - putb = "put_bitfield_040mmu"; - } else if (using_ce020) { - getb = "get_bitfield_020ce"; - putb = "put_bitfield_020ce"; + if (using_mmu || using_ce020) { + getb = "x_get_bitfield"; + putb = "x_put_bitfield"; } else { getb = "get_bitfield"; putb = "put_bitfield"; @@ -3445,7 +3450,7 @@ static void gen_opcode (unsigned long int opcode) break; case i_MMUOP030: printf ("\tuaecptr pc = m68k_getpc ();\n"); - printf ("\tuae_u16 extra = get_word (pc + 2);\n"); + printf ("\tuae_u16 extra = x_get_word (pc + 2);\n"); m68k_pc_offset += 2; sync_m68k_pc (); if (curi->smode == Areg || curi->smode == Dreg) @@ -3811,7 +3816,7 @@ int main (int argc, char **argv) if ((i >= 6 && i < 11) || (i > 12 && i < 20) || (i > 23 && i < 31)) continue; generate_stbl = 1; - if (i == 0 || i == 11 || i == 12 || i == 20 || i == 31) { + if (i == 0 || i == 11 || i == 12 || i == 20 || i == 21 || i == 31) { if (generate_stbl) fprintf (stblfile, "#ifdef CPUEMU_%d\n", postfix); postfix2 = postfix; @@ -3833,18 +3838,27 @@ int main (int argc, char **argv) using_ce = 1; for (rp = 0; rp < nr_cpuop_funcs; rp++) opcode_next_clev[rp] = 0; - } else if (i >= 20 && i < 30) { - cpu_level = 25 - i; + } else if (i == 20) { + cpu_level = 2; using_ce020 = 1; - if (i == 20) + read_counts (); + for (rp = 0; rp < nr_cpuop_funcs; rp++) + opcode_next_clev[rp] = cpu_level; + } else if (i == 21 || i == 22 || i == 23) { + cpu_level = 3 + (23 - i); + using_ce020 = 2; + if (i == 21) { read_counts (); + for (rp = 0; rp < nr_cpuop_funcs; rp++) + opcode_next_clev[rp] = cpu_level; + } } else if (i >= 31 && i < 40) { cpu_level = 4; using_mmu = 1; if (i == 31) read_counts (); for (rp = 0; rp < nr_cpuop_funcs; rp++) - opcode_next_clev[rp] = 4; + opcode_next_clev[rp] = cpu_level; } if (generate_stbl) { diff --git a/genlinetoscr.cpp b/genlinetoscr.cpp index 7c54dd82..8bf90db7 100644 --- a/genlinetoscr.cpp +++ b/genlinetoscr.cpp @@ -478,7 +478,7 @@ int main (int argc, char *argv[]) outln (" */"); outln (""); - for (bpp = DEPTH_8BPP; bpp <= DEPTH_MAX; bpp++) { + for (bpp = DEPTH_16BPP; bpp <= DEPTH_MAX; bpp++) { for (aga = 0; aga <= 1 ; aga++) { if (aga && bpp == DEPTH_8BPP) continue; diff --git a/include/autoconf.h b/include/autoconf.h index ed5dd875..4cb9cb55 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -47,8 +47,8 @@ extern uaecptr need_uae_boot_rom (void); struct mountedinfo { uae_u64 size; - int ismounted; - int ismedia; + bool ismounted; + bool ismedia; int nrcyls; }; @@ -59,12 +59,12 @@ extern int move_filesys_unitconfig (struct uae_prefs *p, int nr, int to); extern TCHAR *validatedevicename (TCHAR *s); extern TCHAR *validatevolumename (TCHAR *s); -int filesys_insert(int nr, TCHAR *volume, const TCHAR *rootdir, int readonly, int flags); -int filesys_eject(int nr); +int filesys_insert (int nr, TCHAR *volume, const TCHAR *rootdir, bool readonly, int flags); +int filesys_eject (int nr); int filesys_media_change (const TCHAR *rootdir, int inserted, struct uaedev_config_info *uci); extern TCHAR *filesys_createvolname (const TCHAR *volname, const TCHAR *rootdir, const TCHAR *def); -extern int target_get_volume_name(struct uaedev_mount_info *mtinf, const TCHAR *volumepath, TCHAR *volumename, int size, int inserted, int fullcheck); +extern int target_get_volume_name (struct uaedev_mount_info *mtinf, const TCHAR *volumepath, TCHAR *volumename, int size, bool inserted, bool fullcheck); extern int sprintf_filesys_unit (TCHAR *buffer, int num); diff --git a/include/cpu_prefetch.h b/include/cpu_prefetch.h index 9c7f8b56..af1add0f 100644 --- a/include/cpu_prefetch.h +++ b/include/cpu_prefetch.h @@ -216,16 +216,16 @@ STATIC_INLINE void put_long_ce020 (uaecptr addr, uae_u32 v) { mem_access_delay_long_write_ce020 (addr, v); } -STATIC_INLINE void put_word_ce020 (uaecptr addr, uae_u16 v) +STATIC_INLINE void put_word_ce020 (uaecptr addr, uae_u32 v) { mem_access_delay_word_write_ce020 (addr, v); } -STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u8 v) +STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u32 v) { mem_access_delay_byte_write_ce020 (addr, v); } -extern void fill_cache0x0 (uae_u32); +extern void fill_icache020 (uae_u32); STATIC_INLINE uae_u32 get_word_ce020_prefetch (int o) { @@ -238,10 +238,10 @@ STATIC_INLINE uae_u32 get_word_ce020_prefetch (int o) } if (pc == regs.prefetch020addr + 2) { uae_u32 v = regs.prefetch020data & 0xffff; - fill_cache0x0 (pc + 2); + fill_icache020 (pc + 2); return v; } - fill_cache0x0 (pc); + fill_icache020 (pc); } } @@ -265,6 +265,104 @@ STATIC_INLINE uae_u32 next_ilong_020ce (void) m68k_incpc (4); return r; } + +STATIC_INLINE void m68k_do_bsr_ce020 (uaecptr oldpc, uae_s32 offset) +{ + m68k_areg (regs, 7) -= 4; + put_long_ce020 (m68k_areg (regs, 7), oldpc); + m68k_incpc (offset); +} +STATIC_INLINE void m68k_do_rts_ce020 (void) +{ + m68k_setpc (get_long_ce020 (m68k_areg (regs, 7))); + m68k_areg (regs, 7) += 4; +} +#endif + +#ifdef CPUEMU_21 + +extern void fill_icache030 (uae_u32 addr); +extern void write_dcache030 (uaecptr, uae_u32, int); +extern uae_u32 read_dcache030 (uaecptr, int); + +STATIC_INLINE void put_long_ce030 (uaecptr addr, uae_u32 v) +{ + write_dcache030 (addr, v, 2); + mem_access_delay_long_write_ce020 (addr, v); +} +STATIC_INLINE void put_word_ce030 (uaecptr addr, uae_u32 v) +{ + write_dcache030 (addr, v, 1); + mem_access_delay_word_write_ce020 (addr, v); +} +STATIC_INLINE void put_byte_ce030 (uaecptr addr, uae_u32 v) +{ + write_dcache030 (addr, v, 0); + mem_access_delay_byte_write_ce020 (addr, v); +} +STATIC_INLINE uae_u32 get_long_ce030 (uaecptr addr) +{ + return read_dcache030 (addr, 2); +} +STATIC_INLINE uae_u32 get_word_ce030 (uaecptr addr) +{ + return read_dcache030 (addr, 1); +} +STATIC_INLINE uae_u32 get_byte_ce030 (uaecptr addr) +{ + return read_dcache030 (addr, 0); +} + +STATIC_INLINE uae_u32 get_word_ce030_prefetch (int o) +{ + uae_u32 pc = m68k_getpc () + o; + + for (;;) { + if (pc == regs.prefetch020addr) { + uae_u32 v = regs.prefetch020data >> 16; + return v; + } + if (pc == regs.prefetch020addr + 2) { + uae_u32 v = regs.prefetch020data & 0xffff; + fill_icache030 (pc + 2); + return v; + } + fill_icache030 (pc); + } +} + +STATIC_INLINE uae_u32 get_long_ce030_prefetch (int o) +{ + uae_u32 v; + v = get_word_ce030_prefetch (o) << 16; + v |= get_word_ce030_prefetch (o + 2); + return v; +} + +STATIC_INLINE uae_u32 next_iword_030ce (void) +{ + uae_u32 r = get_word_ce030_prefetch (0); + m68k_incpc (2); + return r; +} +STATIC_INLINE uae_u32 next_ilong_030ce (void) +{ + uae_u32 r = get_long_ce030_prefetch (0); + m68k_incpc (4); + return r; +} + +STATIC_INLINE void m68k_do_bsr_ce030 (uaecptr oldpc, uae_s32 offset) +{ + m68k_areg (regs, 7) -= 4; + put_long_ce030 (m68k_areg (regs, 7), oldpc); + m68k_incpc (offset); +} +STATIC_INLINE void m68k_do_rts_ce030 (void) +{ + m68k_setpc (get_long_ce030 (m68k_areg (regs, 7))); + m68k_areg (regs, 7) += 4; +} #endif #ifdef CPUEMU_12 diff --git a/include/custom.h b/include/custom.h index 508c4b5d..a65b12cb 100644 --- a/include/custom.h +++ b/include/custom.h @@ -31,8 +31,8 @@ extern void init_row_map (void); extern void init_hz (void); extern void init_custom (void); -extern int picasso_requested_on; -extern int picasso_on; +extern bool picasso_requested_on; +extern bool picasso_on; extern void set_picasso_hack_rate (int hz); /* Set to 1 to leave out the current frame in average frame time calculation. @@ -207,4 +207,4 @@ struct customhack { void customhack_put (struct customhack *ch, uae_u16 v, int hpos); uae_u16 customhack_get (struct customhack *ch, int hpos); extern void alloc_cycle_ext (int, int); -extern int ispal (void); +extern bool ispal (void); diff --git a/include/disk.h b/include/disk.h index 5f1eae46..8445ea7b 100644 --- a/include/disk.h +++ b/include/disk.h @@ -20,7 +20,7 @@ extern int disk_empty (int num); extern void disk_insert (int num, const TCHAR *name); extern void disk_insert_force (int num, const TCHAR *name); extern void DISK_check_change (void); -extern int DISK_validate_filename (const TCHAR *fname, int leave_open, int *wrprot, uae_u32 *crc32, struct zfile **zf); +extern int DISK_validate_filename (const TCHAR *fname, int leave_open, bool *wrprot, uae_u32 *crc32, struct zfile **zf); extern void DISK_handler (uae_u32); extern void DISK_update (int hpos); extern void DISK_hsync (int hpos); diff --git a/include/drawing.h b/include/drawing.h index a701894a..6ee3d55c 100644 --- a/include/drawing.h +++ b/include/drawing.h @@ -1,8 +1,8 @@ /* - * Data used for communication between custom.c and drawing.c. - * - * Copyright 1996-1998 Bernd Schmidt - */ +* Data used for communication between custom.c and drawing.c. +* +* Copyright 1996-1998 Bernd Schmidt +*/ #define SMART_UPDATE 1 @@ -26,12 +26,12 @@ #define DISPLAY_LEFT_SHIFT 0x40 #else /* According to the HRM, pixel data spends a couple of cycles somewhere in the chips - before it appears on-screen. (TW: display emulation now does this automatically) */ +before it appears on-screen. (TW: display emulation now does this automatically) */ #define DIW_DDF_OFFSET 1 /* this many cycles starting from hpos=0 are visible on right border */ #define HBLANK_OFFSET 9 /* We ignore that many lores pixels at the start of the display. These are - * invisible anyway due to hardware DDF limits. */ +* invisible anyway due to hardware DDF limits. */ #define DISPLAY_LEFT_SHIFT 0x40 #endif @@ -40,46 +40,46 @@ #define max_diwlastword (PIXEL_XPOS(0x1d4 >> 1)) extern int lores_factor, lores_shift, sprite_width, interlace_seen; -extern int aga_mode, direct_rgb; +extern bool aga_mode, direct_rgb; STATIC_INLINE int coord_hw_to_window_x (int x) { - x -= DISPLAY_LEFT_SHIFT; - return x << lores_shift; + x -= DISPLAY_LEFT_SHIFT; + return x << lores_shift; } STATIC_INLINE int coord_window_to_hw_x (int x) { - x >>= lores_shift; - return x + DISPLAY_LEFT_SHIFT; + x >>= lores_shift; + return x + DISPLAY_LEFT_SHIFT; } STATIC_INLINE int coord_diw_to_window_x (int x) { - return (x - DISPLAY_LEFT_SHIFT + DIW_DDF_OFFSET - 1) << lores_shift; + return (x - DISPLAY_LEFT_SHIFT + DIW_DDF_OFFSET - 1) << lores_shift; } STATIC_INLINE int coord_window_to_diw_x (int x) { - x = coord_window_to_hw_x (x); - return x - DIW_DDF_OFFSET; + x = coord_window_to_hw_x (x); + return x - DIW_DDF_OFFSET; } extern int framecnt; /* color values in two formats: 12 (OCS/ECS) or 24 (AGA) bit Amiga RGB (color_regs), - * and the native color value; both for each Amiga hardware color register. - * - * !!! See color_reg_xxx functions below before touching !!! - */ +* and the native color value; both for each Amiga hardware color register. +* +* !!! See color_reg_xxx functions below before touching !!! +*/ struct color_entry { - uae_u16 color_regs_ecs[32]; + uae_u16 color_regs_ecs[32]; #ifndef AGA - xcolnr acolors[32]; + xcolnr acolors[32]; #else - xcolnr acolors[256]; - uae_u32 color_regs_aga[256]; + xcolnr acolors[256]; + uae_u32 color_regs_aga[256]; #endif }; @@ -88,10 +88,10 @@ struct color_entry { /* warning: this is still ugly, but now works with either byte order */ #ifdef WORDS_BIGENDIAN # define CONVERT_RGB(c) \ - ( xbluecolors[((uae_u8*)(&c))[3]] | xgreencolors[((uae_u8*)(&c))[2]] | xredcolors[((uae_u8*)(&c))[1]] ) + ( xbluecolors[((uae_u8*)(&c))[3]] | xgreencolors[((uae_u8*)(&c))[2]] | xredcolors[((uae_u8*)(&c))[1]] ) #else # define CONVERT_RGB(c) \ - ( xbluecolors[((uae_u8*)(&c))[0]] | xgreencolors[((uae_u8*)(&c))[1]] | xredcolors[((uae_u8*)(&c))[2]] ) + ( xbluecolors[((uae_u8*)(&c))[0]] | xgreencolors[((uae_u8*)(&c))[1]] | xredcolors[((uae_u8*)(&c))[2]] ) #endif #else #define CONVERT_RGB(c) 0 @@ -100,68 +100,68 @@ struct color_entry { STATIC_INLINE xcolnr getxcolor (int c) { #ifdef AGA - if (direct_rgb) - return CONVERT_RGB(c); - else + if (direct_rgb) + return CONVERT_RGB(c); + else #endif - return xcolors[c]; + return xcolors[c]; } /* functions for reading, writing, copying and comparing struct color_entry */ STATIC_INLINE int color_reg_get (struct color_entry *ce, int c) { #ifdef AGA - if (aga_mode) - return ce->color_regs_aga[c]; - else + if (aga_mode) + return ce->color_regs_aga[c]; + else #endif - return ce->color_regs_ecs[c]; + return ce->color_regs_ecs[c]; } STATIC_INLINE void color_reg_set (struct color_entry *ce, int c, int v) { #ifdef AGA - if (aga_mode) - ce->color_regs_aga[c] = v; - else + if (aga_mode) + ce->color_regs_aga[c] = v; + else #endif - ce->color_regs_ecs[c] = v; + ce->color_regs_ecs[c] = v; } STATIC_INLINE int color_reg_cmp (struct color_entry *ce1, struct color_entry *ce2) { #ifdef AGA - if (aga_mode) - return memcmp (ce1->color_regs_aga, ce2->color_regs_aga, sizeof (uae_u32) * 256); - else + if (aga_mode) + return memcmp (ce1->color_regs_aga, ce2->color_regs_aga, sizeof (uae_u32) * 256); + else #endif - return memcmp (ce1->color_regs_ecs, ce2->color_regs_ecs, sizeof (uae_u16) * 32); + return memcmp (ce1->color_regs_ecs, ce2->color_regs_ecs, sizeof (uae_u16) * 32); } /* ugly copy hack, is there better solution? */ STATIC_INLINE void color_reg_cpy (struct color_entry *dst, struct color_entry *src) { #ifdef AGA - if (aga_mode) - /* copy acolors and color_regs_aga */ - memcpy (dst->acolors, src->acolors, sizeof(struct color_entry) - sizeof(uae_u16) * 32); - else + if (aga_mode) + /* copy acolors and color_regs_aga */ + memcpy (dst->acolors, src->acolors, sizeof(struct color_entry) - sizeof(uae_u16) * 32); + else #endif - /* copy first 32 acolors and color_regs_ecs */ - memcpy (dst->color_regs_ecs, src->color_regs_ecs, + /* copy first 32 acolors and color_regs_ecs */ + memcpy (dst->color_regs_ecs, src->color_regs_ecs, sizeof(struct color_entry)); } /* - * The idea behind this code is that at some point during each horizontal - * line, we decide how to draw this line. There are many more-or-less - * independent decisions, each of which can be taken at a different horizontal - * position. - * Sprites and color changes are handled specially: There isn't a single decision, - * but a list of structures containing information on how to draw the line. - */ +* The idea behind this code is that at some point during each horizontal +* line, we decide how to draw this line. There are many more-or-less +* independent decisions, each of which can be taken at a different horizontal +* position. +* Sprites and color changes are handled specially: There isn't a single decision, +* but a list of structures containing information on how to draw the line. +*/ struct color_change { - int linepos; - int regno; - unsigned int value; + int linepos; + int regno; + unsigned int value; }; /* 440 rather than 880, since sprites are always lores. */ @@ -174,20 +174,20 @@ struct color_change { #endif /* No divisors for MAX_PIXELS_PER_LINE; we support AGA and may one day - want to use SHRES sprites. */ +want to use SHRES sprites. */ #define MAX_SPR_PIXELS (((MAXVPOS + 1) * 2 + 1) * MAX_PIXELS_PER_LINE) struct sprite_entry { - unsigned short pos; - unsigned short max; - unsigned int first_pixel; - unsigned int has_attached; + unsigned short pos; + unsigned short max; + unsigned int first_pixel; + bool has_attached; }; union sps_union { - uae_u8 bytes[2 * MAX_SPR_PIXELS]; - uae_u32 words[2 * MAX_SPR_PIXELS / 4]; + uae_u8 bytes[2 * MAX_SPR_PIXELS]; + uae_u32 words[2 * MAX_SPR_PIXELS / 4]; }; extern union sps_union spixstate; @@ -214,31 +214,31 @@ extern struct color_change *curr_color_changes, *prev_color_changes; extern struct draw_info *curr_drawinfo, *prev_drawinfo; /* struct decision contains things we save across drawing frames for - * comparison (smart update stuff). */ +* comparison (smart update stuff). */ struct decision { - /* Records the leftmost access of BPL1DAT. */ - int plfleft, plfright, plflinelen; - /* Display window: native coordinates, depend on lores state. */ - int diwfirstword, diwlastword; - int ctable; + /* Records the leftmost access of BPL1DAT. */ + int plfleft, plfright, plflinelen; + /* Display window: native coordinates, depend on lores state. */ + int diwfirstword, diwlastword; + int ctable; - uae_u16 bplcon0, bplcon2; + uae_u16 bplcon0, bplcon2; #ifdef AGA - uae_u16 bplcon3, bplcon4; + uae_u16 bplcon3, bplcon4; #endif - uae_u8 nr_planes; - uae_u8 bplres; - unsigned int ehb_seen; - unsigned int ham_seen; - unsigned int ham_at_start; + uae_u8 nr_planes; + uae_u8 bplres; + bool ehb_seen; + bool ham_seen; + bool ham_at_start; }; /* Anything related to changes in hw registers during the DDF for one - * line. */ +* line. */ struct draw_info { - int first_sprite_entry, last_sprite_entry; - int first_color_change, last_color_change; - int nr_color_changes, nr_sprites; + int first_sprite_entry, last_sprite_entry; + int first_color_change, last_color_change; + int nr_color_changes, nr_sprites; }; extern int next_sprite_entry; @@ -257,16 +257,16 @@ extern void hardware_line_completed (int lineno); /* Determine how to draw a scan line. */ enum nln_how { - /* All lines on a non-doubled display. */ - nln_normal, - /* Non-interlace, doubled display. */ - nln_doubled, - /* Interlace, doubled display, upper line. */ - nln_upper, - /* Interlace, doubled display, lower line. */ - nln_lower, - /* This line normal, next one black. */ - nln_nblack + /* All lines on a non-doubled display. */ + nln_normal, + /* Non-interlace, doubled display. */ + nln_doubled, + /* Interlace, doubled display, upper line. */ + nln_upper, + /* Interlace, doubled display, lower line. */ + nln_lower, + /* This line normal, next one black. */ + nln_nblack }; extern void hsync_record_line_state (int lineno, enum nln_how, int changed); @@ -293,13 +293,13 @@ extern int inhibit_frame; STATIC_INLINE void set_inhibit_frame (int bit) { - inhibit_frame |= 1 << bit; + inhibit_frame |= 1 << bit; } STATIC_INLINE void clear_inhibit_frame (int bit) { - inhibit_frame &= ~(1 << bit); + inhibit_frame &= ~(1 << bit); } STATIC_INLINE void toggle_inhibit_frame (int bit) { - inhibit_frame ^= 1 << bit; + inhibit_frame ^= 1 << bit; } diff --git a/include/epsonprinter.h b/include/epsonprinter.h index 4c51f592..4a70f61a 100644 --- a/include/epsonprinter.h +++ b/include/epsonprinter.h @@ -27,8 +27,10 @@ #if !defined __PRINTER_H #define __PRINTER_H -#include "ft2build.h" +#ifndef WINFONT +s#include "ft2build.h" #include FT_FREETYPE_H +#endif #if defined (WIN32) #include diff --git a/include/gui.h b/include/gui.h index 8bed90c6..ac65ba66 100644 --- a/include/gui.h +++ b/include/gui.h @@ -21,7 +21,7 @@ extern void gui_disk_image_change (int, const TCHAR *); extern unsigned int gui_ledstate; extern void gui_display (int shortcut); -extern int no_gui, quit_to_gui; +extern bool no_gui, quit_to_gui; #define LED_CD_ACTIVE 1 #define LED_CD_ACTIVE2 2 @@ -42,11 +42,11 @@ extern int no_gui, quit_to_gui; struct gui_info { - uae_u8 drive_motor[4]; /* motor on off */ + bool drive_motor[4]; /* motor on off */ uae_u8 drive_track[4]; /* rw-head track */ - uae_u8 drive_writing[4]; /* drive is writing */ - uae_u8 drive_disabled[4]; /* drive is disabled */ - uae_u8 powerled; /* state of power led */ + bool drive_writing[4]; /* drive is writing */ + bool drive_disabled[4]; /* drive is disabled */ + bool powerled; /* state of power led */ uae_u8 powerled_brightness; /* 0 to 255 */ uae_u8 drive_side; /* floppy side */ uae_u8 hd; /* harddrive */ diff --git a/include/inputdevice.h b/include/inputdevice.h index 97879632..e3e12f5f 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -34,13 +34,30 @@ extern int pause_emulation; struct uae_input_device_kbr_default { int scancode; - int event; + int evt; + int flags; }; +struct inputevent { + const TCHAR *confname; + const TCHAR *name; + int allow_mask; + int type; + int unit; + int data; +}; + +/* event flags */ +#define ID_FLAG_AUTOFIRE 1 +#define ID_FLAG_TOGGLE 2 +#define ID_FLAG_SAVE_MASK 0xff +#define ID_FLAG_TOGGLED 0x100 + #define IDEV_WIDGET_NONE 0 #define IDEV_WIDGET_BUTTON 1 #define IDEV_WIDGET_AXIS 2 -#define IDEV_WIDGET_KEY 3 +#define IDEV_WIDGET_BUTTONAXIS 3 +#define IDEV_WIDGET_KEY 4 #define IDEV_MAPPED_AUTOFIRE_POSSIBLE 1 #define IDEV_MAPPED_AUTOFIRE_SET 2 @@ -57,10 +74,12 @@ extern int inputdevice_get_mapped_name (int devnum, int num, int *pflags, TCHAR extern void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst); extern void inputdevice_copy_single_config (struct uae_prefs *p, int src, int dst, int devnum); extern void inputdevice_swap_ports (struct uae_prefs *p, int devnum); +extern void inputdevice_swap_compa_ports (struct uae_prefs *p, int portswap); extern void inputdevice_config_change (void); extern int inputdevice_config_change_test (void); extern int inputdevice_get_device_index (int devnum); extern TCHAR *inputdevice_get_device_name (int type, int devnum); +extern TCHAR *inputdevice_get_device_name2 (int devnum); extern TCHAR *inputdevice_get_device_unique_name (int type, int devnum); extern int inputdevice_get_device_status (int devnum); extern void inputdevice_set_device_status (int devnum, int enabled); @@ -70,7 +89,7 @@ extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name); extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port); extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port); -extern int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int cd32); +extern int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int mode); extern int input_get_default_joystick_analog (struct uae_input_device *uid, int num, int port); extern int input_get_default_keyboard (int num); @@ -119,6 +138,12 @@ extern void inputdevice_do_keyboard (int code, int state); extern int inputdevice_iskeymapped (int keyboard, int scancode); extern int inputdevice_synccapslock (int, int*); extern void inputdevice_testrecord (int type, int num, int wtype, int wnum, int state); +extern int inputdevice_get_compatibility_input (struct uae_prefs*, int, int*, int**, int**); +extern struct inputevent *inputdevice_get_eventinfo (int evt); +extern void inputdevice_get_eventname (const struct inputevent *ie, TCHAR *out); +extern void inputdevice_compa_prepare_custom (struct uae_prefs *prefs, int index); +extern int intputdevice_compa_get_eventtype (int evt, int **axistable); + extern uae_u16 potgo_value; extern uae_u16 POTGOR (void); @@ -137,7 +162,7 @@ extern void write_inputdevice_config (struct uae_prefs *p, struct zfile *f); extern void read_inputdevice_config (struct uae_prefs *p, TCHAR *option, TCHAR *value); extern void reset_inputdevice_config (struct uae_prefs *pr); extern int inputdevice_joyport_config (struct uae_prefs *p, TCHAR *value, int portnum, int mode, int type); -extern int inputdevice_getjoyportdevice (int jport); +extern int inputdevice_getjoyportdevice (int port, int val); extern void inputdevice_init (void); extern void inputdevice_close (void); @@ -187,7 +212,6 @@ extern void inputdevice_tablet_strobe (void); extern int jsem_isjoy (int port, const struct uae_prefs *p); extern int jsem_ismouse (int port, const struct uae_prefs *p); extern int jsem_iskbdjoy (int port, const struct uae_prefs *p); -extern void do_fake_joystick (int nr, int *fake); extern int inputdevice_uaelib (TCHAR *, TCHAR *); @@ -217,5 +241,8 @@ extern uae_u16 inprec_pu16 (void); extern uae_u32 inprec_pu32 (void); extern int inprec_pstr (TCHAR*); -extern int inputdevice_testread (TCHAR *name); +extern int inputdevice_testread (int*, int*, int*); extern int inputdevice_istest (void); +extern void inputdevice_settest (int); +extern int inputdevice_testread_count (void); + diff --git a/include/keybuf.h b/include/keybuf.h index 410765e5..7f5390f5 100644 --- a/include/keybuf.h +++ b/include/keybuf.h @@ -12,6 +12,5 @@ extern int keys_available (void); extern int record_key (int); extern int record_key_direct (int); extern void keybuf_init (void); -extern void joystick_setting_changed (void); extern int getcapslockstate (void); extern void setcapslockstate (int); diff --git a/include/memory.h b/include/memory.h index fdad6ea0..cdd898e1 100644 --- a/include/memory.h +++ b/include/memory.h @@ -20,7 +20,8 @@ extern void cache_free (uae_u8*); int init_shm (void); void preinit_shm (void); -extern int canbang, candirect; +extern bool canbang; +extern int candirect; #ifdef ADDRESS_SPACE_24BIT #define MEMORY_BANKS 256 @@ -63,10 +64,11 @@ extern uaecptr p96ram_start; extern uaecptr fastmem_start; extern uaecptr a3000lmem_start, a3000hmem_start; -extern int ersatzkickfile; -extern int cloanto_rom, kickstart_rom; +extern bool ersatzkickfile; +extern bool cloanto_rom, kickstart_rom; extern uae_u16 kickstart_version; -extern int uae_boot_rom, uae_boot_rom_size; +extern bool uae_boot_rom; +extern int uae_boot_rom_size; extern uaecptr rtarea_base; extern uae_u8* baseaddr[]; @@ -101,7 +103,7 @@ typedef struct { #define CE_MEMBANK_CHIP 1 #define CE_MEMBANK_CIA 2 #define CE_MEMBANK_FAST16BIT 3 -extern uae_u8 ce_banktype[65536]; +extern uae_u8 ce_banktype[65536], ce_cachable[65536]; extern uae_u8 *filesysory; extern uae_u8 *rtarea; @@ -133,7 +135,6 @@ extern void expamem_next (void); extern uae_u32 gfxmem_start; extern uae_u8 *gfxmemory; extern uae_u32 gfxmem_mask; -extern int address_space_24; extern uae_u16 last_custom_value1; /* Default memory access functions */ diff --git a/include/newcpu.h b/include/newcpu.h index a5eb228e..d9a398bf 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -94,13 +94,22 @@ struct cache020 { uae_u32 data; uae_u32 tag; - uae_u32 valid:1; + bool valid; }; + +#define CACHELINES030 16 +struct cache030 +{ + uae_u32 data[4]; + bool valid[4]; + uae_u32 tag; +}; + #define CACHESETS040 64 struct cache040set { uae_u32 data[4]; - int valid[4]; + bool valid[4]; uae_u32 tag; }; #define CACHELINES040 4 @@ -206,7 +215,10 @@ STATIC_INLINE uaecptr m68k_getpc_p (uae_u8 *p) return (uaecptr)(regs.pc + ((uae_u8*)p - (uae_u8*)regs.pc_oldp)); } -#define m68k_incpc(o) ((regs).pc_p += (o)) +STATIC_INLINE void m68k_incpc (int o) +{ + regs.pc_p += o; +} STATIC_INLINE void m68k_setpc_mmu (uaecptr newpc) { @@ -250,9 +262,18 @@ STATIC_INLINE void m68k_do_bsri (uaecptr oldpc, uae_s32 offset) m68k_incpci (offset); } -#define get_ibyte(o) do_get_mem_byte((uae_u8 *)((regs).pc_p + (o) + 1)) -#define get_iword(o) do_get_mem_word((uae_u16 *)((regs).pc_p + (o))) -#define get_ilong(o) do_get_mem_long((uae_u32 *)((regs).pc_p + (o))) +STATIC_INLINE uae_u32 get_ibyte (int o) +{ + return do_get_mem_byte((uae_u8 *)((regs).pc_p + (o) + 1)); +} +STATIC_INLINE uae_u32 get_iword (int o) +{ + return do_get_mem_word((uae_u16 *)((regs).pc_p + (o))); +} +STATIC_INLINE uae_u32 get_ilong (int o) +{ + return do_get_mem_long((uae_u32 *)((regs).pc_p + (o))); +} #define get_iwordi(o) get_wordi(o) #define get_ilongi(o) get_longi(o) @@ -290,19 +311,26 @@ STATIC_INLINE uae_u32 next_ilongi (void) return r; } +extern uae_u32 (*x_get_byte)(uaecptr addr); +extern uae_u32 (*x_get_word)(uaecptr addr); +extern uae_u32 (*x_get_long)(uaecptr addr); +extern void (*x_put_byte)(uaecptr addr, uae_u32 v); +extern void (*x_put_word)(uaecptr addr, uae_u32 v); +extern void (*x_put_long)(uaecptr addr, uae_u32 v); +extern uae_u32 (*x_next_iword)(void); +extern uae_u32 (*x_next_ilong)(void); + +extern uae_u32 REGPARAM3 x_get_disp_ea_020 (uae_u32 base, uae_u32 dp) REGPARAM; +extern uae_u32 REGPARAM3 x_get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM; +extern void REGPARAM3 x_put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM; + extern void m68k_setstopped (void); extern void m68k_resumestopped (void); extern uae_u32 REGPARAM3 get_disp_ea_020 (uae_u32 base, uae_u32 dp) REGPARAM; -extern uae_u32 REGPARAM3 get_disp_ea_020ce (uae_u32 base, uae_u32 dp) REGPARAM; -extern uae_u32 REGPARAM3 get_disp_ea_040mmu (uae_u32 base, uae_u32 dp) REGPARAM; extern uae_u32 REGPARAM3 get_disp_ea_000 (uae_u32 base, uae_u32 dp) REGPARAM; -extern uae_u32 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width); -extern void put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width); -extern uae_u32 get_bitfield_020ce (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width); -extern void put_bitfield_020ce (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width); -extern uae_u32 get_bitfield_040mmu (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width); -extern void put_bitfield_040mmu (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width); +extern uae_u32 REGPARAM3 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM; +extern void REGPARAM3 put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM; extern void m68k_disasm_ea (void *f, uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr); extern void m68k_disasm (void *f, uaecptr addr, uaecptr *nextpc, int cnt); @@ -381,12 +409,13 @@ extern const struct cputbl op_smalltbl_12_ff[]; extern cpuop_func *cpufunctbl[65536] ASM_SYM_FOR_FUNC ("cpufunctbl"); #ifdef JIT -extern void flush_icache (uaecptr, int n); +extern void flush_icache (uaecptr, int); extern void compemu_reset (void); -extern int check_prefs_changed_comp (void); +extern bool check_prefs_changed_comp (void); #else #define flush_icache(uaecptr, int) do {} while (0) #endif +extern void flush_dcache (uaecptr, int); extern void flush_mmu (uaecptr, int); extern int movec_illg (int regno); diff --git a/include/options.h b/include/options.h index d5a0e9b3..e0257982 100644 --- a/include/options.h +++ b/include/options.h @@ -1,14 +1,14 @@ - /* - * UAE - The Un*x Amiga Emulator - * - * Stuff - * - * Copyright 1995, 1996 Ed Hanway - * Copyright 1995-2001 Bernd Schmidt - */ +/* +* UAE - The Un*x Amiga Emulator +* +* Stuff +* +* Copyright 1995, 1996 Ed Hanway +* Copyright 1995-2001 Bernd Schmidt +*/ #define UAEMAJOR 2 -#define UAEMINOR 1 +#define UAEMINOR 2 #define UAESUBREV 0 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang; @@ -16,9 +16,9 @@ typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, extern long int version; struct strlist { - struct strlist *next; - TCHAR *option, *value; - int unknown; + struct strlist *next; + TCHAR *option, *value; + int unknown; }; /* maximum number native input devices supported (single type) */ @@ -27,27 +27,31 @@ struct strlist { #define MAX_INPUT_DEVICE_EVENTS 256 /* 4 different customization settings */ #define MAX_INPUT_SETTINGS 4 +#define GAMEPORT_INPUT_SETTINGS 3 // last slot is for gameport panel mappings #define MAX_INPUT_SUB_EVENT 4 #define MAX_INPUT_SIMULTANEOUS_KEYS 4 struct uae_input_device { - TCHAR *name; - TCHAR *configname; - uae_s16 eventid[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; - TCHAR *custom[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; - uae_u16 flags[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; - uae_s16 extra[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SIMULTANEOUS_KEYS]; - uae_s8 enabled; + TCHAR *name; + TCHAR *configname; + uae_s16 eventid[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + TCHAR *custom[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + uae_u16 flags[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + uae_s16 extra[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SIMULTANEOUS_KEYS]; + uae_s8 enabled; }; #define MAX_JPORTS 4 #define MAX_JPORTNAME 128 struct jport { - int id; - int mode; // 0=def,1=mouse,2=joy,3=anajoy,4=lightpen - TCHAR name[MAX_JPORTNAME]; - TCHAR configname[MAX_JPORTNAME]; + int id; + int mode; // 0=def,1=mouse,2=joy,3=anajoy,4=lightpen + int autofire; + TCHAR name[MAX_JPORTNAME]; + TCHAR configname[MAX_JPORTNAME]; }; +#define JPORT_NONE -1 +#define JPORT_CUSTOM -2 #define MAX_SPARE_DRIVES 20 #define MAX_CUSTOM_MEMORY_ADDRS 2 @@ -61,331 +65,319 @@ struct jport { #define TABLET_REAL 2 struct wh { - int x, y; - int width, height; + int x, y; + int width, height; }; #define MOUNT_CONFIG_SIZE 30 struct uaedev_config_info { - TCHAR devname[MAX_DPATH]; - TCHAR volname[MAX_DPATH]; - TCHAR rootdir[MAX_DPATH]; - int ishdf; - int readonly; - int bootpri; - int autoboot; - int donotmount; - TCHAR filesys[MAX_DPATH]; - int surfaces; - int sectors; - int reserved; - int blocksize; - int configoffset; - int controller; + TCHAR devname[MAX_DPATH]; + TCHAR volname[MAX_DPATH]; + TCHAR rootdir[MAX_DPATH]; + bool ishdf; + bool readonly; + int bootpri; + bool autoboot; + bool donotmount; + TCHAR filesys[MAX_DPATH]; + int surfaces; + int sectors; + int reserved; + int blocksize; + int configoffset; + int controller; }; enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000, - CP_A1200, CP_A2000, CP_A3000, CP_A3000T, CP_A4000, CP_A4000T }; + CP_A1200, CP_A2000, CP_A3000, CP_A3000T, CP_A4000, CP_A4000T }; #define IDE_A600A1200 1 #define IDE_A4000 2 struct uae_prefs { - struct strlist *all_lines; - - TCHAR description[256]; - TCHAR info[256]; - int config_version; - TCHAR config_hardware_path[MAX_DPATH]; - TCHAR config_host_path[MAX_DPATH]; - - int illegal_mem; - int no_xhair; - int use_serial; - int serial_demand; - int serial_hwctsrts; - int serial_direct; - int parallel_demand; - int parallel_matrix_emulation; - int parallel_postscript_emulation; - int parallel_postscript_detection; - int parallel_autoflush_time; - TCHAR ghostscript_parameters[256]; - int use_gfxlib; - int socket_emu; - - int start_debugger; - int start_gui; - - KbdLang keyboard_lang; - int test_drawing_speed; - - int produce_sound; - int sound_stereo; - int sound_stereo_separation; - int sound_mixed_stereo_delay; - int sound_freq; - int sound_maxbsiz; - int sound_latency; - int sound_interpol; - int sound_filter; - int sound_filter_type; - int sound_volume; - int sound_stereo_swap_paula; - int sound_stereo_swap_ahi; - int sound_auto; - - int comptrustbyte; - int comptrustword; - int comptrustlong; - int comptrustnaddr; - int compnf; - int compfpu; - int comp_midopt; - int comp_lowopt; - int fpu_strict; - - int comp_hardflush; - int comp_constjump; - int comp_oldsegv; - - int cachesize; - int optcount[10]; - - int avoid_cmov; - int avoid_dga; - int avoid_vid; - uae_u32 override_dga_address; - - int gfx_display; - TCHAR gfx_display_name[256]; - int gfx_framerate, gfx_autoframerate; - struct wh gfx_size_win; - struct wh gfx_size_fs; - struct wh gfx_size; - struct wh gfx_size_win_xtra[4]; - struct wh gfx_size_fs_xtra[4]; - int gfx_autoresolution; - int gfx_scandoubler; - int gfx_refreshrate; - int gfx_avsync, gfx_pvsync; - int gfx_resolution; - int gfx_lores_mode; - int gfx_linedbl; - int gfx_afullscreen, gfx_pfullscreen; - int gfx_xcenter, gfx_ycenter; - int gfx_xcenter_pos, gfx_ycenter_pos; - int gfx_xcenter_size, gfx_ycenter_size; - int gfx_max_horizontal, gfx_max_vertical; - int gfx_saturation, gfx_luminance, gfx_contrast, gfx_gamma; - int gfx_blackerthanblack; - int gfx_backbuffers; + struct strlist *all_lines; + + TCHAR description[256]; + TCHAR info[256]; + int config_version; + TCHAR config_hardware_path[MAX_DPATH]; + TCHAR config_host_path[MAX_DPATH]; + + bool illegal_mem; + bool use_serial; + bool serial_demand; + bool serial_hwctsrts; + bool serial_direct; + bool parallel_demand; + int parallel_matrix_emulation; + bool parallel_postscript_emulation; + bool parallel_postscript_detection; + int parallel_autoflush_time; + TCHAR ghostscript_parameters[256]; + bool use_gfxlib; + bool socket_emu; + + bool start_debugger; + bool start_gui; + + KbdLang keyboard_lang; + + int produce_sound; + int sound_stereo; + int sound_stereo_separation; + int sound_mixed_stereo_delay; + int sound_freq; + int sound_maxbsiz; + int sound_latency; + int sound_interpol; + int sound_filter; + int sound_filter_type; + int sound_volume; + bool sound_stereo_swap_paula; + bool sound_stereo_swap_ahi; + bool sound_auto; + + int comptrustbyte; + int comptrustword; + int comptrustlong; + int comptrustnaddr; + bool compnf; + bool compfpu; + bool comp_midopt; + bool comp_lowopt; + bool fpu_strict; + + bool comp_hardflush; + bool comp_constjump; + bool comp_oldsegv; + + int cachesize; + int optcount[10]; + + bool avoid_cmov; + + int gfx_display; + TCHAR gfx_display_name[256]; + int gfx_framerate, gfx_autoframerate; + struct wh gfx_size_win; + struct wh gfx_size_fs; + struct wh gfx_size; + struct wh gfx_size_win_xtra[4]; + struct wh gfx_size_fs_xtra[4]; + bool gfx_autoresolution; + bool gfx_scandoubler; + int gfx_refreshrate; + bool gfx_avsync, gfx_pvsync; + int gfx_resolution; + int gfx_lores_mode; + int gfx_linedbl; + int gfx_afullscreen, gfx_pfullscreen; + int gfx_xcenter, gfx_ycenter; + int gfx_xcenter_pos, gfx_ycenter_pos; + int gfx_xcenter_size, gfx_ycenter_size; + int gfx_max_horizontal, gfx_max_vertical; + int gfx_saturation, gfx_luminance, gfx_contrast, gfx_gamma; + bool gfx_blackerthanblack; + int gfx_backbuffers; int gfx_api; - int color_mode; + int color_mode; - int gfx_filter; - TCHAR gfx_filtershader[MAX_DPATH]; + int gfx_filter; + TCHAR gfx_filtershader[MAX_DPATH]; TCHAR gfx_filtermask[MAX_DPATH]; - int gfx_filter_scanlines; - int gfx_filter_scanlineratio; - int gfx_filter_scanlinelevel; - int gfx_filter_horiz_zoom, gfx_filter_vert_zoom; - int gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult; - int gfx_filter_horiz_offset, gfx_filter_vert_offset; - int gfx_filter_filtermode; + int gfx_filter_scanlines; + int gfx_filter_scanlineratio; + int gfx_filter_scanlinelevel; + int gfx_filter_horiz_zoom, gfx_filter_vert_zoom; + int gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult; + int gfx_filter_horiz_offset, gfx_filter_vert_offset; + int gfx_filter_filtermode; int gfx_filter_bilinear; - int gfx_filter_noise, gfx_filter_blur; - int gfx_filter_saturation, gfx_filter_luminance, gfx_filter_contrast, gfx_filter_gamma; - int gfx_filter_keep_aspect, gfx_filter_aspect; - int gfx_filter_autoscale; - - int immediate_blits; - unsigned int chipset_mask; - int ntscmode; - int genlock; - int chipset_refreshrate; - int collision_level; - int leds_on_screen; - int keyboard_leds[3]; - int keyboard_leds_in_use; - int scsi; - int sana2; - int uaeserial; - int catweasel; - int cpu_idle; - int cpu_cycle_exact; - int cpu_clock_multiplier; - int cpu_frequency; - int blitter_cycle_exact; - int floppy_speed; - int floppy_write_length; - int tod_hack; - uae_u32 maprom; - int turbo_emulation; - int headless; - - int cs_compatible; - int cs_ciaatod; - int cs_rtc; - int cs_rtc_adjust; - int cs_rtc_adjust_mode; - int cs_ksmirror_e0; - int cs_ksmirror_a8; - int cs_ciaoverlay; - int cs_cd32cd; - int cs_cd32c2p; - int cs_cd32nvram; - int cs_cdtvcd; - int cs_cdtvram; - int cs_cdtvcard; - int cs_ide; - int cs_pcmcia; - int cs_a1000ram; - int cs_fatgaryrev; - int cs_ramseyrev; - int cs_agnusrev; - int cs_deniserev; - int cs_mbdmac; - int cs_cdtvscsi; - int cs_a2091, cs_a4091; - int cs_df0idhw; - int cs_slowmemisfast; - int cs_resetwarning; - int cs_denisenoehb; - int cs_dipagnus; - int 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]; - TCHAR romextident[256]; - TCHAR flashfile[MAX_DPATH]; - TCHAR cartfile[MAX_DPATH]; - TCHAR cartident[256]; - int cart_internal; - TCHAR pci_devices[256]; - TCHAR prtname[256]; - TCHAR sername[256]; - TCHAR amaxromfile[MAX_DPATH]; - TCHAR a2065name[MAX_DPATH]; + int gfx_filter_noise, gfx_filter_blur; + int gfx_filter_saturation, gfx_filter_luminance, gfx_filter_contrast, gfx_filter_gamma; + int gfx_filter_keep_aspect, gfx_filter_aspect; + int gfx_filter_autoscale; + + bool immediate_blits; + unsigned int chipset_mask; + bool ntscmode; + bool genlock; + int chipset_refreshrate; + int collision_level; + int leds_on_screen; + int keyboard_leds[3]; + bool keyboard_leds_in_use; + int scsi; + bool sana2; + bool uaeserial; + int catweasel; + int cpu_idle; + bool cpu_cycle_exact; + int cpu_clock_multiplier; + int cpu_frequency; + bool blitter_cycle_exact; + int floppy_speed; + int floppy_write_length; + bool tod_hack; + uae_u32 maprom; + int turbo_emulation; + bool headless; + + int cs_compatible; + int cs_ciaatod; + int cs_rtc; + int cs_rtc_adjust; + int cs_rtc_adjust_mode; + bool cs_ksmirror_e0; + bool cs_ksmirror_a8; + bool cs_ciaoverlay; + bool cs_cd32cd; + bool cs_cd32c2p; + bool cs_cd32nvram; + bool cs_cdtvcd; + bool cs_cdtvram; + int cs_cdtvcard; + int cs_ide; + bool cs_pcmcia; + bool cs_a1000ram; + int cs_fatgaryrev; + int cs_ramseyrev; + int cs_agnusrev; + int cs_deniserev; + int cs_mbdmac; + bool cs_cdtvscsi; + bool cs_a2091, cs_a4091; + bool cs_df0idhw; + bool cs_slowmemisfast; + bool cs_resetwarning; + bool cs_denisenoehb; + 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]; + TCHAR romextident[256]; + TCHAR flashfile[MAX_DPATH]; + TCHAR cartfile[MAX_DPATH]; + TCHAR cartident[256]; + int cart_internal; + TCHAR pci_devices[256]; + TCHAR prtname[256]; + TCHAR sername[256]; + TCHAR amaxromfile[MAX_DPATH]; + TCHAR a2065name[MAX_DPATH]; TCHAR cdimagefile[MAX_DPATH]; - TCHAR path_floppy[256]; - TCHAR path_hardfile[256]; - TCHAR path_rom[256]; - - int m68k_speed; - int cpu_model; - int mmu_model; - int cpu060_revision; - int fpu_model; - int fpu_revision; - int cpu_compatible; - int address_space_24; - int picasso96_nocustom; - int picasso96_modeflags; - - uae_u32 z3fastmem_size, z3fastmem2_size; - uae_u32 z3fastmem_start; - uae_u32 fastmem_size; - uae_u32 chipmem_size; - uae_u32 bogomem_size; - uae_u32 mbresmem_low_size; - uae_u32 mbresmem_high_size; - uae_u32 gfxmem_size; - uae_u32 custom_memory_addrs[MAX_CUSTOM_MEMORY_ADDRS]; - uae_u32 custom_memory_sizes[MAX_CUSTOM_MEMORY_ADDRS]; - - int kickshifter; - int filesys_no_uaefsdb; - int filesys_custom_uaefsdb; - int mmkeyboard; - int uae_hide; - - int mountitems; - struct uaedev_config_info mountconfig[MOUNT_CONFIG_SIZE]; - - int nr_floppies; - int dfxtype[4]; - int dfxclick[4]; - TCHAR dfxclickexternal[4][256]; - int dfxclickvolume; - - /* Target specific options */ - int x11_use_low_bandwidth; - int x11_use_mitshm; - int x11_use_dgamode; - int x11_hide_cursor; - int svga_no_linear; - - int win32_middle_mouse; - int win32_logfile; - int win32_notaskbarbutton; - int win32_alwaysontop; - int win32_powersavedisabled; - int win32_minimize_inactive; - - int win32_active_priority; - int win32_inactive_priority; - int win32_inactive_pause; - int win32_inactive_nosound; - int win32_iconified_priority; - int win32_iconified_pause; - int win32_iconified_nosound; - - int win32_rtgmatchdepth; - int win32_rtgscaleifsmall; - int win32_rtgallowscaling; - int win32_rtgscaleaspectratio; - int win32_rtgvblankrate; - int win32_borderless; - int win32_ctrl_F11_is_quit; - int win32_automount_removable; - int win32_automount_drives; - int win32_automount_cddrives; - int win32_automount_netdrives; - int win32_automount_removabledrives; - int win32_midioutdev; - int win32_midiindev; - int win32_uaescsimode; - int win32_soundcard; + TCHAR path_floppy[256]; + TCHAR path_hardfile[256]; + TCHAR path_rom[256]; + + int m68k_speed; + int cpu_model; + int mmu_model; + int cpu060_revision; + int fpu_model; + int fpu_revision; + bool cpu_compatible; + bool address_space_24; + bool picasso96_nocustom; + int picasso96_modeflags; + + uae_u32 z3fastmem_size, z3fastmem2_size; + uae_u32 z3fastmem_start; + uae_u32 fastmem_size; + uae_u32 chipmem_size; + uae_u32 bogomem_size; + uae_u32 mbresmem_low_size; + uae_u32 mbresmem_high_size; + uae_u32 gfxmem_size; + uae_u32 custom_memory_addrs[MAX_CUSTOM_MEMORY_ADDRS]; + uae_u32 custom_memory_sizes[MAX_CUSTOM_MEMORY_ADDRS]; + + bool kickshifter; + bool filesys_no_uaefsdb; + bool filesys_custom_uaefsdb; + bool mmkeyboard; + int uae_hide; + + int mountitems; + struct uaedev_config_info mountconfig[MOUNT_CONFIG_SIZE]; + + int nr_floppies; + int dfxtype[4]; + int dfxclick[4]; + TCHAR dfxclickexternal[4][256]; + int dfxclickvolume; + + /* Target specific options */ + + bool win32_middle_mouse; + bool win32_logfile; + bool win32_notaskbarbutton; + bool win32_alwaysontop; + bool win32_powersavedisabled; + bool win32_minimize_inactive; + + int win32_active_priority; + int win32_inactive_priority; + bool win32_inactive_pause; + bool win32_inactive_nosound; + int win32_iconified_priority; + bool win32_iconified_pause; + bool win32_iconified_nosound; + + bool win32_rtgmatchdepth; + bool win32_rtgscaleifsmall; + bool win32_rtgallowscaling; + int win32_rtgscaleaspectratio; + int win32_rtgvblankrate; + bool win32_borderless; + bool win32_ctrl_F11_is_quit; + bool win32_automount_removable; + bool win32_automount_drives; + bool win32_automount_cddrives; + bool win32_automount_netdrives; + bool win32_automount_removabledrives; + int win32_midioutdev; + int win32_midiindev; + int win32_uaescsimode; + int win32_soundcard; int win32_samplersoundcard; - int win32_soundexclusive; - int win32_norecyclebin; - int win32_specialkey; - int win32_guikey; - int win32_kbledmode; - TCHAR win32_commandpathstart[MAX_DPATH]; - TCHAR win32_commandpathend[MAX_DPATH]; - - int curses_reverse_video; - - int statecapture; - int statecapturerate, statecapturebuffersize; - - /* input */ - - TCHAR inputname[256]; - struct jport jports[MAX_JPORTS]; - int input_selected_setting; - int input_joymouse_multiplier; - int input_joymouse_deadzone; - int input_joystick_deadzone; - int input_joymouse_speed; - int input_analog_joystick_mult; - int input_analog_joystick_offset; - int input_autofire_framecnt; - int input_mouse_speed; - int input_tablet; - int input_magic_mouse; - int input_magic_mouse_cursor; - struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; - struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; - struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; - int dongle; + bool win32_soundexclusive; + bool win32_norecyclebin; + int win32_specialkey; + int win32_guikey; + int win32_kbledmode; + TCHAR win32_commandpathstart[MAX_DPATH]; + TCHAR win32_commandpathend[MAX_DPATH]; + + bool statecapture; + int statecapturerate, statecapturebuffersize; + + /* input */ + + TCHAR inputname[256]; + struct jport jports[MAX_JPORTS]; + int input_selected_setting; + int input_joymouse_multiplier; + int input_joymouse_deadzone; + int input_joystick_deadzone; + int input_joymouse_speed; + int input_analog_joystick_mult; + int input_analog_joystick_offset; + int input_autofire_linecnt; + int input_mouse_speed; + int input_tablet; + bool input_magic_mouse; + int input_magic_mouse_cursor; + struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES]; + struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES]; + struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES]; + int dongle; }; extern int config_changed; @@ -400,10 +392,10 @@ extern void cfgfile_dwrite (struct zfile *, const TCHAR *option, const TCHAR *fo extern void cfgfile_target_write (struct zfile *, const TCHAR *option, const TCHAR *format,...); extern void cfgfile_target_dwrite (struct zfile *, const TCHAR *option, const TCHAR *format,...); -extern void cfgfile_write_bool (struct zfile *f, const TCHAR *option, int b); -extern void cfgfile_dwrite_bool (struct zfile *f,const TCHAR *option, int b); -extern void cfgfile_target_write_bool (struct zfile *f, const TCHAR *option, int b); -extern void cfgfile_target_dwrite_bool (struct zfile *f, const TCHAR *option, int b); +extern void cfgfile_write_bool (struct zfile *f, const TCHAR *option, bool b); +extern void cfgfile_dwrite_bool (struct zfile *f,const TCHAR *option, bool b); +extern void cfgfile_target_write_bool (struct zfile *f, const TCHAR *option, bool b); +extern void cfgfile_target_dwrite_bool (struct zfile *f, const TCHAR *option, bool b); extern void cfgfile_write_str (struct zfile *f, const TCHAR *option, const TCHAR *value); extern void cfgfile_dwrite_str (struct zfile *f, const TCHAR *option, const TCHAR *value); @@ -412,16 +404,16 @@ extern void cfgfile_target_dwrite_str (struct zfile *f, const TCHAR *option, con extern void cfgfile_backup (const TCHAR *path); extern struct uaedev_config_info *add_filesys_config (struct uae_prefs *p, int index, - TCHAR *devname, TCHAR *volname, TCHAR *rootdir, int readonly, - int secspertrack, int surfaces, int reserved, - int blocksize, int bootpri, TCHAR *filesysdir, int hdc, int flags); + TCHAR *devname, TCHAR *volname, TCHAR *rootdir, bool readonly, + int secspertrack, int surfaces, int reserved, + int blocksize, int bootpri, TCHAR *filesysdir, int hdc, int flags); extern void default_prefs (struct uae_prefs *, int); extern void discard_prefs (struct uae_prefs *, int); int parse_cmdline_option (struct uae_prefs *, TCHAR, const TCHAR *); -extern int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location); +extern int cfgfile_yesno (const TCHAR *option, const TCHAR *value, const TCHAR *name, bool *location); extern int cfgfile_intval (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location, int scale); extern int cfgfile_strval (const TCHAR *option, const TCHAR *value, const TCHAR *name, int *location, const TCHAR *table[], int more); extern int cfgfile_string (const TCHAR *option, const TCHAR *value, const TCHAR *name, TCHAR *location, int maxsz); diff --git a/include/rommgr.h b/include/rommgr.h index ff7a314d..bd5db1b9 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -62,7 +62,7 @@ extern struct romlist **getarcadiaroms (void); extern struct romdata *getarcadiarombyname (TCHAR *name); extern struct romlist **getromlistbyident (int ver, int rev, int subver, int subrev, TCHAR *model, int all); extern void getromname (struct romdata*, TCHAR*); -extern struct romdata *getromdatabyname (TCHAR*); +extern struct romdata *getromdatabyname (const TCHAR*); extern struct romlist *getromlistbyids (int *ids); extern void romwarning(int *ids); extern struct romlist *getromlistbyromdata (struct romdata *rd); diff --git a/include/uae.h b/include/uae.h index bfb49238..43c92f32 100644 --- a/include/uae.h +++ b/include/uae.h @@ -27,7 +27,7 @@ extern void target_run (void); extern void target_quit (void); extern int quit_program; -extern int console_emulation; +extern bool console_emulation; extern TCHAR warning_buffer[256]; extern TCHAR start_path_data[]; diff --git a/include/xwin.h b/include/xwin.h index 6f780d7d..bdc08f08 100644 --- a/include/xwin.h +++ b/include/xwin.h @@ -25,7 +25,7 @@ extern int isfullscreen (void); extern void toggle_fullscreen (void); extern void toggle_mousegrab (void); extern void desktop_coords (int *dw, int *dh, int *x, int *y, int *w, int *h); -extern int vsync_switchmode (int, int); +extern bool vsync_switchmode (int, int); extern void doflashscreen (void); extern int flashscreen; extern void updatedisplayarea (void); diff --git a/include/zarchive.h b/include/zarchive.h index 8005dab1..309e37bd 100644 --- a/include/zarchive.h +++ b/include/zarchive.h @@ -7,17 +7,19 @@ struct zfile { TCHAR *name; TCHAR *zipname; TCHAR *mode; - FILE *f; - uae_u8 *data; - int dataseek; - uae_s64 size; - uae_s64 seek; + FILE *f; // real file handle if physical file + uae_u8 *data; // unpacked data + int dataseek; // use seek position even if real file + struct zfile *archiveparent; // set if parent is archive and this has not yet been unpacked (datasize < size) + uae_s64 size; // real size + uae_s64 datasize; // available size (not yet unpacked completely?) + uae_s64 seek; // seek position int deleteafterclose; int textmode; struct zfile *next; int zfdmask; struct zfile *parent; - uae_u64 offset; + uae_u64 offset; // byte offset from parent file int opencnt; ZFILEREAD zfileread; ZFILEWRITE zfilewrite; @@ -81,6 +83,7 @@ struct zarchive_info }; #define ArchiveFormat7Zip '7z ' +#define ArchiveFormatXZ 'xz ' #define ArchiveFormatRAR 'rar ' #define ArchiveFormatZIP 'zip ' #define ArchiveFormatLHA 'lha ' @@ -94,6 +97,8 @@ struct zarchive_info #define ArchiveFormatFAT 'FAT ' #define ArchiveFormatTAR 'tar ' +#define PEEK_BYTES 1024 + extern int zfile_is_ignore_ext(const TCHAR *name); extern struct zvolume *zvolume_alloc(struct zfile *z, unsigned int id, void *handle, const TCHAR*); @@ -108,9 +113,11 @@ extern struct zfile *archive_access_plain (struct znode *zn); extern struct zvolume *archive_directory_lha(struct zfile *zf); extern struct zfile *archive_access_lha (struct znode *zn); extern struct zvolume *archive_directory_zip(struct zfile *zf); -extern struct zfile *archive_access_zip (struct znode *zn); +extern struct zfile *archive_access_zip (struct znode *zn, int flags); extern struct zvolume *archive_directory_7z (struct zfile *z); extern struct zfile *archive_access_7z (struct znode *zn); +extern struct zvolume *archive_directory_xz (struct zfile *z); +extern struct zfile *archive_access_xz (struct znode *zn); extern struct zvolume *archive_directory_rar (struct zfile *z); extern struct zfile *archive_access_rar (struct znode *zn); extern struct zvolume *archive_directory_lzx (struct zfile *in_file); @@ -135,6 +142,6 @@ extern void archive_access_scan (struct zfile *zf, zfile_callback zc, void *user extern void archive_access_close (void *handle, unsigned int id); -extern struct zfile *archive_getzfile(struct znode *zn, unsigned int id); +extern struct zfile *archive_getzfile(struct znode *zn, unsigned int id, int flags); extern struct zfile *decompress_zfd (struct zfile*); \ No newline at end of file diff --git a/include/zfile.h b/include/zfile.h index 5ccb9a89..325e134b 100644 --- a/include/zfile.h +++ b/include/zfile.h @@ -74,6 +74,7 @@ extern TCHAR *zfile_geterror (void); #define ZFD_HD 4 //rdb/hdf #define ZFD_UNPACK 8 //gzip,dms #define ZFD_RAWDISK 16 //fdi->adf,ipf->adf etc.. +#define ZFD_CD 32 //cue/iso, cue has priority over iso #define ZFD_DISKHISTORY 0x100 //allow diskhistory (if disk image) #define ZFD_CHECKONLY 0x200 //file exists checkc #define ZFD_NORMAL (ZFD_ARCHIVE|ZFD_UNPACK) diff --git a/inputdevice.cpp b/inputdevice.cpp index 4cedf82b..7db48564 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -66,16 +66,6 @@ int inputdevice_logging = 0; #define IE_INVERT 0x80 #define IE_CDTV 0x100 -struct inputevent { - const TCHAR *confname; - const TCHAR *name; - int allow_mask; - int type; - int unit; - int data; -}; - - #define JOYBUTTON_1 0 /* fire/left mousebutton */ #define JOYBUTTON_2 1 /* 2nd/right mousebutton */ #define JOYBUTTON_3 2 /* 3rd/middle mousebutton */ @@ -106,14 +96,8 @@ struct inputevent { #define JOYMOUSE_CDTV 8 -/* event flags */ -#define ID_FLAG_AUTOFIRE 1 -#define ID_FLAG_TOGGLE 2 -#define ID_FLAG_SAVE_MASK 0xff -#define ID_FLAG_TOGGLED 0x100 - #define DEFEVENT(A, B, C, D, E, F) {L#A, B, C, D, E, F }, -struct inputevent events[] = { +static struct inputevent events[] = { {0, 0, AM_K,0,0,0}, #include "inputevents.def" {0, 0, 0, 0, 0, 0} @@ -132,7 +116,19 @@ static struct uae_input_device2 mice2[MAX_INPUT_DEVICES]; static uae_u8 scancodeused[MAX_INPUT_DEVICES][256]; static int input_acquired; -static int testmode; +static int testmode, testmode_read, testmode_toggle; +struct teststore +{ + int testmode_type; + int testmode_num; + int testmode_wtype; + int testmode_wnum; + int testmode_state; +}; +#define TESTMODE_MAX 2 +static int testmode_count; +static struct teststore testmode_data[TESTMODE_MAX]; +static struct teststore testmode_wait[TESTMODE_MAX]; static uae_u8 *inprec_buffer, *inprec_p; static struct zfile *inprec_zf; @@ -398,6 +394,16 @@ static struct uae_input_device *joysticks; static struct uae_input_device *mice; static struct uae_input_device *keyboards; static struct uae_input_device_kbr_default *keyboard_default; +#define KBR_DEFAULT_MAP_NP 0 +#define KBR_DEFAULT_MAP_CK 1 +#define KBR_DEFAULT_MAP_SE 2 +#define KBR_DEFAULT_MAP_CD32_NP 3 +#define KBR_DEFAULT_MAP_CD32_CK 4 +#define KBR_DEFAULT_MAP_CD32_SE 5 +#define KBR_DEFAULT_MAP_XA1 6 +#define KBR_DEFAULT_MAP_XA2 7 +#define KBR_DEFAULT_MAP_ARCADIA 8 +#define KBR_DEFAULT_MAP_ARCADIA_XA 9 static int **keyboard_default_kbmaps; static int mouse_axis[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS]; @@ -433,7 +439,7 @@ static int use_keyboards[MAX_INPUT_DEVICES]; #define INPUT_QUEUE_SIZE 16 struct input_queue_struct { - int event, storedstate, state, max, framecnt, nextframecnt; + int event, storedstate, state, max, linecnt, nextlinecnt; }; static struct input_queue_struct input_queue[INPUT_QUEUE_SIZE]; @@ -459,6 +465,59 @@ static void out_config (struct zfile *f, int id, int num, TCHAR *s1, TCHAR *s2) cfgfile_write_str (f, tmp, s2); } +static bool write_config_head (struct zfile *f, int idnum, int devnum, TCHAR *name, struct uae_input_device *id, struct inputdevice_functions *idf) +{ + TCHAR tmp2[MAX_DPATH]; + + if (idnum == GAMEPORT_INPUT_SETTINGS) { + if (!isdevice (id)) + return false; + if (!id->enabled) + return false; + } + + TCHAR *s = NULL; + if (id->name) + s = id->name; + else if (devnum < idf->get_num ()) + s = idf->get_friendlyname (devnum); + if (s) { + _stprintf (tmp2, L"input.%d.%s.%d.friendlyname", idnum + 1, name, devnum); + cfgfile_write_str (f, tmp2, s); + } + + s = NULL; + if (id->configname) + s = id->configname; + else if (devnum < idf->get_num ()) + s = idf->get_uniquename (devnum); + if (s) { + _stprintf (tmp2, L"input.%d.%s.%d.name", idnum + 1, name, devnum); + cfgfile_write_str (f, tmp2, s); + } + + if (!isdevice (id)) { + _stprintf (tmp2, L"input.%d.%s.%d.empty", idnum + 1, name, devnum); + cfgfile_write_bool (f, tmp2, true); + if (id->enabled) { + _stprintf (tmp2, L"input.%d.%s.%d.disabled", idnum + 1, name, devnum); + cfgfile_write (f, tmp2, L"%d", id->enabled ? 0 : 1); + } + return false; + } + + if (idnum == GAMEPORT_INPUT_SETTINGS) { + _stprintf (tmp2, L"input.%d.%s.%d.custom", idnum + 1, name, devnum); + cfgfile_write_bool (f, tmp2, true); + } else { + _stprintf (tmp2, L"input.%d.%s.%d.empty", idnum + 1, name, devnum); + cfgfile_write_bool (f, tmp2, false); + _stprintf (tmp2, L"input.%d.%s.%d.disabled", idnum + 1, name, devnum); + cfgfile_write (f, tmp2, L"%d", id->enabled ? 0 : 1); + } + return true; +} + static void write_config2 (struct zfile *f, int idnum, int i, int offset, TCHAR *tmp1, struct uae_input_device *id) { TCHAR tmp2[200], tmp3[200], *p; @@ -487,11 +546,11 @@ static void write_config2 (struct zfile *f, int idnum, int i, int offset, TCHAR else if (evt <= 0) _stprintf (p, L"NULL"); else - _stprintf (p, L"%s.%d", events[evt].confname, id->flags[i + offset][j]); + _stprintf (p, L"%s.%d", events[evt].confname, id->flags[i + offset][j] & ID_FLAG_SAVE_MASK); p += _tcslen (p); } if (p > tmp2) { - _stprintf (tmp3, L"input.%d.%s%d", idnum, tmp1, i); + _stprintf (tmp3, L"input.%d.%s%d", idnum + 1, tmp1, i); cfgfile_write_str (f, tmp3, tmp2); } } @@ -500,43 +559,11 @@ static struct inputdevice_functions *getidf (int devnum); static void write_config (struct zfile *f, int idnum, int devnum, TCHAR *name, struct uae_input_device *id, struct uae_input_device2 *id2, struct inputdevice_functions *idf) { - TCHAR tmp1[MAX_DPATH], tmp2[MAX_DPATH], *s; + TCHAR tmp1[MAX_DPATH]; int i; - if (!isdevice (id)) { - _stprintf (tmp2, L"input.%d.%s.%d.empty", idnum, name, devnum); - cfgfile_write_bool (f, tmp2, 1); - if (id->enabled) { - _stprintf (tmp2, L"input.%d.%s.%d.disabled", idnum, name, devnum); - cfgfile_write (f, tmp2, L"%d", id->enabled ? 0 : 1); - } + if (!write_config_head (f, idnum, devnum, name, id, idf)) return; - } - - _stprintf (tmp2, L"input.%d.%s.%d.empty", idnum, name, devnum); - cfgfile_write_bool (f, tmp2, 0); - _stprintf (tmp2, L"input.%d.%s.%d.disabled", idnum, name, devnum); - cfgfile_write (f, tmp2, L"%d", id->enabled ? 0 : 1); - - s = NULL; - if (id->name) - s = id->name; - else if (devnum < idf->get_num ()) - s = idf->get_friendlyname (devnum); - if (s) { - _stprintf (tmp2, L"input.%d.%s.%d.friendlyname", idnum, name, devnum); - cfgfile_write_str (f, tmp2, s); - } - - s = NULL; - if (id->configname) - s = id->configname; - else if (devnum < idf->get_num ()) - s = idf->get_uniquename (devnum); - if (s) { - _stprintf (tmp2, L"input.%d.%s.%d.name", idnum, name, devnum); - cfgfile_write_str (f, tmp2, s); - } _stprintf (tmp1, L"%s.%d.axis.", name, devnum); for (i = 0; i < ID_AXIS_TOTAL; i++) @@ -563,6 +590,10 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae if (!keyboard_default) return; + + if (!write_config_head (f, idnum, devnum, L"keyboard", kbr, idf)) + return; + i = 0; while (i < MAX_INPUT_DEVICE_EVENTS && kbr->extra[i][0] >= 0) { skip = 0; @@ -571,16 +602,16 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae if (keyboard_default[k].scancode == kbr->extra[i][0]) { skip = 1; for (j = 1; j < MAX_INPUT_SUB_EVENT; j++) { - if (kbr->flags[i][j] || kbr->eventid[i][j] > 0) + if ((kbr->flags[i][j] & ID_FLAG_SAVE_MASK) != 0 || kbr->eventid[i][j] > 0) skip = 0; } - if (keyboard_default[k].event != kbr->eventid[i][0] || kbr->flags[i][0] != 0) + if (keyboard_default[k].evt != kbr->eventid[i][0] || keyboard_default[k].flags != (kbr->flags[i][0] & ID_FLAG_SAVE_MASK)) skip = 0; break; } k++; } - if (kbr->eventid[i][0] == 0 && kbr->flags[i][0] == 0 && keyboard_default[k].scancode < 0) + if (kbr->eventid[i][0] == 0 && (kbr->flags[i][0] & ID_FLAG_SAVE_MASK) == 0 && keyboard_default[k].scancode < 0) skip = 1; if (skip) { i++; @@ -604,9 +635,9 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae *p = 0; } if (custom && _tcslen (custom) > 0) - _stprintf (p, L"'%s'.%d", custom, kbr->flags[i][j] & 0xff); + _stprintf (p, L"'%s'.%d", custom, kbr->flags[i][j] & ID_FLAG_SAVE_MASK); else if (evt > 0) - _stprintf (p, L"%s.%d", events[evt].confname, kbr->flags[i][j]); + _stprintf (p, L"%s.%d", events[evt].confname, kbr->flags[i][j] & ID_FLAG_SAVE_MASK); else _tcscat (p, L"NULL"); p += _tcslen(p); @@ -614,7 +645,7 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae _stprintf (tmp3, L"%d", kbr->extra[i][0]); kbrlabel (tmp3); _stprintf (tmp1, L"keyboard.%d.button.%s", devnum, tmp3); - _stprintf (tmp4, L"input.%d.%s", idnum, tmp1); + _stprintf (tmp4, L"input.%d.%s", idnum + 1, tmp1); cfgfile_write_str (f, tmp4, tmp2[0] ? tmp2 : L"NULL"); i++; } @@ -624,7 +655,7 @@ void write_inputdevice_config (struct uae_prefs *p, struct zfile *f) { int i, id; - cfgfile_write (f, L"input.config", L"%d", p->input_selected_setting); + cfgfile_write (f, L"input.config", L"%d", p->input_selected_setting + 1); cfgfile_write (f, L"input.joymouse_speed_analog", L"%d", p->input_joymouse_multiplier); cfgfile_write (f, L"input.joymouse_speed_digital", L"%d", p->input_joymouse_speed); cfgfile_write (f, L"input.joymouse_deadzone", L"%d", p->input_joymouse_deadzone); @@ -632,8 +663,8 @@ void write_inputdevice_config (struct uae_prefs *p, struct zfile *f) cfgfile_write (f, L"input.analog_joystick_multiplier", L"%d", p->input_analog_joystick_mult); cfgfile_write (f, L"input.analog_joystick_offset", L"%d", p->input_analog_joystick_offset); cfgfile_write (f, L"input.mouse_speed", L"%d", p->input_mouse_speed); - cfgfile_write (f, L"input.autofire", L"%d", p->input_autofire_framecnt); - for (id = 1; id <= MAX_INPUT_SETTINGS; id++) { + cfgfile_write (f, L"input.autofire_speed", L"%d", p->input_autofire_linecnt); + for (id = 0; id < MAX_INPUT_SETTINGS; id++) { for (i = 0; i < MAX_INPUT_DEVICES; i++) write_config (f, id, i, L"joystick", &p->joystick_settings[id][i], &joysticks2[i], &idev[IDTYPE_JOYSTICK]); for (i = 0; i < MAX_INPUT_DEVICES; i++) @@ -673,10 +704,81 @@ static TCHAR *getstring (TCHAR **pp) return str; } -void reset_inputdevice_config (struct uae_prefs *pr) +static void reset_inputdevice_settings (struct uae_input_device *uid) +{ + for (int l = 0; l < MAX_INPUT_DEVICE_EVENTS; l++) { + for (int i = 0; i < MAX_INPUT_SUB_EVENT; i++) { + uid->eventid[l][i] = 0; + uid->flags[l][i] = 0; + xfree (uid->custom[l][i]); + uid->custom[l][i] = NULL; + } + } +} +static void reset_inputdevice_slot (struct uae_prefs *prefs, int slot) +{ + for (int m = 0; m < MAX_INPUT_DEVICES; m++) { + reset_inputdevice_settings (&prefs->joystick_settings[slot][m]); + reset_inputdevice_settings (&prefs->mouse_settings[slot][m]); + reset_inputdevice_settings (&prefs->keyboard_settings[slot][m]); + } +} +void reset_inputdevice_config (struct uae_prefs *prefs) { + for (int i = 0; i< MAX_INPUT_SETTINGS; i++) + reset_inputdevice_slot (prefs, i); } + +static void set_kbr_default_event (struct uae_input_device *kbr, struct uae_input_device_kbr_default *trans, int num) +{ + for (int i = 0; trans[i].scancode >= 0; i++) { + if (kbr->extra[num][0] == trans[i].scancode) { + int k; + for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) { + if (kbr->eventid[num][k] == 0) + break; + } + if (k == MAX_INPUT_SUB_EVENT) { + write_log (L"corrupt default keyboard mappings\n"); + return; + } + kbr->eventid[num][k] = trans[i].evt; + kbr->flags[num][k] = trans[i].flags; + break; + } + } +} + +static void set_kbr_default (struct uae_prefs *p, int index) +{ + int i, j; + struct uae_input_device_kbr_default *trans = keyboard_default; + struct uae_input_device *kbr; + struct inputdevice_functions *id = &idev[IDTYPE_KEYBOARD]; + uae_u32 scancode; + + if (!trans) + return; + for (j = 0; j < MAX_INPUT_DEVICES; j++) { + kbr = &p->keyboard_settings[index][j]; + for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + memset (kbr, 0, sizeof (struct uae_input_device)); + kbr->extra[i][0] = -1; + } + if (j < id->get_num ()) { + if (input_get_default_keyboard (j)) + kbr->enabled = 1; + for (i = 0; i < id->get_widget_num (j); i++) { + id->get_widget_type (j, i, 0, &scancode); + kbr->extra[i][0] = scancode; + set_kbr_default_event (kbr, trans, i); + } + } + } +} + + static void clear_id (struct uae_input_device *id) { #ifndef _DEBUG @@ -701,8 +803,13 @@ void read_inputdevice_config (struct uae_prefs *pr, TCHAR *option, TCHAR *value) option += 6; /* "input." */ p = getstring (&option); - if (!strcasecmp (p, L"config")) - pr->input_selected_setting = _tstol (value); + if (!strcasecmp (p, L"config")) { + pr->input_selected_setting = _tstol (value) - 1; + if (pr->input_selected_setting == -1) + pr->input_selected_setting = GAMEPORT_INPUT_SETTINGS; + if (pr->input_selected_setting < 0 || pr->input_selected_setting > MAX_INPUT_SETTINGS) + pr->input_selected_setting = 0; + } if (!strcasecmp (p, L"joymouse_speed_analog")) pr->input_joymouse_multiplier = _tstol (value); if (!strcasecmp (p, L"joymouse_speed_digital")) @@ -713,8 +820,8 @@ void read_inputdevice_config (struct uae_prefs *pr, TCHAR *option, TCHAR *value) pr->input_joymouse_deadzone = _tstol (value); if (!strcasecmp (p, L"mouse_speed")) pr->input_mouse_speed = _tstol (value); - if (!strcasecmp (p, L"autofire")) - pr->input_autofire_framecnt = _tstol (value); + if (!strcasecmp (p, L"autofire_speed")) + pr->input_autofire_linecnt = _tstol (value); if (!strcasecmp (p, L"analog_joystick_multiplier")) pr->input_analog_joystick_mult = _tstol (value); if (!strcasecmp (p, L"analog_joystick_offset")) @@ -723,6 +830,7 @@ void read_inputdevice_config (struct uae_prefs *pr, TCHAR *option, TCHAR *value) idnum = _tstol (p); if (idnum <= 0 || idnum > MAX_INPUT_SETTINGS) return; + idnum--; if (_tcsncmp (option, L"mouse.", 6) == 0) { p = option + 6; @@ -765,9 +873,24 @@ void read_inputdevice_config (struct uae_prefs *pr, TCHAR *option, TCHAR *value) return; } + if (!_tcscmp (p2, L"custom")) { + int disabled; + p = value; + disabled = getnum (&p); + if (idnum == GAMEPORT_INPUT_SETTINGS) { + clear_id (id); + if (joystick < 0) + set_kbr_default (pr, idnum); + id->enabled = disabled == 0 ? 1 : 0; + } + return; + } + if (!_tcscmp (p2, L"empty")) { clear_id (id); id->enabled = 1; + if (idnum == GAMEPORT_INPUT_SETTINGS) + id->enabled = 0; return; } @@ -776,18 +899,21 @@ void read_inputdevice_config (struct uae_prefs *pr, TCHAR *option, TCHAR *value) p = value; disabled = getnum (&p); id->enabled = disabled == 0 ? 1 : 0; + if (idnum == GAMEPORT_INPUT_SETTINGS) + id->enabled = 0; return; } + if (idnum == GAMEPORT_INPUT_SETTINGS && id->enabled == 0) + return; + if (joystick < 0) { num = getnum (&p); - keynum = 0; - while (id->extra[keynum][0] >= 0) { + for (keynum = 0; keynum < MAX_INPUT_DEVICE_EVENTS; keynum++) { if (id->extra[keynum][0] == num) break; - keynum++; } - if (id->extra[keynum][0] < 0) + if (keynum >= MAX_INPUT_DEVICE_EVENTS) return; } else { button = -1; @@ -1968,6 +2094,16 @@ static uae_u16 handle_joystick_potgor (uae_u16 potgor) static int inputdelay; +void inputdevice_read (void) +{ + do { + handle_msgpump (); + idev[IDTYPE_MOUSE].read (); + idev[IDTYPE_JOYSTICK].read (); + idev[IDTYPE_KEYBOARD].read (); + } while (handle_msgpump ()); +} + void inputdevice_hsync (void) { static int cnt; @@ -1976,17 +2112,28 @@ void inputdevice_hsync (void) #ifdef CATWEASEL catweasel_hsync (); #endif - if ((++cnt & 63) == 63 && handle_msgpump ()) { - idev[IDTYPE_MOUSE].read (); - idev[IDTYPE_JOYSTICK].read (); - idev[IDTYPE_KEYBOARD].read (); + + for (int i = 0; i < INPUT_QUEUE_SIZE; i++) { + struct input_queue_struct *iq = &input_queue[i]; + if (iq->linecnt > 0) { + iq->linecnt--; + if (iq->linecnt == 0) { + if (iq->state) + iq->state = 0; + else + iq->state = iq->storedstate; + handle_input_event (iq->event, iq->state, iq->max, 0); + iq->linecnt = iq->nextlinecnt; + } + } } - if (inputdelay > 0) { + + if ((++cnt & 63) == 63 ) { + inputdevice_read (); + } else if (inputdelay > 0) { inputdelay--; - if (inputdelay == 0) { - idev[IDTYPE_JOYSTICK].read (); - idev[IDTYPE_KEYBOARD].read (); - } + if (inputdelay == 0) + inputdevice_read (); } } @@ -2080,7 +2227,7 @@ static int check_input_queue (int event) return -1; } -static void queue_input_event (int event, int state, int max, int framecnt, int autofire) +static void queue_input_event (int event, int state, int max, int linecnt, int autofire) { struct input_queue_struct *iq; int i = check_input_queue (event); @@ -2089,15 +2236,15 @@ static void queue_input_event (int event, int state, int max, int framecnt, int return; if (state < 0 && i >= 0) { iq = &input_queue[i]; - iq->nextframecnt = -1; - iq->framecnt = -1; + iq->nextlinecnt = -1; + iq->linecnt = -1; iq->event = 0; if (iq->state == 0) handle_input_event (event, 0, 1, 0); } else if (i < 0) { for (i = 0; i < INPUT_QUEUE_SIZE; i++) { iq = &input_queue[i]; - if (iq->framecnt < 0) + if (iq->linecnt < 0) break; } if (i == INPUT_QUEUE_SIZE) { @@ -2107,8 +2254,8 @@ static void queue_input_event (int event, int state, int max, int framecnt, int iq->event = event; iq->state = iq->storedstate = state; iq->max = max; - iq->framecnt = framecnt; - iq->nextframecnt = autofire > 0 ? framecnt : -1; + iq->linecnt = linecnt; + iq->nextlinecnt = autofire > 0 ? linecnt : -1; } } @@ -2361,7 +2508,7 @@ void inputdevice_handle_inputcode (void) case AKS_INPUT_CONFIG_2: case AKS_INPUT_CONFIG_3: case AKS_INPUT_CONFIG_4: - changed_prefs.input_selected_setting = currprefs.input_selected_setting = code - AKS_INPUT_CONFIG_1 + 1; + changed_prefs.input_selected_setting = currprefs.input_selected_setting = code - AKS_INPUT_CONFIG_1; inputdevice_updateconfig (&currprefs); break; case AKS_DISK_PREV0: @@ -2416,10 +2563,10 @@ int handle_input_event (int nr, int state, int max, int autofire) return 0; ie = &events[nr]; if (inputdevice_logging & 1) - write_log (L"'%s' %d %d\n", ie->name, state, max); + write_log (L"'%s' STATE=%d MAX=%d AF=%d\n", ie->name, state, max, autofire); if (autofire) { if (state) - queue_input_event (nr, state, max, currprefs.input_autofire_framecnt, 1); + queue_input_event (nr, state, max, currprefs.input_autofire_linecnt, 1); else queue_input_event (nr, -1, 0, 0, 1); } @@ -2612,7 +2759,7 @@ static void inputdevice_checkconfig (void) currprefs.input_joymouse_deadzone != changed_prefs.input_joymouse_deadzone || currprefs.input_joystick_deadzone != changed_prefs.input_joystick_deadzone || currprefs.input_joymouse_speed != changed_prefs.input_joymouse_speed || - currprefs.input_autofire_framecnt != changed_prefs.input_autofire_framecnt || + currprefs.input_autofire_linecnt != changed_prefs.input_autofire_linecnt || currprefs.input_mouse_speed != changed_prefs.input_mouse_speed) { currprefs.input_selected_setting = changed_prefs.input_selected_setting; @@ -2620,7 +2767,7 @@ static void inputdevice_checkconfig (void) currprefs.input_joymouse_deadzone = changed_prefs.input_joymouse_deadzone; currprefs.input_joystick_deadzone = changed_prefs.input_joystick_deadzone; currprefs.input_joymouse_speed = changed_prefs.input_joymouse_speed; - currprefs.input_autofire_framecnt = changed_prefs.input_autofire_framecnt; + currprefs.input_autofire_linecnt = changed_prefs.input_autofire_linecnt; currprefs.input_mouse_speed = changed_prefs.input_mouse_speed; inputdevice_updateconfig (&currprefs); @@ -2633,31 +2780,12 @@ static void inputdevice_checkconfig (void) void inputdevice_vsync (void) { - struct input_queue_struct *iq; - int i; - if (inputdevice_logging & 32) write_log (L"*\n"); - for (i = 0; i < INPUT_QUEUE_SIZE; i++) { - iq = &input_queue[i]; - if (iq->framecnt > 0) { - iq->framecnt--; - if (iq->framecnt == 0) { - if (iq->state) - iq->state = 0; - else - iq->state = iq->storedstate; - handle_input_event (iq->event, iq->state, iq->max, 0); - iq->framecnt = iq->nextframecnt; - } - } - } - input_frame++; mouseupdate (0, 1); - idev[IDTYPE_MOUSE].read (); - idev[IDTYPE_JOYSTICK].read (); + inputdevice_read (); inputdelay = uaerand () % (maxvpos <= 1 ? 1 : maxvpos - 1); inputdevice_handle_inputcode (); @@ -2747,7 +2875,7 @@ static int switchdevice (struct uae_input_device *id, int num, int button) return 0; if (num == 0 && otherbuttonpressed) newport = newport ? 0 : 1; - if (!currprefs.input_selected_setting) { + if (currprefs.input_selected_setting == GAMEPORT_INPUT_SETTINGS) { if (num == 0 || num == 1) { int om = jsem_ismouse (num, &currprefs); int om1 = jsem_ismouse (0, &currprefs); @@ -2766,7 +2894,7 @@ static int switchdevice (struct uae_input_device *id, int num, int button) return 0; } else { int oldport = getoldport (id); - int i, j, k, evt; + int k, evt; struct inputevent *ie, *ie2; if (flags) @@ -2776,12 +2904,12 @@ static int switchdevice (struct uae_input_device *id, int num, int button) newport++; /* do not switch if switching mouse and any "supermouse" mouse enabled */ if (ismouse) { - for (i = 0; i < MAX_INPUT_SETTINGS + 1; i++) { + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { if (mice[i].enabled && idev[IDTYPE_MOUSE].get_flags (i)) return 0; } } - for (i = 0; i < MAX_INPUT_SETTINGS + 1; i++) { + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { if (getoldport (&joysticks[i]) == newport) joysticks[i].enabled = 0; if (getoldport (&mice[i]) == newport) @@ -3068,7 +3196,7 @@ static void scanevents (struct uae_prefs *p) use_keyboards[i] = 0; if (keyboards[i].enabled && i < idev[IDTYPE_KEYBOARD].get_num()) { j = 0; - while (keyboards[i].extra[j][0] >= 0) { + while (j < MAX_INPUT_DEVICE_EVENTS && keyboards[i].extra[j][0] >= 0) { use_keyboards[i] = 1; for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) { ei = keyboards[i].eventid[j][k]; @@ -3085,60 +3213,163 @@ static void scanevents (struct uae_prefs *p) } } -#ifdef CD32 -static void setcd32 (int joy, int n) +static int axistable[] = { + INPUTEVENT_MOUSE1_HORIZ, INPUTEVENT_MOUSE1_LEFT, INPUTEVENT_MOUSE1_RIGHT, + INPUTEVENT_MOUSE1_VERT, INPUTEVENT_MOUSE1_UP, INPUTEVENT_MOUSE1_DOWN, + INPUTEVENT_MOUSE2_HORIZ, INPUTEVENT_MOUSE2_LEFT, INPUTEVENT_MOUSE2_RIGHT, + INPUTEVENT_MOUSE2_VERT, INPUTEVENT_MOUSE2_UP, INPUTEVENT_MOUSE2_DOWN, + INPUTEVENT_JOY1_HORIZ, INPUTEVENT_JOY1_LEFT, INPUTEVENT_JOY1_RIGHT, + INPUTEVENT_JOY1_VERT, INPUTEVENT_JOY1_UP, INPUTEVENT_JOY1_DOWN, + INPUTEVENT_JOY2_HORIZ, INPUTEVENT_JOY2_LEFT, INPUTEVENT_JOY2_RIGHT, + INPUTEVENT_JOY2_VERT, INPUTEVENT_JOY2_UP, INPUTEVENT_JOY2_DOWN, + INPUTEVENT_LIGHTPEN_HORIZ, INPUTEVENT_LIGHTPEN_LEFT, INPUTEVENT_LIGHTPEN_RIGHT, + INPUTEVENT_LIGHTPEN_VERT, INPUTEVENT_LIGHTPEN_UP, INPUTEVENT_LIGHTPEN_DOWN, + INPUTEVENT_PAR_JOY1_HORIZ, INPUTEVENT_PAR_JOY1_LEFT, INPUTEVENT_PAR_JOY1_RIGHT, + INPUTEVENT_PAR_JOY1_VERT, INPUTEVENT_PAR_JOY1_UP, INPUTEVENT_PAR_JOY1_DOWN, + INPUTEVENT_PAR_JOY2_HORIZ, INPUTEVENT_PAR_JOY2_LEFT, INPUTEVENT_PAR_JOY2_RIGHT, + INPUTEVENT_PAR_JOY2_VERT, INPUTEVENT_PAR_JOY2_UP, INPUTEVENT_PAR_JOY2_DOWN, + INPUTEVENT_MOUSE_CDTV_HORIZ, INPUTEVENT_MOUSE_CDTV_LEFT, INPUTEVENT_MOUSE_CDTV_RIGHT, + INPUTEVENT_MOUSE_CDTV_VERT, INPUTEVENT_MOUSE_CDTV_UP, INPUTEVENT_MOUSE_CDTV_DOWN, + -1 +}; + +int intputdevice_compa_get_eventtype (int evt, int **axistablep) { - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = n ? INPUTEVENT_JOY2_CD32_RED : INPUTEVENT_JOY1_CD32_RED; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = n ? INPUTEVENT_JOY2_CD32_BLUE : INPUTEVENT_JOY1_CD32_BLUE; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = n ? INPUTEVENT_JOY2_CD32_GREEN : INPUTEVENT_JOY1_CD32_GREEN; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 3][0] = n ? INPUTEVENT_JOY2_CD32_YELLOW : INPUTEVENT_JOY1_CD32_YELLOW; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 4][0] = n ? INPUTEVENT_JOY2_CD32_RWD : INPUTEVENT_JOY1_CD32_RWD; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 5][0] = n ? INPUTEVENT_JOY2_CD32_FFW : INPUTEVENT_JOY1_CD32_FFW; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 6][0] = n ? INPUTEVENT_JOY2_CD32_PLAY : INPUTEVENT_JOY1_CD32_PLAY; + for (int i = 0; axistable[i] >= 0; i += 3) { + *axistablep = &axistable[i]; + if (axistable[i] == evt) + return IDEV_WIDGET_AXIS; + if (axistable[i + 1] == evt) + return IDEV_WIDGET_BUTTONAXIS; + if (axistable[i + 2] == evt) + return IDEV_WIDGET_BUTTONAXIS; + } + *axistablep = NULL; + return IDEV_WIDGET_BUTTON; } -#endif - -int compatibility_device[MAX_JPORTS]; +static int rem_port1[] = { + INPUTEVENT_MOUSE1_HORIZ, INPUTEVENT_MOUSE1_VERT, + INPUTEVENT_JOY1_HORIZ, INPUTEVENT_JOY1_VERT, + INPUTEVENT_JOY1_HORIZ_POT, INPUTEVENT_JOY1_VERT_POT, + INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, INPUTEVENT_JOY1_3RD_BUTTON, + INPUTEVENT_JOY1_CD32_RED, INPUTEVENT_JOY1_CD32_BLUE, INPUTEVENT_JOY1_CD32_GREEN, INPUTEVENT_JOY1_CD32_YELLOW, + INPUTEVENT_JOY1_CD32_RWD, INPUTEVENT_JOY1_CD32_FFW, INPUTEVENT_JOY1_CD32_PLAY, + INPUTEVENT_MOUSE_CDTV_HORIZ, INPUTEVENT_MOUSE_CDTV_VERT, + INPUTEVENT_LIGHTPEN_HORIZ, INPUTEVENT_LIGHTPEN_VERT, + -1 +}; +static int rem_port2[] = { + INPUTEVENT_MOUSE2_HORIZ, INPUTEVENT_MOUSE2_VERT, + INPUTEVENT_JOY2_HORIZ, INPUTEVENT_JOY2_VERT, + INPUTEVENT_JOY2_HORIZ_POT, INPUTEVENT_JOY2_VERT_POT, + INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_2ND_BUTTON, INPUTEVENT_JOY2_3RD_BUTTON, + INPUTEVENT_JOY2_CD32_RED, INPUTEVENT_JOY2_CD32_BLUE, INPUTEVENT_JOY2_CD32_GREEN, INPUTEVENT_JOY2_CD32_YELLOW, + INPUTEVENT_JOY2_CD32_RWD, INPUTEVENT_JOY2_CD32_FFW, INPUTEVENT_JOY2_CD32_PLAY, + -1, -1, + -1, -1, + -1 +}; +static int rem_port3[] = { + INPUTEVENT_PAR_JOY1_LEFT, INPUTEVENT_PAR_JOY1_RIGHT, INPUTEVENT_PAR_JOY1_UP, INPUTEVENT_PAR_JOY1_DOWN, + INPUTEVENT_PAR_JOY1_FIRE_BUTTON, + -1 +}; +static int rem_port4[] = { + INPUTEVENT_PAR_JOY2_LEFT, INPUTEVENT_PAR_JOY2_RIGHT, INPUTEVENT_PAR_JOY2_UP, INPUTEVENT_PAR_JOY2_DOWN, + INPUTEVENT_PAR_JOY2_FIRE_BUTTON, + -1 +}; +static int *rem_ports[] = { rem_port1, rem_port2, rem_port3, rem_port4 }; +static int af_port1[] = { + INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_CD32_RED, + -1 +}; +static int af_port2[] = { + INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_CD32_RED, + -1 +}; +static int af_port3[] = { + INPUTEVENT_PAR_JOY1_FIRE_BUTTON, + -1 +}; +static int af_port4[] = { + INPUTEVENT_PAR_JOY2_FIRE_BUTTON, + -1 +}; +static int *af_ports[] = { af_port1, af_port2, af_port3, af_port4 }; static int ip_joy1[] = { - INPUTEVENT_JOY1_UP, INPUTEVENT_JOY1_LEFT, INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_DOWN, - INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, INPUTEVENT_JOY1_3RD_BUTTON, + INPUTEVENT_JOY1_LEFT, INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_UP, INPUTEVENT_JOY1_DOWN, + INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, -1 }; static int ip_joy2[] = { - INPUTEVENT_JOY2_UP, INPUTEVENT_JOY2_LEFT, INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_DOWN, - INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_2ND_BUTTON, INPUTEVENT_JOY2_3RD_BUTTON, + INPUTEVENT_JOY2_LEFT, INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_UP, INPUTEVENT_JOY2_DOWN, + INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_2ND_BUTTON, -1 }; static int ip_joycd321[] = { + INPUTEVENT_JOY1_LEFT, INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_UP, INPUTEVENT_JOY1_DOWN, INPUTEVENT_JOY1_CD32_RED, INPUTEVENT_JOY1_CD32_BLUE, INPUTEVENT_JOY1_CD32_GREEN, INPUTEVENT_JOY1_CD32_YELLOW, INPUTEVENT_JOY1_CD32_RWD, INPUTEVENT_JOY1_CD32_FFW, INPUTEVENT_JOY1_CD32_PLAY, -1 }; static int ip_joycd322[] = { + INPUTEVENT_JOY2_LEFT, INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_UP, INPUTEVENT_JOY2_DOWN, INPUTEVENT_JOY2_CD32_RED, INPUTEVENT_JOY2_CD32_BLUE, INPUTEVENT_JOY2_CD32_GREEN, INPUTEVENT_JOY2_CD32_YELLOW, INPUTEVENT_JOY2_CD32_RWD, INPUTEVENT_JOY2_CD32_FFW, INPUTEVENT_JOY2_CD32_PLAY, -1 }; static int ip_parjoy1[] = { - INPUTEVENT_PAR_JOY1_UP, INPUTEVENT_PAR_JOY1_LEFT, INPUTEVENT_PAR_JOY1_RIGHT, INPUTEVENT_PAR_JOY1_DOWN, + INPUTEVENT_PAR_JOY1_LEFT, INPUTEVENT_PAR_JOY1_RIGHT, INPUTEVENT_PAR_JOY1_UP, INPUTEVENT_PAR_JOY1_DOWN, INPUTEVENT_PAR_JOY1_FIRE_BUTTON, -1 }; static int ip_parjoy2[] = { - INPUTEVENT_PAR_JOY2_UP, INPUTEVENT_PAR_JOY2_LEFT, INPUTEVENT_PAR_JOY2_RIGHT, INPUTEVENT_PAR_JOY2_DOWN, + INPUTEVENT_PAR_JOY2_LEFT, INPUTEVENT_PAR_JOY2_RIGHT, INPUTEVENT_PAR_JOY2_UP, INPUTEVENT_PAR_JOY2_DOWN, INPUTEVENT_PAR_JOY2_FIRE_BUTTON, -1 }; static int ip_mouse1[] = { - INPUTEVENT_MOUSE1_UP, INPUTEVENT_MOUSE1_LEFT, INPUTEVENT_MOUSE1_RIGHT, INPUTEVENT_MOUSE1_DOWN, - INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, INPUTEVENT_JOY1_3RD_BUTTON, + INPUTEVENT_MOUSE1_LEFT, INPUTEVENT_MOUSE1_RIGHT, INPUTEVENT_MOUSE1_UP, INPUTEVENT_MOUSE1_DOWN, + INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, -1 }; static int ip_mouse2[] = { - INPUTEVENT_MOUSE2_UP, INPUTEVENT_MOUSE2_LEFT, INPUTEVENT_MOUSE2_RIGHT, INPUTEVENT_MOUSE2_DOWN, - INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_2ND_BUTTON, INPUTEVENT_JOY2_3RD_BUTTON, + INPUTEVENT_MOUSE2_LEFT, INPUTEVENT_MOUSE2_RIGHT, INPUTEVENT_MOUSE2_UP, INPUTEVENT_MOUSE2_DOWN, + INPUTEVENT_JOY2_FIRE_BUTTON, INPUTEVENT_JOY2_2ND_BUTTON, + -1 +}; +static int ip_mousecdtv[] = +{ + INPUTEVENT_MOUSE_CDTV_LEFT, INPUTEVENT_MOUSE_CDTV_RIGHT, INPUTEVENT_MOUSE_CDTV_UP, INPUTEVENT_MOUSE_CDTV_DOWN, + INPUTEVENT_JOY1_FIRE_BUTTON, INPUTEVENT_JOY1_2ND_BUTTON, + -1 +}; +static int ip_arcadia[] = { + INPUTEVENT_SPC_ARCADIA_DIAGNOSTICS, INPUTEVENT_SPC_ARCADIA_PLAYER1, INPUTEVENT_SPC_ARCADIA_PLAYER2, + INPUTEVENT_SPC_ARCADIA_COIN1, INPUTEVENT_SPC_ARCADIA_COIN2, + -1 +}; +static int ip_lightpen1[] = { + INPUTEVENT_LIGHTPEN_HORIZ, INPUTEVENT_LIGHTPEN_VERT, INPUTEVENT_JOY1_3RD_BUTTON, + -1 +}; +static int ip_lightpen2[] = { + INPUTEVENT_LIGHTPEN_HORIZ, INPUTEVENT_LIGHTPEN_VERT, INPUTEVENT_JOY2_3RD_BUTTON, + -1 +}; +static int ip_analog1[] = { + INPUTEVENT_JOY1_HORIZ_POT, INPUTEVENT_JOY1_VERT_POT, INPUTEVENT_JOY1_LEFT, INPUTEVENT_JOY1_RIGHT, + -1 +}; +static int ip_analog2[] = { + INPUTEVENT_JOY2_HORIZ_POT, INPUTEVENT_JOY2_VERT_POT, INPUTEVENT_JOY2_LEFT, INPUTEVENT_JOY2_RIGHT, + -1 +}; + +static int ip_arcadiaxa[] = { -1 }; @@ -3176,7 +3407,7 @@ static void checkcompakb (int *kb, int *srcmap) k = 0; while (keyboard_default[k].scancode >= 0) { if (keyboard_default[k].scancode == kb[j]) { - evt = keyboard_default[k].event; + evt = keyboard_default[k].evt; break; } k++; @@ -3198,16 +3429,18 @@ static void setcompakb (int *kb, int *srcmap) int j, k; k = j = 0; while (kb[j] >= 0 && srcmap[k] >= 0) { - struct uae_input_device *uid = &keyboards[0]; while (kb[j] >= 0) { int id = kb[j]; - for (int l = 0; l < MAX_INPUT_DEVICE_EVENTS; l++) { - if (uid->extra[l][0] == id) { - uid->eventid[l][0] = srcmap[k]; - uid->flags[l][0] = 0; - xfree (uid->custom[l][0]); - uid->custom[l][0] = NULL; - break; + for (int m = 0; m < MAX_INPUT_DEVICES; m++) { + struct uae_input_device *uid = &keyboards[m]; + for (int l = 0; l < MAX_INPUT_DEVICE_EVENTS; l++) { + if (uid->extra[l][0] == id) { + uid->eventid[l][0] = srcmap[k]; + uid->flags[l][0] &= ID_FLAG_SAVE_MASK; + xfree (uid->custom[l][0]); + uid->custom[l][0] = NULL; + break; + } } } j++; @@ -3217,251 +3450,500 @@ static void setcompakb (int *kb, int *srcmap) } } -// merge gameport settings with current input configuration -static void compatibility_copy (struct uae_prefs *prefs) +static int joymodes[MAX_JPORTS]; +static int *joyinputs[MAX_JPORTS]; + +int inputdevice_get_compatibility_input (struct uae_prefs *prefs, int index, int *typelist, int **inputlist, int **at) { - int used[MAX_INPUT_DEVICES] = { 0 }; - int i, joy; + if (index >= MAX_JPORTS || joymodes[index] < 0) + return 0; + *typelist = joymodes[index]; + *inputlist = joyinputs[index]; + *at = axistable; + int cnt = 0; + for (int i = 0; joyinputs[index] && joyinputs[index][i] >= 0; i++, cnt++); + return cnt; +} + +static void clearevent (struct uae_input_device *uid, int evt) +{ + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + if (uid->eventid[i][j] == evt) { + uid->eventid[i][j] = 0; + uid->flags[i][j] = 0; + xfree (uid->custom[i][j]); + uid->custom[i][j] = NULL; + } + } + } +} +static void clearkbrevent (struct uae_input_device *uid, int evt) +{ + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + bool found = false; + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + if (uid->eventid[i][j] == evt) { + uid->eventid[i][j] = 0; + uid->flags[i][j] = 0; + xfree (uid->custom[i][j]); + uid->custom[i][j] = NULL; + if (j == 0) + set_kbr_default_event (uid, keyboard_default, i); + } + } + } +} - for (i = 0; i < 2; i++) { - int mode = prefs->jports[i].mode; - if ((joy = jsem_ismouse (i, prefs)) >= 0) { - switch (mode) - { - case JSEM_MODE_DEFAULT: - case JSEM_MODE_MOUSE: - default: - input_get_default_mouse (mice, joy, i); - break; - case JSEM_MODE_LIGHTPEN: - input_get_default_lightpen (mice, joy, i); +static void resetjport (struct uae_prefs *prefs, int index) +{ + int *p = rem_ports[index]; + while (*p >= 0) { + int evtnum = *p++; + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + clearevent (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + clearevent (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + clearkbrevent (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + } + for (int i = 0; axistable[i] >= 0; i += 3) { + if (evtnum == axistable[i] || evtnum == axistable[i + 1] || evtnum == axistable[i + 2]) { + for (int j = 0; j < 3; j++) { + int evtnum2 = axistable[i + j]; + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + clearevent (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + clearevent (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + clearkbrevent (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + } + } break; } } } - for (i = 1; i >= 0; i--) { - int mode = prefs->jports[i].mode; - joy = jsem_isjoy (i, prefs); - if (joy >= 0) { - switch (mode) - { - case JSEM_MODE_DEFAULT: - case JSEM_MODE_JOYSTICK: - case JSEM_MODE_JOYSTICK_CD32: - default: - input_get_default_joystick (joysticks, joy, i, (mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd))); - break; - case JSEM_MODE_JOYSTICK_ANALOG: - input_get_default_joystick_analog (joysticks, joy, i); - break; - case JSEM_MODE_MOUSE: - input_get_default_mouse (joysticks, joy, i); +} + +static void remove_compa_config (struct uae_prefs *prefs, int index) +{ + int typelist, *inputlist, *atp; + + if (!inputdevice_get_compatibility_input (prefs, index, &typelist, &inputlist, &atp)) + return; + for (int i = 0; inputlist[i] >= 0; i++) { + int evtnum = inputlist[i]; + + int atpidx = 0; + while (*atp >= 0) { + if (*atp == evtnum) { + atp++; + atpidx = 2; break; - case JSEM_MODE_LIGHTPEN: - input_get_default_lightpen (joysticks, joy, i); + } + if (atp[1] == evtnum || atp[2] == evtnum) { + atpidx = 1; break; } - used[joy] = 1; + atp += 3; + } + while (atpidx >= 0) { + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + clearevent (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + clearevent (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + clearkbrevent (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + } + evtnum = *atp++; + atpidx--; } } +} - // replace possible old mappings with default keyboard mapping - checkcompakb (keyboard_default_kbmaps[0], ip_joy2); - checkcompakb (keyboard_default_kbmaps[0], ip_joy1); - checkcompakb (keyboard_default_kbmaps[0], ip_parjoy2); - checkcompakb (keyboard_default_kbmaps[0], ip_parjoy1); - checkcompakb (keyboard_default_kbmaps[0], ip_mouse2); - checkcompakb (keyboard_default_kbmaps[0], ip_mouse1); - checkcompakb (keyboard_default_kbmaps[1], ip_joy2); - checkcompakb (keyboard_default_kbmaps[1], ip_joy1); - checkcompakb (keyboard_default_kbmaps[1], ip_parjoy2); - checkcompakb (keyboard_default_kbmaps[1], ip_parjoy1); - checkcompakb (keyboard_default_kbmaps[1], ip_mouse2); - checkcompakb (keyboard_default_kbmaps[1], ip_mouse1); - checkcompakb (keyboard_default_kbmaps[2], ip_joy2); - checkcompakb (keyboard_default_kbmaps[2], ip_joy1); - checkcompakb (keyboard_default_kbmaps[2], ip_parjoy2); - checkcompakb (keyboard_default_kbmaps[2], ip_parjoy1); - checkcompakb (keyboard_default_kbmaps[2], ip_mouse2); - checkcompakb (keyboard_default_kbmaps[2], ip_mouse1); - checkcompakb (keyboard_default_kbmaps[5], ip_joycd321); - checkcompakb (keyboard_default_kbmaps[5], ip_joycd322); +// prepare port for custom mapping, remove all current Amiga side device mappings +void inputdevice_compa_prepare_custom (struct uae_prefs *prefs, int index) +{ + int mode = prefs->jports[index].mode; + freejport (prefs, index); + resetjport (prefs, index); + if (mode == 0) + mode = index == 0 ? JSEM_MODE_MOUSE : JSEM_MODE_JOYSTICK; + prefs->jports[index].mode = mode; + prefs->jports[index].id = -2; - for (i = 0; i < 2; i++) { - int *kb; - int mode = prefs->jports[i].mode; - for (joy = 0; used[joy]; joy++); - if (JSEM_ISANYKBD (i, prefs)) { - if (JSEM_ISNUMPAD (i, prefs)) - kb = keyboard_default_kbmaps[0]; - else if (JSEM_ISCURSOR (i, prefs)) - kb = keyboard_default_kbmaps[1]; + remove_compa_config (prefs, index); +} + +static void cleardev (struct uae_input_device *uid, int num) +{ + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + uid[num].eventid[i][j] = 0; + } + } +} + +static void setjoyinputs (struct uae_prefs *prefs, int port) +{ + joyinputs[port] = NULL; + switch (joymodes[port]) + { + case JSEM_MODE_JOYSTICK: + if (port >= 2) + joyinputs[port] = port == 3 ? ip_parjoy2 : ip_parjoy1; else - kb = keyboard_default_kbmaps[2]; - switch (mode) - { - case JSEM_MODE_JOYSTICK: - case JSEM_MODE_JOYSTICK_CD32: - case JSEM_MODE_DEFAULT: - setcompakb (kb, i ? ip_joy2 : ip_joy1); - if (mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd)) - setcompakb (keyboard_default_kbmaps[5], i ? ip_joycd322 : ip_joycd321); - break; - case JSEM_MODE_MOUSE: - setcompakb (kb, i ? ip_mouse2 : ip_mouse1); + joyinputs[port] = port == 1 ? ip_joy2 : ip_joy1; + break; + case JSEM_MODE_JOYSTICK_CD32: + joyinputs[port] = port ? ip_joycd322 : ip_joycd321; + break; + case JSEM_MODE_JOYSTICK_ANALOG: + joyinputs[port] = port ? ip_analog2 : ip_analog1; + break; + case JSEM_MODE_MOUSE: + joyinputs[port] = port ? ip_mouse2 : ip_mouse1; + break; + case JSEM_MODE_LIGHTPEN: + joyinputs[port] = port ? ip_lightpen2 : ip_lightpen1; + break; + case JSEM_MODE_MOUSE_CDTV: + joyinputs[port] = ip_mousecdtv; + break; + } +} + +static void enablejoydevice (struct uae_input_device *uid, int evtnum) +{ + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + if (uid->eventid[i][j] == evtnum) { + uid->enabled = 1; + } + } + } +} + +static void setjoydevices (struct uae_prefs *prefs, int port) +{ + for (int i = 0; joyinputs[port] && joyinputs[port][i] >= 0; i++) { + int evtnum = joyinputs[port][i]; + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + enablejoydevice (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + enablejoydevice (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + enablejoydevice (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum); + } + for (int i = 0; axistable[i] >= 0; i += 3) { + if (evtnum == axistable[i] || evtnum == axistable[i + 1] || evtnum == axistable[i + 2]) { + for (int j = 0; j < 3; j++) { + int evtnum2 = axistable[i + j]; + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + enablejoydevice (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + enablejoydevice (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + enablejoydevice (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], evtnum2); + } + } break; } - used[joy] = 1; } + } - // parport - for (i = 2; i < 4; i++) { - int *kb; - for (joy = 0; used[joy]; joy++); - if (JSEM_ISANYKBD (i, prefs)) { - if (JSEM_ISNUMPAD (i, prefs)) - kb = keyboard_default_kbmaps[0]; - else if (JSEM_ISCURSOR (i, prefs)) - kb = keyboard_default_kbmaps[1]; - else - kb = keyboard_default_kbmaps[2]; - setcompakb (kb, i ? ip_parjoy2 : ip_parjoy1); - used[joy] = 1; +} + +static void setautofire (struct uae_input_device *uid, int port, int af) +{ + int *afp = af_ports[port]; + for (int k = 0; afp[k] >= 0; k++) { + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + if (uid->eventid[i][j] == afp[k]) { + uid->flags[i][j] |= ID_FLAG_AUTOFIRE; + } + } } } } +static void setautofires (struct uae_prefs *prefs, int port, int af) +{ + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + setautofire (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], port, af); + setautofire (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], port, af); + setautofire (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], port, af); + } +} -static void compatibility_mode (struct uae_prefs *prefs) +// merge gameport settings with current input configuration +static void compatibility_copy (struct uae_prefs *prefs) { - int joy, i; int used[MAX_INPUT_DEVICES] = { 0 }; + int i, joy; + bool firstmouse = true; - prefs->jports[0].name[0] = prefs->jports[1].name[0] = 0; - prefs->jports[0].configname[0] = prefs->jports[1].configname[0] = 0; - prefs->jports[2].name[0] = prefs->jports[3].name[0] = 0; - prefs->jports[2].configname[0] = prefs->jports[3].configname[0] = 0; - compatibility_device[0] = -1; - compatibility_device[1] = -1; - compatibility_device[2] = -1; - compatibility_device[3] = -1; - for (i = 0; i < MAX_INPUT_DEVICES; i++) { - clear_id (&mice[i]); - clear_id (&joysticks[i]); + for (i = 0; i < MAX_JPORTS; i++) { + joymodes[i] = prefs->jports[i].mode; + joyinputs[i]= NULL; + // remove all mappings from this port, except if custom + if (prefs->jports[i].id != JPORT_CUSTOM) + remove_compa_config (prefs, i); + setjoyinputs (prefs, i); } for (i = 0; i < 2; i++) { - int mode = prefs->jports[i].mode; - if ((joy = jsem_ismouse (i, prefs)) >= 0) { - switch (mode) - { - case JSEM_MODE_DEFAULT: - case JSEM_MODE_MOUSE: - default: - input_get_default_mouse (mice, joy, i); - break; - case JSEM_MODE_LIGHTPEN: - input_get_default_lightpen (mice, joy, i); - break; + if (prefs->jports[i].id >= 0 && joymodes[i] <= 0) { + int mode = prefs->jports[i].mode; + if (jsem_ismouse (i, prefs) >= 0) { + switch (mode) + { + case JSEM_MODE_DEFAULT: + case JSEM_MODE_MOUSE: + default: + joymodes[i] = JSEM_MODE_MOUSE; + joyinputs[i] = i ? ip_mouse2 : ip_mouse1; + break; + case JSEM_MODE_LIGHTPEN: + joymodes[i] = JSEM_MODE_LIGHTPEN; + joyinputs[i] = i ? ip_lightpen2 : ip_lightpen1; + break; + case JSEM_MODE_MOUSE_CDTV: + joymodes[i] = JSEM_MODE_MOUSE_CDTV; + joyinputs[i] = ip_mousecdtv; + break; + } + } else if (jsem_isjoy (i, prefs) >= 0) { + switch (mode) + { + case JSEM_MODE_DEFAULT: + case JSEM_MODE_JOYSTICK: + case JSEM_MODE_JOYSTICK_CD32: + default: + { + int iscd32 = mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd); + joymodes[i] = mode == JSEM_MODE_JOYSTICK_CD32 ? JSEM_MODE_JOYSTICK_CD32 : JSEM_MODE_JOYSTICK; + if (!iscd32) + joyinputs[i] = i ? ip_joy2 : ip_joy1; + else + joyinputs[i] = i ? ip_joycd322 : ip_joycd321; + break; + } + case JSEM_MODE_JOYSTICK_ANALOG: + joymodes[i] = JSEM_MODE_JOYSTICK_ANALOG; + joyinputs[i] = i ? ip_analog2 : ip_analog1; + break; + case JSEM_MODE_MOUSE: + joymodes[i] = JSEM_MODE_MOUSE; + joyinputs[i] = i ? ip_mouse2 : ip_mouse1; + break; + case JSEM_MODE_LIGHTPEN: + joymodes[i] = JSEM_MODE_LIGHTPEN; + joyinputs[i] = i ? ip_lightpen2 : ip_lightpen1; + break; + case JSEM_MODE_MOUSE_CDTV: + joymodes[i] = JSEM_MODE_MOUSE_CDTV; + joyinputs[i] = ip_mousecdtv; + break; + } + } else if (prefs->jports[i].id >= 0) { + prefs->jports[i].mode = joymodes[i] = i ? JSEM_MODE_JOYSTICK : JSEM_MODE_MOUSE; + joyinputs[i] = i ? ip_joy2 : ip_mouse1; } - _tcsncpy (prefs->jports[i].name, idev[IDTYPE_MOUSE].get_friendlyname (joy), MAX_JPORTNAME - 1); - _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_MOUSE].get_uniquename (joy), MAX_JPORTNAME - 1); - mice[joy].enabled = 1; } } - for (i = 1; i >= 0; i--) { - int mode = prefs->jports[i].mode; - joy = jsem_isjoy (i, prefs); - if (joy >= 0) { - switch (mode) - { - case JSEM_MODE_DEFAULT: - case JSEM_MODE_JOYSTICK: - case JSEM_MODE_JOYSTICK_CD32: - default: - input_get_default_joystick (joysticks, joy, i, (mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd))); - break; - case JSEM_MODE_JOYSTICK_ANALOG: - input_get_default_joystick_analog (joysticks, joy, i); - break; - case JSEM_MODE_MOUSE: - input_get_default_mouse (joysticks, joy, i); - break; - case JSEM_MODE_LIGHTPEN: - input_get_default_lightpen (joysticks, joy, i); - break; + + for (i = 2; i < MAX_JPORTS; i++) { + if (prefs->jports[i].id >= 0 && joymodes[i] <= 0) { + int mode = prefs->jports[i].mode; + if (jsem_isjoy (i, prefs) >= 0) { + joymodes[i] = JSEM_MODE_JOYSTICK; + joyinputs[i] = i == 3 ? ip_parjoy2 : ip_parjoy1; + } else if (prefs->jports[i].id >= 0) { + prefs->jports[i].mode = joymodes[i] = JSEM_MODE_JOYSTICK; + joyinputs[i] = i == 3 ? ip_parjoy2 : ip_parjoy1; } - _tcsncpy (prefs->jports[i].name, idev[IDTYPE_JOYSTICK].get_friendlyname (joy), MAX_JPORTNAME - 1); - _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_JOYSTICK].get_uniquename (joy), MAX_JPORTNAME - 1); - joysticks[joy].enabled = 1; - used[joy] = 1; } } - for (i = 2; i < 4; i++) { - joy = jsem_isjoy (i, prefs); - if (joy >= 0) { - input_get_default_joystick (joysticks, joy, i, 0); - _tcsncpy (prefs->jports[i].name, idev[IDTYPE_JOYSTICK].get_friendlyname (joy), MAX_JPORTNAME - 1); - _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_JOYSTICK].get_uniquename (joy), MAX_JPORTNAME - 1); - joysticks[joy].enabled = 1; - used[joy] = 1; + + for (i = 0; i < 2; i++) { + if (prefs->jports[i].id >= 0) { + int mode = prefs->jports[i].mode; + if ((joy = jsem_ismouse (i, prefs)) >= 0) { + cleardev (mice, joy); + switch (mode) + { + case JSEM_MODE_DEFAULT: + case JSEM_MODE_MOUSE: + default: + if (firstmouse) { // map first mouse to each available host mouse device + for (int j = 0; j < MAX_INPUT_DEVICES; j++) + input_get_default_mouse (mice, j, i); + firstmouse = false; + } + input_get_default_mouse (mice, joy, i); + joymodes[i] = JSEM_MODE_MOUSE; + break; + case JSEM_MODE_LIGHTPEN: + input_get_default_lightpen (mice, joy, i); + joymodes[i] = JSEM_MODE_LIGHTPEN; + break; + } + _tcsncpy (prefs->jports[i].name, idev[IDTYPE_MOUSE].get_friendlyname (joy), MAX_JPORTNAME - 1); + _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_MOUSE].get_uniquename (joy), MAX_JPORTNAME - 1); + } } } + for (i = 1; i >= 0; i--) { + if (prefs->jports[i].id >= 0) { + int mode = prefs->jports[i].mode; + joy = jsem_isjoy (i, prefs); + if (joy >= 0) { + cleardev (joysticks, joy); + switch (mode) + { + case JSEM_MODE_DEFAULT: + case JSEM_MODE_JOYSTICK: + case JSEM_MODE_JOYSTICK_CD32: + default: + { + int iscd32 = mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd); + input_get_default_joystick (joysticks, joy, i, iscd32 ? JSEM_MODE_JOYSTICK_CD32 : 0); + joymodes[i] = mode == JSEM_MODE_JOYSTICK_CD32 ? JSEM_MODE_JOYSTICK_CD32 : JSEM_MODE_JOYSTICK; + break; + } + case JSEM_MODE_JOYSTICK_ANALOG: + input_get_default_joystick_analog (joysticks, joy, i); + joymodes[i] = JSEM_MODE_JOYSTICK_ANALOG; + break; + case JSEM_MODE_MOUSE: + input_get_default_mouse (joysticks, joy, i); + joymodes[i] = JSEM_MODE_MOUSE; + break; + case JSEM_MODE_LIGHTPEN: + input_get_default_lightpen (joysticks, joy, i); + joymodes[i] = JSEM_MODE_LIGHTPEN; + break; + case JSEM_MODE_MOUSE_CDTV: + joymodes[i] = JSEM_MODE_MOUSE_CDTV; + input_get_default_joystick (joysticks, joy, i, mode); + break; + + } + _tcsncpy (prefs->jports[i].name, idev[IDTYPE_JOYSTICK].get_friendlyname (joy), MAX_JPORTNAME - 1); + _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_JOYSTICK].get_uniquename (joy), MAX_JPORTNAME - 1); + used[joy] = 1; + } + } + } + + // replace possible old mappings with default keyboard mapping + for (i = KBR_DEFAULT_MAP_NP; i <= KBR_DEFAULT_MAP_SE; i++) { + checkcompakb (keyboard_default_kbmaps[i], ip_joy2); + checkcompakb (keyboard_default_kbmaps[i], ip_joy1); + checkcompakb (keyboard_default_kbmaps[i], ip_parjoy2); + checkcompakb (keyboard_default_kbmaps[i], ip_parjoy1); + checkcompakb (keyboard_default_kbmaps[i], ip_mouse2); + checkcompakb (keyboard_default_kbmaps[i], ip_mouse1); + } + checkcompakb (keyboard_default_kbmaps[5], ip_joycd321); + checkcompakb (keyboard_default_kbmaps[5], ip_joycd322); + for (i = 0; i < 2; i++) { - int mode = prefs->jports[i].mode; - for (joy = 0; used[joy]; joy++); - if (JSEM_ISANYKBD (i, prefs)) { - switch (mode) - { - case JSEM_MODE_JOYSTICK: - case JSEM_MODE_JOYSTICK_CD32: - case JSEM_MODE_DEFAULT: - default: - joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = i ? INPUTEVENT_JOY2_HORIZ : INPUTEVENT_JOY1_HORIZ; - joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = i ? INPUTEVENT_JOY2_VERT : INPUTEVENT_JOY1_VERT; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = i ? INPUTEVENT_JOY2_FIRE_BUTTON : INPUTEVENT_JOY1_FIRE_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = i ? INPUTEVENT_JOY2_2ND_BUTTON : INPUTEVENT_JOY1_2ND_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = i ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON; - if (mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd)) - setcd32 (joy, i); - break; - case JSEM_MODE_MOUSE_CDTV: - joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_MOUSE_CDTV_HORIZ; - joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_MOUSE_CDTV_VERT; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY1_FIRE_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY1_2ND_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY1_3RD_BUTTON; - break; - case JSEM_MODE_MOUSE: - joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = i ? INPUTEVENT_MOUSE2_HORIZ : INPUTEVENT_MOUSE1_HORIZ; - joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = i ? INPUTEVENT_MOUSE2_VERT : INPUTEVENT_MOUSE1_VERT; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = i ? INPUTEVENT_JOY2_FIRE_BUTTON : INPUTEVENT_JOY1_FIRE_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = i ? INPUTEVENT_JOY2_2ND_BUTTON : INPUTEVENT_JOY1_2ND_BUTTON; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = i ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON; - break; - case JSEM_MODE_LIGHTPEN: - joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_LIGHTPEN_HORIZ; - joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_LIGHTPEN_VERT; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = i ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON; - break; + if (prefs->jports[i].id >= 0) { + int *kb = NULL; + int mode = prefs->jports[i].mode; + for (joy = 0; used[joy]; joy++); + if (JSEM_ISANYKBD (i, prefs)) { + int cd32 = mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd); + if (JSEM_ISNUMPAD (i, prefs)) { + if (cd32) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_CD32_NP]; + else + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_NP]; + } else if (JSEM_ISCURSOR (i, prefs)) { + if (cd32) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_CD32_CK]; + else + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_CK]; + } else if (JSEM_ISSOMEWHEREELSE (i, prefs)) { + if (cd32) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_CD32_SE]; + else + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_SE]; + } else if (JSEM_ISXARCADE1 (i, prefs)) { + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_XA1]; + } else if (JSEM_ISXARCADE2 (i, prefs)) { + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_XA2]; + } + if (kb) { + switch (mode) + { + case JSEM_MODE_JOYSTICK: + case JSEM_MODE_JOYSTICK_CD32: + case JSEM_MODE_DEFAULT: + if (cd32) { + setcompakb (kb, i ? ip_joycd322 : ip_joycd321); + joymodes[i] = JSEM_MODE_JOYSTICK_CD32; + } else { + setcompakb (kb, i ? ip_joy2 : ip_joy1); + joymodes[i] = JSEM_MODE_JOYSTICK; + } + break; + case JSEM_MODE_MOUSE: + setcompakb (kb, i ? ip_mouse2 : ip_mouse1); + joymodes[i] = JSEM_MODE_MOUSE; + break; + } + used[joy] = 1; + } + } + } + } + if (arcadia_bios) { + setcompakb (keyboard_default_kbmaps[KBR_DEFAULT_MAP_ARCADIA], ip_arcadia); + if (JSEM_ISXARCADE1 (i, prefs) || JSEM_ISXARCADE2 (i, prefs)) + setcompakb (keyboard_default_kbmaps[KBR_DEFAULT_MAP_ARCADIA_XA], ip_arcadiaxa); + } + // parport + for (i = 2; i < MAX_JPORTS; i++) { + if (prefs->jports[i].id >= 0) { + int *kb = NULL; + joy = jsem_isjoy (i, prefs); + if (joy >= 0) { + cleardev (joysticks, joy); + input_get_default_joystick (joysticks, joy, i, 0); + _tcsncpy (prefs->jports[i].name, idev[IDTYPE_MOUSE].get_friendlyname (joy), MAX_JPORTNAME - 1); + _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_MOUSE].get_uniquename (joy), MAX_JPORTNAME - 1); + used[joy] = 1; + joymodes[i] = JSEM_MODE_JOYSTICK; } - joysticks[joy].enabled = -1; - used[joy] = 1; - compatibility_device[i] = joy; } } - for (i = 2; i < 4; i++) { - for (joy = 0; used[joy]; joy++); - if (JSEM_ISANYKBD (i, prefs)) { - joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = i == 3 ? INPUTEVENT_PAR_JOY2_HORIZ : INPUTEVENT_PAR_JOY1_HORIZ; - joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = i == 3 ? INPUTEVENT_PAR_JOY2_VERT : INPUTEVENT_PAR_JOY1_VERT; - joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = i == 3 ? INPUTEVENT_PAR_JOY2_FIRE_BUTTON : INPUTEVENT_PAR_JOY1_FIRE_BUTTON; - joysticks[joy].enabled = -1; - used[joy] = 1; - compatibility_device[i] = joy; + for (i = 2; i < MAX_JPORTS; i++) { + if (prefs->jports[i].id >= 0) { + int *kb = NULL; + for (joy = 0; used[joy]; joy++); + if (JSEM_ISANYKBD (i, prefs)) { + if (JSEM_ISNUMPAD (i, prefs)) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_NP]; + else if (JSEM_ISCURSOR (i, prefs)) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_CK]; + else if (JSEM_ISSOMEWHEREELSE (i, prefs)) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_SE]; + else if (JSEM_ISXARCADE1 (i, prefs)) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_XA1]; + else if (JSEM_ISXARCADE2 (i, prefs)) + kb = keyboard_default_kbmaps[KBR_DEFAULT_MAP_XA2]; + if (kb) { + setcompakb (kb, i == 3 ? ip_parjoy2 : ip_parjoy1); + used[joy] = 1; + joymodes[i] = JSEM_MODE_JOYSTICK; + } + } } } + for (i = 0; i < MAX_JPORTS; i++) { + if (prefs->jports[i].autofire) + setautofires (prefs, i, prefs->jports[i].autofire); + } + + for (i = 0; i < MAX_JPORTS; i++) { + setjoyinputs (prefs, i); + setjoydevices (prefs, i); + } } static void matchdevices (struct inputdevice_functions *inf, struct uae_input_device *uid) @@ -3532,14 +4014,14 @@ static void matchdevices (struct inputdevice_functions *inf, struct uae_input_de static void matchdevices_all (struct uae_prefs *prefs) { int i; - for (i = 0; i < MAX_INPUT_SETTINGS + 1; i++) { + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { matchdevices (&idev[IDTYPE_MOUSE], prefs->mouse_settings[i]); matchdevices (&idev[IDTYPE_JOYSTICK], prefs->joystick_settings[i]); matchdevices (&idev[IDTYPE_KEYBOARD], prefs->keyboard_settings[i]); } } -static void inputdevice_updateconfig2 (struct uae_prefs *prefs, int domerge) +static void inputdevice_updateconfig2 (struct uae_prefs *prefs) { int i; @@ -3547,6 +4029,7 @@ static void inputdevice_updateconfig2 (struct uae_prefs *prefs, int domerge) copyjport (&changed_prefs, &currprefs, 1); copyjport (&changed_prefs, &currprefs, 2); copyjport (&changed_prefs, &currprefs, 3); + #ifdef RETROPLATFORM rp_input_change (0); rp_input_change (1); @@ -3573,10 +4056,10 @@ static void inputdevice_updateconfig2 (struct uae_prefs *prefs, int domerge) mouse_deltanoreset[i][2] = 0; mouse_delta[i][2] = 0; } - memset (keybuf, 0, sizeof (keybuf)); + memset (keybuf, 0, sizeof keybuf); for (i = 0; i < INPUT_QUEUE_SIZE; i++) - input_queue[i].framecnt = input_queue[i].nextframecnt = -1; + input_queue[i].linecnt = input_queue[i].nextlinecnt = -1; for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) { sublevdir[0][i] = i; @@ -3589,34 +4072,33 @@ static void inputdevice_updateconfig2 (struct uae_prefs *prefs, int domerge) matchdevices_all (prefs); - memset (joysticks2, 0, sizeof (joysticks2)); - memset (mice2, 0, sizeof (mice2)); - if (prefs->input_selected_setting == 0) - compatibility_mode (prefs); - else if (domerge) - compatibility_copy (prefs); + memset (joysticks2, 0, sizeof joysticks2); + memset (mice2, 0, sizeof mice2); - joystick_setting_changed (); + joysticks = prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS]; + mice = prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS]; + keyboards = prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS]; + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { + joysticks[i].enabled = 0; + mice[i].enabled = 0; + } + compatibility_copy (prefs); + joysticks = prefs->joystick_settings[prefs->input_selected_setting]; + mice = prefs->mouse_settings[prefs->input_selected_setting]; + keyboards = prefs->keyboard_settings[prefs->input_selected_setting]; scanevents (prefs); config_changed = 1; - -#if 0 -#ifdef CD32 - if (currprefs.input_selected_setting == 0 && currprefs.cs_cd32cd) - cd32_pad_enabled[1] = 1; -#endif -#endif } void inputdevice_mergeconfig (struct uae_prefs *prefs) { - inputdevice_updateconfig2 (prefs, 1); + inputdevice_updateconfig2 (prefs); } void inputdevice_updateconfig (struct uae_prefs *prefs) { - inputdevice_updateconfig2 (prefs, 0); + inputdevice_updateconfig2 (prefs); } @@ -3634,7 +4116,7 @@ void inputdevice_devicechange (struct uae_prefs *prefs) for (i = 0; i < MAX_JPORTS; i++) { jports[i] = NULL; jportskb[i] = -1; - idx = inputdevice_getjoyportdevice (prefs->jports[i].id); + idx = inputdevice_getjoyportdevice (i, prefs->jports[i].id); if (idx >= JSEM_LASTKBD) { struct inputdevice_functions *idf; int devidx; @@ -3678,56 +4160,13 @@ void inputdevice_devicechange (struct uae_prefs *prefs) config_changed = 1; } -static void set_kbr_default (struct uae_prefs *p, int index) -{ - int i, j, k, l; - struct uae_input_device_kbr_default *trans = keyboard_default; - struct uae_input_device *kbr; - struct inputdevice_functions *id = &idev[IDTYPE_KEYBOARD]; - uae_u32 scancode; - - if (!trans) - return; - for (j = 0; j < MAX_INPUT_DEVICES; j++) { - kbr = &p->keyboard_settings[index][j]; - for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { - memset (kbr, 0, sizeof (struct uae_input_device)); - kbr->extra[i][0] = -1; - } - if (j < id->get_num ()) { - if (input_get_default_keyboard (j)) - kbr->enabled = 1; - for (i = 0; i < id->get_widget_num (j); i++) { - id->get_widget_type (j, i, 0, &scancode); - kbr->extra[i][0] = scancode; - l = 0; - while (trans[l].scancode >= 0) { - if (kbr->extra[i][0] == trans[l].scancode) { - for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) { - if (kbr->eventid[i][k] == 0) - break; - } - if (k == MAX_INPUT_SUB_EVENT) { - write_log (L"corrupt default keyboard mappings\n"); - return; - } - kbr->eventid[i][k] = trans[l].event; - if (trans[l].event == INPUTEVENT_KEY_CAPS_LOCK) - kbr->flags[i][k] |= ID_FLAG_TOGGLE; - break; - } - l++; - } - } - } - } -} - +// set default prefs to all input configuration settings void inputdevice_default_prefs (struct uae_prefs *p) { int i, j; inputdevice_init (); + p->input_selected_setting = GAMEPORT_INPUT_SETTINGS; p->input_joymouse_multiplier = 20; p->input_joymouse_deadzone = 33; p->input_joystick_deadzone = 33; @@ -3735,24 +4174,33 @@ void inputdevice_default_prefs (struct uae_prefs *p) p->input_analog_joystick_mult = 15; p->input_analog_joystick_offset = -1; p->input_mouse_speed = 100; - p->input_autofire_framecnt = 10; - for (i = 0; i <= MAX_INPUT_SETTINGS; i++) { - set_kbr_default (p, i); - for (j = 0; j < MAX_INPUT_DEVICES; j++) { - if (input_get_default_mouse (p->mouse_settings[i], j, j & 1)) - p->mouse_settings[i]->enabled = 1; - if (input_get_default_joystick (p->joystick_settings[i], j, j & 1, 0)) - p->joystick_settings[i]->enabled = 1; + p->input_autofire_linecnt = 600; + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { + if (i != GAMEPORT_INPUT_SETTINGS) { + set_kbr_default (p, i); + for (j = 0; j < MAX_INPUT_DEVICES; j++) { + if (input_get_default_mouse (p->mouse_settings[i], j, j & 1)) + p->mouse_settings[i]->enabled = 1; + if (input_get_default_joystick (p->joystick_settings[i], j, j & 1, 0)) + p->joystick_settings[i]->enabled = 1; + } + } else { + if (p->jports[0].id != -2 || p->jports[0].id != -2) { + reset_inputdevice_slot (p, i); + } + set_kbr_default (p, i); } } } +// set default keyboard and keyboard>joystick layouts void inputdevice_setkeytranslation (struct uae_input_device_kbr_default *trans, int **kbmaps) { keyboard_default = trans; keyboard_default_kbmaps = kbmaps; } +// return true if keyboard/scancode pair is mapped int inputdevice_iskeymapped (int keyboard, int scancode) { struct uae_input_device *na = &keyboards[keyboard]; @@ -3794,7 +4242,7 @@ static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int state if (!keyboards || scancode < 0) return handled; j = 0; - while (na->extra[j][0] >= 0) { + while (j < MAX_INPUT_DEVICE_EVENTS && na->extra[j][0] >= 0) { if (na->extra[j][0] == scancode) { for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {/* send key release events in reverse order */ int autofire = (na->flags[j][sublevdir[state == 0 ? 1 : 0][k]] & ID_FLAG_AUTOFIRE) ? 1 : 0; @@ -3862,6 +4310,7 @@ static void sendmmcodes(int code, int newstate) record_key(((b << 1) | (b >> 7)) & 0xff); } +// main keyboard press/release entry point int inputdevice_translatekeycode (int keyboard, int scancode, int state) { if (inputdevice_translatekeycode_2 (keyboard, scancode, state)) @@ -3909,8 +4358,8 @@ static int get_event_data (const struct inputdevice_functions *id, int devnum, i const struct uae_input_device *uid = get_uid (id, devnum); int type = id->get_widget_type (devnum, num, 0, 0); int i; - if (type == IDEV_WIDGET_BUTTON) { - i = num - id->get_widget_first (devnum, type) + ID_BUTTON_OFFSET; + if (type == IDEV_WIDGET_BUTTON || type == IDEV_WIDGET_BUTTONAXIS) { + i = num - id->get_widget_first (devnum, IDEV_WIDGET_BUTTON) + ID_BUTTON_OFFSET; *eventid = uid->eventid[i][sub]; *flags = uid->flags[i][sub]; *custom = uid->custom[i][sub]; @@ -3936,8 +4385,8 @@ static int put_event_data (const struct inputdevice_functions *id, int devnum, i struct uae_input_device *uid = get_uid (id, devnum); int type = id->get_widget_type (devnum, num, 0, 0); int i; - if (type == IDEV_WIDGET_BUTTON) { - i = num - id->get_widget_first (devnum, type) + ID_BUTTON_OFFSET; + if (type == IDEV_WIDGET_BUTTON || type == IDEV_WIDGET_BUTTONAXIS) { + i = num - id->get_widget_first (devnum, IDEV_WIDGET_BUTTON) + ID_BUTTON_OFFSET; uid->eventid[i][sub] = eventid; uid->flags[i][sub] = flags; xfree (uid->custom[i][sub]); @@ -3978,6 +4427,7 @@ static int is_event_used (const struct inputdevice_functions *id, int devnum, in return 0; } +// device based index from global device index int inputdevice_get_device_index (int devnum) { if (devnum < idev[IDTYPE_JOYSTICK].get_num()) @@ -3990,6 +4440,17 @@ int inputdevice_get_device_index (int devnum) return -1; } +static int getdevnum (int type, int devnum) +{ + if (type == IDTYPE_JOYSTICK) + return devnum; + if (type == IDTYPE_MOUSE) + return idev[IDTYPE_JOYSTICK].get_num() + devnum; + if (type == IDTYPE_KEYBOARD) + return idev[IDTYPE_JOYSTICK].get_num() + idev[IDTYPE_MOUSE].get_num() + devnum; + return -1; +} + static int gettype (int devnum) { if (devnum < idev[IDTYPE_JOYSTICK].get_num()) @@ -4010,6 +4471,11 @@ static struct inputdevice_functions *getidf (int devnum) return &idev[type]; } +struct inputevent *inputdevice_get_eventinfo (int evt) +{ + return &events[evt]; +} + /* returns number of devices of type "type" */ int inputdevice_get_device_total (int type) @@ -4021,6 +4487,11 @@ TCHAR *inputdevice_get_device_name (int type, int devnum) { return idev[type].get_friendlyname (devnum); } +/* returns the name of device */ +TCHAR *inputdevice_get_device_name2 (int devnum) +{ + return getidf (devnum)->get_friendlyname (inputdevice_get_device_index (devnum)); +} /* returns machine readable name of device */ TCHAR *inputdevice_get_device_unique_name (int type, int devnum) { @@ -4030,6 +4501,8 @@ TCHAR *inputdevice_get_device_unique_name (int type, int devnum) int inputdevice_get_device_status (int devnum) { const struct inputdevice_functions *idf = getidf (devnum); + if (idf == NULL) + return -1; struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum)); return uid->enabled; } @@ -4038,7 +4511,16 @@ int inputdevice_get_device_status (int devnum) void inputdevice_set_device_status (int devnum, int enabled) { const struct inputdevice_functions *idf = getidf (devnum); - struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum)); + int num = inputdevice_get_device_index (devnum); + struct uae_input_device *uid = get_uid (idf, num); + if (enabled) { // disable incompatible devices ("super device" vs "raw device") + for (int i = 0; i < idf->get_num (); i++) { + if (idf->get_flags (i) != idf->get_flags (num)) { + struct uae_input_device *uid2 = get_uid (idf, i); + uid2->enabled = 0; + } + } + } uid->enabled = enabled; } @@ -4049,7 +4531,8 @@ int inputdevice_get_widget_num (int devnum) return idf->get_widget_num (inputdevice_get_device_index (devnum)); } -static void get_ename (const struct inputevent *ie, TCHAR *out) +// return name of event, do not use ie->name directly +void inputdevice_get_eventname (const struct inputevent *ie, TCHAR *out) { if (!out) return; @@ -4077,8 +4560,8 @@ int inputdevice_iterate (int devnum, int num, TCHAR *name, int *af) return 0; } mask = 0; - type = idf->get_widget_type (devindex, num, 0, 0); - if (type == IDEV_WIDGET_BUTTON) { + type = idf->get_widget_type (devindex, num, NULL, NULL); + if (type == IDEV_WIDGET_BUTTON || type == IDEV_WIDGET_BUTTONAXIS) { if (idf == &idev[IDTYPE_JOYSTICK]) { mask |= AM_JOY_BUT; } else { @@ -4110,12 +4593,13 @@ int inputdevice_iterate (int devnum, int num, TCHAR *name, int *af) if (!(ie->allow_mask & mask)) continue; get_event_data (idf, devindex, num, &data, &custom, &flags, 0); - get_ename (ie, name); + inputdevice_get_eventname (ie, name); *af = (flags & ID_FLAG_AUTOFIRE) ? 1 : 0; return 1; } } +// return mapped event from devnum/num/sub int inputdevice_get_mapped_name (int devnum, int num, int *pflags, TCHAR *name, TCHAR *custom, int sub) { const struct inputdevice_functions *idf = getidf (devnum); @@ -4146,10 +4630,11 @@ int inputdevice_get_mapped_name (int devnum, int num, int *pflags, TCHAR *name, flags |= IDEV_MAPPED_AUTOFIRE_POSSIBLE; if (pflags) *pflags = flags; - get_ename (&events[data], name); + inputdevice_get_eventname (&events[data], name); return data; } +// set event name/custom/flags to devnum/num/sub int inputdevice_set_mapping (int devnum, int num, TCHAR *name, TCHAR *custom, int flags, int sub) { const struct inputdevice_functions *idf = getidf (devnum); @@ -4164,7 +4649,7 @@ int inputdevice_set_mapping (int devnum, int num, TCHAR *name, TCHAR *custom, in if (name) { eid = 1; while (events[eid].name) { - get_ename (&events[eid], ename); + inputdevice_get_eventname (&events[eid], ename); if (!_tcscmp(ename, name)) break; eid++; } @@ -4210,6 +4695,7 @@ int inputdevice_config_change_test (void) return v; } +// copy configuration #src to configuration #dst void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst) { int i, j; @@ -4220,11 +4706,13 @@ void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst) dst->input_joystick_deadzone = src->input_joystick_deadzone; dst->input_joymouse_speed = src->input_joymouse_speed; dst->input_mouse_speed = src->input_mouse_speed; - dst->input_autofire_framecnt = src->input_autofire_framecnt; + dst->input_autofire_linecnt = src->input_autofire_linecnt; copyjport (src, dst, 0); copyjport (src, dst, 1); + copyjport (src, dst, 2); + copyjport (src, dst, 3); - for (i = 0; i < MAX_INPUT_SETTINGS + 1; i++) { + for (i = 0; i < MAX_INPUT_SETTINGS; i++) { for (j = 0; j < MAX_INPUT_DEVICES; j++) { memcpy (&dst->joystick_settings[i][j], &src->joystick_settings[i][j], sizeof (struct uae_input_device)); memcpy (&dst->mouse_settings[i][j], &src->mouse_settings[i][j], sizeof (struct uae_input_device)); @@ -4235,6 +4723,63 @@ void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst) inputdevice_updateconfig (dst); } +static void swapjoydevice (struct uae_input_device *uid, int **swaps) +{ + for (int i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) { + for (int j = 0; j < MAX_INPUT_SUB_EVENT; j++) { + bool found = false; + for (int k = 0; k < 2 && !found; k++) { + int evtnum; + for (int kk = 0; (evtnum = swaps[k][kk]) >= 0 && !found; kk++) { + if (uid->eventid[i][j] == evtnum) { + uid->eventid[i][j] = swaps[1 - k][kk]; + found = true; + } else { +#if 1 + for (int jj = 0; axistable[jj] >= 0; jj += 3) { + if (evtnum == axistable[jj] || evtnum == axistable[jj + 1] || evtnum == axistable[jj + 2]) { + for (int ii = 0; ii < 3; ii++) { + if (uid->eventid[i][j] == axistable[jj + ii]) { + int evtnum2 = swaps[1 - k][kk]; + for (int m = 0; axistable[m] >= 0; m += 3) { + if (evtnum2 == axistable[m] || evtnum2 == axistable[m + 1] || evtnum2 == axistable[m + 2]) { + uid->eventid[i][j] = axistable[m + ii]; + found = true; + } + } + } + } + } + } +#endif + } + } + } + } + } +} + +// swap gameports ports, remember to handle customized ports too +void inputdevice_swap_compa_ports (struct uae_prefs *prefs, int portswap) +{ + struct jport tmp; + if ((prefs->jports[portswap].id == JPORT_CUSTOM || prefs->jports[portswap + 1].id == JPORT_CUSTOM)) { + int *swaps[2]; + swaps[0] = rem_ports[portswap]; + swaps[1] = rem_ports[portswap + 1]; + for (int l = 0; l < MAX_INPUT_DEVICES; l++) { + swapjoydevice (&prefs->joystick_settings[GAMEPORT_INPUT_SETTINGS][l], swaps); + swapjoydevice (&prefs->mouse_settings[GAMEPORT_INPUT_SETTINGS][l], swaps); + swapjoydevice (&prefs->keyboard_settings[GAMEPORT_INPUT_SETTINGS][l], swaps); + } + } + memcpy (&tmp, &prefs->jports[portswap], sizeof (struct jport)); + memcpy (&prefs->jports[portswap], &prefs->jports[portswap + 1], sizeof (struct jport)); + memcpy (&prefs->jports[portswap + 1], &tmp, sizeof (struct jport)); + inputdevice_updateconfig (prefs); +} + +// swap device "devnum" ports 0<>1 and 2<>3 void inputdevice_swap_ports (struct uae_prefs *p, int devnum) { const struct inputdevice_functions *idf = getidf (devnum); @@ -4264,6 +4809,7 @@ void inputdevice_swap_ports (struct uae_prefs *p, int devnum) } } +// copy whole configuration #x-slot to another void inputdevice_copy_single_config (struct uae_prefs *p, int src, int dst, int devnum) { if (src == dst) @@ -4282,16 +4828,16 @@ void inputdevice_acquire (int allmode) inputdevice_unacquire (); for (i = 0; i < MAX_INPUT_DEVICES; i++) { - if (use_joysticks[i] || (allmode && !idev[IDTYPE_JOYSTICK].get_flags (i))) + if ((use_joysticks[i] && allmode >= 0) || (allmode && !idev[IDTYPE_JOYSTICK].get_flags (i))) idev[IDTYPE_JOYSTICK].acquire (i, 0); } for (i = 0; i < MAX_INPUT_DEVICES; i++) { - if (use_mice[i] || (allmode && !idev[IDTYPE_MOUSE].get_flags (i))) - idev[IDTYPE_MOUSE].acquire (i, 0); + if ((use_mice[i] && allmode >= 0) || (allmode && !idev[IDTYPE_MOUSE].get_flags (i))) + idev[IDTYPE_MOUSE].acquire (i, allmode < 0); } for (i = 0; i < MAX_INPUT_DEVICES; i++) { - if (use_keyboards[i]) - idev[IDTYPE_KEYBOARD].acquire (i, 0); + if ((use_keyboards[i] && allmode >= 0) || (allmode < 0 && !idev[IDTYPE_KEYBOARD].get_flags (i))) + idev[IDTYPE_KEYBOARD].acquire (i, allmode < 0); } // if (!input_acquired) // write_log (L"input devices acquired (%s)\n", allmode ? "all" : "selected only"); @@ -4315,78 +4861,95 @@ void inputdevice_unacquire (void) void inputdevice_testrecord (int type, int num, int wtype, int wnum, int state) { - TCHAR tmp[2000]; - if (wnum < 0) { testmode = -1; return; } - tmp[0] = 0; - wnum += idev[type].get_widget_first (num, wtype); - idev[type].get_widget_type (num, wnum, tmp, NULL); - write_log (L"%s: %s %d\n", idev[type].get_friendlyname (num), tmp, state); + if (testmode_count >= TESTMODE_MAX) + return; + if (type == IDTYPE_KEYBOARD) { + if (wnum == 0x100) { + wnum = -1; + } else { + struct uae_input_device *na = &keyboards[num]; + int j = 0; + while (j < MAX_INPUT_DEVICE_EVENTS && na->extra[j][0] >= 0) { + if (na->extra[j][0] == wnum) { + wnum = j; + break; + } + j++; + } + if (j >= MAX_INPUT_DEVICE_EVENTS || na->extra[j][0] < 0) + type = -1; + } + } + // wait until previous event is released before accepting new ones + for (int i = 0; i < TESTMODE_MAX; i++) { + struct teststore *ts2 = &testmode_wait[i]; + if (ts2->testmode_num < 0) + continue; + if (ts2->testmode_num != num || ts2->testmode_type != type || ts2->testmode_wtype != wtype || ts2->testmode_wnum != wnum) + continue; + if (state) + continue; + ts2->testmode_num = -1; + } + if (!state) + return; + + //write_log (L"%d %d %d %d %d\n", type, num, wtype, wnum, state); + struct teststore *ts = &testmode_data[testmode_count]; + ts->testmode_type = type; + ts->testmode_num = num; + ts->testmode_wtype = wtype; + ts->testmode_wnum = wnum; + ts->testmode_state = state; + testmode_count++; } int inputdevice_istest (void) { return testmode; } +void inputdevice_settest (int set) +{ + testmode = set; + testmode_count = 0; + testmode_wait[0].testmode_num = -1; + testmode_wait[1].testmode_num = -1; +} -int inputdevice_testread (TCHAR *name) +int inputdevice_testread_count (void) { - testmode = 1; - idev[IDTYPE_KEYBOARD].read (); - idev[IDTYPE_JOYSTICK].read (); - idev[IDTYPE_MOUSE].read (); + inputdevice_read (); if (testmode != 1) { testmode = 0; - return 1; + return -1; } - testmode = 0; - return 0; + return testmode_count; } -static int ignoreoldinput (int joy) +int inputdevice_testread (int *devnum, int *wtype, int *state) { - if (!use_joysticks[joy]) - return 0; - if (currprefs.input_selected_setting == 0) { - if (jsem_isjoy (0, &currprefs) != joy && jsem_isjoy (1, &currprefs) != joy && - jsem_isjoy (2, &currprefs) != joy && jsem_isjoy (3, &currprefs) != joy) - return 1; + inputdevice_read (); + if (testmode != 1) { + testmode = 0; + return -1; + } + if (testmode_count > 0) { + testmode_count--; + struct teststore *ts = &testmode_data[testmode_count]; + *devnum = getdevnum (ts->testmode_type, ts->testmode_num); + *wtype = idev[ts->testmode_type].get_widget_first (ts->testmode_num, ts->testmode_wtype) + ts->testmode_wnum; + *state = ts->testmode_state; + if (ts->testmode_state) + memcpy (&testmode_wait[testmode_count], ts, sizeof (struct teststore)); + return 1; } return 0; } -void do_fake_joystick (int nr, int *fake) -{ - struct uae_input_device *id1; - struct uae_input_device2 *id2; - int state, i, axis; - - nr = compatibility_device[nr]; - id1 = &joysticks[nr]; - id2 = &joysticks2[nr]; - - axis = 0; - state = fake[1] ? -1 : (fake[2] ? 1 : 0); - for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) - handle_input_event (id1->eventid[ID_AXIS_OFFSET + axis][i], state, 1, - id1->flags[ID_AXIS_OFFSET + axis][i]); - id2->states[axis] = state; - - axis = 1; - state = fake[0] ? -1 : (fake[3] ? 1 : 0); - for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) - handle_input_event (id1->eventid[ID_AXIS_OFFSET + axis][i], state, 1, - id1->flags[ID_AXIS_OFFSET + axis][i]); - id2->states[axis] = state; - - setbuttonstateall (id1, id2, 0, fake[4] ? 1 : 0); - setbuttonstateall (id1, id2, 1, fake[5] ? 1 : 0); - setbuttonstateall (id1, id2, 2, fake[6] ? 1 : 0); -} - /* Call this function when host machine's joystick/joypad/etc button state changes * This function translates button events to Amiga joybutton/joyaxis/keyboard events */ @@ -4399,11 +4962,17 @@ void do_fake_joystick (int nr, int *fake) void setjoybuttonstate (int joy, int button, int state) { + if (testmode) { + inputdevice_testrecord (IDTYPE_JOYSTICK, joy, IDEV_WIDGET_BUTTON, button, state); + return; + } +#if 0 if (ignoreoldinput (joy)) { if (state) switchdevice (&joysticks[joy], button, 1); return; } +#endif setbuttonstateall (&joysticks[joy], &joysticks2[joy], button, state ? 1 : 0); } @@ -4413,8 +4982,10 @@ void setjoybuttonstateall (int joy, uae_u32 buttonbits, uae_u32 buttonmask) { int i; +#if 0 if (ignoreoldinput (joy)) return; +#endif for (i = 0; i < ID_BUTTON_TOTAL; i++) { if (buttonmask & (1 << i)) setbuttonstateall (&joysticks[joy], &joysticks2[joy], i, (buttonbits & (1 << i)) ? 1 : 0); @@ -4467,17 +5038,16 @@ void setjoystickstate (int joy, int axis, int state, int max) v2 = 0; if (v1 == v2) return; - if (!joysticks[joy].enabled || ignoreoldinput(joy)) { + if (!joysticks[joy].enabled) { if (v1) switchdevice (&joysticks[joy], axis * 2 + (v1 < 0 ? 0 : 1), 0); return; } for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) - handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], state, max, - id->flags[ID_AXIS_OFFSET + axis][i]); + handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], state, max, id->flags[ID_AXIS_OFFSET + axis][i]); id2->states[axis] = state; } -int getjoystickstate(int joy) +int getjoystickstate (int joy) { if (testmode) return 1; @@ -4494,6 +5064,8 @@ void setmousestate (int mouse, int axis, int data, int isabs) if (testmode) { inputdevice_testrecord (IDTYPE_MOUSE, mouse, IDEV_WIDGET_AXIS, axis, data); + // fake "release" event + inputdevice_testrecord (IDTYPE_MOUSE, mouse, IDEV_WIDGET_AXIS, axis, 0); return; } if (!mice[mouse].enabled) { @@ -4661,7 +5233,7 @@ int inputdevice_joyport_config (struct uae_prefs *p, TCHAR *value, int portnum, break; case 0: { - int start = -1, got = 0; + int start = JPORT_NONE, got = 0; TCHAR *pp = 0; if (_tcsncmp (value, L"kbd", 3) == 0) { start = JSEM_KBDLAYOUT; @@ -4677,6 +5249,9 @@ int inputdevice_joyport_config (struct uae_prefs *p, TCHAR *value, int portnum, got = 1; } else if (_tcscmp (value, L"none") == 0) { got = 2; + } else if (_tcscmp (value, L"custom") == 0) { + got = 2; + start = JPORT_CUSTOM; } if (got) { if (pp) { @@ -4704,25 +5279,29 @@ int inputdevice_joyport_config (struct uae_prefs *p, TCHAR *value, int portnum, return 0; } -int inputdevice_getjoyportdevice (int jport) +int inputdevice_getjoyportdevice (int port, int val) { int idx; - if (jport < 0) { + if (val == JPORT_CUSTOM) { + idx = inputdevice_get_device_total (IDTYPE_JOYSTICK) + JSEM_LASTKBD; + if (port < 2) + idx += inputdevice_get_device_total (IDTYPE_MOUSE); + } else if (val < 0) { idx = -1; - } else if (jport >= JSEM_MICE) { - idx = jport - JSEM_MICE; + } else if (val >= JSEM_MICE) { + idx = val - JSEM_MICE; if (idx >= inputdevice_get_device_total (IDTYPE_MOUSE)) idx = 0; else idx += inputdevice_get_device_total (IDTYPE_JOYSTICK); idx += JSEM_LASTKBD; - } else if (jport >= JSEM_JOYS) { - idx = jport - JSEM_JOYS; + } else if (val >= JSEM_JOYS) { + idx = val - JSEM_JOYS; if (idx >= inputdevice_get_device_total (IDTYPE_JOYSTICK)) idx = 0; idx += JSEM_LASTKBD; } else { - idx = jport - JSEM_KBDLAYOUT; + idx = val - JSEM_KBDLAYOUT; } return idx; } diff --git a/inputevents.def b/inputevents.def index 29d58baf..fae09f51 100644 --- a/inputevents.def +++ b/inputevents.def @@ -354,7 +354,7 @@ DEFEVENT(SPC_DISK_NEXT3,L"Next disk image in DF3:",AM_K,0,0,AKS_DISK_NEXT3) DEFEVENT(SPC_INPUT_CONFIG1,L"Select Input Configuration #1",AM_K,0,0,AKS_INPUT_CONFIG_1) DEFEVENT(SPC_INPUT_CONFIG2,L"Select Input Configuration #2",AM_K,0,0,AKS_INPUT_CONFIG_2) DEFEVENT(SPC_INPUT_CONFIG3,L"Select Input Configuration #3",AM_K,0,0,AKS_INPUT_CONFIG_3) -DEFEVENT(SPC_INPUT_CONFIG4,L"Select Input Configuration #4",AM_K,0,0,AKS_INPUT_CONFIG_4) +DEFEVENT(SPC_INPUT_CONFIG4,L"Select GamePorts Input Configuration",AM_K,0,0,AKS_INPUT_CONFIG_4) DEFEVENT(SPC_ARCADIA_DIAGNOSTICS,L"Arcadia diagnostics dip switch",AM_K,0,0,AKS_ARCADIADIAGNOSTICS) DEFEVENT(SPC_ARCADIA_PLAYER1,L"Arcadia player 1",AM_K,0,0,AKS_ARCADIAPLY1) diff --git a/jit/compemu.h b/jit/compemu.h index 74083f03..b15051de 100644 --- a/jit/compemu.h +++ b/jit/compemu.h @@ -518,9 +518,6 @@ extern void empty_optimizer(void); #define comp_get_iword(o) do_get_mem_word((uae_u16 *)(comp_pc_p + (o))) #define comp_get_ilong(o) do_get_mem_long((uae_u32 *)(comp_pc_p + (o))) -/* Preferences handling */ -int check_prefs_changed_comp (void); - struct blockinfo_t; typedef struct dep_t { diff --git a/jit/compemu_raw_x86.cpp b/jit/compemu_raw_x86.cpp index 485b2b4f..007d08a8 100644 --- a/jit/compemu_raw_x86.cpp +++ b/jit/compemu_raw_x86.cpp @@ -1,9 +1,9 @@ /* This should eventually end up in machdep/, but for now, x86 is the - only target, and it's easier this way... */ +only target, and it's easier this way... */ /************************************************************************* - * Some basic information about the the target CPU * - *************************************************************************/ +* Some basic information about the the target CPU * +*************************************************************************/ #define EAX_INDEX 0 #define ECX_INDEX 1 @@ -73,11 +73,11 @@ uae_u8 can_word[]={0,1,2,3,5,6,7,0xff}; uae_u8 call_saved[]={0,0,0,0,1,0,0,0}; /* This *should* be the same as call_saved. But: - - We might not really know which registers are saved, and which aren't, - so we need to preserve some, but don't want to rely on everyone else - also saving those registers - - Special registers (such like the stack pointer) should not be "preserved" - by pushing, even though they are "saved" across function calls +- We might not really know which registers are saved, and which aren't, +so we need to preserve some, but don't want to rely on everyone else +also saving those registers +- Special registers (such like the stack pointer) should not be "preserved" +by pushing, even though they are "saved" across function calls */ uae_u8 need_to_preserve[]={1,1,1,1,0,1,1,1}; @@ -116,24 +116,24 @@ uae_u8 need_to_preserve[]={1,1,1,1,0,1,1,1}; #define CLOBBER_BSF clobber_flags() /************************************************************************* - * Actual encoding of the instructions on the target CPU * - *************************************************************************/ +* Actual encoding of the instructions on the target CPU * +*************************************************************************/ //#include "compemu_optimizer_x86.c" STATIC_INLINE uae_u16 swap16(uae_u16 x) { - return ((x&0xff00)>>8)|((x&0x00ff)<<8); + return ((x&0xff00)>>8)|((x&0x00ff)<<8); } STATIC_INLINE uae_u32 swap32(uae_u32 x) { - return ((x&0xff00)<<8)|((x&0x00ff)<<24)|((x&0xff0000)>>8)|((x&0xff000000)>>24); + return ((x&0xff00)<<8)|((x&0x00ff)<<24)|((x&0xff0000)>>8)|((x&0xff000000)>>24); } STATIC_INLINE int isbyte(uae_s32 x) { - return (x>=-128 && x<=127); + return (x>=-128 && x<=127); } LOWFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r)) @@ -142,13 +142,13 @@ LOWFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r)) } LENDFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r)) -LOWFUNC(NONE,READ,1,raw_pop_l_r,(R4 r)) + LOWFUNC(NONE,READ,1,raw_pop_l_r,(R4 r)) { emit_byte(0x58+r); } LENDFUNC(NONE,READ,1,raw_pop_l_r,(R4 r)) -LOWFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i)) { emit_byte(0x0f); emit_byte(0xba); @@ -157,7 +157,7 @@ LOWFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i)) } LENDFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b)) + LOWFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b)) { emit_byte(0x0f); emit_byte(0xa3); @@ -165,7 +165,7 @@ LOWFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b)) } LENDFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b)) -LOWFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i)) { emit_byte(0x0f); emit_byte(0xba); @@ -174,7 +174,7 @@ LOWFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i)) } LENDFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b)) + LOWFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b)) { emit_byte(0x0f); emit_byte(0xbb); @@ -183,7 +183,7 @@ LOWFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b)) LENDFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b)) -LOWFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i)) { emit_byte(0x0f); emit_byte(0xba); @@ -192,7 +192,7 @@ LOWFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i)) } LENDFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b)) + LOWFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b)) { emit_byte(0x0f); emit_byte(0xb3); @@ -200,7 +200,7 @@ LOWFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b)) } LENDFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b)) -LOWFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i)) { emit_byte(0x0f); emit_byte(0xba); @@ -209,7 +209,7 @@ LOWFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i)) } LENDFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b)) + LOWFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b)) { emit_byte(0x0f); emit_byte(0xab); @@ -217,1462 +217,1462 @@ LOWFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b)) } LENDFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b)) -LOWFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i)) { - emit_byte(0x66); - if (isbyte(i)) { - emit_byte(0x83); - emit_byte(0xe8+d); - emit_byte(i); - } - else { - emit_byte(0x81); - emit_byte(0xe8+d); - emit_word(i); - } + emit_byte(0x66); + if (isbyte(i)) { + emit_byte(0x83); + emit_byte(0xe8+d); + emit_byte(i); + } + else { + emit_byte(0x81); + emit_byte(0xe8+d); + emit_word(i); + } } LENDFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i)) -LOWFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s)) + LOWFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s)) { - emit_byte(0xc7); - emit_byte(0x05); - emit_long(d); - emit_long(s); + emit_byte(0xc7); + emit_byte(0x05); + emit_long(d); + emit_long(s); } LENDFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s)) -LOWFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s)) + LOWFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s)) { - emit_byte(0x66); - emit_byte(0xc7); - emit_byte(0x05); - emit_long(d); - emit_word(s); + emit_byte(0x66); + emit_byte(0xc7); + emit_byte(0x05); + emit_long(d); + emit_word(s); } LENDFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s)) -LOWFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s)) + LOWFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s)) { - emit_byte(0xc6); - emit_byte(0x05); - emit_long(d); - emit_byte(s); + emit_byte(0xc6); + emit_byte(0x05); + emit_long(d); + emit_byte(s); } LENDFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s)) -LOWFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i)) + LOWFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i)) { - emit_byte(0xc0); - emit_byte(0x05); - emit_long(d); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0x05); + emit_long(d); + emit_byte(i); } LENDFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i)) { - emit_byte(0xc0); - emit_byte(0xc0+r); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0xc0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xc0+r); - emit_byte(i); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xc0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i)) { - emit_byte(0xc1); - emit_byte(0xc0+r); - emit_byte(i); + emit_byte(0xc1); + emit_byte(0xc0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r)) { - emit_byte(0xd3); - emit_byte(0xc0+d); + emit_byte(0xd3); + emit_byte(0xc0+d); } LENDFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r)) { - emit_byte(0x66); - emit_byte(0xd3); - emit_byte(0xc0+d); + emit_byte(0x66); + emit_byte(0xd3); + emit_byte(0xc0+d); } LENDFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r)) { - emit_byte(0xd2); - emit_byte(0xc0+d); + emit_byte(0xd2); + emit_byte(0xc0+d); } LENDFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r)) { - emit_byte(0xd3); - emit_byte(0xe0+d); + emit_byte(0xd3); + emit_byte(0xe0+d); } LENDFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r)) { - emit_byte(0x66); - emit_byte(0xd3); - emit_byte(0xe0+d); + emit_byte(0x66); + emit_byte(0xd3); + emit_byte(0xe0+d); } LENDFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r)) { - emit_byte(0xd2); - emit_byte(0xe0+d); + emit_byte(0xd2); + emit_byte(0xe0+d); } LENDFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i)) { - emit_byte(0xc0); - emit_byte(0xc8+r); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0xc8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xc8+r); - emit_byte(i); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xc8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i)) { - emit_byte(0xc1); - emit_byte(0xc8+r); - emit_byte(i); + emit_byte(0xc1); + emit_byte(0xc8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r)) { - emit_byte(0xd3); - emit_byte(0xc8+d); + emit_byte(0xd3); + emit_byte(0xc8+d); } LENDFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r)) { - emit_byte(0x66); - emit_byte(0xd3); - emit_byte(0xc8+d); + emit_byte(0x66); + emit_byte(0xd3); + emit_byte(0xc8+d); } LENDFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r)) { - emit_byte(0xd2); - emit_byte(0xc8+d); + emit_byte(0xd2); + emit_byte(0xc8+d); } LENDFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r)) { - emit_byte(0xd3); - emit_byte(0xe8+d); + emit_byte(0xd3); + emit_byte(0xe8+d); } LENDFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r)) { - emit_byte(0x66); - emit_byte(0xd3); - emit_byte(0xe8+d); + emit_byte(0x66); + emit_byte(0xd3); + emit_byte(0xe8+d); } LENDFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r)) { - emit_byte(0xd2); - emit_byte(0xe8+d); + emit_byte(0xd2); + emit_byte(0xe8+d); } LENDFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r)) { - emit_byte(0xd3); - emit_byte(0xf8+d); + emit_byte(0xd3); + emit_byte(0xf8+d); } LENDFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r)) { - emit_byte(0x66); - emit_byte(0xd3); - emit_byte(0xf8+d); + emit_byte(0x66); + emit_byte(0xd3); + emit_byte(0xf8+d); } LENDFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r)) + LOWFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r)) { - emit_byte(0xd2); - emit_byte(0xf8+d); + emit_byte(0xd2); + emit_byte(0xf8+d); } LENDFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r)) -LOWFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i)) { - emit_byte(0xc1); - emit_byte(0xe0+r); - emit_byte(i); + emit_byte(0xc1); + emit_byte(0xe0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xe0+r); - emit_byte(i); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xe0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i)) { - emit_byte(0xc0); - emit_byte(0xe0+r); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0xe0+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i)) { - emit_byte(0xc1); - emit_byte(0xe8+r); - emit_byte(i); + emit_byte(0xc1); + emit_byte(0xe8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xe8+r); - emit_byte(i); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xe8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i)) { - emit_byte(0xc0); - emit_byte(0xe8+r); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0xe8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i)) { - emit_byte(0xc1); - emit_byte(0xf8+r); - emit_byte(i); + emit_byte(0xc1); + emit_byte(0xf8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xf8+r); - emit_byte(i); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xf8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i)) { - emit_byte(0xc0); - emit_byte(0xf8+r); - emit_byte(i); + emit_byte(0xc0); + emit_byte(0xf8+r); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i)) -LOWFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah)) + LOWFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah)) { - emit_byte(0x9e); + emit_byte(0x9e); } LENDFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah)) -LOWFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax)) + LOWFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax)) { - emit_byte(0x0f); - emit_byte(0xa2); + emit_byte(0x0f); + emit_byte(0xa2); } LENDFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax)) -LOWFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah)) + LOWFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah)) { - emit_byte(0x9f); + emit_byte(0x9f); } LENDFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah)) -LOWFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc)) + LOWFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc)) { - emit_byte(0x0f); - emit_byte(0x90+cc); - emit_byte(0xc0+d); + emit_byte(0x0f); + emit_byte(0x90+cc); + emit_byte(0xc0+d); } LENDFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc)) -LOWFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc)) + LOWFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc)) { - emit_byte(0x0f); - emit_byte(0x90+cc); - emit_byte(0x05); - emit_long(d); + emit_byte(0x0f); + emit_byte(0x90+cc); + emit_byte(0x05); + emit_long(d); } LENDFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc)) -LOWFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc)) + LOWFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc)) { /* replacement using branch and mov */ int uncc=(cc^1); emit_byte(0x70+uncc); emit_byte(3); /* skip next 2 bytes if not cc=true */ - emit_byte(0x88); - emit_byte(0xc0+8*s+d); + emit_byte(0x88); + emit_byte(0xc0+8*s+d); } LENDFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc)) -LOWFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc)) + LOWFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc)) { - if (have_cmov) { - emit_byte(0x66); - emit_byte(0x0f); - emit_byte(0x40+cc); - emit_byte(0xc0+8*d+s); - } - else { /* replacement using branch and mov */ - int uncc=(cc^1); - emit_byte(0x70+uncc); - emit_byte(3); /* skip next 3 bytes if not cc=true */ - emit_byte(0x66); - emit_byte(0x89); - emit_byte(0xc0+8*s+d); - } + if (have_cmov) { + emit_byte(0x66); + emit_byte(0x0f); + emit_byte(0x40+cc); + emit_byte(0xc0+8*d+s); + } + else { /* replacement using branch and mov */ + int uncc=(cc^1); + emit_byte(0x70+uncc); + emit_byte(3); /* skip next 3 bytes if not cc=true */ + emit_byte(0x66); + emit_byte(0x89); + emit_byte(0xc0+8*s+d); + } } LENDFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc)) -LOWFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc)) + LOWFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc)) { - if (have_cmov) { - emit_byte(0x0f); - emit_byte(0x40+cc); - emit_byte(0xc0+8*d+s); - } - else { /* replacement using branch and mov */ - int uncc=(cc^1); - emit_byte(0x70+uncc); - emit_byte(2); /* skip next 2 bytes if not cc=true */ - emit_byte(0x89); - emit_byte(0xc0+8*s+d); - } + if (have_cmov) { + emit_byte(0x0f); + emit_byte(0x40+cc); + emit_byte(0xc0+8*d+s); + } + else { /* replacement using branch and mov */ + int uncc=(cc^1); + emit_byte(0x70+uncc); + emit_byte(2); /* skip next 2 bytes if not cc=true */ + emit_byte(0x89); + emit_byte(0xc0+8*s+d); + } } LENDFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc)) -LOWFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s)) { - emit_byte(0x0f); - emit_byte(0xbc); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xbc); + emit_byte(0xc0+8*d+s); } LENDFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s)) -LOWFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s)) + LOWFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s)) { - emit_byte(0x0f); - emit_byte(0xbf); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xbf); + emit_byte(0xc0+8*d+s); } LENDFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s)) -LOWFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s)) + LOWFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s)) { - emit_byte(0x0f); - emit_byte(0xbe); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xbe); + emit_byte(0xc0+8*d+s); } LENDFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s)) -LOWFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s)) + LOWFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s)) { - emit_byte(0x0f); - emit_byte(0xb7); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xb7); + emit_byte(0xc0+8*d+s); } LENDFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s)) -LOWFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s)) + LOWFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s)) { - emit_byte(0x0f); - emit_byte(0xb6); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xb6); + emit_byte(0xc0+8*d+s); } LENDFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s)) -LOWFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s)) + LOWFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s)) { - emit_byte(0x0f); - emit_byte(0xaf); - emit_byte(0xc0+8*d+s); + emit_byte(0x0f); + emit_byte(0xaf); + emit_byte(0xc0+8*d+s); } LENDFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s)) -LOWFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s)) + LOWFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s)) { #ifdef JIT_DEBUG - if (d!=MUL_NREG1 || s!=MUL_NREG2) { - write_log (L"JIT: Bad register in IMUL: d=%d, s=%d\n",d,s); - abort(); - } + if (d!=MUL_NREG1 || s!=MUL_NREG2) { + write_log (L"JIT: Bad register in IMUL: d=%d, s=%d\n",d,s); + abort(); + } #endif - emit_byte(0xf7); - emit_byte(0xea); + emit_byte(0xf7); + emit_byte(0xea); } LENDFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s)) -LOWFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s)) + LOWFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s)) { #ifdef JIT_DEBUG - if (d!=MUL_NREG1 || s!=MUL_NREG2) { - write_log (L"JIT: Bad register in MUL: d=%d, s=%d\n",d,s); - abort(); - } + if (d!=MUL_NREG1 || s!=MUL_NREG2) { + write_log (L"JIT: Bad register in MUL: d=%d, s=%d\n",d,s); + abort(); + } #endif - emit_byte(0xf7); - emit_byte(0xe2); + emit_byte(0xf7); + emit_byte(0xe2); } LENDFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s)) -LOWFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s)) + LOWFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s)) { - emit_byte(0x88); - emit_byte(0xc0+8*s+d); + emit_byte(0x88); + emit_byte(0xc0+8*s+d); } LENDFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s)) -LOWFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s)) + LOWFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x89); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x89); + emit_byte(0xc0+8*s+d); } LENDFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s)) -LOWFUNC(NONE,READ,3,raw_mov_l_rrm_indexed,(W4 d, R4 baser, R4 index)) + LOWFUNC(NONE,READ,3,raw_mov_l_rrm_indexed,(W4 d, R4 baser, R4 index)) { - emit_byte(0x8b); - if (baser==5) { - emit_byte(0x44+8*d); + emit_byte(0x8b); + if (baser==5) { + emit_byte(0x44+8*d); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*d); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*d); - emit_byte(8*index+baser); } LENDFUNC(NONE,READ,3,raw_mov_l_rrm_indexed,(W4 d, R4 baser, R4 index)) -LOWFUNC(NONE,READ,3,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index)) + LOWFUNC(NONE,READ,3,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index)) { - emit_byte(0x66); - emit_byte(0x8b); - if (baser==5) { - emit_byte(0x44+8*d); + emit_byte(0x66); + emit_byte(0x8b); + if (baser==5) { + emit_byte(0x44+8*d); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*d); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*d); - emit_byte(8*index+baser); } LENDFUNC(NONE,READ,3,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index)) -LOWFUNC(NONE,READ,3,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index)) + LOWFUNC(NONE,READ,3,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index)) { - emit_byte(0x8a); - if (baser==5) { - emit_byte(0x44+8*d); + emit_byte(0x8a); + if (baser==5) { + emit_byte(0x44+8*d); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*d); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*d); - emit_byte(8*index+baser); } LENDFUNC(NONE,READ,3,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index)) -LOWFUNC(NONE,WRITE,3,raw_mov_l_mrr_indexed,(R4 baser, R4 index, R4 s)) + LOWFUNC(NONE,WRITE,3,raw_mov_l_mrr_indexed,(R4 baser, R4 index, R4 s)) { - emit_byte(0x89); - if (baser==5) { - emit_byte(0x44+8*s); + emit_byte(0x89); + if (baser==5) { + emit_byte(0x44+8*s); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*s); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*s); - emit_byte(8*index+baser); } LENDFUNC(NONE,WRITE,3,raw_mov_l_mrr_indexed,(R4 baser, R4 index, R4 s)) -LOWFUNC(NONE,WRITE,3,raw_mov_w_mrr_indexed,(R4 baser, R4 index, R2 s)) + LOWFUNC(NONE,WRITE,3,raw_mov_w_mrr_indexed,(R4 baser, R4 index, R2 s)) { - emit_byte(0x66); - emit_byte(0x89); - if (baser==5) { - emit_byte(0x44+8*s); + emit_byte(0x66); + emit_byte(0x89); + if (baser==5) { + emit_byte(0x44+8*s); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*s); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*s); - emit_byte(8*index+baser); } LENDFUNC(NONE,WRITE,3,raw_mov_w_mrr_indexed,(R4 baser, R4 index, R2 s)) -LOWFUNC(NONE,WRITE,3,raw_mov_b_mrr_indexed,(R4 baser, R4 index, R1 s)) + LOWFUNC(NONE,WRITE,3,raw_mov_b_mrr_indexed,(R4 baser, R4 index, R1 s)) { - emit_byte(0x88); - if (baser==5) { - emit_byte(0x44+8*s); + emit_byte(0x88); + if (baser==5) { + emit_byte(0x44+8*s); + emit_byte(8*index+baser); + emit_byte(0); + return; + } + emit_byte(0x04+8*s); emit_byte(8*index+baser); - emit_byte(0); - return; - } - emit_byte(0x04+8*s); - emit_byte(8*index+baser); } LENDFUNC(NONE,WRITE,3,raw_mov_b_mrr_indexed,(R4 baser, R4 index, R1 s)) -LOWFUNC(NONE,READ,3,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index)) + LOWFUNC(NONE,READ,3,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index)) { - emit_byte(0x8b); - emit_byte(0x04+8*d); - emit_byte(0x85+8*index); - emit_long(base); + emit_byte(0x8b); + emit_byte(0x04+8*d); + emit_byte(0x85+8*index); + emit_long(base); } LENDFUNC(NONE,READ,3,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index)) -LOWFUNC(NONE,READ,4,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM cond)) + LOWFUNC(NONE,READ,4,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM cond)) { - if (have_cmov) { - emit_byte(0x0f); - emit_byte(0x40+cond); - } - else { /* replacement using branch and mov */ - int uncc=(cond^1); - emit_byte(0x70+uncc); - emit_byte(7); /* skip next 7 bytes if not cc=true */ - emit_byte(0x8b); - } - emit_byte(0x04+8*d); - emit_byte(0x85+8*index); - emit_long(base); + if (have_cmov) { + emit_byte(0x0f); + emit_byte(0x40+cond); + } + else { /* replacement using branch and mov */ + int uncc=(cond^1); + emit_byte(0x70+uncc); + emit_byte(7); /* skip next 7 bytes if not cc=true */ + emit_byte(0x8b); + } + emit_byte(0x04+8*d); + emit_byte(0x85+8*index); + emit_long(base); } LENDFUNC(NONE,READ,4,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM cond)) -LOWFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond)) + LOWFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond)) { - if (have_cmov) { - emit_byte(0x0f); - emit_byte(0x40+cond); - emit_byte(0x05+8*d); - emit_long(mem); - } - else { /* replacement using branch and mov */ - int uncc=(cond^1); - emit_byte(0x70+uncc); - emit_byte(6); /* skip next 6 bytes if not cc=true */ - emit_byte(0x8b); - emit_byte(0x05+8*d); - emit_long(mem); - } + if (have_cmov) { + emit_byte(0x0f); + emit_byte(0x40+cond); + emit_byte(0x05+8*d); + emit_long(mem); + } + else { /* replacement using branch and mov */ + int uncc=(cond^1); + emit_byte(0x70+uncc); + emit_byte(6); /* skip next 6 bytes if not cc=true */ + emit_byte(0x8b); + emit_byte(0x05+8*d); + emit_long(mem); + } } LENDFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond)) -LOWFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset)) { - emit_byte(0x8b); - emit_byte(0x40+8*d+s); - emit_byte(offset); + emit_byte(0x8b); + emit_byte(0x40+8*d+s); + emit_byte(offset); } LENDFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset)) -LOWFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset)) { - emit_byte(0x66); - emit_byte(0x8b); - emit_byte(0x40+8*d+s); - emit_byte(offset); + emit_byte(0x66); + emit_byte(0x8b); + emit_byte(0x40+8*d+s); + emit_byte(offset); } LENDFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset)) -LOWFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset)) { - emit_byte(0x8a); - emit_byte(0x40+8*d+s); - emit_byte(offset); + emit_byte(0x8a); + emit_byte(0x40+8*d+s); + emit_byte(offset); } LENDFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset)) -LOWFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset)) { - emit_byte(0x8b); - emit_byte(0x80+8*d+s); - emit_long(offset); + emit_byte(0x8b); + emit_byte(0x80+8*d+s); + emit_long(offset); } LENDFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset)) -LOWFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset)) { - emit_byte(0x66); - emit_byte(0x8b); - emit_byte(0x80+8*d+s); - emit_long(offset); + emit_byte(0x66); + emit_byte(0x8b); + emit_byte(0x80+8*d+s); + emit_long(offset); } LENDFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset)) -LOWFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset)) + LOWFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset)) { - emit_byte(0x8a); - emit_byte(0x80+8*d+s); - emit_long(offset); + emit_byte(0x8a); + emit_byte(0x80+8*d+s); + emit_long(offset); } LENDFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset)) { - emit_byte(0xc7); - emit_byte(0x40+d); - emit_byte(offset); - emit_long(i); + emit_byte(0xc7); + emit_byte(0x40+d); + emit_byte(offset); + emit_long(i); } LENDFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset)) { - emit_byte(0x66); - emit_byte(0xc7); - emit_byte(0x40+d); - emit_byte(offset); - emit_word(i); + emit_byte(0x66); + emit_byte(0xc7); + emit_byte(0x40+d); + emit_byte(offset); + emit_word(i); } LENDFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset)) { - emit_byte(0xc6); - emit_byte(0x40+d); - emit_byte(offset); - emit_byte(i); + emit_byte(0xc6); + emit_byte(0x40+d); + emit_byte(offset); + emit_byte(i); } LENDFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset)) { - emit_byte(0x89); - emit_byte(0x40+8*s+d); - emit_byte(offset); + emit_byte(0x89); + emit_byte(0x40+8*s+d); + emit_byte(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset)) { - emit_byte(0x66); - emit_byte(0x89); - emit_byte(0x40+8*s+d); - emit_byte(offset); + emit_byte(0x66); + emit_byte(0x89); + emit_byte(0x40+8*s+d); + emit_byte(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset)) { - emit_byte(0x88); - emit_byte(0x40+8*s+d); - emit_byte(offset); + emit_byte(0x88); + emit_byte(0x40+8*s+d); + emit_byte(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset)) -LOWFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset)) + LOWFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset)) { - emit_byte(0x8d); - emit_byte(0x80+8*d+s); - emit_long(offset); + emit_byte(0x8d); + emit_byte(0x80+8*d+s); + emit_long(offset); } LENDFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset)) -LOWFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset)) + LOWFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset)) { - emit_byte(0x8d); - if (!offset) { - if (s!=5) { - emit_byte(0x04+8*d); - emit_byte(0x40*factor+8*index+s); - return; + emit_byte(0x8d); + if (!offset) { + if (s!=5) { + emit_byte(0x04+8*d); + emit_byte(0x40*factor+8*index+s); + return; + } + emit_byte(0x44+8*d); + emit_byte(0x40*factor+8*index+s); + emit_byte(0); + return; } - emit_byte(0x44+8*d); + emit_byte(0x84+8*d); emit_byte(0x40*factor+8*index+s); - emit_byte(0); - return; - } - emit_byte(0x84+8*d); - emit_byte(0x40*factor+8*index+s); - emit_long(offset); + emit_long(offset); } LENDFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset)) -LOWFUNC(NONE,NONE,3,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index)) + LOWFUNC(NONE,NONE,3,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index)) { - emit_byte(0x8d); - if (s==5) { - emit_byte(0x44+8*d); + emit_byte(0x8d); + if (s==5) { + emit_byte(0x44+8*d); + emit_byte(8*index+s); + emit_byte(0); + return; + } + emit_byte(0x04+8*d); emit_byte(8*index+s); - emit_byte(0); - return; - } - emit_byte(0x04+8*d); - emit_byte(8*index+s); } LENDFUNC(NONE,NONE,3,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index)) -LOWFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset)) { - emit_byte(0x89); - emit_byte(0x80+8*s+d); - emit_long(offset); + emit_byte(0x89); + emit_byte(0x80+8*s+d); + emit_long(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset)) { - emit_byte(0x66); - emit_byte(0x89); - emit_byte(0x80+8*s+d); - emit_long(offset); + emit_byte(0x66); + emit_byte(0x89); + emit_byte(0x80+8*s+d); + emit_long(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset)) -LOWFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset)) + LOWFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset)) { - emit_byte(0x88); - emit_byte(0x80+8*s+d); - emit_long(offset); + emit_byte(0x88); + emit_byte(0x80+8*s+d); + emit_long(offset); } LENDFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset)) -LOWFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r)) + LOWFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r)) { - emit_byte(0x0f); - emit_byte(0xc8+r); + emit_byte(0x0f); + emit_byte(0xc8+r); } LENDFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r)) -LOWFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r)) + LOWFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r)) { - emit_byte(0x66); - emit_byte(0xc1); - emit_byte(0xc0+r); - emit_byte(0x08); + emit_byte(0x66); + emit_byte(0xc1); + emit_byte(0xc0+r); + emit_byte(0x08); } LENDFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r)) -LOWFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s)) + LOWFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s)) { - emit_byte(0x89); - emit_byte(0xc0+8*s+d); + emit_byte(0x89); + emit_byte(0xc0+8*s+d); } LENDFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s)) -LOWFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s)) + LOWFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s)) { - emit_byte(0x89); - emit_byte(0x05+8*s); - emit_long(d); + emit_byte(0x89); + emit_byte(0x05+8*s); + emit_long(d); } LENDFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s)) -LOWFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s)) + LOWFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s)) { - emit_byte(0x8b); - emit_byte(0x05+8*d); - emit_long(s); + emit_byte(0x8b); + emit_byte(0x05+8*d); + emit_long(s); } LENDFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s)) -LOWFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s)) + LOWFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s)) { - emit_byte(0x66); - emit_byte(0x89); - emit_byte(0x05+8*s); - emit_long(d); + emit_byte(0x66); + emit_byte(0x89); + emit_byte(0x05+8*s); + emit_long(d); } LENDFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s)) -LOWFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s)) + LOWFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s)) { - emit_byte(0x66); - emit_byte(0x8b); - emit_byte(0x05+8*d); - emit_long(s); + emit_byte(0x66); + emit_byte(0x8b); + emit_byte(0x05+8*d); + emit_long(s); } LENDFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s)) -LOWFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s)) + LOWFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s)) { - emit_byte(0x88); - emit_byte(0x05+8*s); - emit_long(d); + emit_byte(0x88); + emit_byte(0x05+8*s); + emit_long(d); } LENDFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s)) -LOWFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s)) + LOWFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s)) { - emit_byte(0x8a); - emit_byte(0x05+8*d); - emit_long(s); + emit_byte(0x8a); + emit_byte(0x05+8*d); + emit_long(s); } LENDFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s)) -LOWFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s)) + LOWFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s)) { - emit_byte(0xb8+d); - emit_long(s); + emit_byte(0xb8+d); + emit_long(s); } LENDFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s)) -LOWFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s)) + LOWFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s)) { - emit_byte(0x66); - emit_byte(0xb8+d); - emit_word(s); + emit_byte(0x66); + emit_byte(0xb8+d); + emit_word(s); } LENDFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s)) -LOWFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s)) + LOWFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s)) { - emit_byte(0xb0+d); - emit_byte(s); + emit_byte(0xb0+d); + emit_byte(s); } LENDFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s)) -LOWFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s)) + LOWFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s)) { - emit_byte(0x81); - emit_byte(0x15); - emit_long(d); - emit_long(s); + emit_byte(0x81); + emit_byte(0x15); + emit_long(d); + emit_long(s); } LENDFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s)) -LOWFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s)) + LOWFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s)) { - emit_byte(0x81); - emit_byte(0x05); - emit_long(d); - emit_long(s); + emit_byte(0x81); + emit_byte(0x05); + emit_long(d); + emit_long(s); } LENDFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s)) -LOWFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s)) + LOWFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s)) { - emit_byte(0x66); - emit_byte(0x81); - emit_byte(0x05); - emit_long(d); - emit_word(s); + emit_byte(0x66); + emit_byte(0x81); + emit_byte(0x05); + emit_long(d); + emit_word(s); } LENDFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s)) -LOWFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s)) + LOWFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s)) { - emit_byte(0x80); - emit_byte(0x05); - emit_long(d); - emit_byte(s); + emit_byte(0x80); + emit_byte(0x05); + emit_long(d); + emit_byte(s); } LENDFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s)) -LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i)) { - emit_byte(0xf7); - emit_byte(0xc0+d); - emit_long(i); + emit_byte(0xf7); + emit_byte(0xc0+d); + emit_long(i); } LENDFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s)) { - emit_byte(0x85); - emit_byte(0xc0+8*s+d); + emit_byte(0x85); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x85); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x85); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s)) { - emit_byte(0x84); - emit_byte(0xc0+8*s+d); + emit_byte(0x84); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i)) { - emit_byte(0x81); - emit_byte(0xe0+d); - emit_long(i); + emit_byte(0x81); + emit_byte(0xe0+d); + emit_long(i); } LENDFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i)) { - emit_byte(0x66); - emit_byte(0x81); - emit_byte(0xe0+d); - emit_word(i); + emit_byte(0x66); + emit_byte(0x81); + emit_byte(0xe0+d); + emit_word(i); } LENDFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s)) { - emit_byte(0x21); - emit_byte(0xc0+8*s+d); + emit_byte(0x21); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x21); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x21); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s)) { - emit_byte(0x20); - emit_byte(0xc0+8*s+d); + emit_byte(0x20); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i)) { - emit_byte(0x81); - emit_byte(0xc8+d); - emit_long(i); + emit_byte(0x81); + emit_byte(0xc8+d); + emit_long(i); } LENDFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s)) { - emit_byte(0x09); - emit_byte(0xc0+8*s+d); + emit_byte(0x09); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x09); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x09); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s)) { - emit_byte(0x08); - emit_byte(0xc0+8*s+d); + emit_byte(0x08); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s)) -LOWFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s)) + LOWFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s)) { - emit_byte(0x11); - emit_byte(0xc0+8*s+d); + emit_byte(0x11); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s)) -LOWFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s)) + LOWFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x11); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x11); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s)) -LOWFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s)) + LOWFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s)) { - emit_byte(0x10); - emit_byte(0xc0+8*s+d); + emit_byte(0x10); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s)) { - emit_byte(0x01); - emit_byte(0xc0+8*s+d); + emit_byte(0x01); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x01); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x01); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s)) { - emit_byte(0x00); - emit_byte(0xc0+8*s+d); + emit_byte(0x00); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i)) { - if (isbyte(i)) { - emit_byte(0x83); - emit_byte(0xe8+d); - emit_byte(i); - } - else { - emit_byte(0x81); - emit_byte(0xe8+d); - emit_long(i); - } + if (isbyte(i)) { + emit_byte(0x83); + emit_byte(0xe8+d); + emit_byte(i); + } + else { + emit_byte(0x81); + emit_byte(0xe8+d); + emit_long(i); + } } LENDFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i)) { - emit_byte(0x80); - emit_byte(0xe8+d); - emit_byte(i); + emit_byte(0x80); + emit_byte(0xe8+d); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i)) { - if (isbyte(i)) { - emit_byte(0x83); - emit_byte(0xc0+d); - emit_byte(i); - } - else { - emit_byte(0x81); - emit_byte(0xc0+d); - emit_long(i); - } + if (isbyte(i)) { + emit_byte(0x83); + emit_byte(0xc0+d); + emit_byte(i); + } + else { + emit_byte(0x81); + emit_byte(0xc0+d); + emit_long(i); + } } LENDFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i)) { - if (isbyte(i)) { - emit_byte(0x66); - emit_byte(0x83); - emit_byte(0xc0+d); - emit_byte(i); - } - else { - emit_byte(0x66); - emit_byte(0x81); - emit_byte(0xc0+d); - emit_word(i); - } + if (isbyte(i)) { + emit_byte(0x66); + emit_byte(0x83); + emit_byte(0xc0+d); + emit_byte(i); + } + else { + emit_byte(0x66); + emit_byte(0x81); + emit_byte(0xc0+d); + emit_word(i); + } } LENDFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i)) { - emit_byte(0x80); - emit_byte(0xc0+d); - emit_byte(i); + emit_byte(0x80); + emit_byte(0xc0+d); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i)) -LOWFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s)) + LOWFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s)) { - emit_byte(0x19); - emit_byte(0xc0+8*s+d); + emit_byte(0x19); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s)) -LOWFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s)) + LOWFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x19); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x19); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s)) -LOWFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s)) + LOWFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s)) { - emit_byte(0x18); - emit_byte(0xc0+8*s+d); + emit_byte(0x18); + emit_byte(0xc0+8*s+d); } LENDFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s)) { - emit_byte(0x29); - emit_byte(0xc0+8*s+d); + emit_byte(0x29); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x29); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x29); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s)) { - emit_byte(0x28); - emit_byte(0xc0+8*s+d); + emit_byte(0x28); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s)) { - emit_byte(0x39); - emit_byte(0xc0+8*s+d); + emit_byte(0x39); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i)) { - emit_byte(0x81); - emit_byte(0xf8+r); - emit_long(i); + emit_byte(0x81); + emit_byte(0xf8+r); + emit_long(i); } LENDFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x39); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x39); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i)) + LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i)) { - emit_byte(0x80); - emit_byte(0xf8+d); - emit_byte(i); + emit_byte(0x80); + emit_byte(0xf8+d); + emit_byte(i); } LENDFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i)) -LOWFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s)) { - emit_byte(0x38); - emit_byte(0xc0+8*s+d); + emit_byte(0x38); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s)) -LOWFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s)) + LOWFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s)) { - emit_byte(0x31); - emit_byte(0xc0+8*s+d); + emit_byte(0x31); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s)) -LOWFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s)) + LOWFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s)) { - emit_byte(0x66); - emit_byte(0x31); - emit_byte(0xc0+8*s+d); + emit_byte(0x66); + emit_byte(0x31); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s)) -LOWFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s)) + LOWFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s)) { - emit_byte(0x30); - emit_byte(0xc0+8*s+d); + emit_byte(0x30); + emit_byte(0xc0+8*s+d); } LENDFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s)) -LOWFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s)) + LOWFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s)) { - emit_byte(0x81); - emit_byte(0x2d); - emit_long(d); - emit_long(s); + emit_byte(0x81); + emit_byte(0x2d); + emit_long(d); + emit_long(s); } LENDFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s)) -LOWFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s)) + LOWFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s)) { - emit_byte(0x81); - emit_byte(0x3d); - emit_long(d); - emit_long(s); + emit_byte(0x81); + emit_byte(0x3d); + emit_long(d); + emit_long(s); } LENDFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s)) -LOWFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2)) + LOWFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2)) { - emit_byte(0x87); - emit_byte(0xc0+8*r1+r2); + emit_byte(0x87); + emit_byte(0xc0+8*r1+r2); } LENDFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2)) -LOWFUNC(READ,WRITE,0,raw_pushfl,(void)) + LOWFUNC(READ,WRITE,0,raw_pushfl,(void)) { - emit_byte(0x9c); + emit_byte(0x9c); } LENDFUNC(READ,WRITE,0,raw_pushfl,(void)) -LOWFUNC(WRITE,READ,0,raw_popfl,(void)) + LOWFUNC(WRITE,READ,0,raw_popfl,(void)) { - emit_byte(0x9d); + emit_byte(0x9d); } LENDFUNC(WRITE,READ,0,raw_popfl,(void)) -/************************************************************************* - * Unoptimizable stuff --- jump * - *************************************************************************/ + /************************************************************************* + * Unoptimizable stuff --- jump * + *************************************************************************/ -STATIC_INLINE void raw_call_r(R4 r) + STATIC_INLINE void raw_call_r(R4 r) { - lopt_emit_all(); - emit_byte(0xff); - emit_byte(0xd0+r); + lopt_emit_all(); + emit_byte(0xff); + emit_byte(0xd0+r); } STATIC_INLINE void raw_jmp_r(R4 r) { - lopt_emit_all(); - emit_byte(0xff); - emit_byte(0xe0+r); + lopt_emit_all(); + emit_byte(0xff); + emit_byte(0xe0+r); } STATIC_INLINE void raw_jmp_m_indexed(uae_u32 base, uae_u32 r, uae_u32 m) { - int sib; + int sib; - switch (m) { + switch (m) { case 1: sib = 0x05; break; case 2: sib = 0x45; break; case 4: sib = 0x85; break; case 8: sib = 0xC5; break; default: abort(); - } - lopt_emit_all(); - emit_byte(0xff); - emit_byte(0x24); - emit_byte(8*r+sib); - emit_long(base); + } + lopt_emit_all(); + emit_byte(0xff); + emit_byte(0x24); + emit_byte(8*r+sib); + emit_long(base); } STATIC_INLINE void raw_jmp_m(uae_u32 base) { - lopt_emit_all(); - emit_byte(0xff); - emit_byte(0x25); - emit_long(base); + lopt_emit_all(); + emit_byte(0xff); + emit_byte(0x25); + emit_long(base); } STATIC_INLINE void raw_call(uae_u32 t) { - lopt_emit_all(); - emit_byte(0xe8); - emit_long(t-(uae_u32)target-4); + lopt_emit_all(); + emit_byte(0xe8); + emit_long(t-(uae_u32)target-4); } STATIC_INLINE void raw_jmp(uae_u32 t) { - lopt_emit_all(); - emit_byte(0xe9); - emit_long(t-(uae_u32)target-4); + lopt_emit_all(); + emit_byte(0xe9); + emit_long(t-(uae_u32)target-4); } STATIC_INLINE void raw_jl(uae_u32 t) { - lopt_emit_all(); - emit_byte(0x0f); - emit_byte(0x8c); - emit_long(t-(uae_u32)target-4); + lopt_emit_all(); + emit_byte(0x0f); + emit_byte(0x8c); + emit_long(t-(uae_u32)target-4); } STATIC_INLINE void raw_jz(uae_u32 t) { - lopt_emit_all(); - emit_byte(0x0f); - emit_byte(0x84); - emit_long(t-(uae_u32)target-4); + lopt_emit_all(); + emit_byte(0x0f); + emit_byte(0x84); + emit_long(t-(uae_u32)target-4); } STATIC_INLINE void raw_jnz(uae_u32 t) { - lopt_emit_all(); - emit_byte(0x0f); - emit_byte(0x85); - emit_long(t-(uae_u32)target-4); + lopt_emit_all(); + emit_byte(0x0f); + emit_byte(0x85); + emit_long(t-(uae_u32)target-4); } STATIC_INLINE void raw_jnz_l_oponly(void) { - lopt_emit_all(); - emit_byte(0x0f); - emit_byte(0x85); + lopt_emit_all(); + emit_byte(0x0f); + emit_byte(0x85); } STATIC_INLINE void raw_jcc_l_oponly(int cc) { - lopt_emit_all(); - emit_byte(0x0f); - emit_byte(0x80+cc); + lopt_emit_all(); + emit_byte(0x0f); + emit_byte(0x80+cc); } STATIC_INLINE void raw_jnz_b_oponly(void) { - lopt_emit_all(); - emit_byte(0x75); + lopt_emit_all(); + emit_byte(0x75); } STATIC_INLINE void raw_jz_b_oponly(void) { - lopt_emit_all(); - emit_byte(0x74); + lopt_emit_all(); + emit_byte(0x74); } STATIC_INLINE void raw_jmp_l_oponly(void) { - lopt_emit_all(); - emit_byte(0xe9); + lopt_emit_all(); + emit_byte(0xe9); } STATIC_INLINE void raw_jmp_b_oponly(void) { - lopt_emit_all(); - emit_byte(0xeb); + lopt_emit_all(); + emit_byte(0xeb); } STATIC_INLINE void raw_ret(void) { - lopt_emit_all(); - emit_byte(0xc3); + lopt_emit_all(); + emit_byte(0xc3); } STATIC_INLINE void raw_nop(void) { - lopt_emit_all(); - emit_byte(0x90); + lopt_emit_all(); + emit_byte(0x90); } /************************************************************************* - * Flag handling, to and fro UAE flag register * - *************************************************************************/ +* Flag handling, to and fro UAE flag register * +*************************************************************************/ #define FLAG_NREG1 0 /* Set to -1 if any register will do */ STATIC_INLINE void raw_flags_to_reg(int r) { - raw_lahf(0); /* Most flags in AH */ - //raw_setcc(r,0); /* V flag in AL */ - raw_setcc_m((uae_u32)live.state[FLAGTMP].mem,0); + raw_lahf(0); /* Most flags in AH */ + //raw_setcc(r,0); /* V flag in AL */ + raw_setcc_m((uae_u32)live.state[FLAGTMP].mem,0); #if 1 /* Let's avoid those nasty partial register stalls */ - //raw_mov_b_mr((uae_u32)live.state[FLAGTMP].mem,r); - raw_mov_b_mr(((uae_u32)live.state[FLAGTMP].mem)+1,r+4); - //live.state[FLAGTMP].status=CLEAN; - live.state[FLAGTMP].status=INMEM; - live.state[FLAGTMP].realreg=-1; - /* We just "evicted" FLAGTMP. */ - if (live.nat[r].nholds!=1) { - /* Huh? */ - abort(); - } - live.nat[r].nholds=0; + //raw_mov_b_mr((uae_u32)live.state[FLAGTMP].mem,r); + raw_mov_b_mr(((uae_u32)live.state[FLAGTMP].mem)+1,r+4); + //live.state[FLAGTMP].status=CLEAN; + live.state[FLAGTMP].status=INMEM; + live.state[FLAGTMP].realreg=-1; + /* We just "evicted" FLAGTMP. */ + if (live.nat[r].nholds!=1) { + /* Huh? */ + abort(); + } + live.nat[r].nholds=0; #endif } #define FLAG_NREG2 0 /* Set to -1 if any register will do */ STATIC_INLINE void raw_reg_to_flags(int r) { - raw_cmp_b_ri(r,-127); /* set V */ - raw_sahf(0); + raw_cmp_b_ri(r,-127); /* set V */ + raw_sahf(0); } /* Apparently, there are enough instructions between flag store and - flag reload to avoid the partial memory stall */ +flag reload to avoid the partial memory stall */ STATIC_INLINE void raw_load_flagreg(uae_u32 target, uae_u32 r) { #if 1 - raw_mov_l_rm(target,(uae_u32)live.state[r].mem); + raw_mov_l_rm(target,(uae_u32)live.state[r].mem); #else - raw_mov_b_rm(target,(uae_u32)live.state[r].mem); - raw_mov_b_rm(target+4,((uae_u32)live.state[r].mem)+1); + raw_mov_b_rm(target,(uae_u32)live.state[r].mem); + raw_mov_b_rm(target+4,((uae_u32)live.state[r].mem)+1); #endif } /* FLAGX is word-sized */ STATIC_INLINE void raw_load_flagx(uae_u32 target, uae_u32 r) { - if (live.nat[target].canword) - raw_mov_w_rm(target,(uae_u32)live.state[r].mem); - else - raw_mov_l_rm(target,(uae_u32)live.state[r].mem); + if (live.nat[target].canword) + raw_mov_w_rm(target,(uae_u32)live.state[r].mem); + else + raw_mov_l_rm(target,(uae_u32)live.state[r].mem); } #define NATIVE_FLAG_Z 0x40 #define NATIVE_CC_EQ 4 STATIC_INLINE void raw_flags_set_zero(int f, int r, int t) { - // FIXME: this is really suboptimal - raw_pushfl(); - raw_pop_l_r(f); - raw_and_l_ri(f,~NATIVE_FLAG_Z); - raw_test_l_rr(r,r); - raw_mov_l_ri(r,0); - raw_mov_l_ri(t,NATIVE_FLAG_Z); - raw_cmov_l_rr(r,t,NATIVE_CC_EQ); - raw_or_l(f,r); - raw_push_l_r(f); - raw_popfl(); + // FIXME: this is really suboptimal + raw_pushfl(); + raw_pop_l_r(f); + raw_and_l_ri(f,~NATIVE_FLAG_Z); + raw_test_l_rr(r,r); + raw_mov_l_ri(r,0); + raw_mov_l_ri(t,NATIVE_FLAG_Z); + raw_cmov_l_rr(r,t,NATIVE_CC_EQ); + raw_or_l(f,r); + raw_push_l_r(f); + raw_popfl(); } STATIC_INLINE void raw_inc_sp(int off) { - raw_add_l_ri(4,off); + raw_add_l_ri(4,off); } /************************************************************************* - * Handling mistaken direct memory access * - *************************************************************************/ +* Handling mistaken direct memory access * +*************************************************************************/ #ifdef NATMEM_OFFSET @@ -1697,604 +1697,601 @@ static uae_u8 *veccode; #define ctxPC (pContext->Eip) #endif -extern int mman_guard_exception (LPEXCEPTION_POINTERS); int EvalException (LPEXCEPTION_POINTERS blah, int n_except) { - PEXCEPTION_RECORD pExceptRecord = NULL; - PCONTEXT pContext = NULL; + PEXCEPTION_RECORD pExceptRecord = NULL; + PCONTEXT pContext = NULL; - uae_u8* i = NULL; - uae_u32 addr = 0; - int r=-1; - int size=4; - int dir=-1; - int len=0; + uae_u8* i = NULL; + uae_u32 addr = 0; + int r=-1; + int size=4; + int dir=-1; + int len=0; - if (n_except == STATUS_GUARD_PAGE_VIOLATION) - return mman_guard_exception (blah); - if (n_except != STATUS_ACCESS_VIOLATION || !canbang) - return EXCEPTION_CONTINUE_SEARCH; + if (n_except != STATUS_ACCESS_VIOLATION || !canbang || currprefs.cachesize == 0) + return EXCEPTION_CONTINUE_SEARCH; - pExceptRecord = blah->ExceptionRecord; - pContext = blah->ContextRecord; + pExceptRecord = blah->ExceptionRecord; + pContext = blah->ContextRecord; - if (pContext) - i = (uae_u8 *)ctxPC; - if (pExceptRecord) - addr = (uae_u32)(pExceptRecord->ExceptionInformation[1]); + if (pContext) + i = (uae_u8 *)ctxPC; + if (pExceptRecord) + addr = (uae_u32)(pExceptRecord->ExceptionInformation[1]); #ifdef JIT_DEBUG - write_log (L"JIT: fault address is 0x%x at 0x%x\n",addr,i); + write_log (L"JIT: fault address is 0x%x at 0x%x\n",addr,i); #endif - if (!canbang || !currprefs.cachesize) - return EXCEPTION_CONTINUE_SEARCH; + if (!canbang || !currprefs.cachesize) + return EXCEPTION_CONTINUE_SEARCH; - if (in_handler) - write_log (L"JIT: Argh --- Am already in a handler. Shouldn't happen!\n"); + if (in_handler) + write_log (L"JIT: Argh --- Am already in a handler. Shouldn't happen!\n"); - if (canbang && i>=compiled_code && i<=current_compile_p) { - if (*i==0x66) { - i++; - size=2; - len++; - } + if (canbang && i>=compiled_code && i<=current_compile_p) { + if (*i==0x66) { + i++; + size=2; + len++; + } - switch(i[0]) { - case 0x8a: - if ((i[1]&0xc0)==0x80) { - r=(i[1]>>3)&7; - dir=SIG_READ; - size=1; - len+=6; - break; - } - break; - case 0x88: - if ((i[1]&0xc0)==0x80) { - r=(i[1]>>3)&7; - dir=SIG_WRITE; - size=1; - len+=6; - break; - } - break; - case 0x8b: - switch(i[1]&0xc0) { - case 0x80: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=6; - break; - case 0x40: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=3; - break; - case 0x00: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=2; - break; - default: - break; - } - break; - case 0x89: - switch(i[1]&0xc0) { - case 0x80: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=6; - break; - case 0x40: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=3; - break; - case 0x00: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=2; - break; + switch(i[0]) { + case 0x8a: + if ((i[1]&0xc0)==0x80) { + r=(i[1]>>3)&7; + dir=SIG_READ; + size=1; + len+=6; + break; + } + break; + case 0x88: + if ((i[1]&0xc0)==0x80) { + r=(i[1]>>3)&7; + dir=SIG_WRITE; + size=1; + len+=6; + break; + } + break; + case 0x8b: + switch(i[1]&0xc0) { + case 0x80: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=6; + break; + case 0x40: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=3; + break; + case 0x00: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=2; + break; + default: + break; + } + break; + case 0x89: + switch(i[1]&0xc0) { + case 0x80: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=6; + break; + case 0x40: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=3; + break; + case 0x00: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=2; + break; + } + break; } - break; } - } - if (r!=-1) { - void* pr=NULL; + if (r!=-1) { + void* pr=NULL; #ifdef JIT_DEBUG - write_log (L"JIT: register was %d, direction was %d, size was %d\n",r,dir,size); + write_log (L"JIT: register was %d, direction was %d, size was %d\n",r,dir,size); #endif - switch(r) { + switch(r) { #if defined(CPU_64_BIT) - case 0: pr=&(pContext->Rax); break; - case 1: pr=&(pContext->Rcx); break; - case 2: pr=&(pContext->Rdx); break; - case 3: pr=&(pContext->Rbx); break; - case 4: pr=(size>1)?NULL:(((uae_u8*)&(pContext->Rax))+1); break; - case 5: pr=(size>1)? - (void*)(&(pContext->Rbp)): - (void*)(((uae_u8*)&(pContext->Rcx))+1); break; - case 6: pr=(size>1)? - (void*)(&(pContext->Rsi)): - (void*)(((uae_u8*)&(pContext->Rdx))+1); break; - case 7: pr=(size>1)? - (void*)(&(pContext->Rdi)): - (void*)(((uae_u8*)&(pContext->Rbx))+1); break; + case 0: pr=&(pContext->Rax); break; + case 1: pr=&(pContext->Rcx); break; + case 2: pr=&(pContext->Rdx); break; + case 3: pr=&(pContext->Rbx); break; + case 4: pr=(size>1)?NULL:(((uae_u8*)&(pContext->Rax))+1); break; + case 5: pr=(size>1)? + (void*)(&(pContext->Rbp)): + (void*)(((uae_u8*)&(pContext->Rcx))+1); break; + case 6: pr=(size>1)? + (void*)(&(pContext->Rsi)): + (void*)(((uae_u8*)&(pContext->Rdx))+1); break; + case 7: pr=(size>1)? + (void*)(&(pContext->Rdi)): + (void*)(((uae_u8*)&(pContext->Rbx))+1); break; #else - case 0: pr=&(pContext->Eax); break; - case 1: pr=&(pContext->Ecx); break; - case 2: pr=&(pContext->Edx); break; - case 3: pr=&(pContext->Ebx); break; - case 4: pr=(size>1)?NULL:(((uae_u8*)&(pContext->Eax))+1); break; - case 5: pr=(size>1)? - (void*)(&(pContext->Ebp)): - (void*)(((uae_u8*)&(pContext->Ecx))+1); break; - case 6: pr=(size>1)? - (void*)(&(pContext->Esi)): - (void*)(((uae_u8*)&(pContext->Edx))+1); break; - case 7: pr=(size>1)? - (void*)(&(pContext->Edi)): - (void*)(((uae_u8*)&(pContext->Ebx))+1); break; + case 0: pr=&(pContext->Eax); break; + case 1: pr=&(pContext->Ecx); break; + case 2: pr=&(pContext->Edx); break; + case 3: pr=&(pContext->Ebx); break; + case 4: pr=(size>1)?NULL:(((uae_u8*)&(pContext->Eax))+1); break; + case 5: pr=(size>1)? + (void*)(&(pContext->Ebp)): + (void*)(((uae_u8*)&(pContext->Ecx))+1); break; + case 6: pr=(size>1)? + (void*)(&(pContext->Esi)): + (void*)(((uae_u8*)&(pContext->Edx))+1); break; + case 7: pr=(size>1)? + (void*)(&(pContext->Edi)): + (void*)(((uae_u8*)&(pContext->Ebx))+1); break; #endif - default: abort(); - } - if (pr) { - blockinfo* bi; + default: abort(); + } + if (pr) { + blockinfo* bi; - if (currprefs.comp_oldsegv) { - addr-=(uae_u32)NATMEM_OFFSET; + if (currprefs.comp_oldsegv) { + addr-=(uae_u32)NATMEM_OFFSET; #ifdef JIT_DEBUG - if ((addr>=0x10000000 && addr<0x40000000) || - (addr>=0x50000000)) { - write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); - } + if ((addr>=0x10000000 && addr<0x40000000) || + (addr>=0x50000000)) { + write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); + } #endif - if (dir==SIG_READ) { - switch (size) { - case 1: *((uae_u8*)pr)=get_byte (addr); break; - case 2: *((uae_u16*)pr)=swap16(get_word (addr)); break; - case 4: *((uae_u32*)pr)=swap32(get_long (addr)); break; - default: abort(); - } - } - else { /* write */ - switch (size) { - case 1: put_byte (addr,*((uae_u8*)pr)); break; - case 2: put_word (addr,swap16(*((uae_u16*)pr))); break; - case 4: put_long (addr,swap32(*((uae_u32*)pr))); break; - default: abort(); - } - } + if (dir==SIG_READ) { + switch (size) { + case 1: *((uae_u8*)pr)=get_byte (addr); break; + case 2: *((uae_u16*)pr)=swap16(get_word (addr)); break; + case 4: *((uae_u32*)pr)=swap32(get_long (addr)); break; + default: abort(); + } + } + else { /* write */ + switch (size) { + case 1: put_byte (addr,*((uae_u8*)pr)); break; + case 2: put_word (addr,swap16(*((uae_u16*)pr))); break; + case 4: put_long (addr,swap32(*((uae_u32*)pr))); break; + default: abort(); + } + } #ifdef JIT_DEBUG - write_log (L"JIT: Handled one access!\n"); + write_log (L"JIT: Handled one access!\n"); #endif - fflush(stdout); - segvcount++; - ctxPC+=len; - } - else { - void* tmp=target; - int i; - uae_u8 vecbuf[5]; + fflush(stdout); + segvcount++; + ctxPC+=len; + } + else { + void* tmp=target; + int i; + uae_u8 vecbuf[5]; - addr-=(uae_u32)NATMEM_OFFSET; + addr-=(uae_u32)NATMEM_OFFSET; #ifdef JIT_DEBUG - if ((addr>=0x10000000 && addr<0x40000000) || - (addr>=0x50000000)) { - write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); - } + if ((addr>=0x10000000 && addr<0x40000000) || + (addr>=0x50000000)) { + write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); + } #endif - target=(uae_u8*)ctxPC; - for (i=0;i<5;i++) - vecbuf[i]=target[i]; - emit_byte(0xe9); - emit_long((uae_u32)veccode-(uae_u32)target-4); + target=(uae_u8*)ctxPC; + for (i=0;i<5;i++) + vecbuf[i]=target[i]; + emit_byte(0xe9); + emit_long((uae_u32)veccode-(uae_u32)target-4); #ifdef JIT_DEBUG - write_log (L"JIT: Create jump to %p\n",veccode); - write_log (L"JIT: Handled one access!\n"); + write_log (L"JIT: Create jump to %p\n",veccode); + write_log (L"JIT: Handled one access!\n"); #endif - segvcount++; - - target=veccode; - - if (dir==SIG_READ) { - switch(size) { - case 1: raw_mov_b_ri(r,get_byte (addr)); break; - case 2: raw_mov_w_ri(r,swap16(get_word (addr))); break; - case 4: raw_mov_l_ri(r,swap32(get_long (addr))); break; - default: abort(); - } - } - else { /* write */ - switch(size) { - case 1: put_byte (addr,*((uae_u8*)pr)); break; - case 2: put_word (addr,swap16(*((uae_u16*)pr))); break; - case 4: put_long (addr,swap32(*((uae_u32*)pr))); break; - default: abort(); - } - } - for (i=0;i<5;i++) - raw_mov_b_mi(ctxPC+i,vecbuf[i]); - raw_mov_l_mi((uae_u32)&in_handler,0); - emit_byte(0xe9); - emit_long(ctxPC+len-(uae_u32)target-4); - in_handler=1; - target=(uae_u8*)tmp; - } - bi=active; - while (bi) { - if (bi->handler && - (uae_u8*)bi->direct_handler<=i && - (uae_u8*)bi->nexthandler>i) { + segvcount++; + + target=veccode; + + if (dir==SIG_READ) { + switch(size) { + case 1: raw_mov_b_ri(r,get_byte (addr)); break; + case 2: raw_mov_w_ri(r,swap16(get_word (addr))); break; + case 4: raw_mov_l_ri(r,swap32(get_long (addr))); break; + default: abort(); + } + } + else { /* write */ + switch(size) { + case 1: put_byte (addr,*((uae_u8*)pr)); break; + case 2: put_word (addr,swap16(*((uae_u16*)pr))); break; + case 4: put_long (addr,swap32(*((uae_u32*)pr))); break; + default: abort(); + } + } + for (i=0;i<5;i++) + raw_mov_b_mi(ctxPC+i,vecbuf[i]); + raw_mov_l_mi((uae_u32)&in_handler,0); + emit_byte(0xe9); + emit_long(ctxPC+len-(uae_u32)target-4); + in_handler=1; + target=(uae_u8*)tmp; + } + bi=active; + while (bi) { + if (bi->handler && + (uae_u8*)bi->direct_handler<=i && + (uae_u8*)bi->nexthandler>i) { #ifdef JIT_DEBUG - write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", - bi->handler, - i, - bi->nexthandler, - bi->pc_p); + write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", + bi->handler, + i, + bi->nexthandler, + bi->pc_p); #endif - invalidate_block(bi); - raise_in_cl_list(bi); - set_special(0); - return EXCEPTION_CONTINUE_EXECUTION; - } - bi=bi->next; - } - /* Not found in the active list. Might be a rom routine that - is in the dormant list */ - bi=dormant; - while (bi) { - if (bi->handler && - (uae_u8*)bi->direct_handler<=i && - (uae_u8*)bi->nexthandler>i) { + invalidate_block(bi); + raise_in_cl_list(bi); + set_special(0); + return EXCEPTION_CONTINUE_EXECUTION; + } + bi=bi->next; + } + /* Not found in the active list. Might be a rom routine that + is in the dormant list */ + bi=dormant; + while (bi) { + if (bi->handler && + (uae_u8*)bi->direct_handler<=i && + (uae_u8*)bi->nexthandler>i) { #ifdef JIT_DEBUG - write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", - bi->handler, - i, - bi->nexthandler, - bi->pc_p); + write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", + bi->handler, + i, + bi->nexthandler, + bi->pc_p); #endif - invalidate_block(bi); - raise_in_cl_list(bi); - set_special(0); - return EXCEPTION_CONTINUE_EXECUTION; - } - bi=bi->next; - } + invalidate_block(bi); + raise_in_cl_list(bi); + set_special(0); + return EXCEPTION_CONTINUE_EXECUTION; + } + bi=bi->next; + } #ifdef JIT_DEBUG - write_log (L"JIT: Huh? Could not find trigger!\n"); + write_log (L"JIT: Huh? Could not find trigger!\n"); #endif - return EXCEPTION_CONTINUE_EXECUTION; + return EXCEPTION_CONTINUE_EXECUTION; + } } - } - write_log (L"JIT: Can't handle access %08X!\n", i); + write_log (L"JIT: Can't handle access %08X!\n", i); #if 0 - if (i) - { - int j; + if (i) + { + int j; - for (j=0;j<10;j++) { - write_log (L"JIT: instruction byte %2d is 0x%02x\n",j,i[j]); + for (j=0;j<10;j++) { + write_log (L"JIT: instruction byte %2d is 0x%02x\n",j,i[j]); + } } - } - write_log (L"Please send the above info (starting at \"fault address\") to\n" - L"bmeyer@csse.monash.edu.au\n" - L"This shouldn't happen ;-)\n"); + write_log (L"Please send the above info (starting at \"fault address\") to\n" + L"bmeyer@csse.monash.edu.au\n" + L"This shouldn't happen ;-)\n"); #endif - return EXCEPTION_CONTINUE_SEARCH; + return EXCEPTION_CONTINUE_SEARCH; } #else static void vec(int x, struct sigcontext sc) { - uae_u8* i=(uae_u8*)sc.eip; - uae_u32 addr=sc.cr2; - int r=-1; - int size=4; - int dir=-1; - int len=0; - int j; - - write_log (L"JIT: fault address is %08x at %08x\n",sc.cr2,sc.eip); - if (!canbang) - write_log (L"JIT: Not happy! Canbang is 0 in SIGSEGV handler!\n"); - if (in_handler) - write_log (L"JIT: Argh --- Am already in a handler. Shouldn't happen!\n"); - - if (canbang && i>=compiled_code && i<=current_compile_p) { - if (*i==0x66) { - i++; - size=2; - len++; - } - - switch(i[0]) { - case 0x8a: - if ((i[1]&0xc0)==0x80) { - r=(i[1]>>3)&7; - dir=SIG_READ; - size=1; - len+=6; - break; - } - break; - case 0x88: - if ((i[1]&0xc0)==0x80) { - r=(i[1]>>3)&7; - dir=SIG_WRITE; - size=1; - len+=6; - break; - } - break; - - case 0x8b: - switch(i[1]&0xc0) { - case 0x80: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=6; - break; - case 0x40: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=3; - break; - case 0x00: - r=(i[1]>>3)&7; - dir=SIG_READ; - len+=2; - break; - default: - break; - } - break; - - case 0x89: - switch(i[1]&0xc0) { - case 0x80: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=6; - break; - case 0x40: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=3; - break; - case 0x00: - r=(i[1]>>3)&7; - dir=SIG_WRITE; - len+=2; - break; - } - break; - } - } - - if (r!=-1) { - void* pr=NULL; - write_log (L"JIT: register was %d, direction was %d, size was %d\n",r,dir,size); - - switch(r) { - case 0: pr=&(sc.eax); break; - case 1: pr=&(sc.ecx); break; - case 2: pr=&(sc.edx); break; - case 3: pr=&(sc.ebx); break; - case 4: pr=(size>1)?NULL:(((uae_u8*)&(sc.eax))+1); break; - case 5: pr=(size>1)? - (void*)(&(sc.ebp)): - (void*)(((uae_u8*)&(sc.ecx))+1); break; - case 6: pr=(size>1)? - (void*)(&(sc.esi)): - (void*)(((uae_u8*)&(sc.edx))+1); break; - case 7: pr=(size>1)? - (void*)(&(sc.edi)): - (void*)(((uae_u8*)&(sc.ebx))+1); break; - default: abort(); - } - if (pr) { - blockinfo* bi; - - if (currprefs.comp_oldsegv) { - addr-=NATMEM_OFFSET; - - if ((addr>=0x10000000 && addr<0x40000000) || - (addr>=0x50000000)) { - write_log (L"JIT: Suspicious address in %x SEGV handler.\n",addr); - } - if (dir==SIG_READ) { - switch(size) { - case 1: *((uae_u8*)pr)=get_byte (addr); break; - case 2: *((uae_u16*)pr)=get_word (addr); break; - case 4: *((uae_u32*)pr)=get_long (addr); break; - default: abort(); - } - } - else { /* write */ - switch(size) { - case 1: put_byte (addr,*((uae_u8*)pr)); break; - case 2: put_word (addr,*((uae_u16*)pr)); break; - case 4: put_long (addr,*((uae_u32*)pr)); break; - default: abort(); - } - } - write_log (L"JIT: Handled one access!\n"); - fflush(stdout); - segvcount++; - sc.eip+=len; - } - else { - void* tmp=target; - int i; - uae_u8 vecbuf[5]; - - addr-=NATMEM_OFFSET; - - if ((addr>=0x10000000 && addr<0x40000000) || - (addr>=0x50000000)) { - write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); - } + uae_u8* i=(uae_u8*)sc.eip; + uae_u32 addr=sc.cr2; + int r=-1; + int size=4; + int dir=-1; + int len=0; + int j; - target=(uae_u8*)sc.eip; - for (i=0;i<5;i++) - vecbuf[i]=target[i]; - emit_byte(0xe9); - emit_long((uae_u32)veccode-(uae_u32)target-4); - write_log (L"JIT: Create jump to %p\n",veccode); - - write_log (L"JIT: Handled one access!\n"); - segvcount++; - - target=veccode; - - if (dir==SIG_READ) { - switch(size) { - case 1: raw_mov_b_ri(r,get_byte (addr)); break; - case 2: raw_mov_w_ri(r,get_word (addr)); break; - case 4: raw_mov_l_ri(r,get_long (addr)); break; - default: abort(); - } + write_log (L"JIT: fault address is %08x at %08x\n",sc.cr2,sc.eip); + if (!canbang) + write_log (L"JIT: Not happy! Canbang is 0 in SIGSEGV handler!\n"); + if (in_handler) + write_log (L"JIT: Argh --- Am already in a handler. Shouldn't happen!\n"); + + if (canbang && i>=compiled_code && i<=current_compile_p) { + if (*i==0x66) { + i++; + size=2; + len++; } - else { /* write */ - switch(size) { - case 1: put_byte (addr,*((uae_u8*)pr)); break; - case 2: put_word (addr,*((uae_u16*)pr)); break; - case 4: put_long (addr,*((uae_u32*)pr)); break; - default: abort(); - } + + switch(i[0]) { + case 0x8a: + if ((i[1]&0xc0)==0x80) { + r=(i[1]>>3)&7; + dir=SIG_READ; + size=1; + len+=6; + break; + } + break; + case 0x88: + if ((i[1]&0xc0)==0x80) { + r=(i[1]>>3)&7; + dir=SIG_WRITE; + size=1; + len+=6; + break; + } + break; + + case 0x8b: + switch(i[1]&0xc0) { + case 0x80: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=6; + break; + case 0x40: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=3; + break; + case 0x00: + r=(i[1]>>3)&7; + dir=SIG_READ; + len+=2; + break; + default: + break; + } + break; + + case 0x89: + switch(i[1]&0xc0) { + case 0x80: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=6; + break; + case 0x40: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=3; + break; + case 0x00: + r=(i[1]>>3)&7; + dir=SIG_WRITE; + len+=2; + break; + } + break; } - for (i=0;i<5;i++) - raw_mov_b_mi(sc.eip+i,vecbuf[i]); - raw_mov_l_mi((uae_u32)&in_handler,0); - emit_byte(0xe9); - emit_long(sc.eip+len-(uae_u32)target-4); - in_handler=1; - target=tmp; - } - bi=active; - while (bi) { - if (bi->handler && - (uae_u8*)bi->direct_handler<=i && - (uae_u8*)bi->nexthandler>i) { - write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", - bi->handler, - i, - bi->nexthandler, - bi->pc_p); - invalidate_block(bi); - raise_in_cl_list(bi); - set_special(0); - return; + } + + if (r!=-1) { + void* pr=NULL; + write_log (L"JIT: register was %d, direction was %d, size was %d\n",r,dir,size); + + switch(r) { + case 0: pr=&(sc.eax); break; + case 1: pr=&(sc.ecx); break; + case 2: pr=&(sc.edx); break; + case 3: pr=&(sc.ebx); break; + case 4: pr=(size>1)?NULL:(((uae_u8*)&(sc.eax))+1); break; + case 5: pr=(size>1)? + (void*)(&(sc.ebp)): + (void*)(((uae_u8*)&(sc.ecx))+1); break; + case 6: pr=(size>1)? + (void*)(&(sc.esi)): + (void*)(((uae_u8*)&(sc.edx))+1); break; + case 7: pr=(size>1)? + (void*)(&(sc.edi)): + (void*)(((uae_u8*)&(sc.ebx))+1); break; + default: abort(); } - bi=bi->next; - } - /* Not found in the active list. Might be a rom routine that - is in the dormant list */ - bi=dormant; - while (bi) { - if (bi->handler && - (uae_u8*)bi->direct_handler<=i && - (uae_u8*)bi->nexthandler>i) { - write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", - bi->handler, - i, - bi->nexthandler, - bi->pc_p); - invalidate_block(bi); - raise_in_cl_list(bi); - set_special(0); - return; + if (pr) { + blockinfo* bi; + + if (currprefs.comp_oldsegv) { + addr-=NATMEM_OFFSET; + + if ((addr>=0x10000000 && addr<0x40000000) || + (addr>=0x50000000)) { + write_log (L"JIT: Suspicious address in %x SEGV handler.\n",addr); + } + if (dir==SIG_READ) { + switch(size) { + case 1: *((uae_u8*)pr)=get_byte (addr); break; + case 2: *((uae_u16*)pr)=get_word (addr); break; + case 4: *((uae_u32*)pr)=get_long (addr); break; + default: abort(); + } + } + else { /* write */ + switch(size) { + case 1: put_byte (addr,*((uae_u8*)pr)); break; + case 2: put_word (addr,*((uae_u16*)pr)); break; + case 4: put_long (addr,*((uae_u32*)pr)); break; + default: abort(); + } + } + write_log (L"JIT: Handled one access!\n"); + fflush(stdout); + segvcount++; + sc.eip+=len; + } + else { + void* tmp=target; + int i; + uae_u8 vecbuf[5]; + + addr-=NATMEM_OFFSET; + + if ((addr>=0x10000000 && addr<0x40000000) || + (addr>=0x50000000)) { + write_log (L"JIT: Suspicious address 0x%x in SEGV handler.\n",addr); + } + + target=(uae_u8*)sc.eip; + for (i=0;i<5;i++) + vecbuf[i]=target[i]; + emit_byte(0xe9); + emit_long((uae_u32)veccode-(uae_u32)target-4); + write_log (L"JIT: Create jump to %p\n",veccode); + + write_log (L"JIT: Handled one access!\n"); + segvcount++; + + target=veccode; + + if (dir==SIG_READ) { + switch(size) { + case 1: raw_mov_b_ri(r,get_byte (addr)); break; + case 2: raw_mov_w_ri(r,get_word (addr)); break; + case 4: raw_mov_l_ri(r,get_long (addr)); break; + default: abort(); + } + } + else { /* write */ + switch(size) { + case 1: put_byte (addr,*((uae_u8*)pr)); break; + case 2: put_word (addr,*((uae_u16*)pr)); break; + case 4: put_long (addr,*((uae_u32*)pr)); break; + default: abort(); + } + } + for (i=0;i<5;i++) + raw_mov_b_mi(sc.eip+i,vecbuf[i]); + raw_mov_l_mi((uae_u32)&in_handler,0); + emit_byte(0xe9); + emit_long(sc.eip+len-(uae_u32)target-4); + in_handler=1; + target=tmp; + } + bi=active; + while (bi) { + if (bi->handler && + (uae_u8*)bi->direct_handler<=i && + (uae_u8*)bi->nexthandler>i) { + write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", + bi->handler, + i, + bi->nexthandler, + bi->pc_p); + invalidate_block(bi); + raise_in_cl_list(bi); + set_special(0); + return; + } + bi=bi->next; + } + /* Not found in the active list. Might be a rom routine that + is in the dormant list */ + bi=dormant; + while (bi) { + if (bi->handler && + (uae_u8*)bi->direct_handler<=i && + (uae_u8*)bi->nexthandler>i) { + write_log (L"JIT: deleted trigger (%p<%p<%p) %p\n", + bi->handler, + i, + bi->nexthandler, + bi->pc_p); + invalidate_block(bi); + raise_in_cl_list(bi); + set_special(0); + return; + } + bi=bi->next; + } + write_log (L"JIT: Huh? Could not find trigger!\n"); + return; } - bi=bi->next; - } - write_log (L"JIT: Huh? Could not find trigger!\n"); - return; - } - } - write_log (L"JIT: Can't handle access!\n"); - for (j=0;j<10;j++) { - write_log (L"JIT: instruction byte %2d is %02x\n",j,i[j]); - } + } + write_log (L"JIT: Can't handle access!\n"); + for (j=0;j<10;j++) { + write_log (L"JIT: instruction byte %2d is %02x\n",j,i[j]); + } #if 0 - write_log (L"Please send the above info (starting at \"fault address\") to\n" - "bmeyer@csse.monash.edu.au\n" - "This shouldn't happen ;-)\n"); - fflush(stdout); + write_log (L"Please send the above info (starting at \"fault address\") to\n" + "bmeyer@csse.monash.edu.au\n" + "This shouldn't happen ;-)\n"); + fflush(stdout); #endif - signal(SIGSEGV,SIG_DFL); /* returning here will cause a "real" SEGV */ + signal(SIGSEGV,SIG_DFL); /* returning here will cause a "real" SEGV */ } #endif #endif /************************************************************************* - * Checking for CPU features * - *************************************************************************/ +* Checking for CPU features * +*************************************************************************/ struct cpuinfo_x86 { - uae_u8 x86; // CPU family - uae_u8 x86_vendor; // CPU vendor - uae_u8 x86_processor; // CPU canonical processor type - uae_u8 x86_brand_id; // CPU BrandID if supported, yield 0 otherwise - uae_u32 x86_hwcap; - uae_u8 x86_model; - uae_u8 x86_mask; - int cpuid_level; // Maximum supported CPUID level, -1=no CPUID - char x86_vendor_id[16]; + uae_u8 x86; // CPU family + uae_u8 x86_vendor; // CPU vendor + uae_u8 x86_processor; // CPU canonical processor type + uae_u8 x86_brand_id; // CPU BrandID if supported, yield 0 otherwise + uae_u32 x86_hwcap; + uae_u8 x86_model; + uae_u8 x86_mask; + int cpuid_level; // Maximum supported CPUID level, -1=no CPUID + char x86_vendor_id[16]; }; struct cpuinfo_x86 cpuinfo; enum { - X86_VENDOR_INTEL = 0, - X86_VENDOR_CYRIX = 1, - X86_VENDOR_AMD = 2, - X86_VENDOR_UMC = 3, - X86_VENDOR_NEXGEN = 4, - X86_VENDOR_CENTAUR = 5, - X86_VENDOR_RISE = 6, - X86_VENDOR_TRANSMETA = 7, - X86_VENDOR_NSC = 8, - X86_VENDOR_UNKNOWN = 0xff + X86_VENDOR_INTEL = 0, + X86_VENDOR_CYRIX = 1, + X86_VENDOR_AMD = 2, + X86_VENDOR_UMC = 3, + X86_VENDOR_NEXGEN = 4, + X86_VENDOR_CENTAUR = 5, + X86_VENDOR_RISE = 6, + X86_VENDOR_TRANSMETA = 7, + X86_VENDOR_NSC = 8, + X86_VENDOR_UNKNOWN = 0xff }; enum { - X86_PROCESSOR_I386, /* 80386 */ - X86_PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */ - X86_PROCESSOR_PENTIUM, - X86_PROCESSOR_PENTIUMPRO, - X86_PROCESSOR_K6, - X86_PROCESSOR_ATHLON, - X86_PROCESSOR_PENTIUM4, - X86_PROCESSOR_K8, - X86_PROCESSOR_max + X86_PROCESSOR_I386, /* 80386 */ + X86_PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */ + X86_PROCESSOR_PENTIUM, + X86_PROCESSOR_PENTIUMPRO, + X86_PROCESSOR_K6, + X86_PROCESSOR_ATHLON, + X86_PROCESSOR_PENTIUM4, + X86_PROCESSOR_K8, + X86_PROCESSOR_max }; static struct ptt { - const int align_loop; - const int align_loop_max_skip; - const int align_jump; - const int align_jump_max_skip; - const int align_func; + const int align_loop; + const int align_loop_max_skip; + const int align_jump; + const int align_jump_max_skip; + const int align_func; } x86_alignments[X86_PROCESSOR_max + 1] = { - { 4, 3, 4, 3, 4 }, - { 16, 15, 16, 15, 16 }, - { 16, 7, 16, 7, 16 }, - { 16, 15, 16, 7, 16 }, - { 32, 7, 32, 7, 32 }, - { 16, 7, 16, 7, 16 }, - { 0, 0, 0, 0, 0 }, - { 16, 7, 16, 7, 16 }, - { 0, 0, 0, 0, 0 } + { 4, 3, 4, 3, 4 }, + { 16, 15, 16, 15, 16 }, + { 16, 7, 16, 7, 16 }, + { 16, 15, 16, 7, 16 }, + { 32, 7, 32, 7, 32 }, + { 16, 7, 16, 7, 16 }, + { 0, 0, 0, 0, 0 }, + { 16, 7, 16, 7, 16 }, + { 0, 0, 0, 0, 0 } }; static void -x86_get_cpu_vendor(struct cpuinfo_x86 *c) + x86_get_cpu_vendor(struct cpuinfo_x86 *c) { char *v = c->x86_vendor_id; @@ -2315,7 +2312,7 @@ x86_get_cpu_vendor(struct cpuinfo_x86 *c) else if (!strcmp(v, "RiseRiseRise")) c->x86_vendor = X86_VENDOR_RISE; else if (!strcmp(v, "GenuineTMx86") || - !strcmp(v, "TransmetaCPU")) + !strcmp(v, "TransmetaCPU")) c->x86_vendor = X86_VENDOR_TRANSMETA; else c->x86_vendor = X86_VENDOR_UNKNOWN; @@ -2323,154 +2320,154 @@ x86_get_cpu_vendor(struct cpuinfo_x86 *c) static void cpuid(uae_u32 op, uae_u32 *eax, uae_u32 *ebx, uae_u32 *ecx, uae_u32 *edx) { - const int CPUID_SPACE = 4096; - uae_u8* cpuid_space = (uae_u8*)cache_alloc(CPUID_SPACE); - static uae_u32 s_op, s_eax, s_ebx, s_ecx, s_edx; - uae_u8* tmp=get_target(); - - s_op = op; - set_target(cpuid_space); - raw_push_l_r(0); /* eax */ - raw_push_l_r(1); /* ecx */ - raw_push_l_r(2); /* edx */ - raw_push_l_r(3); /* ebx */ - raw_mov_l_rm(0,(uintptr)&s_op); - raw_cpuid(0); - raw_mov_l_mr((uintptr)&s_eax,0); - raw_mov_l_mr((uintptr)&s_ebx,3); - raw_mov_l_mr((uintptr)&s_ecx,1); - raw_mov_l_mr((uintptr)&s_edx,2); - raw_pop_l_r(3); - raw_pop_l_r(2); - raw_pop_l_r(1); - raw_pop_l_r(0); - raw_ret(); - set_target(tmp); - - ((compop_func*)cpuid_space)(0); - if (eax != NULL) *eax = s_eax; - if (ebx != NULL) *ebx = s_ebx; - if (ecx != NULL) *ecx = s_ecx; - if (edx != NULL) *edx = s_edx; - - cache_free (cpuid_space); + const int CPUID_SPACE = 4096; + uae_u8* cpuid_space = (uae_u8*)cache_alloc(CPUID_SPACE); + static uae_u32 s_op, s_eax, s_ebx, s_ecx, s_edx; + uae_u8* tmp=get_target(); + + s_op = op; + set_target(cpuid_space); + raw_push_l_r(0); /* eax */ + raw_push_l_r(1); /* ecx */ + raw_push_l_r(2); /* edx */ + raw_push_l_r(3); /* ebx */ + raw_mov_l_rm(0,(uintptr)&s_op); + raw_cpuid(0); + raw_mov_l_mr((uintptr)&s_eax,0); + raw_mov_l_mr((uintptr)&s_ebx,3); + raw_mov_l_mr((uintptr)&s_ecx,1); + raw_mov_l_mr((uintptr)&s_edx,2); + raw_pop_l_r(3); + raw_pop_l_r(2); + raw_pop_l_r(1); + raw_pop_l_r(0); + raw_ret(); + set_target(tmp); + + ((compop_func*)cpuid_space)(0); + if (eax != NULL) *eax = s_eax; + if (ebx != NULL) *ebx = s_ebx; + if (ecx != NULL) *ecx = s_ecx; + if (edx != NULL) *edx = s_edx; + + cache_free (cpuid_space); } static void raw_init_cpu(void) { - struct cpuinfo_x86 *c = &cpuinfo; - uae_u32 xlvl; + struct cpuinfo_x86 *c = &cpuinfo; + uae_u32 xlvl; - /* Defaults */ - c->x86_processor = X86_PROCESSOR_max; - c->x86_vendor = X86_VENDOR_UNKNOWN; - c->cpuid_level = -1; /* CPUID not detected */ - c->x86_model = c->x86_mask = 0; /* So far unknown... */ - c->x86_vendor_id[0] = '\0'; /* Unset */ - c->x86_hwcap = 0; + /* Defaults */ + c->x86_processor = X86_PROCESSOR_max; + c->x86_vendor = X86_VENDOR_UNKNOWN; + c->cpuid_level = -1; /* CPUID not detected */ + c->x86_model = c->x86_mask = 0; /* So far unknown... */ + c->x86_vendor_id[0] = '\0'; /* Unset */ + c->x86_hwcap = 0; - /* Get vendor name */ - c->x86_vendor_id[12] = '\0'; - cpuid(0x00000000, + /* Get vendor name */ + c->x86_vendor_id[12] = '\0'; + cpuid(0x00000000, (uae_u32 *)&c->cpuid_level, (uae_u32 *)&c->x86_vendor_id[0], (uae_u32 *)&c->x86_vendor_id[8], (uae_u32 *)&c->x86_vendor_id[4]); - x86_get_cpu_vendor(c); - - /* Intel-defined flags: level 0x00000001 */ - c->x86_brand_id = 0; - if ( c->cpuid_level >= 0x00000001 ) { - uae_u32 tfms, brand_id; - cpuid(0x00000001, &tfms, &brand_id, NULL, &c->x86_hwcap); - c->x86 = (tfms >> 8) & 15; - c->x86_model = (tfms >> 4) & 15; - c->x86_brand_id = brand_id & 0xff; - if ( (c->x86_vendor == X86_VENDOR_AMD) && - (c->x86 == 0xf)) { - /* AMD Extended Family and Model Values */ - c->x86 += (tfms >> 20) & 0xff; - c->x86_model += (tfms >> 12) & 0xf0; - } - c->x86_mask = tfms & 15; - } else { - /* Have CPUID level 0 only - unheard of */ - c->x86 = 4; - } - - /* AMD-defined flags: level 0x80000001 */ - cpuid(0x80000000, &xlvl, NULL, NULL, NULL); - if ( (xlvl & 0xffff0000) == 0x80000000 ) { - if ( xlvl >= 0x80000001 ) { - uae_u32 features; - cpuid(0x80000001, NULL, NULL, NULL, &features); - if (features & (1 << 29)) { - /* Assume x86-64 if long mode is supported */ - c->x86_processor = X86_PROCESSOR_K8; - } - } - } - - /* Canonicalize processor ID */ - switch (c->x86) { - case 3: - c->x86_processor = X86_PROCESSOR_I386; - break; - case 4: - c->x86_processor = X86_PROCESSOR_I486; - break; - case 5: - if (c->x86_vendor == X86_VENDOR_AMD) - c->x86_processor = X86_PROCESSOR_K6; - else - c->x86_processor = X86_PROCESSOR_PENTIUM; - break; - case 6: - if (c->x86_vendor == X86_VENDOR_AMD) - c->x86_processor = X86_PROCESSOR_ATHLON; - else - c->x86_processor = X86_PROCESSOR_PENTIUMPRO; - break; - case 15: - if (c->x86_vendor == X86_VENDOR_INTEL) { - /* Assume any BrandID >= 8 and family == 15 yields a Pentium 4 */ - if (c->x86_brand_id >= 8) - c->x86_processor = X86_PROCESSOR_PENTIUM4; - } - if (c->x86_vendor == X86_VENDOR_AMD) { - /* Assume an Athlon processor if family == 15 and it was not - detected as an x86-64 so far */ - if (c->x86_processor == X86_PROCESSOR_max) - c->x86_processor = X86_PROCESSOR_ATHLON; - } - break; - } - - /* Have CMOV support? */ - have_cmov = c->x86_hwcap & (1 << 15); + x86_get_cpu_vendor(c); + + /* Intel-defined flags: level 0x00000001 */ + c->x86_brand_id = 0; + if ( c->cpuid_level >= 0x00000001 ) { + uae_u32 tfms, brand_id; + cpuid(0x00000001, &tfms, &brand_id, NULL, &c->x86_hwcap); + c->x86 = (tfms >> 8) & 15; + c->x86_model = (tfms >> 4) & 15; + c->x86_brand_id = brand_id & 0xff; + if ( (c->x86_vendor == X86_VENDOR_AMD) && + (c->x86 == 0xf)) { + /* AMD Extended Family and Model Values */ + c->x86 += (tfms >> 20) & 0xff; + c->x86_model += (tfms >> 12) & 0xf0; + } + c->x86_mask = tfms & 15; + } else { + /* Have CPUID level 0 only - unheard of */ + c->x86 = 4; + } + + /* AMD-defined flags: level 0x80000001 */ + cpuid(0x80000000, &xlvl, NULL, NULL, NULL); + if ( (xlvl & 0xffff0000) == 0x80000000 ) { + if ( xlvl >= 0x80000001 ) { + uae_u32 features; + cpuid(0x80000001, NULL, NULL, NULL, &features); + if (features & (1 << 29)) { + /* Assume x86-64 if long mode is supported */ + c->x86_processor = X86_PROCESSOR_K8; + } + } + } + + /* Canonicalize processor ID */ + switch (c->x86) { + case 3: + c->x86_processor = X86_PROCESSOR_I386; + break; + case 4: + c->x86_processor = X86_PROCESSOR_I486; + break; + case 5: + if (c->x86_vendor == X86_VENDOR_AMD) + c->x86_processor = X86_PROCESSOR_K6; + else + c->x86_processor = X86_PROCESSOR_PENTIUM; + break; + case 6: + if (c->x86_vendor == X86_VENDOR_AMD) + c->x86_processor = X86_PROCESSOR_ATHLON; + else + c->x86_processor = X86_PROCESSOR_PENTIUMPRO; + break; + case 15: + if (c->x86_vendor == X86_VENDOR_INTEL) { + /* Assume any BrandID >= 8 and family == 15 yields a Pentium 4 */ + if (c->x86_brand_id >= 8) + c->x86_processor = X86_PROCESSOR_PENTIUM4; + } + if (c->x86_vendor == X86_VENDOR_AMD) { + /* Assume an Athlon processor if family == 15 and it was not + detected as an x86-64 so far */ + if (c->x86_processor == X86_PROCESSOR_max) + c->x86_processor = X86_PROCESSOR_ATHLON; + } + break; + } + + /* Have CMOV support? */ + have_cmov = c->x86_hwcap & (1 << 15); #if 0 - /* Can the host CPU suffer from partial register stalls? */ - have_rat_stall = (c->x86_vendor == X86_VENDOR_INTEL); - /* It appears that partial register writes are a bad idea even on - AMD K7 cores, even though they are not supposed to have the - dreaded rat stall. Why? Anyway, that's why we lie about it ;-) */ - if (c->x86_processor == X86_PROCESSOR_ATHLON) - have_rat_stall = 1; + /* Can the host CPU suffer from partial register stalls? */ + have_rat_stall = (c->x86_vendor == X86_VENDOR_INTEL); + /* It appears that partial register writes are a bad idea even on + AMD K7 cores, even though they are not supposed to have the + dreaded rat stall. Why? Anyway, that's why we lie about it ;-) */ + if (c->x86_processor == X86_PROCESSOR_ATHLON) + have_rat_stall = 1; #endif - have_rat_stall = 1; + have_rat_stall = 1; - /* Alignments */ - if (tune_alignment) { - align_loops = x86_alignments[c->x86_processor].align_loop; - align_jumps = x86_alignments[c->x86_processor].align_jump; - } - { - TCHAR *s = au (c->x86_vendor_id); - write_log (L"CPUID level=%d, Family=%d, Model=%d, Mask=%d, Vendor=%s [%d]\n", - c->cpuid_level, c->x86, c->x86_model, c->x86_mask, s, c->x86_vendor); - xfree (s); - } + /* Alignments */ + if (tune_alignment) { + align_loops = x86_alignments[c->x86_processor].align_loop; + align_jumps = x86_alignments[c->x86_processor].align_jump; + } + { + TCHAR *s = au (c->x86_vendor_id); + write_log (L"CPUID level=%d, Family=%d, Model=%d, Mask=%d, Vendor=%s [%d]\n", + c->cpuid_level, c->x86, c->x86_model, c->x86_mask, s, c->x86_vendor); + xfree (s); + } } #if 0 @@ -2478,23 +2475,23 @@ static int target_check_bsf(void) { int mismatch = 0; for (int g_ZF = 0; g_ZF <= 1; g_ZF++) { - for (int g_CF = 0; g_CF <= 1; g_CF++) { - for (int g_OF = 0; g_OF <= 1; g_OF++) { - for (int g_SF = 0; g_SF <= 1; g_SF++) { - for (int value = -1; value <= 1; value++) { - unsigned long flags = (g_SF << 7) | (g_OF << 11) | (g_ZF << 6) | g_CF; - unsigned long tmp = value; - __asm__ __volatile__ ("push %0; popf; bsf %1,%1; pushf; pop %0" - : "+r" (flags), "+r" (tmp) : : "cc"); - int OF = (flags >> 11) & 1; - int SF = (flags >> 7) & 1; - int ZF = (flags >> 6) & 1; - int CF = flags & 1; - tmp = (value == 0); - if (ZF != tmp || SF != g_SF || OF != g_OF || CF != g_CF) - mismatch = true; - } - }}}} + for (int g_CF = 0; g_CF <= 1; g_CF++) { + for (int g_OF = 0; g_OF <= 1; g_OF++) { + for (int g_SF = 0; g_SF <= 1; g_SF++) { + for (int value = -1; value <= 1; value++) { + unsigned long flags = (g_SF << 7) | (g_OF << 11) | (g_ZF << 6) | g_CF; + unsigned long tmp = value; + __asm__ __volatile__ ("push %0; popf; bsf %1,%1; pushf; pop %0" + : "+r" (flags), "+r" (tmp) : : "cc"); + int OF = (flags >> 11) & 1; + int SF = (flags >> 7) & 1; + int ZF = (flags >> 6) & 1; + int CF = flags & 1; + tmp = (value == 0); + if (ZF != tmp || SF != g_SF || OF != g_OF || CF != g_CF) + mismatch = true; + } + }}}} if (mismatch) write_log (L"Target CPU defines all flags on BSF instruction\n"); return !mismatch; @@ -2504,1571 +2501,1571 @@ static int target_check_bsf(void) #if 0 /************************************************************************* - * Checking for CPU features * - *************************************************************************/ +* Checking for CPU features * +*************************************************************************/ typedef struct { - uae_u32 eax; - uae_u32 ecx; - uae_u32 edx; - uae_u32 ebx; + uae_u32 eax; + uae_u32 ecx; + uae_u32 edx; + uae_u32 ebx; } x86_regs; /* This could be so much easier if it could make assumptions about the - compiler... */ +compiler... */ static uae_u32 cpuid_ptr; static uae_u32 cpuid_level; static x86_regs cpuid(uae_u32 level) { - x86_regs answer; - uae_u8 *cpuid_space; - void* tmp=get_target(); - - cpuid_ptr=(uae_u32)&answer; - cpuid_level=level; - - cpuid_space = cache_alloc (256); - set_target(cpuid_space); - raw_push_l_r(0); /* eax */ - raw_push_l_r(1); /* ecx */ - raw_push_l_r(2); /* edx */ - raw_push_l_r(3); /* ebx */ - raw_push_l_r(7); /* edi */ - raw_mov_l_rm(0,(uae_u32)&cpuid_level); - raw_cpuid(0); - raw_mov_l_rm(7,(uae_u32)&cpuid_ptr); - raw_mov_l_Rr(7,0,0); - raw_mov_l_Rr(7,1,4); - raw_mov_l_Rr(7,2,8); - raw_mov_l_Rr(7,3,12); - raw_pop_l_r(7); - raw_pop_l_r(3); - raw_pop_l_r(2); - raw_pop_l_r(1); - raw_pop_l_r(0); - raw_ret(); - set_target(tmp); - - ((cpuop_func*)cpuid_space)(0); - cache_free (cpuid_space); - return answer; + x86_regs answer; + uae_u8 *cpuid_space; + void* tmp=get_target(); + + cpuid_ptr=(uae_u32)&answer; + cpuid_level=level; + + cpuid_space = cache_alloc (256); + set_target(cpuid_space); + raw_push_l_r(0); /* eax */ + raw_push_l_r(1); /* ecx */ + raw_push_l_r(2); /* edx */ + raw_push_l_r(3); /* ebx */ + raw_push_l_r(7); /* edi */ + raw_mov_l_rm(0,(uae_u32)&cpuid_level); + raw_cpuid(0); + raw_mov_l_rm(7,(uae_u32)&cpuid_ptr); + raw_mov_l_Rr(7,0,0); + raw_mov_l_Rr(7,1,4); + raw_mov_l_Rr(7,2,8); + raw_mov_l_Rr(7,3,12); + raw_pop_l_r(7); + raw_pop_l_r(3); + raw_pop_l_r(2); + raw_pop_l_r(1); + raw_pop_l_r(0); + raw_ret(); + set_target(tmp); + + ((cpuop_func*)cpuid_space)(0); + cache_free (cpuid_space); + return answer; } static void raw_init_cpu(void) { - x86_regs x; - uae_u32 maxlev; - - x=cpuid(0); - maxlev=x.eax; - write_log (L"Max CPUID level=%d Processor is %c%c%c%c%c%c%c%c%c%c%c%c\n", - maxlev, - x.ebx, - x.ebx>>8, - x.ebx>>16, - x.ebx>>24, - x.edx, - x.edx>>8, - x.edx>>16, - x.edx>>24, - x.ecx, - x.ecx>>8, - x.ecx>>16, - x.ecx>>24 - ); - have_rat_stall=(x.ecx==0x6c65746e); - - if (maxlev>=1) { - x=cpuid(1); - if (x.edx&(1<<15)) - have_cmov=1; - } - have_rat_stall=1; + x86_regs x; + uae_u32 maxlev; + + x=cpuid(0); + maxlev=x.eax; + write_log (L"Max CPUID level=%d Processor is %c%c%c%c%c%c%c%c%c%c%c%c\n", + maxlev, + x.ebx, + x.ebx>>8, + x.ebx>>16, + x.ebx>>24, + x.edx, + x.edx>>8, + x.edx>>16, + x.edx>>24, + x.ecx, + x.ecx>>8, + x.ecx>>16, + x.ecx>>24 + ); + have_rat_stall=(x.ecx==0x6c65746e); + + if (maxlev>=1) { + x=cpuid(1); + if (x.edx&(1<<15)) + have_cmov=1; + } + have_rat_stall=1; #if 0 - if (!have_cmov) - have_rat_stall=0; + if (!have_cmov) + have_rat_stall=0; #endif #if 0 - write_log (L"have_cmov=%d, avoid_cmov=%d, have_rat_stall=%d\n", - have_cmov,currprefs.avoid_cmov,have_rat_stall); - if (currprefs.avoid_cmov) { - write_log (L"Disabling cmov use despite processor claiming to support it!\n"); - have_cmov=0; - } + write_log (L"have_cmov=%d, avoid_cmov=%d, have_rat_stall=%d\n", + have_cmov,currprefs.avoid_cmov,have_rat_stall); + if (currprefs.avoid_cmov) { + write_log (L"Disabling cmov use despite processor claiming to support it!\n"); + have_cmov=0; + } #else - /* Dear Bernie, I don't want to keep around options which are useless, and not - represented in the GUI anymore... Is this okay? */ - write_log (L"have_cmov=%d, have_rat_stall=%d\n", have_cmov, have_rat_stall); + /* Dear Bernie, I don't want to keep around options which are useless, and not + represented in the GUI anymore... Is this okay? */ + write_log (L"have_cmov=%d, have_rat_stall=%d\n", have_cmov, have_rat_stall); #endif #if 0 /* For testing of non-cmov code! */ - have_cmov=0; + have_cmov=0; #endif #if 0 /* It appears that partial register writes are a bad idea even on - AMD K7 cores, even though they are not supposed to have the - dreaded rat stall. Why? Anyway, that's why we lie about it ;-) */ - if (have_cmov) - have_rat_stall=1; + AMD K7 cores, even though they are not supposed to have the + dreaded rat stall. Why? Anyway, that's why we lie about it ;-) */ + if (have_cmov) + have_rat_stall=1; #endif } #endif /************************************************************************* - * FPU stuff * - *************************************************************************/ +* FPU stuff * +*************************************************************************/ STATIC_INLINE void raw_fp_init(void) { - int i; + int i; - for (i=0;i1) { - emit_byte(0x9b); - emit_byte(0xdb); - emit_byte(0xe3); - live.tos=-1; - } + /* using FINIT instead of popping all the entries. + Seems to have side effects --- there is display corruption in + Quake when this is used */ + if (live.tos>1) { + emit_byte(0x9b); + emit_byte(0xdb); + emit_byte(0xe3); + live.tos=-1; + } #endif - while (live.tos>=1) { - emit_byte(0xde); - emit_byte(0xd9); - live.tos-=2; - } - while (live.tos>=0) { - emit_byte(0xdd); - emit_byte(0xd8); - live.tos--; - } - raw_fp_init(); + while (live.tos>=1) { + emit_byte(0xde); + emit_byte(0xd9); + live.tos-=2; + } + while (live.tos>=0) { + emit_byte(0xdd); + emit_byte(0xd8); + live.tos--; + } + raw_fp_init(); } STATIC_INLINE void make_tos(int r) { - int p,q; + int p,q; + + if (live.spos[r]<0) { /* Register not yet on stack */ + emit_byte(0xd9); + emit_byte(0xe8); /* Push '1' on the stack, just to grow it */ + live.tos++; + live.spos[r]=live.tos; + live.onstack[live.tos]=r; + return; + } + /* Register is on stack */ + if (live.tos==live.spos[r]) + return; + p=live.spos[r]; + q=live.onstack[live.tos]; - if (live.spos[r]<0) { /* Register not yet on stack */ emit_byte(0xd9); - emit_byte(0xe8); /* Push '1' on the stack, just to grow it */ - live.tos++; - live.spos[r]=live.tos; + emit_byte(0xc8+live.tos-live.spos[r]); /* exchange it with top of stack */ live.onstack[live.tos]=r; - return; - } - /* Register is on stack */ - if (live.tos==live.spos[r]) - return; - p=live.spos[r]; - q=live.onstack[live.tos]; - - emit_byte(0xd9); - emit_byte(0xc8+live.tos-live.spos[r]); /* exchange it with top of stack */ - live.onstack[live.tos]=r; - live.spos[r]=live.tos; - live.onstack[p]=q; - live.spos[q]=p; + live.spos[r]=live.tos; + live.onstack[p]=q; + live.spos[q]=p; } STATIC_INLINE int stackpos(int r) { - if (live.spos[r]<0) - abort(); - if (live.tos=0) { - /* source is on top of stack, and we already have the dest */ - int dd=stackpos(d); - emit_byte(0xdd); - emit_byte(0xd0+dd); - } - else { - emit_byte(0xd9); - emit_byte(0xc0+ds); /* duplicate source on tos */ - tos_make(d); /* store to destination, pop if necessary */ - } + ds=stackpos(s); + if (ds==0 && live.spos[d]>=0) { + /* source is on top of stack, and we already have the dest */ + int dd=stackpos(d); + emit_byte(0xdd); + emit_byte(0xd0+dd); + } + else { + emit_byte(0xd9); + emit_byte(0xc0+ds); /* duplicate source on tos */ + tos_make(d); /* store to destination, pop if necessary */ + } } LENDFUNC(NONE,NONE,2,raw_fmov_rr,(FW d, FR s)) -LOWFUNC(NONE,READ,2,raw_fldcw_m_indexed,(R4 index, IMM base)) + LOWFUNC(NONE,READ,2,raw_fldcw_m_indexed,(R4 index, IMM base)) { - emit_byte(0xd9); - emit_byte(0xa8+index); - emit_long(base); + emit_byte(0xd9); + emit_byte(0xa8+index); + emit_long(base); } LENDFUNC(NONE,READ,2,raw_fldcw_m_indexed,(R4 index, IMM base)) -LOWFUNC(NONE,NONE,2,raw_fsqrt_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fsqrt_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xfa); /* fsqrt sqrt(x) */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xfa); /* fsqrt y=sqrt(x) */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xfa); /* fsqrt sqrt(x) */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xfa); /* fsqrt y=sqrt(x) */ + } } LENDFUNC(NONE,NONE,2,raw_fsqrt_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fabs_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fabs_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xe1); /* fabs abs(x) */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xe1); /* fabs y=abs(x) */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xe1); /* fabs abs(x) */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xe1); /* fabs y=abs(x) */ + } } LENDFUNC(NONE,NONE,2,raw_fabs_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_frndint_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_frndint_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x) */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xfc); /* frndint y=int(x) */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x) */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xfc); /* frndint y=int(x) */ + } } LENDFUNC(NONE,NONE,2,raw_frndint_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fgetexp_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fgetexp_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xf4); /* fxtract exp push man */ - emit_byte(0xdd); - emit_byte(0xd8); /* fstp just pop man */ - tos_make(d); /* store exp to destination */ - } - else { - make_tos(d); /* tos=x=y */ - emit_byte(0xd9); - emit_byte(0xf4); /* fxtract exp push man */ - emit_byte(0xdd); - emit_byte(0xd8); /* fstp just pop man */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xf4); /* fxtract exp push man */ + emit_byte(0xdd); + emit_byte(0xd8); /* fstp just pop man */ + tos_make(d); /* store exp to destination */ + } + else { + make_tos(d); /* tos=x=y */ + emit_byte(0xd9); + emit_byte(0xf4); /* fxtract exp push man */ + emit_byte(0xdd); + emit_byte(0xd8); /* fstp just pop man */ + } } LENDFUNC(NONE,NONE,2,raw_fgetexp_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fgetman_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fgetman_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xf4); /* fxtract exp push man */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy man up & pop */ - tos_make(d); /* store man to destination */ - } - else { - make_tos(d); /* tos=x=y */ - emit_byte(0xd9); - emit_byte(0xf4); /* fxtract exp push man */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy man up & pop */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xf4); /* fxtract exp push man */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy man up & pop */ + tos_make(d); /* store man to destination */ + } + else { + make_tos(d); /* tos=x=y */ + emit_byte(0xd9); + emit_byte(0xf4); /* fxtract exp push man */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy man up & pop */ + } } LENDFUNC(NONE,NONE,2,raw_fgetman_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fsin_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fsin_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xfe); /* fsin sin(x) */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xfe); /* fsin y=sin(x) */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xfe); /* fsin sin(x) */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xfe); /* fsin y=sin(x) */ + } } LENDFUNC(NONE,NONE,2,raw_fsin_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fcos_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fcos_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xff); /* fcos cos(x) */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xff); /* fcos y=cos(x) */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xff); /* fcos cos(x) */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xff); /* fcos y=cos(x) */ + } } LENDFUNC(NONE,NONE,2,raw_fcos_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_ftan_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_ftan_rr,(FW d, FR s)) { - int ds; + int ds; - if (d!=s) { - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xf2); /* fptan tan(x)=y/1.0 */ - emit_byte(0xdd); - emit_byte(0xd8); /* fstp pop 1.0 */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); - emit_byte(0xd9); - emit_byte(0xf2); /* fptan tan(x)=y/1.0 */ - emit_byte(0xdd); - emit_byte(0xd8); /* fstp pop 1.0 */ - } + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xf2); /* fptan tan(x)=y/1.0 */ + emit_byte(0xdd); + emit_byte(0xd8); /* fstp pop 1.0 */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xf2); /* fptan tan(x)=y/1.0 */ + emit_byte(0xdd); + emit_byte(0xd8); /* fstp pop 1.0 */ + } } LENDFUNC(NONE,NONE,2,raw_ftan_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,3,raw_fsincos_rr,(FW d, FW c, FR s)) -{ - int ds; - - if (s==d) { - //write_log (L"FSINCOS src = dest\n"); - make_tos(s); - emit_byte(0xd9); - emit_byte(0xfb); /* fsincos sin(x) push cos(x) */ - tos_make(c); /* store cos(x) to c */ - return; - } - - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xfb); /* fsincos sin(x) push cos(x) */ - if (live.spos[c]<0) { - if (live.spos[d]<0) { /* occupy both regs directly */ - live.tos++; - live.spos[d]=live.tos; - live.onstack[live.tos]=d; /* sin(x) comes first */ - live.tos++; - live.spos[c]=live.tos; - live.onstack[live.tos]=c; + LOWFUNC(NONE,NONE,3,raw_fsincos_rr,(FW d, FW c, FR s)) +{ + int ds; + + if (s==d) { + //write_log (L"FSINCOS src = dest\n"); + make_tos(s); + emit_byte(0xd9); + emit_byte(0xfb); /* fsincos sin(x) push cos(x) */ + tos_make(c); /* store cos(x) to c */ + return; + } + + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd9); + emit_byte(0xfb); /* fsincos sin(x) push cos(x) */ + if (live.spos[c]<0) { + if (live.spos[d]<0) { /* occupy both regs directly */ + live.tos++; + live.spos[d]=live.tos; + live.onstack[live.tos]=d; /* sin(x) comes first */ + live.tos++; + live.spos[c]=live.tos; + live.onstack[live.tos]=c; + } + else { + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap cos(x) with sin(x) */ + emit_byte(0xdd); /* store sin(x) to d & pop */ + emit_byte(0xd8+(live.tos+2)-live.spos[d]); + live.tos++; /* occupy a reg for cos(x) here */ + live.spos[c]=live.tos; + live.onstack[live.tos]=c; + } } else { - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap cos(x) with sin(x) */ - emit_byte(0xdd); /* store sin(x) to d & pop */ - emit_byte(0xd8+(live.tos+2)-live.spos[d]); - live.tos++; /* occupy a reg for cos(x) here */ - live.spos[c]=live.tos; - live.onstack[live.tos]=c; - } - } - else { - emit_byte(0xdd); /* store cos(x) to c & pop */ - emit_byte(0xd8+(live.tos+2)-live.spos[c]); - tos_make(d); /* store sin(x) to destination */ - } + emit_byte(0xdd); /* store cos(x) to c & pop */ + emit_byte(0xd8+(live.tos+2)-live.spos[c]); + tos_make(d); /* store sin(x) to destination */ + } } LENDFUNC(NONE,NONE,3,raw_fsincos_rr,(FW d, FW c, FR s)) -float one=1; + float one=1; LOWFUNC(NONE,NONE,2,raw_fscale_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { - //write_log (L"fscale found x in TOS-1 and y in TOS\n"); - emit_byte(0xd9); - emit_byte(0xfd); /* fscale y*(2^x) */ - } - else { - make_tos(s); /* tos=x */ - ds=stackpos(d); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld y */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale y*(2^x) */ - tos_make(d); /* store y=y*(2^x) */ - } + if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { + //write_log (L"fscale found x in TOS-1 and y in TOS\n"); + emit_byte(0xd9); + emit_byte(0xfd); /* fscale y*(2^x) */ + } + else { + make_tos(s); /* tos=x */ + ds=stackpos(d); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld y */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale y*(2^x) */ + tos_make(d); /* store y=y*(2^x) */ + } } LENDFUNC(NONE,NONE,2,raw_fscale_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s)) -{ - int ds; - - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x) */ - emit_byte(0xd9); - emit_byte(0xc1+ds); /* fld x again */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub frac(x) = x - int(x) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - tos_make(d); /* store y=2^x */ -} -LENDFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s)) - -LOWFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { ds=stackpos(s); emit_byte(0xd9); emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xea); /* fldl2e log2(e) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy up */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap top two elements */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - if (s!=d) - tos_make(d); /* store y=e^x */ -} -LENDFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s)) - -LOWFUNC(NONE,NONE,2,raw_fetoxM1_rr,(FW d, FR s)) -{ - int ds; - - if (s==d) - make_tos(s); - else { - ds=stackpos(s); emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xea); /* fldl2e log2(e) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy up */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap top two elements */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale ((2^frac(x))-1)*2^int(x*log2(e)) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - if (s!=d) - tos_make(d); /* store y=(e^x)-1 */ + emit_byte(0xfc); /* frndint int(x) */ + emit_byte(0xd9); + emit_byte(0xc1+ds); /* fld x again */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub frac(x) = x - int(x) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + tos_make(d); /* store y=2^x */ } -LENDFUNC(NONE,NONE,2,raw_fetoxM1_rr,(FW d, FR s)) +LENDFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_ftentox_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xe9); /* fldl2t log2(10) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(10) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy up */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(10)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap top two elements */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(10) - int(x*log2(10)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(10)) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - if (s!=d) - tos_make(d); /* store y=10^x */ + emit_byte(0xea); /* fldl2e log2(e) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy up */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap top two elements */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + if (s!=d) + tos_make(d); /* store y=e^x */ +} +LENDFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s)) + + LOWFUNC(NONE,NONE,2,raw_fetoxM1_rr,(FW d, FR s)) +{ + int ds; + + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } + emit_byte(0xd9); + emit_byte(0xea); /* fldl2e log2(e) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy up */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap top two elements */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale ((2^frac(x))-1)*2^int(x*log2(e)) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + if (s!=d) + tos_make(d); /* store y=(e^x)-1 */ +} +LENDFUNC(NONE,NONE,2,raw_fetoxM1_rr,(FW d, FR s)) + + LOWFUNC(NONE,NONE,2,raw_ftentox_rr,(FW d, FR s)) +{ + int ds; + + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } + emit_byte(0xd9); + emit_byte(0xe9); /* fldl2t log2(10) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(10) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy up */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(10)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap top two elements */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(10) - int(x*log2(10)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(10)) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + if (s!=d) + tos_make(d); /* store y=10^x */ } LENDFUNC(NONE,NONE,2,raw_ftentox_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_flog2_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_flog2_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xe8); /* fld1 1 */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap 1 with x */ - emit_byte(0xd9); - emit_byte(0xf1); /* fyl2x 1*log2(x) */ - if (s!=d) - tos_make(d); /* store y=log2(x) */ + emit_byte(0xe8); /* fld1 1 */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap 1 with x */ + emit_byte(0xd9); + emit_byte(0xf1); /* fyl2x 1*log2(x) */ + if (s!=d) + tos_make(d); /* store y=log2(x) */ } LENDFUNC(NONE,NONE,2,raw_flog2_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_flogN_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_flogN_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xed); /* fldln2 logN(2) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap logN(2) with x */ - emit_byte(0xd9); - emit_byte(0xf1); /* fyl2x logN(2)*log2(x) */ - if (s!=d) - tos_make(d); /* store y=logN(x) */ + emit_byte(0xed); /* fldln2 logN(2) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap logN(2) with x */ + emit_byte(0xd9); + emit_byte(0xf1); /* fyl2x logN(2)*log2(x) */ + if (s!=d) + tos_make(d); /* store y=logN(x) */ } LENDFUNC(NONE,NONE,2,raw_flogN_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_flogNP1_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_flogNP1_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xed); /* fldln2 logN(2) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap logN(2) with x */ - emit_byte(0xd9); - emit_byte(0xf9); /* fyl2xp1 logN(2)*log2(x+1) */ - if (s!=d) - tos_make(d); /* store y=logN(x+1) */ + emit_byte(0xed); /* fldln2 logN(2) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap logN(2) with x */ + emit_byte(0xd9); + emit_byte(0xf9); /* fyl2xp1 logN(2)*log2(x+1) */ + if (s!=d) + tos_make(d); /* store y=logN(x+1) */ } LENDFUNC(NONE,NONE,2,raw_flogNP1_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_flog10_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_flog10_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xec); /* fldlg2 log10(2) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap log10(2) with x */ - emit_byte(0xd9); - emit_byte(0xf1); /* fyl2x log10(2)*log2(x) */ - if (s!=d) - tos_make(d); /* store y=log10(x) */ + emit_byte(0xec); /* fldlg2 log10(2) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap log10(2) with x */ + emit_byte(0xd9); + emit_byte(0xf1); /* fyl2x log10(2)*log2(x) */ + if (s!=d) + tos_make(d); /* store y=log10(x) */ } LENDFUNC(NONE,NONE,2,raw_flog10_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fasin_rr,(FW d, FR s)) -{ - int ds; - - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd8); - emit_byte(0xc8); /* fmul x*x */ - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xde); - emit_byte(0xe1); /* fsubrp 1 - (x^2) */ - emit_byte(0xd9); - emit_byte(0xfa); /* fsqrt sqrt(1-(x^2)) */ - emit_byte(0xd9); - emit_byte(0xc1+ds); /* fld x again */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap x with sqrt(1-(x^2)) */ - emit_byte(0xd9); - emit_byte(0xf3); /* fpatan atan(x/sqrt(1-(x^2))) & pop */ - tos_make(d); /* store y=asin(x) */ + LOWFUNC(NONE,NONE,2,raw_fasin_rr,(FW d, FR s)) +{ + int ds; + + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd8); + emit_byte(0xc8); /* fmul x*x */ + emit_byte(0xd9); + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xde); + emit_byte(0xe1); /* fsubrp 1 - (x^2) */ + emit_byte(0xd9); + emit_byte(0xfa); /* fsqrt sqrt(1-(x^2)) */ + emit_byte(0xd9); + emit_byte(0xc1+ds); /* fld x again */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap x with sqrt(1-(x^2)) */ + emit_byte(0xd9); + emit_byte(0xf3); /* fpatan atan(x/sqrt(1-(x^2))) & pop */ + tos_make(d); /* store y=asin(x) */ } LENDFUNC(NONE,NONE,2,raw_fasin_rr,(FW d, FR s)) -static uae_u32 pihalf[] = {0x2168c234, 0xc90fdaa2, 0x3fff}; // LSB=0 to get acos(1)=0 + static uae_u32 pihalf[] = {0x2168c234, 0xc90fdaa2, 0x3fff}; // LSB=0 to get acos(1)=0 LOWFUNC(NONE,NONE,2,raw_facos_rr,(FW d, FR s)) { - int ds; - - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd8); - emit_byte(0xc8); /* fmul x*x */ - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xde); - emit_byte(0xe1); /* fsubrp 1 - (x^2) */ - emit_byte(0xd9); - emit_byte(0xfa); /* fsqrt sqrt(1-(x^2)) */ - emit_byte(0xd9); - emit_byte(0xc1+ds); /* fld x again */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap x with sqrt(1-(x^2)) */ - emit_byte(0xd9); - emit_byte(0xf3); /* fpatan atan(x/sqrt(1-(x^2))) & pop */ - emit_byte(0xdb); - emit_byte(0x2d); - emit_long((uae_u32)&pihalf); /* fld load pi/2 from pihalf */ - emit_byte(0xde); - emit_byte(0xe1); /* fsubrp pi/2 - asin(x) & pop */ - tos_make(d); /* store y=acos(x) */ + int ds; + + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + emit_byte(0xd8); + emit_byte(0xc8); /* fmul x*x */ + emit_byte(0xd9); + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xde); + emit_byte(0xe1); /* fsubrp 1 - (x^2) */ + emit_byte(0xd9); + emit_byte(0xfa); /* fsqrt sqrt(1-(x^2)) */ + emit_byte(0xd9); + emit_byte(0xc1+ds); /* fld x again */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap x with sqrt(1-(x^2)) */ + emit_byte(0xd9); + emit_byte(0xf3); /* fpatan atan(x/sqrt(1-(x^2))) & pop */ + emit_byte(0xdb); + emit_byte(0x2d); + emit_long((uae_u32)&pihalf); /* fld load pi/2 from pihalf */ + emit_byte(0xde); + emit_byte(0xe1); /* fsubrp pi/2 - asin(x) & pop */ + tos_make(d); /* store y=acos(x) */ } LENDFUNC(NONE,NONE,2,raw_facos_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fatan_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fatan_rr,(FW d, FR s)) { - int ds; + int ds; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xd9); - emit_byte(0xf3); /* fpatan atan(x)/1 & pop*/ - if (s!=d) - tos_make(d); /* store y=atan(x) */ + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xd9); + emit_byte(0xf3); /* fpatan atan(x)/1 & pop*/ + if (s!=d) + tos_make(d); /* store y=atan(x) */ } LENDFUNC(NONE,NONE,2,raw_fatan_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fatanh_rr,(FW d, FR s)) -{ - int ds; - - ds=stackpos(s); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xdc); - emit_byte(0xc1); /* fadd 1 + x */ - emit_byte(0xd8); - emit_byte(0xe2+ds); /* fsub 1 - x */ - emit_byte(0xde); - emit_byte(0xf9); /* fdivp (1+x)/(1-x) */ - emit_byte(0xd9); - emit_byte(0xed); /* fldl2e logN(2) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap logN(2) with (1+x)/(1-x) */ - emit_byte(0xd9); - emit_byte(0xf1); /* fyl2x logN(2)*log2((1+x)/(1-x)) pop */ - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -1.0 */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale logN((1+x)/(1-x)) * 2^(-1) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - tos_make(d); /* store y=atanh(x) */ -} -LENDFUNC(NONE,NONE,2,raw_fatanh_rr,(FW d, FR s)) - -LOWFUNC(NONE,NONE,2,raw_fsinh_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fatanh_rr,(FW d, FR s)) { - int ds,tr; + int ds; - tr=live.onstack[live.tos+3]; - if (s==d) - make_tos(s); - else { ds=stackpos(s); emit_byte(0xd9); emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xea); /* fldl2e log2(e) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - if (tr>=0) { - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap with temp-reg */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0xf4); /* add -12 to esp */ - emit_byte(0xdb); - emit_byte(0x3c); - emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ - } - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xc0); /* fld -x*log2(e) again */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap e^-x with x*log2(e) in tr */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy e^x & pop */ - if (tr>=0) { - emit_byte(0xdb); - emit_byte(0x2c); - emit_byte(0x24); /* fld load temp-reg from [esp] */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0x0c); /* add +12 to esp */ emit_byte(0xd9); - emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ - emit_byte(0xde); - emit_byte(0xe9); /* fsubp (e^x)-(e^-x) */ - } - else { + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xdc); + emit_byte(0xc1); /* fadd 1 + x */ + emit_byte(0xd8); + emit_byte(0xe2+ds); /* fsub 1 - x */ emit_byte(0xde); - emit_byte(0xe1); /* fsubrp (e^x)-(e^-x) */ - } - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -1.0 */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale ((e^x)-(e^-x))/2 */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - if (s!=d) - tos_make(d); /* store y=sinh(x) */ + emit_byte(0xf9); /* fdivp (1+x)/(1-x) */ + emit_byte(0xd9); + emit_byte(0xed); /* fldl2e logN(2) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap logN(2) with (1+x)/(1-x) */ + emit_byte(0xd9); + emit_byte(0xf1); /* fyl2x logN(2)*log2((1+x)/(1-x)) pop */ + emit_byte(0xd9); + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xd9); + emit_byte(0xe0); /* fchs -1.0 */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale logN((1+x)/(1-x)) * 2^(-1) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + tos_make(d); /* store y=atanh(x) */ } -LENDFUNC(NONE,NONE,2,raw_fsinh_rr,(FW d, FR s)) +LENDFUNC(NONE,NONE,2,raw_fatanh_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fcosh_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fsinh_rr,(FW d, FR s)) { - int ds,tr; + int ds,tr; - tr=live.onstack[live.tos+3]; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + tr=live.onstack[live.tos+3]; + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xea); /* fldl2e log2(e) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - if (tr>=0) { - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap with temp-reg */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0xf4); /* add -12 to esp */ - emit_byte(0xdb); - emit_byte(0x3c); - emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ - } - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xc0); /* fld -x*log2(e) again */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap e^-x with x*log2(e) in tr */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy e^x & pop */ - if (tr>=0) { - emit_byte(0xdb); - emit_byte(0x2c); - emit_byte(0x24); /* fld load temp-reg from [esp] */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0x0c); /* add +12 to esp */ + emit_byte(0xea); /* fldl2e log2(e) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + if (tr>=0) { + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap with temp-reg */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0xf4); /* add -12 to esp */ + emit_byte(0xdb); + emit_byte(0x3c); + emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ + } + emit_byte(0xd9); + emit_byte(0xe0); /* fchs -x*log2(e) */ + emit_byte(0xd9); + emit_byte(0xc0); /* fld -x*log2(e) again */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ emit_byte(0xd9); - emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ - } - emit_byte(0xde); - emit_byte(0xc1); /* faddp (e^x)+(e^-x) */ - emit_byte(0xd9); - emit_byte(0xe8); /* fld 1.0 */ - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -1.0 */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale ((e^x)+(e^-x))/2 */ - emit_byte(0xdd); - emit_byte(0xd9); /* fstp copy & pop */ - if (s!=d) - tos_make(d); /* store y=cosh(x) */ + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap e^-x with x*log2(e) in tr */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy e^x & pop */ + if (tr>=0) { + emit_byte(0xdb); + emit_byte(0x2c); + emit_byte(0x24); /* fld load temp-reg from [esp] */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0x0c); /* add +12 to esp */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ + emit_byte(0xde); + emit_byte(0xe9); /* fsubp (e^x)-(e^-x) */ + } + else { + emit_byte(0xde); + emit_byte(0xe1); /* fsubrp (e^x)-(e^-x) */ + } + emit_byte(0xd9); + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xd9); + emit_byte(0xe0); /* fchs -1.0 */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale ((e^x)-(e^-x))/2 */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + if (s!=d) + tos_make(d); /* store y=sinh(x) */ } -LENDFUNC(NONE,NONE,2,raw_fcosh_rr,(FW d, FR s)) +LENDFUNC(NONE,NONE,2,raw_fsinh_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_ftanh_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fcosh_rr,(FW d, FR s)) { - int ds,tr; + int ds,tr; - tr=live.onstack[live.tos+3]; - if (s==d) - make_tos(s); - else { - ds=stackpos(s); + tr=live.onstack[live.tos+3]; + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld x */ - } - emit_byte(0xd9); - emit_byte(0xea); /* fldl2e log2(e) */ - emit_byte(0xd8); - emit_byte(0xc9); /* fmul x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - if (tr>=0) { - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap with temp-reg */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0xf4); /* add -12 to esp */ - emit_byte(0xdb); - emit_byte(0x3c); - emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ - } - emit_byte(0xd9); - emit_byte(0xe0); /* fchs -x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xc0); /* fld -x*log2(e) again */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap e^-x with x*log2(e) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy x*log2(e) */ - emit_byte(0xd9); - emit_byte(0xfc); /* frndint int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xc9); /* fxch swap */ - emit_byte(0xd8); - emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ - emit_byte(0xd9); - emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ - emit_byte(0xd8); - emit_byte(0x05); - emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ - emit_byte(0xd9); - emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ - emit_byte(0xdd); - emit_byte(0xd1); /* fst copy e^x */ - emit_byte(0xd8); - emit_byte(0xc2); /* fadd (e^x)+(e^-x) */ - emit_byte(0xd9); - emit_byte(0xca); /* fxch swap with e^-x */ - emit_byte(0xde); - emit_byte(0xe9); /* fsubp (e^x)-(e^-x) */ - if (tr>=0) { - emit_byte(0xdb); - emit_byte(0x2c); - emit_byte(0x24); /* fld load temp-reg from [esp] */ - emit_byte(0x83); - emit_byte(0xc4); - emit_byte(0x0c); /* add +12 to esp */ + emit_byte(0xea); /* fldl2e log2(e) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + if (tr>=0) { + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap with temp-reg */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0xf4); /* add -12 to esp */ + emit_byte(0xdb); + emit_byte(0x3c); + emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ + } emit_byte(0xd9); - emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ - emit_byte(0xde); - emit_byte(0xf9); /* fdivp ((e^x)-(e^-x))/((e^x)+(e^-x)) */ - } - else { + emit_byte(0xe0); /* fchs -x*log2(e) */ + emit_byte(0xd9); + emit_byte(0xc0); /* fld -x*log2(e) again */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap e^-x with x*log2(e) in tr */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy e^x & pop */ + if (tr>=0) { + emit_byte(0xdb); + emit_byte(0x2c); + emit_byte(0x24); /* fld load temp-reg from [esp] */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0x0c); /* add +12 to esp */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ + } emit_byte(0xde); - emit_byte(0xf1); /* fdivrp ((e^x)-(e^-x))/((e^x)+(e^-x)) */ - } - if (s!=d) - tos_make(d); /* store y=tanh(x) */ + emit_byte(0xc1); /* faddp (e^x)+(e^-x) */ + emit_byte(0xd9); + emit_byte(0xe8); /* fld 1.0 */ + emit_byte(0xd9); + emit_byte(0xe0); /* fchs -1.0 */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale ((e^x)+(e^-x))/2 */ + emit_byte(0xdd); + emit_byte(0xd9); /* fstp copy & pop */ + if (s!=d) + tos_make(d); /* store y=cosh(x) */ } -LENDFUNC(NONE,NONE,2,raw_ftanh_rr,(FW d, FR s)) +LENDFUNC(NONE,NONE,2,raw_fcosh_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fneg_rr,(FW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_ftanh_rr,(FW d, FR s)) { - int ds; + int ds,tr; - if (d!=s) { - ds=stackpos(s); + tr=live.onstack[live.tos+3]; + if (s==d) + make_tos(s); + else { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld x */ + } + emit_byte(0xd9); + emit_byte(0xea); /* fldl2e log2(e) */ + emit_byte(0xd8); + emit_byte(0xc9); /* fmul x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + if (tr>=0) { + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap with temp-reg */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0xf4); /* add -12 to esp */ + emit_byte(0xdb); + emit_byte(0x3c); + emit_byte(0x24); /* fstp store temp-reg to [esp] & pop */ + } emit_byte(0xd9); - emit_byte(0xc0+ds); /* duplicate source */ + emit_byte(0xe0); /* fchs -x*log2(e) */ emit_byte(0xd9); - emit_byte(0xe0); /* take fchs */ - tos_make(d); /* store to destination */ - } - else { - make_tos(d); + emit_byte(0xc0); /* fld -x*log2(e) again */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub -x*log2(e) - int(-x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ emit_byte(0xd9); - emit_byte(0xe0); /* take fchs */ - } + emit_byte(0xca); /* fxch swap e^-x with x*log2(e) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy x*log2(e) */ + emit_byte(0xd9); + emit_byte(0xfc); /* frndint int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xc9); /* fxch swap */ + emit_byte(0xd8); + emit_byte(0xe1); /* fsub x*log2(e) - int(x*log2(e)) */ + emit_byte(0xd9); + emit_byte(0xf0); /* f2xm1 (2^frac(x))-1 */ + emit_byte(0xd8); + emit_byte(0x05); + emit_long((uae_u32)&one); /* fadd (2^frac(x))-1 + 1 */ + emit_byte(0xd9); + emit_byte(0xfd); /* fscale (2^frac(x))*2^int(x*log2(e)) */ + emit_byte(0xdd); + emit_byte(0xd1); /* fst copy e^x */ + emit_byte(0xd8); + emit_byte(0xc2); /* fadd (e^x)+(e^-x) */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap with e^-x */ + emit_byte(0xde); + emit_byte(0xe9); /* fsubp (e^x)-(e^-x) */ + if (tr>=0) { + emit_byte(0xdb); + emit_byte(0x2c); + emit_byte(0x24); /* fld load temp-reg from [esp] */ + emit_byte(0x83); + emit_byte(0xc4); + emit_byte(0x0c); /* add +12 to esp */ + emit_byte(0xd9); + emit_byte(0xca); /* fxch swap temp-reg with e^-x in tr */ + emit_byte(0xde); + emit_byte(0xf9); /* fdivp ((e^x)-(e^-x))/((e^x)+(e^-x)) */ + } + else { + emit_byte(0xde); + emit_byte(0xf1); /* fdivrp ((e^x)-(e^-x))/((e^x)+(e^-x)) */ + } + if (s!=d) + tos_make(d); /* store y=tanh(x) */ +} +LENDFUNC(NONE,NONE,2,raw_ftanh_rr,(FW d, FR s)) + + LOWFUNC(NONE,NONE,2,raw_fneg_rr,(FW d, FR s)) +{ + int ds; + + if (d!=s) { + ds=stackpos(s); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* duplicate source */ + emit_byte(0xd9); + emit_byte(0xe0); /* take fchs */ + tos_make(d); /* store to destination */ + } + else { + make_tos(d); + emit_byte(0xd9); + emit_byte(0xe0); /* take fchs */ + } } LENDFUNC(NONE,NONE,2,raw_fneg_rr,(FW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fadd_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fadd_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[s]==live.tos) { - /* Source is on top of stack */ - ds=stackpos(d); - emit_byte(0xdc); - emit_byte(0xc0+ds); /* add source to dest*/ - } - else { - make_tos(d); - ds=stackpos(s); + if (live.spos[s]==live.tos) { + /* Source is on top of stack */ + ds=stackpos(d); + emit_byte(0xdc); + emit_byte(0xc0+ds); /* add source to dest*/ + } + else { + make_tos(d); + ds=stackpos(s); - emit_byte(0xd8); - emit_byte(0xc0+ds); /* add source to dest*/ - } + emit_byte(0xd8); + emit_byte(0xc0+ds); /* add source to dest*/ + } } LENDFUNC(NONE,NONE,2,raw_fadd_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fsub_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fsub_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[s]==live.tos) { - /* Source is on top of stack */ - ds=stackpos(d); - emit_byte(0xdc); - emit_byte(0xe8+ds); /* sub source from dest*/ - } - else { - make_tos(d); - ds=stackpos(s); + if (live.spos[s]==live.tos) { + /* Source is on top of stack */ + ds=stackpos(d); + emit_byte(0xdc); + emit_byte(0xe8+ds); /* sub source from dest*/ + } + else { + make_tos(d); + ds=stackpos(s); - emit_byte(0xd8); - emit_byte(0xe0+ds); /* sub src from dest */ - } + emit_byte(0xd8); + emit_byte(0xe0+ds); /* sub src from dest */ + } } LENDFUNC(NONE,NONE,2,raw_fsub_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fcmp_rr,(FR d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fcmp_rr,(FR d, FR s)) { - int ds; + int ds; - make_tos(d); - ds=stackpos(s); + make_tos(d); + ds=stackpos(s); - emit_byte(0xdd); - emit_byte(0xe0+ds); /* cmp dest with source*/ + emit_byte(0xdd); + emit_byte(0xe0+ds); /* cmp dest with source*/ } LENDFUNC(NONE,NONE,2,raw_fcmp_rr,(FR d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fmul_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fmul_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[s]==live.tos) { - /* Source is on top of stack */ - ds=stackpos(d); - emit_byte(0xdc); - emit_byte(0xc8+ds); /* mul dest by source*/ - } - else { - make_tos(d); - ds=stackpos(s); + if (live.spos[s]==live.tos) { + /* Source is on top of stack */ + ds=stackpos(d); + emit_byte(0xdc); + emit_byte(0xc8+ds); /* mul dest by source*/ + } + else { + make_tos(d); + ds=stackpos(s); - emit_byte(0xd8); - emit_byte(0xc8+ds); /* mul dest by source*/ - } + emit_byte(0xd8); + emit_byte(0xc8+ds); /* mul dest by source*/ + } } LENDFUNC(NONE,NONE,2,raw_fmul_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_fdiv_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_fdiv_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[s]==live.tos) { - /* Source is on top of stack */ - ds=stackpos(d); - emit_byte(0xdc); - emit_byte(0xf8+ds); /* div dest by source */ - } - else { - make_tos(d); - ds=stackpos(s); + if (live.spos[s]==live.tos) { + /* Source is on top of stack */ + ds=stackpos(d); + emit_byte(0xdc); + emit_byte(0xf8+ds); /* div dest by source */ + } + else { + make_tos(d); + ds=stackpos(s); - emit_byte(0xd8); - emit_byte(0xf0+ds); /* div dest by source*/ - } + emit_byte(0xd8); + emit_byte(0xf0+ds); /* div dest by source*/ + } } LENDFUNC(NONE,NONE,2,raw_fdiv_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_frem_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_frem_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { - //write_log (L"frem found x in TOS-1 and y in TOS\n"); - emit_byte(0xd9); - emit_byte(0xf8); /* fprem rem(y/x) */ - } - else { - make_tos(s); /* tos=x */ - ds=stackpos(d); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld y */ - emit_byte(0xd9); - emit_byte(0xf8); /* fprem rem(y/x) */ - tos_make(d); /* store y=rem(y/x) */ - } + if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { + //write_log (L"frem found x in TOS-1 and y in TOS\n"); + emit_byte(0xd9); + emit_byte(0xf8); /* fprem rem(y/x) */ + } + else { + make_tos(s); /* tos=x */ + ds=stackpos(d); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld y */ + emit_byte(0xd9); + emit_byte(0xf8); /* fprem rem(y/x) */ + tos_make(d); /* store y=rem(y/x) */ + } } LENDFUNC(NONE,NONE,2,raw_frem_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,2,raw_frem1_rr,(FRW d, FR s)) + LOWFUNC(NONE,NONE,2,raw_frem1_rr,(FRW d, FR s)) { - int ds; + int ds; - if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { - //write_log (L"frem1 found x in TOS-1 and y in TOS\n"); - emit_byte(0xd9); - emit_byte(0xf5); /* fprem1 rem1(y/x) */ - } - else { - make_tos(s); /* tos=x */ - ds=stackpos(d); - emit_byte(0xd9); - emit_byte(0xc0+ds); /* fld y */ - emit_byte(0xd9); - emit_byte(0xf5); /* fprem1 rem1(y/x) */ - tos_make(d); /* store y=rem(y/x) */ - } + if (live.spos[d]==live.tos && live.spos[s]==live.tos-1) { + //write_log (L"frem1 found x in TOS-1 and y in TOS\n"); + emit_byte(0xd9); + emit_byte(0xf5); /* fprem1 rem1(y/x) */ + } + else { + make_tos(s); /* tos=x */ + ds=stackpos(d); + emit_byte(0xd9); + emit_byte(0xc0+ds); /* fld y */ + emit_byte(0xd9); + emit_byte(0xf5); /* fprem1 rem1(y/x) */ + tos_make(d); /* store y=rem(y/x) */ + } } LENDFUNC(NONE,NONE,2,raw_frem1_rr,(FRW d, FR s)) -LOWFUNC(NONE,NONE,1,raw_ftst_r,(FR r)) + LOWFUNC(NONE,NONE,1,raw_ftst_r,(FR r)) { - make_tos(r); - emit_byte(0xd9); /* ftst */ - emit_byte(0xe4); + make_tos(r); + emit_byte(0xd9); /* ftst */ + emit_byte(0xe4); } LENDFUNC(NONE,NONE,1,raw_ftst_r,(FR r)) -STATIC_INLINE void raw_fflags_into_flags(int r) + STATIC_INLINE void raw_fflags_into_flags(int r) { - int p; + int p; - usereg(r); - p=stackpos(r); + usereg(r); + p=stackpos(r); - emit_byte(0xd9); - emit_byte(0xee); /* Push 0 */ - emit_byte(0xd9); - emit_byte(0xc9+p); /* swap top two around */ - if (have_cmov) { - // gb-- fucomi is for P6 cores only, not K6-2 then... - emit_byte(0xdb); - emit_byte(0xe9+p); /* fucomi them */ - } - else { + emit_byte(0xd9); + emit_byte(0xee); /* Push 0 */ + emit_byte(0xd9); + emit_byte(0xc9+p); /* swap top two around */ + if (have_cmov) { + // gb-- fucomi is for P6 cores only, not K6-2 then... + emit_byte(0xdb); + emit_byte(0xe9+p); /* fucomi them */ + } + else { + emit_byte(0xdd); + emit_byte(0xe1+p); /* fucom them */ + emit_byte(0x9b); + emit_byte(0xdf); + emit_byte(0xe0); /* fstsw ax */ + raw_sahf(0); /* sahf */ + } emit_byte(0xdd); - emit_byte(0xe1+p); /* fucom them */ - emit_byte(0x9b); - emit_byte(0xdf); - emit_byte(0xe0); /* fstsw ax */ - raw_sahf(0); /* sahf */ - } - emit_byte(0xdd); - emit_byte(0xd9+p); /* store value back, and get rid of 0 */ + emit_byte(0xd9+p); /* store value back, and get rid of 0 */ } diff --git a/jit/compemu_support.cpp b/jit/compemu_support.cpp index 5dd4daff..4f6bbfd0 100644 --- a/jit/compemu_support.cpp +++ b/jit/compemu_support.cpp @@ -20,7 +20,7 @@ #define NATMEM_OFFSETX (uae_u32)NATMEM_OFFSET // %%% BRIAN KING WAS HERE %%% -extern int canbang; +extern bool canbang; #include extern void jit_abort(const TCHAR*,...); compop_func *compfunctbl[65536]; @@ -421,12 +421,13 @@ STATIC_INLINE void alloc_blockinfos(void) /******************************************************************** * Preferences handling. This is just a convenient place to put it * ********************************************************************/ -extern int have_done_picasso; +extern bool have_done_picasso; -int check_prefs_changed_comp (void) +bool check_prefs_changed_comp (void) { - int changed = 0; - static int cachesize_prev, comptrust_prev, canbang_prev; + bool changed = 0; + static int cachesize_prev, comptrust_prev; + static bool canbang_prev; if (currprefs.comptrustbyte != changed_prefs.comptrustbyte || currprefs.comptrustword != changed_prefs.comptrustword || diff --git a/keybuf.cpp b/keybuf.cpp index 5906bb0b..1ea097f4 100644 --- a/keybuf.cpp +++ b/keybuf.cpp @@ -23,13 +23,6 @@ #include "custom.h" #include "savestate.h" -static int fakestate[MAX_JPORTS][7] = { {0},{0} }; - -static int *fs_np, *fs_ck, *fs_se; -#ifdef ARCADIA -static int *fs_xa1, *fs_xa2; -#endif - static int kpb_first, kpb_last; static int keybuf[256]; @@ -52,12 +45,6 @@ int get_next_key (void) return key; } -static void do_fake (int nr) -{ - int *fake = fakestate[nr]; - do_fake_joystick (nr, fake); -} - int record_key (int kc) { if (input_recording < 0 || pause_emulation) @@ -80,104 +67,9 @@ int record_key_direct (int kc) return 0; } - if (fs_np != 0) { - switch (k) { - case AK_NP8: fs = 1; fs_np[0] = b; break; - case AK_NP4: fs = 1; fs_np[1] = b; break; - case AK_NP6: fs = 1; fs_np[2] = b; break; - case AK_NP2: fs = 1; fs_np[3] = b; break; - case AK_NP0: case AK_NP5: fs = 1; fs_np[4] = b; break; - case AK_NPDEL: case AK_NPDIV: case AK_ENT: fs = 1; fs_np[5] = b; break; - } - } - if (fs_ck != 0) { - switch (k) { - case AK_UP: fs = 1; fs_ck[0] = b; break; - case AK_LF: fs = 1; fs_ck[1] = b; break; - case AK_RT: fs = 1; fs_ck[2] = b; break; - case AK_DN: fs = 1; fs_ck[3] = b; break; - case AK_RCTRL: case AK_RALT: fs = 1; fs_ck[4] = b; break; - case AK_RSH: fs = 1; fs_ck[5] = b; break; - } - } - if (fs_se != 0) { - switch (k) { - case AK_W: fs = 1; fs_se[0] = b; break; - case AK_A: fs = 1; fs_se[1] = b; break; - case AK_D: fs = 1; fs_se[2] = b; break; - case AK_S: fs = 1; fs_se[3] = b; break; - case AK_LALT: fs = 1; fs_se[4] = b; break; - case AK_LSH: fs = 1; fs_se[5] = b; break; - } - } -#ifdef ARCADIA - if (fs_xa1 != 0) { - switch (k) { - case AK_NP8: fs = 1; fs_xa1[0] = b; break; - case AK_NP4: fs = 1; fs_xa1[1] = b; break; - case AK_NP6: fs = 1; fs_xa1[2] = b; break; - case AK_NP2: case AK_NP5: fs = 1; fs_xa1[3] = b; break; - case AK_CTRL: fs = 1; fs_xa1[4] = b; break; - case AK_LALT: fs = 1; fs_xa1[5] = b; break; - case AK_SPC: fs = 1; fs_xa1[6] = b; break; - } - } - if (fs_xa2 != 0) { - switch (k) { - case AK_R: fs = 1; fs_xa2[0] = b; break; - case AK_D: fs = 1; fs_xa2[1] = b; break; - case AK_G: fs = 1; fs_xa2[2] = b; break; - case AK_F: fs = 1; fs_xa2[3] = b; break; - case AK_A: fs = 1; fs_xa2[4] = b; break; - case AK_S: fs = 1; fs_xa2[5] = b; break; - case AK_Q: fs = 1; fs_xa2[6] = b; break; - } - } -#endif - if (fs && currprefs.input_selected_setting == 0) { - if (JSEM_ISANYKBD (0, &currprefs)) - do_fake (0); - if (JSEM_ISANYKBD (1, &currprefs)) - do_fake (1); - if (JSEM_ISANYKBD (2, &currprefs)) - do_fake (2); - if (JSEM_ISANYKBD (3, &currprefs)) - do_fake (3); - return 0; - } else { - if ((kc >> 1) == AK_RCTRL) { - kc ^= AK_RCTRL << 1; - kc ^= AK_CTRL << 1; - } -#ifdef ARCADIA - if (fs_xa1 || fs_xa2) { - int k2 = k; - if (k == AK_1) - k2 = AK_F1; - if (k == AK_2) - k2 = AK_F2; - if (k == AK_3) - k2 = AK_LALT; - if (k == AK_4) - k2 = AK_RALT; - if (k == AK_6) - k2 = AK_DN; - if (k == AK_LBRACKET || k == AK_LSH) - k2 = AK_SPC; - if (k == AK_RBRACKET) - k2 = AK_RET; - if (k == AK_C) - k2 = AK_1; - if (k == AK_5) - k2 = AK_2; - if (k == AK_Z) - k2 = AK_3; - if (k == AK_X) - k2 = AK_4; - if (k != k2) - kc = (k2 << 1) | (b ? 0 : 1); - } -#endif + if ((kc >> 1) == AK_RCTRL) { + kc ^= AK_RCTRL << 1; + kc ^= AK_CTRL << 1; } if (input_recording > 0) { @@ -191,31 +83,6 @@ int record_key_direct (int kc) return 1; } -void joystick_setting_changed (void) -{ - int i; - - fs_np = fs_ck = fs_se = 0; -#ifdef ARCADIA - fs_xa1 = fs_xa2 = 0; -#endif - - for (i = 0; i < MAX_JPORTS; i++) { - if (JSEM_ISNUMPAD (i, &currprefs)) - fs_np = fakestate[i]; - if (JSEM_ISCURSOR (i, &currprefs)) - fs_ck = fakestate[i]; - if (JSEM_ISSOMEWHEREELSE (i, &currprefs)) - fs_se = fakestate[i]; -#ifdef ARCADIA - if (JSEM_ISXARCADE1 (i, &currprefs)) - fs_xa1 = fakestate[i]; - if (JSEM_ISXARCADE2 (i, &currprefs)) - fs_xa2 = fakestate[i]; -#endif - } -} - void keybuf_init (void) { kpb_first = kpb_last = 0; diff --git a/main.cpp b/main.cpp index 5a733a65..e4f5f44d 100644 --- a/main.cpp +++ b/main.cpp @@ -63,10 +63,10 @@ long int version = 256 * 65536L * UAEMAJOR + 65536L * UAEMINOR + UAESUBREV; struct uae_prefs currprefs, changed_prefs; int config_changed; -int no_gui = 0, quit_to_gui = 0; -int cloanto_rom = 0; -int kickstart_rom = 1; -int console_emulation = 0; +bool no_gui = 0, quit_to_gui = 0; +bool cloanto_rom = 0; +bool kickstart_rom = 1; +bool console_emulation = 0; struct gui_info gui_data; @@ -271,26 +271,6 @@ void fixup_prefs (struct uae_prefs *p) p->comptrustnaddr = 1; err = 1; } - if (p->compnf < 0 || p->compnf > 1) { - write_log (L"Bad value for compnf parameter: value must be within 0..1\n"); - p->compnf = 1; - err = 1; - } - if (p->comp_hardflush < 0 || p->comp_hardflush > 1) { - write_log (L"Bad value for comp_hardflush parameter: value must be within 0..1\n"); - p->comp_hardflush = 1; - err = 1; - } - if (p->comp_constjump < 0 || p->comp_constjump > 1) { - write_log (L"Bad value for comp_constjump parameter: value must be within 0..1\n"); - p->comp_constjump = 1; - err = 1; - } - if (p->comp_oldsegv < 0 || p->comp_oldsegv > 1) { - write_log (L"Bad value for comp_oldsegv parameter: value must be within 0..1\n"); - p->comp_oldsegv = 1; - err = 1; - } if (p->cachesize < 0 || p->cachesize > 16384) { write_log (L"Bad value for cachesize parameter: value must be within 0..16384\n"); p->cachesize = 0; @@ -652,6 +632,13 @@ void reset_all_systems (void) * Add #ifdefs around these as appropriate. */ +#ifndef JIT +extern int DummyException (LPEXCEPTION_POINTERS blah, int n_except) +{ + return EXCEPTION_CONTINUE_SEARCH; +} +#endif + void do_start_program (void) { if (quit_program == -1) @@ -664,7 +651,23 @@ void do_start_program (void) inputdevice_updateconfig (&currprefs); if (quit_program >= 0) quit_program = 2; - m68k_go (1); +#if (defined (_WIN32) || defined (_WIN64)) && !defined (NO_WIN32_EXCEPTION_HANDLER) + extern int EvalException (LPEXCEPTION_POINTERS blah, int n_except); + __try +#endif + { + m68k_go (1); + } +#if (defined (_WIN32) || defined (_WIN64)) && !defined (NO_WIN32_EXCEPTION_HANDLER) +#ifdef JIT + __except (EvalException (GetExceptionInformation (), GetExceptionCode ())) +#else + __except (DummyException (GetExceptionInformation (), GetExceptionCode ())) +#endif + { + // EvalException does the good stuff... + } +#endif } void do_leave_program (void) @@ -721,172 +724,147 @@ void leave_program (void) do_leave_program (); } -#ifndef JIT -extern int DummyException (LPEXCEPTION_POINTERS blah, int n_except) -{ - return EXCEPTION_CONTINUE_SEARCH; -} -#endif - static int real_main2 (int argc, TCHAR **argv) { -#if (defined (_WIN32) || defined (_WIN64)) && !defined (NO_WIN32_EXCEPTION_HANDLER) - extern int EvalException (LPEXCEPTION_POINTERS blah, int n_except); - __try -#endif - { #ifdef USE_SDL - SDL_Init (SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE); + SDL_Init (SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE); #endif - config_changed = 1; - if (restart_config[0]) { - default_prefs (&currprefs, 0); - fixup_prefs (&currprefs); - } + config_changed = 1; + if (restart_config[0]) { + default_prefs (&currprefs, 0); + fixup_prefs (&currprefs); + } - if (! graphics_setup ()) { - exit (1); - } + if (! graphics_setup ()) { + exit (1); + } #ifdef NATMEM_OFFSET - preinit_shm (); + preinit_shm (); #endif - if (restart_config[0]) - parse_cmdline_and_init_file (argc, argv); - else - currprefs = changed_prefs; + if (restart_config[0]) + parse_cmdline_and_init_file (argc, argv); + else + currprefs = changed_prefs; - if (!machdep_init ()) { - restart_program = 0; - return -1; - } - - if (console_emulation) { - consolehook_config (&currprefs); - fixup_prefs (&currprefs); - } + if (!machdep_init ()) { + restart_program = 0; + return -1; + } - if (! setup_sound ()) { - write_log (L"Sound driver unavailable: Sound output disabled\n"); - currprefs.produce_sound = 0; - } - inputdevice_init (); + if (console_emulation) { + consolehook_config (&currprefs); + fixup_prefs (&currprefs); + } - changed_prefs = currprefs; - no_gui = ! currprefs.start_gui; - if (restart_program == 2) - no_gui = 1; - else if (restart_program == 3) - no_gui = 0; - restart_program = 0; - if (! no_gui) { - int err = gui_init (); - currprefs = changed_prefs; - config_changed = 1; - if (err == -1) { - write_log (L"Failed to initialize the GUI\n"); - return -1; - } else if (err == -2) { - return 1; - } + if (! setup_sound ()) { + write_log (L"Sound driver unavailable: Sound output disabled\n"); + currprefs.produce_sound = 0; + } + inputdevice_init (); + + changed_prefs = currprefs; + no_gui = ! currprefs.start_gui; + if (restart_program == 2) + no_gui = 1; + else if (restart_program == 3) + no_gui = 0; + restart_program = 0; + if (! no_gui) { + int err = gui_init (); + currprefs = changed_prefs; + config_changed = 1; + if (err == -1) { + write_log (L"Failed to initialize the GUI\n"); + return -1; + } else if (err == -2) { + return 1; } + } - logging_init (); /* Yes, we call this twice - the first case handles when the user has loaded + logging_init (); /* Yes, we call this twice - the first case handles when the user has loaded a config using the cmd-line. This case handles loads through the GUI. */ #ifdef NATMEM_OFFSET - init_shm (); + init_shm (); #endif #ifdef JIT - if (!(currprefs.cpu_model >= 68020 && currprefs.address_space_24 == 0 && currprefs.cachesize)) - canbang = 0; + if (!(currprefs.cpu_model >= 68020 && currprefs.address_space_24 == 0 && currprefs.cachesize)) + canbang = 0; #endif - fixup_prefs (&currprefs); - changed_prefs = currprefs; - target_run (); - /* force sound settings change */ - currprefs.produce_sound = 0; + fixup_prefs (&currprefs); + changed_prefs = currprefs; + target_run (); + /* force sound settings change */ + currprefs.produce_sound = 0; #ifdef AUTOCONFIG - rtarea_setup (); + rtarea_setup (); #endif #ifdef FILESYS - rtarea_init (); - uaeres_install (); - hardfile_install (); + rtarea_init (); + uaeres_install (); + hardfile_install (); #endif - savestate_init (); + savestate_init (); #ifdef SCSIEMU - scsi_reset (); - scsidev_install (); + scsi_reset (); + scsidev_install (); #endif #ifdef SANA2 - netdev_install (); + netdev_install (); #endif #ifdef UAESERIAL - uaeserialdev_install (); + uaeserialdev_install (); #endif - keybuf_init (); /* Must come after init_joystick */ + keybuf_init (); /* Must come after init_joystick */ #ifdef AUTOCONFIG - expansion_init (); + expansion_init (); #endif #ifdef FILESYS - filesys_install (); + filesys_install (); #endif - memory_init (); - memory_reset (); + memory_init (); + memory_reset (); #ifdef AUTOCONFIG #if defined (BSDSOCKET) - bsdlib_install (); + bsdlib_install (); #endif - emulib_install (); - uaeexe_install (); - native2amiga_install (); + emulib_install (); + uaeexe_install (); + native2amiga_install (); #endif - custom_init (); /* Must come after memory_init */ + custom_init (); /* Must come after memory_init */ #ifdef SERIAL_PORT - serial_init (); + serial_init (); #endif - DISK_init (); + DISK_init (); - reset_frame_rate_hack (); - init_m68k (); /* must come after reset_frame_rate_hack (); */ + reset_frame_rate_hack (); + init_m68k (); /* must come after reset_frame_rate_hack (); */ - gui_update (); + gui_update (); - if (graphics_init ()) { - setup_brkhandler (); - if (currprefs.start_debugger && debuggable ()) - activate_debugger (); + if (graphics_init ()) { + setup_brkhandler (); + if (currprefs.start_debugger && debuggable ()) + activate_debugger (); - if (!init_audio ()) { - if (sound_available && currprefs.produce_sound > 1) { - write_log (L"Sound driver unavailable: Sound output disabled\n"); - } - currprefs.produce_sound = 0; + if (!init_audio ()) { + if (sound_available && currprefs.produce_sound > 1) { + write_log (L"Sound driver unavailable: Sound output disabled\n"); } - - start_program (); + currprefs.produce_sound = 0; } - + start_program (); } -#if (defined (_WIN32) || defined (_WIN64)) && !defined (NO_WIN32_EXCEPTION_HANDLER) -#ifdef JIT - __except (EvalException (GetExceptionInformation (), GetExceptionCode ())) -#else - __except (DummyException (GetExceptionInformation (), GetExceptionCode ())) -#endif - { - // EvalException does the good stuff... - } -#endif return 0; } diff --git a/memory.cpp b/memory.cpp index 9ddf7da6..7c99dad0 100644 --- a/memory.cpp +++ b/memory.cpp @@ -31,19 +31,19 @@ #include "gayle.h" #include "debug.h" -int canbang; +bool canbang; int candirect = -1; #ifdef JIT /* Set by each memory handler that does not simply access real memory. */ int special_mem; #endif -static int isdirectjit (void) +static bool isdirectjit (void) { return currprefs.cachesize && !currprefs.comptrustbyte; } -static int canjit (void) +static bool canjit (void) { if (currprefs.cpu_model < 68020 && currprefs.address_space_24) return 0; @@ -55,7 +55,7 @@ static void nocanbang (void) canbang = 0; } -int ersatzkickfile; +bool ersatzkickfile; uae_u32 allocated_chipmem; uae_u32 allocated_fastmem; @@ -66,6 +66,7 @@ uae_u32 allocated_a3000lmem; uae_u32 allocated_a3000hmem; uae_u32 allocated_cardmem; uae_u8 ce_banktype[65536]; +uae_u8 ce_cachable[65536]; #if defined(CPU_64_BIT) uae_u32 max_z3fastmem = 2048UL * 1024 * 1024; @@ -78,10 +79,10 @@ static size_t bootrom_filepos, chip_filepos, bogo_filepos, rom_filepos, a3000lme /* Set if we notice during initialization that settings changed, and we must clear all memory to prevent bogus contents from confusing the Kickstart. */ -static int need_hardreset; +static bool need_hardreset; /* The address space setting used during the last reset. */ -static int last_address_space_24; +static bool last_address_space_24; addrbank *mem_banks[MEMORY_BANKS]; @@ -2172,6 +2173,11 @@ static void fill_ce_banks (void) int i; memset (ce_banktype, CE_MEMBANK_FAST, sizeof ce_banktype); + // data cachable regions + memset (ce_cachable, 0, sizeof ce_cachable); + memset (ce_cachable + (0x00200000 >> 16), 1, currprefs.fastmem_size >> 16); + memset (ce_cachable + (0x10000000 >> 16), 1, currprefs.z3fastmem_size >> 16); + if (&get_mem_bank (0) == &chipmem_bank) { for (i = 0; i < (0x200000 >> 16); i++) ce_banktype[i] = CE_MEMBANK_CHIP; @@ -2186,8 +2192,10 @@ static void fill_ce_banks (void) addrbank *b; ce_banktype[i] = CE_MEMBANK_CIA; b = &get_mem_bank (i << 16); - if (b != &cia_bank) + if (b != &cia_bank) { ce_banktype[i] = CE_MEMBANK_FAST; + ce_cachable[i] = 1; + } } // CD32 ROM is 16-bit if (currprefs.cs_cd32cd) { diff --git a/native2amiga.cpp b/native2amiga.cpp index 216d78da..37e9cc40 100644 --- a/native2amiga.cpp +++ b/native2amiga.cpp @@ -108,21 +108,21 @@ void uae_NotificationHack (uaecptr port, uaecptr nr) void uae_NewList (uaecptr list) { - put_long_slow (list, list + 4); - put_long_slow (list + 4, 0); - put_long_slow (list + 8, list); + x_put_long (list, list + 4); + x_put_long (list + 4, 0); + x_put_long (list + 8, list); } uaecptr uae_AllocMem (TrapContext *context, uae_u32 size, uae_u32 flags) { m68k_dreg (regs, 0) = size; m68k_dreg (regs, 1) = flags; - return CallLib (context, get_long (4), -198); /* AllocMem */ + return CallLib (context, x_get_long (4), -198); /* AllocMem */ } void uae_FreeMem (TrapContext *context, uaecptr memory, uae_u32 size) { m68k_dreg (regs, 0) = size; m68k_areg (regs, 1) = memory; - CallLib (context, get_long (4), -0xD2); /* FreeMem */ + CallLib (context, x_get_long (4), -0xD2); /* FreeMem */ } diff --git a/newcpu.cpp b/newcpu.cpp index ea00fbad..aa160b38 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -38,7 +38,7 @@ extern uae_u8* compiled_code; #else /* Need to have these somewhere */ static void build_comp (void) {} -void check_prefs_changed_comp (void) {} +bool check_prefs_changed_comp (void) { return false; } #endif /* For faster JIT cycles handling */ signed long pissoff = 0; @@ -82,6 +82,8 @@ static uae_u32 tt0_030, tt1_030, tc_030; static uae_u16 mmusr_030; static struct cache020 caches020[CACHELINES020]; +static struct cache030 icaches030[CACHELINES030]; +static struct cache030 dcaches030[CACHELINES030]; static struct cache040 caches040[CACHESETS040]; #if COUNT_INSTRS @@ -134,31 +136,119 @@ void dump_counts (void) } #endif + +uae_u32 (*x_prefetch)(int); +uae_u32 (*x_next_iword)(void); +uae_u32 (*x_next_ilong)(void); +uae_u32 (*x_get_long)(uaecptr); +uae_u32 (*x_get_word)(uaecptr); +uae_u32 (*x_get_byte)(uaecptr); +void (*x_put_long)(uaecptr,uae_u32); +void (*x_put_word)(uaecptr,uae_u32); +void (*x_put_byte)(uaecptr,uae_u32); + +// 68020+ shared functions +static void set_x_funcs (void) +{ + if (currprefs.mmu_model) { + x_prefetch = get_iword_mmu; + x_next_iword = next_iword_mmu; + x_next_ilong = next_ilong_mmu; + x_put_long = put_long_mmu; + x_put_word = put_word_mmu; + x_put_byte = put_byte_mmu; + x_get_long = get_long_mmu; + x_get_word = get_word_mmu; + x_get_byte = get_byte_mmu; + } else if (!currprefs.cpu_cycle_exact) { + x_prefetch = get_iword; + x_next_iword = next_iword; + x_next_ilong = next_ilong; + x_put_long = put_long; + x_put_word = put_word; + x_put_byte = put_byte; + x_get_long = get_long; + x_get_word = get_word; + x_get_byte = get_byte; + } else if (currprefs.cpu_model == 68020) { + x_prefetch = get_word_ce020_prefetch; + x_next_iword = next_iword_020ce; + x_next_ilong = next_ilong_020ce; + x_put_long = put_long_ce020; + x_put_word = put_word_ce020; + x_put_byte = put_byte_ce020; + x_get_long = get_long_ce020; + x_get_word = get_word_ce020; + x_get_byte = get_byte_ce020; + } else { + x_prefetch = get_word_ce030_prefetch; + x_next_iword = next_iword_030ce; + x_next_ilong = next_ilong_030ce; + x_put_long = put_long_ce030; + x_put_word = put_word_ce030; + x_put_byte = put_byte_ce030; + x_get_long = get_long_ce030; + x_get_word = get_word_ce030; + x_get_byte = get_byte_ce030; + } + +} + static void set_cpu_caches (void) { int i, j; - if (currprefs.cpu_model < 68040) { - if (regs.cacr & 0x08) { // Clear Cache +#ifdef JIT + if (currprefs.cachesize) { + if (currprefs.cpu_model < 68040) { + set_cache_state (regs.cacr & 1); + if (regs.cacr & 0x08) { + flush_icache (0, 3); + } + } else { + set_cache_state ((regs.cacr & 0x8000) ? 1 : 0); + } + } +#endif + if (currprefs.cpu_model == 68020) { + if (regs.cacr & 0x08) { // clear instr cache for (i = 0; i < CACHELINES020; i++) caches020[i].valid = 0; regs.prefetch020addr = 0xff000000; } - if (regs.cacr & 0x04) { // Clear Entry - caches020[(regs.caar >> 2) & 0x3f].valid = 0; + if (regs.cacr & 0x04) { // clear entry in instr cache + caches020[(regs.caar >> 2) & (CACHELINES020 - 1)].valid = 0; regs.cacr &= ~0x04; } -#ifdef JIT - set_cache_state (regs.cacr & 1); - if (regs.cacr & 0x08) { - flush_icache (0, 3); + } else if (currprefs.cpu_model == 68030) { + //regs.cacr |= 0x100; + if (regs.cacr & 0x08) { // clear instr cache + for (i = 0; i < CACHELINES030; i++) { + icaches030[i].valid[0] = 0; + icaches030[i].valid[1] = 0; + icaches030[i].valid[2] = 0; + icaches030[i].valid[3] = 0; + } + regs.prefetch020addr = 0xff000000; } -#endif - regs.cacr &= ~0x08; - } else { -#ifdef JIT - set_cache_state ((regs.cacr & 0x8000) ? 1 : 0); -#endif + if (regs.cacr & 0x04) { // clear entry in instr cache + icaches030[(regs.caar >> 4) & (CACHELINES030 - 1)].valid[(regs.caar >> 2) & 3] = 0; + regs.cacr &= ~0x04; + } + if (regs.cacr & 0x800) { // clear data cache + for (i = 0; i < CACHELINES030; i++) { + dcaches030[i].valid[0] = 0; + dcaches030[i].valid[1] = 0; + dcaches030[i].valid[2] = 0; + dcaches030[i].valid[3] = 0; + } + regs.cacr &= ~0x800; + } + if (regs.cacr & 0x400) { // clear entry in data cache + dcaches030[(regs.caar >> 4) & (CACHELINES030 - 1)].valid[(regs.caar >> 2) & 3] = 0; + regs.cacr &= ~0x400; + } + } else if (currprefs.cpu_model == 68040) { if (!(regs.cacr & 0x8000)) { for (i = 0; i < CACHESETS040; i++) { for (j = 0; j < CACHELINES040; j++) { @@ -200,7 +290,7 @@ static void build_cpufunctbl (void) lvl = 5; tbl = op_smalltbl_0_ff; if (currprefs.cpu_cycle_exact) - tbl = op_smalltbl_20_ff; + tbl = op_smalltbl_21_ff; if (currprefs.mmu_model) tbl = op_smalltbl_31_ff; break; @@ -208,7 +298,7 @@ static void build_cpufunctbl (void) lvl = 4; tbl = op_smalltbl_1_ff; if (currprefs.cpu_cycle_exact) - tbl = op_smalltbl_21_ff; + tbl = op_smalltbl_22_ff; if (currprefs.mmu_model) tbl = op_smalltbl_31_ff; break; @@ -216,13 +306,13 @@ static void build_cpufunctbl (void) lvl = 3; tbl = op_smalltbl_2_ff; if (currprefs.cpu_cycle_exact) - tbl = op_smalltbl_22_ff; + tbl = op_smalltbl_23_ff; break; case 68020: lvl = 2; tbl = op_smalltbl_3_ff; if (currprefs.cpu_cycle_exact) - tbl = op_smalltbl_23_ff; + tbl = op_smalltbl_20_ff; break; case 68010: lvl = 1; @@ -347,7 +437,7 @@ static void update_68k_cycles (void) cpucycleunit = CYCLE_UNIT * currprefs.cpu_clock_multiplier; } } else if (currprefs.cpu_frequency) { - cpucycleunit = CYCLE_UNIT * baseclock / (currprefs.cpu_frequency * 8); + cpucycleunit = CYCLE_UNIT * baseclock / currprefs.cpu_frequency; } if (cpucycleunit < 1) cpucycleunit = 1; @@ -368,7 +458,7 @@ static void prefs_changed_cpu (void) void check_prefs_changed_cpu (void) { - int changed = 0; + bool changed = 0; if (!config_changed) return; @@ -441,9 +531,9 @@ void init_m68k (void) #endif write_log (L"Building CPU table for configuration: %d", currprefs.cpu_model); regs.address_space_mask = 0xffffffff; - if (currprefs.cpu_compatible > 0) { + if (currprefs.cpu_compatible) { if (currprefs.address_space_24 && currprefs.cpu_model >= 68030) - currprefs.address_space_24 = 0; + currprefs.address_space_24 = false; } if (currprefs.fpu_model > 0) write_log (L"/%d", currprefs.fpu_model); @@ -466,6 +556,7 @@ void init_m68k (void) write_log (L"%d CPU functions\n", nr_cpuop_funcs); build_cpufunctbl (); + set_x_funcs (); #ifdef JIT /* We need to check whether NATMEM settings have changed @@ -805,12 +896,11 @@ int get_cpu_model (void) return currprefs.cpu_model; } - /* * extract bitfield data from memory and return it in the MSBs * bdata caches the unmodified data for put_bitfield() */ -uae_u32 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) +uae_u32 REGPARAM2 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) { uae_u32 tmp, res, mask; @@ -859,7 +949,7 @@ uae_u32 get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) * write bitfield data (in the LSBs) back to memory, upper bits * must be cleared already. */ -void put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) +void REGPARAM2 put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) { offset = (offset & 7) + width; switch ((offset + 7) >> 3) { @@ -883,7 +973,7 @@ void put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, i } } -uae_u32 get_bitfield_020ce (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) +uae_u32 REGPARAM2 x_get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) { uae_u32 tmp, res, mask; @@ -891,33 +981,33 @@ uae_u32 get_bitfield_020ce (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int w mask = 0xffffffffu << (32 - width); switch ((offset + width + 7) >> 3) { case 1: - tmp = get_byte_ce020 (src); + tmp = x_get_byte (src); res = tmp << (24 + offset); bdata[0] = tmp & ~(mask >> (24 + offset)); break; case 2: - tmp = get_word_ce020 (src); + tmp = x_get_word (src); res = tmp << (16 + offset); bdata[0] = tmp & ~(mask >> (16 + offset)); break; case 3: - tmp = get_word_ce020 (src); + tmp = x_get_word (src); res = tmp << (16 + offset); bdata[0] = tmp & ~(mask >> (16 + offset)); - tmp = get_byte_ce020 (src + 2); + tmp = x_get_byte (src + 2); res |= tmp << (8 + offset); bdata[1] = tmp & ~(mask >> (8 + offset)); break; case 4: - tmp = get_long_ce020 (src); + tmp = x_get_long (src); res = tmp << offset; bdata[0] = tmp & ~(mask >> offset); break; case 5: - tmp = get_long_ce020 (src); + tmp = x_get_long (src); res = tmp << offset; bdata[0] = tmp & ~(mask >> offset); - tmp = get_byte_ce020 (src + 4); + tmp = x_get_byte (src + 4); res |= tmp >> (8 - offset); bdata[1] = tmp & ~(mask << (8 - offset)); break; @@ -929,101 +1019,30 @@ uae_u32 get_bitfield_020ce (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int w return res; } -void put_bitfield_020ce (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) -{ - offset = (offset & 7) + width; - switch ((offset + 7) >> 3) { - case 1: - put_byte_ce020 (dst, bdata[0] | (val << (8 - offset))); - break; - case 2: - put_word_ce020 (dst, bdata[0] | (val << (16 - offset))); - break; - case 3: - put_word_ce020 (dst, bdata[0] | (val >> (offset - 16))); - put_byte_ce020 (dst + 2, bdata[1] | (val << (24 - offset))); - break; - case 4: - put_long_ce020 (dst, bdata[0] | (val << (32 - offset))); - break; - case 5: - put_long_ce020 (dst, bdata[0] | (val >> (offset - 32))); - put_byte_ce020 (dst + 4, bdata[1] | (val << (40 - offset))); - break; - } -} - - -uae_u32 get_bitfield_040mmu (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) -{ - uae_u32 tmp, res, mask; - - offset &= 7; - mask = 0xffffffffu << (32 - width); - switch ((offset + width + 7) >> 3) { - case 1: - tmp = get_byte_mmu (src); - res = tmp << (24 + offset); - bdata[0] = tmp & ~(mask >> (24 + offset)); - break; - case 2: - tmp = get_word_mmu (src); - res = tmp << (16 + offset); - bdata[0] = tmp & ~(mask >> (16 + offset)); - break; - case 3: - tmp = get_word_mmu (src); - res = tmp << (16 + offset); - bdata[0] = tmp & ~(mask >> (16 + offset)); - tmp = get_byte_mmu (src + 2); - res |= tmp << (8 + offset); - bdata[1] = tmp & ~(mask >> (8 + offset)); - break; - case 4: - tmp = get_long_mmu (src); - res = tmp << offset; - bdata[0] = tmp & ~(mask >> offset); - break; - case 5: - tmp = get_long_mmu (src); - res = tmp << offset; - bdata[0] = tmp & ~(mask >> offset); - tmp = get_byte_mmu (src + 4); - res |= tmp >> (8 - offset); - bdata[1] = tmp & ~(mask << (8 - offset)); - break; - default: - /* Panic? */ - res = 0; - break; - } - return res; -} -void put_bitfield_040mmu (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) +void REGPARAM2 x_put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) { offset = (offset & 7) + width; switch ((offset + 7) >> 3) { case 1: - put_byte_mmu (dst, bdata[0] | (val << (8 - offset))); + x_put_byte (dst, bdata[0] | (val << (8 - offset))); break; case 2: - put_word_mmu (dst, bdata[0] | (val << (16 - offset))); + x_put_word (dst, bdata[0] | (val << (16 - offset))); break; case 3: - put_word_mmu (dst, bdata[0] | (val >> (offset - 16))); - put_byte_mmu (dst + 2, bdata[1] | (val << (24 - offset))); + x_put_word (dst, bdata[0] | (val >> (offset - 16))); + x_put_byte (dst + 2, bdata[1] | (val << (24 - offset))); break; case 4: - put_long_mmu (dst, bdata[0] | (val << (32 - offset))); + x_put_long (dst, bdata[0] | (val << (32 - offset))); break; case 5: - put_long_mmu (dst, bdata[0] | (val >> (offset - 32))); - put_byte_mmu (dst + 4, bdata[1] | (val << (40 - offset))); + x_put_long (dst, bdata[0] | (val >> (offset - 32))); + x_put_byte (dst + 4, bdata[1] | (val << (40 - offset))); break; } } - uae_u32 REGPARAM2 get_disp_ea_020 (uae_u32 base, uae_u32 dp) { int reg = (dp >> 12) & 15; @@ -1036,15 +1055,22 @@ uae_u32 REGPARAM2 get_disp_ea_020 (uae_u32 base, uae_u32 dp) if (dp & 0x80) base = 0; if (dp & 0x40) regd = 0; - if ((dp & 0x30) == 0x20) base += (uae_s32)(uae_s16) next_iword (); - if ((dp & 0x30) == 0x30) base += next_ilong (); + if ((dp & 0x30) == 0x20) + base += (uae_s32)(uae_s16) next_iword (); + if ((dp & 0x30) == 0x30) + base += next_ilong (); - if ((dp & 0x3) == 0x2) outer = (uae_s32)(uae_s16) next_iword (); - if ((dp & 0x3) == 0x3) outer = next_ilong (); + if ((dp & 0x3) == 0x2) + outer = (uae_s32)(uae_s16) next_iword (); + if ((dp & 0x3) == 0x3) + outer = next_ilong (); - if ((dp & 0x4) == 0) base += regd; - if (dp & 0x3) base = get_long (base); - if (dp & 0x4) base += regd; + if ((dp & 0x4) == 0) + base += regd; + if (dp & 0x3) + base = get_long (base); + if (dp & 0x4) + base += regd; return base + outer; } else { @@ -1052,7 +1078,7 @@ uae_u32 REGPARAM2 get_disp_ea_020 (uae_u32 base, uae_u32 dp) } } -uae_u32 REGPARAM2 get_disp_ea_020ce (uae_u32 base, uae_u32 dp) +uae_u32 REGPARAM2 x_get_disp_ea_020 (uae_u32 base, uae_u32 dp) { int reg = (dp >> 12) & 15; int cycles = 0; @@ -1070,20 +1096,20 @@ uae_u32 REGPARAM2 get_disp_ea_020ce (uae_u32 base, uae_u32 dp) regd = 0; if ((dp & 0x30) == 0x20) { - base += (uae_s32)(uae_s16) next_iword_020ce (); + base += (uae_s32)(uae_s16) x_next_iword (); cycles++; } if ((dp & 0x30) == 0x30) { - base += next_ilong_020ce (); + base += x_next_ilong (); cycles++; } if ((dp & 0x3) == 0x2) { - outer = (uae_s32)(uae_s16) next_iword_020ce (); + outer = (uae_s32)(uae_s16) x_next_iword (); cycles++; } if ((dp & 0x3) == 0x3) { - outer = next_ilong_020ce (); + outer = x_next_ilong (); cycles++; } @@ -1092,7 +1118,7 @@ uae_u32 REGPARAM2 get_disp_ea_020ce (uae_u32 base, uae_u32 dp) cycles++; } if (dp & 0x3) { - base = get_long_ce020 (base); + base = x_get_long (base); cycles++; } if (dp & 0x4) { @@ -1108,40 +1134,6 @@ uae_u32 REGPARAM2 get_disp_ea_020ce (uae_u32 base, uae_u32 dp) return v; } -uae_u32 REGPARAM2 get_disp_ea_040mmu (uae_u32 base, uae_u32 dp) -{ - int reg = (dp >> 12) & 15; - uae_s32 regd = regs.regs[reg]; - if ((dp & 0x800) == 0) - regd = (uae_s32)(uae_s16)regd; - regd <<= (dp >> 9) & 3; - if (dp & 0x100) { - uae_s32 outer = 0; - if (dp & 0x80) base = 0; - if (dp & 0x40) regd = 0; - - if ((dp & 0x30) == 0x20) - base += (uae_s32)(uae_s16) next_iword_mmu (); - if ((dp & 0x30) == 0x30) - base += next_ilong_mmu (); - - if ((dp & 0x3) == 0x2) - outer = (uae_s32)(uae_s16) next_iword_mmu (); - if ((dp & 0x3) == 0x3) - outer = next_ilong_mmu (); - - if ((dp & 0x4) == 0) - base += regd; - if (dp & 0x3) - base = get_long_mmu (base); - if (dp & 0x4) - base += regd; - - return base + outer; - } else { - return base + (uae_s32)((uae_s8)dp) + regd; - } -} uae_u32 REGPARAM3 get_disp_ea_000 (uae_u32 base, uae_u32 dp) REGPARAM { @@ -1574,14 +1566,13 @@ kludge_me_do: exception_trace (nr); } - static void Exception_normal (int nr, uaecptr oldpc) { uae_u32 currpc = m68k_getpc (), newpc; int sv = regs.s; if (nr >= 24 && nr < 24 + 8 && currprefs.cpu_model <= 68010) - nr = get_byte (0x00fffff1 | (nr << 1)); + nr = x_get_byte (0x00fffff1 | (nr << 1)); exception_debug (nr); MakeSR (); @@ -1606,33 +1597,33 @@ static void Exception_normal (int nr, uaecptr oldpc) for (i = 0 ; i < 7 ; i++) { m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), 0); + x_put_long (m68k_areg (regs, 7), 0); } m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), regs.wb3_data); + x_put_long (m68k_areg (regs, 7), regs.wb3_data); m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), regs.mmu_fault_addr); + x_put_long (m68k_areg (regs, 7), regs.mmu_fault_addr); m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), regs.mmu_fault_addr); + x_put_long (m68k_areg (regs, 7), regs.mmu_fault_addr); m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), regs.wb3_status); + x_put_word (m68k_areg (regs, 7), regs.wb3_status); regs.wb3_status = 0; m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), regs.mmu_ssw); + x_put_word (m68k_areg (regs, 7), regs.mmu_ssw); m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), regs.mmu_fault_addr); + x_put_long (m68k_areg (regs, 7), regs.mmu_fault_addr); m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), 0x7000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x7000 + nr * 4); m68k_areg (regs, 7) -= 4; - put_long_mmu (m68k_areg (regs, 7), oldpc); + x_put_long (m68k_areg (regs, 7), oldpc); m68k_areg (regs, 7) -= 2; - put_word_mmu (m68k_areg (regs, 7), regs.sr); - newpc = get_long_mmu (regs.vbr + 4 * nr); + x_put_word (m68k_areg (regs, 7), regs.sr); + newpc = x_get_long (regs.vbr + 4 * nr); if (newpc & 1) { if (nr == 2 || nr == 3) uae_reset (1); /* there is nothing else we can do.. */ @@ -1651,35 +1642,35 @@ static void Exception_normal (int nr, uaecptr oldpc) for (i = 0 ; i < 18 ; i++) { m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); } m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), last_fault_for_exception_3); + x_put_long (m68k_areg (regs, 7), last_fault_for_exception_3); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0x0140 | (sv ? 6 : 2)); /* SSW */ + x_put_word (m68k_areg (regs, 7), 0x0140 | (sv ? 6 : 2)); /* SSW */ m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), last_addr_for_exception_3); + x_put_long (m68k_areg (regs, 7), last_addr_for_exception_3); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0x7000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x7000 + nr * 4); m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), oldpc); + x_put_long (m68k_areg (regs, 7), oldpc); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), regs.sr); + x_put_word (m68k_areg (regs, 7), regs.sr); goto kludge_me_do; } } else { m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), last_fault_for_exception_3); + x_put_long (m68k_areg (regs, 7), last_fault_for_exception_3); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); } } else { // address error @@ -1688,62 +1679,62 @@ static void Exception_normal (int nr, uaecptr oldpc) ssw |= 0x20; for (i = 0 ; i < 36; i++) { m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); } m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), last_fault_for_exception_3); + x_put_long (m68k_areg (regs, 7), last_fault_for_exception_3); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0); + x_put_word (m68k_areg (regs, 7), 0); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), ssw); + x_put_word (m68k_areg (regs, 7), ssw); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0xb000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0xb000 + nr * 4); } - write_log (L"Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs.vbr + 4*nr)); + write_log (L"Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, x_get_long (regs.vbr + 4*nr)); } else if (nr ==5 || nr == 6 || nr == 7 || nr == 9) { m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), oldpc); + x_put_long (m68k_areg (regs, 7), oldpc); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); } else if (regs.m && nr >= 24 && nr < 32) { /* M + Interrupt */ m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), nr * 4); + x_put_word (m68k_areg (regs, 7), nr * 4); m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), currpc); + x_put_long (m68k_areg (regs, 7), currpc); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), regs.sr); + x_put_word (m68k_areg (regs, 7), regs.sr); regs.sr |= (1 << 13); regs.msp = m68k_areg (regs, 7); m68k_areg (regs, 7) = regs.isp; m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), 0x1000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x1000 + nr * 4); } else { m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), nr * 4); + x_put_word (m68k_areg (regs, 7), nr * 4); } } else if (nr == 2 || nr == 3) { uae_u16 mode = (sv ? 4 : 0) | (last_instructionaccess_for_exception_3 ? 2 : 1); mode |= last_writeaccess_for_exception_3 ? 0 : 16; m68k_areg (regs, 7) -= 14; /* fixme: bit3=I/N */ - put_word (m68k_areg (regs, 7) + 0, mode); - put_long (m68k_areg (regs, 7) + 2, last_fault_for_exception_3); - put_word (m68k_areg (regs, 7) + 6, last_op_for_exception_3); - put_word (m68k_areg (regs, 7) + 8, regs.sr); - put_long (m68k_areg (regs, 7) + 10, last_addr_for_exception_3); - write_log (L"Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs.vbr + 4*nr)); + x_put_word (m68k_areg (regs, 7) + 0, mode); + x_put_long (m68k_areg (regs, 7) + 2, last_fault_for_exception_3); + x_put_word (m68k_areg (regs, 7) + 6, last_op_for_exception_3); + x_put_word (m68k_areg (regs, 7) + 8, regs.sr); + x_put_long (m68k_areg (regs, 7) + 10, last_addr_for_exception_3); + write_log (L"Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, x_get_long (regs.vbr + 4*nr)); goto kludge_me_do; } m68k_areg (regs, 7) -= 4; - put_long (m68k_areg (regs, 7), currpc); + x_put_long (m68k_areg (regs, 7), currpc); m68k_areg (regs, 7) -= 2; - put_word (m68k_areg (regs, 7), regs.sr); + x_put_word (m68k_areg (regs, 7), regs.sr); kludge_me_do: - newpc = get_long (regs.vbr + 4 * nr); + newpc = x_get_long (regs.vbr + 4 * nr); if (newpc & 1) { if (nr == 2 || nr == 3) uae_reset (1); /* there is nothing else we can do.. */ @@ -2386,55 +2377,55 @@ static void mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr ex reg = L"TC"; siz = 4; if (rw) - put_long (extra, tc_030); + x_put_long (extra, tc_030); else - tc_030 = get_long (extra); + tc_030 = x_get_long (extra); break; case 0x12: // SRP reg = L"SRP"; siz = 8; if (rw) { - put_long (extra, srp_030 >> 32); - put_long (extra + 4, srp_030); + x_put_long (extra, srp_030 >> 32); + x_put_long (extra + 4, srp_030); } else { - srp_030 = (uae_u64)get_long (extra) << 32; - srp_030 |= get_long (extra + 4); + srp_030 = (uae_u64)x_get_long (extra) << 32; + srp_030 |= x_get_long (extra + 4); } break; case 0x13: // CRP reg = L"CRP"; siz = 8; if (rw) { - put_long (extra, crp_030 >> 32); - put_long (extra + 4, crp_030); + x_put_long (extra, crp_030 >> 32); + x_put_long (extra + 4, crp_030); } else { - crp_030 = (uae_u64)get_long (extra) << 32; - crp_030 |= get_long (extra + 4); + crp_030 = (uae_u64)x_get_long (extra) << 32; + crp_030 |= x_get_long (extra + 4); } break; case 0x18: // MMUSR reg = L"MMUSR"; siz = 2; if (rw) - put_word (extra, mmusr_030); + x_put_word (extra, mmusr_030); else - mmusr_030 = get_word (extra); + mmusr_030 = x_get_word (extra); break; case 0x02: // TT0 reg = L"TT0"; siz = 4; if (rw) - put_long (extra, tt0_030); + x_put_long (extra, tt0_030); else - tt0_030 = get_long (extra); + tt0_030 = x_get_long (extra); break; case 0x03: // TT1 reg = L"TT1"; siz = 4; if (rw) - put_long (extra, tt1_030); + x_put_long (extra, tt1_030); else - tt1_030 = get_long (extra); + tt1_030 = x_get_long (extra); break; } @@ -2446,17 +2437,17 @@ static void mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr ex { uae_u32 val; if (siz == 8) { - uae_u32 val2 = get_long (extra); - val = get_long (extra + 4); + uae_u32 val2 = x_get_long (extra); + val = x_get_long (extra + 4); if (rw) write_log (L"PMOVE %s,%08X%08X", reg, val2, val); else write_log (L"PMOVE %08X%08X,%s", val2, val, reg); } else { if (siz == 4) - val = get_long (extra); + val = x_get_long (extra); else - val = get_word (extra); + val = x_get_word (extra); if (rw) write_log (L"PMOVE %s,%08X", reg, val); else @@ -3050,7 +3041,7 @@ retry: TRY (prb) { for (;;) { pc = regs.fault_pc = m68k_getpc (); - opcode = get_iword_mmu (0); + opcode = x_prefetch (0); count_instr (opcode); do_cycles (cpu_cycles); cpu_cycles = (*cpufunctbl[opcode])(opcode); @@ -3097,7 +3088,7 @@ retry: } -/* "cycle exact" 68020 */ +/* "cycle exact" 68020/030 */ #define MAX68020CYCLES 4 static void m68k_run_2ce (void) { @@ -3106,7 +3097,7 @@ static void m68k_run_2ce (void) ipl_fetch (); for (;;) { - uae_u32 opcode = get_word_ce020_prefetch (0); + uae_u32 opcode = x_prefetch (0); (*cpufunctbl[opcode])(opcode); if (r->ce020memcycles > 0) { tmpcycles = CYCLE_UNIT * MAX68020CYCLES; @@ -3308,7 +3299,7 @@ void m68k_go (int may_quit) run_func = m68k_run_mmu; } else { run_func = currprefs.cpu_cycle_exact && currprefs.cpu_model == 68000 ? m68k_run_1_ce : - currprefs.cpu_compatible > 0 && currprefs.cpu_model == 68000 ? m68k_run_1 : + currprefs.cpu_compatible && currprefs.cpu_model == 68000 ? m68k_run_1 : #ifdef JIT currprefs.cpu_model >= 68020 && currprefs.cachesize ? m68k_run_jit : #endif @@ -4239,7 +4230,8 @@ STATIC_INLINE void fill_cache040 (uae_u32 addr) } #endif -STATIC_INLINE void fill_cache020 (uae_u32 addr) +// this one is really simple and easy +void fill_icache020 (uae_u32 addr) { int index; uae_u32 tag; @@ -4267,14 +4259,218 @@ STATIC_INLINE void fill_cache020 (uae_u32 addr) regs.prefetch020data = data; } -void fill_cache0x0 (uae_u32 addr) +// 68030 caches aren't so simple as 68020 cache.. +STATIC_INLINE struct cache030 *getcache030 (struct cache030 *cp, uaecptr addr, uae_u32 *tagp, int *lwsp) +{ + int index, lws; + uae_u32 tag; + struct cache030 *c; + + addr &= ~3; + index = (addr >> 4) & (CACHELINES030 - 1); + tag = regs.s | (addr & ~((CACHELINES030 << 4) - 1)); + lws = (addr >> 2) & 3; + c = &cp[index]; + *tagp = tag; + *lwsp = lws; + return c; +} + +STATIC_INLINE void update_cache030 (struct cache030 *c, uae_u32 val, uae_u32 tag, int lws) { + if (c->tag != tag) + c->valid[0] = c->valid[1] = c->valid[2] = c->valid[3] = false; + c->tag = tag; + c->valid[lws] = true; + c->data[lws] = val; +} + +void fill_icache030 (uae_u32 addr) +{ + int lws; + uae_u32 tag; + uae_u32 data; + struct cache030 *c; + + addr &= ~3; + c = getcache030 (icaches030, addr, &tag, &lws); + if (c->valid[lws] && c->tag == tag) { + // cache hit + regs.prefetch020addr = addr; + regs.prefetch020data = c->data[lws]; + return; + } + // cache miss + data = mem_access_delay_longi_read_ce020 (addr); + if ((regs.cacr & 3) == 1) { // not frozen and enabled + update_cache030 (c, data, tag, lws); #if 0 - if (currprefs.cpu_model >= 68040) - fill_cache040 (addr); - else + if ((regs.cacr & 0x11) == 0x11 && lws == 0 && !c->valid[0] && !c->valid[1] && !c->valid[2] && !c->valid[3] && ce_banktype[addr >> 16] == CE_MEMBANK_FAST) { + // do burst fetch if cache enabled, not frozen, all slots invalid, no chip ram + c->data[1] = mem_access_delay_long_read_ce020 (addr + 4); + c->data[2] = mem_access_delay_long_read_ce020 (addr + 8); + c->data[3] = mem_access_delay_long_read_ce020 (addr + 12); + c->valid[1] = c->valid[2] = c->valid[3] = true; + } #endif - fill_cache020 (addr); + } + regs.prefetch020addr = addr; + regs.prefetch020data = data; +} + +STATIC_INLINE bool cancache030 (uaecptr addr) +{ + return ce_cachable[addr >> 16]; +} + +// and finally the worst part, 68030 data cache.. +void write_dcache030 (uaecptr addr, uae_u32 val, int size) +{ + struct cache030 *c1, *c2; + int lws1, lws2; + uae_u32 tag1, tag2; + int aligned = addr & 3; + + if (!(regs.cacr & 0x100) || currprefs.cpu_model == 68040) // data cache disabled? 68040 shares this too. + return; + if (!cancache030 (addr)) + return; + + c1 = getcache030 (dcaches030, addr, &tag1, &lws1); + +#if 0 + uaecptr a = 0x1db0c; + if (addr - (1 << size) + 1 <= a && addr + (1 << size) >= a) { + write_log (L"%08x %d %d %08x %08x %d\n", addr, aligned, size, val, tag1, lws1); + if (aligned == 2) + write_log (L"*\n"); + } +#endif + + // easy one + if (size == 2 && aligned == 0) { + update_cache030 (c1, val, tag1, lws1); +#if 0 + if ((regs.cacr & 0x1100) == 0x1100 && lws1 == 0 && !c1->valid[0] && !c1->valid[1] && !c1->valid[2] && !c1->valid[3] && ce_banktype[addr >> 16] == CE_MEMBANK_FAST) { + // do burst fetch if cache enabled, not frozen, all slots invalid, no chip ram + c1->data[1] = mem_access_delay_long_read_ce020 (addr + 4); + c1->data[2] = mem_access_delay_long_read_ce020 (addr + 8); + c1->data[3] = mem_access_delay_long_read_ce020 (addr + 12); + c1->valid[1] = c1->valid[2] = c1->valid[3] = true; + } +#endif + return; + } + // argh!! merge partial write + c2 = getcache030 (dcaches030, addr + 4, &tag2, &lws2); + if (size == 2) { + if (c1->valid[lws1] && c1->tag == tag1) { + c1->data[lws1] &= ~(0xffffffff >> (aligned * 8)); + c1->data[lws1] |= val >> (aligned * 8); + } + if (c2->valid[lws2] && c2->tag == tag2) { + c2->data[lws2] &= 0xffffffff >> ((4 - aligned) * 8); + c2->data[lws2] |= val << ((4 - aligned) * 8); + } + } else if (size == 1) { + val <<= 16; + if (c1->valid[lws1] && c1->tag == tag1) { + c1->data[lws1] &= ~(0xffff0000 >> (aligned * 8)); + c1->data[lws1] |= val >> (aligned * 8); + } + if (c2->valid[lws2] && c2->tag == tag2 && aligned == 3) { + c2->data[lws2] &= 0x00ffffff; + c2->data[lws2] |= val << 8; + } + } else if (size == 0) { + val <<= 24; + if (c1->valid[lws1] && c1->tag == tag1) { + c1->data[lws1] &= ~(0xff000000 >> (aligned * 8)); + c1->data[lws1] |= val >> (aligned * 8); + } + } +} + +uae_u32 read_dcache030 (uaecptr addr, int size) +{ + struct cache030 *c1, *c2; + int lws1, lws2; + uae_u32 tag1, tag2; + int aligned = addr & 3; + int len = (1 << size) * 8; + uae_u32 v1, v2; + + if (!(regs.cacr & 0x100) || currprefs.cpu_model == 68040 || !cancache030 (addr)) { // data cache disabled? shared with 68040 "ce" + if (size == 2) + return mem_access_delay_long_read_ce020 (addr); + else if (size == 1) + return mem_access_delay_word_read_ce020 (addr); + else + return mem_access_delay_byte_read_ce020 (addr); + } + + c1 = getcache030 (dcaches030, addr, &tag1, &lws1); + addr &= ~3; + if (!c1->valid[lws1] || c1->tag != tag1) { + v1 = mem_access_delay_long_read_ce020 (addr); + update_cache030 (c1, v1, tag1, lws1); + } else { + v1 = c1->data[lws1]; + if (get_long (addr) != v1) { + write_log (L"data cache mismatch %d %d %08x %08x != %08x %08x %d PC=%08x\n", + size, aligned, addr, get_long (addr), v1, tag1, lws1, M68K_GETPC); + v1 = get_long (addr); + } + } + // only one long fetch needed? + if (size == 0) { + v1 >>= (3 - aligned) * 8; + return v1; + } else if (size == 1 && aligned <= 2) { + v1 >>= (2 - aligned) * 8; + return v1; + } else if (size == 2 && aligned == 0) { + return v1; + } + // need two longs + addr += 4; + c2 = getcache030 (dcaches030, addr, &tag2, &lws2); + if (!c2->valid[lws2] || c2->tag != tag2) { + v2 = mem_access_delay_long_read_ce020 (addr); + update_cache030 (c2, v2, tag2, lws2); + } else { + v2 = c2->data[lws2]; + if (get_long (addr) != v2) { + write_log (L"data cache mismatch %d %d %08x %08x != %08x %08x %d PC=%08x\n", + size, aligned, addr, get_long (addr), v2, tag2, lws2, M68K_GETPC); + v2 = get_long (addr); + } + } + if (size == 1 && aligned == 3) + return (v1 << 8) | (v2 >> 24); + else if (size == 2 && aligned == 1) + return (v1 << 8) | (v2 >> 24); + else if (size == 2 && aligned == 2) + return (v1 << 16) | (v2 >> 16); + else if (size == 2 && aligned == 3) + return (v1 << 24) | (v2 >> 8); + + write_log (L"dcache030 weirdness!?\n"); + return 0; +} + +void flush_dcache (uaecptr addr, int size) +{ + if (!currprefs.cpu_cycle_exact) + return; + if (currprefs.cpu_model >= 68030) { + for (int i = 0; i < CACHELINES030; i++) { + dcaches030[i].valid[0] = 0; + dcaches030[i].valid[1] = 0; + dcaches030[i].valid[2] = 0; + dcaches030[i].valid[3] = 0; + } + } } void do_cycles_ce020 (int clocks) @@ -4321,46 +4517,3 @@ void m68k_do_bsr_mmu (uaecptr oldpc, uae_s32 offset) m68k_areg (regs, 7) -= 4; m68k_incpci (offset); } - -void put_long_slow (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_long_mmu (addr, v); - else - put_long (addr, v); -} -void put_word_slow (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_word_mmu (addr, v); - else - put_word (addr, v); -} -void put_byte_slow (uaecptr addr, uae_u32 v) -{ - if (currprefs.mmu_model) - put_byte_mmu (addr, v); - else - put_byte (addr, v); -} -uae_u32 get_long_slow (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_long_mmu (addr); - else - return get_long (addr); -} -uae_u32 get_word_slow (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_word_mmu (addr); - else - return get_word (addr); -} -uae_u32 get_byte_slow (uaecptr addr) -{ - if (currprefs.mmu_model) - return get_byte_mmu (addr); - else - return get_byte (addr); -} diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 312b666c..6c1fc743 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -93,6 +93,8 @@ struct didata { #define DI_BUFFER 30 #define DI_KBBUFFER 50 +static LPDIRECTINPUT8 g_lpdi; + static struct didata di_mouse[MAX_INPUT_DEVICES]; static struct didata di_keyboard[MAX_INPUT_DEVICES]; static struct didata di_joystick[MAX_INPUT_DEVICES]; @@ -167,6 +169,7 @@ static void fixthings (struct didata *did) { int i; + did->buttons_real = did->buttons; for (i = 0; i < did->axles; i++) addplusminus (did, i); } @@ -174,33 +177,16 @@ static void fixthings_mouse (struct didata *did) { int i; + did->buttons_real = did->buttons; for (i = 0; i < did->axles; i++) { if (did->axissort[i] == -97) addplusminus (did, i); } } -typedef BOOL (CALLBACK* REGISTERRAWINPUTDEVICES) - (PCRAWINPUTDEVICE, UINT, UINT); -static REGISTERRAWINPUTDEVICES pRegisterRawInputDevices; -typedef UINT (CALLBACK* GETRAWINPUTDATA) - (HRAWINPUT, UINT, LPVOID, PUINT, UINT); -static GETRAWINPUTDATA pGetRawInputData; -typedef UINT (CALLBACK* GETRAWINPUTDEVICELIST) - (PRAWINPUTDEVICELIST, PUINT, UINT); -static GETRAWINPUTDEVICELIST pGetRawInputDeviceList; -typedef UINT (CALLBACK* GETRAWINPUTDEVICEINFO) - (HANDLE, UINT, LPVOID, PUINT); -static GETRAWINPUTDEVICEINFO pGetRawInputDeviceInfo; -typedef UINT (CALLBACK* GETRAWINPUTBUFFER) - (PRAWINPUT, PUINT, UINT); -static GETRAWINPUTBUFFER pGetRawInputBuffer; -typedef LRESULT (CALLBACK* DEFRAWINPUTPROC) - (PRAWINPUT*, INT, UINT); -static DEFRAWINPUTPROC pDefRawInputProc; static int rawinput_available, rawinput_registered_mouse, rawinput_registered_kb; -static int register_rawinput (void) +static int register_rawinput (int flags) { int num, rm, rkb; RAWINPUTDEVICE rid[2]; @@ -237,7 +223,7 @@ static int register_rawinput (void) } if (num == 0) return 1; - if (pRegisterRawInputDevices (rid, num, sizeof (RAWINPUTDEVICE)) == FALSE) { + if (RegisterRawInputDevices (rid, num, sizeof (RAWINPUTDEVICE)) == FALSE) { write_log (L"RAWINPUT registration failed %d (%d,%d->%d,%d->%d)\n", GetLastError (), num, rawinput_registered_mouse, rm, @@ -298,7 +284,7 @@ static int keyhack (int scancode, int pressed, int num) return -1; } - if (!keyboard_german || currprefs.input_selected_setting > 0) + if (!keyboard_german) return scancode; //This code look so ugly because there is no Directinput @@ -749,28 +735,12 @@ static int initialize_rawinput (void) if (no_rawinput) goto error; - pRegisterRawInputDevices = (REGISTERRAWINPUTDEVICES)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "RegisterRawInputDevices"); - pGetRawInputData = (GETRAWINPUTDATA)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "GetRawInputData"); - pGetRawInputDeviceList = (GETRAWINPUTDEVICELIST)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "GetRawInputDeviceList"); - pGetRawInputDeviceInfo = (GETRAWINPUTDEVICEINFO)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "GetRawInputDeviceInfoW"); - pGetRawInputBuffer = (GETRAWINPUTBUFFER)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "GetRawInputBuffer"); - pDefRawInputProc = (DEFRAWINPUTPROC)GetProcAddress ( - GetModuleHandle (L"user32.dll"), "DefRawInputProc"); - - if (!pRegisterRawInputDevices || !pGetRawInputData || !pGetRawInputDeviceList || - !pGetRawInputDeviceInfo || !pGetRawInputBuffer || !pDefRawInputProc) - goto error; bufsize = 10000 * sizeof (TCHAR); buf = xmalloc (TCHAR, bufsize / sizeof (TCHAR)); - register_rawinput (); - if (pGetRawInputDeviceList (NULL, &num, sizeof (RAWINPUTDEVICELIST)) != 0) { + register_rawinput (0); + if (GetRawInputDeviceList (NULL, &num, sizeof (RAWINPUTDEVICELIST)) != 0) { write_log (L"RAWINPUT error %08X\n", GetLastError()); goto error2; } @@ -778,7 +748,7 @@ static int initialize_rawinput (void) if (num <= 0) goto error2; ridl = xcalloc (RAWINPUTDEVICELIST, num); - gotnum = pGetRawInputDeviceList (ridl, &num, sizeof (RAWINPUTDEVICELIST)); + gotnum = GetRawInputDeviceList (ridl, &num, sizeof (RAWINPUTDEVICELIST)); if (gotnum <= 0) { write_log (L"RAWINPUT didn't find any devices\n"); goto error2; @@ -788,11 +758,11 @@ static int initialize_rawinput (void) int type = ridl[i].dwType; HANDLE h = ridl[i].hDevice; - if (pGetRawInputDeviceInfo (h, RIDI_DEVICENAME, NULL, &vtmp) == 1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICENAME, NULL, &vtmp) == 1) continue; if (vtmp >= bufsize) continue; - if (pGetRawInputDeviceInfo (h, RIDI_DEVICENAME, buf, &vtmp) == -1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICENAME, buf, &vtmp) == -1) continue; if (rdpdevice (buf)) continue; @@ -814,11 +784,11 @@ static int initialize_rawinput (void) PRID_DEVICE_INFO rdi; int v, j; - if (pGetRawInputDeviceInfo (h, RIDI_DEVICENAME, NULL, &vtmp) == -1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICENAME, NULL, &vtmp) == -1) continue; if (vtmp >= bufsize) continue; - if (pGetRawInputDeviceInfo (h, RIDI_DEVICENAME, buf, &vtmp) == -1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICENAME, buf, &vtmp) == -1) continue; if (did == di_mouse) { @@ -857,11 +827,11 @@ static int initialize_rawinput (void) rdi = (PRID_DEVICE_INFO)buf; memset (rdi, 0, sizeof (RID_DEVICE_INFO)); rdi->cbSize = sizeof (RID_DEVICE_INFO); - if (pGetRawInputDeviceInfo (h, RIDI_DEVICEINFO, NULL, &vtmp) == -1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICEINFO, NULL, &vtmp) == -1) continue; if (vtmp >= bufsize) continue; - if (pGetRawInputDeviceInfo (h, RIDI_DEVICEINFO, buf, &vtmp) == -1) + if (GetRawInputDeviceInfo (h, RIDI_DEVICEINFO, buf, &vtmp) == -1) continue; if (type == RIM_TYPEMOUSE) { @@ -992,6 +962,7 @@ static void handle_rawinput_2 (RAWINPUT *raw) { int i, num; struct didata *did; + int istest = inputdevice_istest (); if (raw->header.dwType == RIM_TYPEMOUSE) { PRAWMOUSE rm = &raw->data.mouse; @@ -1015,14 +986,24 @@ static void handle_rawinput_2 (RAWINPUT *raw) if (num == num_mouse) return; - if (isfocus () > 0) { + if (isfocus () > 0 || istest) { + static int lastx[MAX_INPUT_DEVICES], lasty[MAX_INPUT_DEVICES]; + static int lastmbr[MAX_INPUT_DEVICES], lastmb[MAX_INPUT_DEVICES]; for (i = 0; i < (5 > did->buttons ? did->buttons : 5); i++) { - if (rm->usButtonFlags & (3 << (i * 2))) - setmousebuttonstate (num, i, (rm->usButtonFlags & (1 << (i * 2))) ? 1 : 0); + if (rm->usButtonFlags & (3 << (i * 2))) { + int state = (rm->usButtonFlags & (1 << (i * 2))) ? 1 : 0; + setmousebuttonstate (num, i, state); + lastmb[num] &= ~(1 << i); + if (state) + lastmb[num] |= 1 << i; + } } if (did->buttons > 5) { - for (i = 5; i < did->buttons; i++) - setmousebuttonstate (num, i, (rm->ulRawButtons & (1 << i)) ? 1 : 0); + for (i = 5; i < did->buttons; i++) { + if ((lastmbr[num] & (1 << i)) != (rm->ulRawButtons & (1 << i))) + setmousebuttonstate (num, i, (rm->ulRawButtons & (1 << i)) ? 1 : 0); + } + lastmbr[num] = rm->ulRawButtons; } if (rm->usButtonFlags & RI_MOUSE_WHEEL) { int val = (short)rm->usButtonData; @@ -1033,24 +1014,39 @@ static void handle_rawinput_2 (RAWINPUT *raw) else if (val > 0) setmousebuttonstate (num, bnum + 1, -1); } - setmousestate (num, 0, rm->lLastX, (rm->usFlags & MOUSE_MOVE_ABSOLUTE) ? 1 : 0); - setmousestate (num, 1, rm->lLastY, (rm->usFlags & MOUSE_MOVE_ABSOLUTE) ? 1 : 0); + if (istest) { + if (abs (rm->lLastX - lastx[num]) > 7) { + setmousestate (num, 0, rm->lLastX, (rm->usFlags & (MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP)) ? 1 : 0); + lastx[num] = rm->lLastX; + lasty[num] = rm->lLastY; + } else if (abs (rm->lLastY - lasty[num]) > 7) { + setmousestate (num, 1, rm->lLastY, (rm->usFlags & (MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP)) ? 1 : 0); + lastx[num] = rm->lLastX; + lasty[num] = rm->lLastY; + } + } else { + if (rm->lLastX != lastx[num]) + setmousestate (num, 0, rm->lLastX, (rm->usFlags & (MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP)) ? 1 : 0); + if (rm->lLastY != lasty[num]) + setmousestate (num, 1, rm->lLastY, (rm->usFlags & (MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP)) ? 1 : 0); + lastx[num] = rm->lLastX; + lasty[num] = rm->lLastY; + } } - if (isfocus ()) { + if (isfocus () && !istest) { if (did->buttons >= 3 && (rm->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)) { if (currprefs.win32_middle_mouse) { if (isfullscreen () > 0) minimizewindow (); if (mouseactive) - setmouseactive(0); + setmouseactive (0); } } } } else if (raw->header.dwType == RIM_TYPEKEYBOARD) { - int istest = inputdevice_istest (); PRAWKEYBOARD rk = &raw->data.keyboard; - uae_u8 scancode = (rk->MakeCode & 0x7f) | ((rk->Flags & RI_KEY_E0) ? 0x80 : 0x00); + int scancode = (rk->MakeCode & 0x7f) | ((rk->Flags & RI_KEY_E0) ? 0x80 : 0x00); int pressed = (rk->Flags & RI_KEY_BREAK) ? 0 : 1; #ifdef DI_DEBUG_RAWINPUT @@ -1074,17 +1070,25 @@ static void handle_rawinput_2 (RAWINPUT *raw) break; } if (num == num_keyboard) { - if (scancode == DIK_F12 && pressed) + if (!istest && scancode == DIK_F12 && pressed) inputdevice_add_inputcode (AKS_ENTERGUI, 1); return; } #endif - num = 0; if (rawkeystate[scancode] == pressed) return; rawkeystate[scancode] = pressed; if (istest) { - inputdevice_do_keyboard (scancode, pressed); + if (pressed && (scancode == DIK_F12 || scancode == DIK_F11)) + return; + if (scancode == DIK_F12) + scancode = -1; + if (scancode == DIK_F11) { + inputdevice_testrecord (IDTYPE_KEYBOARD, num, IDEV_WIDGET_BUTTON, 0x100, 1); + inputdevice_testrecord (IDTYPE_KEYBOARD, num, IDEV_WIDGET_BUTTON, 0x100, 0); + } else { + inputdevice_testrecord (IDTYPE_KEYBOARD, num, IDEV_WIDGET_BUTTON, scancode, pressed); + } } else { scancode = keyhack (scancode, pressed, num); if (scancode < 0 || isfocus () == 0) @@ -1120,12 +1124,12 @@ void handle_rawinput (LPARAM lParam) if (!rawinput_available) return; - pGetRawInputData ((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof (RAWINPUTHEADER)); + GetRawInputData ((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof (RAWINPUTHEADER)); if (dwSize <= sizeof (lpb)) { - if (pGetRawInputData ((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof (RAWINPUTHEADER)) == dwSize) { + if (GetRawInputData ((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof (RAWINPUTHEADER)) == dwSize) { raw = (RAWINPUT*)lpb; handle_rawinput_2 (raw); - pDefRawInputProc (&raw, 1, sizeof (RAWINPUTHEADER)); + DefRawInputProc (&raw, 1, sizeof (RAWINPUTHEADER)); } } } @@ -1449,10 +1453,6 @@ static BOOL CALLBACK di_enumcallbackj (LPCDIDEVICEINSTANCE lpddi, LPVOID dd) return di_enumcallback2 (lpddi, 1); } -extern HINSTANCE hInst; -static LPDIRECTINPUT8 g_lpdi; - - static void di_dev_free (struct didata *did) { if (did->lpdi) @@ -1478,19 +1478,18 @@ static int di_do_init (void) hr = DirectInput8Create (hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID *)&g_lpdi, NULL); if (FAILED(hr)) { write_log (L"DirectInput8Create failed, %s\n", DXError (hr)); - gui_message (L"Failed to initialize DirectInput!"); - return 0; - } - if (dinput_enum_all) { - write_log (L"DirectInput enumeration..\n"); - g_lpdi->EnumDevices (DI8DEVCLASS_ALL, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); } else { - write_log (L"DirectInput enumeration.. Keyboards..\n"); - g_lpdi->EnumDevices (DI8DEVCLASS_KEYBOARD, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); - write_log (L"DirectInput enumeration.. Pointing devices..\n"); - g_lpdi->EnumDevices (DI8DEVCLASS_POINTER, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); - write_log (L"DirectInput enumeration.. Game controllers..\n"); - g_lpdi->EnumDevices (DI8DEVCLASS_GAMECTRL, di_enumcallbackj, 0, DIEDFL_ATTACHEDONLY); + if (dinput_enum_all) { + write_log (L"DirectInput enumeration..\n"); + g_lpdi->EnumDevices (DI8DEVCLASS_ALL, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); + } else { + write_log (L"DirectInput enumeration.. Keyboards..\n"); + g_lpdi->EnumDevices (DI8DEVCLASS_KEYBOARD, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); + write_log (L"DirectInput enumeration.. Pointing devices..\n"); + g_lpdi->EnumDevices (DI8DEVCLASS_POINTER, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); + write_log (L"DirectInput enumeration.. Game controllers..\n"); + g_lpdi->EnumDevices (DI8DEVCLASS_GAMECTRL, di_enumcallbackj, 0, DIEDFL_ATTACHEDONLY); + } } write_log (L"RawInput enumeration..\n"); initialize_rawinput (); @@ -1564,6 +1563,8 @@ static int get_mouse_widget_first (int mouse, int type) return di_mouse[mouse].axles; case IDEV_WIDGET_AXIS: return 0; + case IDEV_WIDGET_BUTTONAXIS: + return di_mouse[mouse].axles + di_mouse[mouse].buttons_real; } return -1; } @@ -1574,9 +1575,14 @@ static int get_mouse_widget_type (int mouse, int num, TCHAR *name, uae_u32 *code int axles = did->axles; int buttons = did->buttons; - if (num >= axles && num < axles + buttons) { + int realbuttons = did->buttons_real; + if (num >= axles + realbuttons && num < axles + buttons) { if (name) - _tcscpy (name, did->buttonname[num - did->axles]); + _tcscpy (name, did->buttonname[num - axles]); + return IDEV_WIDGET_BUTTONAXIS; + } else if (num >= axles && num < axles + realbuttons) { + if (name) + _tcscpy (name, did->buttonname[num - axles]); return IDEV_WIDGET_BUTTON; } else if (num < axles) { if (name) @@ -1664,7 +1670,7 @@ static int acquire_mouse (int num, int flags) } else normalmouse++; } - register_rawinput (); + register_rawinput (flags); return di_mouse[num].acquired > 0 ? 1 : 0; } @@ -2064,7 +2070,7 @@ static int acquire_kb (int num, int flags) normalkb++; di_keyboard[num].acquired = 1; } - register_rawinput (); + register_rawinput (flags); return di_keyboard[num].acquired > 0 ? 1 : 0; } @@ -2146,7 +2152,7 @@ static void read_kb (void) struct didata *did = &di_keyboard[i]; if (!did->acquired) continue; - if (isfocus () == 0) { + if (istest == 0 && isfocus () == 0) { if (did->acquired > 0) unacquire_kb (i); continue; @@ -2160,8 +2166,8 @@ static void read_kb (void) kb_do_refresh &= ~(1 << i); } elements = DI_KBBUFFER; - hr = IDirectInputDevice8_GetDeviceData (lpdi, sizeof(DIDEVICEOBJECTDATA), didod, &elements, 0); - if ((SUCCEEDED (hr) || hr == DI_BUFFEROVERFLOW) && isfocus ()) { + hr = IDirectInputDevice8_GetDeviceData (lpdi, sizeof (DIDEVICEOBJECTDATA), didod, &elements, 0); + if ((SUCCEEDED (hr) || hr == DI_BUFFEROVERFLOW) && (isfocus () || istest)) { if (did->superdevice && (normalkb || rawkb)) continue; for (j = 0; j < elements; j++) { @@ -2174,8 +2180,7 @@ static void read_kb (void) continue; di_keycodes[i][scancode] = pressed; if (istest) { - int q = di_keycodes[i][DIK_LMENU] && di_keycodes[i][DIK_RMENU]; - inputdevice_testrecord (IDTYPE_KEYBOARD, i, IDEV_WIDGET_BUTTON, q ? -1 : scancode, pressed); + inputdevice_testrecord (IDTYPE_KEYBOARD, i, IDEV_WIDGET_BUTTON, scancode, pressed); } else { if (stopoutput == 0) my_kbd_handler (i, scancode, pressed); @@ -2190,7 +2195,7 @@ static void read_kb (void) IDirectInputDevice8_Poll (lpdi); } #ifdef CATWEASEL - if (isfocus ()) { + if (isfocus () || istest) { uae_u8 kc; if (stopoutput == 0 && catweasel_read_keyboard (&kc)) inputdevice_do_keyboard (kc & 0x7f, kc & 0x80); @@ -2249,9 +2254,15 @@ void wait_keyrelease (void) stopoutput--; } -static int get_kb_flags (int kb) +static int get_kb_flags (int num) { - return 0; + if (di_keyboard[num].rawinput) + return 0; + if (di_keyboard[num].catweasel) + return 0; + if (di_keyboard[num].wininput == 1 && !rawinput_available) + return 0; + return 1; } struct inputdevice_functions inputdevicefunc_keyboard = { @@ -2276,7 +2287,11 @@ static int get_joystick_widget_num (int joy) static int get_joystick_widget_type (int joy, int num, TCHAR *name, uae_u32 *code) { struct didata *did = &di_joystick[joy]; - if (num >= did->axles && num < did->axles + did->buttons) { + if (num >= did->axles + did->buttons_real && num < did->axles + did->buttons) { + if (name) + _tcscpy (name, did->buttonname[num - did->axles]); + return IDEV_WIDGET_BUTTONAXIS; + } else if (num >= did->axles && num < did->axles + did->buttons_real) { if (name) _tcscpy (name, did->buttonname[num - did->axles]); return IDEV_WIDGET_BUTTON; @@ -2296,6 +2311,8 @@ static int get_joystick_widget_first (int joy, int type) return di_joystick[joy].axles; case IDEV_WIDGET_AXIS: return 0; + case IDEV_WIDGET_BUTTONAXIS: + return di_joystick[joy].axles + di_joystick[joy].buttons_real; } return -1; } @@ -2318,6 +2335,7 @@ static void read_joystick (void) DWORD elements; HRESULT hr; int i, j, k; + int istest = inputdevice_istest (); if (IGNOREEVERYTHING) return; @@ -2327,7 +2345,7 @@ static void read_joystick (void) if (!did->acquired) continue; if (did->connection == DIDC_CAT) { - if (getjoystickstate (i) && isfocus ()) { + if (getjoystickstate (i) && (isfocus () || istest)) { /* only read CW state if it is really needed */ uae_u8 cdir, cbuttons; if (catweasel_read_joystick (&cdir, &cbuttons)) { @@ -2347,7 +2365,8 @@ static void read_joystick (void) continue; elements = DI_BUFFER; hr = IDirectInputDevice8_GetDeviceData (lpdi, sizeof (DIDEVICEOBJECTDATA), didod, &elements, 0); - if ((SUCCEEDED (hr) || hr == DI_BUFFEROVERFLOW) && isfocus ()) { + if ((SUCCEEDED (hr) || hr == DI_BUFFEROVERFLOW) && (isfocus () || istest)) { + static uae_u16 axisold[MAX_INPUT_DEVICES][256]; for (j = 0; j < elements; j++) { int dimofs = didod[j].dwOfs; int data = didod[j].dwData; @@ -2379,12 +2398,15 @@ static void read_joystick (void) else bstate = data < -20000 ? 1 : 0; } - if (bstate >= 0) + if (bstate >= 0 && axisold[i][k] != bstate) { setjoybuttonstate (i, k, bstate); + axisold[i][k] = bstate; #ifdef DI_DEBUG2 - write_log (L"AB:NUM=%d OFF=%d AXIS=%d DIR=%d NAME=%s VAL=%d STATE=%d\n", - k, dimofs, axis, dir, did->buttonname[k], data, state); + write_log (L"AB:NUM=%d OFF=%d AXIS=%d DIR=%d NAME=%s VAL=%d STATE=%d BS=%d\n", + k, dimofs, axis, dir, did->buttonname[k], data, state, bstate); #endif + } + } else if (did->axisparent[k] < 0 && did->buttonmappings[k] == dimofs) { #ifdef DI_DEBUG2 @@ -2409,7 +2431,18 @@ static void read_joystick (void) if (data < -20000 || data > 20000) write_log (L"A:NUM=%d OFF=%d NAME=%s VAL=%d\n", k, dimofs, did->axisname[k], data); #endif - setjoystickstate (i, k, data, 32768); + if (istest) { + if (data < -20000) + data = -20000; + else if (data > 20000) + data = 20000; + else + data = 0; + } + if (axisold[i][k] != data) { + setjoystickstate (i, k, data, 32768); + axisold[i][k] = data; + } } } } @@ -2554,8 +2587,6 @@ int input_get_default_mouse (struct uae_input_device *uid, int i, int port) if (i >= num_mouse) return 0; did = &di_mouse[i]; - if (did->wininput) - port = 0; uid[i].eventid[ID_AXIS_OFFSET + 0][0] = port ? INPUTEVENT_MOUSE2_HORIZ : INPUTEVENT_MOUSE1_HORIZ; uid[i].eventid[ID_AXIS_OFFSET + 1][0] = port ? INPUTEVENT_MOUSE2_VERT : INPUTEVENT_MOUSE1_VERT; uid[i].eventid[ID_AXIS_OFFSET + 2][0] = port ? 0 : INPUTEVENT_MOUSE1_WHEEL; @@ -2584,8 +2615,6 @@ int input_get_default_lightpen (struct uae_input_device *uid, int i, int port) if (i >= num_mouse) return 0; did = &di_mouse[i]; - if (did->wininput) - port = 0; uid[i].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_LIGHTPEN_HORIZ; uid[i].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_LIGHTPEN_VERT; uid[i].eventid[ID_BUTTON_OFFSET + 0][0] = port ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON; @@ -2594,7 +2623,7 @@ int input_get_default_lightpen (struct uae_input_device *uid, int i, int port) return 0; } -int input_get_default_joystick (struct uae_input_device *uid, int i, int port, int cd32) +int input_get_default_joystick (struct uae_input_device *uid, int i, int port, int mode) { int j; struct didata *did; @@ -2603,7 +2632,10 @@ int input_get_default_joystick (struct uae_input_device *uid, int i, int port, i if (i >= num_joystick) return 0; did = &di_joystick[i]; - if (port >= 2) { + if (mode == JSEM_MODE_MOUSE_CDTV) { + h = INPUTEVENT_MOUSE_CDTV_HORIZ; + v = INPUTEVENT_MOUSE_CDTV_VERT; + } else if (port >= 2) { h = port == 3 ? INPUTEVENT_PAR_JOY2_HORIZ : INPUTEVENT_PAR_JOY1_HORIZ; v = port == 3 ? INPUTEVENT_PAR_JOY2_VERT : INPUTEVENT_PAR_JOY1_VERT; } else { @@ -2631,10 +2663,13 @@ int input_get_default_joystick (struct uae_input_device *uid, int i, int port, i j++; } } - if (cd32) { + if (mode == JSEM_MODE_JOYSTICK_CD32) { uid[i].eventid[ID_BUTTON_OFFSET + 0][0] = port ? INPUTEVENT_JOY2_CD32_RED : INPUTEVENT_JOY1_CD32_RED; - if (isrealbutton (did, 1)) + uid[i].eventid[ID_BUTTON_OFFSET + 0][1] = port ? INPUTEVENT_JOY2_FIRE_BUTTON : INPUTEVENT_JOY1_FIRE_BUTTON; + if (isrealbutton (did, 1)) { uid[i].eventid[ID_BUTTON_OFFSET + 1][0] = port ? INPUTEVENT_JOY2_CD32_BLUE : INPUTEVENT_JOY1_CD32_BLUE; + uid[i].eventid[ID_BUTTON_OFFSET + 1][1] = port ? INPUTEVENT_JOY2_2ND_BUTTON : INPUTEVENT_JOY1_2ND_BUTTON; + } if (isrealbutton (did, 2)) uid[i].eventid[ID_BUTTON_OFFSET + 2][0] = port ? INPUTEVENT_JOY2_CD32_GREEN : INPUTEVENT_JOY1_CD32_GREEN; if (isrealbutton (did, 3)) diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index ccb4088d..2bcb844a 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -418,8 +418,8 @@ int D3D_goodenough (void) d3dx = Direct3DCreate9 (D3D_SDK_VERSION); if (d3dx != NULL) { if (SUCCEEDED (d3dx->GetDeviceCaps (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps))) { - if (d3dCaps.PixelShaderVersion >= D3DPS_VERSION(1, 0) && d3dCaps.VertexShaderVersion >= D3DVS_VERSION(1, 0)) { - if ((d3dCaps.TextureCaps & (D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) != D3DPTEXTURECAPS_POW2) { + if (d3dCaps.PixelShaderVersion >= D3DPS_VERSION(1, 0)) { + if (((d3dCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) == D3DPTEXTURECAPS_NONPOW2CONDITIONAL) || !(d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)) { if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) && (d3dCaps.Caps2 & D3DCAPS2_DYNAMICTEXTURES)) { d3d_good = 1; shaderon = 1; @@ -1634,12 +1634,12 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth memset (&dpp, 0, sizeof (dpp)); dpp.Windowed = isfullscreen() <= 0; dpp.BackBufferFormat = mode.Format; - dpp.BackBufferCount = 1; + dpp.BackBufferCount = currprefs.gfx_backbuffers; dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; dpp.BackBufferWidth = w_w; dpp.BackBufferHeight = w_h; - dpp.PresentationInterval = dpp.Windowed ? D3DPRESENT_INTERVAL_IMMEDIATE : D3DPRESENT_INTERVAL_DEFAULT; + dpp.PresentationInterval = dpp.Windowed || currprefs.gfx_backbuffers == 0 ? D3DPRESENT_INTERVAL_IMMEDIATE : D3DPRESENT_INTERVAL_DEFAULT; modeex.Width = w_w; modeex.Height = w_h; @@ -1651,7 +1651,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth if (isfullscreen() > 0) { dpp.FullScreen_RefreshRateInHz = currprefs.gfx_refreshrate > 0 ? currprefs.gfx_refreshrate : 0; modeex.RefreshRate = dpp.FullScreen_RefreshRateInHz; - if (currprefs.gfx_avsync > 0) { + if (currprefs.gfx_avsync) { dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; if (getvsyncrate (dpp.FullScreen_RefreshRateInHz) != dpp.FullScreen_RefreshRateInHz) { if (d3dCaps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO) @@ -1665,20 +1665,39 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth d3dhwnd = ahwnd; t_depth = depth; - flags = 0; + flags = D3DCREATE_FPU_PRESERVE; // Check if hardware vertex processing is available - if(d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) - flags |= D3DCREATE_HARDWARE_VERTEXPROCESSING; - else + if(d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { + flags |= D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE; + } else { flags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING; - flags |= D3DCREATE_FPU_PRESERVE; - + } if (d3d_ex && D3DEX) { ret = d3dex->CreateDeviceEx (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, dpp.Windowed ? NULL : &modeex, &d3ddevex); d3ddev = d3ddevex; } else { ret = d3d->CreateDevice (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, &d3ddev); } + if (FAILED (ret) && (flags & D3DCREATE_PUREDEVICE)) { + flags &= ~D3DCREATE_PUREDEVICE; + if (d3d_ex && D3DEX) { + ret = d3dex->CreateDeviceEx (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, dpp.Windowed ? NULL : &modeex, &d3ddevex); + d3ddev = d3ddevex; + } else { + ret = d3d->CreateDevice (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, &d3ddev); + } + if (FAILED (ret) && (flags & D3DCREATE_HARDWARE_VERTEXPROCESSING)) { + flags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING; + flags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING; + if (d3d_ex && D3DEX) { + ret = d3dex->CreateDeviceEx (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, dpp.Windowed ? NULL : &modeex, &d3ddevex); + d3ddev = d3ddevex; + } else { + ret = d3d->CreateDevice (adapter, D3DDEVTYPE_HAL, d3dhwnd, flags, &dpp, &d3ddev); + } + } + } + if (FAILED (ret)) { _stprintf (errmsg, L"%s failed, %s\n", d3d_ex && D3DEX ? L"CreateDeviceEx" : L"CreateDevice", D3D_ErrorString (ret)); if (ret == D3DERR_INVALIDCALL && dpp.Windowed == 0 && dpp.FullScreen_RefreshRateInHz && !ddraw_fs) { @@ -1708,7 +1727,7 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth max_texture_w = d3dCaps.MaxTextureWidth; max_texture_h = d3dCaps.MaxTextureHeight; - write_log (L"%s: ", D3DHEAD); + write_log (L"%s: %08X ", D3DHEAD, flags); if (d3dCaps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) write_log (L"SQUAREONLY "); if (d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2) diff --git a/od-win32/gencpu_msvc/gencpu_msvc.vcxproj b/od-win32/gencpu_msvc/gencpu_msvc.vcxproj index 5f5ac7bb..49067870 100644 --- a/od-win32/gencpu_msvc/gencpu_msvc.vcxproj +++ b/od-win32/gencpu_msvc/gencpu_msvc.vcxproj @@ -143,6 +143,7 @@ od-win32\gencpu_msvc\gencpu.exe Level3 true Default + Cdecl NDEBUG;%(PreprocessorDefinitions) diff --git a/od-win32/hardfile_win32.cpp b/od-win32/hardfile_win32.cpp index af9d9331..443acab7 100644 --- a/od-win32/hardfile_win32.cpp +++ b/od-win32/hardfile_win32.cpp @@ -481,8 +481,8 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname) } } if (hfd->handle_valid || hfd->drive_empty) { - hfd_log (L"HDF '%s' opened, size=%dK mode=%d empty=%d\n", - name, hfd->physsize / 1024, hfd->handle_valid, hfd->drive_empty); + hfd_log (L"HDF '%s' %p opened, size=%dK mode=%d empty=%d\n", + name, hfd, hfd->physsize / 1024, hfd->handle_valid, hfd->drive_empty); return 1; } end: @@ -833,7 +833,7 @@ static int hdf_write_2 (struct hardfiledata *hfd, void *buffer, uae_u64 offset, hdf_seek (hfd, offset); ReadFile (hfd->handle->h, tmp, tmplen, &outlen2, NULL); if (memcmp (hfd->cache, tmp, tmplen) != 0 || outlen != len) - gui_message (L"Harddrive\n%s\nblock zero write failed!", hfd->device_name); + gui_message (L"Harddrive\n%s\nblock zero write failed!", hfd->emptyname == NULL ? L"" : hfd->emptyname); VirtualFree (tmp, 0, MEM_RELEASE); } } diff --git a/od-win32/ioport.cpp b/od-win32/ioport.cpp index 322fa1d3..49e6b819 100644 --- a/od-win32/ioport.cpp +++ b/od-win32/ioport.cpp @@ -161,7 +161,7 @@ int parallel_direct_read_data (uae_u8 *v) { return 0; } #else -#include +#include typedef BOOL (*closePort)(HANDLE); typedef BOOL (*executeCycle)(HANDLE, PARAPORT_CYCLE*, int); diff --git a/od-win32/keyboard_win32.cpp b/od-win32/keyboard_win32.cpp index bdb5400d..5f715d8a 100644 --- a/od-win32/keyboard_win32.cpp +++ b/od-win32/keyboard_win32.cpp @@ -99,7 +99,7 @@ static struct uae_input_device_kbr_default keytrans[] = { { DIK_Y, INPUTEVENT_KEY_Y }, { DIK_Z, INPUTEVENT_KEY_Z }, - { DIK_CAPITAL, INPUTEVENT_KEY_CAPS_LOCK }, + { DIK_CAPITAL, INPUTEVENT_KEY_CAPS_LOCK, ID_FLAG_TOGGLE }, { DIK_NUMPAD1, INPUTEVENT_KEY_NP_1 }, { DIK_NUMPAD2, INPUTEVENT_KEY_NP_2 }, @@ -177,12 +177,17 @@ static struct uae_input_device_kbr_default keytrans[] = { { -1, 0 } }; -static int kb_np[] = { DIK_NUMPAD8, -1, DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, -1, DIK_DECIMAL, DIK_DIVIDE, DIK_NUMPADENTER, -1, -1 }; -static int kb_ck[] = { DIK_UP, -1, DIK_LEFT, -1, DIK_RIGHT, -1, DIK_DOWN, -1, DIK_RCONTROL, DIK_RMENU, -1, DIK_RSHIFT, -1, -1 }; -static int kb_se[] = { DIK_W, -1, DIK_A, -1, DIK_D, -1, DIK_S, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, -1 }; -static int kb_empty[] = { -1, -1 }; -static int kb_cd32[] = { DIK_NUMPAD1, -1, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 }; -static int *kbmaps[] = { kb_np, kb_ck, kb_se, kb_empty, kb_empty, kb_cd32 }; +static int kb_np[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, -1, DIK_DECIMAL, DIK_DIVIDE, DIK_NUMPADENTER, -1, -1 }; +static int kb_ck[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_RCONTROL, DIK_RMENU, -1, DIK_RSHIFT, -1, -1 }; +static int kb_se[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, -1 }; +static int kb_cd32_np[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD1, -1, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 }; +static int kb_cd32_ck[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_NUMPAD1, -1, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 }; +static int kb_cd32_se[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, DIK_NUMPAD1, -1, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 }; +static int kb_xa1[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, DIK_NUMPAD5, -1, DIK_LCONTROL, -1, DIK_LMENU, -1, DIK_SPACE, -1, -1 }; +static int kb_xa2[] = { DIK_D, -1, DIK_G, -1, DIK_R, -1, DIK_F, -1, DIK_A, -1, DIK_S, -1, DIK_Q, -1 }; +static int kb_arcadia[] = { DIK_F2, -1, DIK_1, -1, DIK_2, -1, DIK_5, -1, DIK_6, -1, -1 }; +static int kb_arcadiaxa[] = { DIK_1, -1, DIK_2, -1, DIK_3, -1, DIK_4, -1, DIK_6, -1, DIK_LBRACKET, DIK_LSHIFT, -1, DIK_RBRACKET, -1, DIK_C, -1, DIK_5, -1, DIK_Z, -1, DIK_X, -1, -1 }; +static int *kbmaps[] = { kb_np, kb_ck, kb_se, kb_cd32_np, kb_cd32_ck, kb_cd32_se, kb_xa1, kb_xa2, kb_arcadia, kb_arcadiaxa }; extern int ispressed (int key); @@ -274,89 +279,13 @@ static int handlearcadia (int scancode, int state) #endif -#ifdef CDTV - -static int handlecdtv (int scancode, int state) -{ - int e = 0; - switch (scancode) - { - case DIK_UP: - if (specialpressed ()) - e = INPUTEVENT_KEY_CDTV_PLAYPAUSE; - break; - case DIK_DOWN: - if (specialpressed ()) - e = INPUTEVENT_KEY_CDTV_STOP; - break; - case DIK_LEFT: - if (specialpressed ()) { - if (shiftpressed ()) - e = INPUTEVENT_KEY_CDTV_REW; - else - e = INPUTEVENT_KEY_CDTV_PREV; - } - break; - case DIK_RIGHT: - if (specialpressed ()) { - if (shiftpressed ()) - e = INPUTEVENT_KEY_CDTV_FF; - else - e = INPUTEVENT_KEY_CDTV_NEXT; - } - break; - } - if (!e) - return 0; - handle_input_event (e, state, 1, 0); - return 1; -} -#endif - -#ifdef CD32 - -static int handlecd32 (int scancode, int state) -{ - int e = 0; - if (!currprefs.cs_cd32cd) - return 0; - switch (scancode) - { - case DIK_NUMPAD7: - e = INPUTEVENT_JOY2_CD32_GREEN; - break; - case DIK_NUMPAD9: - e = INPUTEVENT_JOY2_CD32_YELLOW; - break; - case DIK_NUMPAD1: - e = INPUTEVENT_JOY2_CD32_RED; - break; - case DIK_NUMPAD3: - e = INPUTEVENT_JOY2_CD32_BLUE; - break; - case DIK_DIVIDE: - e = INPUTEVENT_JOY2_CD32_RWD; - break; - case DIK_MULTIPLY: - e = INPUTEVENT_JOY2_CD32_PLAY; - break; - case DIK_SUBTRACT: - e = INPUTEVENT_JOY2_CD32_FFW; - break; - } - if (!e) - return 0; - handle_input_event (e, state, 1, 0); - return 1; -} -#endif - void clearallkeys (void) { inputdevice_updateconfig (&currprefs); } -static int np[] = { DIK_NUMPAD0, 0, DIK_NUMPADPERIOD, 0, DIK_NUMPAD1, 1, DIK_NUMPAD2, 2, +static int np[] = { + DIK_NUMPAD0, 0, DIK_NUMPADPERIOD, 0, DIK_NUMPAD1, 1, DIK_NUMPAD2, 2, DIK_NUMPAD3, 3, DIK_NUMPAD4, 4, DIK_NUMPAD5, 5, DIK_NUMPAD6, 6, DIK_NUMPAD7, 7, DIK_NUMPAD8, 8, DIK_NUMPAD9, 9, -1 }; @@ -552,21 +481,6 @@ void my_kbd_handler (int keyboard, int scancode, int newstate) capslockstate = host_scrolllockstate; } } - - if (currprefs.input_selected_setting == 0) { -#ifdef CD32 - if (handlecd32 (scancode, newstate)) - return; -#endif -#ifdef CDTV - if (handlecdtv (scancode, newstate)) - return; -#endif -#ifdef ARCADIA - if (handlearcadia (scancode, newstate)) - return; -#endif - } if (specialpressed ()) return; diff --git a/od-win32/lib/prowizard.lib b/od-win32/lib/prowizard.lib new file mode 100644 index 0000000000000000000000000000000000000000..2cb23ec4b151448ed374b79779428f05d2c41cc4 GIT binary patch literal 1138468 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 z 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
    AjdE$~Uq2)9L(cU3NUt1{~aoaUHv^BjJR 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%0Am?%G3y_rcyqXv+}%3?l>Z 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 z%0AwG>)6;$+Xx)n_;gFgElh0p(Y#Up3o+fJEha5>-Rk#T5xenjLXEbOjd-H=p#^0H zo95YXnddzm;-snwVKalG$`N+XW~=HHHlu|qhRKT*jA36zIGi+l#teWrOLP;GJ>qsG z75}jF8@8%CVTWN*&-e8}mricm_^@T^g~JLa#au@e1v)HJn(7&Lssr8HK=%{@v$*x3F<(>jkcHGlJhD(fzc7~hWLiUdXnO`ys7hDU{ z{+MrNPXd{jaX8lfI(R0y5j+q49>`#@y9I>d;{F6=uGW1T{22HQI0pO`sPp_8oCy96 zoC59wOF?DGbWjFQw6ED)^3K?O)m#`hPn~jbG`JAF3|tJV!&?Ea1ebtUd;aUdX7-!F z72s`P4R{xL1^5+kHTZ3in&67m$2Gf8f-e7Rcy0uDf$PCgIyD%SU0B5{YtHf?0^SA= z19iQ!3rm@Hb#Jw=lAuxg)by{to-ZYt^C(<9GZC~mRe3PA)O_g1w4;4t0|DoAySz0C z1{$Vd4?L`;16!^8u%Bae{n&C_@$Ju6PbS-RoPd;V3eE9GH_YrOS1N_~-6&u1P?bt9 zgWvuNy?@Mwgh@=!+7HCvtxKENd5LyY6xk+<9DQYNP(nZW_1d^hP!-V4*o|I&tQl+c^&-%#wGRmFqcfuu4 zKhWPa#EPt|BJTS@;)P;p`&!op)?H+chN5H-KG$$Z4k3%8ie@^s%GGGf8p1soF1=~-@>H0!xDruSgKDqD|3LtgX z|ESvJhRRfwB7_}(nqSgnpD$G_oKJdO-V(axtarhDHi^^KNrX6D0-$Ybd(ln7j z%TrWXGI@0AnBpnp%_NgQ2GxFkiJ6z7!wzQVB`<%_u)*d4efgbbzWiQsCSO>aj7mN8 z@{qkxUI-w?%u6<%!dD2_#$!M(hhJfeFTa09=@~`)-0N6{vIREPOi3YeX-1`($ETbM zVyc;!67*LR=Eq(*Jxx-@w;laiy_pyGYDf@YikX)Y$+d{%%*;#D95pKECL)+dxL@kI zf}6`P)p;inuJ~lWI6vJ4GkwZbR!EoOJ@gD4#@`n9C@f5#eU)C>c2}oxxt+o($hQt4 zoSKK<96&fVd11;)vP<4#=YCkH%09H;s`J$%kJ=CJOxnn)J$`)BU$2_?{l_mnsejr% z|8Sg_NN=i{wBB?vQ_ZAlST5B}T7}VfwjO(<(Rcn@{ZmHYc_!@%qwhSE_IIOCJ(IRt z{h$x|*Xm2IJTi&);hRLWpFO{ClW6Uu3nu9jlW2$fiTL4s{%vOtgU`R;$Ebo?!uRDf z^$zLm9C?tR$)Bn3px>m)lc=-PlOj%6+9SQuMxCf9MVuTYhRpc&_oRq33~7qdUEoP} zR#M|Ic2-i-{%0jMLThIwCD~cY?nb9sNlA8AQlklWR#K9kmDISVot2anaauV-ufcKoQY+J|B!8kweXF?ylWc;gJ8M2|=U9V9;bXPm_NGF=QP}*X7Ak+TC40uuDZ?vc zH!Tll8#VR$JfFUf(09-FlI!;|e>s^D>)(j28>{p^$`q(>j7G7UpLnA#ujSJtvN^!6 z$Ic?Np%G6p1NxW^<&F#yL$}}@BU)>p^ClNJKObpXH%tS#{si<3WMbI@O*bloRCui& zTNSLZlfzb3#hM>bk+nt#tWINRcJg5vk_u{Avnt;F+`~xrh@T@V{mJu;FR*W8>CTC5 zI4uNa!{s2^n9m7(Cj`$+rj_G#$VTBU+Lz61s&!O{WNKgD%Jd9 z@!Y(E1DQO0jkuMEzEiv#*wFwTbKu4?is(upMXp8^xu>q~>y4oDkGky+0T}>v)sWDH zxYZy{gnI*+1KtS|r~5hZTu_B}5cpM)F>3cgkn+M8(l*|Qz|rh)0u}$0pymvp1sO(n zw}aEb9;C4p> zSAv=&l>Y-D!|tx`TZS4bYwknV4;Z;$7@pT);D*EgNHK2=3ko_Cq+ z>v^~QJv$CFGd(thsjjw2cg5RQ8*Yn}!!K-1FX(ypUNe6~31ch0W=HH1y0KQLg8dJE z{rUN>#1}kFt|G6ZOI3vZW2WGrYBn%s5l%Xfn`D$hsq>xURS^#J8|f);;ucA42KAi$ zC^!(j6+9oj4OBWl2I>~>e8o zV;g6^!|K)h_=0|pXf#in)3;<}vZ1tb)^2lJa|9P;6H&i)%DY{mNpTR^ge3hoFB0h| zg|UsBbP1bSQhUT^n|_^W770ztxnMQ+cZ-)O%r$C-^+bw;Y-=vsSzolPpKJzf&1qz3 z&jqoYhw-4ccekpaIi`76{npIXw(*x>9KW^r#58Vl4{kE&s_N&Lj2^n5f3UL9&EdONnUWN-0^ zSJ(cO7SNZrRn(P3nTIGso`d zj*w=Ic&Np-#mpF5@UoI3^|nkb#CNjhe8bx$r4Vxqwtr>9RXIVHnSDPy`_{Lnlg$pb ztZC{#_n&R?p-shYBlp!|^=Wq6^w`E;{8VsCgSwYtZLOFy*Kh5!t$3dvxUWoW3dc4+ zQvZCc<)XIww~k&jDz=ffikZd!cL@6LY6!nF;G8hq(~Nw=ej@Ddp1!Mw8JE2NH*pl zB8@SrdKqcDk={hIX*rud%>_nRfTT_XWdmuL(al3rNx`5RlDZ3F=Ncq?#5$yWqiaO6 zN8FEO)BGUPc_x-0BB{%f?L322XryNY-{%A0zaZI^$_|iCX&1T)Hl@cP*_itv*;r0Q zvgbG*$)2MC>0Hjibs(K>&URtoJ1&qWA)RG>O9N>Z(wXMiOOWgpEkjZt9~LK)YEal& zi8RPabx4DaM3Ot%2@yM>4|?C7PQI&irmzF}4eQ`vhQIZ-7EaFZ;QtllpQ%9R8Z|JH z9KVKb?7N_Sf0~`vnSZG?DGkCz=QFSqBBn~v|4fcsokP#L>2$EWtGDgD4!cJ?U3}mE zQ>G5)4LEs!P>2134*U7MTUtvbImBODURPSPiXhRfw`q)}Dk;B`rY)MaoBdSHE4I_^MF;f90nfER+~ty}Evn|q$-xQp56 zDdk=Vb^~t)BjEplQShr^43xbx-qqc$U>5jGunV{yJQn;bmzj1a13}cC??b;;8c+3xH}W1%(;ufg`b>h_V!*gaXt6Y`Cf6a>Ot8&U$b7vvST{a^>*T7M~SyX4h25msgOG%U9H_S-W)wbIaQimAjcRYKQzzN@j3{_u(g(X|5}ob*X#` z*;h5B@ASKBeIh-Z(8wtaS9*|kgQ6Ujup9J=AO6p>M9g}s%PEXvUQ!)jg|~4zUVf6EEz1RXs`0*yMoj-E7u z#uP(6ixQe4gi)_qnvmidoQHH}peeJn;OOLZ70GF)5|ie0j2};~>5C{LewuIc(yTDb zjk=2JYA>LPM{ACiFK(~tWLJqW6@C!!s5P~fb-qsN>1=yR2R!ASy>pt6#&>^~mVW0Q zr7*;t($bRpM!svG8!^=Tv$P}=p>hgi#dH0PGMcg_tWqB|H@Ysl5$(bx=X?)*6IW62 z$V>P5@iOz^9i=eJpLet2q*|4VRKJus5~O;)WO$7FfGd9xHl6(U6h(1xbo%kr#!s9& z*_v!xJZf<9Tw~#>pgo~JFw&HC9*>bfeq!O|sgov68;77Sz$k1zjT-Fr0!9&!`T?T` z>!+T;sKMncMhz}ZGV@e4b^O$c6Gu-lW}bAcXT8a$#VXkLA3eIzDJ#=zC}m6HD;D`N zjK%C!>7?R`6Q)fnOzH=W8f-fP97!5R^&dO2ybh`V*y8HNY$sXWk{}^tOA4n>nOHJq z>X<^?O&B%U>nFTN3|HD%uOxBYFH^<}hx&;tD4H^H^q7g$#ul#Oq*E4pSJ7$V94{}= zA2X?R%9IHugLz*ay;i}?%Pkl>#Dvwi5J#JDA-;Wz9Y3Kcr?f&f&Z`gdH!j7u5Kq!fX-sIW zDh=*guETL_)*K`)FA$#wMLTZ0bYLOjA#;1R-YIKhS*1Eji+7kT69-;d|R zDK;Dr2K!A%hx4lcG29DdLwe`!5KieUJb-W{&zW%m;q=^^lPX+_ZxYHnhCB3c5}qJi z#vl4O37210S8A4nIqc68CLH-J;mBtR|E-@TB&yN-@nyoRG$rq(ANqF*|Gv);QXAO% zS1*T`?R`%Wb!JSycxIVdeXsV&HwAUfrDSF`)32B@x@>e^UG2>B+NBkByw7H4>1kM2 zR#&;aV#uJfI$rNGv-FIbRb8`UDI?jLStlz%<%$|SwHs%5Rpr$c?8ew_B+|O_rBlY1 zO&rHtr(Kb+c;b|zAaEHYS_Ia)`VqKn6^4U`45}>1XFwz~D-+eqx@CF~V~ys@6-#P} z{{#L_!Q{Kqn(UR^-aO?biq=6Q^3F|`p(w5mKlBLZwl5M zedliqK5O)yzbSay=sSN?@S4%5{-$7+`c)s|ZwhFsZF_L!vw{!6X9bqH?_1Y06#0X& z?A8A0fTn(^pB21Ebi{9|^6ft>IEeJNwrMeezd>Z{#u&vAlKPD zoG%}28uIh75PkRy@^y+V$V5)iuGAdLWd=Exl-g7$KxgwlKkxitnL+avg$7ll#@?Hx zi1~^_(+*K%?@dy~d_^(b=w$CrQpC|@pN8|I&R9?4n*$^b|MJa&Cq;7_tVV1L!mbC@JFn z6-k4yQRh`pia1B}oat?JqG(9+R}6G`I{9BkB(E6gFqh7Xfr`>2`CF#`jD*#&j3?Z+ zxuL=}XR!nnCfmm4rtNpNz-JD7wZH|WLsw-Dgek96)8RExlkASBXD>%qm@iM3nZ3lu z4z`7Wj+ulyrD8& zsZ)7Qac zD!jU!IiS+4eOpKTDPK*Z*ePF05z}|Hx;jDpyX+y2#rQQcUoNbyIc4VHT(GKMtYO z>@5#?7LqN2=OL+%hYcyp9x;P`au}V;tm=4Jq<$})^3|5(dL)g)g$*4~?M>LZg{^95 z*twmp#`ChZ(2S|sVdo1-YI(vUshBC!u=DLer!xExe(U)8?jc|BP_;oRQdkXPD(+-= zR!HZUuMKx&vM2IV{OzQXo!D1or z2%OHB%YGr456%G#zP?M&cf^IhEFc`WWG|hVqk+$(#e>pb;2E>z}@EkvV0{y4*|-ZE3lkOoV&S+K&5J z*0J%Ty(4~kT^AO0YIV^)VMr5KCy@7a{zRyBa10%Qt4{bJu5Wh&G zk+W`XnBXO>X-aP&=o}M*bsA^phn1?Nvvh4J%?i%a&737zmvLr(W^k5%iL;P(T38KgR>lE&JwJ`I5WR{aF&6ILr|KtcndOemZQvBf;AXt<{z!I z>Wjvdji=L}5+MU5i7HuUvxvR1D1C4e^$0ZoI^Th%SF7CEV zFmBfpj4x^l#%p&_L~YTa?&c zsxh>WJ~gu=_+>l&*{ZUJ4KtXg6x}$s>OzOjs);nSNTqD`5D6QrW=c)Ab1B}Qy8 z-$UwebO@a~Lz?^4oE&uXkvBkf{c`8XB*oR~XHDk$v6; zoSC&uHkOTEytuYv)hc?9(X0*le1VWFYf$t>vC9vNY58hM8p~H!SCq|QsM$oc$Mc;~ zxpY~@s=6{0A>}ukwcYcnq`OG8Jb1oKwDyFv%d6uRtC#^uP`V+Amx&=BtW#Y`x%Hj$ zU;{fv{04dY*>rw%PZog6pM~Hl;9^i^hxWi716G3b!76Y$$j`kRTmd$ME5W-!S`Am7 z<~86CK{|Nu&%tZJ=fSn$o8YyeUWu;*VFsJkBXdBPf0(;!bIjMf4Is>1V{sQIt@&hg z5qKN=6<)Y{@Z;=@5%mf1R*(**`*BaNZ(yYVoTvZ1r~j&_|GKAtz|()<)BniRZv}O} zpM#$Rw}W?sZ-So($!+J0pgR4ui*6tA>!2(HZv=G@=!Cn|K=Q_&1^xhxgPXw(;8yT1 z@W-H7+^t|MxDEUT_z3tS_$c^CYQ6m50OcRfu>QS3`R9S;y*nQKDR>2_^REG)1g`~u z0e%vE7W^{!8}R?Y-+~$d`5mab@&`~A;Z%O9SKU-@$~WqK*^@jrumg=G(HpN7siYmT zme~KpNVOud98anfE}8bh-GJ&v0XJ`acYo!@ex2!-y5>-t$SYmENcKmn6`zR87C7!b zj=CQ>t2rguH)OO!qP{*v9BRitvu!8!h{Uy{h=$p3pXLPhbqIcP3F_+@t1w%e!fAmf zhnkX_`Z_NNqpL_J;&sI*K?rRg^3F1aux_b`3Pa4~n3^WvScHdpB(k)#C6?kmF8hd znmbcyJ5gWXeKF1`@g?%`q$?sM-Os~K-nkS;=Q>nE=<8lQj*~+?$#+oAM}kV3Hgv=t ziLQKrlj8_iZ#UsB<15J+3{;ot$ zb*@qoIhPZMC34b-5CM}?IHRt-wl3%oNYnAFENcnbJK|s{o8tXFNlX2>T5FsJn^VQNm_pfz=U+7@h702Bz!sGENqT)ua;eyin&2oPTz~KBH;M46 z&by3eG4n)vgE=6&gNCbnq-~gXasLT#p31}YCqd_-&QjqL_9x9pS!PL zsCH(}_O!OITwllN$Tv;+$1nf*ABNp}V%MME`H5q8O_;OFd{$5R&TEkN;sR2!9Qh0! zeP@=Vx?ZW)AicrpJF^`B$LKq=9Dio?omq~5Gy2plN0}q}P_rCON9f4vqqUVQ>Xri)o?}rboi|-c z5$7bN-bQz-CwUCOmI*uRH=SHCvO(9*!nl;9P5z^EDI<*9J~;Zs4b}&-tE~D{&=qcU`@n6Q!&C|?^3qW$)9Rw1_RT{N#@1Dlr)mzY6?CO1zB8KT@b$5EctlsBSf~;ZZ*v9!6 z_O`3-LL;~^yI@oO^VeeoTG{Op=**3htt#fahHPl*j^*e1!}=0>*ok6g{<^Rw`x49M zG$HMsuKkr=>DO`&S~BK|MQ7qzww{PuvbVI1i}W>FWsXWkqgya99&R(oJgoa>%YyE? zEdk_@sRLm%S*ucRjoqnKhK&gq)q$|-U)hqPJhHx*B3a)>NY?jqB-Ny_a|K%)-?f47 zEl4LA-;c3Xtqwb%WUD(D)+Cw7srv$wYE4+?oV=2()c=FuI)1*>z*e$T3Drou!m1A3 zm+XmrKK_};*N*OfrGvkw*1CFA#){{j4*py5w>h`}8lW`k*a!I~ri?9rE_Dsio$y>z z4Or>xK*gyVpgdm8Pwr$&u9DLqJRUq9RL)cC-9qqeu+rO)gXge+19%>&(n75;i?QZ| zN-MR))C3Lg9RzRATvEWCi?6C&`g4E?ey+Zs>3Tam!^$<3yk<@Roz zwNpF2%z+%%IBQp9$&UKgz9#C}k4i9pdJe`$8RbHB`$v)LwvIkqTHW&;x(vX)PaILfl^C~?N zOGZO!D6!Y2p)@107j7u+lGuYw6;AABHk6*2*z49%+JQoq*Ud}K-lWv*)%hb0r6(nh zggceQr0O0psTA_4hSF0KA&+h-JvFfh8>&B4sQOJKjnU6%#e6DxvAIa>rk2~e6CRn@ zTeUl58mnyQH%#c|6Vf24HB9L3?{ycaEkDiJ==XI{)*4DZPOyB*x8o9i^eA}+dl5!p$?oQ&y`iE#DmafU6O(36V~H)PemOD4qj}cO<}Keog19=Y5lu@_Fn6Yi`f zo~{WkWjBe6NZIX{@avX{C(>CwifJB$Ex{a*oMi z*qO$B?S1%I4Yp=&2_|4^=x4rl=WN{^Yp2K@XeoJiyNnxQd3Onhotk_5VAUgSB)@F) z=u;Mljg?AuOzq=Tof&I8R$axgvHdy(Dci8_1{+-|TkAUui3S?qa<=NoWQ#N7Sr1)} zWFO=8NV&$hA<*5Abb-;m5a|9MNP7cGLlribGXiOFAdL+qEYo@6R6gwyn#Q!!HG$L^ zNaA={-v$@h9WUJ8XJ{d?~3Zx$d(ldedd?5Wjkh<^`w6UBJ zNM{Ao`GHgtNP3a6M~I(erQ4Bgn!kv|1D;aizo3Mj?+3o3C=A3m?EDmIfC(pivUC+V z;@3!L8R_>(XPR(-L^{pr5IS|gG{0Ak-gl>QU8)BPD{{r3I`}WZ-)HP8oX(Sce6np; zU5`?p?B7ihn`^e+uivrPacv8wNpb5lt3>xJVC*G&V9618SG?BIr|JbWZYKn~EHr%9 z%_sA9)s?I23?a|AmpZc(Ay53h+c_%W?}_Rs>Yt)nv9MOrtg5T2tys(zBs27SvL~LO zA8wUl`8n1^s`;>J2era?y1otUs2zFE)6?R(%I`6tu6;bHj`?IzcXTQ^37iIA3{D3t zz!_j2NGs#s1mfr33YLSP1qtIm04@O^1>@j$uoC<$SOvZX(&=}zNy~EZG_VFN0IvW? zgS8-bE*;M0iaeos#ClV_y+Fk$yIYD+AABi3vECHlrJ&-w98`Sz;7jq{1S-BeK*je3 zkoM617I+mX791}g?la(Z;4aYRU#28(0MjXp(su#t!A$TYpvrIyI0U>MECTC6*(~K% z#k~yt3>XJ_VR4(lyTDI?cWa;f^9Atp;Fmx#V!r~azk46}6nH48(xhnK^K0P zG|idUnRAt4!stP#FmeaZn(J%~QpX>ojprywIKAQe4lWQB7YcLW;2k9ycv31tY20K( zz_{bP;stUS+tEbACd^{gewq`kIW>uL3D(?&R$;a_Jydzm8E(?pX;WtxO`qxOY?wLz zF4&$K)fG)*1^8EQIU&csC+mPk+Taw%UTL-2w;LO?8V}#uFjV2dSq+staP9La6MZO6 z4V)UQZ=Uw_cRS}#HxovL5kG$tJi0G<@g6RZPIpKy!jCk+&pf(oPVGfIZ1c;Qe>Ufe zdgnS+9vxlRa)R6nGeQBZi60`1_Tzej!UZ3R@#$M}^ zcJausF3>2=hsL8*GiZ5q=E+`YnRLn45IeByrdO^kvyG&}9t?-BsBr4&abu=Uo;a@1 zMv%m!)3}FcbT1WcZ(N1UY$VQmfYiG2lc$XtQ#@@-l9fXd>in~RQ0R5C7C1Q1Jag>k zz4&#*@`ntzArt(%v9zS4R4QkT$w|epy9xctJR833Js(t^QpMMw_;QZLwtY4Ma6x=2_;stjFgB#l z+u2&6rc0U#SE~!foy9NJc^e4V{doE_Cz@dUJ+B@9M% zfN;wHKc)(of?xMa$8d+vuRBa@f#YYMYgn|kht07&Vl8m|5suw|DaUR`q8hzlJiEW~ z2>6fS*?lk=bjNrMy6YV7g>BJ}km&YDqWfU7=051w0kbA;{@?pgd}&+lz!|q4wKki6 z-VPr5sd#h$N!9`Tsekh!whp+o?p(dLRMZ}^4)|YT9q>@>ydAzdyMiGB6HL^@LrFwH zZA-)z5X}nSM`L;K8ht>fD@a(+V>vBey?E1P5O<|6S%if+CqMV!l#G=3CyYCI|8T!*CB(5Q2xCqEBlzgHU!jGfdhhCt|N?%J#Yg==~NXFKs& zq46HEt@in{f=vq^F8hv#jus@b-IOO`bH&Q-uwf4=7sJlUY?T7baI(IG*;np_%`}Sg zF09E9u0#@-YNomtgTB*{L9)~Ig`C2Qbu(2vNiNxL-RbB@C;3TCwp;fq`xo&$w*!~X zKj$j^I&$g8cQ#As55y7L^;Wkw%eEQ&WhjkPoE!KlZ`K-(<<#LgxVMHo zM+r5?92kvvOVN{~#zL3$3)w#dtN_mhmx8B)%f0;-Aj1V_Nj~{2*EO!%Ri+k(=&^_x(*s1G@=-c3e^qAiTI!}Ih^Y+ZpW=UO*WXgwj)8gV_}Xx$!X^11NMY1Dbq?mplIB${t?gh6qw>dhigN=$rFopE97rLNI0zg74h1KJ zq}iZ6R)1y6>aT?otk-ZP5z{L zja6(NM#D6<$9(CW6sxLtB&oHud|KS6XD@2J)Dnrzp|G8-aW)mlr$k6gH+(EfAxXb% znVBV1SGn1ZvvyE=b9?qH#tXIRd-Yj-)ShAttHb35c>7K@$KeI!5>?L4IUSz z40`s>ZH{B0tZzZX#rrJ%IP@$xt01l6;%u)8X`~)V=NTy<$%c~^A}f6>khTWWFOg^& ziTUL~rxnla5n9E}#&;Z&J;&HUSB_-E=^$VmZ>8Mv^r$<#4w13nX=n!p?7yPBpp=w*TN~3Nt9D zISw_-zLUMREOr!DD1KG4e;WJN*TyPKXvzL1#y?Ym43k1@dnfzfXZ-anw;Ure;W~cg zpfu^+FM=sJM&9EvIaV8=iIl#XmQPk`{t}P<8OvA7o|j#nS?nU;Qkd*>i9Vz`B?4h4 z>?#UtG)qsHfMcXpo(a>IL!hY(Yq8@+!Yq49$D!g-Lum3Xf)QkKd0n}QE}NjLVqQAX zRgw^~lYGl!mF8IAU>V1X2xX2vfl#ExoEbd}vaXmZa~sAuSrT{Y{-k@SeADy3fZyjm zJyZRzdQ_KyCxVxPJoAlZvGL$#?9T<4f%RZD_%(1P_$%-V@b_RX_yS08%KbBVCHNM2 z71)h)T?2}vbUm00t_SCWH-p!Lq|03o-U{9h-UfaH{3Q58@N=LTi+6#)0q+LIzq$t$ zKkJL&KftemJt(7J1y2S^tD6gc8ypWl1kM2;1TO<02E|>H{>$KF;5P6{a69-k2yeyV zTHRy8XTej!UxQ*O{sx>3J_puU8~9XV&p`)Q#%UsY+fFS5b6f6 z-TA#qFEwsENsK5Bqphs1sbUr0RrA+Wu85ac%wJWzXnxJ&bJ;7%m*<+wtIKN_&#$eh zt|(tsF@N;jm*R1{u&t;yQPT`V@^16Y!y3d{_c}iK@P?{RE z_HLk^Zk!=)IzOyekrRE|1xn`gkXwY&8DUg5}oXH$s^V-jCS-E=R1x%09MjX1lMivd+j$VIm)5r+z7KDO6#9=6$w_79tCn; z9I-g$hMKM2SWQu&F-(t?tfY&AFv|U8OHf_$NwAUzpE#JHHeSOR&!o+SR2 z?oudCjgTHoYd-Qfp7_m@%aj zCKa_?;dK1WQN!#6U1#b~CsScQ=g6G=KnX|F#!Z_rW%9Iua71gqpHp@)v86WVUt`=$ zY@_oB=~3gk_hK8JpI1;|gNkjGY1Ss)N~?Z~DIBTUMl+KNiV2p&nwLfk>j_t{l8aM^ zt1t!I=q|#XPZ|8x(I%J~?MTJaSxLAPY0F!B*l=oqQn8ILp)AWN_;JVDaK%8X_(}=) zi=OcJy(d@@Uk5f1L7X}5pK_LMWFLomsWEOY+v<+t4xN4TQ`*>KCoM~Hk3Hb0|8(!^ z57t~hu`Vz7u*o;$j~KW*LcaMgCEp}!(fh%@u`kT}`07yEH(Ab6S*MuBMjO*@?WC&W z4Yxz6YQ__e%F0n++c>|M+(%kZ$4hkiYHVk-(qep-4IlXU{ZS=55q|XY%BAIHMRSYF zCa@A?MJRd`%Pkm=uN;fLL^y6$Vo;gMu;TK2%!xooERaJ zB91-?*4u2<8R1D0XA+X$K%&l6Pl`B~B5718>Xds@#94);X^*HQgZ`2t#>P=UqZ2no zQpC9zNuvc(!wr$-uN7w}%Iw^^yOuX1!@`KI*YGL(Sx#)dUa*IbiyRYMuO=AfvAbgH z^~on<_NlS;)2-NZM{NCgEB4~3kyh*-j;+tLVjr}pTk$x=6A+2^_}Ka^t2|+6Y`q2` zh_-J|Z2jA$67j?{W9xTWu^&ghWW|$?j;&{u6r(+{jSobgqI)u@W#nsiwYu2Gb+O;0 ziEaFJ><^%(-yUxH^lRIVu5Z-r%jypHdLD>9kG8C3UF&zag$wQ_N@rgEKl|6N;ndGL z@s+^uoOmVh`%ru#@Q2sq^MLJ6d?xU`6E6W?aN@~P|JftQ_lPv9?3{Al16$D=LOb+tkoR-Z_hMQsRaifBBk4CY%x@B{o+Yf2Gn4 zRh!AGgfGV!fBQ!LDjswAb^OHJPt)f}TL)fD(4mEc(ca9I_mZx2xgI;_HRLO$@SNh^ zfUKa^o{sTAS0ZC|u0}x_S#^I5o(et*o&hoxZ@4ewuAa^QNgzXuZVOllejFSN>WNzf zD&6BjokwGUc9>mK@|ul%Jm09Z*ONSU)r^AQdJF|q1iexaTi=zen?0v~({ok*jmHiS zbDDQSunIR8XEYXPHWqhpEbh@*oZVR5r?I$iV{y)sZN=%K*ISFD>8-`brnMHIkcOsT z=;gb0XqQ1u?`+5aj&~jqCK^txVJgl z+NrWlM#KCbyQ~z_V1wpP2s=Oh)lMP55o(yyArRtZta!dym!H6EQt)&x^-DQwD#lvzEBuPV1~DioGed@1)R9 z>Ft?zu~}y+4pseUS4~}Ja&cV5uC3><4wg~2;FV+R&y`<)FN`S&Lp8bP%!~Ild2TPN zWlE1{ZF4TG9A3*{%b{8ZJ#+Ld3Y({eo(^F%a&C14*;ky|`h4FzmI)BArMV`MJ`zZ` z2GXYkNn`4^mHHZzZMnXMWY6(~!1v+6_mRN&slZngf%e$n1->r_zJCvV{}K46al!Vy zU6JguMM-Wb}iuL_M;H#yIY|I-2--iOV0C4U#51J-5_;E39y22mj>f)+q|t!9V%Abt?Yp9sCdE zxurDe+!upObvf4Qi{yiTZp|gHeW!RguyZCqy&cN&+;xRBK%JB4sCzPaF?c$t>2^)} z%mYio`QU7D0f?X0S$2_~%Rn_WOTb!iDR?zVop;xRRiMs&Iru4%=cfBbum=1-xDtF4 zyaN0)NE~h(SO=;%5(fu>v>e7%$Qn@Bb``h+ zU7<8pnPQ|1?=1Un=c@>tFq%K{uOczsJcbMFt!uJz+hbXOIIn3tDVSJ(J4nREF=nO^KRJ^ve=OGkMV`=;lfY0fn_ z$=`|(0%npkXqaRzq0@+{X8lswS7>)o^02G5w?KneIMlPfV9YVBtXNc8UR{_s#POFE zDlRM;H@RqH(bNfrUSy*N=ZzYaJ8Cf1Yt%5+FVEbF)yyD`t@A8lCS=)gBxAqvZ6wV1yvnXpZsO}OGpNV# z&h`yLN;?G8h#0!rX&+B@Yt1gWyMs}73Iq-I!}XEc2@0g zW>m?!S&f2mmMT=SxQvJCR7HKT6Q{ksnbGl1`z-vhPLOJLvXJa6tE^cVUqZL}-#%Ze zBq&A26Q>k01e2K+=guDdKWzv7r=6rXl^ub8 zbeU4ko?c}1oo7$0jlT2jsm5G-q;;M>y~pS~&z}C$=sVAz>fN+QTI$);U-SI`5YL`o zVLB+{Xqyhoktx)F{}gILj-ABxR$w{Q@9q!(#O7iXpXK*Q<2$`U zC%a?3w{xz;EK$R-CZ8kp@ZN`QNdFj(EOnSZ?9hAZIEQGDH(NLLQZ>dhsTyA7UHP8?P6JN?8J0CuiVMNB*k25u4OW2tz$$NFd7@)eFIDqt&zFUYJgNQE zJ$E51gIVyptS*|^W=^{_x1R`cztxk**y>o;X;*w>n6@MfHMNMWZQodq2y zlHT+tl5_*?ozvU2y_y7eP%hgNqx<|1e&hK0Zly1Hs4}50w89EC?w9OFDapon|7AvT>ew279ft1Tqs-{6 zo=Yk-6MP-0xK(B}>M@d^+<9cQumBtk4h2iW;ov3U2vBJuycw=$@P#sQC0j{RW7I&Qen>Y%7txl8aHNSi{9787+6*$+v@5&h+LzCfG8gT;GQY=PJiWxXj_Uw6yfu zE0z7;*M_>Ik3G~JcsG$bbE?wnTYH6CtFn{R(lj>op5m_H*}Huh+MpZBONJN1C6l za%MDMYQKKxE8^C%C#G#H+I^CZtg4?~>H&|olHKvY^5ydDd`W$aX8Rh8cAImyEbb3! zBqP^YD;e-e6{aG(y)oT>&1?cRb zs`PeC*I*<--}#65>VHn?F}}3VHPIXwdX#UV8*jct`DHH3YooUo+IaXJIw>CMrsN)9 zm2PvF;8tyei(eSUB=LOLa~kM-{S<>AZTehfkQDBv0+=0*06J$irX4S zb7MBu@90*SU%w;0u4ny@P*XU5cGI)&A9uNL?~0#tPLEeu+${Xb@9Sap=GzTL`!;RQ zNZ-;j_#2MPuG{4K8P2;+Jvf<))8b1^u^#3O*SMf12o2Wk9a+Hi%KB5 z_l~~dbw>Pt?eJGJJ$norlvPASk0hu0_6Jp9EyrSx1@hk3BJOQ?9zMPjYK-bGnA~QoHa=|3p644${Q^BTvkd_%*XZW6 zwZ7#@=NjMDY!zp=CNw?i(}DE$K+?^%&*H5}=kVjJ{6P0S(g34-ovn?pJNae9orz?R z9fx$b2`6fU)rq`d!(9H|FI{@i)lh1ibry1#dr2a-4iFB$7 zHySC&=r~0u>Yiq0^fdR~wd904!U`)K-obw({(e75<*ZK!{}9(^KXtZW@b~KAzu5Te zs%$?>cYH*LzPHk(b58~n{V0ERmK0s7Pqpf^caly7#~v%7ipRijyNCq-Dssmn^ruQVQNZM-zLj}N_#pum`k&^k0Z+_5>! z%IhjtGe0Bi4E`cCmGnuYS#NnqDEiWxRpc+pC7Q31TrOgI%^JE=bS_^bqxzV8WU|oF zz1VYF#b67F&bbd9$_m;Wx5j~l^0;77n*umPL^Hi4pnG=uZNTfi#tqhK7o4Qv8$2R{vd z0@U;Be?U=~J_G&<{4Cf8-VJJT$j^a2!7qWD$^9}YYYbln%fWAeH6YjEt^_xNn#rXX z?droO?Nj!Q)rJP}Y4*PfJ_BwB6>cl|TktUuI-2`9xE=f%_yV{c{1f;O@MSQQy#FgG z`zwC~PY3@Fo(0N358MR~19yYPAn!cxOz>@R1-KVn3%&!kfcwBtfuS_g2a?zBkHIh~ ziz(f}7r-d^XYgq7uV4=_o#Lkb955R^1LPjL=YkNiU6~~u1dav=f*P3M-nk`U9ykp= z9n>%dofKDO^s~Urz_Y=HAe0|>DVPIl=mPqjD_S~CaQ9m90`LZK6xak7f?DN@Cy@Ik zQ0d$VQdV58TU7$?0wLPDZ-cYJ6S`P^4p_$idEi2DFt`ZR8mkqcX^TKLFM0#8v>!>9 z_9KbG8Sa+V<$6-E@{Vn`60cML=_~JuzHkf|op8wn8cGSp>ToD>84sNPEatB&RSz z@j1tyn6!&hBR9s=2&_gOH0uMb(TVc)A>;SyCNewJcdPwzhnw_&vrcO!B#OmqKaBdf{h|sDCwa zuAg~Yh0(cIRaB_x8E4MbnF6(>qx}j6reXA4$Fr;2@6R>`&7^S(!`V~Xrl6?{T>I-% zS8so|DTaDSDU7}I7q^Q?Q7#QM_DU<3ud1k%2hLnY5-ml;VWG6S#xHrJuDBs`weMSr z&6S$F)j8aL30z6kE1$PDp|E7^#AzktN=piDM56}#%#=}s?J$$a+w#m)bUNJuTB?{@ zG@)qp)RH1BRdhZP)-n2z9$jcI@n2(b8v2W-a}KB(NyXse`RrVhm}rV-kr&1UWMi0FNz6{^BRri}6VBCz;?Crk>b!av z?7>qen>?1=-+9#l7JFe#KsKqEV@ltY0|=)_X4wIRQ&YbvRk)-oPY|3 zDY9k4Av4iRYinxbD^^t0<{!RQj)_NTXh&#h|D`mvT2VQ>KG`>G^D<=nk7rh>Nq|#3l_PvvTj)|mPVE@T%^FvaAszmOuE)A zT2@|5Fde1m44mBxcDu9N$Wc?qmQ5UI_Hyu?rNG?h%&hhJ*$5K}@Xp@@?-1T)*2jzc z!%1lSfHT@o?soK5A6G#7Y!5`=z^7ugO*Q(?jJ8Un@62fX zh|zauwCVf79%-E!Z5oj8k-{Fx>qeiN(e^|2b3VNGKrlucbaal;**=hTwt=* z_jHUaVAkd3`({-RhZ=YQ(FZpzFF{6R$eni~jjBWqe@{}x@z?8#8vfpKMknhm8Xt-p z{+^_WS+9p-QFKN4N{R&Q^+X*Fg!A-8r}cU?0u(jYStLcwdOaHLiaH;`S5m~R*P~bH zsPjp5k|Jikp20@gJaD0PvrPaKO_&e**i>x4FIES)#+uHWIIz`8sIn~c6?&=z;?(b2*+ zI||Ky{hpI*U-A4lSkFjo&ExGn7rcitlk+)&GAe9V3s!cAooQ^9QDMzfd6Gs6t!`}~ zas8dxVjB5Kb}_oiC!kPR;qqipWc%T`d~LUS26$eFSx&{NV;lH&U>KH8pEWhVlW`Io z9ibVyNHR{M<9(+%H}F$I)D_7w0P705PFEupe!qfY3HU8a= zuN_0K_B}lO4*q->V)hizWuD%Lt|3XfvHLH|N|TQL2*1RHy;=4rby2p_5t=fSRFvl$ zjom0t6=kJtidBgML2w2-!5r{Buo%n(Cxe5)3XmxTv-}UufU7id*G$o*XnPZPl9IpI zXUf!&N?~7nl6j@G9k`tQB=TeZ&N{E0wiMl5x~*sz;Vr4hBSgm5{gyP^0ybmz0gxS= zpEc|&eU(GpBf6<0W| zA!no;?`7ARsmchrnlC@j@gq0IbD-xnm+UEp75aRrWoFB>RT%+~>*X&I#$F>CI;>%K zn!hu1SX$H6w1(N~_1n@LuVn?MJxxz-`b)@tp-029PyIdA)-?Zun6@Uk&8}#ADt(jt!mh{`;Q3f&Gm8qblu$$QlBVKx64+3@)aFMKi{KpFeC>|< z?V->n@+GvXVP+Q=*O^+;Fr~|{V;g5LVV`qMUCRD%n~U}oHWux>DiQUpF?WMbIIcYB172Lkk&=ZylSHCq|H|9Xr$5}A1tofx&AJ*8vZ6?*s z4d<6_X1>*(u&d&zLlZV#4yqrL!l(mcpUG5Jju_9j!01%Pt?xxhx%{$CQ$!UDT4GZV!8|Y+`$LeMw+3USE z@cn+^`-edKYvB7^r-kbd-)xDJxY_#9R?GR3ZL7Rcv>W%x4WXXj^;mk<(Vq(iDf$Z3*v~e zbu(P2fU$Kvid`r)7u9i4uLpkq>N#_kRn+Qp*=W|Ygnp8T^6Z+*Mew(DJ`t=GL8T*- z)N4o^xVyg7HR(}x9=~;-zLcg+*Et*1qw!);9fx_~+28_Dk1qP6W|_ota54J}L3Ij{ z-5WrfGgon64t@$;4*nmw0^A1HfKPxN{j{3v)Qcq{k~@MGXM@DA{CkXq=z0+Kd&4@g~fLzIipg6f)l z4m=CI7n}lq5nKfRFIWlQ2i^wie4huK!5@J4gX-iz0P1=A9q=#U_rP7?_rW*7AAl-L zKLS-wPT`k&MVdNNC*P=Zr6&d4oSd9s_%>&CJ~Oh;fA)$rn$YdTr6ycwZjN3R)QC^` z=2bmAGelIALus1GHScWN3nWv^jm9tz7%Zo729A4z%L?|@>lBNis+~qVst&#*%pvi2 zD88l{9XaT4ln9dBj$ssLKa{5FWB)1={2f(RxdeY_q*a)$y^4u}#$2gC>hEc7m{~y> zU1>67Mb$sSSZP}`?^K1buG~X~u{tV1;8HPq)X3;Tu%Z4E>R87s)t!W&LKy!_6O5j_ zy?8&^jGiwIFZ!vU7mo8YFU?U(yhenv15E`%-y>&OZoN&(Oj7gKh8xtLKX+n6LIsDL7PC&jXZRv3kyk z*}|lrd0`4x&nWbo=NrRMjy5DE8)h&1%Lp^yYunY(q+<1`H*yPME>(vKcPzhD?3%R{ z(G&3eM79ZL8m?4!o^<@9UKkrv=glolexyl1k!yX9aHsXQp=fPWp0|#0^*kNlJl=*2 zuA>8+NDq&*xDUy0f2^MK4j`N!n_~_joEnbeRN+#vdZu;^_itzQybo*b9AWj0Kf>zy zZ)f$GWhAt2<-xCdm00sqP1mdZo~6khk?P8qS~k-AV~uJzXIMs8LY?Lh-bz0E;$y-`ue|f5@4cP#^9O%$PR@se zxpR&BGXDk4og-`ctXg9~02)}iqB`{*huE`p;Ie}v#2i%MfOpZ3=W!5Znf7L^0&dKq za&O)vx+G#s&S6@VI($OQu=m5NmF30+Q3V%>5#__Yz~ElIOXP&HInFxX{`m~+Mk7O( zbtB2LZuE+4SvQg*W=*7_MklLTk|NGnB#pjAjnynk5ob0!y-7ul)htO7rxKms5TnLw zmZXTY7M;d~qK@lH5$86fK}Pp+Pl`C-K+=;k>OAO45$AEFzDDd4$iz?PR|H)3H_Hv}abRK7b9l0z1F&E;Og1eH}iMv8L-?>Q>{>ywN zs5m$96GLP^KRHtE3b`UPy3bICtKo-}Kn*YOy6@(K+-^4?J;(hGw?%hgg%k61DrqtNr4|6(Gdc$5B_6vzhW!P{}RPycgtksQU-|D6#sSbqA z$3#|F6X;e4;noGZJCHOr9M;s3$97Sol!IY?TCbbO?`v#TSHha&@ro{!I^GeF1v;+1 z(*&o6nv$K0u5Piysv>+V*%Mi`tZv5FhWpz^GlhU9O z?8F3Tz=i2tHEeW*ri><4jRvE!8^x)raWucRR^{|3xUTVZFb6yXECJ61r-5gIi@~$O zYH$F!%G2Knp2NP*aW2>lQjOfNf>a}SBUk|H8fe>0)lqe`6Kj$zcScggaObUV5BpXZ z3U|FU{ zFv+47)QOgHLkB<^iE*$DM@`_@!?QzG+OK8MR8%LL{pMMFA<5Kl8VOUSv1D)j8K3a6 zZrJ}3Yi#4~!@drR*0_bRp-rJ*&IoO(O2f2M%erAY@iOJ9y`-uPleighc*J$Ne_%4( z#WW!GTl?qJ9JD+%{JR|LSsH4Z8EYH<}{Edy{bK`1ns#pSkD^jKEJEs=zy<-d8LNpbbGx`Gl!)|o`l|V zH_>p_Q-+2briN@#c%H+t$26tr%bDK6f#!cLsi$FTnz?W?zJ6PV2u3%zmF$hJU&Z9P z$32;~+r&)x>7i{lw+@YZ!h?YpLuE}glWa5FXRjY$zA!8)-0G$}zeN*iy1N zqKIw2(M@7&eN}JH z$2q=(zv`6V&MKXKI`~HwvAHVS&epTnkw~I6>D*fNDbda*6G?1So1AXtljmq^MHTrn zWwRYs#J8H$ktz}x$0;S}eWx_2T~@x1^YmkAFO{wd;8EaYP`y#wX7^OE6dVU$1kM0w zf|r9Lh&%z7fjuBB8=!kaus+Bcr~as2(JO}19{%K-vzG)MfkW5{4IDrxD#~w-wi6>cR;0E z1dy9R-S=kj|FL%_@KF?L8}FV8L!5vUG>EIHBckE~l7veR36Ma51j3Cg7()mW3?$|N zbO9TaNDf9((bW}QU0qjQ*WLBN3)g^1#1p(06%`c~g;i99s6f8|Th-GunGCxT+4G}+ z$vjV2RaaG4S65e8KlRobU;sP^yc+BYQf`)9yX!!?E+_M^pD)7n^FclXB2* z(+lV1c@2LP;YK36|K-9B`DQ1TCA5Wq<#OZfHV4Wt|JVOvC1bmkNE69}+&OM@FTbt$ zm+e5p4e^t{bZ|RZ35HZ!X?nZPKfAGce&j2f+mvs8!Tf|I7^m1tha?zuLY$4d!6ps1 z-qgqNs1l5jOhZ1ZA6SCXcjTM&VRgKWS=#Z+&C0p+jhb7<*|dw?n88gScV%!Fj3(2N zCPB`tamjPfH7^Y<(~vKa!O{rHG;XwG{;4vJyX|8E;)-+~moDU?^=x!e+Vf1w$ z(p%hhNRj;CC13C!9&uAjgF?oAkqI6B}Q*~CugSZVfUf9%aiF@JB;kh7EOs^62Uu!+bk!*Carq3 zbmgUGmESNLI!mYnrz_8pGr11o+kuoA-CGb&o{>XZ5H6N*!=i-?yVoU8a;J}u4EJwT zVr1pyUXoXweAvE_@I_^uyC z0Zz9P!m@GJAfnZFI!r-S{LTN$V1nI6yC$Wh%qNQ3DRe&uG z>}02jEaoQ_TCZN+9U;a~znI~%IRzt*P0HqwWjJaQIBNAuuU=vD5wY3ATQ+0NvgVpF ztsarra;+W_rqv_zg-P3N5vFan^iytPvqhM;*&=W3+GdL|ZL>v&fwavQVcKSkyn<_+ zEyA?T78$M6cun_4`F8q@yH3UiYz2jNxy$EU zl0c-^wrMidA58Ba#gj{7y+Vu;R$?f$g5aEwanpez%rJ^!w}F*xK)P zNG-V-Aj5ve?+#o2sV5LKF!|NMir61;(LwYutz)IcwR*dYbFO3{-54CqTk*=;w7sjlinpt_L1!V5 za2}`b)$y%`&Rx+W`+A!Ubiopn)+<5QW?NnK8A0}?L?)&>IM>Spq?0538>^l zjj?*0EBRID^jPzzDExX>+$bL&-1Rjvv7LSW+m!hN9dC5MZ>@?maUL`;vwz#BPAT*H z_K(9U=0zu;Z4Jm^n_fXqZa@7YSGyIkFSnmZW+~gV`b7$& zeV>BKjp#8p@vFnV3)8Xec6?o2bnP1p)4r!VZmeCvO(?PSfa#p3IN=IlI*no{++_~C z&Iu7N+=H74W@KOfPvgHR!atq; z;1OM6xe@*{b36DUHw`u-!e7?a(Ye(ha>ugQEy5x|Fi*cGY)DIHmgbd|W@YgjC+jPQ z=UL9(-Yi=$qh{paL}>&!iE|k{-T7Z?yYoH7l6W}YIu&dWW`PWlDx)zBfGYb&d?Hfz zjr?E*{*;TFc`xCA$Nt&i1K>H}!(cMF8tehS3i41;A8`AFJJ~-ElxAljxF1XbJ>*IJ zj|Nl04j^B#tUlmK@H{XRl!j$ASOk(+Yd$yzTnJK@)-|An`xQuD)rZ?DpnSN!2>b}l z0k?s<;1^&XC?9HPf^N#G06Y?01p2`ua1b~T9B;c{3`+c$ff8Px4NJiqFaRzCc@$YU z+WWr(xtlDxrsCg*^Oo;X`U9^p{ef4Q77%GSY09;mZl3O7-w3pEx!Ve%4PC5Tygvt9 zQdXz@vu^IHgU#JKY3^3*2buf%Sw|y+lct8#wVyk>eT$-=W4TIwm`--QxmO2$hQsZf zPd*mL^Y2l=y4e}bzHU0Cdh=q4?<9WZq&>1Yj?#U4~$OG9*2X6ysgSUfJK!Yn`NnU;f zN_ldV63={_Y2#wzrj3gUi&Hv6?Z$AB9>ep`P43n`Oo;Ya7h3Oagl@KqrL11LhyOg6T1(I>s&q&Cwe>&PVp%@+9)b4kTgMxVsz8117fs;r18Dx7&|V-?Wgh3D?l*(>pfLV4G`TSlc#HEU6BLD!TxW~N z5|XOMn~lDw-}kM2wcl%tyg{K@|0FxW_$0F`!E^$|1p_QdGMx}E;)oi=%Rh9x*T}wmb%Se0^&mRUsl8nheyx-r`n%NL zF%e#^^^-$wShLZRaq3@7_%yi7{^c~!`)T!wG*~frBlUt6S2eKAz`ph zW{1g&shzN`D!o;BAl5vVK&?Z8VrwUCu1Y^5JP>h8pg1Q`dfUh4X<=q=F*CQBnVYM! z+PJ?fuVal^y7l9wR!-Q#iH)_F+|<>P685dkY)qj>Qu6&)`<6aN>FAQCH0@$s$bnn+ z1B!bz%l&fDcGt1&hTHD?M{7=s3WeSWj~{t#>Bmn8n0~NHKkhu`JK13u!syrVn49OCb=)p+Sf0Z~hooa!;xOrBYq$Fxw#H$NFdg%mTvyF99X1iB zj}=K|qB@Th*Z{=}V7er)rrp%X-UmBJ`99>Z;48gHO%l=JHsRZia314b*jeg`k6>pi z_8II9#lC=bQQ^LUovPd*&3gXw-YpNk;3hqPY3?PgpqPCP_pcA@EcC>`KEl7f9B7-3 zlxzQNg#UcyFOO{9^Y2K~i4i@2$&;kLkFZfBoWcG^c(!zeDpvX%%}s%cp{}4QuoJ|V z7wyFR@u)0|`7BhDomHHdRhT~q!}}$4vEtfoCHPUqHomYlryyIe4w*epuUQ}mH#WW- zI(Sss>}hhKEaVqyoSZKV^8gl8l6S|P1_&ybCONgXKWylq#d#; z#u+)Al+7~sGWi$1m~4;GU1%iB*7r-~b_rSk`d%#T~;{(QKP~K^I>$QFceh794KLSO1`Y|Z)vb65XhS=wzSjyW0 z$^un?19L%fmp2!27lSn7UTM2uZ@Y`sRNUqLR>H5e-Ro?3k(^38o54>&d6W4X{1*HM z6w&i8umkul=m&X6w+4Vbn5-0VFE|FI`dfLnyL!`QU&q%Cxf4Woxsn*Q$QJXWOTrCQw>-Q%<_V#gGYj0 zK)Iig_gY;*#ty7=z_Y<*uq)UXJO`BZ6S)@Fc#vyhO$L*|MPN@*1`m6K4}iQ)T91MQ zz*oV6;0NF!@KbOw_&1O?(~^5|C@42rXa4n@nlSyQCX99BDRu28*GIbrrMMBD?f-Tu zu86iea?+u#xfEB18BQd?9p0Prn~ObT@Nt_W*5Y1P+kvFGB0imMhY@I*95uRCHQFm@ zBWX6dOu>zqo7q_tKWV~)n@*h*a<-;IS2-KE8Q_;9GU8^p+tU2pJt|BLl_YrXA=&R> z{A6oo_&HPAMyX%@qg^g=TqI2Nl@l*^!bpjQi$>*5(`_DO``=LPr}fkEBE+*@B}~)v zid9ER!`mHp%D{`>YJOfvs4ya23!Yadvc;(Y*jdXhy39^1=*3V z6a#Fu0FHUKvH3;WGW01&{}>7Iu#~L9S;JB@hbsxN9{Ip9TJpdi-6LecLE~#Wkrpa` zGcrex8aaCCXjW4k*wbn4odj_G7n@$g(%QMU=`_D=|4`rCy-%-X6*8pnEv9uGWMA}y zwY1h!eeZUvhUk0WlWrfI3;{;d#imkYKRlX#g582iQ*$7F?_|P!Y=@J|9xXm;hA-}b z4cTJ}z~;mkcAJX3M02YhM)qZkrtg(ciw_a*cPHpD(p*MMSDMKs3|l>OiVk<6bmd|3 ztsO>(w9}2qA4OvP(1LIzYaGdS4d0^ag{8qiDq6VddDF@+?mRwt{A9>+k>URB`rf3( zZiUlk@iN|D-azTFQL~J~xu%1e`MJe~C51Ce{awbM;U8Uu)t>yzvDTs1pw2H~@v*~} z)(-1?|KIC-xsML(du8(5f4si;s4#tR(qThwC5QFB4Ao2>aog|4owhQ@n*9D_3oqR` zTbaJcz1s&57TocRq}8kb@<8!zHTSP&S{2X7c=JWqK}PRl7ckgB@8ucRB7LuXZ!^ljN8kGjqXK~|!}YyS;WDv&&Ay{h0P7FM?acf0#zn9VT zex<`S(en;n{Rw*BUV)|YO3kZJ3>~kGoS=*S6TivtB(JYl0~4SVt5EU=+VoKYImvbspZj^= z%4>r$Aq2TLLeHip8G(dbW5}IOVoli*KVBz$HizqP)$;971`ArQla;TCN2()!&9A5i zJj%G54BUE@sWT}-k9=9Q!||=o7Qpef&KA$fCDpNr?ol7Xw=-KED;Hjdp*`|F%MK@l zw%TnPOs6)-aa-VotA*+Ko^`@Waed2w1^>ZKM&QIfxJBw;AB*r0*T2e__Xi^UBlWMM z+zpSvCHmK3o<8N+X8KoNb6To@&EojrCUGuf=XC!0x~Dcu-jcj=<*ide1_UiRC-fgm z2YWo2$37puln#~;TS^Dp8NAjGcPq#-)?Hv%@IDaLgY_tw1U?6z3qB9_1-F3x!Oy_~ z;1}R|;BHX--Q;aB$QM{+2qI2IqnNtL4|0 zf_zU>m59-D;+fB{upgmYP3jhIK=DWER%Oo60d%W|d04mV2ulAS>sDV0=~mbKs;;MM z4hmE%-D+mTvd81uZ=zdG==~%$$C%;!<7@Q#dYd!cug$0y#U(n@CO&TE6E7YyO*~rZ zLl9t&@9k;g(^~t)l-G$~b$HpeO0PN}k<>p)ubR%89G0pcmZ~a?y1l9D9%C`TbYl>* zO1n?T2KF0%>9WB7z;AcO>K*nXOn0hxI&LNvOS}DNN>xSLrq8VpjBXj{mJQQqxtOPh zK1+Gw&{EaA9rhqhpW9!YaAMiK8?ktd4Y0FRd~d?eRBSWs48=Zxby49yfk_uM!GJXD zq|4{!aLs3=RP~(*|46Co6A}KAQq{*I{97Vbl{~d4uVODDnpD;9VuWW~`i}NS7vq0e zsw!n8_X{0#N2*HS$7;*|&7iz)t^kLFyg(?aDzA}Bs(L%P1b6N-B~`r>M66}}7OVsB z1785|2j2r90QZ1@1VyU)5E#q-_An??)h9sYk!pEZk*Yq$zPvotfyf<|bXKIQYuOj6 z>a(CoRo8$;w!27G#l6yY7pba*ztwiX$95N~s<_wL?(&i$>1+o70&WAzyOOHXPAIAB zOQ1+qUk3f)E1*bKH-ahP8=y#4-vLFcD()gxeHWw_8SjH%+WrmTHujI>-u(jX0)7c5 zf#N>U-X9Ep!~Qt%Tku)%J5VI6jGS0+fj@xnf_uS_!2RHEkTSORfjsstlj}^|X2pWM zxLL=8F<>XK6?huR#73(t$ThK2K$h3GhJjviBp3%?3Nnsk-2%1)?*NYiMH(+sTal6< z3%(AD#P)3vslT-aJOPw@@FY-fu+IGdB&n+Oum3+tRb@orI120K=kBs%RaGJ_l&WTCrHvXqazt~fs!rfvFI8n#;H1QJmG)Hs{9~k(QPpViZN_f~VFt@M8JiPdgcel1OYJZ!AV1Nxs&nbQEG3+) zqYfqQWwdnD3HRX%ytGipvK=U0d0I@d!>EA#MAMcsifl}4K{$ExmbD;UEa5JT7A}fb zb#Y|4f4f%o@T$OAmOX5Xwm7e-u(-4@lAGB@rT(tNJF&Pe&Hu&4IkWvkQ6!i6yUg#? z>x?NO<#K9%F;@O2`^Tk@^miHh|6Z$lNLK~+(c~SrMT-GjnpVAq_h1fkQQ@{m>vl_c zZk}pnWhEZAL3>!EDw@+nrBS`Oq}3JE+iX}e?AO(=rxf^x{BLMf@0LDL6g#serT<$t zXb-O@{G(PA{#R>MwdvMFp;2ublcT>pBpTI!6t^RZ{0TN_52oauv+UX9&{?Dn#YOb` z%zO4Y6jw+KV*hURPC@qU>8zs6_aFL9Jlz?DI&3>O&S+{o_73Spl{dJHPYYCuz)Pzt zOODlcyvpnL-6;WBt(cDw#uamqc+3RFs^_?gldvT_Kz#M@_Est`ZR;qI@Eyudv;?K` zCiba5h;@JE-mSHrtlx>QG^>?b!_&Q93pR1UbkpS4t3Ql&zvi~BnffZOAhmuQeHHV- z%Jrp3lz)#2S<#WXHwH$z@L4jI9kZw8!kRD2RWWE~%@@nGLtsQpS}Cn0+70ek`@QK~ zB8tVun0^uIs2?7(QtP|2AHoGk)5_NpLrX;Uio!@gPi!C^RUk^=`T=`lwe~GA`PC*1 z4F?`Rk*_qQ-^OFBTc1Z^x>0L$o2Xj@mz&C7Eg!v*_AWhE)TMT@1~snpevxdKoi4$C z`{(8drgsingN=DG(B{}0Wn{7c(ep-k_Lcc+ls47+{?d||idW0}SJaio_E{`))lzT0 z43Zd}TTsc{Z%^?`ebPqhQMH+SvoF*+POiH^u5XIuihsqd=5m`+WM4e0o=p<>4}7N%pK1k=aPbbL!4U-@jPeQ$Bx?tH87pp z9>>>3$?90z!1NKv!E_F!r^F|`CYn|msT23$7OrWPPx@aHcesDJrgb3x@|iN+KU~wA zg8wHG{w>k82J_UFyfxFb@>Ufgxd(0mB@Zh=xpv$WT)W9OixYjca`PI?9XH~z-JGv7{<(>m zPEDJi*L4OXbYdia@s5sMNNWIL4b!#rRX@y!k5Lss{cMvX z%GVwn;ZnOvTSlE4ZW*;{(uNylscU6c z)mJG>McZO&OcFsH)2c(&d8&Nj>|PhNK`NG2ZR44Nz{kqGs(jE5H?Qhj`L>Ds(2=tQT>ot%7M{6v3e<iw;8rv&=6F8+)~$R|E-k^5QZSqBgSg4LPFxn+XJ~MX(mY*Qir#?+A6NXkX_pNm4J{0qf0u|k* zN%>2P1h9?z>u#2BWk+|_`TK)AQ`~0N`Hi7HSJlr#I|MZ4{8z`1DqCHfxr+tX%Rk48 z>^3q{wu}Pc3{)0%25YBo6h*M7dI(;BF1y6#Mr8Bwjs8f7vz zusrsA?hIWdEP1YqF?1K`<r<7*07`bLs zVEQ~NVe#b0WBdlDbN@$&J>{_H9kvgqWBD1^?HrCxFiwN%Si~xzjwJ=A!%530eG`u{ z7A7rmf-xC(reYVu&QL5D)?_I%c?yPT3bjm=bAb&U_?F+FGV`nj@tMKf_O&geWFCMO_)R<(W^9J7j`0E2lI& ztFXjS>$j_Q0ya^5f}5PrGIsj#|Dx^w2cB)Bop}`O3_by#3$6mkflq%o`6zk-yjC69zxz(#NbC@+W`LF918s~|ErWtHEK@a#G z$lNdMeNZHaJ3(3tOO{E*IGl9?NPpTAtDDDy6G4##Nd1WJAU$C5zlS$8Hw zafZCL3G*6JtXE2Z=f7PNC^Ca!4T5iPf&%*75 zX(hXC|4WiU=}>$5zh~o1dz+uTbhF(iH=J|s|9VN_v7|0r|1X}pQUq^$E3r{tgQ8il zlm<;6M<>pFZcg*_l4i|qiqs`|O+(fze`m)WYxs%z;H_7#wBwP|6`5XcL19Ur?WSU$ zF{7ZYM0Ij-RW3t{bBaNKKHuUC0@O~W}}4pDUv{%CVP|o zgr_b~uLD`HjJJ=HFr*&UdSzE9W(gA>GdCzP$J*(Be#>Cq*MjFY&^}7SXt#@+#3QyU zf4pVNImBUGrcC@vmMQho;UCMjnM&+drt~qgN0*frm6a+h+O}M8@bHvTqlc%C${3y6 zMDCZUEK~AsIq+P0xwP#^I*LD)P74)(S%ZfS9h5b6XfxxKI*osi;;%>Yk5T+3ckj_l zg%`!2&)8k?*~kHB8%DZaMWQMG3W7Dp4r6%Zn>6C$d^WY{7Q)rbU?-c5iljtQ{5^#G z3-PQ2Bz-Y9X)K~C<)%=LHW8+WeNReL5>4@UJ?=9I^PL?|l8+XjjE7y5z?6sf1YmRG zi%|R##Athr3gY}kQ~Z^Y@skO6qdeQ#F5*90x_<7xiKiIGTq#V52A&Oq73{vGTgx{17G1OGR!blWkJS;rmLCZ zrNZf5S)DaGDQscZv3Uh~IVE|b`ob7xUU83~zDRw#dq6uQciwcP#knwY3nZ{I$24)s zlxg{MrVPpGmN!4o$elgi=*rUX!w(P_XKAl6Yuj)-a8M_}&-49V=M)wcUR>z!Iw_g| z$!Gyb^G$Iy9-}WiEDS6zEIup@oRmLjdf`0GgZ1v#eNfOsSSNqi$p$MM8{N81;V)GC zg6kWH-A0GPhUHf@C5=2P4ptTTGnRvwH+Q`aDJsntRp*?X*?Ei_v~AZZ=wpbr>*h|g znmb+6+^K+Zm1wKZABXEwo?m*S6Ecc)vuEUEM@^kj$WM1L@}^5qMFKJ8{ZCQ>b~dsy zdmL5)9##P|aCpd6fMeWa-YI-3`S^i1zmlBuyVwWSY)|4Jeb=$a_?|xMy|31|XLrBD zm86DBaPPU{lqcS+-F3^SfBJ4s+oJWe8EK=-6>lz@Sakiz4Htju8d-VsAATc4HZzs` zeUql0e9yo|M~(`-(mLj^-!k4KpCIGS3$EETr0eTR`?qYa+;Ly8_vp{bkZip9_+J_; zPMlZq-SXKt-qi8F*Y9NrOSxav_1y=j=3n;JJ8iDo|JEzjjE8-#+%K7#o@I=0b>GtD z_Inc9Ido-gu%&?=ty&YM+K)I| zOVJL^(N1QX=-LiCGtHuNbZkFee)v-?I_e@zOinttPj`P;|Aqbm{zDv{bLJ|MCKu-* z1&vYi96gax8O!-O7t+|lJJOLfYjH|9D9mfb(ay=Iyg0*WGq2GZ)?c~F@=wCN#z2_# zX5x$?HuD-|VKOEZXH2x2*T{p(2vnSrZ!@nU7A@kG+X9<;jarzzg2x%x*vxC(0TYQ( zobg+md5x!F@;M~VSZy<}AvQeZ%{$K6Vl%I?8+L+n``%_=qXX~mGHw}X9B(tyl?>bZ zvY>3II^{BPS)j)nYt@nR$f9OY-VO0Cr%J|_+M&@Tfs` z`OcThe{g#!NNkj~m}R3>)py5owHNy7r~JkDz#5cbob(OC^jC&jQ(HQu@{vwOVE^dY z)Q%OdLAfU^ki@x+f9c?_u-zHtwS;nZmW-27LRLqRGP6zw32U7O@+I0j9qa&h2e|>1 zenj?Ve2cKk2H`2-RC|9W*o}Qj>l{$>!Wgmjdr;!LAEb|C$vMitTnQO;)@Ig(X)|lW z^zy*k?J+wXRa1>PjZ0o{i&&EDCg~cgDo1T&VAZ-T{K%WV`N`=L0NkhTIV2;5x-vtR#i_| zI5{0%;Ut%Gr+L)Sovv_$9Jiq`?Un`8)$9V8Tn3K_&1~Vo#W1-yJq8^>xe&ZYmGCR~ zwMQ2Jwm)rGz@&Zh7*{)PQaz;FieGTMK1ghoYI`(X!pcxusqG#FSvtIp^3|8ADClA1 zqxc_TFDNPT%!u&!xWz%v^uX0#@+8Mz$A9Saw3c2)tM)oJ0#kj$tNmo2iWm>tUYN+~AQ8ZU))oxNAXjLMD&a_A}a6`Q4op!RuZ*|!g6;iubE<+FqwbtdR4*$N% z;q2)WQisbaP`Fp9#3s#(4HkcT^6sXmFMFW{xJ5!mneJE0{pzKUNPQTJE^P6Bi;J{i zt#9SR??ne+*|=z&$j&N}omW*#o!dSjc{giOpIy7OQVz1OXFnZ9Y3rf=b}smO`;j$E zdrIJ{rL6?|?d0g?iVjZcSHIxTT*`eTe2*fi+gzQtOP02-eJ-FfL4Bhhe)HSp-Tihh zypRm+Uevyp$Z_mPiok-nlz!_Ld|jKiYv}fOWMOMbp=P;GPbX5lT!pOCnF#2^YZC(% z%DK8b$5yx7z9P9%ol39T8zkO9rPOr$d@6UB#Z<>{can}R^$rVEsC%J0c4)t{T?^i| z7Vb0VjwLEvdr8hIkLt7?O3&|0s^f$tLcS|9^Wn%cFUqv4iuQ7UviAA9n7(QIinq~R zs7{ZWwzIrG=8Uu*WzP~L1=1ml{17xN5Rmf=E;ZezwrqdEhW?JrKY7%~ zFNRj@=HWp16(?RJac}Ug{7RaKH+@gb5VPgkxv-3OBl_>xcB-Q?$y3W8yYir zl>PCab6%X}J~_cP`UGbgf$_1iV|C#TBU|p>?%lTBuvS#H)eCn88;Xfk0WD;-i$foU zs&RAq+CH+fy=cXCd!B-hmb&K1F3WbJ)RdZ5zRndGZm7aPz-0>F`&2Y_`v>}0)v(I? zXtQR6d%gAHPVe}(%W5*(UR$>%rfTB;s!@&JVQ51ARi2tj?#{ldiDv({r7`{E5aXu( zpb|PzLm6tccd0hJCg$2e|7#DFlB;Tz+fHd{jGa`ge@;@Ks!^?jNyXYp9r4de%3C!m zE|^psJE^uLbyEMh(&Md#KNzL$Yty!+l&@pu`EBJ5DZZtHxa+q|*_yR!TWZU8X4&#r zU1=7tGw9(Vex(Xmm+`o85ggU5zUQbnJn?_@tr~n*9{6r`YBg0`Rp}VJO4lyjs;ewD zu6E}noyppTTWZs`PNGH8`@|n4F}TVJvFU2Be(fm2cqjxtAUfw8ByZWqGjeJsI{*(aJUb9`lZ zS0DRF$M-46?FGl}EywM1$F0F(9x8;6CBb2*!gOlM4jbh7j&|5|Sfa{bu@jD-x*ea) zRMIhvzCnk3zzMg?Va3$gR29p0Fnxp=$JT7U!~W{9j~(_cOvfx*Zk^|L4m-(VT^)8I zOdqk(ajSLMOOEe5j@xGr+vBiSo?vQ8FdbhCj5lJg)+kt-Vi!2!W;)^SbKD+t*wMU` z>D-^}utg4A>afoow#Q**vB9#s9@bT*dppc7ahQ&ImBXHQ*gFnu#qFbyI1;AM<2aZ; z_Dq<*9?3ABMhfg~Qu7#TurpM;BVk<>8{@D^u+x>>REJH2ou-bx7-4EfCW3WsepW8zpOQ-d&;IV_IPbVpT ztmv=hoo}=Dl(n`PjtD8V$Fq`E0g|!VMFn};N+;%%BZ&RC98pwQQo{H|Ts!GmM&?cB zgFNeeB&l8Y^lqX$OnSkQ*pGE5Y}{CEzZw29$1UEtmlEq)~=+uLD!qUk;83Zv;hs{!38w)Hi{@0B;7D zgTDfQ3-Z=siMo6RxEj0_d
    +yed@`~tik+zZ|T%FM*yfX9P(f@gqtfxW@sf@vV< zVr7Gj0$MY{`@y;3AHWLm&)|(9Pen`SdaMNR0v`h(1Stcn4txUK0#KLi)r`&ZijRp3_Kmw_LHw}GF6_k-KO)!=8~v*4GY7{J~MZUMgrw}M<#>l5%> za2wbFegl3Fia}oq?~c(beLvX9es_>MV987n7kHlSegPDkWZ@~+| z29O?@)v7frMeqnP59|P544w++gZ;qS;0O>AuQdwf-m@+OF9mbKQm_b|3zmZ1lh&2s zLU0*)1$Z}D4n6`_fRBS$fiHkdz?Z=q@Evd|_&#_o_%{$E*wzo=4PZMSZ#RQ}@K<1G zkeMY`FYs3IT<~^qC@A+y1}No}1O5)o1Ah-*4L$(=5_}lE3w#885L^k?fscY4K}IR8 z_rWK?BWNesNe#_* z;ug?Dv%>VytT3<4cTwMC;?&IFbClanE;V!1+N9| z+h6rdJ!?g$}Jd$mMSS!^pR=jJAM@7}Fw`ZOaY7xQ}E@~0Qh zz0VNi6mBDBMqW;7x9;6dV%9F3AN_A}w!`K=v~7o;=}@r;q5kAM30U|Fb1 zdMY*fP9|v;=jGX{8~Q9}=M)qa=Gtz4y9{}Vs_B+eVjgu=&h+465+-{_NnV~)HMPsU z;{4KJ+`)L<)EK>qOZaS%HaH(>o{7&sO2Uv<)OjX67M-nW%+h&0&^!|!dTNs}y0&CD zi6?tTVNu>39Y&Xra2`d@)-lUt^IFtbx`91=s97zu3#XSkQ(9=bB4@K^2dBB{WLrGVC2jbyA(6t@Ej~+g1P)c!lVodre$QnPg zRNkpldKlQq?$yg5+WxVP?Bwn}Rq&9F>|vb@BgMY-;SV`+l1E&su6uR}Aj*uHz1(Rf zge#O9#nzGklqfT1WHe(5Pn*Z=CyqSaqRlkfh5Hu5yl%gg%OfV*jG2dV_wY*j1pl(h zZ5b^-dGPc<+Ayl@XMhu5#LN}(e!>nT@yQl##!LngyiB;`>}UHR!bMAW7bkcZg>lo# zDk}8|KhTVs=j|{$q@8X={x}6=Lkq%5xqj4waMC<~8ZBIunJ`~QhWmHVgh@I)6Xvjq z?87r*N~Zj@nK0Z&hiWFwF$|L&>`a&r%qX#2aT+C=?lLF4gb8m9Du#PBd2}AiDKgFC zn$1^(XtQSI1pk#YV-gH)A3N5OHDxCqo*?tzHbF*)7u9SL6O1>{TYBLggD$N3p&Ai4Un7oe1 z8CTlOYg`NKuH0_0nb)`rCa?Q(#yvLk8jr$c+%L`$@rN+4A)l;zD>oT-7v?qOvz5Fx zb8a^C8XjJePf%`Nn|Y1XVaF)9vuwtU8upDq)mYr`6sm1tFR~}OXt_TYuqU+Vjd_llF`u2k~LNb?%Ft{NQWoswavAy zS#>d((b1-!X&i}TDSni@iQ~Z4AH}-gN(m(VJS?D0=Xjk7MZHIG9SPWbBq*ZF)v}Wj zzLOc;nH3vY9zTkDGn3rti+?~fw=w~wb-5Ia;d+KTW?y3&ZqhY?e1%QDg(LYLUpTxz2Nq6kk}}7 zOY$bUl{$N`?H&Y~l@y%b0X2RX^srH;f5h?eKsJfz7R5q8VhJu>7c-WZ z{zJMLdwK_N5s{Tw>W{rSmG^5LCI?+XiBsyX2HX_^fyFddU}U;Yp}zGP47r*GQDH*j#A2cT=F|j4eeG> zZK$5Q4aGfkIyzE=n9;FR%ki5};n+qRNHyE28mWGii#-KnDSDW3W2@8jJP&&k#!@ss z<8*v8rJdFX2&-)vhgMkIi2}pU42(Oewo#{z+1(xD0o4GB}=KSi+ZNb19iLMQwRi(Q^`|hfAcW5uBDm^B&*QzSLRcOysmF}_Td+gbT zB-Xkry>(e^#d=i1DXmS6@|M?~IKo$%i!4VUrQ2SaB{(KQZtCUUEKqd8Yi>Sk&BlhB z4OPEf$s0drc9ZMYEqN4r1=9m6UtQEyw<&?8M~>r&?QZ1FzLl4vCjS|7arZaX4_8W2 zrj)OC^;@&x6|sA{ z4%KNpQ|wFIP%B)iwYR8Cl3a%bS2b$qrtO?NF0eFN9yv7$W=)1^RweYQ%4ki&gPD7z z{5i{wzNa%A`fXfvoH#!&_b`g|jp%Ck%)n2kLNt`uxm1+>(smaAK{D0i9J|+H-dh^K z+B77@Pw!MB^U%B)Bda>CAtK+EyGuK|r*75L6KWFNwV4f739%_U1M765sRNU(0vUi zb7e!hL)z$G0|>GQD;}gL}PueN9X|?OT)KHS4xvUHQA34G7h% z5|TH5>82uN3|Q)YzN$@f&G-QU&O?OjaGr8;!DV`l#{`-PZT+GJpBPt%ls}rAH5~U3aQFh1Th9FWqs-CwGZDQHTGO8E@xiaI;G$0;;*;I z*Jkdhs%ZC^o2w|TtTDLXgv|?Hsx8}8J7LGfnX-^@a54o~SyxQ0o8~|*|JHeD0>|nP zy|zAEWzf#rgl)c+t4w*O5@am5psAj#%%}XTc&O(pHC64X=c-g&_xFK{)>5@}ip&G! z;BW=ER(9)ODve!L#CEb)ZOb!`!+Fk;u>E|M9!7uV-iu%9jCza#{PtCBFu&3j)Jkp% zkzkDGmv$bv@%(Dv^I<#-@SVf29G_rV4wEOc^o$bJvrhXy$iD8+F-BrDQQ>K~FCDhe zVR6)8?fWx_o#il8NA?*_aNL$TtlsfOI9h1)#)(ZcevbP>z#0KIN`)f zs}A>r!@N`%-4{6;rep2|(=qpeNm(;P8m5mebKI_nouhn3!KT^k4ilA{j`>Wgo<3F- zYTB(AOvjw+_%3$bZh`T%rtIZKfaf<%mY3J;A%{H<)3L0B=_6i%N&WX2@=Bn~{uu5s z?JJr!`UUuQft{gZ?gs0kSP$6gik%BPO@%uTc8YQ%x@P)g`SvCc`rvj3XDzi=oTPUv zM~C}Q!{4iXb-3gR|3Biddo$VwwM@hhKR#ZiCA}0qjTU`bGySpTN%D{mhWc3{{juHE z3XfJtsA8q-B;w&sJb8oSVG+Xy<+9DizsKOa(-zYrpG`%q=;W=BLae1i(iV zTc1 zd>32<{tdhW`~kH1JA!(#80-LE37!fPx6%S%1!l5O3umEoRGQ&3kn>Pl;2XiKZU5WB zo7hL+r!>M(f{(EOEJzz@p~Ewt1~-CrU@T=&56bE!&w;WU$$GFm_yX7$d=V5a@Jrwn z@MTamz!I(;d>wood=nJg?tcZ>f}6mXz_-A+z_&p+_sa*MSe*V46dUg!gXe*tfLS1Y z59<cYv3HUw})%ufSh|UxT96{T7t|<8JUtumOAx{0@8<+y|<80%#6JlPg-= zBdACo@My3#c!Iru8pyO}>kLrx(+%XAV5NX^tCt+{qm9-ne% z8}C_~(OiosK5latzm%=o4yc`Mrg@a$K7Ek-rL@_OSHJoP1(tlKY~m80LrK$ZKFqH? z9M|30`Hto}^r$c*PYLEQq>Jo|pKPrR(RRru--3dhb{QJnRbis*BF8#mxN%gTXEkvN zSJkz~C!~~|(EoIT>XZ;(+eb+l9nU3A;*p&|6PNJPh{Xp5D5p6H_V!fQHZT92#Ua*CUX)Y#XsE@m69}S&ek;MwzwZiDM^#2 zHVLC^kZ72Ln|7JyxJaH4&PMm;#9?a{lTx%)F{m7n!i*|gOgaeJ;)s!hMhzW4Bt1;F znDirMiz?X`$`(fq88Lilde)$3vPGR}NVfPd6e>oD551@l`<%;jCb<1W^5w&3ip2P=w0wHn>1w6RC~**Qs*7T3?&(O zWRu1yn);Aln-P=1j1K-~lgCB0_@sI7-kx6MF)COnz6f<6L5v6NFgm29+dU<`85Q@_ z$^SEi`}}krss|7)-Hx2#*Jtpxgff=RIgf~RxkedwvVT z$s=KEv~W?>hk23V4qkn@kq%_KVYVanmRrD{5^0A!u}@C7!fCS@0O_w{YOQ8b6f&Dg zYN23eer|DLN#TrAf0wam_(vC&<|B8`pL4N)2(wMF@>^^SKWvD59M-&tUFPpPqo{9D zab9kINuIy!&vX0E%bl51oL#E;jKbn^xyb7MU56G9Y4I$d;Pv9D=|BD`XKoO=yWHP( z{1AWFdDDBGdu}g(SEWt3Jdb?m6(2UlJ@Ti@59K~O6#7FwI1|IY{okrU{LhdZwzuVm ztwVA{E)ieYTeqvFWlJ%}4a&~UE1g+5o$sUC&4|Si?`-WuWRjy4amg>7 zRyKpT>ezNCu!{wNQk9P)o@H}$vJ3M6%k+l3C=!cq2Y>&8YQx*s)@{FbU-GK~W7$?#=CS%iwIh+1wuYRm#1&J?>vC_vZGvUsLYQ?Qwsj z+|R$^>5ZT4J9^Ecst-3#>tNi+01(~Jcr&`4?lkFl{qL&~bwhqwhB&8mMz{Pq1ud6X zmX^(-R~TIkNyDZ6L_^n76W9M*)85Ip;7^;VcI0o4P3Iqzb4L=`#29r;&%4>tIOyCR zn#?qd4u>AaY>+=O`z(N4;! zRh%K80)%;$c2dU3;*6_s6XrEUJ1HZ3amLLy^D6D+k;?6U+=O|JzrcDaw>38N8t=k7 zD7O!6<~8=fPE>9`*vxAj%d_KW%1xw8!feH)E!zuJ%_P%z;%@YNc~NU@J}^%Ej8+v` z3ta7AE!%-C#U+6zp%`%GLqw?YitNk^-?=2XqlFuRrKTK|-S6dj_o)~d55YFLD<6~y zUatLW^%pKtt=Kw}o+=Mt>1Dl1x^p{U%`i*RdyH%Ol>+yO1szr3A^qKST!Nd7?u2h*9Zg0yC`*Ma!#&}1@YlZD z?vy%#urT*4f61kOwHO0NYC|PWNkhI7Hq(awoUa#6wV^sP!qPcwq7AK6Zu&>!T*kkQ z20g5uxafu@ltvAXWpx4>h_bqZ3=Uc6fZPmL9!OZL5Ih0A6yzA| zDv)EWTJRL`7Lf9{ZUs*RrBa;<-UFTuJ^*$H9|DuW$3e zHuK6CM%#^Vii)+!ns^a)CCr-mrR@F#YvQc~OJfTNHj`uy+Mu|ugK|c?UdpwQTQkz2 zxON+gkFKFvFkNfqV+p0r5mHB`QS!*wXmtyFcTZ0`gOmUjntxt|$ z8!9j+)b3ckqch*E#!Y<4oRqvfxv^^Mp8Cox)Dx54UEKAR<6+;sHn{35C&TV`S+FUv zDXzY-i(tpO_L}vT(_vf8XJIp8_nXUM1+azYOjr?YoS6bEg>^GefX#=sHTN6!l?z}y z`3_%SX~Eva+E#sK1?(@h9rcw}u=|YLVWR2yB{s_HE0@8Rpj@c0Tn?L$2BN<5CfHba zC-S@k_O0s$@^?GzH?D=SyI|+Ldc*F4b#Q%04(^A&Yp#L)33jh}E$m^~FU&mHW3Vyi zd9YQmv(1jMI#?TXAE~W{eTjykzVbQP8>kTKD_?{?g-*G?as%vMtew?Yz7D$)qx$ug zn_yR=x~Q+*44bF&yakrw?ns`u!gjizC4bvsx4GuScEBdMl3_bx39jAbU>EFd^J!QE z>~8aF*k0ItGZ!Wj!O>=aSPbk;^Eg;6%xnHYx@};8Gq%9uVXvXMsIN?bt-^jmEl6Ju)AQ78-Ik|1N$vc73v@CdUQ0@KUg^m9qJ#f3}qqp57yTmN1j)~wzyW3 zzdG18u1jERVd<{ZVb8&0UE9gQi?CPBM_?OZx0+YMUWXN#7r-{b(#@W*&9Kg90&EK` z#{8Dlw!*d<@4&XfUdA#W^$+$KGX|)Cu)9z+QvYDrp#h@)!LCGIME!%6qD!Lwp~~vv z_K@co*xRl@lfPJ4t!oCX4J_4l3M?KLj;}|o)7cG(#&L7 zXILlmC|DPm3qb_+5B3SV9_kPJ&H_nXawmU1f%D}edUcvun4Fux|iH>L2W3#*e6fu-ob3 zQvYDr7)xNU!>%yq!#2Sx++)e}W>_cpx8!OI>;>1Iu&uBKuJd8rV7*-(U^`&nneUQ= zov=0Ly|7)dYt3K48en^b8pSUl_@ zX0uTLV83S04D}CowQ&`!BWw{p59*&VcLsUx4D0CLNv^uUo^{;@I~z9NH38Ngmh4J^ z^?>a*-zEorU{9NO!}`OnHs`}qV7caKSSqZ)c_u6!cAV*jWx#&G;vDr4_C8i6seiC~ z`sUO>*q@nUL;Zu@M(>3B2MZXLu<5Xc^u(xtuzBvGx?I1x5NH~^-k&^>{jfFQvYB}=>t;#U^>r#f?euPAyt+2J&38ntQ{)pvK>K|-{aXoA&tQKpk)IZoSj51gQ>=Jih^1K%o=icH9 zRBpx!Z5Gv#7sZvXYsh8{>=IWxEEaaUD;CxUw%vS%jEJqr2C0pl)M57;fNh(k4m)gb1i8p3{o zJd|n(o9^yG)>B~~_uJ$u9rkBeEi3~z!<7olf}P@ufsKcKYQ9JgCc_>ye+8QYD>rAu zE`ptJropDelFd%AnXscw7pwrb3mGHT5cU=VPO2enwecuyKJ0$p{;7trU-7D3pJr9_ zCQ+YOaXH=l`n0MG-QC>vX-f_F8?O4aW%s+T0+vs64FqmF$z=j7wwmkB`n22sX#Nto z%Q7zk?wM!~0q##U{lK5%O#^uNYmBVcr#-d_U1@#Vsybw;^=Wm#H|_w|-b5F@KJB?G zy5;q0FJ6W*_HA^ZjXv@cWcVt+Y!#d&F?@`AHB&z-Nb~tt)s-1^%aZHV6sxSj4VxS2 zo>o_O!LhpXZ1vk+{q|75ebjG%^_#-)jOxl%psI4HIHhe?sYFiB+B9ig^;A8ROHZ~a zU)yoREuFCQR_ojGd8j@EgAib^K0{ydVrg&XUt*KhkUdmu_`RZ6E zYsvhh?@#hAmHHJtIyH3knwyyt<6cucVbkgcSJjm=Q)}IoYLb=?T$Q#xxh|05bq80Z z@U0x9rf8A!Yrd7|GbKe6mm<~6E9EjUX)9)cMY$~4aEBC+E<2f-A}`%c6*XsrD)-_z zM>#Gv3&oLnqi?sG#TbQ}-Nr&ofg!8~H1%~>#ZZ@sSuV+BOtg^&MK(Mp zU&5Hag|9ioy}|eB*X3zDT}(i0%xoZzPee`Ht`E zTgXrF?B{^@P`x*9RVv+o3*fv&EHG@iSHI)kU4R$Jz@LEvr4T-wJiLSV(BS z$JtZLCe~jSoH3~a1atX1my|_4R&Vjzt9WRSCim&XYFJlpO*ItEbj&vy)-}~oF!#IK zQA5EWvaZj@S*H8zK!rzc?McDR^dX7x*<|)AL&3`4Y&O}+3|cZ;!`S5MFg@0l4C{-V z$LI??SFwSxUW%o{da5HbU_F%E7{_-aEK&L12OFT+!?5m(J?pr=0Mny)AHwvA-j@#B z>o70FLE86Nhn?oI9u6Dquq=m7ci7bqd(vSh4TR1?YnVjnC&v+M-Zu_VECEFY89Im-77hfR+U`id%|oAMPEhYoj}<93(hb}x*>xiWu* z5jpHDC)|EmSLNoWN-#RiRXqZR$Png(bx|wM zFf@W0n#&a�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

    LcMw^)4f7LS_V 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 literal 0 HcmV?d00001 diff --git a/od-win32/lib/prowizard_x64.lib b/od-win32/lib/prowizard_x64.lib new file mode 100644 index 0000000000000000000000000000000000000000..925d51f21570775fc9c1ef87868eeb95c00366f8 GIT binary patch literal 1304832 zcmeFa3t(MUl{dbVo3`mq+oYvH!2$t-6rm;0KA@QUIQRXuNufd|q)FO_rb$R{+JcCw zEzlambVi)PH~1KZVH6OMVbE#It0*c~7|~ItppHOsbQn}#w*TK+d++nQCndM)_sutd zPO|S>XYIAuem~D%d!M?zbEs?md;RCuI-iEdB~2|$mo8h<=%m-H*T#nCB}*8;%r8Xw zE+Ou&J+e6%7s6%A&Uiu;nRu-zbDOKK6J?VzPn3%?Z4PV^W!k(E6=g0{zGSZ`GKKk~ z+-<(_Nl~uNo|i(dMbU#T0FRvsO$|W~zU_FwN-~ zi>cZyzgbMxX64Ibsx|`wF;$x#*NCawe15f<>NZc@FQ&T9;d{hXmzj3n^TIT3kBVs% znQN{S)3o{YC&je4Gf%%JrnyXI`HiB;EF2P*Zu9qVv8e6dkfy3Kd?i%Pfo z&+9~`%S=DzSy5zi4~pq-bIpD+-EHo@T1ih%_!`(`P>s?mfJjfhnVFyhxUnCE>nHxM}?snE*OilS`g=yvmM2*`dpAa=}GYmJ{?3yEL+-C2cqDGsa zo+E0s`Q3G*#%5+$^@}2N!G&VBHmeSZ*=}>y7BQR5c-Atv0oUf?r^IZxc_l7pPr}Su zyjPee6BTo`>0Ke_XmgDabKK_dpA~c5=E=9j95M%L{-WlX<*URy=AASsp$xRPc7y{R z^-YmZ}y*1BLYAe3cGDrp3h;e0mGJ<#9Ny4Yd4B$Ujj)A39I?xKC& zt<4(;x*ZIma3Epi@fXeoE{2N+DjRym(I{W+I&hKO}n2W^Y5#{%)VAd8~ z53h-V{bqzbXT;`vI2Mk_vOyMjQD=W)z!nA;Xiw)*G>}L};?cB`4!D`^iKQZbk@OpY zdGSEq^Bd{ku5!~%hvYlf=?ya!MC`9eRtEe_*@{F$w$(`6vPi**}5!I zXl)4(jr4b|CodXWo9id=W9Z66p`l(0*DqSC5lE&}$p0X!u~kxZMQuW&+jB6K3?zby zOg0q?ArPuqY35Df_9!v!`6fQzCY?YFu6l&w!Uks=QY)W}rIPs=SMv7WLT7((*D#vrzRoMD z96Qs=!bf=Y0J=9|(9Sg>?y(?IF zcLghrw2DPg<6WuMf(FksSg}|xk~2cCU@3O5V72IA5yHVD#7dZOBod6oqEuoX8PGgY zeucsbBNK_BiL__0V)qIG@?GW^AshlitPq5f;b06E+9L#BX@DY@jAnwtgcpCvtAu4D znM~41qrkgDTn~18h;^7yD6{CS^C-ndPA16x=6V%Jo!rg!Ar)Cia%a&dMnkcpz&A~l z;fZ868Hwdx8Lrsvfmfrae3J@Elfz#l7)++Q7qq8AV{3DxXE8$vli5@XJ&^~ym#>Yo zBg!{6+OsyFPv;}Kd=gouikHzjw4t@d=-EgkM*KM%gIFLOiYKDcTt@oqVD|78fg=`{ zCYwV$fr^@g!^++$#;%!s5M{UrLqe*Ptu2%m-mRbJ>1gaw-K>LRiOpa#kiuZwC3b@D z&L%{4cMggcn+T*(;d6>8Bpb^n5&wm{lNRx$$5Do$%mhZ7tE)aQeaxf%n3rNn$#nUNk z*|ROy-nvYVAtnk1)?e~*EEw7XKcOofnwUxtKn@3>4n#DNF;bC4BpVN`=;<5SKub%q z(eP-H6o(otSZ`XG5kRg+g4ql;MDH8v>>ldG0B2z1;J`3X@LlanJdg<|av39^2^2GX zWUOS;@;G%}B#NDjWQ8r3%0#e28ORR}VC}4*LWDu0-5-lLmq>?$8AGQsoUBkzXmOPP zxOAu#&aYURRbza{C>)Yzi8S&Uzhl~9_usX2WHG1mA*>c7WY2QhvKCMm&8|0T1h|BWgI@<62jKrH|Bp;$DSk4CxT*hPBxk%>T-7R1sy z!{NVY-7u2?HG?{#d|p)%M(ja|VAVP!SLo5;4GnDU!?6ej z!olp71Q|WiCWMoK5X=8$IGKpXFHo#H=%=Hx zSRUn>ymES9-{s|fC>u)0LdmQx?v(xD_4dBLOM4GYdfx!dN`E69jm5*^v`t_=7k*n0 zV&hK4;<0>8t`FElEZtZk*2OP_m3}UMgh>B^Xo1Oq5soD?$q15jU~|vVpc<9Qvggs- z+qiUbvfNqaDjW(#GqG4E7)4F77+PDT;J)59L!J0&VSNJ$$Us`G&ES#Ybm3d%QSw@(a77C=%$D}i1l(9J0&e&h4EX_*sjc4+i6s`8j zzx?`6M?lRMK^O42S}O(Q;tgnti>9MSFpp1Utu5JsO#_(GbkhpED&@|mB_2qmLa|gR z5(~I_ouO4en@k*g>y1KTz3H%o1EEaXNMsWvy%$3tHFWT-<&k8V+GIT#bvRH7V;^bQ z>{VDy4>(Qi_BuQ$jX@)rO-E#DWEPz+^yLnJj)pfDNai9&FqD_Ux3hW_Miw{7$t;Ke z4uVV}gi&)?fr=$CbIF9|=OAaGmDk%p5cQlmjzcsN~9@ zgJ6XUA2yO9412g#I(?d8loASu5=pGFI6~zb*%gOMHr2L3$R^uCutF6{7~yz6oRz*{ z9*WUGYfHSRb5jpZ^&BacMD}GeMktZ?=Jv|NXk3;iK+Z8h%kywBY~-_8Ys&U)E)3Dy zv=Y&h!`=^v-!!$01(U(3F3+fp+R*@*Wld)%I!UB8B*_q1uN)BT)e4W1N+psh{wkvc zLagbHNwNnlABe|LB{8BaiiAgC>>-iqA%kJ2NhXktB2m)$fYG}SpA!41wO-fT)l0MD zhSmmGnWRoRvoe+lCxUX{hWTPeDjG`0a+wr;g~-S~GBidhU@>3-9fvcOa{&xxav^+$ z33%{w&G2l-GI@?!CU0$k0B+mhplvAWEgKa`l)gkT5{l%F91UPv>*5(&BO|zZeP^L( z6ZLTBVh=4^AP`;aJ7s^L$;llS1a++Qfp9VtF%ogi1bf!eT+y+qp|t_SEhME!M@;OR znRCcaP=jv=$r^`-11JaSY%p8oXKu~qGMzcUY(BuE$P=RJctB(vzs{C zI=9Gnvq83jaAm$LnOIIoxrzi6=_G^>7bsJ8O6w6J;GOy-rswW;9 zU@r?D0gM9j=(p2GERgD1JJiz;p>6%$na-~Dz1VeTufm}$c1?t^=LgGn7B4L>p~fhF zM`Ei6Ce>{VW4nXrr;AO`}_@;sVI=AubMj(4LgFTOa4 zs(7TTl8i?4F*L)0=*U%9bz+9kRRv9-Js(w4OBVKBp%eh=ix~!dhsBrrWHe7A3nN2F z0=;m_3#`pf(bTv^!wt2A|aYXM-MeRnu*8bybX}T z5Dm93!`DKc{;F0u$_rMKVxf3CiNTzm+q+?lhC5{Y&j^QuDBAxt#xw?I-r;Z{ijGQu zs-iA@RYrEja&gQaWlH2#vNr+HqA>OiXY%PBJ|I!3BP&-#QhE-IlEi@<^4RTY6lcJ^Q-hT5-=uk9hz%xh#9zrmxh~UE@ryTP) zslws)0#`B?%Cf+3!J#h0=qxyg=;0MvYv`W|&_p5}P2>VHFdMNO6f=OfUhL9Dd2p2g z3XF|Ua=$ozl<}Nl`y-^9pX7Xr@b}I*;74 zSUDEfE0$j=H`hSa1`aifkgAmqCW^8}=s-{AqNr~SZb4RT)2T=1W{epH~-8)e=pD1`70snl6zx3dy|)P^Sa(s4UJ*= z6GVp=%;ZoocvYDj5aem7v!C~=grU^32AitG7|Wn?$r?%|7RQJV873dWTsVYpO-i6C zBN5yfA{j|X$&6q|AB)FhSYpRW6V@TqU_*gzd%{`_-*_-XL(gt3>X~CslFJ#(2xS!` zIz;$@pTjC=6v{@yaD$;nW3HagV#bnaFcmlSmnxeRB#8Rss-IFi9$NrYMLRL6F0+I&l042Z$7xr>4%hOh@D zidpoLq>-IlB5eS-Nepi6UDw$WSrzHPG^)F2NQ86Q3nQ47g$D~AQK*viV_Yp{^n1EH zawCN-5h7a(m_(zq8WxJwv9`Crvya{eM+$BD-YD`Hb8M-Z#)sAN_2kALbb#Y+$4y+OQ}|9u!7~MQ?vcH~ImAI=;F0s?MSA zj^Q3U13_m&V<;WXhBCQa;0m>aLY0BWSTKyOEm%?+z5=Ob>7_NsB3Vr2Ffm#)=(31n zFK7mvl!n(jE#gV+YQe|Hz_7~&)KBuk6uvKR+30Z5jF0bVDifG$FB@Ldy3A!6hssPY z5|lGZd)S&om}MqIX?((2jO=t;B@-zB34CT*jI!gf3diEKAte=9+lzUE(<&K{WQ;^I z(3VG2;;=H}u`m{pl7S12FqWEZNz@#ThO+q#rav2~M{-!jg4jfr#nvX-4%l7AqNz|g ziiL}=A*`u5T_u9CWDeD2uoGK499HpU5)Sc^p4%q7ym&gFhOQiveZ!U5@n^S6gpF(_ z1O+{m1;c5T42C0U=wgA+t_D{ql8KZN3u0+LkNx9LSE&s8d2FY`#=%CXs$w&ZuQ3)$Dl)`|@yh#r$_x+Cn+4?)4iS5%r^xvUb=U^Ej(v8juu(Sk;i z_|dGB2fHxBNy^bJq?_oFoWesT_~JR2iA7AE^`&uTq=jpuPG>M zV$A4thSfnVs$ltGxX|lzl}|=8;T#qqX}0Nb)q*Jm7JJYcjX*)C(P@`Y8sSU`g`e!O zR%y%C#YWP|VK+9myvm(a4olcYlR4~Yq0V?2=50<}%rVe6P^&2wN>%FF#U~S)P#E8@ z^<>E*0IQ(kY!wmrEQK}km=Q&^W9_QXw)?&e`|9vLFpBmzU>afoRgXvTjz0k!y{a*g(Fbz#$EM)FFaAr3)frhbW7mi^|x^25LwuC!^ z2{r>ennP)P7PPOdn~UbU^9Elijmn6fdUkP`F4{v);^LU98iv{-9W*x^yZNv;EtSe* zv!H9wyPGeHX->w#1}EBizh3Vd!gf}dzt{zWB*|d0o|i!}09IdFTzoMkOD+>bK;`7l zoCdo2qUlH`pLg!`##VK=zX^0&IeY@bbgaWZIdb!*g6UukNr?38)Vq}_U)_A^L_CDi zXDATtGWP_NTsI$7HuH%P8UdGjshbZCUK$f7$ArvF9`-=SXkA%;U8FCO7@^R2NJqMa z0wE)WZ(67q?a-Ai$eC5o5Y$oKjA1AfrLom45G-Ji(*{|Fi+#rCf-ts11tXL)mTChj z1-K<)B(c1HN^)SAa2Bb|w4 zGjTL!wz;I5)jARgb9^Y+LtibSzO(2QYU(b^L~MV?{L4sTF6Q*Uv6wd+2xW7*JS!H- zZU~B881`ax*+a{av{zkzrE+ym&_oYo`w4m>tbUM7479@o{rIfMJCo(ulv2>cT{4@_ zW;0myXLq?F)EEppG3go@+Q?g&y`5zfn4v|KGn#eS1B#hjJI2J`J{qA6nzdXi5FA0F z>7>P@iOLNYnG7f{qgJWlp~hdtgVENOwe)c{j|r7mtl|dpoMtRCR-1=<3m9CtwyeQ! zrr*QiRFE+phrf_m}Kyx{0!_yzgw%!i=aY6<@ zQzjyECqkFZ2$od9LJhTA=3=F%fEf1Tgkwf3Ax~+*%EVgvu?+b^L7;OR2!_b--U94t zh%dKzw>Ftmns5Tk90}~4P2rQiV`A7&D=+x&+ue$KwXt`2m;(nMOr)fAnwpz}u$eX& zi(;!w90`ha(R<5f7@8;ytxFLKECQ|VB;APhJnx}h=BjJK5_l?~h(Qxxen62EBWy@t zi&Yoio-WgOb0@^e0GV#F2!L)fmIzthpsOJQM*?HxG_nneD+`meslxhM7^5asTl+$Y zJ=dT^1VuvpsXcb`tA~>VU(%o{jcrfxWd-jHat^WZGThrRz=2i!WFp2gq$kd(WCGE2DoRHRSbB4fZkAXk9*xAYL5DY`Ah&7Hv^_Ez zOo77rcnZ^Ae1TO-=8O$?N~F>udd$^hEH=BOU~69zyL)0L3l@*vEYNTXhcLclr9|?o z(Jdv54G|b>@qS@WH|zp+Ny&wRIGh8E9A*wTxjo8dW0716N?p=E<8Gd0Bo)r$s1(RCbxU15 z5h%`}4yn<+$UXNG0)g z3HlOd+#4I+aZjexp-ePIpX#hnRIYeoZ)ODP;~4w8ShA>-F-+g&F)kkE0y~LQ5lqa{ zB-_97JH+H@13}J+Aa!sygdP)MCyc$~SGr4=WttZl*j5_GLwyAoJ8j$Xh{uAT(YpFk4>!5C6ON*G@pwr zfo;fH`i8GQ2FlPo1D_8h^EePFjBhIrE@v^xqpggmu&diOgmQV9Mvs9;DD4!bk`$xE zK|wzaEm*;d^%Q7vO|OBi9T@EC=Y_?#!5(by>eEr8A);LA!ji6ubSN%?sS0Uyb+lhO z*fY$_bx4uUk-maJ7uA<DdpE#8AiQnGq6DJ>2 zA+EcmLOlPO3eo=S3bE_-DWd(tDPqBnDdMeLr-&8*JVo67)D*GyH&euX|5S1D=~Knc z%cqK$S56gyfvMt}9aF{X&rcQiKQUF@b9kzF{=8}8(Y9&gx@)G1PkwrucPky zF|@E!ta^W?SihxGG=8yC?Eg-sxb8nI#j~eO7Z2v9i~ZM37gygqUHtaB>Ee~s{Nm9r zzqt9!e$l?iFV6d^U)282FXqgu64Aygar^n3|eDus}acFI|SiZGdEcj-%sQq=d_-uKN2+XSyPb6!^XNPgf+pZdM z=iVA|&QEK^b-$|-{Z+HYg%`{g2Ug7%TdtZdvg0tf%@$8RJX^$HnJxA%o+F}}IVfFo zgt%soc=qq-h_{}^VR{GVh*isv5xdHTxWe{VCKljrij88oweX2J%3LnX#7q~(l5r$# zqgV-d?^SLCA}vy)Otj(sba9M`;O{JPshA@!5XXuoVl@m7MHNv|C(ady2*7rM=ofLZ zO0uT%#3Jz?Q4Seri+78#xCHhWi5a2>v=-4UPJ@&+!Y`(aO30`di{Vebm@OJa zP%IY<#ax7DIb^&W;g~6MqDeF&j4Kd=;}EI^cyET}_2Nvty$7zZfK(mB6~NvN<3o5Z z73aY3G{SQnWQQTW9$}b+c+3>X!@tWA+PMgI1^hfl%o81m@w-JA@M>{}z<&KpE^+`I>kw%R-7n4Al@(Li&^4wF%^DaEKY^%wc=g)JsGKW ziijZ=>%;~z4e7K-B*C*xWbxZ4y15iA5DC0pAqMfc5mHw&RmVxf8O-6NmG%}jC6GUZ z{MHZu)*z);Bc)a$R_*W`A1aZ$IfT_fK1YypA*3C~-blH*NS!%IyBees<tW!S7=3gHH%Y%l)S zAywBP&AO0Amm$9{MOwe#4Eu#D^zTFX^BjXT(lw617*acfbWcqXqa(+uPsQqdl!B$m zxrHcKGJdtl+mlfS=9@94GI<8#dn$7OM8vvE#rp)5uj5e;XCeO6P)aJ03RG9hQFh7@ zGs;QI5vs!!cZzk78Sh@;6mR--$9)xY?jn>_nR64z-7EGw-jthGeo}6>sQmoP#odbi zfEZADtG^cgkNk{u#Pb!8sDu7CAD|{aW)J5wz4L8KuNO4`kN-Axq*D>!`EXV8hpQtU zS^B^3tJd3|!TR=R^1bt6?41u|y0Huev8M3Ohq0ca#m=P`q|5*O4`Ze6_QG21WK|YQ z_~tfg&0l=LwZCjar#z_MS-=X1ePsi#r?WmHFX zG9J}ILM3j}haaUK0tyEu>);!u96*VE_@$jAaTE#`#$?Z)u(IMPHM0<#(#|a>2PNzO zlJY_c$H0NRl+$`j(ay$3*hy;qTS+^Kv#;#Tr5|2a;_lp1bd~W@r8H$MI4I#HhtfCU z!$paQ&6A6gj`W9vlFl{&e+g$(9o6w=@S>DU5hkU@X_dKH$p@JsJf)slSlY=9&_FCr z-3<;VyXoADcnMmLM}0Co+O850=!P28WG}U_qEh1NOz@-B)1=^}gi}kwJqay8Tlh=R z+=A>;>0boN!L$B2W!wA1C_ptQr?v0JmW z^W#cA^alK;AK6sWafk4swDZkNIU>m_8k0Ci%Emm&a}I4TN;x?eF_`qtK6WokxF@2N z6C|*yCsg7IeB`90a|7X^R3(2j@Fkw@00(b>YL}IuC7v{2+RoHcj=jb1yGb2rsDmCs z!#j!d2QBtePDiy|O+qWvVxGi7#5U$hZ`+;R`LbFvZStMW;e>YnquvxesZ$s&pZ>RQ zBA(1?Dpo2S<(}ixPTGzJj&_goBySzF;xnleGHmRVIoZHspX4FLmV-$hO`+LKJ8sG5 zYEmc8S^Sf{pu^^1a!1_S9Zcr5Ig5W%2l-j-lRWZQJAg9RWG@1;IhpJgIW{Mgy>P{H zGRe!MEC-Xm^~7>A>Fb7UP9}SlhUH|k7v0%hO!ihBo0G{MhiN&O?A?Kui%FjKZF5li z%|w&FW5)7j(&wdEPD;9^!scv}mm=6)O!71k%f+OxX0kb%>=k3$NeQ=DSWZemt)i5( z*(`r1f0UKY&7`jovfNDmaB$1bY6EX~~wO$=~j1xtaW(j5aruKAhBY zGx^&WEjN=t+1YY4`FnD-n-b6avpJjmk!LnXlfInBa#PY(liJx)p3sCX_9fjIWqDW9 z-Ak6U((dW9+#SWCUzX#NPIj|7E9GJ?%UNkRQrg^=aQcnSRVnw_+MWHW3Xdo{B^`8U z`CZaYTb8q}pC13kyb6DcpOP0&hu3NL*9mPqRmgCayWV5*| zZSG1s8O(B5@_|p<>Cs%_Y`HD*xM#~@i3ikahevlXvvM8&lU0{XzfnSaeH4cmYo~uM zed(h-%u5I3C{OFNoc~$w75j53eTV;S7nB|S>EkMC{_pCa|BpUvOr_ADatfRhaWqGC zYNw?gb*x++<-K*v^*g5mI5cICbO*djv3Cv*P)9?&b8tXMIM7i~hYP%OaKJkU2jDa~ zbyu*XMfvj{9B|}2TvQ8{$DI!Ulg<~I+(Dl9QwZ#5nrfU*S5-I;j8>RB{9C<6>0EP- z+YYj@Xmqr_exn2Q6*FIFpmBXhowl@H%Ai>2Y6yk$k;EFuy&4L|Ju?c+;vyl9sylR? zuXOK^rqBgSgLG>4P=g1p(Sz3HpveiaQ~Q=V#YmBm+zTWy8q95!L5Ym3r;UKaa$1R=15Jai!4pt7Gl2QQ(N$Tqxyx; zqtQ-W_n;~koKdJ5=ptPc*H=|*Ho8mO#OWqx{UYzM)oB=E_g;ViS)qJwFc|12CSz?`@t3oto zxv|mI`RPQ}N7U;h-4pJ%x7}jEw^I;}P9SAV zZo!yhZ@wgf+b%-Qn?J0RmDsU$O^ext5xcGZ;#d1+J4`@pM$mSb54~E)udC~W=t3uE zqzkNwL*JF9a5^3@p=|V3Uu@M$XZY)5W7NG!(!#oXiQjD(PDu}J1iEdCn5aEvs2Won zZr-3~Z${bPA{1SPXS=aawVu+2ZaV1=?WVeSu?g)UQ*bD*MnVcfv&dG|ZZblRrbM(A znoB0g`#89vl<(9^D$KmX744%Wp>bq{T1JVWS(Jz>)_n9iQ@CZ+n2fCb(n|BzQ(V=_ zT#idYT@>xF#l!cM5|^uKC6aX+HoZ|R%h0@vT(_@GZ4cw%NXfwH8XMlN@g`M++SkG;63Se$A9f}!dT`Vs4GcOOJCqX}MLD*eNG2UQ z&Z$x)M=!#D4&i8097!teM~2o6v|TaM(}PQy7fYJ#SBRA`>)t$mv(M4I?t6 zsL!ES_ay~xzmEEHXO zz*Mt;LCtd#CcdA6ul*oq^eGHb+bx|Gn zIAmj9ov7|@WSaBdM&0AEl~<1=Evz1g-)$WXT9_h|y!OR)*fX*YB#=&GXEL4RE)nW$*b03OswOoN*1PSk!DWkg%ND&7 z%aG-OdnNf!y^_Rac=Oh+>K983>za3TNz6(U3yG{zLE$cmNjy?#jECtGvv)}@iWX(- zfRu0>MPHrm>XJy5)g{pzbx91VOJYQKN%DoeBny=na-;8|XFE&3U0o9M*}EhnP?yBee!illpi5#K zbV(A*lIiG@*uvHUDJM3Ha%}IC*pahKk|al$#3bD%@r$cVBAV=yG$y+w^G$V0j`yC8 zgE)a(UW?d&+ zS+2y4QkBNWBUu*Nxz159wx=A_BYq4nJQ#SDBhSB0N472wnhLXY?IGMM)y0xCsbZRA zZtY=hKku{HTAwJpxS{h1mi0%lYν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

    ;WvAtkL6*jY@w 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

    4xtct%kSf!${t7RcF#=rSjcWuK|Ea$UO2 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 *lpdwCount) - break; - if (memwatchtable[off + i]) - lpAddresses[j++] = (uae_u8*)lpBaseAddress + i * si.dwPageSize; - } - *lpdwCount = j; - *lpdwGranularity = si.dwPageSize; - return 0; + return GetWriteWatch (0, lpBaseAddress, dwRegionSize, lpAddresses, lpdwCount, lpdwGranularity); } void mman_ResetWatch (PVOID lpBaseAddress, SIZE_T dwRegionSize) { - if (memwatchok) { - if (ResetWriteWatch (lpBaseAddress, dwRegionSize)) - write_log (L"ResetWriteWatch() failed, %d\n", GetLastError ()); - } else { - DWORD op; - memset (memwatchtable, 0, p96mem_size / si.dwPageSize); - if (!VirtualProtect (lpBaseAddress, dwRegionSize, PAGE_READWRITE | PAGE_GUARD, &op)) - write_log (L"VirtualProtect() failed, err=%d\n", GetLastError ()); - } -} - -int mman_guard_exception (LPEXCEPTION_POINTERS p) -{ - PEXCEPTION_RECORD record = p->ExceptionRecord; - PCONTEXT context = p->ContextRecord; - ULONG_PTR addr = record->ExceptionInformation[1]; - int rw = record->ExceptionInformation[0]; - ULONG_PTR p96addr = (ULONG_PTR)p96mem_offset; - - if (memwatchok) - return EXCEPTION_CONTINUE_SEARCH; - if (addr < p96addr || addr >= p96addr + p96mem_size) - return EXCEPTION_CONTINUE_EXECUTION; - addr -= p96addr; - addr /= si.dwPageSize; - memwatchtable[addr] = 1; - return EXCEPTION_CONTINUE_EXECUTION; + if (ResetWriteWatch (lpBaseAddress, dwRegionSize)) + write_log (L"ResetWriteWatch() failed, %d\n", GetLastError ()); } static uae_u64 size64; @@ -257,7 +157,6 @@ void preinit_shm (void) } write_log (L"Max Z3FastRAM %dM. Total physical RAM %uM\n", max_z3fastmem >> 20, totalphys64 >> 20); - testwritewatch (); canbang = 1; } @@ -331,14 +230,6 @@ restart: } natmemsize = size + z3size; - xfree (memwatchtable); - memwatchtable = 0; - if (currprefs.gfxmem_size) { - if (!memwatchok) { - write_log (L"GetWriteWatch() not supported, using guard pages, RTG performance will be slower.\n"); - memwatchtable = xcalloc (uae_u8, currprefs.gfxmem_size / si.dwPageSize + 1); - } - } if (currprefs.gfxmem_size) { rtgextra = si.dwPageSize; } else { @@ -368,7 +259,7 @@ restart: goto restart; } p96mem_offset = (uae_u8*)VirtualAlloc (natmem_offset + natmemsize + rtgbarrier, p96mem_size + rtgextra, - MEM_RESERVE | (memwatchok == 1 ? MEM_WRITE_WATCH : 0), PAGE_READWRITE); + MEM_RESERVE | MEM_WRITE_WATCH, PAGE_READWRITE); if (!p96mem_offset) { currprefs.gfxmem_size = changed_prefs.gfxmem_size = 0; write_log (L"NATMEM: failed to allocate special Picasso96 GFX RAM, err=%d\n", GetLastError ()); @@ -531,8 +422,6 @@ void *shmat (int shmid, void *shmaddr, int shmflg) p96ram_start = p96mem_offset - natmem_offset; shmaddr = natmem_offset + p96ram_start; size += BARRIER; - if (!memwatchok) - protect |= PAGE_GUARD; } if(!_tcscmp (shmids[shmid].name, L"bogo")) { shmaddr=natmem_offset+0x00C00000; diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index 949aacd8..577826e7 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -74,7 +74,7 @@ int mman_GetWriteWatch (PVOID lpBaseAddress, SIZE_T dwRegionSize, PVOID *lpAddre void mman_ResetWatch (PVOID lpBaseAddress, SIZE_T dwRegionSize); int p96refresh_active; -int have_done_picasso = 1; /* For the JIT compiler */ +bool have_done_picasso = 1; /* For the JIT compiler */ static int p96syncrate; int p96hsync_counter, full_refresh; #if defined(X86_MSVC_ASSEMBLY) @@ -2234,7 +2234,7 @@ static uae_u32 REGPARAM2 picasso_SetSwitch (TrapContext *ctx) /* Do not switch immediately. Tell the custom chip emulation about the * desired state, and wait for custom.c to call picasso_enablescreen * whenever it is ready to change the screen state. */ - picasso_requested_on = flag; + picasso_requested_on = flag != 0; p96text[0] = 0; if (flag) _stprintf (p96text, L"Picasso96 %dx%dx%d (%dx%dx%d)", diff --git a/od-win32/prowizard/prowizard.vcxproj b/od-win32/prowizard/prowizard.vcxproj index fd38fe82..b9e8d405 100644 --- a/od-win32/prowizard/prowizard.vcxproj +++ b/od-win32/prowizard/prowizard.vcxproj @@ -27,7 +27,7 @@ StaticLibrary Unicode - true + false StaticLibrary @@ -60,14 +60,15 @@ <_ProjectFileVersion>10.0.30128.1 - $(SolutionDir)$(Configuration)\ + $(SolutionDir)$(Configuration)\..\..\lib\ $(Configuration)\ - $(SolutionDir)$(Configuration)\ + $(SolutionDir)$(Configuration)\..\..\lib\ $(Configuration)\ $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ - $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\ $(Platform)\$(Configuration)\ + $(ProjectName)_x64 @@ -75,12 +76,18 @@ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks - MultiThreadedDebugDLL + MultiThreadedDebug Level3 EditAndContinue + ..\..\prowizard\include;..\..\include;%(AdditionalIncludeDirectories) + 4996;%(DisableSpecificWarnings) + + + + @@ -97,14 +104,15 @@ Level3 ProgramDatabase StdCall - CompileAsC + Default 4996;%(DisableSpecificWarnings) - c:\dev\lib\prowizard.lib + $(OutDir)$(TargetName)$(TargetExt) - prowizard_search;%(ExportNamedFunctions) + + @@ -145,7 +153,7 @@ 4996;%(DisableSpecificWarnings) - c:\dev\lib\x64\prowizard.lib + $(OutDir)$(TargetName)$(TargetExt) prowizard_search;%(ExportNamedFunctions) diff --git a/od-win32/resources/resource b/od-win32/resources/resource index 5a71c61f..6e11945e 100644 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -195,6 +195,7 @@ #define IDS_SOUND_FILTER_EMULATED 207 #define IDS_SOUND_FILTER_EMULATED_E 208 #define IDS_INPUT_COMPATIBILITY 209 +#define IDS_INPUT_GAMEPORTS 209 #define IDS_INPUT_CUSTOM 210 #define IDS_INPUT_COPY_DEFAULT 211 #define IDS_INPUT_COPY_CUSTOM 212 @@ -260,6 +261,8 @@ #define IDS_QS_CD 265 #define IDS_QS_CD_AUTO 266 #define IDS_QS_CD_IMAGE 267 +#define IDS_REMAPTITLE 268 +#define IDS_FILTER_NOOVERLAYS 269 #define IDS_NUMSG_NEEDEXT2 300 #define IDS_NUMSG_NOROMKEY 301 #define IDS_NUMSG_KSROMCRCERROR 302 @@ -323,6 +326,7 @@ #define IDS_PRINTER_POSTSCRIPT_DETECTION 353 #define IDI_EXPANSION 353 #define IDS_PRINTER_POSTSCRIPT_EMULATION 354 +#define IDD_INPUTMAP 354 #define IDS_PRINTER_PASSTHROUGH 355 #define IDS_RES_LORES 356 #define IDS_RES_HIRES 357 @@ -330,6 +334,10 @@ #define IDS_PRINTER_EPSON48 359 #define IDS_SELECTCD 360 #define IDS_CD 361 +#define IDS_BUFFER_SINGLE 362 +#define IDS_BUFFER_DOUBLE 363 +#define IDS_BUFFER_TRIPPLE 364 +#define IDS_BUFFER_TRIPLE 364 #define IDS_QS_MODELS 1000 #define IDS_QS_MODEL_A500 1001 #define IDS_QS_MODEL_A500P 1002 @@ -372,6 +380,7 @@ #define IDC_PORT_TABLET_CURSOR 1028 #define IDC_SHOWLEDSRTG 1028 #define IDC_SAMPLERLIST 1028 +#define IDC_DISPLAY_BUFFERCNT 1028 #define IDC_PORT0_JOYSMODE 1029 #define IDC_SLOWMEM 1030 #define IDC_PORT1_JOYSMODE 1030 @@ -595,11 +604,16 @@ #define IDC_SELECTRESTEXT 1510 #define IDC_FLUSHPRINTER 1510 #define IDC_MAPDRIVES_REMOVABLE 1510 +#define IDC_PORT0_TEST 1510 #define IDC_SCREENRESTEXT 1511 #define IDC_MAPDRIVES_AUTO 1511 +#define IDC_PORT0_TEST2 1511 +#define IDC_PORT1_TEST 1511 #define IDC_WIDTHTEXT 1512 #define IDC_WINDOWEDTEXT 1512 +#define IDC_PORT2_TEST 1512 #define IDC_HEIGHTTEXT 1513 +#define IDC_PORT3_TEST 1513 #define IDC_SETTINGSTEXT 1514 #define IDC_REFRESHTEXT 1515 #define IDC_SETTINGSTEXT2 1515 @@ -760,11 +774,14 @@ #define IDC_FILTERPRESETLOAD 1632 #define IDC_FLOPPYSPDTEXT 1633 #define IDC_FILTERPRESETSAVE 1633 +#define IDC_INPUTREMAP 1633 #define IDC_FLOPPYSPD_TEXT 1634 #define IDC_FILTERPRESETDELETE 1634 +#define IDC_INPUTTEST 1634 #define IDC_HARDDRIVE 1635 #define IDC_INACTIVE_PRI 1635 #define IDC_FILTERVZMULT 1635 +#define IDC_INPUTTEST2 1635 #define IDC_SOUNDPRIMARY 1636 #define IDC_MINIMIZED_PRI 1636 #define IDC_FILTERAUTOSCALE 1636 @@ -1007,13 +1024,22 @@ #define IDC_DD_SURFACETYPE 1791 #define IDC_RTG_SCALE_ALLOW 1791 #define IDC_CPU_FREQUENCY 1791 +#define IDC_PORT0_AUTOFIRE 1791 #define IDC_RTG_SCALE_ASPECTRATIO 1792 #define IDC_ASSOCIATE_ON 1792 #define IDC_DD_SURFACETYPE2 1792 #define IDC_DXMODE 1792 +#define IDC_PORT1_AUTOFIRE 1792 #define IDC_RTG_VBLANKRATE 1793 #define IDC_DF0WPTEXTQ 1793 #define IDC_DF1WPTEXTQ 1794 +#define IDC_INPUTMAPLIST 1797 +#define IDC_PORT1_REMAP 1798 +#define IDC_PORT0_REMAP 1799 +#define IDC_PORT2_REMAP 1800 +#define IDC_PORT3_REMAP 1801 +#define IDC_EDIT1 1801 +#define IDC_INPUTMAPOUT 1801 #define ID__FLOPPYDRIVES 40004 #define ID_FLOPPYDRIVES_DF0 40005 #define ID_ST_CONFIGURATION 40010 @@ -1057,9 +1083,9 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 354 +#define _APS_NEXT_RESOURCE_VALUE 355 #define _APS_NEXT_COMMAND_VALUE 40045 -#define _APS_NEXT_CONTROL_VALUE 1797 +#define _APS_NEXT_CONTROL_VALUE 1802 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index c052d085..d428acfc 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL IDI_APPICON ICON "winuae.ico" IDI_FLOPPY ICON "35floppy.ico" IDI_ABOUT ICON "amigainfo.ico" -IDI_HARDDISK ICON "Drive.ico" +IDI_HARDDISK ICON "drive.ico" IDI_CPU ICON "cpu.ico" IDI_GAMEPORTS ICON "joystick.ico" IDI_IOPORTS ICON "joystick.ico" @@ -38,7 +38,7 @@ IDI_MISC2 ICON "misc.ico" IDI_MOVE_UP ICON "move_up.ico" IDI_MOVE_DOWN ICON "move_dow.ico" IDI_AVIOUTPUT ICON "avioutput.ico" -IDI_DISK ICON "Drive.ico" +IDI_DISK ICON "drive.ico" IDI_FOLDER ICON "folder.ico" IDI_SOUND ICON "sound.ico" IDI_DISPLAY ICON "screen.ico" @@ -149,6 +149,7 @@ BEGIN CONTROL "Remove interlace artifacts",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,139,99,10 RTEXT "Windowed:",IDC_STATIC,17,46,40,15,SS_CENTERIMAGE RTEXT "Fullscreen:",IDC_STATIC,17,19,40,15,SS_CENTERIMAGE + COMBOBOX IDC_DISPLAY_BUFFERCNT,187,47,87,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP END IDD_MEMORY DIALOGEX 0, 0, 300, 158 @@ -189,10 +190,20 @@ BEGIN CONTROL "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,54,64,10 CONTROL "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,67,66,10 CONTROL "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,80,66,10 + CONTROL "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,94,73,8 CONTROL "More compatible [] Emulate 68000's prefetch registers. More compatible but slower.",IDC_COMPATIBLE, "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,107,73,8 CONTROL "JIT [] Enable just-in-time CPU emulator. Significantly increases the speed of the CPU emulation. Requires 68020 or higher CPU.",IDC_JITENABLE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,119,73,10 + CONTROL "68040 MMU [] 68040 MMU emulation. Not compatible with JIT.",IDC_MMUENABLE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,132,73,10 + GROUPBOX "FPU",IDC_STATIC,5,147,81,90,BS_LEFT + CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,161,63,10 + CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,63,10 + CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,188,63,10 + CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,202,63,10 + CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU, + "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,221,73,10 GROUPBOX "CPU Emulation Speed",IDC_STATIC,90,3,205,92 CONTROL "Fastest possible, but maintain chipset timing",IDC_CS_HOST, "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,95,18,195,10 @@ -200,35 +211,25 @@ BEGIN "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,32,195,10 CONTROL "Adjustable between CPU and chipset",IDC_CS_ADJUSTABLE, "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,46,195,10 + RTEXT "CPU",IDC_STATIC,96,77,17,10,SS_CENTERIMAGE CONTROL "Slider1",IDC_SPEED,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,114,71,67,20 + RTEXT "Chipset",IDC_STATIC,182,77,26,9,SS_CENTERIMAGE CONTROL "",IDC_CPUIDLE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,219,71,69,20 + RTEXT "CPU Idle",IDC_STATIC,231,60,47,9,SS_CENTERIMAGE + GROUPBOX "Cycle-exact CPU Emulation Speed",IDC_STATIC,90,99,205,46 + RTEXT "CPU Frequency",IDC_STATIC,105,119,51,10,SS_CENTERIMAGE + COMBOBOX IDC_CPU_FREQUENCY,165,118,46,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_CPU_FREQUENCY2,218,117,70,15 GROUPBOX "Advanced JIT Settings",IDC_STATIC,90,147,205,91 + RTEXT "Cache size:",IDC_STATIC,95,167,42,10,SS_CENTERIMAGE CONTROL "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,140,161,115,20 EDITTEXT IDC_CACHETEXT,255,166,30,12,ES_CENTER | ES_READONLY CONTROL "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,194,63,10 - CONTROL "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,208,63,10 - CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,222,62,10 CONTROL "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,194,62,10 CONTROL "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,235,194,52,10 + CONTROL "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,208,63,10 + CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,222,62,10 CONTROL "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,208,52,10 - CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU, - "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,221,73,10 - GROUPBOX "FPU",IDC_STATIC,5,147,81,90,BS_LEFT - CONTROL "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,94,73,8 - CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,161,63,10 - CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,63,10 - CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,188,63,10 - CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,202,63,10 - RTEXT "CPU Frequency",IDC_STATIC,105,119,51,10,SS_CENTERIMAGE - GROUPBOX "Cycle-exact CPU Emulation Speed",IDC_STATIC,90,99,205,46 - RTEXT "CPU",IDC_STATIC,96,77,17,10,SS_CENTERIMAGE - RTEXT "Chipset",IDC_STATIC,182,77,26,9,SS_CENTERIMAGE - RTEXT "CPU Idle",IDC_STATIC,231,60,47,9,SS_CENTERIMAGE - RTEXT "Cache size:",IDC_STATIC,95,167,42,10,SS_CENTERIMAGE - CONTROL "68040 MMU [] 68040 MMU emulation. Not compatible with JIT.",IDC_MMUENABLE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,132,73,10 - COMBOBOX IDC_CPU_FREQUENCY,165,118,46,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_CPU_FREQUENCY2,218,117,70,15 END IDD_FLOPPY DIALOGEX 0, 0, 300, 240 @@ -348,7 +349,7 @@ IDD_LOADSAVE DIALOGEX 0, 0, 302, 241 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - CONTROL "",IDC_CONFIGTREE,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,6,3,289,153,WS_EX_CLIENTEDGE + CONTROL "",IDC_CONFIGTREE,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | WS_BORDER | WS_HSCROLL | WS_TABSTOP,6,3,289,153,WS_EX_CLIENTEDGE RTEXT "Name:",IDC_STATIC,4,161,40,15,SS_CENTERIMAGE EDITTEXT IDC_EDITNAME,48,162,146,13,ES_AUTOHSCROLL RTEXT "Description:",IDC_STATIC,2,182,41,15,SS_CENTERIMAGE @@ -400,31 +401,41 @@ BEGIN COMBOBOX IDC_SAMPLERLIST,49,85,232,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END -IDD_GAMEPORTS DIALOGEX 0, 0, 300, 236 +IDD_GAMEPORTS DIALOGEX 0, 0, 300, 246 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - COMBOBOX IDC_PORT0_JOYS,45,29,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_PORT1_JOYS,45,65,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Swap port 0 and 1",IDC_SWAP,194,101,93,14 - RTEXT "Port 0:",IDC_STATIC,11,28,25,15,SS_CENTERIMAGE - RTEXT "Port 1:",IDC_STATIC,11,64,25,15,SS_CENTERIMAGE - LTEXT "X-Arcade layout information []#1",IDC_STATIC,64,87,106,15,SS_NOTIFY | SS_CENTERIMAGE - GROUPBOX "Mouse and Joystick settings",IDC_STATIC,4,15,292,148 - GROUPBOX "Mouse extra settings",IDC_STATIC,4,165,292,69 - RTEXT "Mouse speed:",IDC_STATIC,17,180,56,10,SS_CENTERIMAGE - EDITTEXT IDC_INPUTSPEEDM,87,180,25,12,ES_NUMBER - CONTROL "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,167,187,120,10 + GROUPBOX "Mouse and Joystick settings",IDC_STATIC,0,3,299,181 + RTEXT "Port 0:",IDC_STATIC,11,16,25,15,SS_CENTERIMAGE + COMBOBOX IDC_PORT0_JOYS,45,17,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_PORT0_JOYSMODE,104,35,87,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Test [] Test Port 0 (mouse) configuration.",IDC_PORT0_TEST,196,35,44,14 + PUSHBUTTON "Remap [] Remap Port 0 configurarion.",IDC_PORT0_REMAP,245,35,41,14 + RTEXT "Port 1:",IDC_STATIC,11,52,25,15,SS_CENTERIMAGE + COMBOBOX IDC_PORT1_JOYS,45,53,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Swap ports [] Swap ports 0 and 1.",IDC_SWAP,113,93,53,14 + COMBOBOX IDC_PORT1_JOYSMODE,104,70,88,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Test [] Test Port 1 (joystick) configuration.",IDC_PORT1_TEST,196,70,44,14 + PUSHBUTTON "Remap [] Remap Port 1 configuration.",IDC_PORT1_REMAP,245,70,41,14 + LTEXT "Parallel port joystick adapter",IDC_STATIC,10,96,95,15,SS_CENTERIMAGE + LTEXT "X-Arcade layout information []#1",IDC_STATIC,177,96,109,15,SS_NOTIFY | SS_CENTERIMAGE + COMBOBOX IDC_PORT2_JOYS,45,114,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Test [] Test Parallel port joystick port 0 configuration.",IDC_PORT2_TEST,196,131,44,14 + PUSHBUTTON "Remap [] Remap Parallel port joystick port 0 configurarion.",IDC_PORT2_REMAP,245,131,41,14 + COMBOBOX IDC_PORT3_JOYS,45,149,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Test [] Test Parallel port joystick 1 configuration.",IDC_PORT3_TEST,196,165,44,14 + PUSHBUTTON "Remap [] Remap Parallel port joystick port 1 configurarion.",IDC_PORT3_REMAP,245,165,41,14 + GROUPBOX "Mouse extra settings",IDC_STATIC,0,186,299,60 + RTEXT "Mouse speed:",IDC_STATIC,17,200,56,10,SS_CENTERIMAGE + RTEXT "Magic Mouse cursor mode:",IDC_STATIC,17,217,138,10,SS_CENTERIMAGE + CONTROL "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,233,120,10 + EDITTEXT IDC_INPUTSPEEDM,87,200,25,12,ES_NUMBER + CONTROL "Magic Mouse",IDC_PORT_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,167,198,119,10 + COMBOBOX IDC_PORT_TABLET_CURSOR,167,214,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Full tablet input emulation",IDC_PORT_TABLET_FULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,167,220,121,10 - CONTROL "Magic Mouse",IDC_PORT_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,167,175,119,10 - COMBOBOX IDC_PORT_TABLET_CURSOR,167,201,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Magic Mouse cursor mode:",IDC_STATIC,17,204,138,10,SS_CENTERIMAGE - COMBOBOX IDC_PORT0_JOYSMODE,195,47,91,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_PORT1_JOYSMODE,195,82,91,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_PORT2_JOYS,45,125,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Parallel port joystick adapter",IDC_STATIC,10,105,147,15,SS_CENTERIMAGE - COMBOBOX IDC_PORT3_JOYS,45,143,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,167,233,121,10 + CONTROL "Autofire",IDC_PORT0_AUTOFIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,37,53,10 + CONTROL "Autofire",IDC_PORT1_AUTOFIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,72,53,10 END IDD_CONTRIBUTORS DIALOGEX 0, 0, 411, 242 @@ -702,18 +713,20 @@ IDD_INPUT DIALOGEX 0, 0, 300, 242 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN + CONTROL "List1",IDC_INPUTLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,22,290,146 COMBOBOX IDC_INPUTTYPE,5,5,98,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_INPUTDEVICE,109,5,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_INPUTDEVICEDISABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,282,8,9,8 - CONTROL "List1",IDC_INPUTLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,22,290,146 COMBOBOX IDC_INPUTAMIGACNT,5,174,24,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_INPUTAMIGA,33,174,262,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_INPUTAMIGA,33,174,202,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Test [] Test input mappings.",IDC_INPUTTEST,240,175,26,14 + PUSHBUTTON "Remap [] Find and remap quickly.",IDC_INPUTREMAP,267,175,30,14 RTEXT "Joystick dead zone (%):",-1,4,196,79,10,SS_CENTERIMAGE EDITTEXT IDC_INPUTDEADZONE,88,195,25,12,ES_NUMBER - RTEXT "Autofire rate (frames):",-1,4,212,79,10,SS_CENTERIMAGE - EDITTEXT IDC_INPUTAUTOFIRERATE,88,210,25,12,ES_NUMBER RTEXT "Digital joy-mouse speed:",-1,117,196,88,10,SS_CENTERIMAGE EDITTEXT IDC_INPUTSPEEDD,210,195,25,12,ES_NUMBER + RTEXT "Autofire rate (lines)",-1,4,212,79,10,SS_CENTERIMAGE + EDITTEXT IDC_INPUTAUTOFIRERATE,88,210,25,12,ES_NUMBER RTEXT "Analog joy-mouse speed:",-1,117,212,88,10,SS_CENTERIMAGE EDITTEXT IDC_INPUTSPEEDA,210,211,25,12,ES_NUMBER PUSHBUTTON "Copy from:",IDC_INPUTCOPY,240,195,56,14 @@ -725,7 +738,7 @@ IDD_FILTER DIALOGEX 0, 0, 296, 241 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,294,199 + 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 PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,221,15,67,14 @@ -741,8 +754,7 @@ BEGIN RTEXT "Vert. position:",-1,5,120,55,10,SS_CENTERIMAGE CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,114,151,19 EDITTEXT IDC_FILTERVOV,253,116,34,12,ES_CENTER | ES_READONLY - RTEXT "Extra settings:",-1,105,135,57,10,SS_CENTERIMAGE - CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,174,151,19 + CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,107,174,141,19 EDITTEXT IDC_FILTERXLV,253,176,34,12,ES_CENTER | ES_READONLY COMBOBOX IDC_FILTERSLR,253,151,33,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP GROUPBOX "Presets",-1,0,203,296,36 @@ -754,10 +766,12 @@ BEGIN COMBOBOX IDC_FILTERVZMULT,59,80,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_FILTERXTRA,105,151,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_FILTERASPECT,14,151,73,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - CONTROL "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,168,85,10 + CONTROL "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,168,77,10 COMBOBOX IDC_FILTERAUTOSCALE,132,36,83,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_FILTERASPECT2,14,180,73,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_FILTEROVERLAY,20,36,103,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Aspect Ratio Correction",-1,3,138,92,65 + GROUPBOX "Extra Settings",-1,101,137,194,65 END IDD_HARDDRIVE DIALOGEX 0, 0, 380, 76 @@ -816,7 +830,7 @@ CAPTION "WinUAE Properties" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN GROUPBOX "",IDC_PANEL_FRAME,112,4,303,247,NOT WS_VISIBLE - CONTROL "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_NOSCROLL | WS_BORDER | WS_HSCROLL | WS_TABSTOP,5,5,101,248,WS_EX_CLIENTEDGE + CONTROL "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | TVS_NOSCROLL | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,5,5,101,248,WS_EX_CLIENTEDGE GROUPBOX "",IDC_PANEL_FRAME_OUTER,110,2,307,251 PUSHBUTTON "Reset",IDC_RESETAMIGA,5,259,47,14 PUSHBUTTON "Quit",IDC_QUITEMU,55,259,47,14 @@ -835,6 +849,7 @@ BEGIN PUSHBUTTON "...",IDC_PATHS_ROMS,281,15,11,15 LTEXT "Configuration files:",IDC_PATHS_CONFIGL,14,32,121,8,SS_CENTERIMAGE EDITTEXT IDC_PATHS_CONFIG,14,42,261,15,ES_AUTOHSCROLL + CONTROL "Cache Configuration files",IDC_PATHS_CONFIGCACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,177,32,97,10 PUSHBUTTON "...",IDC_PATHS_CONFIGS,281,42,11,15 LTEXT "Screenshots:",IDC_PATHS_SCREENSHOTL,14,59,260,8,SS_CENTERIMAGE EDITTEXT IDC_PATHS_SCREENSHOT,14,69,261,15,ES_AUTOHSCROLL @@ -853,7 +868,6 @@ BEGIN PUSHBUTTON "Clear registry",IDC_RESETREGISTRY,111,212,92,14 COMBOBOX IDC_PATHS_DEFAULTTYPE,111,197,163,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Clear disk history",IDC_RESETDISKHISTORY,14,228,92,14 - CONTROL "Cache Configuration files",IDC_PATHS_CONFIGCACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,177,32,97,10 LTEXT "Rips:",IDC_PATHS_RIPSL,13,168,261,8,SS_CENTERIMAGE EDITTEXT IDC_PATHS_RIP,13,178,261,15,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_PATHS_RIPS,280,178,11,15 @@ -918,9 +932,9 @@ STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAP CAPTION "Enter text..." FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN + EDITTEXT IDC_STRINGBOXEDIT,7,17,214,14,ES_AUTOHSCROLL | ES_WANTRETURN DEFPUSHBUTTON "OK",IDOK,48,39,50,14 PUSHBUTTON "Cancel",IDCANCEL,151,39,50,14 - EDITTEXT IDC_STRINGBOXEDIT,7,17,214,14,ES_AUTOHSCROLL | ES_WANTRETURN END IDD_DEBUGGER DIALOGEX 0, 0, 454, 368 @@ -1005,6 +1019,14 @@ BEGIN GROUPBOX "Miscellaneous Expansions",IDC_STATIC,5,130,117,66 END +IDD_INPUTMAP DIALOGEX 0, 0, 300, 240 +STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_INPUTMAPLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,0,1,299,215 + EDITTEXT IDC_INPUTMAPOUT,0,222,299,14,ES_AUTOHSCROLL | WS_DISABLED +END + ///////////////////////////////////////////////////////////////////////////// // @@ -1012,8 +1034,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,1,0,0 - PRODUCTVERSION 2,1,0,0 + FILEVERSION 2,2,0,0 + PRODUCTVERSION 2,2,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -1029,12 +1051,12 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "WinUAE" - VALUE "FileVersion", "2.1.0.0" + VALUE "FileVersion", "2.2.0.0" VALUE "InternalName", "WinUAE" VALUE "LegalCopyright", "© 1996-2010 under the GNU Public License (GPL)" VALUE "OriginalFilename", "WinUAE.exe" VALUE "ProductName", "WinUAE" - VALUE "ProductVersion", "2.1.0.0" + VALUE "ProductVersion", "2.2.0.0" END END BLOCK "VarFileInfo" @@ -1153,10 +1175,18 @@ IDB_LCD160X43 BITMAP "lcd.bmp" #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN + IDD_DISPLAY, DIALOG + BEGIN + END + IDD_CPU, DIALOG BEGIN END + IDD_LOADSAVE, DIALOG + BEGIN + END + IDD_IOPORTS, DIALOG BEGIN END @@ -1165,6 +1195,10 @@ BEGIN BEGIN END + IDD_ABOUT, DIALOG + BEGIN + END + IDD_MISC1, DIALOG BEGIN END @@ -1186,9 +1220,26 @@ BEGIN BEGIN END + IDD_PANEL, DIALOG + BEGIN + END + + IDD_PATHS, DIALOG + BEGIN + END + IDD_FRONTEND, DIALOG BEGIN END + + IDD_STRINGBOX, DIALOG + BEGIN + END + + IDD_INPUTMAP, DIALOG + BEGIN + TOPMARGIN, 1 + END END #endif // APSTUDIO_INVOKED @@ -1273,7 +1324,6 @@ BEGIN IDS_INVALIDPRTPORT "The printer you have in this configuration is not valid on this machine.\n" IDS_RESTOREUSS "Restore a WinUAE snapshot file" IDS_USS "WinUAE snapshot files" - IDS_WRONGOSVERSION "WinUAE is no longer supported on Windows NT. Please upgrade to either Windows 2000 or Windows XP or a later version." IDS_SELECTFLASH "Select a flash or battery-backed RAM file..." IDS_FLASH "WinUAE flash or battery-backed RAM file" IDS_INPUTHOSTWIDGET "Input source" @@ -1332,6 +1382,8 @@ BEGIN IDS_QS_CD "CD" IDS_QS_CD_AUTO "Autodetect" IDS_QS_CD_IMAGE "Image file" + IDS_REMAPTITLE "Input captured. F12 = Exit. F11 = Skip curent event in Remap mode." + IDS_FILTER_NOOVERLAYS "No overlays available" END STRINGTABLE @@ -1374,13 +1426,13 @@ END STRINGTABLE BEGIN IDS_SOUND_FILTER_EMULATED_E "Emulated (A1200)" - IDS_INPUT_COMPATIBILITY "Compatibility mode" + IDS_INPUT_GAMEPORTS "Game Ports Panel" IDS_INPUT_CUSTOM "Configuration #%d" - IDS_INPUT_COPY_DEFAULT "Default" + IDS_INPUT_COPY_DEFAULT "GamePorts" IDS_INPUT_COPY_CUSTOM "Config #%d" IDS_3D_NO_FILTER "Point (%d-bit)" IDS_3D_BILINEAR "Bilinear (%d-bit)" - IDS_VSYNC_DEFAULT "Default" + IDS_VSYNC_DEFAULT "Default refresh rate" IDS_DRIVESOUND_NONE "No sound" IDS_DRIVESOUND_DEFAULT_A500 "A500 (WinUAE built-in)" IDS_AVIOUTPUT_NOCODEC "no codec selected" @@ -1534,6 +1586,9 @@ BEGIN IDS_PRINTER_EPSON48 "Epson Matrix Printer Emulation, 48pin" IDS_SELECTCD "Select a CD image file..." IDS_CD "CD image files" + IDS_BUFFER_SINGLE "No buffering" + IDS_BUFFER_DOUBLE "Double buffering" + IDS_BUFFER_TRIPLE "Triple buffering" END #endif // English resources diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index e09b1711..8f5a8945 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -85,12 +85,14 @@ struct sound_dp HANDLE paevent; int opacounter; int pablocking; + int pavolume; // wasapi IMMDevice *pDevice; IAudioClient *pAudioClient; IAudioRenderClient *pRenderClient; + ISimpleAudioVolume *pAudioVolume; IMMDeviceEnumerator *pEnumerator; #if 0 IAudioClock *pAudioClock; @@ -341,19 +343,33 @@ extern void setvolume_ahi (LONG); void set_volume_sound_device (struct sound_data *sd, int volume, int mute) { struct sound_dp *s = sd->data; + HRESULT hr; if (sd->devicetype == SOUND_DEVICE_AL) { float vol = 0.0; if (volume < 100 && !mute) vol = (100 - volume) / 100.0; alSourcef (s->al_Source, AL_GAIN, vol); } else if (sd->devicetype == SOUND_DEVICE_DS) { - HRESULT hr; LONG vol = DSBVOLUME_MIN; if (volume < 100 && !mute) vol = (LONG)((DSBVOLUME_MIN / 2) + (-DSBVOLUME_MIN / 2) * log (1 + (2.718281828 - 1) * (1 - volume / 100.0))); hr = IDirectSoundBuffer_SetVolume (s->lpDSBsecondary, vol); if (FAILED (hr)) write_log (L"DSSOUND: SetVolume(%d) failed: %s\n", vol, DXError (hr)); + } else if (sd->devicetype == SOUND_DEVICE_WASAPI) { + if (s->pAudioVolume) { + float vol = 0.0; + if (volume < 100 && !mute) + vol = (100 - volume) / 100.0; + hr = s->pAudioVolume->SetMasterVolume (vol, NULL); + if (FAILED (hr)) + write_log (L"AudioVolume->SetMasterVolume(%.2f) failed: %08Xs\n", vol, hr); + hr = s->pAudioVolume->SetMute (mute, NULL); + if (FAILED (hr)) + write_log (L"pAudioVolume->SetMute(%d) failed: %08Xs\n", mute, hr); + } + } else if (sd->devicetype == SOUND_DEVICE_PA) { + s->pavolume = volume; } } @@ -462,6 +478,13 @@ static DWORD fillsupportedmodes (struct sound_data *sd, int freq, struct dsaudio static void finish_sound_buffer_pa (struct sound_data *sd, uae_u16 *sndbuffer) { struct sound_dp *s = sd->data; + if (s->pavolume) { + int vol = 65536 - s->pavolume * 655; + for (int i = 0; i < sd->sndbufsize / sizeof (uae_u16); i++) { + uae_s16 v = (uae_s16)sndbuffer[i]; + sndbuffer[i] = v * vol / 65536; + } + } if (s->pablocking) { if (s->paframesperbuffer != sd->sndbufsize / (sd->channels * 2)) { write_log (L"sound buffer size mistmatch %d <> %d\n", s->paframesperbuffer, sd->sndbufsize / (sd->channels * 2)); @@ -469,7 +492,8 @@ static void finish_sound_buffer_pa (struct sound_data *sd, uae_u16 *sndbuffer) Pa_WriteStream (s->pastream, sndbuffer, s->paframesperbuffer); } } else { - while (s->opacounter == s->pacounter && s->pastream && !sd->paused) + int cnt = 2000 / 10; + while (s->opacounter == s->pacounter && s->pastream && !sd->paused && cnt-- >= 0) WaitForSingleObject (s->paevent, 10); s->opacounter = s->pacounter; memcpy (s->pasoundbuffer[s->patoggle], sndbuffer, sd->sndbufsize); @@ -688,6 +712,8 @@ static void close_audio_wasapi (struct sound_data *sd) if (s->pRenderClient) s->pRenderClient->Release (); + if (s->pAudioVolume) + s->pAudioVolume->Release (); #if 0 if (s->pAudioClock) s->pAudioClock->Release (); @@ -919,6 +945,11 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) write_log (L"WASAPI: GetService(IAudioRenderClient) %08X\n", hr); goto error; } + hr = s->pAudioClient->GetService (__uuidof(ISimpleAudioVolume), (void**)&s->pAudioVolume ); + if (FAILED (hr)) { + write_log (L"WASAPI: GetService(ISimpleAudioVolume) %08X\n", hr); + goto error; + } #if 0 hr = s->pAudioClient->GetService (IAudioClock, (void**)&s->pAudioClock); if (FAILED (hr)) { @@ -1577,7 +1608,6 @@ static void finish_sound_buffer_wasapi (struct sound_data *sd, uae_u16 *sndbuffe struct sound_dp *s = sd->data; HRESULT hr; BYTE *pData; - DWORD v; double skipmode; UINT32 numFramesPadding; int avail; diff --git a/od-win32/srcrelease.cmd b/od-win32/srcrelease.cmd index 01dae5da..301ad6d4 100644 --- a/od-win32/srcrelease.cmd +++ b/od-win32/srcrelease.cmd @@ -35,6 +35,7 @@ del cpuemu_0.cpp del cpuemu_11.cpp del cpuemu_12.cpp del cpuemu_20.cpp +del cpuemu_21.cpp del cpuemu_31.cpp del linetoscr.cpp @@ -63,6 +64,12 @@ rm -rf release rm -rf x64 cd .. +cd unpackers +rm -rf debug +rm -rf release +rm -rf x64 +cd .. + cd genlinetoscr_msvc rm -f genlinetoscr.exe rm -rf debug diff --git a/od-win32/sysconfig.h b/od-win32/sysconfig.h index b158afbb..ff568d3c 100644 --- a/od-win32/sysconfig.h +++ b/od-win32/sysconfig.h @@ -48,7 +48,8 @@ #define CPUEMU_0 /* generic 680x0 emulation */ #define CPUEMU_11 /* 68000+prefetch emulation */ #define CPUEMU_12 /* 68000 cycle-exact cpu&blitter */ -#define CPUEMU_20 /* 68020+ "cycle-exact" + blitter */ +#define CPUEMU_20 /* 68020 "cycle-exact" + blitter */ +#define CPUEMU_21 /* 68030 (040/060) "cycle-exact" + blitter */ #define CPUEMU_31 /* 68040 Aranym MMU */ #define ACTION_REPLAY /* Action Replay 1/2/3 support */ #define PICASSO96 /* Picasso96 display card emulation */ diff --git a/od-win32/uaeunp/uaeunp.vcxproj b/od-win32/uaeunp/uaeunp.vcxproj index 4c762b53..2c602b1f 100644 --- a/od-win32/uaeunp/uaeunp.vcxproj +++ b/od-win32/uaeunp/uaeunp.vcxproj @@ -57,13 +57,15 @@ Level3 EditAndContinue Default + StdCall - zlibstat.lib;wininet.lib;%(AdditionalDependencies) + zlibstat.lib;wininet.lib;lzmalib.lib;%(AdditionalDependencies) true Console false MachineX86 + $(SolutionDir)\..\lib\ @@ -78,25 +80,23 @@ Level3 ProgramDatabase + StdCall + true + false + false - zlibstat.lib;wininet.lib;%(AdditionalDependencies) + zlibstat.lib;wininet.lib;lzmalib.lib;%(AdditionalDependencies) wininet.dll;%(DelayLoadDLLs) true Console true true MachineX86 + $(SolutionDir)\..\lib\ - - - - - - - @@ -108,19 +108,6 @@ - - - - - - - - - - - - - @@ -132,9 +119,16 @@ - + + + + + + + + diff --git a/od-win32/uaeunp/uaeunp.vcxproj.filters b/od-win32/uaeunp/uaeunp.vcxproj.filters index 358d6fe0..361337d6 100644 --- a/od-win32/uaeunp/uaeunp.vcxproj.filters +++ b/od-win32/uaeunp/uaeunp.vcxproj.filters @@ -5,30 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {025b82fd-637e-4580-b73d-e9cb2b1704f3} - - - {f793e865-aaaa-4a92-ab71-042c6df63370} - - - {30815150-3af4-4642-a7b0-2f0a84e9184b} - - - {26e2cd32-bb63-4be1-8ce7-17a2670fbe68} - - - {02dd9255-7ba8-4931-8ed9-382100420cd3} - - - {9744d4a4-039b-43f0-a43b-2a3911cf429b} - - - {7a6a4d5c-b3f7-40e3-922d-ebf5ed25ac7f} - - - {e74cec8e-0727-401b-bea6-57f78b869c7d} - {1227b1a8-96c7-40ea-961b-03ac23a184bf} @@ -40,6 +16,27 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + {00e42ee4-d20b-492c-b25b-0e9750a6d85b} + + + {eb98dae8-c6ec-49a7-8a3d-8cf32939312a} + + + {0fc9c7ac-e938-4981-9f98-cdf840415358} + + + {d6ab702f-21fd-4acd-b9ef-f3ae2b09e1da} + + + {b4819264-3304-4b7d-a26f-d0a1aa1efd34} + + + {8969d72b-d2d6-4daa-8989-486487e5e474} + + + {75e92f84-bad0-4dfb-a8d5-d7a678415e24} + @@ -63,134 +60,95 @@ Source Files + + Source Files\win32 + + + Source Files\win32 + + + Source Files\win32 + + + Source Files\win32 + + + Source Files\win32 + - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms + Source Files\unpackers\dms - Source Files\decompressors\dms - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z - - - Source Files\decompressors\7z + Source Files\unpackers\dms - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha + Source Files\unpackers\lha - Source Files\decompressors\lha - - - Source Files\decompressors\zip + Source Files\unpackers\lha - Source Files\decompressors\lzx + Source Files\unpackers\lzx - Source Files\decompressors\wrp + Source Files\unpackers\wrp - - Source Files\win32 - - - Source Files\win32 - - - Source Files\win32 - - - Source Files\win32 - - - Source Files\win32 + + Source Files\unpackers\zip \ No newline at end of file diff --git a/od-win32/unpackers/unpackers.vcxproj b/od-win32/unpackers/unpackers.vcxproj new file mode 100644 index 00000000..548d699e --- /dev/null +++ b/od-win32/unpackers/unpackers.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {98BA115B-829F-4085-9729-ABD0D779A60A} + Win32Proj + unpackers + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + false + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Configuration)\..\..\lib\ + + + $(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\ + $(ProjectName)_x64 + + + $(SolutionDir)$(Configuration)\..\..\lib\ + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + ..\..\include;..\..;..\;%(AdditionalIncludeDirectories) + StdCall + false + + + Windows + true + + + %(ExportNamedFunctions) + + + + + + + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WINVER=0x0500;NDEBUG;_WIN32_IE=0x0700;WIN32;%(PreprocessorDefinitions) + MultiThreaded + StdCall + ..\..\include;..\;%(AdditionalIncludeDirectories) + false + + + Windows + true + true + true + + + + + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + StdCall + ..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/od-win32/unpackers/unpackers.vcxproj.filters b/od-win32/unpackers/unpackers.vcxproj.filters new file mode 100644 index 00000000..d7ef6a1a --- /dev/null +++ b/od-win32/unpackers/unpackers.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + \ No newline at end of file diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index a2c7a025..737ddc34 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -794,7 +794,7 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam, static int mm, minimized, recursive, ignoremousemove; #if MSGDEBUG > 1 - write_log (L"AWP: %x %d\n", hWnd, message); + write_log (L"AWP: %x %x\n", hWnd, message); #endif if (ignore_messages_all) return DefWindowProc (hWnd, message, wParam, lParam); @@ -1327,6 +1327,7 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam, switch (message) { + case WM_SETCURSOR: case WM_KILLFOCUS: case WM_SETFOCUS: case WM_MOUSEMOVE: @@ -1335,7 +1336,6 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam, case WM_ACTIVATEAPP: case WM_DROPFILES: case WM_ACTIVATE: - case WM_SETCURSOR: case WM_SYSCOMMAND: case WM_KEYUP: case WM_SYSKEYUP: @@ -1451,7 +1451,7 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam, case WM_NCLBUTTONDBLCLK: if (wParam == HTCAPTION) { - WIN32GFX_ToggleFullScreen (); + toggle_fullscreen (); return 0; } break; @@ -1706,11 +1706,6 @@ static int WIN32_RegisterClasses (void) return 1; } -#ifdef __GNUC__ -#undef WINAPI -#define WINAPI -#endif - static HINSTANCE hRichEdit = NULL, hHtmlHelp = NULL; int WIN32_CleanupLibraries (void) @@ -1826,9 +1821,6 @@ static TCHAR *getlanguagename(DWORD id) return NULL; } -typedef LANGID (CALLBACK* PGETUSERDEFAULTUILANGUAGE)(void); -static PGETUSERDEFAULTUILANGUAGE pGetUserDefaultUILanguage; - HMODULE language_load (WORD language) { HMODULE result = NULL; @@ -1838,11 +1830,7 @@ HMODULE language_load (WORD language) if (language <= 0) { /* new user-specific Windows ME/2K/XP method to get UI language */ - pGetUserDefaultUILanguage = (PGETUSERDEFAULTUILANGUAGE)GetProcAddress ( - GetModuleHandle (L"kernel32.dll"), "GetUserDefaultUILanguage"); - language = GetUserDefaultLangID (); - if (pGetUserDefaultUILanguage) - language = pGetUserDefaultUILanguage (); + language = GetUserDefaultUILanguage (); language &= 0x3ff; // low 9-bits form the primary-language ID } if (language == LANG_GERMAN) @@ -2635,6 +2623,7 @@ static const TCHAR *obsolete[] = { L"killwinkeys", L"sound_force_primary", L"iconified_highpriority", L"sound_sync", L"sound_tweak", L"directx6", L"sound_style", L"file_path", L"iconified_nospeed", L"activepriority", L"magic_mouse", + L"filesystem_codepage", 0 }; @@ -2642,6 +2631,8 @@ int target_parse_option (struct uae_prefs *p, TCHAR *option, TCHAR *value) { TCHAR tmpbuf[CONFIG_BLEN]; int i, v; + bool vb; + int result = (cfgfile_yesno (option, value, L"middle_mouse", &p->win32_middle_mouse) || cfgfile_yesno (option, value, L"map_drives", &p->win32_automount_drives) || cfgfile_yesno (option, value, L"map_drives_auto", &p->win32_automount_removable) @@ -2729,9 +2720,9 @@ int target_parse_option (struct uae_prefs *p, TCHAR *option, TCHAR *value) return 1; } - if (cfgfile_yesno (option, value, L"aspi", &v)) { - p->win32_uaescsimode = 0; - if (v) + if (cfgfile_yesno (option, value, L"aspi", &vb)) { + p->win32_uaescsimode = false; + if (vb) p->win32_uaescsimode = get_aspi (0); if (p->win32_uaescsimode < UAESCSI_ASPI_FIRST) p->win32_uaescsimode = UAESCSI_ADAPTECASPI; @@ -3134,16 +3125,16 @@ static int parseversion (TCHAR **vs) static int checkversion (TCHAR *vs) { + int ver; if (_tcslen (vs) < 10) return 0; - if (_tcsncmp (vs, L"WinUAE L", 7)) + if (_tcsncmp (vs, L"WinUAE ", 7)) return 0; vs += 7; - if (parseversion (&vs) > UAEMAJOR) - return 0; - if (parseversion (&vs) > UAEMINOR) - return 0; - if (parseversion (&vs) >= UAESUBREV) + ver = parseversion (&vs) << 16; + ver |= parseversion (&vs) << 8; + ver |= parseversion (&vs); + if (ver >= ((UAEMAJOR << 16) | (UAEMINOR << 8) | UAESUBREV)) return 0; return 1; } @@ -3522,7 +3513,7 @@ static void WIN32_HandleRegistryStuff (void) if (regexists (NULL, L"SoundDriverMask")) { regqueryint (NULL, L"SoundDriverMask", &sounddrivermask); } else { - sounddrivermask = 15; + sounddrivermask = 3; regsetint (NULL, L"SoundDriverMask", sounddrivermask); } if (regexists (NULL, L"ConfigurationCache")) @@ -4020,7 +4011,7 @@ static int parseargs (const TCHAR *arg, const TCHAR *np, const TCHAR *np2) return 1; } if (!_tcscmp (arg, L"-disableharddrivesafetycheck")) { - harddrive_dangerous = 0x1234dead; + //harddrive_dangerous = 0x1234dead; return 1; } if (!_tcscmp (arg, L"-noaspifiltering")) { diff --git a/od-win32/win32.h b/od-win32/win32.h index 648a3619..500bb55d 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -15,11 +15,11 @@ #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100) #define GETBDD(x) ((x) % 100) -#define WINUAEPUBLICBETA 0 +#define WINUAEPUBLICBETA 1 #define LANG_DLL 1 -#define WINUAEBETA L"" -#define WINUAEDATE MAKEBD(2010, 4, 28) +#define WINUAEBETA L"1" +#define WINUAEDATE MAKEBD(2010, 5, 15) #define WINUAEEXTRA L"" #define WINUAEREV L"" diff --git a/od-win32/win32_filesys.cpp b/od-win32/win32_filesys.cpp index a259c1e8..b663930f 100644 --- a/od-win32/win32_filesys.cpp +++ b/od-win32/win32_filesys.cpp @@ -40,7 +40,7 @@ static int valid_volumename (struct uaedev_mount_info *mountinfo, TCHAR *volumen } /* Returns 1 if an actual volume-name was found, 2 if no volume-name (so uses some defaults) */ -int target_get_volume_name (struct uaedev_mount_info *mtinf, const TCHAR *volumepath, TCHAR *volumename, int size, int inserted, int fullcheck) +int target_get_volume_name (struct uaedev_mount_info *mtinf, const TCHAR *volumepath, TCHAR *volumename, int size, bool inserted, bool fullcheck) { int result = 2; int drivetype; @@ -152,7 +152,7 @@ static void filesys_addexternals (void) /* Is this drive-letter valid (it used to check for media in drive) */ if(dwDriveMask & 1) { TCHAR devname[MAX_DPATH]; - BOOL inserted = CheckRM (volumepath); /* Is there a disk inserted? */ + bool inserted = CheckRM (volumepath) != 0; /* Is there a disk inserted? */ int nok = FALSE; int rw = 1; drivetype = GetDriveType (volumepath); @@ -186,7 +186,7 @@ static void filesys_addexternals (void) continue; volumename[0] = 0; if (inserted) { - target_get_volume_name (&mountinfo, volumepath, volumename, MAX_DPATH, inserted, 1); + target_get_volume_name (&mountinfo, volumepath, volumename, MAX_DPATH, inserted, true); if (!volumename[0]) _stprintf (volumename, L"WinUNK_%c", drive); } @@ -194,10 +194,12 @@ static void filesys_addexternals (void) _tcscat (volumepath, L"."); else _tcscat (volumepath, L".."); +#if 0 if (currprefs.win32_automount_drives > 1) { devname[0] = drive; devname[1] = 0; } +#endif //write_log (L"Drive type %d: '%s' '%s'\n", drivetype, volumepath, volumename); add_filesys_unit (devname[0] ? devname : NULL, volumename, volumepath, !rw, 0, 0, 0, 0, -20 - drvnum, 0, 1, 0, 0, 0); drvnum++; diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 9d33194e..1a178b6f 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -103,6 +103,7 @@ extern int console_logging; int window_extra_width, window_extra_height; static struct winuae_currentmode *currentmode = ¤tmodestruct; +static int wasfullwindow_a, wasfullwindow_p; int screen_is_picasso = 0; @@ -1298,6 +1299,7 @@ int check_prefs_changed_gfx (void) c |= currprefs.gfx_display != changed_prefs.gfx_display ? (2|4|8) : 0; c |= _tcscmp (currprefs.gfx_display_name, changed_prefs.gfx_display_name) ? (2|4|8) : 0; c |= currprefs.gfx_blackerthanblack != changed_prefs.gfx_blackerthanblack ? (2 | 8) : 0; + c |= currprefs.gfx_backbuffers != changed_prefs.gfx_backbuffers ? (2 | 8) : 0; c |= currprefs.win32_alwaysontop != changed_prefs.win32_alwaysontop ? 32 : 0; c |= currprefs.win32_notaskbarbutton != changed_prefs.win32_notaskbarbutton ? 32 : 0; @@ -1358,6 +1360,7 @@ int check_prefs_changed_gfx (void) currprefs.gfx_display = changed_prefs.gfx_display; _tcscpy (currprefs.gfx_display_name, changed_prefs.gfx_display_name); currprefs.gfx_blackerthanblack = changed_prefs.gfx_blackerthanblack; + currprefs.gfx_backbuffers = changed_prefs.gfx_backbuffers; currprefs.win32_alwaysontop = changed_prefs.win32_alwaysontop; currprefs.win32_notaskbarbutton = changed_prefs.win32_notaskbarbutton; @@ -1467,7 +1470,7 @@ int check_prefs_changed_gfx (void) currprefs.win32_iconified_pause = changed_prefs.win32_iconified_pause; currprefs.win32_ctrl_F11_is_quit = changed_prefs.win32_ctrl_F11_is_quit; inputdevice_unacquire (); - currprefs.keyboard_leds_in_use = currprefs.keyboard_leds[0] | currprefs.keyboard_leds[1] | currprefs.keyboard_leds[2]; + currprefs.keyboard_leds_in_use = (currprefs.keyboard_leds[0] | currprefs.keyboard_leds[1] | currprefs.keyboard_leds[2]) != 0; pause_sound (); resume_sound (); inputdevice_acquire (TRUE); @@ -1697,9 +1700,9 @@ static int reopen (int full) return 0; } -int vsync_switchmode (int hz, int oldhz) +bool vsync_switchmode (int hz, int oldhz) { - static int tempvsync; + static bool tempvsync; int w = currentmode->native_width; int h = currentmode->native_height; int d = currentmode->native_depth / 8; @@ -1950,15 +1953,6 @@ void close_windows (void) close_hwnds (); } -void WIN32GFX_ToggleFullScreen (void) -{ - display_change_requested = 1; - if (screen_is_picasso) - currprefs.gfx_pfullscreen ^= 1; - else - currprefs.gfx_afullscreen ^= 1; -} - static void createstatuswindow (void) { HDC hdc; @@ -2375,6 +2369,10 @@ static BOOL doInit (void) int ret = 0; int mult = 0; + if (wasfullwindow_a == 0) + wasfullwindow_a = currprefs.gfx_afullscreen == 2 ? 1 : -1; + if (wasfullwindow_p == 0) + wasfullwindow_p = currprefs.gfx_pfullscreen == 2 ? 1 : -1; colortype = DirectDraw_GetPixelFormat (); gfxmode_reset (); @@ -2606,10 +2604,19 @@ void updatewinfsmode (struct uae_prefs *p) void toggle_fullscreen (void) { - if(picasso_on) - changed_prefs.gfx_pfullscreen = !changed_prefs.gfx_pfullscreen; - else - changed_prefs.gfx_afullscreen = !changed_prefs.gfx_afullscreen; + int *p = picasso_on ? &changed_prefs.gfx_pfullscreen : &changed_prefs.gfx_afullscreen; + int wfw = picasso_on ? wasfullwindow_p : wasfullwindow_a; + int v = *p; + if (v == 2) + v = 1; + else if (v == 0) + v = 1; + else if (v == 1) + if (wfw > 0) + v = 2; + else + v = 0; + *p = v; updatewinfsmode (&changed_prefs); } diff --git a/od-win32/win32gfx.h b/od-win32/win32gfx.h index 23598782..1cad516d 100644 --- a/od-win32/win32gfx.h +++ b/od-win32/win32gfx.h @@ -11,7 +11,6 @@ int WIN32GFX_GetWidth (void); int WIN32GFX_GetHeight(void); int WIN32GFX_GetDepth (int real); void WIN32GFX_DisplayChangeRequested (void); -void WIN32GFX_ToggleFullScreen (void); void WIN32GFX_DisablePicasso (void); void WIN32GFX_EnablePicasso (void); void WIN32GFX_WindowMove (void); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index d4d407f1..e62b8a08 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -146,8 +146,8 @@ static int C_PAGES; #define MAX_C_PAGES 30 static int LOADSAVE_ID = -1, MEMORY_ID = -1, KICKSTART_ID = -1, CPU_ID = -1, DISPLAY_ID = -1, HW3D_ID = -1, CHIPSET_ID = -1, CHIPSET2_ID = -1, SOUND_ID = -1, FLOPPY_ID = -1, DISK_ID = -1, - HARDDISK_ID = -1, IOPORTS_ID = -1, GAMEPORTS_ID = -1, INPUT_ID = -1, MISC1_ID = -1, MISC2_ID = -1, AVIOUTPUT_ID = -1, - PATHS_ID = -1, QUICKSTART_ID = -1, ABOUT_ID = -1, EXPANSION_ID = -1, FRONTEND_ID = -1; + HARDDISK_ID = -1, IOPORTS_ID = -1, GAMEPORTS_ID = -1, INPUT_ID = -1, INPUTMAP_ID = -1, MISC1_ID = -1, MISC2_ID = -1, + AVIOUTPUT_ID = -1, PATHS_ID = -1, QUICKSTART_ID = -1, ABOUT_ID = -1, EXPANSION_ID = -1, FRONTEND_ID = -1; static HWND pages[MAX_C_PAGES]; #define MAX_IMAGETOOLTIPS 10 static HWND guiDlg, panelDlg, ToolTipHWND; @@ -158,7 +158,29 @@ struct ToolTipHWNDS { int imageid; }; static struct ToolTipHWNDS ToolTipHWNDS2[MAX_IMAGETOOLTIPS + 1]; +struct GUIPAGE { + DLGPROC dlgproc; + LPCTSTR title; + LPCTSTR icon; + HTREEITEM tv; + int himg; + int idx; + const TCHAR *help; + HACCEL accel; + int fullpanel; + struct newresource *nres; + int focusid; +}; +static struct GUIPAGE ppage[MAX_C_PAGES]; +static bool ischecked (HWND hDlg, DWORD id) +{ + return IsDlgButtonChecked (hDlg, id) == BST_CHECKED; +} +static void setfocus (HWND hDlg, int id) +{ + SendMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, id), TRUE); +} static void ew (HWND hDlg, DWORD id, int enable) { HWND w = GetDlgItem (hDlg, id); @@ -2181,7 +2203,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs _tcscpy (workprefs.cartfile, full_path); break; case IDC_INPREC_PLAY: - inprec_open (full_path, IsDlgButtonChecked (hDlg, IDC_INPREC_PLAYMODE) == BST_CHECKED ? -1 : -2); + inprec_open (full_path, ischecked (hDlg, IDC_INPREC_PLAYMODE) ? -1 : -2); break; case IDC_INPREC_RECORD: inprec_open (full_path, 1); @@ -2265,9 +2287,9 @@ static BOOL CreateHardFile (HWND hDlg, UINT hfsizem, TCHAR *dostype, TCHAR *newp dynamic = 0; dt = 0; hfsize = (uae_u64)hfsizem * 1024 * 1024; - if (IsDlgButtonChecked (hDlg, IDC_HF_SPARSE) == BST_CHECKED) + if (ischecked (hDlg, IDC_HF_SPARSE)) sparse = 1; - if (IsDlgButtonChecked (hDlg, IDC_HF_DYNAMIC) == BST_CHECKED) { + if (ischecked (hDlg, IDC_HF_DYNAMIC)) { dynamic = 1; sparse = 0; } @@ -3132,6 +3154,102 @@ static void update_listview_input (HWND hDlg) set_lventry_input (GetDlgItem (hDlg, IDC_INPUTLIST), i); } +static int inputmap_port = -1, inputmap_port_remap = -1; +static int inputmap_handle (HWND list, int currentdevnum, int currentwidgetnum, int *inputmap_portp, int *inputmap_indexp, int state) +{ + int cnt, portnum; + int mode, *events, *axistable; + bool found2 = false; + + for (portnum = 0; portnum < 4; portnum++) { + if (list) + portnum = inputmap_port; + cnt = 1; + if (inputdevice_get_compatibility_input (&workprefs, portnum, &mode, &events, &axistable)) { + int evtnum; + for (int i = 0; (evtnum = events[i]) >= 0; i++) { + struct inputevent *evt = inputdevice_get_eventinfo (evtnum); + LV_ITEM lvstruct; + int devnum; + int flags, status; + TCHAR name[256]; + bool found = false; + int *atp = axistable; + int atpidx; + int item; + + if (list) { + lvstruct.mask = LVIF_TEXT | LVIF_PARAM; + lvstruct.pszText = (TCHAR*)evt->name; + lvstruct.lParam = 0; + lvstruct.iItem = cnt; + lvstruct.iSubItem = 0; + item = ListView_InsertItem (list, &lvstruct); + } + + atpidx = 0; + while (*atp >= 0) { + if (*atp == evtnum) { + atp++; + atpidx = 2; + break; + } + if (atp[1] == evtnum || atp[2] == evtnum) { + atpidx = 1; + break; + } + atp += 3; + } + while (atpidx >= 0) { + devnum = 0; + while ((status = inputdevice_get_device_status (devnum)) >= 0) { + if (1 || status) { + for (int j = 0; j < inputdevice_get_widget_num (devnum); j++) { + for (int sub = 0; sub < MAX_INPUT_SUB_EVENT; sub++) { + if (inputdevice_get_mapped_name (devnum, j, &flags, NULL, NULL, sub) == evtnum && !found) { + TCHAR tmp[MAX_DPATH]; + inputdevice_get_widget_type (devnum, j, name); + if (list) { + _tcscpy (tmp, name); + _tcscat (tmp, L","); + _tcscat (tmp, inputdevice_get_device_name2 (devnum)); + ListView_SetItemText (list, item, 1, tmp); + found = true; + } else if (currentdevnum == devnum) { + if (currentwidgetnum == j) { + *inputmap_portp = portnum; + *inputmap_indexp = cnt - 1; + found2 = true; + if (state < 0) + return 1; + state = -1; + } + } + } + } + } + } + devnum++; + } + evtnum = *atp++; + atpidx--; + } + cnt++; + } + } + if (list) + break; + } + if (found2) + return 1; + return 0; +} +static void update_listview_inputmap (HWND hDlg) +{ + HWND list = GetDlgItem (hDlg, IDC_INPUTMAPLIST); + inputmap_handle (list, -1, -1, NULL, NULL, 0); +} + static int clicked_entry = -1; #define LOADSAVE_COLUMNS 2 @@ -3139,6 +3257,7 @@ static int clicked_entry = -1; #define HARDDISK_COLUMNS 8 #define DISK_COLUMNS 3 #define MISC2_COLUMNS 2 +#define INPUTMAP_COLUMNS 2 #define MAX_COLUMN_HEADING_WIDTH 20 #define LV_LOADSAVE 1 @@ -3146,6 +3265,11 @@ static int clicked_entry = -1; #define LV_INPUT 3 #define LV_DISK 4 #define LV_MISC2 5 +#define LV_INPUTMAP 6 +#define LV_MAX 7 + +static int lv_oldidx[LV_MAX]; +static int lv_old_type = -1; static int listview_num_columns; @@ -3168,30 +3292,45 @@ void InitializeListView (HWND hDlg) TCHAR tmp[10], tmp2[MAX_DPATH]; int listview_column_width[HARDDISK_COLUMNS]; + if (cachedlist) { + if (lv_old_type >= 0) + lv_oldidx[lv_old_type] = ListView_GetTopIndex (cachedlist); + lv_oldidx[lv_old_type] += ListView_GetCountPerPage (cachedlist) - 1; + cachedlist = NULL; + } + if (hDlg == pages[HARDDISK_ID]) { listview_num_columns = HARDDISK_COLUMNS; lv_type = LV_HARDDISK; _tcscpy (column_heading[0], L"*"); - WIN32GUI_LoadUIString(IDS_DEVICE, column_heading[1], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_VOLUME, column_heading[2], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_PATH, column_heading[3], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_RW, column_heading[4], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_BLOCKSIZE, column_heading[5], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_HFDSIZE, column_heading[6], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_BOOTPRI, column_heading[7], MAX_COLUMN_HEADING_WIDTH); - list = GetDlgItem(hDlg, IDC_VOLUMELIST); + WIN32GUI_LoadUIString (IDS_DEVICE, column_heading[1], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_VOLUME, column_heading[2], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_PATH, column_heading[3], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_RW, column_heading[4], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_BLOCKSIZE, column_heading[5], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_HFDSIZE, column_heading[6], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_BOOTPRI, column_heading[7], MAX_COLUMN_HEADING_WIDTH); + list = GetDlgItem (hDlg, IDC_VOLUMELIST); } else if (hDlg == pages[INPUT_ID]) { listview_num_columns = INPUT_COLUMNS; lv_type = LV_INPUT; - WIN32GUI_LoadUIString(IDS_INPUTHOSTWIDGET, column_heading[0], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_INPUTAMIGAEVENT, column_heading[1], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_INPUTAUTOFIRE, column_heading[2], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_INPUTTOGGLE, column_heading[3], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_INPUTHOSTWIDGET, column_heading[0], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_INPUTAMIGAEVENT, column_heading[1], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_INPUTAUTOFIRE, column_heading[2], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_INPUTTOGGLE, column_heading[3], MAX_COLUMN_HEADING_WIDTH); _tcscpy (column_heading[4], L"#"); - list = GetDlgItem(hDlg, IDC_INPUTLIST); + list = GetDlgItem (hDlg, IDC_INPUTLIST); + + } else if (hDlg == pages[INPUTMAP_ID]) { + + listview_num_columns = INPUTMAP_COLUMNS; + lv_type = LV_INPUTMAP; + WIN32GUI_LoadUIString (IDS_INPUTAMIGAEVENT, column_heading[0], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_INPUTHOSTWIDGET, column_heading[1], MAX_COLUMN_HEADING_WIDTH); + list = GetDlgItem (hDlg, IDC_INPUTMAPLIST); } else if (hDlg == pages[MISC2_ID]) { @@ -3206,15 +3345,18 @@ void InitializeListView (HWND hDlg) listview_num_columns = DISK_COLUMNS; lv_type = LV_DISK; _tcscpy (column_heading[0], L"#"); - WIN32GUI_LoadUIString(IDS_DISK_IMAGENAME, column_heading[1], MAX_COLUMN_HEADING_WIDTH); - WIN32GUI_LoadUIString(IDS_DISK_DRIVENAME, column_heading[2], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_DISK_IMAGENAME, column_heading[1], MAX_COLUMN_HEADING_WIDTH); + WIN32GUI_LoadUIString (IDS_DISK_DRIVENAME, column_heading[2], MAX_COLUMN_HEADING_WIDTH); list = GetDlgItem (hDlg, IDC_DISK); } - cachedlist = list; + int flags = LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT; + ListView_SetExtendedListViewStyleEx (list, flags , flags); ListView_DeleteAllItems (list); + cachedlist = list; + for(i = 0; i < listview_num_columns; i++) listview_column_width[i] = ListView_GetStringWidth (list, column_heading[i]) + 15; @@ -3256,7 +3398,7 @@ void InitializeListView (HWND hDlg) lvstruct.iSubItem = 0; result = ListView_InsertItem (list, &lvstruct); width = ListView_GetStringWidth (list, lvstruct.pszText) + 15; - if( width > listview_column_width[0]) + if (width > listview_column_width[0]) listview_column_width[0] = width; entry++; } @@ -3266,6 +3408,12 @@ void InitializeListView (HWND hDlg) listview_column_width [4] = 30; update_listview_input (hDlg); + } else if (lv_type == LV_INPUTMAP) { + + listview_column_width [0] = 200; + listview_column_width [1] = 200; + update_listview_inputmap (hDlg); + } else if (lv_type == LV_DISK) { for (i = 0; i < MAX_SPARE_DRIVES; i++) { @@ -3430,12 +3578,14 @@ void InitializeListView (HWND hDlg) // Adjust our column widths so that we can see the contents... for(i = 0; i < listview_num_columns; i++) ListView_SetColumnWidth (list, i, listview_column_width[i]); - // Turn on full-row-select option - ListView_SetExtendedListViewStyle (list, LVS_EX_FULLROWSELECT); // Redraw the items in the list... items = ListView_GetItemCount (list); ListView_RedrawItems (list, 0, items); } + if (lv_oldidx[lv_type] >= 0) + ListView_EnsureVisible (list, lv_oldidx[lv_type], FALSE); + lv_old_type = lv_type; + } static int listview_find_selected (HWND list) @@ -3841,13 +3991,13 @@ static void loadsavecommands (HWND hDlg, WPARAM wParam, struct ConfigStruct **co break; case IDC_CONFIGAUTO: if (configtypepanel > 0) { - int ct = IsDlgButtonChecked (hDlg, IDC_CONFIGAUTO) == BST_CHECKED ? 1 : 0; + int ct = ischecked (hDlg, IDC_CONFIGAUTO) ? 1 : 0; ConfigToRegistry2 (ct, configtypepanel, -1); } break; case IDC_CONFIGNOLINK: if (configtypepanel == 0) { - int ct = IsDlgButtonChecked (hDlg, IDC_CONFIGNOLINK) == BST_CHECKED ? 1 : 0; + int ct = ischecked (hDlg, IDC_CONFIGNOLINK) ? 1 : 0; ConfigToRegistry2 (-1, -1, ct); } break; @@ -3894,7 +4044,7 @@ static INT_PTR CALLBACK LoadSaveDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPA case WM_CONTEXTMENU: { - int id = GetDlgCtrlID((HWND)wParam); + int id = GetDlgCtrlID ((HWND)wParam); if (id == IDC_SAVE || id == IDC_LOAD) { TCHAR *s = favoritepopup (hDlg); if (s) { @@ -4380,7 +4530,7 @@ static INT_PTR CALLBACK PathsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM reset_disk_history (); break; case IDC_PATHS_CONFIGCACHE: - configurationcache = IsDlgButtonChecked (hDlg, IDC_PATHS_CONFIGCACHE) ? 1 : 0; + configurationcache = ischecked (hDlg, IDC_PATHS_CONFIGCACHE) ? 1 : 0; regsetint (NULL, L"ConfigurationCache", configurationcache); break; @@ -4759,7 +4909,7 @@ static INT_PTR CALLBACK QuickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, L switch (LOWORD (wParam)) { case IDC_QUICKSTARTMODE: - quickstart = IsDlgButtonChecked (hDlg, IDC_QUICKSTARTMODE); + quickstart = ischecked (hDlg, IDC_QUICKSTARTMODE); regsetint (NULL, L"QuickStartMode", quickstart); quickstart_cd = 0; if (quickstart) { @@ -5161,7 +5311,7 @@ static int display_toselect (int fs, int vsync, int p96) return 3; return fs; } -static void display_fromselect (int val, int *fs, int *vsync, int p96) +static void display_fromselect (int val, int *fs, bool *vsync, int p96) { int ofs = *fs; if (val == CB_ERR) @@ -5191,7 +5341,7 @@ static void display_fromselect (int val, int *fs, int *vsync, int p96) break; case 3: *fs = 1; - *vsync = 2; + *vsync = 1; break; case 4: *fs = 2; @@ -5305,6 +5455,15 @@ static void values_to_displaydlg (HWND hDlg) CheckDlgButton (hDlg, IDC_XCENTER, workprefs.gfx_xcenter); CheckDlgButton (hDlg, IDC_YCENTER, workprefs.gfx_ycenter); + SendDlgItemMessage(hDlg, IDC_DISPLAY_BUFFERCNT, CB_RESETCONTENT, 0, 0); + WIN32GUI_LoadUIString(IDS_BUFFER_SINGLE, buffer, sizeof buffer / sizeof (TCHAR)); + SendDlgItemMessage(hDlg, IDC_DISPLAY_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)buffer); + WIN32GUI_LoadUIString(IDS_BUFFER_DOUBLE, buffer, sizeof buffer / sizeof (TCHAR)); + SendDlgItemMessage(hDlg, IDC_DISPLAY_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)buffer); + WIN32GUI_LoadUIString(IDS_BUFFER_TRIPLE, buffer, sizeof buffer / sizeof (TCHAR)); + SendDlgItemMessage(hDlg, IDC_DISPLAY_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)buffer); + SendDlgItemMessage (hDlg, IDC_DISPLAY_BUFFERCNT, CB_SETCURSEL, workprefs.gfx_backbuffers, 0); + init_da (hDlg); } @@ -5352,12 +5511,12 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l display_fromselect (SendDlgItemMessage (hDlg, IDC_SCREENMODE_RTG, CB_GETCURSEL, 0, 0), &workprefs.gfx_pfullscreen, &workprefs.gfx_pvsync, 1); - workprefs.gfx_lores_mode = IsDlgButtonChecked (hDlg, IDC_LORES_SMOOTHED); - workprefs.gfx_scandoubler = IsDlgButtonChecked (hDlg, IDC_FLICKERFIXER); - workprefs.gfx_blackerthanblack = IsDlgButtonChecked (hDlg, IDC_BLACKER_THAN_BLACK); - workprefs.gfx_linedbl = (IsDlgButtonChecked(hDlg, IDC_LM_SCANLINES) ? 2 : - IsDlgButtonChecked(hDlg, IDC_LM_DOUBLED) ? 1 : 0); - + workprefs.gfx_lores_mode = ischecked (hDlg, IDC_LORES_SMOOTHED); + workprefs.gfx_scandoubler = ischecked (hDlg, IDC_FLICKERFIXER); + workprefs.gfx_blackerthanblack = ischecked (hDlg, IDC_BLACKER_THAN_BLACK); + workprefs.gfx_linedbl = (ischecked (hDlg, IDC_LM_SCANLINES) ? 2 : + ischecked (hDlg, IDC_LM_DOUBLED) ? 1 : 0); + workprefs.gfx_backbuffers = SendDlgItemMessage (hDlg, IDC_DISPLAY_BUFFERCNT, CB_GETCURSEL, 0, 0); workprefs.gfx_framerate = SendDlgItemMessage (hDlg, IDC_FRAMERATE, TBM_GETPOS, 0, 0); workprefs.chipset_refreshrate = SendDlgItemMessage (hDlg, IDC_FRAMERATE2, TBM_GETPOS, 0, 0); @@ -5392,8 +5551,8 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l } if (workprefs.chipset_refreshrate == (currprefs.ntscmode ? 60 : 50)) workprefs.chipset_refreshrate = 0; - workprefs.gfx_xcenter = (IsDlgButtonChecked (hDlg, IDC_XCENTER) ? 2 : 0 ); /* Smart centering */ - workprefs.gfx_ycenter = (IsDlgButtonChecked (hDlg, IDC_YCENTER) ? 2 : 0 ); /* Smart centering */ + workprefs.gfx_xcenter = ischecked (hDlg, IDC_XCENTER) ? 2 : 0; /* Smart centering */ + workprefs.gfx_ycenter = ischecked (hDlg, IDC_YCENTER) ? 2 : 0; /* Smart centering */ if (msg == WM_COMMAND && HIWORD (wParam) == CBN_SELCHANGE) { @@ -5593,11 +5752,12 @@ static void values_to_chipsetdlg (HWND hDlg) static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL success = FALSE; - int n, snd; + int nn, snd; + bool n; - workprefs.genlock = IsDlgButtonChecked (hDlg, IDC_GENLOCK); - workprefs.immediate_blits = IsDlgButtonChecked (hDlg, IDC_BLITIMM); - n = IsDlgButtonChecked (hDlg, IDC_CYCLEEXACT) ? 1 : 0; + workprefs.genlock = ischecked (hDlg, IDC_GENLOCK); + workprefs.immediate_blits = ischecked (hDlg, IDC_BLITIMM); + n = ischecked (hDlg, IDC_CYCLEEXACT); if (workprefs.cpu_cycle_exact != n) { workprefs.cpu_cycle_exact = workprefs.blitter_cycle_exact = n; if (n) { @@ -5610,20 +5770,20 @@ static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l workprefs.cachesize = 0; } } - workprefs.collision_level = IsDlgButtonChecked (hDlg, IDC_COLLISION0) ? 0 - : IsDlgButtonChecked (hDlg, IDC_COLLISION1) ? 1 - : IsDlgButtonChecked (hDlg, IDC_COLLISION2) ? 2 : 3; - workprefs.chipset_mask = IsDlgButtonChecked (hDlg, IDC_OCS) ? 0 - : IsDlgButtonChecked (hDlg, IDC_ECS_AGNUS) ? CSMASK_ECS_AGNUS - : IsDlgButtonChecked (hDlg, IDC_ECS_DENISE) ? CSMASK_ECS_DENISE - : IsDlgButtonChecked (hDlg, IDC_ECS) ? CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE + workprefs.collision_level = ischecked (hDlg, IDC_COLLISION0) ? 0 + : ischecked (hDlg, IDC_COLLISION1) ? 1 + : ischecked (hDlg, IDC_COLLISION2) ? 2 : 3; + workprefs.chipset_mask = ischecked (hDlg, IDC_OCS) ? 0 + : ischecked (hDlg, IDC_ECS_AGNUS) ? CSMASK_ECS_AGNUS + : ischecked (hDlg, IDC_ECS_DENISE) ? CSMASK_ECS_DENISE + : ischecked (hDlg, IDC_ECS) ? CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE : CSMASK_AGA | CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE; - n = IsDlgButtonChecked (hDlg, IDC_NTSC) ? 1 : 0; + n = ischecked (hDlg, IDC_NTSC); if (workprefs.ntscmode != n) { workprefs.ntscmode = n; } - snd = IsDlgButtonChecked (hDlg, IDC_CS_SOUND0) ? 0 - : IsDlgButtonChecked (hDlg, IDC_CS_SOUND1) ? 2 : 3; + snd = ischecked (hDlg, IDC_CS_SOUND0) ? 0 + : ischecked (hDlg, IDC_CS_SOUND1) ? 2 : 3; if (snd == 0 || snd == 3) { workprefs.produce_sound = snd; } else if (snd == 2) { @@ -5632,9 +5792,9 @@ static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l else if (workprefs.produce_sound >= 2) workprefs.produce_sound = 2; } - n = SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_GETCURSEL, 0, 0); - if (n != CB_ERR) { - workprefs.cs_compatible = n; + nn = SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_GETCURSEL, 0, 0); + if (nn != CB_ERR) { + workprefs.cs_compatible = nn; built_in_chipset_prefs (&workprefs); } } @@ -5721,12 +5881,12 @@ static void values_to_chipsetdlg2 (HWND hDlg) CheckDlgButton (hDlg, IDC_CS_DENISE, workprefs.cs_deniserev >= 0); CheckDlgButton (hDlg, IDC_CS_DMAC, workprefs.cs_mbdmac == 1); CheckDlgButton (hDlg, IDC_CS_DMAC2, workprefs.cs_mbdmac == 2); - CheckDlgButton (hDlg, IDC_CS_A2091, workprefs.cs_a2091 > 0); - CheckDlgButton (hDlg, IDC_CS_A4091, workprefs.cs_a4091 > 0); - CheckDlgButton (hDlg, IDC_CS_CDTVSCSI, workprefs.cs_cdtvscsi > 0); + CheckDlgButton (hDlg, IDC_CS_A2091, workprefs.cs_a2091); + CheckDlgButton (hDlg, IDC_CS_A4091, workprefs.cs_a4091); + CheckDlgButton (hDlg, IDC_CS_CDTVSCSI, workprefs.cs_cdtvscsi); CheckDlgButton (hDlg, IDC_CS_SCSIMODE, workprefs.scsi == 2); - CheckDlgButton (hDlg, IDC_CS_PCMCIA, workprefs.cs_pcmcia > 0); - CheckDlgButton (hDlg, IDC_CS_SLOWISFAST, workprefs.cs_slowmemisfast > 0); + CheckDlgButton (hDlg, IDC_CS_PCMCIA, workprefs.cs_pcmcia); + CheckDlgButton (hDlg, IDC_CS_SLOWISFAST, workprefs.cs_slowmemisfast); CheckDlgButton (hDlg, IDC_CS_IDE1, workprefs.cs_ide > 0 && (workprefs.cs_ide & 1)); CheckDlgButton (hDlg, IDC_CS_IDE2, workprefs.cs_ide > 0 && (workprefs.cs_ide & 2)); txt[0] = 0; @@ -5775,41 +5935,41 @@ static void values_from_chipsetdlg2 (HWND hDlg, UINT msg, WPARAM wParam, LPARAM TCHAR txt[32], *p; int v; - workprefs.cs_compatible = IsDlgButtonChecked (hDlg, IDC_CS_COMPATIBLE); - workprefs.cs_resetwarning = IsDlgButtonChecked (hDlg, IDC_CS_RESETWARNING); - workprefs.cs_denisenoehb = IsDlgButtonChecked (hDlg, IDC_CS_NOEHB); - workprefs.cs_dipagnus = IsDlgButtonChecked (hDlg, IDC_CS_DIPAGNUS); + workprefs.cs_compatible = ischecked (hDlg, IDC_CS_COMPATIBLE); + workprefs.cs_resetwarning = ischecked (hDlg, IDC_CS_RESETWARNING); + workprefs.cs_denisenoehb = ischecked (hDlg, IDC_CS_NOEHB); + workprefs.cs_dipagnus = ischecked (hDlg, IDC_CS_DIPAGNUS); workprefs.cs_agnusbltbusybug = workprefs.cs_dipagnus; - workprefs.cs_ksmirror_e0 = IsDlgButtonChecked (hDlg, IDC_CS_KSMIRROR_E0); - workprefs.cs_ksmirror_a8 = IsDlgButtonChecked (hDlg, IDC_CS_KSMIRROR_A8); - workprefs.cs_ciaoverlay = IsDlgButtonChecked (hDlg, IDC_CS_CIAOVERLAY); - workprefs.cs_df0idhw = IsDlgButtonChecked (hDlg, IDC_CS_DF0IDHW); - workprefs.cs_cd32cd = IsDlgButtonChecked (hDlg, IDC_CS_CD32CD); - workprefs.cs_cd32c2p = IsDlgButtonChecked (hDlg, IDC_CS_CD32C2P); - workprefs.cs_cd32nvram = IsDlgButtonChecked (hDlg, IDC_CS_CD32NVRAM); - workprefs.cs_cdtvcd = IsDlgButtonChecked (hDlg, IDC_CS_CDTVCD); - workprefs.cs_cdtvram = IsDlgButtonChecked (hDlg, IDC_CS_CDTVRAM); - workprefs.cs_cdtvcard = IsDlgButtonChecked (hDlg, IDC_CS_CDTVRAMEXP) ? 64 : 0; - workprefs.cs_a1000ram = IsDlgButtonChecked (hDlg, IDC_CS_A1000RAM); - workprefs.cs_ramseyrev = IsDlgButtonChecked (hDlg, IDC_CS_RAMSEY) ? 0x0f : -1; - workprefs.cs_fatgaryrev = IsDlgButtonChecked (hDlg, IDC_CS_FATGARY) ? 0x00 : -1; - workprefs.cs_mbdmac = IsDlgButtonChecked (hDlg, IDC_CS_DMAC) ? 1 : 0; + workprefs.cs_ksmirror_e0 = ischecked (hDlg, IDC_CS_KSMIRROR_E0); + workprefs.cs_ksmirror_a8 = ischecked (hDlg, IDC_CS_KSMIRROR_A8); + workprefs.cs_ciaoverlay = ischecked (hDlg, IDC_CS_CIAOVERLAY); + workprefs.cs_df0idhw = ischecked (hDlg, IDC_CS_DF0IDHW); + workprefs.cs_cd32cd = ischecked (hDlg, IDC_CS_CD32CD); + workprefs.cs_cd32c2p = ischecked (hDlg, IDC_CS_CD32C2P); + workprefs.cs_cd32nvram = ischecked (hDlg, IDC_CS_CD32NVRAM); + workprefs.cs_cdtvcd = ischecked (hDlg, IDC_CS_CDTVCD); + workprefs.cs_cdtvram = ischecked (hDlg, IDC_CS_CDTVRAM); + workprefs.cs_cdtvcard = ischecked (hDlg, IDC_CS_CDTVRAMEXP) ? 64 : 0; + workprefs.cs_a1000ram = ischecked (hDlg, IDC_CS_A1000RAM); + workprefs.cs_ramseyrev = ischecked (hDlg, IDC_CS_RAMSEY) ? 0x0f : -1; + workprefs.cs_fatgaryrev = ischecked (hDlg, IDC_CS_FATGARY) ? 0x00 : -1; + workprefs.cs_mbdmac = ischecked (hDlg, IDC_CS_DMAC) ? 1 : 0; if (workprefs.cs_mbdmac == 0) - workprefs.cs_mbdmac = IsDlgButtonChecked (hDlg, IDC_CS_DMAC2) ? 2 : 0; - workprefs.cs_a2091 = IsDlgButtonChecked (hDlg, IDC_CS_A2091) ? 1 : 0; - workprefs.cs_a4091 = IsDlgButtonChecked (hDlg, IDC_CS_A4091) ? 1 : 0; + workprefs.cs_mbdmac = ischecked (hDlg, IDC_CS_DMAC2) ? 2 : 0; + workprefs.cs_a2091 = ischecked (hDlg, IDC_CS_A2091) ? 1 : 0; + workprefs.cs_a4091 = ischecked (hDlg, IDC_CS_A4091) ? 1 : 0; #if 0 if (msg == WM_COMMAND && LOWORD(wParam) == IDC_CS_SCSIMODE) - workprefs.scsi = IsDlgButtonChecked (hDlg, IDC_CS_SCSIMODE) ? 2 : 0; + workprefs.scsi = ischecked (hDlg, IDC_CS_SCSIMODE) ? 2 : 0; #endif - workprefs.cs_cdtvscsi = IsDlgButtonChecked (hDlg, IDC_CS_CDTVSCSI) ? 1 : 0; - workprefs.cs_pcmcia = IsDlgButtonChecked (hDlg, IDC_CS_PCMCIA) ? 1 : 0; - workprefs.cs_slowmemisfast = IsDlgButtonChecked (hDlg, IDC_CS_SLOWISFAST) ? 1 : 0; - workprefs.cs_ide = IsDlgButtonChecked (hDlg, IDC_CS_IDE1) ? 1 : (IsDlgButtonChecked (hDlg, IDC_CS_IDE2) ? 2 : 0); - workprefs.cs_ciaatod = IsDlgButtonChecked (hDlg, IDC_CS_CIAA_TOD1) ? 0 - : (IsDlgButtonChecked (hDlg, IDC_CS_CIAA_TOD2) ? 1 : 2); - workprefs.cs_rtc = IsDlgButtonChecked (hDlg, IDC_CS_RTC1) ? 0 - : (IsDlgButtonChecked (hDlg, IDC_CS_RTC2) ? 1 : 2); + workprefs.cs_cdtvscsi = ischecked (hDlg, IDC_CS_CDTVSCSI) ? 1 : 0; + workprefs.cs_pcmcia = ischecked (hDlg, IDC_CS_PCMCIA) ? 1 : 0; + workprefs.cs_slowmemisfast = ischecked (hDlg, IDC_CS_SLOWISFAST) ? 1 : 0; + workprefs.cs_ide = ischecked (hDlg, IDC_CS_IDE1) ? 1 : (ischecked (hDlg, IDC_CS_IDE2) ? 2 : 0); + workprefs.cs_ciaatod = ischecked (hDlg, IDC_CS_CIAA_TOD1) ? 0 + : (ischecked (hDlg, IDC_CS_CIAA_TOD2) ? 1 : 2); + workprefs.cs_rtc = ischecked (hDlg, IDC_CS_RTC1) ? 0 + : (ischecked (hDlg, IDC_CS_RTC2) ? 1 : 2); if (workprefs.cs_rtc) { txt[0] = 0; @@ -6338,26 +6498,26 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP switch (LOWORD (wParam)) { case IDC_RTG_MATCH_DEPTH: - workprefs.win32_rtgmatchdepth = IsDlgButtonChecked (hDlg, IDC_RTG_MATCH_DEPTH); + workprefs.win32_rtgmatchdepth = ischecked (hDlg, IDC_RTG_MATCH_DEPTH); break; case IDC_RTG_SCALE: - workprefs.win32_rtgscaleifsmall = IsDlgButtonChecked (hDlg, IDC_RTG_SCALE); + workprefs.win32_rtgscaleifsmall = ischecked (hDlg, IDC_RTG_SCALE); break; case IDC_RTG_SCALE_ALLOW: - workprefs.win32_rtgallowscaling = IsDlgButtonChecked (hDlg, IDC_RTG_SCALE_ALLOW); + workprefs.win32_rtgallowscaling = ischecked (hDlg, IDC_RTG_SCALE_ALLOW); break; case IDC_SOCKETS: - workprefs.socket_emu = IsDlgButtonChecked (hDlg, IDC_SOCKETS); + workprefs.socket_emu = ischecked (hDlg, IDC_SOCKETS); break; case IDC_SCSIDEVICE: - workprefs.scsi = IsDlgButtonChecked (hDlg, IDC_SCSIDEVICE) ? 1 : 0; + workprefs.scsi = ischecked (hDlg, IDC_SCSIDEVICE); enable_for_expansiondlg (hDlg); break; case IDC_SANA2: - workprefs.sana2 = IsDlgButtonChecked (hDlg, IDC_SANA2) ? 1 : 0; + workprefs.sana2 = ischecked (hDlg, IDC_SANA2); break; case IDC_A2065: - if (IsDlgButtonChecked (hDlg, IDC_A2065)) { + if (ischecked (hDlg, IDC_A2065)) { _tcscpy (workprefs.a2065name, L"none"); expansion_net (hDlg); enable_for_expansiondlg (hDlg); @@ -6368,7 +6528,7 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP } break; case IDC_CATWEASEL: - workprefs.catweasel = IsDlgButtonChecked (hDlg, IDC_CATWEASEL) ? -1 : 0; + workprefs.catweasel = ischecked (hDlg, IDC_CATWEASEL) ? -1 : 0; break; } if (HIWORD (wParam) == CBN_SELENDOK || HIWORD (wParam) == CBN_KILLFOCUS || HIWORD (wParam) == CBN_EDITCHANGE) { @@ -6730,15 +6890,15 @@ static INT_PTR CALLBACK KickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP break; case IDC_KICKSHIFTER: - workprefs.kickshifter = IsDlgButtonChecked(hDlg, IDC_KICKSHIFTER); + workprefs.kickshifter = ischecked (hDlg, IDC_KICKSHIFTER); break; case IDC_MAPROM: - workprefs.maprom = IsDlgButtonChecked(hDlg, IDC_MAPROM) ? 0x0f000000 : 0; + workprefs.maprom = ischecked (hDlg, IDC_MAPROM) ? 0x0f000000 : 0; break; #if 0 case IDC_HRTMON: - workprefs.cart_internal = IsDlgButtonChecked(hDlg, IDC_HRTMON) ? 1 : 0; + workprefs.cart_internal = ischecked (hDlg, IDC_HRTMON) ? 1 : 0; ew (hDlg, IDC_CARTFILE, workprefs.cart_internal == 1 ? FALSE : TRUE); break; #endif @@ -6801,7 +6961,7 @@ static void misc_getkbled (HWND hDlg, int v, int n) workprefs.keyboard_leds[n] = nv; misc_kbled (hDlg, v, nv); } - workprefs.keyboard_leds_in_use = workprefs.keyboard_leds[0] | workprefs.keyboard_leds[1] | workprefs.keyboard_leds[2]; + workprefs.keyboard_leds_in_use = (workprefs.keyboard_leds[0] | workprefs.keyboard_leds[1] | workprefs.keyboard_leds[2]) != 0; } static void misc_getpri (HWND hDlg, int v, int *n) @@ -7100,73 +7260,73 @@ static INT_PTR MiscDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) savestate_state = STATE_DORESTORE; break; case IDC_STATE_CAPTURE: - workprefs.statecapture = IsDlgButtonChecked (hDlg, IDC_STATE_CAPTURE); + workprefs.statecapture = ischecked (hDlg, IDC_STATE_CAPTURE); enable_for_miscdlg (hDlg); break; case IDC_ILLEGAL: - workprefs.illegal_mem = IsDlgButtonChecked (hDlg, IDC_ILLEGAL); + workprefs.illegal_mem = ischecked (hDlg, IDC_ILLEGAL); break; case IDC_JULIAN: - workprefs.win32_middle_mouse = IsDlgButtonChecked(hDlg, IDC_JULIAN); + workprefs.win32_middle_mouse = ischecked (hDlg, IDC_JULIAN); break; case IDC_FOCUSMINIMIZE: - workprefs.win32_minimize_inactive = IsDlgButtonChecked (hDlg, IDC_FOCUSMINIMIZE); + workprefs.win32_minimize_inactive = ischecked (hDlg, IDC_FOCUSMINIMIZE); break; case IDC_SHOWLEDS: workprefs.leds_on_screen &= ~STATUSLINE_CHIPSET; - if (IsDlgButtonChecked(hDlg, IDC_SHOWLEDS)) + if (ischecked (hDlg, IDC_SHOWLEDS)) workprefs.leds_on_screen |= STATUSLINE_CHIPSET; break; case IDC_SHOWLEDSRTG: workprefs.leds_on_screen &= ~STATUSLINE_RTG; - if (IsDlgButtonChecked(hDlg, IDC_SHOWLEDSRTG)) + if (ischecked (hDlg, IDC_SHOWLEDSRTG)) workprefs.leds_on_screen |= STATUSLINE_RTG; break; case IDC_SHOWGUI: - workprefs.start_gui = IsDlgButtonChecked (hDlg, IDC_SHOWGUI); + workprefs.start_gui = ischecked (hDlg, IDC_SHOWGUI); break; case IDC_CREATELOGFILE: - workprefs.win32_logfile = IsDlgButtonChecked (hDlg, IDC_CREATELOGFILE); + workprefs.win32_logfile = ischecked (hDlg, IDC_CREATELOGFILE); enable_for_miscdlg(hDlg); break; case IDC_POWERSAVE: - workprefs.win32_powersavedisabled = IsDlgButtonChecked (hDlg, IDC_POWERSAVE); + workprefs.win32_powersavedisabled = ischecked (hDlg, IDC_POWERSAVE); break; case IDC_INACTIVE_NOSOUND: - if (!IsDlgButtonChecked (hDlg, IDC_INACTIVE_NOSOUND)) + if (!ischecked (hDlg, IDC_INACTIVE_NOSOUND)) CheckDlgButton (hDlg, IDC_INACTIVE_PAUSE, BST_UNCHECKED); case IDC_INACTIVE_PAUSE: - workprefs.win32_inactive_pause = IsDlgButtonChecked (hDlg, IDC_INACTIVE_PAUSE); + workprefs.win32_inactive_pause = ischecked (hDlg, IDC_INACTIVE_PAUSE); if (workprefs.win32_inactive_pause) CheckDlgButton (hDlg, IDC_INACTIVE_NOSOUND, BST_CHECKED); - workprefs.win32_inactive_nosound = IsDlgButtonChecked (hDlg, IDC_INACTIVE_NOSOUND); + workprefs.win32_inactive_nosound = ischecked (hDlg, IDC_INACTIVE_NOSOUND); break; case IDC_MINIMIZED_NOSOUND: - if (!IsDlgButtonChecked (hDlg, IDC_MINIMIZED_NOSOUND)) + if (!ischecked (hDlg, IDC_MINIMIZED_NOSOUND)) CheckDlgButton (hDlg, IDC_MINIMIZED_PAUSE, BST_UNCHECKED); case IDC_MINIMIZED_PAUSE: - workprefs.win32_iconified_pause = IsDlgButtonChecked (hDlg, IDC_MINIMIZED_PAUSE); + workprefs.win32_iconified_pause = ischecked (hDlg, IDC_MINIMIZED_PAUSE); if (workprefs.win32_iconified_pause) CheckDlgButton (hDlg, IDC_MINIMIZED_NOSOUND, BST_CHECKED); - workprefs.win32_iconified_nosound = IsDlgButtonChecked (hDlg, IDC_MINIMIZED_NOSOUND); + workprefs.win32_iconified_nosound = ischecked (hDlg, IDC_MINIMIZED_NOSOUND); break; case IDC_CTRLF11: - workprefs.win32_ctrl_F11_is_quit = IsDlgButtonChecked (hDlg, IDC_CTRLF11); + workprefs.win32_ctrl_F11_is_quit = ischecked (hDlg, IDC_CTRLF11); break; case IDC_CLOCKSYNC: - workprefs.tod_hack = IsDlgButtonChecked (hDlg, IDC_CLOCKSYNC); + workprefs.tod_hack = ischecked (hDlg, IDC_CLOCKSYNC); break; case IDC_NOTASKBARBUTTON: - workprefs.win32_notaskbarbutton = IsDlgButtonChecked (hDlg, IDC_NOTASKBARBUTTON); + workprefs.win32_notaskbarbutton = ischecked (hDlg, IDC_NOTASKBARBUTTON); break; case IDC_ALWAYSONTOP: - workprefs.win32_alwaysontop = IsDlgButtonChecked (hDlg, IDC_ALWAYSONTOP); + workprefs.win32_alwaysontop = ischecked (hDlg, IDC_ALWAYSONTOP); break; case IDC_KBLED_USB: - workprefs.win32_kbledmode = IsDlgButtonChecked (hDlg, IDC_KBLED_USB) ? 1 : 0; + workprefs.win32_kbledmode = ischecked (hDlg, IDC_KBLED_USB) ? 1 : 0; break; case IDC_FASTERRTG: - workprefs.picasso96_nocustom = IsDlgButtonChecked (hDlg, IDC_FASTERRTG); + workprefs.picasso96_nocustom = ischecked (hDlg, IDC_FASTERRTG); break; } recursive--; @@ -7323,24 +7483,24 @@ static void values_from_cpudlg (HWND hDlg) int newcpu, newfpu, newtrust, oldcache, jitena, idx; static int cachesize_prev, trust_prev; - workprefs.cpu_compatible = workprefs.cpu_cycle_exact | (IsDlgButtonChecked (hDlg, IDC_COMPATIBLE) ? 1 : 0); - workprefs.fpu_strict = IsDlgButtonChecked (hDlg, IDC_COMPATIBLE_FPU) ? 1 : 0; - workprefs.address_space_24 = IsDlgButtonChecked (hDlg, IDC_COMPATIBLE24) ? 1 : 0; - workprefs.m68k_speed = IsDlgButtonChecked (hDlg, IDC_CS_HOST) ? -1 - : IsDlgButtonChecked (hDlg, IDC_CS_68000) ? 0 + workprefs.cpu_compatible = workprefs.cpu_cycle_exact | (ischecked (hDlg, IDC_COMPATIBLE) ? 1 : 0); + workprefs.fpu_strict = ischecked (hDlg, IDC_COMPATIBLE_FPU) ? 1 : 0; + workprefs.address_space_24 = ischecked (hDlg, IDC_COMPATIBLE24) ? 1 : 0; + workprefs.m68k_speed = ischecked (hDlg, IDC_CS_HOST) ? -1 + : ischecked (hDlg, IDC_CS_68000) ? 0 : SendMessage (GetDlgItem (hDlg, IDC_SPEED), TBM_GETPOS, 0, 0) * CYCLE_UNIT; - workprefs.mmu_model = IsDlgButtonChecked (hDlg, IDC_MMUENABLE) ? 68040 : 0; - - newcpu = IsDlgButtonChecked (hDlg, IDC_CPU0) ? 68000 - : IsDlgButtonChecked (hDlg, IDC_CPU1) ? 68010 - : IsDlgButtonChecked (hDlg, IDC_CPU2) ? 68020 - : IsDlgButtonChecked (hDlg, IDC_CPU3) ? 68030 - : IsDlgButtonChecked (hDlg, IDC_CPU4) ? 68040 - : IsDlgButtonChecked (hDlg, IDC_CPU5) ? 68060 : 0; - newfpu = IsDlgButtonChecked (hDlg, IDC_FPU0) ? 0 - : IsDlgButtonChecked (hDlg, IDC_FPU1) ? 1 - : IsDlgButtonChecked (hDlg, IDC_FPU2) ? 2 - : IsDlgButtonChecked (hDlg, IDC_FPU3) ? 3 : 0; + workprefs.mmu_model = ischecked (hDlg, IDC_MMUENABLE) ? 68040 : 0; + + newcpu = ischecked (hDlg, IDC_CPU0) ? 68000 + : ischecked (hDlg, IDC_CPU1) ? 68010 + : ischecked (hDlg, IDC_CPU2) ? 68020 + : ischecked (hDlg, IDC_CPU3) ? 68030 + : ischecked (hDlg, IDC_CPU4) ? 68040 + : ischecked (hDlg, IDC_CPU5) ? 68060 : 0; + newfpu = ischecked (hDlg, IDC_FPU0) ? 0 + : ischecked (hDlg, IDC_FPU1) ? 1 + : ischecked (hDlg, IDC_FPU2) ? 2 + : ischecked (hDlg, IDC_FPU3) ? 3 : 0; /* When switching away from 68000, disable 24 bit addressing. */ workprefs.cpu_model = newcpu; @@ -7374,20 +7534,20 @@ static void values_from_cpudlg (HWND hDlg) break; } - newtrust = IsDlgButtonChecked (hDlg, IDC_TRUST0) ? 0 : 1; + newtrust = ischecked (hDlg, IDC_TRUST0) ? 0 : 1; workprefs.comptrustbyte = newtrust; workprefs.comptrustword = newtrust; workprefs.comptrustlong = newtrust; workprefs.comptrustnaddr= newtrust; - workprefs.compnf = IsDlgButtonChecked (hDlg, IDC_NOFLAGS); - workprefs.compfpu = IsDlgButtonChecked (hDlg, IDC_JITFPU); - workprefs.comp_hardflush = IsDlgButtonChecked (hDlg, IDC_HARDFLUSH); - workprefs.comp_constjump = IsDlgButtonChecked (hDlg, IDC_CONSTJUMP); + workprefs.compnf = ischecked (hDlg, IDC_NOFLAGS); + workprefs.compfpu = ischecked (hDlg, IDC_JITFPU); + workprefs.comp_hardflush = ischecked (hDlg, IDC_HARDFLUSH); + workprefs.comp_constjump = ischecked (hDlg, IDC_CONSTJUMP); #ifdef JIT oldcache = workprefs.cachesize; - jitena = IsDlgButtonChecked (hDlg, IDC_JITENABLE) ? 1 : 0; + jitena = ischecked (hDlg, IDC_JITENABLE) ? 1 : 0; workprefs.cachesize = SendMessage (GetDlgItem (hDlg, IDC_CACHE), TBM_GETPOS, 0, 0) * 1024; if (!jitena) { cachesize_prev = workprefs.cachesize; @@ -7829,11 +7989,11 @@ static void values_from_sounddlg (HWND hDlg) if (workprefs.sound_freq > 96000) workprefs.sound_freq = 96000; - workprefs.produce_sound = (IsDlgButtonChecked (hDlg, IDC_SOUND0) ? 0 - : IsDlgButtonChecked (hDlg, IDC_SOUND1) ? 1 - : IsDlgButtonChecked (hDlg, IDC_SOUND2) ? 2 : 3); + workprefs.produce_sound = (ischecked (hDlg, IDC_SOUND0) ? 0 + : ischecked (hDlg, IDC_SOUND1) ? 1 + : ischecked (hDlg, IDC_SOUND2) ? 2 : 3); - workprefs.sound_auto = IsDlgButtonChecked (hDlg, IDC_SOUND_AUTO) ? 1 : 0; + workprefs.sound_auto = ischecked (hDlg, IDC_SOUND_AUTO); idx = SendDlgItemMessage (hDlg, IDC_SOUNDSTEREO, CB_GETCURSEL, 0, 0); if (idx != CB_ERR) @@ -7853,7 +8013,7 @@ static void values_from_sounddlg (HWND hDlg) } workprefs.sound_interpol = SendDlgItemMessage (hDlg, IDC_SOUNDINTERPOLATION, CB_GETCURSEL, 0, 0); - workprefs.win32_soundexclusive = IsDlgButtonChecked (hDlg, IDC_SOUND_EXCLUSIVE) ? 1 : 0; + workprefs.win32_soundexclusive = ischecked (hDlg, IDC_SOUND_EXCLUSIVE); soundcard = SendDlgItemMessage (hDlg, IDC_SOUNDCARDLIST, CB_GETCURSEL, 0, 0L); if (soundcard != workprefs.win32_soundcard && soundcard != CB_ERR) { workprefs.win32_soundcard = soundcard; @@ -7889,7 +8049,7 @@ static void values_from_sounddlg (HWND hDlg) for (i = 0; sounddrivers[i]; i++) { int old = sounddrivermask; sounddrivermask &= ~(1 << i); - if (IsDlgButtonChecked (hDlg, sounddrivers[i])) + if (ischecked (hDlg, sounddrivers[i])) sounddrivermask |= 1 << i; if (old != sounddrivermask) regsetint (NULL, L"SoundDriverMask", sounddrivermask); @@ -8017,13 +8177,13 @@ struct hfdlg_vals int surfaces; int cylinders; int blocksize; - int rw; - int rdb; + bool rw; + bool rdb; int bootpri; - int donotmount; - int autoboot; + bool donotmount; + bool autoboot; int controller; - int original; + bool original; }; static struct hfdlg_vals empty_hfdlg = { L"", L"", L"", L"", 32, 2, 1, 0, 512, 1, 0, 0, 0, 1, 0, 1 }; @@ -8140,9 +8300,9 @@ static INT_PTR CALLBACK VolumeSettingsProc (HWND hDlg, UINT msg, WPARAM wParam, GetDlgItemText (hDlg, IDC_PATH_NAME, current_fsvdlg.rootdir, sizeof current_fsvdlg.rootdir / sizeof (TCHAR)); GetDlgItemText (hDlg, IDC_VOLUME_NAME, current_fsvdlg.volume, sizeof current_fsvdlg.volume / sizeof (TCHAR)); GetDlgItemText (hDlg, IDC_VOLUME_DEVICE, current_fsvdlg.device, sizeof current_fsvdlg.device / sizeof (TCHAR)); - current_fsvdlg.rw = IsDlgButtonChecked (hDlg, IDC_FS_RW); + current_fsvdlg.rw = ischecked (hDlg, IDC_FS_RW); current_fsvdlg.bootpri = GetDlgItemInt (hDlg, IDC_VOLUME_BOOTPRI, NULL, TRUE); - current_fsvdlg.autoboot = IsDlgButtonChecked (hDlg, IDC_FS_AUTOBOOT); + current_fsvdlg.autoboot = ischecked (hDlg, IDC_FS_AUTOBOOT); recursive--; break; } @@ -8426,13 +8586,13 @@ static INT_PTR CALLBACK HardfileSettingsProc (HWND hDlg, UINT msg, WPARAM wParam EndDialog (hDlg, 0); break; case IDC_HDF_RW: - current_hfdlg.rw = IsDlgButtonChecked (hDlg, IDC_HDF_RW); + current_hfdlg.rw = ischecked (hDlg, IDC_HDF_RW); break; case IDC_HDF_AUTOBOOT: - current_hfdlg.autoboot = IsDlgButtonChecked (hDlg, IDC_HDF_AUTOBOOT); + current_hfdlg.autoboot = ischecked (hDlg, IDC_HDF_AUTOBOOT); break; case IDC_HDF_DONOTMOUNT: - current_hfdlg.donotmount = IsDlgButtonChecked (hDlg, IDC_HDF_DONOTMOUNT); + current_hfdlg.donotmount = ischecked (hDlg, IDC_HDF_DONOTMOUNT); break; case IDC_HDF_RDB: SetDlgItemInt (hDlg, IDC_SECTORS, 0, FALSE); @@ -8543,7 +8703,7 @@ static INT_PTR CALLBACK HarddriveSettingsProc (HWND hDlg, UINT msg, WPARAM wPara } if (posn != CB_ERR) _tcscpy (current_hfdlg.filename, hdf_getnameharddrive ((int)posn, 0, ¤t_hfdlg.blocksize, NULL)); - current_hfdlg.rw = IsDlgButtonChecked (hDlg, IDC_HDF_RW); + current_hfdlg.rw = ischecked (hDlg, IDC_HDF_RW); posn = SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_GETCURSEL, 0, 0); if (posn != CB_ERR) current_hfdlg.controller = posn; @@ -8757,31 +8917,31 @@ static void harddiskdlg_button (HWND hDlg, int button) break; case IDC_MAPDRIVES_AUTO: - workprefs.win32_automount_removable = IsDlgButtonChecked (hDlg, IDC_MAPDRIVES_AUTO); + workprefs.win32_automount_removable = ischecked (hDlg, IDC_MAPDRIVES_AUTO); break; case IDC_MAPDRIVES: - workprefs.win32_automount_drives = IsDlgButtonChecked (hDlg, IDC_MAPDRIVES); + workprefs.win32_automount_drives = ischecked (hDlg, IDC_MAPDRIVES); break; case IDC_MAPDRIVES_REMOVABLE: - workprefs.win32_automount_removabledrives = IsDlgButtonChecked (hDlg, IDC_MAPDRIVES_REMOVABLE); + workprefs.win32_automount_removabledrives = ischecked (hDlg, IDC_MAPDRIVES_REMOVABLE); break; case IDC_MAPDRIVES_CD: - workprefs.win32_automount_cddrives = IsDlgButtonChecked (hDlg, IDC_MAPDRIVES_CD); + workprefs.win32_automount_cddrives = ischecked (hDlg, IDC_MAPDRIVES_CD); break; case IDC_MAPDRIVES_NET: - workprefs.win32_automount_netdrives = IsDlgButtonChecked (hDlg, IDC_MAPDRIVES_NET); + workprefs.win32_automount_netdrives = ischecked (hDlg, IDC_MAPDRIVES_NET); break; case IDC_NOUAEFSDB: - workprefs.filesys_no_uaefsdb = IsDlgButtonChecked (hDlg, IDC_NOUAEFSDB); + workprefs.filesys_no_uaefsdb = ischecked (hDlg, IDC_NOUAEFSDB); break; case IDC_NORECYCLEBIN: - workprefs.win32_norecyclebin = IsDlgButtonChecked (hDlg, IDC_NORECYCLEBIN); + workprefs.win32_norecyclebin = ischecked (hDlg, IDC_NORECYCLEBIN); break; } @@ -9127,7 +9287,7 @@ static void addfloppytype (HWND hDlg, int n) } else { ew (hDlg, f_enable, TRUE); } - CheckDlgButton(hDlg, f_enable, state ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton (hDlg, f_enable, state ? BST_CHECKED : BST_UNCHECKED); } chk = !showcd && disk_getwriteprotect (text) && state == TRUE ? BST_CHECKED : 0; if (f_wp >= 0) @@ -9158,7 +9318,7 @@ static void getfloppytypeq (HWND hDlg, int n) return; if (iscd (n)) return; - chk = IsDlgButtonChecked (hDlg, f_enable) ? 0 : -1; + chk = ischecked (hDlg, f_enable) ? 0 : -1; if (chk != workprefs.dfxtype[n]) { workprefs.dfxtype[n] = chk; addfloppytype (hDlg, n); @@ -9425,17 +9585,17 @@ static INT_PTR CALLBACK FloppyDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA break; case IDC_DF0WP: case IDC_DF0WPQ: - floppysetwriteprotect (hDlg, 0, currentpage == QUICKSTART_ID ? IsDlgButtonChecked (hDlg, IDC_DF0WPQ) : IsDlgButtonChecked (hDlg, IDC_DF0WP)); + floppysetwriteprotect (hDlg, 0, currentpage == QUICKSTART_ID ? ischecked (hDlg, IDC_DF0WPQ) : ischecked (hDlg, IDC_DF0WP)); break; case IDC_DF1WP: case IDC_DF1WPQ: - floppysetwriteprotect (hDlg, 1, currentpage == QUICKSTART_ID ? IsDlgButtonChecked (hDlg, IDC_DF1WPQ) : IsDlgButtonChecked (hDlg, IDC_DF1WP)); + floppysetwriteprotect (hDlg, 1, currentpage == QUICKSTART_ID ? ischecked (hDlg, IDC_DF1WPQ) : ischecked (hDlg, IDC_DF1WP)); break; case IDC_DF2WP: - floppysetwriteprotect (hDlg, 2, IsDlgButtonChecked (hDlg, IDC_DF2WP)); + floppysetwriteprotect (hDlg, 2, ischecked (hDlg, IDC_DF2WP)); break; case IDC_DF3WP: - floppysetwriteprotect (hDlg, 3, IsDlgButtonChecked (hDlg, IDC_DF3WP)); + floppysetwriteprotect (hDlg, 3, ischecked (hDlg, IDC_DF3WP)); break; case IDC_DF0: case IDC_DF0QQ: @@ -9808,8 +9968,7 @@ static void enable_for_portsdlg (HWND hDlg) int v; int isprinter, issampler; - v = workprefs.input_selected_setting > 0 ? FALSE : TRUE; - ew (hDlg, IDC_SWAP, v); + ew (hDlg, IDC_SWAP, TRUE); #if !defined (SERIAL_PORT) ew (hDlg, IDC_MIDIOUTLIST, FALSE); ew (hDlg, IDC_MIDIINLIST, FALSE); @@ -9849,6 +10008,7 @@ static void enable_for_portsdlg (HWND hDlg) static int joys[] = { IDC_PORT0_JOYS, IDC_PORT1_JOYS, IDC_PORT2_JOYS, IDC_PORT3_JOYS }; static int joysm[] = { IDC_PORT0_JOYSMODE, IDC_PORT1_JOYSMODE, -1, -1 }; +static int joysaf[] = { IDC_PORT0_AUTOFIRE, IDC_PORT1_AUTOFIRE, -1, -1 }; static void updatejoyport (HWND hDlg) { @@ -9902,7 +10062,12 @@ static void updatejoyport (HWND hDlg) for (j = 0; j < inputdevice_get_device_total (IDTYPE_MOUSE); j++, total++) SendDlgItemMessage (hDlg, id, CB_ADDSTRING, 0, (LPARAM)inputdevice_get_device_name(IDTYPE_MOUSE, j)); } - idx = inputdevice_getjoyportdevice (v); + if (v == JPORT_CUSTOM) { + SendDlgItemMessage (hDlg, id, CB_ADDSTRING, 0, (LPARAM)L""); + total++; + } + + idx = inputdevice_getjoyportdevice (i, v); if (idx >= 0) idx += 2; else @@ -9910,12 +10075,16 @@ static void updatejoyport (HWND hDlg) if (idx >= total) idx = 0; SendDlgItemMessage (hDlg, id, CB_SETCURSEL, idx, 0); + if (joysaf[i] >= 0) + CheckDlgButton (hDlg, joysaf[i], workprefs.jports[i].autofire); } } static void fixjport (struct jport *port, int v) { int vv = port->id; + if (vv == JPORT_CUSTOM || vv == JPORT_NONE) + return; if (vv != v) return; if (vv >= JSEM_JOYS && vv < JSEM_MICE) { @@ -9952,12 +10121,12 @@ static void values_from_gameportsdlg (HWND hDlg, int d) if (success) currprefs.input_mouse_speed = workprefs.input_mouse_speed = i; - currprefs.input_magic_mouse = workprefs.input_magic_mouse = IsDlgButtonChecked (hDlg, IDC_PORT_MOUSETRICK) ? -1 : 0; + currprefs.input_magic_mouse = workprefs.input_magic_mouse = ischecked (hDlg, IDC_PORT_MOUSETRICK); workprefs.input_magic_mouse_cursor = SendDlgItemMessage (hDlg, IDC_PORT_TABLET_CURSOR, CB_GETCURSEL, 0, 0L); workprefs.input_tablet = 0; - if (IsDlgButtonChecked (hDlg, IDC_PORT_TABLET)) { + if (ischecked (hDlg, IDC_PORT_TABLET)) { workprefs.input_tablet = TABLET_MOUSEHACK; - if (IsDlgButtonChecked (hDlg, IDC_PORT_TABLET_FULL)) + if (ischecked (hDlg, IDC_PORT_TABLET_FULL)) workprefs.input_tablet = TABLET_REAL; } return; @@ -9972,9 +10141,16 @@ static void values_from_gameportsdlg (HWND hDlg, int d) int idm = joysm[i]; LRESULT v = SendDlgItemMessage (hDlg, id, CB_GETCURSEL, 0, 0L); if (v != CB_ERR && v > 0) { + int max = JSEM_LASTKBD + inputdevice_get_device_total (IDTYPE_JOYSTICK); + if (i < 2) + max += inputdevice_get_device_total (IDTYPE_MOUSE); v -= 2; if (v < 0) - *port = -1; + *port = JPORT_NONE; + else if (v >= max && prevport == JPORT_CUSTOM) + *port = JPORT_CUSTOM; + else if (v >= max) + *port = JPORT_NONE; else if (v < JSEM_LASTKBD) *port = JSEM_KBDLAYOUT + (int)v; else if (v >= JSEM_LASTKBD + inputdevice_get_device_total (IDTYPE_JOYSTICK)) @@ -9982,13 +10158,26 @@ static void values_from_gameportsdlg (HWND hDlg, int d) else *port = JSEM_JOYS + (int)v - JSEM_LASTKBD; } - v = SendDlgItemMessage (hDlg, idm, CB_GETCURSEL, 0, 0L); - if (v != CB_ERR && v > 0) - *portm = v; + if (idm >= 0) { + v = SendDlgItemMessage (hDlg, idm, CB_GETCURSEL, 0, 0L); + if (v != CB_ERR) { + if (*portm != v) + workprefs.input_selected_setting = GAMEPORT_INPUT_SETTINGS; + *portm = v; + } + + } + if (joysaf[i] >= 0) { + int is = ischecked (hDlg, joysaf[i]) ? 1 : 0; + if (is != workprefs.jports[i].autofire) + workprefs.input_selected_setting = GAMEPORT_INPUT_SETTINGS; + workprefs.jports[i].autofire = is; + } if (*port != prevport) changed = 1; } if (changed) { + workprefs.input_selected_setting = GAMEPORT_INPUT_SETTINGS; for (i = 0; i < MAX_JPORTS; i++) { for (j = 0; j < MAX_JPORTS; j++) { if (j != i) @@ -10063,17 +10252,17 @@ static void values_from_portsdlg (HWND hDlg) workprefs.sername[0] = 0; } workprefs.serial_demand = 0; - if (IsDlgButtonChecked (hDlg, IDC_SER_SHARED)) + if (ischecked (hDlg, IDC_SER_SHARED)) workprefs.serial_demand = 1; workprefs.serial_hwctsrts = 0; - if (IsDlgButtonChecked (hDlg, IDC_SER_CTSRTS)) + if (ischecked (hDlg, IDC_SER_CTSRTS)) workprefs.serial_hwctsrts = 1; workprefs.serial_direct = 0; - if (IsDlgButtonChecked (hDlg, IDC_SER_DIRECT)) + if (ischecked (hDlg, IDC_SER_DIRECT)) workprefs.serial_direct = 1; workprefs.uaeserial = 0; - if (IsDlgButtonChecked (hDlg, IDC_UAESERIAL)) + if (ischecked (hDlg, IDC_UAESERIAL)) workprefs.uaeserial = 1; GetDlgItemText (hDlg, IDC_PS_PARAMS, workprefs.ghostscript_parameters, sizeof workprefs.ghostscript_parameters / sizeof (TCHAR)); @@ -10301,6 +10490,20 @@ static void init_portsdlg (HWND hDlg) } } +static void input_test (HWND hDlg, int); +static void ports_remap (HWND, int); + +static void processport (HWND hDlg, bool reset, int port) +{ + if (reset) + inputdevice_compa_prepare_custom (&workprefs, port); + values_from_gameportsdlg (hDlg, 0); + enable_for_gameportsdlg (hDlg); + updatejoyport (hDlg); + inputdevice_updateconfig (&workprefs); + inputdevice_config_change (); +} + /* Handle messages for the Joystick Settings page of our property-sheet */ static INT_PTR CALLBACK GamePortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -10368,32 +10571,55 @@ static INT_PTR CALLBACK GamePortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP break; recursive++; if (LOWORD (wParam) == IDC_SWAP) { - struct jport tmp; - memcpy (&tmp, &workprefs.jports[0], sizeof (struct jport)); - memcpy (&workprefs.jports[0], &workprefs.jports[1], sizeof (struct jport)); - memcpy (&workprefs.jports[1], &tmp, sizeof (struct jport)); + inputdevice_swap_compa_ports (&workprefs, 0); temp = joyxprevious[0]; joyxprevious[0] = joyxprevious[1]; joyxprevious[1] = temp; enable_for_gameportsdlg (hDlg); updatejoyport (hDlg); - inputdevice_updateconfig (&workprefs); - inputdevice_config_change (); + } else if (LOWORD (wParam) == IDC_PORT0_AUTOFIRE) { + processport (hDlg, false, 0); + } else if (LOWORD (wParam) == IDC_PORT1_AUTOFIRE) { + processport (hDlg, false, 1); + } else if (LOWORD (wParam) == IDC_PORT0_REMAP) { + ports_remap (hDlg, 0); + } else if (LOWORD (wParam) == IDC_PORT1_REMAP) { + ports_remap (hDlg, 1); + } else if (LOWORD (wParam) == IDC_PORT2_REMAP) { + ports_remap (hDlg, 2); + } else if (LOWORD (wParam) == IDC_PORT3_REMAP) { + ports_remap (hDlg, 3); + } else if (LOWORD (wParam) == IDC_PORT0_TEST) { + input_test (hDlg, 0); + } else if (LOWORD (wParam) == IDC_PORT1_TEST) { + input_test (hDlg, 1); + } else if (LOWORD (wParam) == IDC_PORT2_TEST) { + input_test (hDlg, 2); + } else if (LOWORD (wParam) == IDC_PORT3_TEST) { + input_test (hDlg, 3); } else if (HIWORD (wParam) == CBN_SELCHANGE) { switch (LOWORD (wParam)) { - case IDC_PORT0_JOYS: - case IDC_PORT1_JOYS: - case IDC_PORT2_JOYS: - case IDC_PORT3_JOYS: - case IDC_PORT0_JOYSMODE: - case IDC_PORT1_JOYSMODE: - values_from_gameportsdlg (hDlg, 0); - enable_for_gameportsdlg (hDlg); - updatejoyport (hDlg); - inputdevice_updateconfig (&workprefs); - inputdevice_config_change (); - break; + case IDC_PORT0_JOYS: + case IDC_PORT1_JOYS: + case IDC_PORT2_JOYS: + case IDC_PORT3_JOYS: + case IDC_PORT0_JOYSMODE: + case IDC_PORT1_JOYSMODE: + { + int port = -1; + if (LOWORD (wParam) == IDC_PORT0_JOYS || LOWORD (wParam) == IDC_PORT0_JOYSMODE) + port = 0; + if (LOWORD (wParam) == IDC_PORT1_JOYS || LOWORD (wParam) == IDC_PORT1_JOYSMODE) + port = 1; + if (LOWORD (wParam) == IDC_PORT2_JOYS) + port = 2; + if (LOWORD (wParam) == IDC_PORT3_JOYS) + port = 3; + if (port >= 0) + processport (hDlg, true, port); + break; + } } } else { values_from_gameportsdlg (hDlg, 1); @@ -10456,7 +10682,8 @@ static INT_PTR CALLBACK IOPortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR case IDC_PRINTERTYPELIST: { int item = SendDlgItemMessage (hDlg, IDC_PRINTERTYPELIST, CB_GETCURSEL, 0, 0L); - workprefs.parallel_postscript_detection = workprefs.parallel_postscript_emulation = workprefs.parallel_matrix_emulation = 0; + workprefs.parallel_postscript_detection = workprefs.parallel_postscript_emulation = false; + workprefs.parallel_matrix_emulation = 0; switch (item) { case 1: @@ -10469,11 +10696,11 @@ static INT_PTR CALLBACK IOPortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR workprefs.parallel_matrix_emulation = PARALLEL_MATRIX_EPSON48; break; case 4: - workprefs.parallel_postscript_detection = 1; + workprefs.parallel_postscript_detection = true; break; case 5: - workprefs.parallel_postscript_detection = 1; - workprefs.parallel_postscript_emulation = 1; + workprefs.parallel_postscript_detection = true; + workprefs.parallel_postscript_emulation = true; break; } } @@ -10493,7 +10720,7 @@ static void values_to_inputdlg (HWND hDlg) SendDlgItemMessage (hDlg, IDC_INPUTTYPE, CB_SETCURSEL, workprefs.input_selected_setting, 0); SendDlgItemMessage (hDlg, IDC_INPUTDEVICE, CB_SETCURSEL, input_selected_device, 0); SetDlgItemInt (hDlg, IDC_INPUTDEADZONE, workprefs.input_joystick_deadzone, FALSE); - SetDlgItemInt (hDlg, IDC_INPUTAUTOFIRERATE, workprefs.input_autofire_framecnt, FALSE); + SetDlgItemInt (hDlg, IDC_INPUTAUTOFIRERATE, workprefs.input_autofire_linecnt, FALSE); SetDlgItemInt (hDlg, IDC_INPUTSPEEDD, workprefs.input_joymouse_speed, FALSE); SetDlgItemInt (hDlg, IDC_INPUTSPEEDA, workprefs.input_joymouse_multiplier, FALSE); CheckDlgButton (hDlg, IDC_INPUTDEVICEDISABLE, (!input_total_devices || inputdevice_get_device_status (input_selected_device)) ? BST_CHECKED : BST_UNCHECKED); @@ -10545,7 +10772,6 @@ static int askinputcustom (HWND hDlg, TCHAR *custom, int maxlen, DWORD titleid) } txt[0] = 0; SendMessage (GetDlgItem (hwnd, IDC_STRINGBOXEDIT), WM_SETTEXT, 0, (LPARAM)custom); - SetFocus (GetDlgItem (hwnd, IDC_STRINGBOXEDIT)); while (stringboxdialogactive == 1) { MSG msg; int ret; @@ -10567,13 +10793,13 @@ static int askinputcustom (HWND hDlg, TCHAR *custom, int maxlen, DWORD titleid) return 0; } -static void init_inputdlg_2(HWND hDlg) +static void init_inputdlg_2 (HWND hDlg) { TCHAR name1[256], name2[256]; TCHAR custom1[MAX_DPATH], tmp1[MAX_DPATH]; int cnt, index, af, aftmp; - if (input_selected_widget < 0 || workprefs.input_selected_setting == 0) { + if (input_selected_widget < 0 || workprefs.input_selected_setting == GAMEPORT_INPUT_SETTINGS) { EnableWindow (GetDlgItem (hDlg, IDC_INPUTAMIGA), FALSE); } else { EnableWindow (GetDlgItem (hDlg, IDC_INPUTAMIGA), TRUE); @@ -10611,23 +10837,22 @@ static void init_inputdlg (HWND hDlg) TCHAR buf[100], txt[100]; SendDlgItemMessage (hDlg, IDC_INPUTTYPE, CB_RESETCONTENT, 0, 0L); - WIN32GUI_LoadUIString (IDS_INPUT_COMPATIBILITY, buf, sizeof (buf) / sizeof (TCHAR)); - SendDlgItemMessage (hDlg, IDC_INPUTTYPE, CB_ADDSTRING, 0, (LPARAM)buf); WIN32GUI_LoadUIString (IDS_INPUT_CUSTOM, buf, sizeof (buf) / sizeof (TCHAR)); - for (i = 0; i < 4; i++) { + for (i = 0; i < GAMEPORT_INPUT_SETTINGS; i++) { _stprintf (txt, buf, i + 1); SendDlgItemMessage (hDlg, IDC_INPUTTYPE, CB_ADDSTRING, 0, (LPARAM)txt); } + WIN32GUI_LoadUIString (IDS_INPUT_GAMEPORTS, buf, sizeof (buf) / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_INPUTTYPE, CB_ADDSTRING, 0, (LPARAM)buf); SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_RESETCONTENT, 0, 0L); - WIN32GUI_LoadUIString (IDS_INPUT_COPY_DEFAULT, buf, sizeof (buf) / sizeof (TCHAR)); - SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_ADDSTRING, 0, (LPARAM)L"GamePorts"); - SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_ADDSTRING, 0, (LPARAM)buf); WIN32GUI_LoadUIString (IDS_INPUT_COPY_CUSTOM, buf, sizeof (buf) / sizeof (TCHAR)); - for (i = 0; i < 4; i++) { + for (i = 0; i < MAX_INPUT_SETTINGS - 1; i++) { _stprintf (txt, buf, i + 1); SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_ADDSTRING, 0, (LPARAM)txt); } + WIN32GUI_LoadUIString (IDS_INPUT_COPY_DEFAULT, buf, sizeof (buf) / sizeof (TCHAR)); + SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_ADDSTRING, 0, (LPARAM)buf); SendDlgItemMessage (hDlg, IDC_INPUTCOPYFROM, CB_SETCURSEL, 0, 0); @@ -10660,18 +10885,19 @@ static void init_inputdlg (HWND hDlg) static void enable_for_inputdlg (HWND hDlg) { - int v = workprefs.input_selected_setting == 0 ? FALSE : TRUE; + bool v = workprefs.input_selected_setting != GAMEPORT_INPUT_SETTINGS; ew (hDlg, IDC_INPUTLIST, TRUE); ew (hDlg, IDC_INPUTAMIGA, v); ew (hDlg, IDC_INPUTAMIGACNT, TRUE); ew (hDlg, IDC_INPUTDEADZONE, TRUE); - ew (hDlg, IDC_INPUTAUTOFIRERATE, v); - ew (hDlg, IDC_INPUTSPEEDA, v); - ew (hDlg, IDC_INPUTSPEEDD, v); + ew (hDlg, IDC_INPUTAUTOFIRERATE, TRUE); + ew (hDlg, IDC_INPUTSPEEDA, TRUE); + ew (hDlg, IDC_INPUTSPEEDD, TRUE); ew (hDlg, IDC_INPUTCOPY, v); ew (hDlg, IDC_INPUTCOPYFROM, v); ew (hDlg, IDC_INPUTSWAP, v); ew (hDlg, IDC_INPUTDEVICEDISABLE, v); + ew (hDlg, IDC_INPUTREMAP, v); } static void clearinputlistview (HWND hDlg) @@ -10706,7 +10932,7 @@ static void values_from_inputdlgbottom (HWND hDlg) } v = GetDlgItemInt (hDlg, IDC_INPUTAUTOFIRERATE, &success, FALSE); if (success) - currprefs.input_autofire_framecnt = workprefs.input_autofire_framecnt = v; + currprefs.input_autofire_linecnt = workprefs.input_autofire_linecnt = v; v = GetDlgItemInt (hDlg, IDC_INPUTSPEEDD, &success, FALSE); if (success) currprefs.input_joymouse_speed = workprefs.input_joymouse_speed = v; @@ -10784,20 +11010,376 @@ static void input_swap (HWND hDlg) init_inputdlg (hDlg); } +static void input_find (HWND hDlg, int mode, int set); +static int rawmode; +static int inputmap_remap_counter; + +static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + if (idEvent != 1) + return; + int inputmap; + WINDOWINFO pwi; + pwi.cbSize = sizeof pwi; + if (GetWindowInfo (guiDlg, &pwi)) { + // GUI inactive = disable capturing + if (pwi.dwWindowStatus != WS_ACTIVECAPTION) { + input_find (hDlg, 0, false); + return; + } + } + if (currentpage == INPUTMAP_ID) { + inputmap = inputmap_remap_counter >= 0 ? 1 : 2; + setfocus (hDlg, IDC_INPUTMAPLIST); + } else { + inputmap = 0; + setfocus (hDlg, IDC_INPUTLIST); + } + int inputmap_index; + int devnum, wtype, state; + int cnt = inputdevice_testread_count (); + if (cnt < 0) { + input_find (hDlg, 0, FALSE); + return; + } + if (!cnt) + return; + int ret = inputdevice_testread (&devnum, &wtype, &state); + if (ret > 0) { + if (wtype < 0) { + if (!state) + return; + if (inputmap == 1) { + int mode, *events, *axistable; + HWND h = GetDlgItem (hDlg, IDC_INPUTMAPLIST); + inputmap_remap_counter++; + ListView_EnsureVisible (h, inputmap_remap_counter, FALSE); + ListView_SetItemState (h, -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + ListView_SetItemState (h, inputmap_remap_counter, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); + int max = inputdevice_get_compatibility_input (&workprefs, inputmap_port, &mode, &events, &axistable); + if (inputmap_remap_counter >= max) + inputmap_remap_counter = -1; + } + return; + } + if (input_selected_widget != devnum || input_selected_widget != wtype) { + int od = input_selected_device; + input_selected_device = devnum; + input_selected_widget = wtype; + int type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL); + + if (inputmap == 1) { // ports panel / remap + static int skipbuttonaxis; + + HWND h = GetDlgItem (hDlg, IDC_INPUTMAPLIST); + int mode, *events, *axistable, *axistable2; + int cntadd = 1; + + int max = inputdevice_get_compatibility_input (&workprefs, inputmap_port, &mode, &events, &axistable); + int evtnum = events[inputmap_remap_counter]; + int type2 = intputdevice_compa_get_eventtype (evtnum, &axistable2); + + if (type == IDEV_WIDGET_BUTTONAXIS) { + if (skipbuttonaxis) { + skipbuttonaxis = false; + return; + } + if (type2 != IDEV_WIDGET_BUTTON && type2 != IDEV_WIDGET_KEY) + return; + } + if (type == IDEV_WIDGET_AXIS) { + skipbuttonaxis = false; + if (type2 == IDEV_WIDGET_BUTTON || type2 == IDEV_WIDGET_KEY) + return; + if (type2 == IDEV_WIDGET_BUTTONAXIS) { + if (inputmap_remap_counter & 1) + return; + // use VERT or HORIZ events, not UP/DOWN/LEFT/RIGHT + evtnum = axistable2[0]; + cntadd = 2; + skipbuttonaxis = true; + } + } + + struct inputevent *ie = inputdevice_get_eventinfo (evtnum); + TCHAR name[256]; + inputdevice_get_eventname (ie, name); + //write_log (L"%d %d %d %s\n", input_selected_device, input_selected_widget, evtnum, name); + int sub = 0; + if (inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL) != IDEV_WIDGET_KEY) { + for (sub = 0; sub < MAX_INPUT_SUB_EVENT; sub++) { + if (!inputdevice_get_mapped_name (input_selected_device, input_selected_widget, NULL, NULL, NULL, sub)) + break; + } + } + if (sub >= MAX_INPUT_SUB_EVENT) + sub = MAX_INPUT_SUB_EVENT - 1; + inputdevice_set_mapping (input_selected_device, input_selected_widget, name, NULL, 0, sub); + InitializeListView (hDlg); + inputmap_remap_counter += cntadd; + ListView_EnsureVisible (h, inputmap_remap_counter, FALSE); + ListView_SetItemState (h, -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + ListView_SetItemState (h, inputmap_remap_counter, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); + if (inputmap_remap_counter >= max) + inputmap_remap_counter = -1; + TCHAR tmp[256]; + tmp[0] = 0; + inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp); + _tcscat (tmp, L", "); + _tcscat (tmp, inputdevice_get_device_name2 (input_selected_device)); + SetWindowText (GetDlgItem (hDlg, IDC_INPUTMAPOUT), tmp); + + } else if (inputmap == 2) { // ports panel / test + + static int toggle, skipactive; + if (cnt == 2 && !skipactive) { + toggle ^= 1; + skipactive = 2; + } + if (skipactive) { + skipactive--; + if (cnt == 2 && toggle) + return; + if (cnt == 1 && !toggle) + return; + } + + bool found = false; + HWND h = GetDlgItem (hDlg, IDC_INPUTMAPLIST); + int op = inputmap_port; + if (inputmap_handle (NULL, input_selected_device, input_selected_widget, &op, &inputmap_index, state)) { + if (op == inputmap_port) { + ListView_EnsureVisible (h, inputmap_index, FALSE); + ListView_SetItemState (h, -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + ListView_SetItemState (h, inputmap_index, LVIS_SELECTED , LVIS_SELECTED); + ListView_SetItemState (h, inputmap_index, LVIS_FOCUSED, LVIS_FOCUSED); + found = true; + } + } + if (!found) { + ListView_SetItemState (h, -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + } + TCHAR tmp[256]; + tmp[0] = 0; + inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp); + _tcscat (tmp, L", "); + _tcscat (tmp, inputdevice_get_device_name2 (input_selected_device)); + SetWindowText (GetDlgItem (hDlg, IDC_INPUTMAPOUT), tmp); + + } else { + // input panel + + static int toggle, skipactive; + if (cnt == 2 && !skipactive) { + toggle ^= 1; + skipactive = 2; + } + if (skipactive) { + skipactive--; + if (cnt == 2 && toggle) + return; + if (cnt == 1 && !toggle) + return; + } + + if (rawmode == 1) { + inputdevice_set_device_status (devnum, TRUE); + values_to_inputdlg (hDlg); + } + if (od != devnum) + init_inputdlg (hDlg); + else + init_inputdlg_2 (hDlg); + ListView_EnsureVisible (GetDlgItem (hDlg, IDC_INPUTLIST), input_selected_widget, FALSE); + ListView_SetItemState (GetDlgItem (hDlg, IDC_INPUTLIST), -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + ListView_SetItemState (GetDlgItem (hDlg, IDC_INPUTLIST), input_selected_widget, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); + if (rawmode == 1) { + input_find (hDlg, 0, FALSE); + setfocus (hDlg, IDC_INPUTAMIGA); + SendDlgItemMessage (hDlg, IDC_INPUTAMIGA, CB_SHOWDROPDOWN , TRUE, 0L); + } + } + } + } +} + +static HWND updatePanel (int id); + +static int rawdisable[] = { IDC_PANELTREE, 0, IDC_RESETAMIGA, 0, IDC_QUITEMU, 0, IDC_RESTARTEMU, 0, IDOK, 0, IDCANCEL, 0, IDHELP, 0, -1 }; + +static void input_find (HWND hDlg, int mode, int set) +{ + static TCHAR tmp[200]; + if (set && !rawmode) { + rawmode = mode ? 2 : 1; + inputdevice_acquire (-1); + inputdevice_settest (TRUE); + if (rawmode == 2) { + TCHAR tmp2[MAX_DPATH]; + GetWindowText (guiDlg, tmp, sizeof tmp / sizeof (TCHAR)); + WIN32GUI_LoadUIString (IDS_REMAPTITLE, tmp2, sizeof tmp2 / sizeof (TCHAR)); + SetWindowText (guiDlg, tmp2); + } + SetTimer (hDlg, 1, 30, timerfunc); + ew (hDlg, IDC_INPUTREMAP, FALSE); + ew (hDlg, IDC_INPUTTEST, FALSE); + for (int i = 0; rawdisable[i] >= 0; i += 2) { + rawdisable[i + 1] = IsWindowEnabled (GetDlgItem (guiDlg, rawdisable[i])); + EnableWindow (GetDlgItem (guiDlg, rawdisable[i]), FALSE); + } + ShowCursor (FALSE); + SetCapture (guiDlg); + RECT r; + GetWindowRect (guiDlg, &r); + ClipCursor (&r); + } else if (rawmode) { + KillTimer (hDlg, 1); + ClipCursor (NULL); + ReleaseCapture (); + ShowCursor (TRUE); + inputdevice_unacquire (); + for (int i = 0; rawdisable[i] >= 0; i += 2) + EnableWindow (GetDlgItem (guiDlg, rawdisable[i]), rawdisable[i + 1]); + ew (hDlg, IDC_INPUTREMAP, TRUE); + ew (hDlg, IDC_INPUTTEST, TRUE); + inputdevice_settest (FALSE); + if (rawmode == 2) { + SetWindowText (guiDlg, tmp); + SetFocus (hDlg); + } + rawmode = FALSE; + if (currentpage == INPUTMAP_ID) + updatePanel (GAMEPORTS_ID); + } +} + +static void ports_remap (HWND hDlg, int port) +{ + workprefs.input_selected_setting = GAMEPORT_INPUT_SETTINGS; + inputmap_port_remap = port; + inputmap_port = port; + inputmap_remap_counter = 0; + updatePanel (INPUTMAP_ID); +} +static void input_test (HWND hDlg, int port) +{ + workprefs.input_selected_setting = GAMEPORT_INPUT_SETTINGS; + inputmap_port_remap = -1; + inputmap_port = port; + inputmap_remap_counter = -1; + updatePanel (INPUTMAP_ID); +} + #if 0 -static void input_copy (HWND hDlg) +static void input_test (HWND hDlg, int port) +{ + inputmap_port_remap = -1; + inputmap_port =-1; + updatePanel (INPUTMAP_ID); + for (int idx = 0; idx < MAX_JPORTS; idx++) { + int mode, **events, *axistable; + write_log (L"Port: %d\n", idx); + if (inputdevice_get_compatibility_input (&workprefs, idx, &mode, &events, &axistable)) { + for (int k = 0; k < 2 && events[k]; k++) { + int *p = events[k]; + int evtnum; + for (int i = 0; (evtnum = p[i]) >= 0; i++) { + int devnum; + struct inputevent *evt = inputdevice_get_eventinfo (evtnum); + int flags, status; + TCHAR name[256]; + bool found = false; + int *atp = axistable; + int atpidx; + + write_log (L"- %d: %s = ", i, evt->name); + atpidx = 0; + while (*atp >= 0) { + if (*atp == evtnum) { + atp++; + atpidx = 2; + break; + } + if (atp[1] == evtnum || atp[2] == evtnum) { + atpidx = 1; + break; + } + atp += 3; + } + while (atpidx >= 0) { + devnum = 0; + while ((status = inputdevice_get_device_status (devnum)) >= 0) { + if (status) { + for (int j = 0; j < inputdevice_get_widget_num (devnum); j++) { + if (inputdevice_get_mapped_name (devnum, j, &flags, NULL, NULL, 0) == evtnum) { + inputdevice_get_widget_type (devnum, j, name); + write_log (L"[%s, %s]", inputdevice_get_device_name2 (devnum), name); + found = true; + } + } + } + devnum++; + } + evtnum = *atp++; + atpidx--; + } + if (!found) + write_log (L""); + write_log (L"\n"); + } + } + } else { + write_log (L""); + } + write_log (L"\n"); + } + +} +#endif + +static INT_PTR CALLBACK InputMapDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - TCHAR buf[2000]; - inputdevice_acquire (1); - for (;;) { - if (inputdevice_testread (buf)) - break; - Sleep (100); + static int recursive; + + switch (msg) + { + case WM_INITDIALOG: + { + pages[INPUTMAP_ID] = hDlg; + currentpage = INPUTMAP_ID; + inputdevice_updateconfig (&workprefs); + if (inputmap_remap_counter == 0) { + inputdevice_compa_prepare_custom (&workprefs, inputmap_port); + inputdevice_updateconfig (&workprefs); + } + InitializeListView (hDlg); + HWND h = GetDlgItem (hDlg, IDC_INPUTMAPLIST); + if (inputmap_remap_counter == 0) { + ListView_EnsureVisible (h, inputmap_remap_counter, FALSE); + ListView_SetItemState (h, -1, 0, LVIS_SELECTED | LVIS_FOCUSED); + ListView_SetItemState (h, inputmap_remap_counter, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); + } + input_find (hDlg, 1, true); + } + case WM_USER: + recursive++; + recursive--; + return TRUE; + case WM_DESTROY: + input_find (hDlg, 0, false); + break; + } + return 0; +} + +static void handlerawinput (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_INPUT) { + handle_rawinput (lParam); + DefWindowProc (hDlg, msg, wParam, lParam); } - inputdevice_unacquire (); } -#else static void input_copy (HWND hDlg) { int dst = workprefs.input_selected_setting; @@ -10805,15 +11387,11 @@ static void input_copy (HWND hDlg) if (src == CB_ERR) return; int v = (int)src; - if (v == 0) { - inputdevice_mergeconfig (&workprefs); - } else if (v >= 1 && v <= 5) { - v--; + if (v >= 0 && v <= 3) { inputdevice_copy_single_config (&workprefs, v, workprefs.input_selected_setting, input_selected_device); } init_inputdlg (hDlg); } -#endif static void input_toggleautofire (void) { @@ -10857,12 +11435,14 @@ static INT_PTR CALLBACK InputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM switch (msg) { case WM_INITDIALOG: + recursive++; pages[INPUT_ID] = hDlg; currentpage = INPUT_ID; inputdevice_updateconfig (&workprefs); inputdevice_config_change (); input_selected_widget = -1; init_inputdlg (hDlg); + recursive--; case WM_USER: recursive++; @@ -10870,12 +11450,21 @@ static INT_PTR CALLBACK InputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM values_to_inputdlg (hDlg); recursive--; return TRUE; + case WM_DESTROY: + input_find (hDlg, 0, false); + break; case WM_COMMAND: if (recursive) break; recursive++; switch (wParam) { + case IDC_INPUTREMAP: + input_find (hDlg, 0, true); + break; + case IDC_INPUTTEST: + input_find (hDlg, 1, true); + break; case IDC_INPUTCOPY: input_copy (hDlg); break; @@ -10883,7 +11472,7 @@ static INT_PTR CALLBACK InputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM input_swap (hDlg); break; case IDC_INPUTDEVICEDISABLE: - inputdevice_set_device_status (input_selected_device, IsDlgButtonChecked (hDlg, IDC_INPUTDEVICEDISABLE) ? 1 : 0); + inputdevice_set_device_status (input_selected_device, ischecked (hDlg, IDC_INPUTDEVICEDISABLE)); break; default: switch (LOWORD (wParam)) @@ -10950,6 +11539,7 @@ static INT_PTR CALLBACK InputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM } } } + handlerawinput (hDlg, msg, wParam, lParam); return FALSE; } @@ -11088,9 +11678,9 @@ struct filterpreset { }; static struct filterpreset filterpresets[] = { - { L"PAL", UAE_FILTER_PAL, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 1, 1, 0, 0, 0, 10, 0, 0, 0, 300, 30, 0, 0, 0 }, - { L"D3D Autoscale", 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1 }, - { L"D3D Full Scaling", 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0 }, + { L"PAL", UAE_FILTER_PAL, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 1, 1, 0, 0, 0, 10, 0, 0, 0, 300, 30, 0, 0, 0 }, + { L"D3D Autoscale", UAE_FILTER_NULL, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1 }, + { L"D3D Full Scaling", UAE_FILTER_NULL, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0 }, { NULL } }; @@ -11184,8 +11774,6 @@ static void values_to_hw3ddlg (HWND hDlg) SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_RESETCONTENT, 0, 0L); WIN32GUI_LoadUIString (IDS_NONE, tmp, MAX_DPATH); SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_ADDSTRING, 0, (LPARAM)tmp); - SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_ADDSTRING, 0, (LPARAM)tmp); - SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_SETCURSEL, 0, 0); uf = NULL; fltnum = 0; i = 0; j = 1; @@ -11221,6 +11809,10 @@ static void values_to_hw3ddlg (HWND hDlg) } } if (workprefs.gfx_api && D3D_goodenough ()) { + WIN32GUI_LoadUIString (IDS_NONE, tmp, MAX_DPATH); + SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_ADDSTRING, 0, (LPARAM)tmp); + SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_ADDSTRING, 0, (LPARAM)tmp); + SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_SETCURSEL, 0, 0); HANDLE h; WIN32_FIND_DATA wfd; TCHAR tmp[MAX_DPATH]; @@ -11244,6 +11836,10 @@ static void values_to_hw3ddlg (HWND hDlg) h = INVALID_HANDLE_VALUE; } } + } else { + WIN32GUI_LoadUIString (IDS_FILTER_NOOVERLAYS, tmp, MAX_DPATH); + SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_ADDSTRING, 0, (LPARAM)tmp); + SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_SETCURSEL, 0, 0); } SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_SETCURSEL, fltnum, 0); @@ -11583,7 +12179,7 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM break; case IDC_FILTERKEEPASPECT: { - if (IsDlgButtonChecked (hDlg, IDC_FILTERKEEPASPECT)) + if (ischecked (hDlg, IDC_FILTERKEEPASPECT)) currprefs.gfx_filter_keep_aspect = workprefs.gfx_filter_keep_aspect = 1; else currprefs.gfx_filter_keep_aspect = workprefs.gfx_filter_keep_aspect = 0; @@ -11856,23 +12452,23 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP { case IDC_AVIOUTPUT_FRAMELIMITER: - avioutput_framelimiter = IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_FRAMELIMITER) ? 0 : 1; + avioutput_framelimiter = ischecked (hDlg, IDC_AVIOUTPUT_FRAMELIMITER) ? 0 : 1; AVIOutput_SetSettings (); break; case IDC_AVIOUTPUT_NOSOUNDOUTPUT: - avioutput_nosoundoutput = IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_NOSOUNDOUTPUT) ? 1 : 0; + avioutput_nosoundoutput = ischecked (hDlg, IDC_AVIOUTPUT_NOSOUNDOUTPUT) ? 1 : 0; AVIOutput_SetSettings (); break; case IDC_AVIOUTPUT_NOSOUNDSYNC: - avioutput_nosoundsync = IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_NOSOUNDSYNC) ? 1 : 0; + avioutput_nosoundsync = ischecked (hDlg, IDC_AVIOUTPUT_NOSOUNDSYNC) ? 1 : 0; AVIOutput_SetSettings (); break; case IDC_AVIOUTPUT_ORIGINALSIZE: - avioutput_originalsize = IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_ORIGINALSIZE) ? 1 : 0; + avioutput_originalsize = ischecked (hDlg, IDC_AVIOUTPUT_ORIGINALSIZE) ? 1 : 0; AVIOutput_SetSettings (); break; case IDC_SCREENSHOT_ORIGINALSIZE: - screenshot_originalsize = IsDlgButtonChecked (hDlg, IDC_SCREENSHOT_ORIGINALSIZE) ? 1 : 0; + screenshot_originalsize = ischecked (hDlg, IDC_SCREENSHOT_ORIGINALSIZE) ? 1 : 0; regsetint (NULL, L"Screenshot_Original", screenshot_originalsize); break; @@ -11916,7 +12512,7 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP { if (avioutput_enabled) AVIOutput_End (); - if(IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_AUDIO) == BST_CHECKED) { + if(ischecked (hDlg, IDC_AVIOUTPUT_AUDIO)) { avioutput_audio = AVIOutput_ChooseAudioCodec (hDlg, tmp, sizeof tmp / sizeof (TCHAR)); enable_for_avioutputdlg (hDlg); } else { @@ -11929,7 +12525,7 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP { if (avioutput_enabled) AVIOutput_End (); - if(IsDlgButtonChecked (hDlg, IDC_AVIOUTPUT_VIDEO) == BST_CHECKED) { + if(ischecked (hDlg, IDC_AVIOUTPUT_VIDEO)) { avioutput_video = AVIOutput_ChooseVideoCodec (hDlg, tmp, sizeof tmp / sizeof (TCHAR)); if (avioutput_audio = AVIAUDIO_WAV) avioutput_audio = 0; @@ -11988,19 +12584,6 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP } #endif -struct GUIPAGE { - DLGPROC dlgproc; - LPCTSTR title; - LPCTSTR icon; - HTREEITEM tv; - int himg; - int idx; - const TCHAR *help; - HACCEL accel; - int fullpanel; - struct newresource *nres; -}; - static int GetPanelRect (HWND hDlg, RECT *r) { RECT rect; @@ -12212,20 +12795,29 @@ static BOOL CALLBACK childenumproc (HWND hwnd, LPARAM lParam) return 1; } -static struct GUIPAGE ppage[MAX_C_PAGES]; #define PANEL_X 174 #define PANEL_Y 12 #define PANEL_WIDTH 456 #define PANEL_HEIGHT 396 -static HWND updatePanel (HWND hDlg, int id) +static HWND updatePanel (int id) { + HWND hDlg = guiDlg; static HWND hwndTT; RECT r1c, r1w, r2c, r2w, r3c, r3w; int w, h, pw, ph, x , y, i; int fullpanel; struct newresource *tres; + if (cachedlist) { + if (lv_old_type >= 0) + lv_oldidx[lv_old_type] = ListView_GetTopIndex (cachedlist); + lv_oldidx[lv_old_type] += ListView_GetCountPerPage (cachedlist) - 1; + cachedlist = NULL; + } + + if (id >= 0) + currentpage = id; ew (guiDlg, IDC_RESETAMIGA, full_property_sheet ? FALSE : TRUE); ew (guiDlg, IDOK, TRUE); if (panelDlg != NULL) { @@ -12311,6 +12903,10 @@ static HWND updatePanel (HWND hDlg, int id) hAccelTable = ppage[currentpage].accel; + if (ppage[id].focusid > 0) { + setfocus (panelDlg, ppage[id].focusid); + } + return panelDlg; } @@ -12665,7 +13261,7 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l static int recursive = 0; static int waitfornext; - switch(msg) + switch (msg) { case WM_DEVICECHANGE: { @@ -12685,7 +13281,7 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l } if (doit) { inputdevice_devicechange (&workprefs); - updatePanel (hDlg, currentpage); + updatePanel (currentpage); waitfornext = 0; } } @@ -12713,16 +13309,16 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l WIN32GUI_LoadUIString (IDS_STARTEMULATION, tmp, sizeof (tmp) / sizeof (TCHAR)); SetWindowText (GetDlgItem (guiDlg, IDOK), tmp); } - ShowWindow (GetDlgItem(guiDlg, IDC_RESTARTEMU), full_property_sheet ? SW_HIDE : SW_SHOW); + ShowWindow (GetDlgItem (guiDlg, IDC_RESTARTEMU), full_property_sheet ? SW_HIDE : SW_SHOW); centerWindow (hDlg); createTreeView (hDlg, currentpage); - updatePanel (hDlg, currentpage); + updatePanel (currentpage); addnotifications (hDlg, FALSE, TRUE); return TRUE; case WM_DROPFILES: if (dragdrop (hDlg, (HDROP)wParam, (gui_active || full_property_sheet) ? &workprefs : &changed_prefs, currentpage)) SendMessage (hDlg, WM_COMMAND, IDOK, 0); - updatePanel (hDlg, currentpage); + updatePanel (currentpage); return FALSE; case WM_NOTIFY: { @@ -12737,9 +13333,8 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l cp = (int)(tv->itemNew.lParam & 0xffff); cf = (int)(tv->itemNew.lParam >> 16); if (cp != currentpage || cf != configtype) { - currentpage = cp; configtypepanel = configtype = cf; - updatePanel (hDlg, currentpage); + updatePanel (cp); } return TRUE; } @@ -12768,14 +13363,14 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l HtmlHelp (NULL, help_file, HH_DISPLAY_TOPIC, ppage[currentpage].help); return TRUE; case IDOK: - updatePanel (hDlg, -1); + updatePanel (-1); dialogreturn = 1; DestroyWindow (hDlg); gui_to_prefs (); guiDlg = NULL; return TRUE; case IDCANCEL: - updatePanel (hDlg, -1); + updatePanel (-1); dialogreturn = 0; DestroyWindow (hDlg); if (allow_quit) { @@ -12788,6 +13383,7 @@ static INT_PTR CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l break; } } + handlerawinput (hDlg, msg, wParam, lParam); return FALSE; } @@ -12865,7 +13461,7 @@ HWND CustomCreateDialog (int templ, HWND hDlg, DLGPROC proc) } static int init_page (int tmpl, int icon, int title, - INT_PTR (CALLBACK FAR *func) (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam), ACCEL *accels, TCHAR *help) + INT_PTR (CALLBACK FAR *func) (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam), ACCEL *accels, TCHAR *help, int focusid) { LPTSTR lpstrTitle; static int id = 0; @@ -12877,13 +13473,16 @@ static int init_page (int tmpl, int icon, int title, return -1; ppage[id].nres = res; ppage[id].icon = MAKEINTRESOURCE (icon); - lpstrTitle = xcalloc (TCHAR, MAX_DPATH); - LoadString (hUIDLL, title, lpstrTitle, MAX_DPATH); - ppage[id].title = lpstrTitle; + if (title >= 0) { + lpstrTitle = xcalloc (TCHAR, MAX_DPATH); + LoadString (hUIDLL, title, lpstrTitle, MAX_DPATH); + ppage[id].title = lpstrTitle; + } ppage[id].dlgproc = func; ppage[id].help = help; ppage[id].idx = id; ppage[id].accel = NULL; + ppage[id].focusid = focusid; if (!accels) accels = EmptyAccel; while (accels[++i].key); @@ -12985,6 +13584,7 @@ static int GetSettings (int all_options, HWND hwnd) full_property_sheet = all_options; allow_quit = all_options; pguiprefs = &currprefs; + memset (&workprefs, 0, sizeof (struct uae_prefs)); default_prefs (&workprefs, 0); WIN32GUI_LoadUIString (IDS_NONE, szNone, MAX_DPATH); @@ -12993,35 +13593,36 @@ static int GetSettings (int all_options, HWND hwnd) if (!init_called) { first = 1; panelresource = getresource (IDD_PANEL); - LOADSAVE_ID = init_page (IDD_LOADSAVE, IDI_FILE, IDS_LOADSAVE, LoadSaveDlgProc, NULL, L"gui/configurations.htm"); - MEMORY_ID = init_page (IDD_MEMORY, IDI_MEMORY, IDS_MEMORY, MemoryDlgProc, NULL, L"gui/ram.htm"); - EXPANSION_ID = init_page (IDD_EXPANSION, IDI_EXPANSION, IDS_EXPANSION, ExpansionDlgProc, NULL, L"gui/expansion.htm"); - KICKSTART_ID = init_page (IDD_KICKSTART, IDI_MEMORY, IDS_KICKSTART, KickstartDlgProc, NULL, L"gui/rom.htm"); - CPU_ID = init_page (IDD_CPU, IDI_CPU, IDS_CPU, CPUDlgProc, NULL, L"gui/cpu.htm"); - DISPLAY_ID = init_page (IDD_DISPLAY, IDI_DISPLAY, IDS_DISPLAY, DisplayDlgProc, NULL, L"gui/display.htm"); + LOADSAVE_ID = init_page (IDD_LOADSAVE, IDI_FILE, IDS_LOADSAVE, LoadSaveDlgProc, NULL, L"gui/configurations.htm", IDC_CONFIGTREE); + MEMORY_ID = init_page (IDD_MEMORY, IDI_MEMORY, IDS_MEMORY, MemoryDlgProc, NULL, L"gui/ram.htm", 0); + EXPANSION_ID = init_page (IDD_EXPANSION, IDI_EXPANSION, IDS_EXPANSION, ExpansionDlgProc, NULL, L"gui/expansion.htm", 0); + KICKSTART_ID = init_page (IDD_KICKSTART, IDI_MEMORY, IDS_KICKSTART, KickstartDlgProc, NULL, L"gui/rom.htm", 0); + CPU_ID = init_page (IDD_CPU, IDI_CPU, IDS_CPU, CPUDlgProc, NULL, L"gui/cpu.htm", 0); + DISPLAY_ID = init_page (IDD_DISPLAY, IDI_DISPLAY, IDS_DISPLAY, DisplayDlgProc, NULL, L"gui/display.htm", 0); #if defined (GFXFILTER) - HW3D_ID = init_page (IDD_FILTER, IDI_DISPLAY, IDS_FILTER, hw3dDlgProc, NULL, L"gui/filter.htm"); + HW3D_ID = init_page (IDD_FILTER, IDI_DISPLAY, IDS_FILTER, hw3dDlgProc, NULL, L"gui/filter.htm", 0); #endif - CHIPSET_ID = init_page (IDD_CHIPSET, IDI_CPU, IDS_CHIPSET, ChipsetDlgProc, NULL, L"gui/chipset.htm"); - CHIPSET2_ID = init_page (IDD_CHIPSET2, IDI_CPU, IDS_CHIPSET2, ChipsetDlgProc2, NULL, L"gui/chipset.htm"); - SOUND_ID = init_page (IDD_SOUND, IDI_SOUND, IDS_SOUND, SoundDlgProc, NULL, L"gui/sound.htm"); - FLOPPY_ID = init_page (IDD_FLOPPY, IDI_FLOPPY, IDS_FLOPPY, FloppyDlgProc, NULL, L"gui/floppies.htm"); - DISK_ID = init_page (IDD_DISK, IDI_FLOPPY, IDS_DISK, SwapperDlgProc, SwapperAccel, L"gui/disk.htm"); + CHIPSET_ID = init_page (IDD_CHIPSET, IDI_CPU, IDS_CHIPSET, ChipsetDlgProc, NULL, L"gui/chipset.htm", 0); + CHIPSET2_ID = init_page (IDD_CHIPSET2, IDI_CPU, IDS_CHIPSET2, ChipsetDlgProc2, NULL, L"gui/chipset.htm", 0); + SOUND_ID = init_page (IDD_SOUND, IDI_SOUND, IDS_SOUND, SoundDlgProc, NULL, L"gui/sound.htm", 0); + FLOPPY_ID = init_page (IDD_FLOPPY, IDI_FLOPPY, IDS_FLOPPY, FloppyDlgProc, NULL, L"gui/floppies.htm", 0); + DISK_ID = init_page (IDD_DISK, IDI_FLOPPY, IDS_DISK, SwapperDlgProc, SwapperAccel, L"gui/disk.htm", IDC_DISKLIST); #ifdef FILESYS - HARDDISK_ID = init_page (IDD_HARDDISK, IDI_HARDDISK, IDS_HARDDISK, HarddiskDlgProc, HarddiskAccel, L"gui/hard-drives.htm"); + HARDDISK_ID = init_page (IDD_HARDDISK, IDI_HARDDISK, IDS_HARDDISK, HarddiskDlgProc, HarddiskAccel, L"gui/hard-drives.htm", 0); #endif - GAMEPORTS_ID = init_page (IDD_GAMEPORTS, IDI_GAMEPORTS, IDS_GAMEPORTS, GamePortsDlgProc, NULL, L"gui/gameports.htm"); - IOPORTS_ID = init_page (IDD_IOPORTS, IDI_PORTS, IDS_IOPORTS, IOPortsDlgProc, NULL, L"gui/ioports.htm"); - INPUT_ID = init_page (IDD_INPUT, IDI_INPUT, IDS_INPUT, InputDlgProc, NULL, L"gui/input.htm"); - MISC1_ID = init_page (IDD_MISC1, IDI_MISC1, IDS_MISC1, MiscDlgProc1, NULL, L"gui/misc.htm"); - MISC2_ID = init_page (IDD_MISC2, IDI_MISC2, IDS_MISC2, MiscDlgProc2, NULL, L"gui/misc2.htm"); + GAMEPORTS_ID = init_page (IDD_GAMEPORTS, IDI_GAMEPORTS, IDS_GAMEPORTS, GamePortsDlgProc, NULL, L"gui/gameports.htm", 0); + INPUTMAP_ID = init_page (IDD_INPUTMAP, IDI_GAMEPORTS, IDS_GAMEPORTS, InputMapDlgProc, NULL, NULL, IDC_INPUTMAPLIST); + IOPORTS_ID = init_page (IDD_IOPORTS, IDI_PORTS, IDS_IOPORTS, IOPortsDlgProc, NULL, L"gui/ioports.htm", 0); + INPUT_ID = init_page (IDD_INPUT, IDI_INPUT, IDS_INPUT, InputDlgProc, NULL, L"gui/input.htm", IDC_INPUTLIST); + MISC1_ID = init_page (IDD_MISC1, IDI_MISC1, IDS_MISC1, MiscDlgProc1, NULL, L"gui/misc.htm", 0); + MISC2_ID = init_page (IDD_MISC2, IDI_MISC2, IDS_MISC2, MiscDlgProc2, NULL, L"gui/misc2.htm", 0); #ifdef AVIOUTPUT - AVIOUTPUT_ID = init_page (IDD_AVIOUTPUT, IDI_AVIOUTPUT, IDS_AVIOUTPUT, AVIOutputDlgProc, NULL, L"gui/output.htm"); + AVIOUTPUT_ID = init_page (IDD_AVIOUTPUT, IDI_AVIOUTPUT, IDS_AVIOUTPUT, AVIOutputDlgProc, NULL, L"gui/output.htm", 0); #endif - PATHS_ID = init_page (IDD_PATHS, IDI_PATHS, IDS_PATHS, PathsDlgProc, NULL, L"gui/paths.htm"); - QUICKSTART_ID = init_page (IDD_QUICKSTART, IDI_QUICKSTART, IDS_QUICKSTART, QuickstartDlgProc, NULL, L"gui/quickstart.htm"); - ABOUT_ID = init_page (IDD_ABOUT, IDI_ABOUT, IDS_ABOUT, AboutDlgProc, NULL, NULL); - FRONTEND_ID = init_page (IDD_FRONTEND, IDI_QUICKSTART, IDS_FRONTEND, AboutDlgProc, NULL, NULL); + PATHS_ID = init_page (IDD_PATHS, IDI_PATHS, IDS_PATHS, PathsDlgProc, NULL, L"gui/paths.htm", 0); + QUICKSTART_ID = init_page (IDD_QUICKSTART, IDI_QUICKSTART, IDS_QUICKSTART, QuickstartDlgProc, NULL, L"gui/quickstart.htm", 0); + ABOUT_ID = init_page (IDD_ABOUT, IDI_ABOUT, IDS_ABOUT, AboutDlgProc, NULL, NULL, 0); + FRONTEND_ID = init_page (IDD_FRONTEND, IDI_QUICKSTART, IDS_FRONTEND, AboutDlgProc, NULL, NULL, 0); C_PAGES = FRONTEND_ID + 1; init_called = 1; if (quickstart && !qs_override) @@ -13038,7 +13639,6 @@ static int GetSettings (int all_options, HWND hwnd) DragAcceptFiles (hwnd, TRUE); if (first) write_log (L"Entering GUI idle loop\n"); - //blah(); scaleresource_setmaxsize (800, 600); tres = scaleresource (panelresource, hwnd); @@ -13055,7 +13655,6 @@ static int GetSettings (int all_options, HWND hwnd) setguititle (dhwnd); ShowWindow (dhwnd, SW_SHOW); MapDialogRect (dhwnd, &dialog_rect); - hGUIWnd = dhwnd; for (;;) { HANDLE IPChandle; @@ -13074,11 +13673,21 @@ static int GetSettings (int all_options, HWND hwnd) continue; if (!IsWindow (dhwnd)) continue; - if (hAccelTable && panelDlg) { + if (hAccelTable && panelDlg && !rawmode) { if (TranslateAccelerator (panelDlg, hAccelTable, &msg)) continue; } - if (IsDialogMessage (dhwnd, &msg)) + if (rawmode) { + if (msg.message == WM_INPUT) { + handlerawinput (msg.hwnd, msg.message, msg.wParam, msg.lParam); + continue; + } + // eat all keyboard accelerators + if (msg.message == WM_KEYDOWN) + continue; + } + // IsDialogMessage() eats WM_INPUT messages?!?! + if (!rawmode && IsDialogMessage (dhwnd, &msg)) continue; TranslateMessage (&msg); DispatchMessage (&msg); diff --git a/od-win32/winuae_msvc10/winuae_msvc.sln b/od-win32/winuae_msvc10/winuae_msvc.sln index 090d5ee3..f0d5bad3 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.sln +++ b/od-win32/winuae_msvc10/winuae_msvc.sln @@ -28,6 +28,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "consolewrapper", "..\consol EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "prowizard", "..\prowizard\prowizard.vcxproj", "{8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unpackers", "..\unpackers\unpackers.vcxproj", "{98BA115B-829F-4085-9729-ABD0D779A60A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -130,6 +132,15 @@ Global {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.FullRelease|x64.ActiveCfg = Release|Win32 {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Release|Win32.ActiveCfg = Release|Win32 {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Release|x64.ActiveCfg = Release|x64 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Debug|Win32.ActiveCfg = Debug|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Debug|Win32.Build.0 = Debug|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Debug|x64.ActiveCfg = Debug|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.FullRelease|Win32.ActiveCfg = Release|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.FullRelease|Win32.Build.0 = Release|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.FullRelease|x64.ActiveCfg = Release|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Release|Win32.ActiveCfg = Release|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Release|Win32.Build.0 = Release|Win32 + {98BA115B-829F-4085-9729-ABD0D779A60A}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj b/od-win32/winuae_msvc10/winuae_msvc.vcxproj index 12a0a0f7..2cc68dab 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj @@ -158,7 +158,7 @@ /MACHINE:I386 %(AdditionalOptions) - ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9d.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;freetype.lib;vfw32.lib;wtsapi32.lib;enet.lib;prowizard.lib;%(AdditionalDependencies) + ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9d.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;enet.lib;prowizard.lib;lzmalib.lib;%(AdditionalDependencies) NotSet d:\amiga\winuae.exe true @@ -173,7 +173,7 @@ false - %(AdditionalLibraryDirectories) + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ @@ -217,11 +217,11 @@ 0x0409 - ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard.lib;%(AdditionalDependencies) + ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;%(AdditionalDependencies) d:\amiga\winuae64.exe true - MSVCRT.lib;%(IgnoreSpecificDefaultLibraries) - wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;freetype6.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;avrt.dll;%(DelayLoadDLLs) + %(IgnoreSpecificDefaultLibraries) + wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;%(DelayLoadDLLs) true $(Platform)\$(Configuration)\winuae.pdb Windows @@ -232,6 +232,7 @@ MachineX64 + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ ..\resources\winuae64.exe.manifest;%(AdditionalManifestFiles) @@ -259,7 +260,7 @@ Default MultiThreaded false - false + true NotSet Precise false @@ -283,10 +284,10 @@ 0x0409 - ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;freetype.lib;vfw32.lib;wtsapi32.lib;enet.lib;prowizard.lib;%(AdditionalDependencies) + ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;enet.lib;lzmalib.lib;prowizard.lib;%(AdditionalDependencies) d:\amiga\winuae.exe true - %(AdditionalLibraryDirectories) + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(AdditionalManifestDependencies) %(IgnoreSpecificDefaultLibraries) wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x86.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;wininet.dll;%(DelayLoadDLLs) @@ -304,7 +305,8 @@ false true MachineX86 - 5 + + ..\resources\winuae.exe.manifest;%(AdditionalManifestFiles) @@ -328,8 +330,7 @@ ..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;%(AdditionalIncludeDirectories) WINVER=0x0500;NDEBUG;_WIN32_IE=0x0700;WIN32;WIN64;%(PreprocessorDefinitions) true - - + false Default MultiThreaded false @@ -338,8 +339,7 @@ Precise false false - - + NotUsing $(Platform)\$(Configuration)/winuae_msvc.pch $(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ @@ -357,13 +357,13 @@ 0x0409 - ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard.lib;%(AdditionalDependencies) + ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;%(AdditionalDependencies) NotSet d:\amiga\winuae64.exe true - %(AdditionalLibraryDirectories) - MSVCRT.lib;%(IgnoreSpecificDefaultLibraries) - wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;freetype6.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;avrt.dll;%(DelayLoadDLLs) + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ + %(IgnoreSpecificDefaultLibraries) + wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;%(DelayLoadDLLs) true $(Platform)\$(Configuration)\winuae.pdb Windows @@ -429,10 +429,10 @@ 0x0409 - ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;freetype.lib;vfw32.lib;wtsapi32.lib;avrt.lib;wininet.lib;enet.lib;prowizard.lib;%(AdditionalDependencies) + ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;avrt.lib;enet.lib;prowizard.lib;lzmalib.lib;%(AdditionalDependencies) d:\amiga\winuae.exe true - %(AdditionalLibraryDirectories) + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(AdditionalManifestDependencies) %(IgnoreSpecificDefaultLibraries) wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x86.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;wininet.dll;%(DelayLoadDLLs) @@ -449,7 +449,8 @@ false true MachineX86 - 5 + + ..\resources\winuae9.exe.manifest;%(AdditionalManifestFiles) @@ -506,8 +507,8 @@ NotSet d:\amiga\winuae64.exe true - %(AdditionalLibraryDirectories) - MSVCRT.lib;%(IgnoreSpecificDefaultLibraries) + %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ + %(IgnoreSpecificDefaultLibraries) wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;freetype6.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;avrt.dll;%(DelayLoadDLLs) true $(Platform)\$(Configuration)\winuae.pdb @@ -527,6 +528,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -647,44 +674,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters b/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters index c64a3035..a7858e1f 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters @@ -20,29 +20,26 @@ {dab2f6c7-d741-4002-b0c9-566a1536642a} - - {f3ce6c07-bb5c-47dc-9e59-5e4acd06ff0d} + + {a88602d5-1980-49b2-a87a-79afa3ca7346} - - {ae0450a0-e0ff-442b-8896-a21eb8769fae} + + {6b855260-58da-4be4-b914-621ca2e33ca5} - - {c52448a0-4965-449e-bbdd-e8cb8bf9227a} + + {1af2c9da-63ab-4226-8b97-5544a0a34433} - - {492ad99e-6cf0-486b-8e97-083a9e50bb7c} + + {99d2fcb7-e014-45fe-a543-4a9b9242a35b} - - {d030c158-bae4-4025-9d74-bfe643846c44} + + {d2f2439b-d15d-47d5-bb26-1a9436aef770} - - {4abb311e-366e-4c88-bb5f-0086611a1145} + + {d69b4a6c-84db-480b-8b80-60a2a3646f6e} - - {4c157cd6-e04e-4dfa-ad84-a5e9f8abc1ed} - - - {43856f2f-e043-4cfe-aa2a-a767858d8ea4} + + {93fcf20a-8921-43e8-b4b9-e5fceb81332d} @@ -403,122 +400,86 @@ prowizard + + win32 + - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms + unpackers\dms - decompressors\dms - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z - - - decompressors\7z + unpackers\dms - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha + unpackers\lha - decompressors\lha - - - decompressors\zip + unpackers\lha - decompressors\lzx + unpackers\lzx - decompressors\wrp + unpackers\wrp - - win32 + + unpackers\zip + + + common diff --git a/rommgr.cpp b/rommgr.cpp index 21cf7f93..2996f976 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -73,7 +73,7 @@ void romlist_add (TCHAR *path, struct romdata *rd) } -struct romdata *getromdatabypath(TCHAR *path) +struct romdata *getromdatabypath (TCHAR *path) { int i; for (i = 0; i < romlist_cnt; i++) { @@ -474,7 +474,7 @@ struct romdata *getarcadiarombyname (TCHAR *name) return NULL; } -struct romlist **getarcadiaroms(void) +struct romlist **getarcadiaroms (void) { int i, out, max; void *buf; @@ -686,7 +686,7 @@ void free_keyring (void) memset(keyring, 0, sizeof (struct rom_key) * ROM_KEY_NUM); } -struct romdata *getromdatabyname (TCHAR *name) +struct romdata *getromdatabyname (const TCHAR *name) { TCHAR tmp[MAX_PATH]; int i = 0; @@ -900,9 +900,11 @@ struct romdata *getromdatabyzfile (struct zfile *f) pos = zfile_ftell (f); zfile_fseek (f, 0, SEEK_END); size = zfile_ftell (f); + if (size > 2048 * 1024) + return NULL; p = xmalloc (uae_u8, size); if (!p) - return 0; + return NULL; memset (p, 0, size); zfile_fseek (f, 0, SEEK_SET); zfile_fread (p, 1, size, f); diff --git a/zfile.cpp b/zfile.cpp index 97285cdf..2f5ecf7d 100644 --- a/zfile.cpp +++ b/zfile.cpp @@ -31,7 +31,7 @@ static struct zfile *zlist = 0; -const TCHAR *uae_archive_extensions[] = { L"zip", L"rar", L"7z", L"lha", L"lzh", L"lzx", L"tar", NULL }; +const TCHAR *uae_archive_extensions[] = { L"zip", L"rar", L"7z", L"xz", L"lha", L"lzh", L"lzx", L"tar", NULL }; #define MAX_CACHE_ENTRIES 10 @@ -391,6 +391,8 @@ static uae_s64 vhd_fread (void *data, uae_u64 l1, uae_u64 l2, struct zfile *zf) uae_u64 out = 0; int len = 0; + if (!l1 || !l2) + return 0; if ((zf->seek & 511) || (size & 511)) { uae_u8 tmp[512]; @@ -1142,14 +1144,14 @@ static const TCHAR *archive_extensions[] = { L"hdf", L"tar", NULL }; -static const TCHAR *plugins_7z[] = { L"7z", L"rar", L"zip", L"lha", L"lzh", L"lzx", L"adf", L"dsq", L"hdf", L"tar", NULL }; -static const uae_char *plugins_7z_x[] = { "7z", "Rar!", "MK", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +static const TCHAR *plugins_7z[] = { L"7z", L"xz", L"rar", L"zip", L"lha", L"lzh", L"lzx", L"adf", L"dsq", L"hdf", L"tar", NULL }; +static const uae_char *plugins_7z_x[] = { "7z", "xz", "Rar!", "MK", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const int plugins_7z_t[] = { - ArchiveFormat7Zip, ArchiveFormatRAR, ArchiveFormatZIP, ArchiveFormatLHA, ArchiveFormatLHA, ArchiveFormatLZX, + ArchiveFormat7Zip, ArchiveFormatXZ, ArchiveFormatRAR, ArchiveFormatZIP, ArchiveFormatLHA, ArchiveFormatLHA, ArchiveFormatLZX, ArchiveFormatADF, ArchiveFormatADF, ArchiveFormatADF, ArchiveFormatTAR }; static const int plugins_7z_m[] = { - ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, + ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ARCHIVE, ZFD_ADF, ZFD_ADF, ZFD_ADF, ZFD_ARCHIVE }; @@ -1181,6 +1183,11 @@ int iszip (struct zfile *z) return ArchiveFormat7Zip; return 0; } + if (!strcasecmp (ext, L".xz")) { + if (header[1] == '7' && header[2] == 'z' && header[3] == 'X' && header[4] == 'Z') + return ArchiveFormatXZ; + return 0; + } if (!strcasecmp (ext, L".rar")) { if (header[0] == 'R' && header[1] == 'a' && header[2] == 'r' && header[3] == '!') return ArchiveFormatRAR; @@ -1254,6 +1261,8 @@ struct zfile *zuncompress (struct znode *parent, struct zfile *z, int dodefault, if (mask & ZFD_ARCHIVE) { if (strcasecmp (ext, L"7z") == 0) return archive_access_select (parent, z, ArchiveFormat7Zip, dodefault, retcode, index); + if (strcasecmp (ext, L"xz") == 0) + return archive_access_select (parent, z, ArchiveFormatXZ, dodefault, retcode, index); if (strcasecmp (ext, L"zip") == 0) return archive_access_select (parent, z, ArchiveFormatZIP, dodefault, retcode, index); if (strcasecmp (ext, L"lha") == 0 || strcasecmp (ext, L"lzh") == 0) @@ -1575,6 +1584,9 @@ static struct zfile *zfile_fopen_x (const TCHAR *name, const TCHAR *mode, int ma } zfile_fseek (l, 0, SEEK_SET); break; + } else { + if (l2->parent == l) + l->opencnt--; } l = l2; } @@ -1758,6 +1770,7 @@ struct zfile *zfile_dup (struct zfile *zf) nzf->data = xmalloc (uae_u8, zf->size); memcpy (nzf->data, zf->data, zf->size); nzf->size = zf->size; + nzf->datasize = zf->datasize; } else if (zf->zipname) { nzf = openzip (zf->name); return nzf; @@ -1805,6 +1818,7 @@ struct zfile *zfile_fopen_empty (struct zfile *prev, const TCHAR *name, uae_u64 return NULL; } l->size = size; + l->datasize = size; } else { l->data = xcalloc (uae_u8, 1); l->size = 0; @@ -1824,6 +1838,7 @@ struct zfile *zfile_fopen_parent (struct zfile *z, const TCHAR *name, uae_u64 of else if (z->name) l->name = my_strdup (z->name); l->size = size; + l->datasize = size; l->offset = offset; for (;;) { l->parent = z; @@ -1845,6 +1860,7 @@ struct zfile *zfile_fopen_data (const TCHAR *name, uae_u64 size, uae_u8 *data) l->name = name ? my_strdup (name) : L""; l->data = xmalloc (uae_u8, size); l->size = size; + l->datasize = size; memcpy (l->data, data, size); return l; } @@ -1900,6 +1916,9 @@ size_t zfile_fread (void *b, size_t l1, size_t l2, struct zfile *z) if (z->zfileread) return z->zfileread (b, l1, l2, z); if (z->data) { + if (z->datasize < z->size && z->seek + l1 * l2 > z->datasize) { + ; + } if (z->seek + l1 * l2 > z->size) { if (l1) l2 = (z->size - z->seek) / l1; @@ -2378,6 +2397,8 @@ static struct zvolume *zfile_fopen_archive_ext (struct znode *parent, struct zfi zv = archive_directory_zip (zf); if (strcasecmp (ext, L"7z") == 0) zv = archive_directory_7z (zf); + if (strcasecmp (ext, L"xz") == 0) + zv = archive_directory_xz (zf); if (strcasecmp (ext, L"lzx") == 0) zv = archive_directory_lzx (zf); if (strcasecmp (ext, L"rar") == 0) @@ -2471,7 +2492,7 @@ static int zfile_fopen_archive_recurse (struct zvolume *zv) } } if (!done) { - z = archive_getzfile (zn, zv->method); + z = archive_getzfile (zn, zv->method, 0); if (z && iszip (z)) zfile_fopen_archive_recurse2 (zv, zn); } @@ -2973,7 +2994,7 @@ struct zfile *zfile_open_archive (const TCHAR *path, int flags) } if (zn->vfile) zn = zn->vfile; - z = archive_getzfile (zn, zn->volume->id); + z = archive_getzfile (zn, zn->volume->id, 0); if (z) zfile_fseek (z, 0, SEEK_SET); zn->f = z; @@ -3044,4 +3065,4 @@ TCHAR *zfile_geterror (void) void zfile_seterror (const TCHAR *format, ...) { } -#endif \ No newline at end of file +#endif diff --git a/zfile_archive.cpp b/zfile_archive.cpp index 836aaa42..1aea5222 100644 --- a/zfile_archive.cpp +++ b/zfile_archive.cpp @@ -6,11 +6,14 @@ * 2007 Toni Wilen */ -#define ZLIB_WINAPI - #include "sysconfig.h" #include "sysdeps.h" +#ifdef _WIN32 +#include +#include "win32.h" +#endif + #include "options.h" #include "zfile.h" #include "archivers/zip/unzip.h" @@ -21,10 +24,7 @@ #include -#ifdef _WIN32 -#include -#include "win32.h" -#endif + static time_t fromdostime (uae_u32 dd) { @@ -56,6 +56,9 @@ static struct zvolume *getzvolume (struct znode *parent, struct zfile *zf, unsig case ArchiveFormat7Zip: zv = archive_directory_7z (zf); break; + case ArchiveFormatXZ: + zv = archive_directory_xz (zf); + break; case ArchiveFormatRAR: zv = archive_directory_rar (zf); break; @@ -86,14 +89,14 @@ static struct zvolume *getzvolume (struct znode *parent, struct zfile *zf, unsig return zv; } -struct zfile *archive_getzfile (struct znode *zn, unsigned int id) +struct zfile *archive_getzfile (struct znode *zn, unsigned int id, int flags) { struct zfile *zf = NULL; switch (id) { case ArchiveFormatZIP: - zf = archive_access_zip (zn); + zf = archive_access_zip (zn, flags); break; case ArchiveFormat7Zip: zf = archive_access_7z (zn); @@ -138,7 +141,8 @@ struct zfile *archive_access_select (struct znode *parent, struct zfile *zf, uns struct zfile *z = NULL; int we_have_file; int diskimg; - int canhistory = (zf->zfdmask & ZFD_DISKHISTORY) && !(zf->zfdmask & ZFD_CHECKONLY); + int mask = zf->zfdmask; + int canhistory = (mask & ZFD_DISKHISTORY) && !(mask & ZFD_CHECKONLY); if (retcode) *retcode = 0; @@ -188,28 +192,24 @@ struct zfile *archive_access_select (struct znode *parent, struct zfile *zf, uns select = -1; if (zf->zipname && zf->zipname[0] == '#' && _tstol (zf->zipname + 1) == zipcnt) select = -1; - if (select && we_have_file <= 0) { - struct zfile *zt = archive_getzfile (zn, id); + if (select && we_have_file < 10) { + struct zfile *zt = archive_getzfile (zn, id, 1); if (zt) { int ft = zfile_gettype (zt); - if (select < 0 || ft) { - int whf = 1; - if (ft == ZFILE_CDIMAGE) { - TCHAR *ext = _tcsrchr (zn->fullname, '.'); - if (ext && we_have_file == 0) { - if (!_tcsicmp (ext, L".iso")) - whf = -1; // accept .cue if found later - } - } else if (we_have_file < 0) { - whf = 0; // ignore non-cdimage files if iso was found - } - if (whf) { - we_have_file = whf; - if (z) - zfile_fclose (z); - z = zt; - zt = NULL; - } + TCHAR *ext = _tcsrchr (zn->fullname, '.'); + int whf = 1; + if ((mask & ZFD_CD) && ft) { + if (ext && !_tcsicmp (ext, L".iso")) + whf = 2; + if (ext && !_tcsicmp (ext, L".cue")) + whf = 10; + } + if ((select < 0 || ft) && whf > we_have_file) { + we_have_file = whf; + if (z) + zfile_fclose (z); + z = zt; + zt = NULL; } zfile_fclose (zt); } @@ -253,7 +253,7 @@ void archive_access_scan (struct zfile *zf, zfile_callback zc, void *user, unsig zn = &zv->root; while (zn) { if (zn->type == ZNODE_FILE) { - struct zfile *zf2 = archive_getzfile (zn, id); + struct zfile *zf2 = archive_getzfile (zn, id, 0); if (zf2) { int ztype = iszip (zf2); if (ztype) { @@ -382,7 +382,7 @@ struct zvolume *archive_directory_zip (struct zfile *z) filename_inzip = au (filename_inzip2); dd = file_info.dosDate; t = fromdostime (dd); - memset(&zai, 0, sizeof zai); + memset (&zai, 0, sizeof zai); zai.name = filename_inzip; zai.t = t; zai.flags = -1; @@ -408,7 +408,7 @@ struct zvolume *archive_directory_zip (struct zfile *z) } -struct zfile *archive_access_zip (struct znode *zn) +struct zfile *archive_access_zip (struct znode *zn, int flags) { struct zfile *z = NULL; unzFile uz = zn->volume->handle; @@ -442,7 +442,9 @@ struct zfile *archive_access_zip (struct znode *zn) return 0; z = zfile_fopen_empty (NULL, zn->fullname, zn->size); if (z) { - err = unzReadCurrentFile (uz, z->data, zn->size); +// if (flags) +// z->datasize = PEEK_BYTES; + err = unzReadCurrentFile (uz, z->data, z->datasize); } unzCloseCurrentFile (uz); return z; @@ -450,33 +452,36 @@ struct zfile *archive_access_zip (struct znode *zn) /* 7Z */ -#include "archivers/7z/Types.h" -#include "archivers/7z/7zCrc.h" -#include "archivers/7z/Archive/7z/7zIn.h" -#include "archivers/7z/Archive/7z/7zExtract.h" -#include "archivers/7z/Archive/7z/7zAlloc.h" - -static ISzAlloc allocImp; -static ISzAlloc allocTempImp; +#include "7z/7z.h" +#include "7z/Alloc.h" +#include "7z/7zFile.h" +#include "7z/7zVersion.h" +#include "7z/7zCrc.h" -typedef struct +static void *SzAlloc (void *p, size_t size) { - ISeekInStream s; - struct zfile *zf; -} CFileInStream; - + return xmalloc (uae_u8, size); +} +static void SzFree(void *p, void *address) +{ + xfree (address); +} +static ISzAlloc allocImp; +static ISzAlloc allocTempImp; static SRes SzFileReadImp (void *object, void *buffer, size_t *size) { CFileInStream *s = (CFileInStream *)object; - *size = zfile_fread (buffer, 1, *size, s->zf); + struct zfile *zf = (struct zfile*)s->file.myhandle; + *size = zfile_fread (buffer, 1, *size, zf); return SZ_OK; } static SRes SzFileSeekImp(void *object, Int64 *pos, ESzSeek origin) { CFileInStream *s = (CFileInStream *)object; + struct zfile *zf = (struct zfile*)s->file.myhandle; int org = 0; switch (origin) { @@ -484,9 +489,9 @@ static SRes SzFileSeekImp(void *object, Int64 *pos, ESzSeek origin) case SZ_SEEK_CUR: org = SEEK_CUR; break; case SZ_SEEK_END: org = SEEK_END; break; } - zfile_fseek (s->zf, *pos, org); - *pos = zfile_ftell (s->zf); - return 0; + zfile_fseek (zf, *pos, org); + *pos = zfile_ftell (zf); + return SZ_OK; } static void init_7z (void) @@ -498,8 +503,8 @@ static void init_7z (void) initialized = 1; allocImp.Alloc = SzAlloc; allocImp.Free = SzFree; - allocTempImp.Alloc = SzAllocTemp; - allocTempImp.Free = SzFreeTemp; + allocTempImp.Alloc = SzAlloc; + allocTempImp.Free = SzFree; CrcGenerateTable (); _tzset (); } @@ -525,6 +530,11 @@ static void archive_close_7z (void *ctx) #define EPOCH_DIFF 0x019DB1DED53E8000LL /* 116444736000000000 nsecs */ #define RATE_DIFF 10000000 /* 100 nsecs */ +struct zvolume *archive_directory_xz (struct zfile *z) +{ + return NULL; +} + struct zvolume *archive_directory_7z (struct zfile *z) { SRes res; @@ -537,7 +547,7 @@ struct zvolume *archive_directory_7z (struct zfile *z) ctx->blockIndex = 0xffffffff; ctx->archiveStream.s.Read = SzFileReadImp; ctx->archiveStream.s.Seek = SzFileSeekImp; - ctx->archiveStream.zf = z; + ctx->archiveStream.file.myhandle = (void*)z; LookToRead_CreateVTable (&ctx->lookStream, False); ctx->lookStream.realStream = &ctx->archiveStream.s; LookToRead_Init (&ctx->lookStream); @@ -552,12 +562,12 @@ struct zvolume *archive_directory_7z (struct zfile *z) zv = zvolume_alloc (z, ArchiveFormat7Zip, ctx, NULL); for (i = 0; i < ctx->db.db.NumFiles; i++) { CSzFileItem *f = ctx->db.db.Files + i; - TCHAR *name = au (f->Name); + TCHAR *name = (TCHAR*)(ctx->db.FileNames.data + ctx->db.FileNameOffsets[i] * 2); struct zarchive_info zai; memset(&zai, 0, sizeof zai); zai.name = name; - zai.flags = -1; + zai.flags = f->AttribDefined ? f->Attrib : -1; zai.size = f->Size; zai.t = 0; if (f->MTimeDefined) { @@ -573,12 +583,16 @@ struct zvolume *archive_directory_7z (struct zfile *z) struct znode *zn = zvolume_addfile_abs (zv, &zai); zn->offset = i; } - xfree (name); } zv->method = ArchiveFormat7Zip; return zv; } +struct zfile *archive_access_xz (struct znode *zn) +{ + return NULL; +} + struct zfile *archive_access_7z (struct znode *zn) { SRes res; @@ -589,7 +603,7 @@ struct zfile *archive_access_7z (struct znode *zn) struct SevenZContext *ctx; ctx = (struct SevenZContext*)zv->handle; - res = SzAr_Extract (&ctx->db, &ctx->lookStream.s, zn->offset, + res = SzArEx_Extract (&ctx->db, &ctx->lookStream.s, zn->offset, &ctx->blockIndex, &ctx->outBuffer, &ctx->outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); @@ -690,7 +704,8 @@ static int rar_resetf (struct zfile *z) static void archive_close_rar (void *ctx) { - xfree ((struct RARContext*)ctx); + struct RARContext* rc = (struct RARContext*)ctx; + xfree (rc); } struct zvolume *archive_directory_rar (struct zfile *z) @@ -898,7 +913,7 @@ struct zvolume *archive_directory_arcacc (struct zfile *z, unsigned int id) if (!arcacc_init (z)) return NULL; - zv = zvolume_alloc (z, id, NULL, NULL); + zv = zvolume_alloc (z, ArchiveFormatAA, NULL, NULL); id_r = arcacc_push (z); ah = aaOpenArchive (readCallback, id_r, zv->archivesize, id, &status, NULL); if (!status) { -- 2.47.3