From 04560bcb63e222e3035f5b3c8d206429f1377701 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 16 Jan 2008 18:05:32 +0200 Subject: [PATCH] imported winuaesrc1460b6.zip --- akiko.c | 2 +- cdtv.c | 2 +- cfgfile.c | 55 ++++- cia.c | 84 ++++++- debug.c | 297 ++++++++++++++++-------- drawing.c | 4 +- filesys.c | 22 +- gayle.c | 5 +- hardfile.c | 4 +- include/cia.h | 1 + include/filesys.h | 1 + include/gui.h | 4 +- include/newcpu.h | 1 - include/options.h | 5 +- inputdevice.c | 19 +- main.c | 4 +- memory.c | 231 +++++++++++++++--- newcpu.c | 8 +- od-win32/blkdev_win32_aspi.c | 4 +- od-win32/blkdev_win32_ioctl.c | 14 +- od-win32/blkdev_win32_spti.c | 4 +- od-win32/lcd.c | 2 +- od-win32/mman.c | 11 +- od-win32/resources/resource | 6 +- od-win32/resources/resource.h | 5 +- od-win32/resources/winuae.rc | 36 +-- od-win32/rp.c | 58 +++++ od-win32/rp.h | 4 + od-win32/win32.c | 4 + od-win32/win32.h | 4 +- od-win32/win32gui.c | 25 +- od-win32/winuae_msvc/winuae_msvc.vcproj | 4 + od-win32/winuaechangelog.txt | 49 ++++ od-win32/writelog.c | 2 + 34 files changed, 763 insertions(+), 218 deletions(-) diff --git a/akiko.c b/akiko.c index fa55d9ec..e428cd01 100644 --- a/akiko.c +++ b/akiko.c @@ -1043,7 +1043,7 @@ void AKIKO_hsync_handler (void) framecounter--; if (framecounter <= 0) { if (cdrom_playing || cdrom_toc_counter > 0) - gui_cd_led (1); + gui_cd_led (0, 1); cdrom_run_read (); framecounter = 1000000 / (74 * 75 * cdrom_speed); set_status(CDSTATUS_FRAME); diff --git a/cdtv.c b/cdtv.c index 38e810d1..e9549d9c 100644 --- a/cdtv.c +++ b/cdtv.c @@ -957,7 +957,7 @@ void CDTV_hsync_handler(void) do_stch(); } if (cd_playing) - gui_cd_led (1); + gui_cd_led (0, 1); if (cd_media && (tp_cr & 1)) { tp_air |= 1 << 1; INT2(); diff --git a/cfgfile.c b/cfgfile.c index f785e99e..8ba2d3ae 100644 --- a/cfgfile.c +++ b/cfgfile.c @@ -594,7 +594,8 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite (f, "ciaatod=%s\n", ciaatodmode[p->cs_ciaatod]); cfgfile_dwrite (f, "rtc=%s\n", rtctype[p->cs_rtc]); //cfgfile_dwrite (f, "chipset_rtc_adjust=%d\n", p->cs_rtc_adjust); - cfgfile_dwrite (f, "ksmirror=%s\n", ksmirrortype[p->cs_ksmirror]); + cfgfile_dwrite (f, "ksmirror_e0=%s\n", p->cs_ksmirror_e0 ? "true" : "false"); + cfgfile_dwrite (f, "ksmirror_a8=%s\n", p->cs_ksmirror_a8 ? "true" : "false"); cfgfile_dwrite (f, "cd32cd=%s\n", p->cs_cd32cd ? "true" : "false"); cfgfile_dwrite (f, "cd32c2p=%s\n", p->cs_cd32c2p ? "true" : "false"); cfgfile_dwrite (f, "cd32nvram=%s\n", p->cs_cd32nvram ? "true" : "false"); @@ -612,6 +613,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite (f, "scsi_a3000=%s\n", p->cs_mbdmac == 1 ? "true" : "false"); cfgfile_dwrite (f, "scsi_a4000t=%s\n", p->cs_mbdmac == 2 ? "true" : "false"); cfgfile_dwrite (f, "bogomem_fast=%s\n", p->cs_slowmemisfast ? "true" : "false"); + cfgfile_dwrite (f, "resetwarning=%s\n", p->cs_resetwarning ? "true" : "false"); cfgfile_write (f, "fastmem_size=%d\n", p->fastmem_size / 0x100000); cfgfile_write (f, "a3000mem_size=%d\n", p->mbresmem_low_size / 0x100000); @@ -1295,7 +1297,11 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *valu || cfgfile_yesno (option, value, "scsi_cdtv", &p->cs_cdtvscsi) || cfgfile_yesno (option, value, "scsi_a4091", &p->cs_a4091) || cfgfile_yesno (option, value, "scsi_a2091", &p->cs_a2091) + || cfgfile_yesno (option, value, "cia_overlay", &p->cs_ciaoverlay) || cfgfile_yesno (option, value, "bogomem_fast", &p->cs_slowmemisfast) + || cfgfile_yesno (option, value, "ksmirror_e0", &p->cs_ksmirror_e0) + || cfgfile_yesno (option, value, "ksmirror_a8", &p->cs_ksmirror_a8) + || cfgfile_yesno (option, value, "resetwarning", &p->cs_resetwarning) || cfgfile_yesno (option, value, "kickshifter", &p->kickshifter) || cfgfile_yesno (option, value, "ntsc", &p->ntscmode) @@ -1349,7 +1355,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *valu if (cfgfile_strval (option, value, "comp_trustbyte", &p->comptrustbyte, compmode, 0) || cfgfile_strval (option, value, "chipset_compatible", &p->cs_compatible, cscompa, 0) || cfgfile_strval (option, value, "rtc", &p->cs_rtc, rtctype, 0) - || cfgfile_strval (option, value, "ksmirror", &p->cs_ksmirror, ksmirrortype, 0) + || cfgfile_strval (option, value, "ksmirror", &p->cs_ksmirror_e0, ksmirrortype, 0) || cfgfile_strval (option, value, "ciaatod", &p->cs_ciaatod, ciaatodmode, 0) || cfgfile_strval (option, value, "ide", &p->cs_ide, idemode, 0) || cfgfile_strval (option, value, "scsi", &p->scsi, scsimode, 0) @@ -2896,10 +2902,13 @@ void default_prefs (struct uae_prefs *p, int type) p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 0; p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = 0; p->cs_pcmcia = 0; - p->cs_ksmirror = 1; + p->cs_ksmirror_e0 = 1; + p->cs_ksmirror_a8 = 0; + p->cs_ciaoverlay = 1; p->cs_ciaatod = 0; p->cs_df0idhw = 1; p->cs_slowmemisfast = 0; + p->cs_resetwarning = 1; p->gfx_filter = 0; p->gfx_filter_horiz_zoom_mult = 1000; @@ -3041,7 +3050,7 @@ static void buildin_default_prefs (struct uae_prefs *p) p->z3fastmem_size = 0x00000000; p->gfxmem_size = 0x00000000; - p->cs_rtc = 1; + p->cs_rtc = 0; p->cs_a1000ram = 0; p->cs_fatgaryrev = -1; p->cs_ramseyrev = -1; @@ -3054,9 +3063,12 @@ static void buildin_default_prefs (struct uae_prefs *p) p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = 0; p->cs_ide = 0; p->cs_pcmcia = 0; - p->cs_ksmirror = 1; + p->cs_ksmirror_e0 = 1; + p->cs_ksmirror_a8 = 0; + p->cs_ciaoverlay = 1; p->cs_ciaatod = 0; p->cs_df0idhw = 1; + p->cs_resetwarning = 0; strcpy (p->romfile, ""); strcpy (p->romextfile, ""); @@ -3302,6 +3314,7 @@ static int bip_a1200 (struct uae_prefs *p, int config, int compa, int romcheck) roms[1] = 31; roms[2] = 15; roms[3] = -1; + p->cs_rtc = 0; if (config == 1) { p->fastmem_size = 0x400000; p->cs_rtc = 2; @@ -3322,6 +3335,8 @@ static int bip_a600 (struct uae_prefs *p, int config, int compa, int romcheck) roms[3] = -1; p->bogomem_size = 0; p->chipmem_size = 0x100000; + if (config > 0) + p->cs_rtc = 1; if (config == 1) p->chipmem_size = 0x200000; if (config == 2) @@ -3341,6 +3356,8 @@ static int bip_a500p (struct uae_prefs *p, int config, int compa, int romcheck) roms[1] = -1; p->bogomem_size = 0; p->chipmem_size = 0x100000; + if (config > 0) + p->cs_rtc = 1; if (config == 1) p->chipmem_size = 0x200000; if (config == 2) @@ -3440,7 +3457,7 @@ static int bip_super (struct uae_prefs *p, int config, int compa, int romcheck) built_in_chipset_prefs (p); p->cs_ide = -1; p->cs_ciaatod = p->ntscmode ? 2 : 1; - strcat(p->flashfile, "battclock.nvr"); + //strcat(p->flashfile, "battclock.nvr"); return configure_rom (p, roms, romcheck); } @@ -3541,9 +3558,11 @@ int built_in_chipset_prefs (struct uae_prefs *p) p->cs_mbdmac = 0; p->cs_a2091 = 0; p->cs_pcmcia = 0; - p->cs_ksmirror = 1; + p->cs_ksmirror_e0 = 1; + p->cs_ciaoverlay = 1; p->cs_ciaatod = 0; p->cs_df0idhw = 1; + p->cs_resetwarning = 1; switch (p->cs_compatible) { @@ -3558,38 +3577,46 @@ int built_in_chipset_prefs (struct uae_prefs *p) p->cs_rtc = 1; p->cs_cdtvcd = p->cs_cdtvram = 1; p->cs_df0idhw = 1; - p->cs_ksmirror = 0; + p->cs_ksmirror_e0 = 0; break; case CP_CD32: // CD32 p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 1; - p->cs_ksmirror = 0; + p->cs_ksmirror_e0 = 0; + p->cs_ksmirror_a8 = 1; + p->cs_ciaoverlay = 0; + p->cs_resetwarning = 0; break; case CP_A500: // A500 p->cs_df0idhw = 0; + p->cs_resetwarning = 0; break; case CP_A500P: // A500+ + p->cs_resetwarning = 0; break; case CP_A600: // A600 p->cs_ide = 1; p->cs_pcmcia = 1; + p->cs_ksmirror_a8 = 1; + p->cs_ciaoverlay = 0; + p->cs_resetwarning = 0; break; case CP_A1000: // A1000 p->cs_a1000ram = 1; p->cs_ciaatod = p->ntscmode ? 2 : 1; - p->cs_ksmirror = 0; + p->cs_ksmirror_e0 = 0; p->cs_rtc = 0; p->chipset_mask |= CSMASK_BLTBUSY_BUG; break; case CP_A1200: // A1200 p->cs_ide = 1; p->cs_pcmcia = 1; - p->cs_ksmirror = 2; + p->cs_ksmirror_a8 = 1; + p->cs_ciaoverlay = 0; break; case CP_A2000: // A2000 p->cs_rtc = 1; p->cs_ciaatod = p->ntscmode ? 2 : 1; break; - break; case CP_A3000: // A3000 p->cs_rtc = 2; p->cs_fatgaryrev = 0; @@ -3610,6 +3637,8 @@ int built_in_chipset_prefs (struct uae_prefs *p) p->cs_ramseyrev = 0x0f; p->cs_ide = 2; p->cs_mbdmac = 0; + p->cs_ksmirror_a8 = 1; + p->cs_ciaoverlay = 0; break; case CP_A4000T: // A4000T p->cs_rtc = 2; @@ -3617,6 +3646,8 @@ int built_in_chipset_prefs (struct uae_prefs *p) p->cs_ramseyrev = 0x0f; p->cs_ide = 2; p->cs_mbdmac = 2; + p->cs_ksmirror_a8 = 1; + p->cs_ciaoverlay = 0; break; } return 1; diff --git a/cia.c b/cia.c index d1d424aa..bd65ab6f 100644 --- a/cia.c +++ b/cia.c @@ -32,6 +32,8 @@ #include "debug.h" #include "arcadia.h" #include "audio.h" +#include "keyboard.h" +#include "uae.h" #include "amax.h" //#define CIAA_DEBUG_R @@ -333,6 +335,71 @@ STATIC_INLINE void ciaa_checkalarm (int inc) } } +static int resetwarning_phase, resetwarning_timer; + +static void setcode (uae_u8 keycode) +{ + ciaasdr = ~((keycode << 1) | (keycode >> 7)); +} + +static void sendrw (void) +{ + setcode (AK_RESETWARNING); + ciaaicr |= 8; + ciaasdr_unread = 1; + RethinkICRA (); + write_log ("KB: sent reset warning code (phase=%d)\n", resetwarning_phase); +} + +int resetwarning_do (int canreset) +{ + if (resetwarning_phase) { + /* just force reset if second reset happens during resetwarning */ + if (canreset) { + resetwarning_phase = 0; + resetwarning_timer = 0; + } + return 0; + } + resetwarning_phase = 1; + resetwarning_timer = maxvpos * 5; + write_log ("KB: reset warning triggered\n"); + sendrw (); + return 1; +} + +static void resetwarning_check (void) +{ + if (resetwarning_timer > 0) { + resetwarning_timer--; + if (resetwarning_timer <= 0) { + write_log ("KB: reset warning forced reset. Phase=%d\n", resetwarning_phase); + resetwarning_phase = -1; + uae_reset (0); + } + } + if (resetwarning_phase == 1) { + if (kback && !(ciaacra & 0x40) && ciaasdr_unread == 2) { + write_log ("KB: reset warning second phase..\n"); + resetwarning_phase = 2; + resetwarning_timer = maxvpos * 5; + sendrw (); + } + } else if (resetwarning_phase == 2) { + if (ciaacra & 0x40) { + resetwarning_phase = 3; + write_log ("KB: reset warning SP = output\n"); + resetwarning_timer = 10 * maxvpos * vblank_hz; /* wait max 10s */ + } + } else if (resetwarning_phase == 3) { + if (!(ciaacra & 0x40)) { + write_log ("KB: reset warning end by software. reset.\n"); + resetwarning_phase = -1; + uae_reset (0); + } + } +} + void CIA_hsync_handler (void) { if (ciabtodon) { @@ -341,7 +408,11 @@ void CIA_hsync_handler (void) ciab_checkalarm (1); } - if (keys_available() && kback && (ciaacra & 0x40) == 0 && (hsync_counter & 15) == 0) { + if (resetwarning_phase) { + resetwarning_check (); + while (keys_available ()) + get_next_key (); + } else if ((keys_available() || kbstate < 2) && kback && (ciaacra & 0x40) == 0 && (hsync_counter & 15) == 0) { /* * This hack lets one possible ciaaicr cycle go by without any key * being read, for every cycle in which a key is pulled out of the @@ -359,12 +430,12 @@ void CIA_hsync_handler (void) } else if (ciaasdr_unread == 0) { switch (kbstate) { case 0: - ciaasdr = (uae_s8)~0xFB; /* aaarghh... stupid compiler */ + setcode (AK_INIT_POWERUP); kbstate++; break; case 1: + setcode (AK_TERM_POWERUP); kbstate++; - ciaasdr = (uae_s8)~0xFD; break; case 2: ciaasdr = ~get_next_key(); @@ -442,8 +513,8 @@ static void bfe001_change (void) oldovl = v & 1; if (!oldovl || ersatzkickfile) { map_overlay (1); - } else if (!(currprefs.chipset_mask & CSMASK_AGA)) { - /* pin disconnected in AGA chipset, CD audio mute on/off on CD32 */ + } else if (currprefs.cs_ciaoverlay) { + /* Gayle does this internally, CIA pin disconnected, CD audio mute on/off on CD32 */ map_overlay (0); } } @@ -979,6 +1050,7 @@ void CIA_reset (void) serbits = 0; oldovl = -1; oldled = -1; + resetwarning_phase = resetwarning_timer = 0; if (!savestate_state) { ciaatlatch = ciabtlatch = 0; @@ -1222,7 +1294,7 @@ static void REGPARAM3 clock_bput (uaecptr, uae_u32) REGPARAM; addrbank clock_bank = { clock_lget, clock_wget, clock_bget, clock_lput, clock_wput, clock_bput, - default_xlate, default_check, NULL, "Battery backed up clock", + default_xlate, default_check, NULL, "Battery backed up clock (none)", dummy_lgeti, dummy_wgeti, ABFLAG_IO }; diff --git a/debug.c b/debug.c index ab79b96d..4132bae4 100644 --- a/debug.c +++ b/debug.c @@ -118,7 +118,7 @@ static char help[] = { " W
Write into Amiga memory\n" " w
[] (read/write/opcode/freeze)\n" " Add/remove memory watchpoints\n" - " wd [<0-1>] Enable illegal access logger. 1 = break when detected.\n" + " wd [<0-1>] Enable illegal access logger. 1 = enable break.\n" " S Save a block of Amiga memory\n" " s \"\"/ [] []\n" " Search for string/bytes\n" @@ -130,8 +130,9 @@ static char help[] = { " Also enables level 1 disk logging\n" " did Enable disk logging\n" " dj [] Enable joystick/mouse input debugging\n" - " smc [<0-1>] Enable self-modifying code detector. 1 = break when detected.\n" + " smc [<0-1>] Enable self-modifying code detector. 1 = enable break.\n" " dm Dump current address space map\n" + " ? Hex/Bin/Dec converter\n" #ifdef _WIN32 " x Close debugger.\n" " xx Switch between console and GUI debugger.\n" @@ -144,7 +145,25 @@ void debug_help (void) console_out (help); } +static int debug_linecounter; +#define MAX_LINECOUNTER 1000 +static int debug_out (const char *format,...) +{ + va_list parms; + char buffer[4000]; + + va_start (parms, format); + _vsnprintf (buffer, 4000 - 1, format, parms); + va_end (parms); + + console_out (buffer); + if (debug_linecounter < MAX_LINECOUNTER) + debug_linecounter++; + if (debug_linecounter >= MAX_LINECOUNTER) + return 0; + return 1; +} static void ignore_ws (char **c) { @@ -153,16 +172,85 @@ static void ignore_ws (char **c) } static uae_u32 readint (char **c); -static uae_u32 readhex (char **c) +static uae_u32 readbin (char **c); +static uae_u32 readhex (char **c); + +static int readregx (char **c, uae_u32 *valp) +{ + int i; + uae_u32 addr; + char *p = *c; + char tmp[10]; + int extra = 0; + + addr = 0; + i = 0; + while (p[i]) { + tmp[i] = toupper(p[i]); + if (i >= sizeof (tmp) - 1) + break; + i++; + } + tmp[i] = 0; + if (toupper (tmp[0]) == 'R') { + memmove (tmp, tmp + 1, sizeof (tmp) - 1); + extra = 1; + } + if (!strcmp(tmp, "USP")) { + addr = regs.usp; + (*c) += 3; + } else if (!strcmp(tmp, "VBR")) { + addr = regs.vbr; + (*c) += 3; + } else if (!strcmp(tmp, "MSP")) { + addr = regs.msp; + (*c) += 3; + } else if (!strcmp(tmp, "ISP")) { + addr = regs.isp; + (*c) += 3; + } else if (!strcmp(tmp, "PC")) { + addr = regs.pc; + (*c) += 2; + } else if (tmp[0] == 'A' || tmp[0] == 'D') { + int reg = 0; + if (tmp[0] == 'A') + reg += 8; + reg += tmp[1] - '0'; + if (reg < 0 || reg > 15) + return 0; + addr = regs.regs[reg]; + (*c) += 2; + } else { + return 0; + } + *valp = addr; + (*c) += extra; + return 1; +} + +static uae_u32 readbinx (char **c) { uae_u32 val = 0; - char nc; ignore_ws (c); - if (**c == '!' || **c == '_') { + for (;;) { + char nc = **c; + if (nc != '1' && nc != '0') + break; (*c)++; - return readint (c); + val <<= 1; + if (nc == '1') + val |= 1; } + return val; +} + +static uae_u32 readhexx (char **c) +{ + uae_u32 val = 0; + char nc; + + ignore_ws (c); while (isxdigit(nc = **c)) { (*c)++; val *= 16; @@ -176,21 +264,13 @@ static uae_u32 readhex (char **c) return val; } -static uae_u32 readint (char **c) +static uae_u32 readintx (char **c) { uae_u32 val = 0; char nc; int negative = 0; ignore_ws (c); - if (**c == '$') { - (*c)++; - return readhex (c); - } - if (**c == '0' && toupper((*c)[1]) == 'X') { - (*c)+= 2; - return readhex (c); - } if (**c == '-') negative = 1, (*c)++; while (isdigit(nc = **c)) { @@ -201,6 +281,62 @@ static uae_u32 readint (char **c) return val * (negative ? -1 : 1); } + +static int checkvaltype (char **c, uae_u32 *val) +{ + char nc; + + ignore_ws (c); + nc = toupper(**c); + if (nc == '!') { + (*c)++; + *val = readintx (c); + return 1; + } + if (nc == '$') { + (*c)++; + *val = readhexx (c); + return 1; + } + if (nc == '0' && toupper((*c)[1]) == 'X') { + (*c)+= 2; + *val = readhexx (c); + return 1; + } + if (nc == '%') { + (*c)++; + *val = readbinx (c); + return 1; + } + if (nc >= 'A' && nc <= 'Z' && nc != 'A' && nc != 'D') { + if (readregx (c, val)) + return 1; + } + return 0; +} + +static uae_u32 readint (char **c) +{ + uae_u32 val; + if (checkvaltype (c, &val)) + return val; + return readintx (c); +} +static uae_u32 readhex (char **c) +{ + uae_u32 val; + if (checkvaltype (c, &val)) + return val; + return readhexx (c); +} +static uae_u32 readbin (char **c) +{ + uae_u32 val; + if (checkvaltype (c, &val)) + return val; + return readbinx (c); +} + static char next_char(char **c) { ignore_ws (c); @@ -247,6 +383,19 @@ static int next_string (char **c, char *out, int max, int forceupper) return strlen (out); } +static void converter (char **c) +{ + uae_u32 v = readint (c); + char s[100]; + char *p = s; + int i; + + for (i = 0; i < 32; i++) + s[i] = (v & (1 << (31 - i))) ? '1' : '0'; + s[i] = 0; + console_out ("0x%08X = %%%s = %u = %d\n", v, s, v, (uae_s32)v); +} + static uae_u32 lastaddr (void) { if (currprefs.z3fastmem_size) @@ -405,49 +554,11 @@ static void dumpmem (uaecptr addr, uaecptr *nxmem, int lines) char line[MAX_LINEWIDTH + 1]; for (;lines--;) { addr = dumpmem2 (addr, line, sizeof(line)); - console_out ("%s", line); - console_out ("\n"); - } - *nxmem = addr; -} - -static void dumpmemreg (char **inptr) -{ - int i; - char *p = *inptr; - uaecptr nxmem, addr; - char tmp[10]; - - addr = 0; - i = 0; - while (p[i]) { - tmp[i] = toupper(p[i]); - if (i >= sizeof (tmp) - 1) + debug_out ("%s", line); + if (!debug_out ("\n")) break; - i++; } - tmp[i] = 0; - if (!strcmp(tmp, "USP")) - addr = regs.usp; - if (!strcmp(tmp, "VBR")) - addr = regs.vbr; - if (!strcmp(tmp, "MSP")) - addr = regs.msp; - if (!strcmp(tmp, "ISP")) - addr = regs.isp; - if (!strcmp(tmp, "PC")) - addr = regs.pc; - if (toupper(p[0]) == 'A' || toupper(p[0]) == 'D') { - int reg = 0; - if (toupper(p[0]) == 'A') - reg += 8; - reg += p[1] - '0'; - if (reg < 0 || reg > 15) - return; - addr = regs.regs[reg]; - } - addr -= 16; - dumpmem (addr, &nxmem, 20); + *nxmem = addr; } static void dump_custom_regs (int aga) @@ -834,7 +945,7 @@ static void deepcheatsearch (char **c) *p1++ = get_byte (i); addr = end - 1; } - console_out("Deep trainer first pass complete.\n"); + console_out ("Deep trainer first pass complete.\n"); return; } inconly = deconly = 0; @@ -941,7 +1052,7 @@ static void cheatsearch (char **c) ignore_ws (c); if (!more_params(c)) { first = 1; - console_out("search reset\n"); + console_out ("search reset\n"); xfree (vlist); listsize = memsize; vlist = (uae_u8*)xcalloc (listsize >> 3, 1); @@ -1088,8 +1199,10 @@ static void illg_init (void) memset (illgdebug + 0xe00000, 1, 512 * 1024); /* CD32 ext ROM */ } #endif - if (currprefs.cs_ksmirror) + if (currprefs.cs_ksmirror_e0) memset (illgdebug + 0xe00000, 1, 512 * 1024); + if (currprefs.cs_ksmirror_a8) + memset (illgdebug + 0xa80000, 1, 2 * 512 * 1024); #ifdef FILESYS if (uae_boot_rom) /* filesys "rom" */ memset (illgdebug + rtarea_base, 1, 0x10000); @@ -1185,7 +1298,7 @@ static void smc_detect_init (char **c) initialize_memwatch (0); if (v) smc_mode = 1; - console_out("SMCD enabled. Break=%d\n", smc_mode); + console_out ("SMCD enabled. Break=%d\n", smc_mode); } #define SMC_MAXHITS 8 @@ -1227,12 +1340,12 @@ static void smc_detector (uaecptr addr, int rwi, int size, uae_u32 *valp) } if (hitcnt < 100) { smc_table[hitaddr].cnt++; - console_out("SMC at %08.8X - %08.8X (%d) from %08.8X\n", + console_out ("SMC at %08.8X - %08.8X (%d) from %08.8X\n", hitaddr, hitaddr + hitcnt, hitcnt, hitpc); if (smc_mode) activate_debugger (); if (smc_table[hitaddr].cnt >= SMC_MAXHITS) - console_out("* hit count >= %d, future hits ignored\n", SMC_MAXHITS); + console_out ("* hit count >= %d, future hits ignored\n", SMC_MAXHITS); } } @@ -1675,19 +1788,6 @@ static void memwatch (char **c) memwatch_dump (num); } -static void writeintoreg (char **c) -{ - char cc, cc2; - - ignore_ws(c); - cc = toupper(*c[0]); - cc2 = toupper(*c[1]); - if ((cc == 'D' || cc == 'A') && cc2 >= '0' && cc2 <= '7') { - - - } -} - static void writeintomem (char **c) { uae_u32 addr = 0; @@ -1789,12 +1889,12 @@ static void memory_map_dump_2 (int log) if (log) write_log (txt); else - console_out(txt); + console_out (txt); if (tmp[0]) { if (log) write_log (tmp); else - console_out(tmp); + console_out (tmp); } j = i; a1 = a2; @@ -2142,7 +2242,7 @@ static void disk_debug(char **inptr) (*inptr)++; ignore_ws(inptr); disk_debug_logging = readint(inptr); - console_out("disk logging level %d\n", disk_debug_logging); + console_out ("disk logging level %d\n", disk_debug_logging); return; } disk_debug_mode = 0; @@ -2165,7 +2265,7 @@ static void disk_debug(char **inptr) if (disk_debug_logging == 0) disk_debug_logging = 1; end: - console_out("disk breakpoint mode %c%c%c track %d\n", + console_out ("disk breakpoint mode %c%c%c track %d\n", disk_debug_mode & DISK_DEBUG_DMA_READ ? 'R' : '-', disk_debug_mode & DISK_DEBUG_DMA_WRITE ? 'W' : '-', disk_debug_mode & DISK_DEBUG_PIO ? 'P' : '-', @@ -2176,6 +2276,7 @@ static void find_ea (char **inptr) { uae_u32 ea, sea, dea; uaecptr addr, end; + int hits = 0; addr = 0; end = lastaddr(); @@ -2185,14 +2286,20 @@ static void find_ea (char **inptr) if (more_params(inptr)) end = readhex (inptr); } - console_out("Searching from %08.8X to %08.8X\n", addr, end); + console_out ("Searching from %08X to %08X\n", addr, end); while((addr = nextaddr(addr, &end)) != 0xffffffff) { if ((addr & 1) == 0 && addr + 6 <= end) { sea = 0xffffffff; dea = 0xffffffff; m68k_disasm_ea (NULL, addr, NULL, 1, &sea, &dea); - if (ea == sea || ea == dea) + if (ea == sea || ea == dea) { m68k_disasm (stdout, addr, NULL, 1); + hits++; + if (hits > 100) { + write_log ("Too many hits. End addr = %08X\n", addr); + break; + } + } } } } @@ -2230,9 +2337,13 @@ static void m68k_modify (char **inptr) } else if (!strcmp (parm, "CCR")) { regs.sr = (regs.sr & ~31) | (v & 31); MakeFromSR (®s); + } else if (!strcmp(parm, "USP")) { + regs.usp = v; + } else if (!strcmp(parm, "ISP")) { + regs.isp = v; } else if (!strcmp (parm, "PC")) { m68k_setpc (®s, v); - fill_prefetch_slow(®s); + fill_prefetch_slow (®s); } else { for (i = 0; m2cregs[i].regname; i++) { if (!strcmp (parm, m2cregs[i].regname)) @@ -2259,14 +2370,17 @@ static void debug_1 (void) update_debug_info(); console_out (">"); console_flush (); + debug_linecounter = 0; v = console_get (input, MAX_LINEWIDTH); if (v < 0) return; if (v == 0) continue; + inptr = input; cmd = next_char (&inptr); - switch (cmd) { + switch (cmd) + { case 'c': dumpcia (); dumpdisk (); dumpcustom (); break; case 'i': addr = 0xffffffff; @@ -2435,13 +2549,7 @@ static void debug_1 (void) uae_u32 maddr; int lines; if (more_params(&inptr)) { - if (toupper(inptr[0]) == 'R') { - inptr++; - dumpmemreg(&inptr); - break; - } else { - maddr = readhex(&inptr); - } + maddr = readhex(&inptr); } else { maddr = nxmem; } @@ -2486,7 +2594,10 @@ static void debug_1 (void) break; case 'h': case '?': - debug_help (); + if (more_params (&inptr)) + converter (&inptr); + else + debug_help (); break; } } @@ -2495,8 +2606,8 @@ static void debug_1 (void) static void addhistory(void) { uae_u32 pc = m68k_getpc (®s); - if (!notinrom()) - return; +// if (!notinrom()) +// return; history[lasthist] = regs; history[lasthist].pc = m68k_getpc (®s); if (++lasthist == MAX_HIST) diff --git a/drawing.c b/drawing.c index 62b42457..6ba84f29 100644 --- a/drawing.c +++ b/drawing.c @@ -2593,8 +2593,8 @@ void vsync_handle_redraw (int long_frame, int lof_changed) if (currprefs.gfx_afullscreen && currprefs.gfx_avsync) flush_screen (0, 0); /* vsync mode */ } - gui_hd_led (0); - gui_cd_led (0); + gui_hd_led (-1, 0); + gui_cd_led (-1, 0); #ifdef AVIOUTPUT frame_drawn (); #endif diff --git a/filesys.c b/filesys.c index 8721a797..bb67541d 100644 --- a/filesys.c +++ b/filesys.c @@ -3163,7 +3163,7 @@ static void action_examine_next (Unit *unit, dpacket packet) uae_u32 uniq; TRACE(("ACTION_EXAMINE_NEXT(0x%lx,0x%lx)\n", lock, info)); - gui_hd_led (1); + gui_hd_led (unit->unit, 1); DUMPLOCK(unit, lock); if (lock != 0) @@ -3472,7 +3472,7 @@ action_read (Unit *unit, dpacket packet) return; } TRACE(("ACTION_READ(%s,0x%lx,%ld)\n",k->aino->nname,addr,size)); - gui_hd_led (1); + gui_hd_led (unit->unit, 1); #ifdef RELY_ON_LOADSEG_DETECTION /* HACK HACK HACK HACK * Try to detect a LoadSeg() */ @@ -3552,7 +3552,7 @@ action_write (Unit *unit, dpacket packet) return; } - gui_hd_led (2); + gui_hd_led (unit->unit, 2); TRACE(("ACTION_WRITE(%s,0x%lx,%ld)\n",k->aino->nname,addr,size)); if (unit->ui.readonly) { @@ -3613,7 +3613,7 @@ action_seek (Unit *unit, dpacket packet) if (mode < 0) whence = SEEK_SET; TRACE(("ACTION_SEEK(%s,%d,%d)\n", k->aino->nname, pos, mode)); - gui_hd_led (1); + gui_hd_led (unit->unit, 1); old = fs_lseek (unit, k->fd, 0, SEEK_CUR); { @@ -3679,7 +3679,7 @@ action_set_protect (Unit *unit, dpacket packet) PUT_PCK_RES1 (packet, DOS_TRUE); } notify_check (unit, a); - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void action_set_comment (Unit * unit, dpacket packet) @@ -3731,7 +3731,7 @@ static void action_set_comment (Unit * unit, dpacket packet) a->comment = commented; fsdb_set_file_attrs (a); notify_check (unit, a); - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void @@ -3919,7 +3919,7 @@ action_create_dir (Unit *unit, dpacket packet) notify_check (unit, aino); updatedirtime (aino, 0); PUT_PCK_RES1 (packet, make_lock (unit, aino->uniq, -2) >> 2); - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void @@ -3969,7 +3969,7 @@ action_set_file_size (Unit *unit, dpacket packet) return; } - gui_hd_led (1); + gui_hd_led (unit->unit, 1); k->notifyactive = 1; /* If any open files have file pointers beyond this size, truncate only * so far that these pointers do not become invalid. */ @@ -4107,7 +4107,7 @@ action_delete_object (Unit *unit, dpacket packet) delete_aino (unit, a); } PUT_PCK_RES1 (packet, DOS_TRUE); - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void @@ -4140,7 +4140,7 @@ action_set_date (Unit *unit, dpacket packet) notify_check (unit, a); PUT_PCK_RES1 (packet, DOS_TRUE); } - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void @@ -4246,7 +4246,7 @@ action_rename_object (Unit *unit, dpacket packet) if (a2->elock > 0 || a2->shlock > 0 || wehavekeys > 0) de_recycle_aino (unit, a2); PUT_PCK_RES1 (packet, DOS_TRUE); - gui_hd_led (2); + gui_hd_led (unit->unit, 2); } static void diff --git a/gayle.c b/gayle.c index 644c03ee..2f2b3ae0 100644 --- a/gayle.c +++ b/gayle.c @@ -358,7 +358,7 @@ static void ide_read_sectors (int multi) ide_fail (); return; } - gui_hd_led (1); + gui_hd_led (ide->num, 1); nsec = ide_nsector == 0 ? 256 : ide_nsector; get_lbachs (ide, &lba, &cyl, &head, &sec); if (IDE_LOG > 0) @@ -384,7 +384,7 @@ static void ide_write_sectors (int multi) ide_fail (); return; } - gui_hd_led (2); + gui_hd_led (ide->num, 2); nsec = ide_nsector == 0 ? 256 : ide_nsector; get_lbachs (ide, &lba, &cyl, &head, &sec); if (lba * 512 >= ide->hdhfd.size) { @@ -1181,7 +1181,6 @@ static void checkflush (int addr) int len = end - start; if (len > 0) { hdf_write (&pcmcia_sram->hfd, pcmcia_common + start, start, len); - write_log ("write %d %d\n", start, len); pcmcia_write_min = -1; } } diff --git a/hardfile.c b/hardfile.c index dd8bd3b7..1ba76480 100644 --- a/hardfile.c +++ b/hardfile.c @@ -363,7 +363,7 @@ int hdf_hd_open(struct hd_hardfiledata *hfd, char *path, int blocksize, int read static uae_u64 cmd_readx (struct hardfiledata *hfd, uae_u8 *dataptr, uae_u64 offset, uae_u64 len) { - gui_hd_led (1); + gui_hd_led (hfd->unitnum, 1); hf_log3 ("cmd_read: %p %04.4x-%08.8x (%d) %08.8x (%d)\n", dataptr, (uae_u32)(offset >> 32), (uae_u32)offset, (uae_u32)(offset / hfd->blocksize), (uae_u32)len, (uae_u32)(len / hfd->blocksize)); return hdf_read (hfd, dataptr, offset, len); @@ -377,7 +377,7 @@ static uae_u64 cmd_read (struct hardfiledata *hfd, uaecptr dataptr, uae_u64 offs } static uae_u64 cmd_writex (struct hardfiledata *hfd, uae_u8 *dataptr, uae_u64 offset, uae_u64 len) { - gui_hd_led (2); + gui_hd_led (hfd->unitnum, 2); hf_log3 ("cmd_write: %p %04.4x-%08.8x (%d) %08.8x (%d)\n", dataptr, (uae_u32)(offset >> 32), (uae_u32)offset, (uae_u32)(offset / hfd->blocksize), (uae_u32)len, (uae_u32)(len / hfd->blocksize)); return hdf_write (hfd, dataptr, offset, len); diff --git a/include/cia.h b/include/cia.h index e2234601..dd61df70 100644 --- a/include/cia.h +++ b/include/cia.h @@ -17,6 +17,7 @@ extern void cia_diskindex (void); extern void dumpcia (void); extern void rethink_cias (void); +extern int resetwarning_do (int); extern int parallel_direct_write_data (uae_u8, uae_u8); extern int parallel_direct_read_data (uae_u8*); diff --git a/include/filesys.h b/include/filesys.h index 1ed0f596..e5a36db4 100644 --- a/include/filesys.h +++ b/include/filesys.h @@ -34,6 +34,7 @@ struct hardfiledata { int warned; uae_u8 *virtual_rdb; uae_u64 virtual_size; + int unitnum; int drive_empty; char *emptyname; diff --git a/include/gui.h b/include/gui.h index 8461386b..407fb263 100644 --- a/include/gui.h +++ b/include/gui.h @@ -16,8 +16,8 @@ extern void gui_fps (int fps, int idle); extern void gui_changesettings (void); extern void gui_lock (void); extern void gui_unlock (void); -extern void gui_hd_led (int); -extern void gui_cd_led (int); +extern void gui_hd_led (int, int); +extern void gui_cd_led (int, int); extern unsigned int gui_ledstate; extern void gui_display(int shortcut); diff --git a/include/newcpu.h b/include/newcpu.h index 593af345..6f5731fb 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -131,7 +131,6 @@ extern struct regstruct #endif uae_u32 pcr; - uae_u32 kick_mask; uae_u32 address_space_mask; uae_u8 panic; diff --git a/include/options.h b/include/options.h index 9f0d45ed..aa48032f 100644 --- a/include/options.h +++ b/include/options.h @@ -205,7 +205,9 @@ struct uae_prefs { int cs_rtc; int cs_rtc_adjust; int cs_rtc_adjust_mode; - int cs_ksmirror; + int cs_ksmirror_e0; + int cs_ksmirror_a8; + int cs_ciaoverlay; int cs_cd32cd; int cs_cd32c2p; int cs_cd32nvram; @@ -224,6 +226,7 @@ struct uae_prefs { int cs_a2091, cs_a4091; int cs_df0idhw; int cs_slowmemisfast; + int cs_resetwarning; char df[4][MAX_DPATH]; char dfxlist[MAX_SPARE_DRIVES][MAX_DPATH]; diff --git a/inputdevice.c b/inputdevice.c index aab37ee4..c8e54b2e 100644 --- a/inputdevice.c +++ b/inputdevice.c @@ -1510,8 +1510,13 @@ void inputdevice_do_keyboard (int code, int state) if (code < 0x80) { uae_u8 key = code | (state ? 0x00 : 0x80); keybuf[key & 0x7f] = (key & 0x80) ? 0 : 1; - if (((keybuf[AK_CTRL] || keybuf[AK_RCTRL]) && keybuf[AK_LAMI] && keybuf[AK_RAMI]) || key == AK_RESETWARNING) { + if (key == AK_RESETWARNING) { + resetwarning_do (0); + return; + } else if ((keybuf[AK_CTRL] || keybuf[AK_RCTRL]) && keybuf[AK_LAMI] && keybuf[AK_RAMI]) { int r = keybuf[AK_LALT] | keybuf[AK_RALT]; + if (!r && currprefs.cs_resetwarning && resetwarning_do (1)) + return; memset (keybuf, 0, sizeof (keybuf)); uae_reset (r); } @@ -1959,11 +1964,12 @@ static int getoldport (struct uae_input_device *id) static int switchdevice (struct uae_input_device *id, int num, int button) { - int i; + int i, j; int ismouse = 0; int newport = 0; int flags = 0; char *name = NULL; + int otherbuttonpressed = 0; if (num >= 4) return 0; @@ -1974,6 +1980,13 @@ static int switchdevice (struct uae_input_device *id, int num, int button) name = idev[IDTYPE_JOYSTICK].get_uniquename (i); newport = num == 0 ? 1 : 0; flags = idev[IDTYPE_JOYSTICK].get_flags (i); + for (j = 0; j < MAX_INPUT_DEVICES; j++) { + if (j != i) { + struct uae_input_device2 *id2 = &joysticks2[j]; + if (id2->buttonmask) + otherbuttonpressed = 1; + } + } } if (id == &mice[i]) { ismouse = 1; @@ -1984,6 +1997,8 @@ static int switchdevice (struct uae_input_device *id, int num, int button) } if (!name) return 0; + if (num == 0 && otherbuttonpressed) + newport = newport ? 0 : 1; if (!currprefs.input_selected_setting) { if (num == 0 || num == 1) { int om = jsem_ismouse (num, &currprefs); diff --git a/main.c b/main.c index 412b436c..96e8de4e 100644 --- a/main.c +++ b/main.c @@ -180,7 +180,7 @@ void fixup_prefs (struct uae_prefs *p) if ((p->gfxmem_size & (p->gfxmem_size - 1)) != 0 || (p->gfxmem_size != 0 && (p->gfxmem_size < 0x100000 || p->gfxmem_size > max_z3fastmem / 2))) { - write_log ("Unsupported graphics card memory size %x!\n", p->gfxmem_size); + write_log ("Unsupported graphics card memory size %x (%x)!\n", p->gfxmem_size, max_z3fastmem / 2); if (p->gfxmem_size > max_z3fastmem / 2) p->gfxmem_size = max_z3fastmem / 2; else @@ -190,11 +190,11 @@ void fixup_prefs (struct uae_prefs *p) if ((p->z3fastmem_size & (p->z3fastmem_size - 1)) != 0 || (p->z3fastmem_size != 0 && (p->z3fastmem_size < 0x100000 || p->z3fastmem_size > max_z3fastmem))) { + write_log ("Unsupported Zorro III fastmem size %x (%x)!\n", p->z3fastmem_size, max_z3fastmem); if (p->z3fastmem_size > max_z3fastmem) p->z3fastmem_size = max_z3fastmem; else p->z3fastmem_size = 0; - write_log ("Unsupported Zorro III fastmem size!\n"); err = 1; } p->z3fastmem_start &= ~0xffff; diff --git a/memory.c b/memory.c index 8b831527..eaf14375 100644 --- a/memory.c +++ b/memory.c @@ -461,6 +461,28 @@ int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size) return get_keyring(); } +static int decode_rekick_rom_do (uae_u8 *mem, int size, int real_size) +{ + uae_u32 d1 = 0xdeadfeed, d0; + int i; + + for (i = 0; i < size / 8; i++) { + d0 = ((mem[i * 8 + 0] << 24) | (mem[i * 8 + 1] << 16) | (mem[i * 8 + 2] << 8) | mem[i * 8 + 3]); + d1 = d1 ^ d0; + mem[i * 8 + 0] = d1 >> 24; + mem[i * 8 + 1] = d1 >> 16; + mem[i * 8 + 2] = d1 >> 8; + mem[i * 8 + 3] = d1; + d1 = ((mem[i * 8 + 4] << 24) | (mem[i * 8 + 5] << 16) | (mem[i * 8 + 6] << 8) | mem[i * 8 + 7]); + d0 = d0 ^ d1; + mem[i * 8 + 4] = d0 >> 24; + mem[i * 8 + 5] = d0 >> 16; + mem[i * 8 + 6] = d0 >> 8; + mem[i * 8 + 7] = d0; + } + return 1; +} + static void addkey(int *pkeyid, uae_u8 *key, int size, const char *name) { int keyid = *pkeyid; @@ -602,15 +624,21 @@ void free_keyring (void) memset(keyring, 0, sizeof (struct rom_key) * ROM_KEY_NUM); } -static int decode_cloanto_rom (uae_u8 *mem, int size, int real_size) +static int decode_rom (uae_u8 *mem, int size, int mode, int real_size) { - if (!decode_cloanto_rom_do (mem, size, real_size)) { - #ifndef SINGLEFILE - notify_user (NUMSG_NOROMKEY); - #endif - return 0; + if (mode == 1) { + if (!decode_cloanto_rom_do (mem, size, real_size)) { + #ifndef SINGLEFILE + notify_user (NUMSG_NOROMKEY); + #endif + return 0; + } + return 1; + } else if (mode == 2) { + decode_rekick_rom_do (mem, size, real_size); + return 1; } - return 1; + return 0; } struct romdata *getromdatabyname (char *name) @@ -697,10 +725,20 @@ struct romdata *getromdatabydata (uae_u8 *rom, int size) uae_u8 *tmpbuf = (uae_u8*)xmalloc (size); int tmpsize = size - 11; memcpy (tmpbuf, rom + 11, tmpsize); - decode_cloanto_rom (tmpbuf, tmpsize, tmpsize); + decode_rom (tmpbuf, tmpsize, 1, tmpsize); rom = tmpbuf; size = tmpsize; } +#if 0 + if (size > 0x6c + 524288 && !memcmp (rom, "AMIG", 4)) { + uae_u8 *tmpbuf = (uae_u8*)xmalloc (size); + int tmpsize = size - 0x6c; + memcpy (tmpbuf, rom + 0x6c, tmpsize); + decode_rom (tmpbuf, tmpsize, 2, tmpsize); + rom = tmpbuf; + size = tmpsize; + } +#endif get_sha1 (rom, size, sha1); ret = checkromdata(sha1, size, -1); if (!ret) { @@ -851,7 +889,7 @@ int addr_valid(char *txt, uaecptr addr, uae_u32 len) } uae_u32 chipmem_mask, chipmem_full_mask; -uae_u32 kickmem_mask, extendedkickmem_mask, bogomem_mask; +uae_u32 kickmem_mask, extendedkickmem_mask, extendedkickmem2_mask, bogomem_mask; uae_u32 a3000lmem_mask, a3000hmem_mask, cardmem_mask; static int illegal_count; @@ -1630,9 +1668,9 @@ static uae_u8 *REGPARAM2 kickmem_xlate (uaecptr addr) /* CD32/CDTV extended kick memory */ -uae_u8 *extendedkickmemory; -static int extendedkickmem_size; -static uae_u32 extendedkickmem_start; +uae_u8 *extendedkickmemory, *extendedkickmemory2; +static int extendedkickmem_size, extendedkickmem2_size; +static uae_u32 extendedkickmem_start, extendedkickmem2_start; static int extendedkickmem_type; #define EXTENDED_ROM_CD32 1 @@ -1648,7 +1686,6 @@ static void REGPARAM3 extendedkickmem_wput (uaecptr, uae_u32) REGPARAM; static void REGPARAM3 extendedkickmem_bput (uaecptr, uae_u32) REGPARAM; static int REGPARAM3 extendedkickmem_check (uaecptr addr, uae_u32 size) REGPARAM; static uae_u8 *REGPARAM3 extendedkickmem_xlate (uaecptr addr) REGPARAM; - static uae_u32 REGPARAM2 extendedkickmem_lget (uaecptr addr) { uae_u32 *m; @@ -1657,7 +1694,6 @@ static uae_u32 REGPARAM2 extendedkickmem_lget (uaecptr addr) m = (uae_u32 *)(extendedkickmemory + addr); return do_get_mem_long (m); } - static uae_u32 REGPARAM2 extendedkickmem_wget (uaecptr addr) { uae_u16 *m; @@ -1666,14 +1702,12 @@ static uae_u32 REGPARAM2 extendedkickmem_wget (uaecptr addr) m = (uae_u16 *)(extendedkickmemory + addr); return do_get_mem_word (m); } - static uae_u32 REGPARAM2 extendedkickmem_bget (uaecptr addr) { addr -= extendedkickmem_start & extendedkickmem_mask; addr &= extendedkickmem_mask; return extendedkickmemory[addr]; } - static void REGPARAM2 extendedkickmem_lput (uaecptr addr, uae_u32 b) { #ifdef JIT @@ -1682,7 +1716,6 @@ static void REGPARAM2 extendedkickmem_lput (uaecptr addr, uae_u32 b) if (currprefs.illegal_mem) write_log ("Illegal extendedkickmem lput at %08lx\n", addr); } - static void REGPARAM2 extendedkickmem_wput (uaecptr addr, uae_u32 b) { #ifdef JIT @@ -1691,7 +1724,6 @@ static void REGPARAM2 extendedkickmem_wput (uaecptr addr, uae_u32 b) if (currprefs.illegal_mem) write_log ("Illegal extendedkickmem wput at %08lx\n", addr); } - static void REGPARAM2 extendedkickmem_bput (uaecptr addr, uae_u32 b) { #ifdef JIT @@ -1700,14 +1732,12 @@ static void REGPARAM2 extendedkickmem_bput (uaecptr addr, uae_u32 b) if (currprefs.illegal_mem) write_log ("Illegal extendedkickmem lput at %08lx\n", addr); } - static int REGPARAM2 extendedkickmem_check (uaecptr addr, uae_u32 size) { addr -= extendedkickmem_start & extendedkickmem_mask; addr &= extendedkickmem_mask; return (addr + size) <= extendedkickmem_size; } - static uae_u8 *REGPARAM2 extendedkickmem_xlate (uaecptr addr) { addr -= extendedkickmem_start & extendedkickmem_mask; @@ -1715,6 +1745,74 @@ static uae_u8 *REGPARAM2 extendedkickmem_xlate (uaecptr addr) return extendedkickmemory + addr; } +static uae_u32 REGPARAM3 extendedkickmem2_lget (uaecptr) REGPARAM; +static uae_u32 REGPARAM3 extendedkickmem2_wget (uaecptr) REGPARAM; +static uae_u32 REGPARAM3 extendedkickmem2_bget (uaecptr) REGPARAM; +static void REGPARAM3 extendedkickmem2_lput (uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2_wput (uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 extendedkickmem2_bput (uaecptr, uae_u32) REGPARAM; +static int REGPARAM3 extendedkickmem2_check (uaecptr addr, uae_u32 size) REGPARAM; +static uae_u8 *REGPARAM3 extendedkickmem2_xlate (uaecptr addr) REGPARAM; +static uae_u32 REGPARAM2 extendedkickmem2_lget (uaecptr addr) +{ + uae_u32 *m; + addr -= extendedkickmem2_start & extendedkickmem2_mask; + addr &= extendedkickmem2_mask; + m = (uae_u32 *)(extendedkickmemory2 + addr); + return do_get_mem_long (m); +} +static uae_u32 REGPARAM2 extendedkickmem2_wget (uaecptr addr) +{ + uae_u16 *m; + addr -= extendedkickmem2_start & extendedkickmem2_mask; + addr &= extendedkickmem2_mask; + m = (uae_u16 *)(extendedkickmemory2 + addr); + return do_get_mem_word (m); +} +static uae_u32 REGPARAM2 extendedkickmem2_bget (uaecptr addr) +{ + addr -= extendedkickmem2_start & extendedkickmem2_mask; + addr &= extendedkickmem2_mask; + return extendedkickmemory2[addr]; +} +static void REGPARAM2 extendedkickmem2_lput (uaecptr addr, uae_u32 b) +{ +#ifdef JIT + special_mem |= S_WRITE; +#endif + if (currprefs.illegal_mem) + write_log ("Illegal extendedkickmem2 lput at %08lx\n", addr); +} +static void REGPARAM2 extendedkickmem2_wput (uaecptr addr, uae_u32 b) +{ +#ifdef JIT + special_mem |= S_WRITE; +#endif + if (currprefs.illegal_mem) + write_log ("Illegal extendedkickmem2 wput at %08lx\n", addr); +} +static void REGPARAM2 extendedkickmem2_bput (uaecptr addr, uae_u32 b) +{ +#ifdef JIT + special_mem |= S_WRITE; +#endif + if (currprefs.illegal_mem) + write_log ("Illegal extendedkickmem2 lput at %08lx\n", addr); +} +static int REGPARAM2 extendedkickmem2_check (uaecptr addr, uae_u32 size) +{ + addr -= extendedkickmem2_start & extendedkickmem2_mask; + addr &= extendedkickmem2_mask; + return (addr + size) <= extendedkickmem2_size; +} +static uae_u8 *REGPARAM2 extendedkickmem2_xlate (uaecptr addr) +{ + addr -= extendedkickmem2_start & extendedkickmem2_mask; + addr &= extendedkickmem2_mask; + return extendedkickmemory2 + addr; +} + + /* Default memory access functions */ int REGPARAM2 default_check (uaecptr a, uae_u32 b) @@ -1836,6 +1934,12 @@ addrbank extendedkickmem_bank = { extendedkickmem_xlate, extendedkickmem_check, NULL, "Extended Kickstart ROM", extendedkickmem_lget, extendedkickmem_wget, ABFLAG_ROM }; +addrbank extendedkickmem2_bank = { + extendedkickmem2_lget, extendedkickmem2_wget, extendedkickmem2_bget, + extendedkickmem2_lput, extendedkickmem2_wput, extendedkickmem2_bput, + extendedkickmem2_xlate, extendedkickmem2_check, NULL, "Extended 2nd Kickstart ROM", + extendedkickmem2_lget, extendedkickmem2_wget, ABFLAG_ROM +}; static uae_u32 allocated_custmem1, allocated_custmem2; @@ -2063,6 +2167,12 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu if (!memcmp(buffer, "KICK", 4)) { zfile_fseek (f, 512, SEEK_SET); kickdisk = 1; +#if 0 + } else if (size >= 524288 && !memcmp (buffer, "AMIG", 4)) { + /* ReKick */ + zfile_fseek (f, oldpos + 0x6c, SEEK_SET); + cr = 2; +#endif } else if (strncmp ((char *)buffer, "AMIROMTYPE1", 11) != 0) { zfile_fseek (f, oldpos, SEEK_SET); } else { @@ -2084,7 +2194,7 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu memcpy (mem + size / 2, mem, size / 2); if (cr) { - if (!decode_cloanto_rom (mem, size, i)) + if (!decode_rom (mem, size, cr, i)) return 0; } if (currprefs.cs_a1000ram) { @@ -2328,6 +2438,11 @@ static int load_kickstart (void) } zfile_fseek (f, kspos, SEEK_SET); } + if (filesize >= 524288 * 4) { + kspos = 524288 * 3; + extpos = 0; + zfile_fseek (f, kspos, SEEK_SET); + } size = read_kickstart (f, kickmemory, maxsize, 1, &cloanto_rom, 0); if (size == 0) goto err; @@ -2335,13 +2450,28 @@ static int load_kickstart (void) kickmem_size = size; if (filesize >= 524288 * 2 && !extendedkickmem_type) { extendedkickmem_size = 0x80000; - extendedkickmem_type = EXTENDED_ROM_KS; - extendedkickmemory = (uae_u8 *) mapped_malloc (extendedkickmem_size, "rom_e0"); - extendedkickmem_bank.baseaddr = (uae_u8 *) extendedkickmemory; + if (currprefs.cs_cdtvcd || currprefs.cs_cdtvram) { + extendedkickmem_type = EXTENDED_ROM_CDTV; + extendedkickmemory = mapped_malloc (extendedkickmem_size, "rom_f0"); + } else { + extendedkickmem_type = EXTENDED_ROM_KS; + extendedkickmemory = mapped_malloc (extendedkickmem_size, "rom_e0"); + } + extendedkickmem_bank.baseaddr = extendedkickmemory; zfile_fseek (f, extpos, SEEK_SET); read_kickstart (f, extendedkickmemory, 0x80000, 0, 0, 1); extendedkickmem_mask = extendedkickmem_size - 1; } + if (filesize > 524288 * 2) { + extendedkickmem2_size = 524288 * 2; + extendedkickmemory2 = mapped_malloc (extendedkickmem2_size, "rom_a8"); + extendedkickmem2_bank.baseaddr = extendedkickmemory2; + zfile_fseek (f, extpos + 524288, SEEK_SET); + read_kickstart (f, extendedkickmemory2, 524288, 0, 0, 1); + zfile_fseek (f, extpos + 524288 * 2, SEEK_SET); + read_kickstart (f, extendedkickmemory2 + 524288, 524288, 0, 0, 1); + extendedkickmem2_mask = extendedkickmem2_size - 1; + } } #if defined(AMIGA) @@ -2672,10 +2802,20 @@ void map_overlay (int chip) if (currprefs.cpu_cycle_exact && currprefs.cpu_model >= 68020) cb = &chipmem_bank_ce2; #endif - if (chip) + if (chip) { map_banks (cb, 0, i, allocated_chipmem); - else - map_banks (&kickmem_bank, 0, i, 0x80000); + } else { + addrbank *rb = NULL; + cb = &get_mem_bank (0xf00000); + if (!rb && cb && (cb->flags & ABFLAG_ROM) && get_word (0xf00000) == 0x1114) + rb = cb; + cb = &get_mem_bank (0xe00000); + if (!rb && cb && (cb->flags & ABFLAG_ROM) && get_word (0xe00000) == 0x1114) + rb = cb; + if (!rb) + rb = &kickmem_bank; + map_banks (rb, 0, i, 0x80000); + } if (savestate_state != STATE_RESTORE && savestate_state != STATE_REWIND && valid_address (regs.pc, 4)) m68k_setpc (®s, m68k_getpc (®s)); } @@ -2683,13 +2823,16 @@ void map_overlay (int chip) void memory_reset (void) { int bnk, bnk_end; + int gayle; be_cnt = 0; currprefs.chipmem_size = changed_prefs.chipmem_size; currprefs.bogomem_size = changed_prefs.bogomem_size; currprefs.mbresmem_low_size = changed_prefs.mbresmem_low_size; currprefs.mbresmem_high_size = changed_prefs.mbresmem_high_size; - currprefs.cs_ksmirror = changed_prefs.cs_ksmirror; + currprefs.cs_ksmirror_e0 = changed_prefs.cs_ksmirror_e0; + currprefs.cs_ksmirror_a8 = changed_prefs.cs_ksmirror_a8; + currprefs.cs_ciaoverlay = changed_prefs.cs_ciaoverlay; currprefs.cs_cdtvram = changed_prefs.cs_cdtvram; currprefs.cs_cdtvcard = changed_prefs.cs_cdtvcard; currprefs.cs_a1000ram = changed_prefs.cs_a1000ram; @@ -2697,6 +2840,8 @@ void memory_reset (void) currprefs.cs_fatgaryrev = changed_prefs.cs_fatgaryrev; currprefs.cs_ramseyrev = changed_prefs.cs_ramseyrev; + gayle = (currprefs.chipset_mask & CSMASK_AGA) || currprefs.cs_pcmcia || currprefs.cs_ide > 0; + need_hardreset = 0; /* Use changed_prefs, as m68k_reset is called later. */ if (last_address_space_24 != changed_prefs.address_space_24) @@ -2722,6 +2867,8 @@ void memory_reset (void) mapped_free (extendedkickmemory); extendedkickmemory = 0; extendedkickmem_size = 0; + extendedkickmemory2 = 0; + extendedkickmem2_size = 0; extendedkickmem_type = 0; load_extendedkickstart (); kickmem_mask = 524288 - 1; @@ -2766,6 +2913,7 @@ void memory_reset (void) if (cloanto_rom) currprefs.maprom = changed_prefs.maprom = 0; + gayle = currprefs.cs_ksmirror_a8 || currprefs.cs_pcmcia || currprefs.cs_ide > 0; map_banks (&custom_bank, 0xC0, 0xE0 - 0xC0, 0); map_banks (&cia_bank, 0xA0, 32, 0); @@ -2777,9 +2925,9 @@ void memory_reset (void) bnk = allocated_chipmem >> 16; if (bnk < 0x20 + (currprefs.fastmem_size >> 16)) bnk = 0x20 + (currprefs.fastmem_size >> 16); - bnk_end = (((currprefs.chipset_mask & CSMASK_AGA) || currprefs.cs_pcmcia || currprefs.cs_ide > 0) ? 0xBF : 0xA0); + bnk_end = gayle ? 0xBF : 0xA0; map_banks (&dummy_bank, bnk, bnk_end - bnk, 0); - if (currprefs.chipset_mask & CSMASK_AGA) + if (gayle) map_banks (&dummy_bank, 0xc0, 0xd8 - 0xc0, 0); if (bogomemory != 0) { @@ -2809,6 +2957,8 @@ void memory_reset (void) } if (currprefs.cs_rtc || currprefs.cs_cdtvram) map_banks (&clock_bank, 0xDC, 1, 0); + else if (currprefs.cs_ksmirror_a8 || currprefs.cs_ide > 0 || currprefs.cs_pcmcia) + map_banks (&clock_bank, 0xDC, 1, 0); /* none clock */ if (currprefs.cs_fatgaryrev >= 0 || currprefs.cs_ramseyrev >= 0) map_banks (&mbres_bank, 0xDE, 1, 0); if (currprefs.cs_cd32c2p || currprefs.cs_cd32cd || currprefs.cs_cd32nvram) @@ -2867,13 +3017,20 @@ void memory_reset (void) #endif } - if ((cloanto_rom || currprefs.cs_ksmirror) && !currprefs.maprom && !extendedkickmem_type) + if ((cloanto_rom || currprefs.cs_ksmirror_e0) && !currprefs.maprom && !extendedkickmem_type) map_banks (&kickmem_bank, 0xE0, 8, 0); - if (currprefs.cs_ksmirror == 2) { /* unexpanded A1200 also maps ROM here.. */ - struct romdata *rd = getromdatabypath(currprefs.cartfile); - if (!rd || rd->id != 63) { - map_banks (&kickmem_bank, 0xA8, 8, 0); - map_banks (&kickmem_bank, 0xB0, 8, 0); + if (currprefs.cs_ksmirror_a8) { + if (extendedkickmem2_size) { + map_banks (&extendedkickmem2_bank, 0xa8, 16, 0); + } else { + struct romdata *rd = getromdatabypath(currprefs.cartfile); + if (!rd || rd->id != 63) { + if (extendedkickmem_type == EXTENDED_ROM_CD32 || extendedkickmem_type == EXTENDED_ROM_KS) + map_banks (&extendedkickmem_bank, 0xb0, 8, 0); + else + map_banks (&kickmem_bank, 0xb0, 8, 0); + map_banks (&kickmem_bank, 0xa8, 8, 0); + } } } @@ -2919,6 +3076,8 @@ void memory_init (void) kickmemory = 0; extendedkickmemory = 0; extendedkickmem_size = 0; + extendedkickmemory2 = 0; + extendedkickmem2_size = 0; extendedkickmem_type = 0; chipmemory = 0; allocated_a3000lmem = allocated_a3000hmem = 0; diff --git a/newcpu.c b/newcpu.c index 2f27618c..9b61e2a1 100644 --- a/newcpu.c +++ b/newcpu.c @@ -1080,6 +1080,7 @@ static void Exception_normal (int nr, struct regstruct *regs, uaecptr oldpc) put_word (m68k_areg (regs, 7) + 8, regs->sr); put_long (m68k_areg (regs, 7) + 10, last_addr_for_exception_3); write_log ("Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs->vbr + 4*nr)); + activate_debugger(); goto kludge_me_do; } m68k_areg (regs, 7) -= 4; @@ -1554,7 +1555,6 @@ void m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) void m68k_reset (int hardreset) { - regs.kick_mask = 0x00F80000; regs.spcflags = 0; #ifdef SAVESTATE if (savestate_state == STATE_RESTORE || savestate_state == STATE_REWIND) { @@ -1570,8 +1570,8 @@ void m68k_reset (int hardreset) return; } #endif - m68k_areg (®s, 7) = get_long (0x00f80000); - m68k_setpc (®s, get_long (0x00f80004)); + m68k_areg (®s, 7) = get_long (0); + m68k_setpc (®s, get_long (4)); regs.s = 1; regs.m = 0; regs.stopped = 0; @@ -2796,6 +2796,8 @@ void m68k_dumpstate (void *f, uaecptr *nextpc) f_out (f, "USP %08.8X ISP %08.8X ", regs.usp, regs.isp); for (i = 0; m2cregs[i].regno>= 0; i++) { if (!movec_illg (m2cregs[i].regno)) { + if (!strcmp (m2cregs[i].regname, "USP") || !strcmp (m2cregs[i].regname, "ISP")) + continue; if (j > 0 && (j % 4) == 0) f_out (f, "\n"); f_out (f, "%-4s %08.8X ", m2cregs[i].regname, val_move2c (m2cregs[i].regno)); diff --git a/od-win32/blkdev_win32_aspi.c b/od-win32/blkdev_win32_aspi.c index def901b2..5e1f3be9 100644 --- a/od-win32/blkdev_win32_aspi.c +++ b/od-win32/blkdev_win32_aspi.c @@ -724,9 +724,9 @@ static void aspi_led (int unitnum) int type = si[unitnum].type; if (type == INQ_ROMD) - gui_cd_led (1); + gui_cd_led (unitnum, 1); else if (type == INQ_DASD) - gui_hd_led (1); + gui_hd_led (unitnum, 1); } static uae_sem_t scgp_sem; diff --git a/od-win32/blkdev_win32_ioctl.c b/od-win32/blkdev_win32_ioctl.c index 474e1e21..93e1377d 100644 --- a/od-win32/blkdev_win32_ioctl.c +++ b/od-win32/blkdev_win32_ioctl.c @@ -491,7 +491,7 @@ static uae_u8 *spti_read (int unitnum, int sector, int sectorsize) cmd[3] = (uae_u8)(sector >> 16); cmd[4] = (uae_u8)(sector >> 8); cmd[5] = (uae_u8)(sector >> 0); - gui_cd_led (1); + gui_cd_led (unitnum, 1); memset (&swb, 0, sizeof (swb)); memcpy (swb.spt.Cdb, cmd, len); swb.spt.Length = sizeof (SCSI_PASS_THROUGH); @@ -534,7 +534,7 @@ uae_u8 *ioctl_command_rawread (int unitnum, int sector, int sectorsize) if (sectorsize != 2336 && sectorsize != 2352 && sectorsize != 2048) return 0; while (cnt-- > 0) { - gui_cd_led (1); + gui_cd_led (unitnum, 1); seterrormode (unitnum); rri.DiskOffset.QuadPart = sector * 2048; rri.SectorCount = 1; @@ -563,7 +563,7 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write, int bloc if (!open_createfile(unitnum, 0)) return 0; while (cnt-- > 0) { - gui_cd_led (1); + gui_cd_led (unitnum, 1); seterrormode (unitnum); if (SetFilePointer (ciw32[unitnum].h, sector * ciw32[unitnum].blocksize, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { reseterrormode (unitnum); @@ -576,7 +576,7 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write, int bloc } cnt = 3; while (cnt-- > 0) { - gui_cd_led (1); + gui_cd_led (unitnum, 1); seterrormode (unitnum); if (write) { if (!WriteFile (ciw32[unitnum].h, p, blocksize, &dtotal, 0)) { @@ -621,7 +621,7 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write, int bloc } } reseterrormode (unitnum); - gui_cd_led (1); + gui_cd_led (unitnum, 1); break; } *ptr = p; @@ -705,7 +705,7 @@ static uae_u8 *ioctl_command_toc (int unitnum) if (!open_createfile(unitnum, 0)) return 0; - gui_cd_led (1); + gui_cd_led (unitnum, 1); while (cnt-- > 0) { seterrormode (unitnum); if (!DeviceIoControl(ciw32[unitnum].h, IOCTL_CDROM_READ_TOC, NULL, 0, toc, sizeof(CDROM_TOC), &len, NULL)) { @@ -754,7 +754,7 @@ static uae_u8 *ioctl_command_toc (int unitnum) p[10] = toc->TrackData[i].Address[3]; p += 11; } - gui_cd_led (1); + gui_cd_led (unitnum, 1); return ciw32[unitnum].tempbuffer; } diff --git a/od-win32/blkdev_win32_spti.c b/od-win32/blkdev_win32_spti.c index 859cdad7..2add73b5 100644 --- a/od-win32/blkdev_win32_spti.c +++ b/od-win32/blkdev_win32_spti.c @@ -71,7 +71,7 @@ static int doscsi (int unitnum, SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER *swb, int * scsi_log_before (swb->spt.Cdb, swb->spt.CdbLength, swb->spt.DataIn == SCSI_IOCTL_DATA_OUT ? swb->spt.DataBuffer : 0,swb->spt.DataTransferLength); } - gui_cd_led (1); + gui_cd_led (unitnum, 1); swb->spt.ScsiStatus = 0; if (di->bus >= 0) { swb->spt.PathId = di->path; @@ -97,7 +97,7 @@ static int doscsi (int unitnum, SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER *swb, int * swb->spt.SenseInfoLength = 0; /* 0 and 1 = success, not error.. */ if (swb->spt.SenseInfoLength > 0) return 0; - gui_cd_led (1); + gui_cd_led (unitnum, 1); return status; } diff --git a/od-win32/lcd.c b/od-win32/lcd.c index 9ea401e3..6ea0f18f 100644 --- a/od-win32/lcd.c +++ b/od-win32/lcd.c @@ -135,7 +135,7 @@ static void putnumber(int x, int y, int n, int inv) static void putnumbers(int x, int y, int num, int inv) { - putnumber(x, y, num < 0 ? num : num / 10, inv); + putnumber(x, y, num < 0 ? num : ((num / 10) > 0 ? num / 10 : -1), inv); putnumber(x + numbers_width, y, num < 0 ? num : num % 10, inv); } diff --git a/od-win32/mman.c b/od-win32/mman.c index 34543515..60512a76 100644 --- a/od-win32/mman.c +++ b/od-win32/mman.c @@ -140,9 +140,14 @@ int init_shm (void) natmem_offset = NULL; canbang = 0; - size = currprefs.z3fastmem_size + (currprefs.z3fastmem_start - 0x10000000); - size += currprefs.gfxmem_size; - size += 16 * 1024 * 1024; + size = 0x1000000; + if (currprefs.cpu_model >= 68020) + size = 0x10000000; + if (currprefs.z3fastmem_size || currprefs.gfxmem_size) { + size = currprefs.z3fastmem_size + (currprefs.z3fastmem_start - 0x10000000); + size += currprefs.gfxmem_size; + size += 16 * 1024 * 1024; + } while (size > size64) { int change = lowmem (); diff --git a/od-win32/resources/resource b/od-win32/resources/resource index aaa14f1b..05034144 100644 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -843,7 +843,7 @@ #define IDC_CS_CIAA_TOD3 1713 #define IDC_CS_COMPATIBLE 1714 #define IDC_CS_RAMSEYREV 1715 -#define IDC_CS_KSMIRROR 1716 +#define IDC_CS_KSMIRROR_E0 1716 #define IDC_STRINGBOXEDIT 1716 #define IDC_CS_CD32CD 1717 #define IDC_STRINGBOX_TEXT 1717 @@ -878,8 +878,12 @@ #define IDC_CS_SLOWISFAST 1740 #define IDC_DBG_HELP 1740 #define IDC_DBG_INPUT 1741 +#define IDC_CS_KSMIRROR_A8 1741 #define IDC_DBG_DREG 1742 +#define IDC_CS_CIAOVERLAY 1742 #define IDC_DBG_AREG 1743 +#define IDC_CS_KSMIRROR_E1 1743 +#define IDC_CS_RESETWARNING 1743 #define IDC_DBG_CCR 1744 #define IDC_DBG_AMEM 1745 #define IDC_DBG_SP_VBR 1746 diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index aaa14f1b..0226c6a4 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -843,7 +843,7 @@ #define IDC_CS_CIAA_TOD3 1713 #define IDC_CS_COMPATIBLE 1714 #define IDC_CS_RAMSEYREV 1715 -#define IDC_CS_KSMIRROR 1716 +#define IDC_CS_KSMIRROR_E0 1716 #define IDC_STRINGBOXEDIT 1716 #define IDC_CS_CD32CD 1717 #define IDC_STRINGBOX_TEXT 1717 @@ -878,8 +878,11 @@ #define IDC_CS_SLOWISFAST 1740 #define IDC_DBG_HELP 1740 #define IDC_DBG_INPUT 1741 +#define IDC_CS_KSMIRROR_A8 1741 #define IDC_DBG_DREG 1742 +#define IDC_CS_CIAOVERLAY 1742 #define IDC_DBG_AREG 1743 +#define IDC_CS_RESETWARNING 1743 #define IDC_DBG_CCR 1744 #define IDC_DBG_AMEM 1745 #define IDC_DBG_SP_VBR 1746 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 07a9d13b..941d2356 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -426,6 +426,7 @@ BEGIN CONTROL "Magic Mouse",IDC_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,79,119,10 CONTROL "uaenet.device",IDC_SANA2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,92,94,10 END + IDD_HARDFILE DIALOGEX 0, 0, 299, 249 STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Hardfile Settings" @@ -557,7 +558,7 @@ BEGIN CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,68,63,10 CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,68,85,10 CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,186,68,88,10 - CONTROL "Boot ROM Mirror",IDC_CS_KSMIRROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10 + CONTROL "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,146,80,10 CONTROL "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,95,88,10 CONTROL "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,108,76,10 CONTROL "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,108,87,10 @@ -567,25 +568,28 @@ BEGIN CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,120,90,10 CONTROL "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,133,79,10 CONTROL "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,133,88,10 - CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,210,71,10 - EDITTEXT IDC_CS_RAMSEYREV,91,208,45,13,ES_AUTOHSCROLL - CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,223,71,10 - EDITTEXT IDC_CS_FATGARYREV,91,222,45,13,ES_AUTOHSCROLL - CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,174,76,10 + CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,71,10 + EDITTEXT IDC_CS_RAMSEYREV,91,214,45,13,ES_AUTOHSCROLL + CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,71,10 + EDITTEXT IDC_CS_FATGARYREV,91,228,45,13,ES_AUTOHSCROLL + CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,188,76,10 CONTROL "Compatible Settings",IDC_CS_COMPATIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,8,234,10 CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,95,92,10 - CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,210,81,10 - EDITTEXT IDC_CS_AGNUSREV,232,208,45,13,ES_AUTOHSCROLL - CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,223,81,10 - EDITTEXT IDC_CS_DENISEREV,232,222,45,13,ES_AUTOHSCROLL - CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,174,76,10 - CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,174,88,10 - LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,160,224,8,SS_CENTERIMAGE + CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,216,81,10 + EDITTEXT IDC_CS_AGNUSREV,232,214,45,13,ES_AUTOHSCROLL + CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,229,81,10 + EDITTEXT IDC_CS_DENISEREV,232,228,45,13,ES_AUTOHSCROLL + CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,188,76,10 + CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,188,88,10 + LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,174,224,8,SS_CENTERIMAGE CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,133,92,10 - CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,186,76,10 - CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,186,76,10 - CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,186,101,10 + CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,200,76,10 + CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,200,76,10 + CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,200,101,10 CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,146,92,10 + CONTROL "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,146,80,10 + CONTROL "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10 + CONTROL "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,159,80,10 END IDD_AVIOUTPUT DIALOGEX 0, 0, 288, 203 diff --git a/od-win32/rp.c b/od-win32/rp.c index 4fed442e..0fbc3438 100644 --- a/od-win32/rp.c +++ b/od-win32/rp.c @@ -24,6 +24,7 @@ #include "picasso96_win.h" #include "win32.h" #include "win32gfx.h" +#include "filesys.h" static int initialized; static RPGUESTINFO guestinfo; @@ -38,6 +39,7 @@ int log_rp = 1; static int default_width, default_height; static int hwndset; static int minimized; +static DWORD hd_mask, cd_mask; static char *ua (const WCHAR *s) @@ -305,6 +307,36 @@ void rp_fixup_options (struct uae_prefs *p) v |= 1 << i; } RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_FLOPPY, v, NULL, 0, &guestinfo, NULL); + cd_mask = 0; + for (i = 0; i < currprefs.mountitems; i++) { + struct uaedev_config_info *uci = &currprefs.mountconfig[i]; + if (uci->controller == HD_CONTROLLER_UAE) { + hd_mask |= 1 << i; + } else if (uci->controller <= HD_CONTROLLER_IDE3 ) { + hd_mask |= 1 << (uci->controller - HD_CONTROLLER_IDE0); + } else if (uci->controller <= HD_CONTROLLER_SCSI6) { + hd_mask |= 1 << (uci->controller - HD_CONTROLLER_SCSI0); + } + } + RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_HD, hd_mask, NULL, 0, &guestinfo, NULL); +} + +void rp_hd_change (int num, int removed) +{ + if (removed) + hd_mask &= ~(1 << num); + else + hd_mask |= 1 << num; + RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_HD, hd_mask, NULL, 0, &guestinfo, NULL); +} + +void rp_cd_change (int num, int removed) +{ + if (removed) + cd_mask &= ~(1 << num); + else + cd_mask |= 1 << num; + RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_CD, cd_mask, NULL, 0, &guestinfo, NULL); } void rp_update_leds (int led, int onoff) @@ -327,6 +359,32 @@ void rp_update_leds (int led, int onoff) } } +void rp_hd_activity (int num, int onoff) +{ + if (!initialized) + return; + if (num < 0) + return; + if (onoff) + RPSendMessage(RPIPCGM_DEVICEACTIVITY, MAKEWORD (RP_DEVICE_HD, num), 200, NULL, 0, &guestinfo, NULL); +} + +void rp_cd_activity (int num, int onoff) +{ + if (!initialized) + return; + if (num < 0) + return; + if ((cd_mask & (1 << num)) != ((onoff ? 1 : 0) << num)) { + cd_mask ^= 1 << num; + RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_CD, cd_mask, NULL, 0, &guestinfo, NULL); + } + if (onoff) { + RPSendMessage(RPIPCGM_DEVICEACTIVITY, MAKEWORD (RP_DEVICE_CD, num), 200, NULL, 0, &guestinfo, NULL); + } +} + + void rp_update_status (struct uae_prefs *p) { if (!initialized) diff --git a/od-win32/rp.h b/od-win32/rp.h index c133f3c7..371fe262 100644 --- a/od-win32/rp.h +++ b/od-win32/rp.h @@ -4,6 +4,10 @@ extern void rp_free (void); extern void rp_fixup_options (struct uae_prefs*); extern void rp_update_status (struct uae_prefs*); extern void rp_update_leds (int, int); +extern void rp_hd_activity (int, int); +extern void rp_hd_change (int, int); +extern void rp_cd_activity (int, int); +extern void rp_cd_change (int, int); extern void rp_activate (int, LPARAM); extern void rp_minimize (int); extern void rp_mousecapture (int); diff --git a/od-win32/win32.c b/od-win32/win32.c index 01197b6c..08af4484 100644 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -3430,6 +3430,10 @@ void systray (HWND hwnd, int remove) NOTIFYICONDATA nid; BOOL v; +#ifdef RETROPLATFORM + if (rp_isactive()) + return; +#endif //write_log ("notif: systray(%x,%d)\n", hwnd, remove); if (!remove) { TaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); diff --git a/od-win32/win32.h b/od-win32/win32.h index 811b25da..4a25fc75 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -15,9 +15,9 @@ #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100) #define GETBDD(x) ((x) % 100) -#define WINUAEBETA 5 +#define WINUAEBETA 6 #define WINUAEPUBLICBETA 1 -#define WINUAEDATE MAKEBD(2008, 1, 9) +#define WINUAEDATE MAKEBD(2008, 1, 16) #define WINUAEEXTRA "" #define WINUAEREV "" diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 5f48b806..fb5c9485 100644 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -4292,7 +4292,10 @@ static void values_to_chipsetdlg2 (HWND hDlg) break; } CheckDlgButton (hDlg, IDC_CS_COMPATIBLE, workprefs.cs_compatible); - CheckDlgButton (hDlg, IDC_CS_KSMIRROR, workprefs.cs_ksmirror); + CheckDlgButton (hDlg, IDC_CS_RESETWARNING, workprefs.cs_resetwarning); + CheckDlgButton (hDlg, IDC_CS_KSMIRROR_E0, workprefs.cs_ksmirror_e0); + CheckDlgButton (hDlg, IDC_CS_KSMIRROR_A8, workprefs.cs_ksmirror_a8); + CheckDlgButton (hDlg, IDC_CS_CIAOVERLAY, workprefs.cs_ciaoverlay); CheckDlgButton (hDlg, IDC_CS_DF0IDHW, workprefs.cs_df0idhw); CheckDlgButton (hDlg, IDC_CS_CD32CD, workprefs.cs_cd32cd); CheckDlgButton (hDlg, IDC_CS_CD32C2P, workprefs.cs_cd32c2p); @@ -4362,7 +4365,10 @@ static void values_from_chipsetdlg2 (HWND hDlg, UINT msg, WPARAM wParam, LPARAM int v; workprefs.cs_compatible = IsDlgButtonChecked (hDlg, IDC_CS_COMPATIBLE); - workprefs.cs_ksmirror = IsDlgButtonChecked (hDlg, IDC_CS_KSMIRROR); + workprefs.cs_resetwarning = IsDlgButtonChecked (hDlg, IDC_CS_RESETWARNING); + 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); @@ -4456,7 +4462,10 @@ static void enable_for_chipsetdlg2 (HWND hDlg) ew (hDlg, IDC_CS_CDTVCD, e); ew (hDlg, IDC_CS_CDTVRAM, e); ew (hDlg, IDC_CS_CDTVRAMEXP, e); - ew (hDlg, IDC_CS_KSMIRROR, e); + ew (hDlg, IDC_CS_RESETWARNING, e); + ew (hDlg, IDC_CS_KSMIRROR_E0, e); + ew (hDlg, IDC_CS_KSMIRROR_A8, e); + ew (hDlg, IDC_CS_CIAOVERLAY, e); ew (hDlg, IDC_CS_A1000RAM, e); ew (hDlg, IDC_CS_DF0IDHW, e); ew (hDlg, IDC_CS_CIAA_TOD1, e); @@ -10328,7 +10337,7 @@ void check_prefs_changed_gui( void ) { } -void gui_hd_led (int led) +void gui_hd_led (int unitnum, int led) { static int resetcounter; @@ -10338,13 +10347,16 @@ void gui_hd_led (int led) if (resetcounter > 0) return; } +#ifdef RETROPLATFORM + rp_hd_activity (unitnum, led); +#endif gui_data.hd = led; resetcounter = 6; if (old != gui_data.hd) gui_led (5, gui_data.hd); } -void gui_cd_led (int led) +void gui_cd_led (int unitnum, int led) { static int resetcounter; @@ -10354,6 +10366,9 @@ void gui_cd_led (int led) if (resetcounter > 0) return; } +#ifdef RETROPLATFORM + rp_cd_activity (unitnum, led); +#endif gui_data.cd = led; resetcounter = 6; if (old != gui_data.cd) diff --git a/od-win32/winuae_msvc/winuae_msvc.vcproj b/od-win32/winuae_msvc/winuae_msvc.vcproj index c7d21d80..0b63883a 100644 --- a/od-win32/winuae_msvc/winuae_msvc.vcproj +++ b/od-win32/winuae_msvc/winuae_msvc.vcproj @@ -2519,6 +2519,10 @@ RelativePath="..\hq2x32.obj" > + + diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 14899733..a72c0fa0 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -3,6 +3,55 @@ 1.4.6 will be the last Windows 98/ME compatible version. 1.5.0 will require Windows 2000 or newer. +Beta 6: + +- binary support added to debugger, '%10101' +- hex/dec/bin converter added to debugger, '?' + result is 0x, %, and +- all debugger commands which take numeric parameters also accept + register names: A0-A7 = RA0-RA7, D0-D7 = RD0-RD7, PC, USP, VBR,.. +- debugger number prefixes: hex = 0x or $, bin = %, dec = !. Most + command parameters default to hex (addresses) or decimal. +- do not reserve lots of jit direct ram if non-jit compatible cpu +- logitech lcd dfx/cpu/fps counter leading zeros removed + (I have G15 again, updated revision this time) +- some incorrect Quickstart RTC configurations fixed +- keyboard reset warning feature emulated and added to advanced + chipset panel. Reset warning information: + http://cataclysm.cx/random/amiga/reference/Hardware_Manual_guide/node0178.html + Reset warning sequence is only triggered if Amiga-Amiga-CTRL key + sequence pressed and reset warning setting enabled. Or Input panel + event "Keycode 0x78 (Reset Warning)" is received. + Amiga-Amiga-CTRL-ALT still does instant hardreset. Second + Amiga-Amiga-CTRL during reset warning sequence will also cause + instant reset. + Pre-emptive "bug report": if Amiga-Amiga-CTRL now causes gurus, + reset delays or something weird (and does not if reset warning is + disabled or GUI Reset-button clicked) you have buggy/badly configured + reset handler utility installed. This is Somebody Else's Problem. +- joystick autoswitch update: firebutton press on non-connected + (to emulated Amiga port) joystick AND another joystick already in + joystick port (port 1) WITH firebutton pressed = insert new joystick + to mouse port + + Following can be ignored if you aren't testing custom ROM images + before burning EPROM(s) + +- kickstart chipram overlay maps 0xe00000 rom instead of 0xf80000, + same with 0xf00000 rom if it begins with 0x1114 (emulates my 1M CDTV + EPROM hack..) +- 2M ROM image support. Gayle ROM mapping: + * first 512K bank: E00000-E7FFFF (overlay bank) + * second 512K bank: A80000-AFFFFF + * third 512K bank: B00000-B7FFFF + * fourth 512K bank: F80000-FFFFFF + At least A600 and A1200 have 2MB ROM support but note that A1200 + Blizzard accel's MAPROM feature must be disabled +- cia overlay advanced chipset setting added (Pre-Gayle models use + CIA overlay io pin, newer models have overlay logic inside Gayle) +- ROM Mirror advanced chipset setting separated to E0 and A8 ROM + banks. (A8-B8 = Gayle feature) + Beta 5: - fixed wrong input device GUID format in config files diff --git a/od-win32/writelog.c b/od-win32/writelog.c index 5e209dcd..cdc57247 100644 --- a/od-win32/writelog.c +++ b/od-win32/writelog.c @@ -283,6 +283,8 @@ void write_log (const char *format, ...) break; } bufp[bufsize - 1] = 0; + if (!memcmp (bufp, "write ",6)) + bufsize--; ts = writets(); if (bufp[0] == '*') count++; -- 2.47.3