/* @@@ use strcasecmp for some targets. */
if (strlen (path) > 0 && strncmp (file, path, strlen (path)) == 0) {
int l;
- char *p = (char*)xmalloc (strlen (file) + strlen (subst) + 2);
+ char *p = xmalloc (strlen (file) + strlen (subst) + 2);
strcpy (p, subst);
l = strlen (p);
while (l > 0 && p[l - 1] == '/')
if (sl->option && !strcasecmp (line1b, sl->option)) break;
}
if (!sl) {
- struct strlist *u = (struct strlist*)xcalloc (sizeof (struct strlist), 1);
+ struct strlist *u = xcalloc (sizeof (struct strlist), 1);
u->option = my_strdup(line3b);
u->value = my_strdup(line4b);
u->next = p->all_lines;
int cfgfile_get_description (const char *filename, char *description, char *hostlink, char *hardwarelink, int *type)
{
int result = 0;
- struct uae_prefs *p = (struct uae_prefs*)xmalloc (sizeof (struct uae_prefs));
+ struct uae_prefs *p = xmalloc (sizeof (struct uae_prefs));
p->description[0] = 0;
p->config_host_path[0] = 0;
p->config_hardware_path[0] = 0;
}
if (!cfgfile_separate_line (line, line1b, line2b))
return;
- u = (struct strlist*)xcalloc (sizeof (struct strlist), 1);
+ u = xcalloc (sizeof (struct strlist), 1);
u->option = my_strdup(line1b);
u->value = my_strdup(line2b);
u->next = temp_lines;
int i, ret;
put_byte (out, 0);
- parms_p = (char*)xmalloc (size + 1);
+ parms_p = xmalloc (size + 1);
if (!parms_p) {
ret = 10;
goto end;
}
- out_p = (char*)xmalloc (outsize + 1);
+ out_p = xmalloc (outsize + 1);
if (!out_p) {
ret = 10;
goto end;
static void (*card_map[MAX_EXPANSION_BOARDS]) (void);
static int ecard;
+static int cardno;
static uae_u16 uae_id;
static uae_u8 expamem_lo;
static uae_u16 expamem_hi;
-/*
- * Dummy entries to show that there's no card in a slot
- */
+static uae_u32 REGPARAM3 expamem_lget (uaecptr) REGPARAM;
+static uae_u32 REGPARAM3 expamem_wget (uaecptr) REGPARAM;
+static uae_u32 REGPARAM3 expamem_bget (uaecptr) REGPARAM;
+static void REGPARAM3 expamem_lput (uaecptr, uae_u32) REGPARAM;
+static void REGPARAM3 expamem_wput (uaecptr, uae_u32) REGPARAM;
+static void REGPARAM3 expamem_bput (uaecptr, uae_u32) REGPARAM;
+
+addrbank expamem_bank = {
+ expamem_lget, expamem_wget, expamem_bget,
+ expamem_lput, expamem_wput, expamem_bput,
+ default_xlate, default_check, NULL, "Autoconfig",
+ dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE
+};
static void expamem_map_clear (void)
{
{
memset (expamem, 0xff, sizeof expamem);
}
+/* autoconfig area is "non-existing" after last device */
+static void expamem_init_clear_zero (void)
+{
+ map_banks (&dummy_bank, 0xe8, 1, 0);
+}
static void expamem_init_clear2 (void)
{
- expamem_init_clear ();
- ecard = MAX_EXPANSION_BOARDS - 1;
+ expamem_init_clear_zero ();
+ ecard = cardno;
}
static void expamem_init_last (void)
{
+ expamem_init_clear2 ();
write_log ("Memory map after autoconfig:\n");
memory_map_dump();
- expamem_init_clear ();
}
-static uae_u32 REGPARAM3 expamem_lget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM3 expamem_wget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM3 expamem_bget (uaecptr) REGPARAM;
-static void REGPARAM3 expamem_lput (uaecptr, uae_u32) REGPARAM;
-static void REGPARAM3 expamem_wput (uaecptr, uae_u32) REGPARAM;
-static void REGPARAM3 expamem_bput (uaecptr, uae_u32) REGPARAM;
-
-addrbank expamem_bank = {
- expamem_lget, expamem_wget, expamem_bget,
- expamem_lput, expamem_wput, expamem_bput,
- default_xlate, default_check, NULL, "Autoconfig",
- dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE
-};
static uae_u32 REGPARAM2 expamem_lget (uaecptr addr)
{
static uae_u32 REGPARAM2 expamem_wget (uaecptr addr)
{
- write_log ("warning: READ.W from address $%lx PC=%x\n", addr, M68K_GETPC);
- return (expamem_bget (addr) << 8) | expamem_bget (addr + 1);
+ uae_u32 v = (expamem_bget (addr) << 8) | expamem_bget (addr + 1);
+ write_log ("warning: READ.W from address $%lx=%04x PC=%x\n", addr, v & 0xffff, M68K_GETPC);
+ return v;
}
static uae_u32 REGPARAM2 expamem_bget (uaecptr addr)
special_mem |= S_WRITE;
#endif
value &= 0xffff;
+ if (ecard >= cardno)
+ return;
if (expamem_type() != zorroIII)
write_log ("warning: WRITE.W to address $%lx : value $%x\n", addr, value);
else {
(*card_map[ecard]) ();
write_log (" Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
++ecard;
- if (ecard < MAX_EXPANSION_BOARDS)
+ if (ecard < cardno)
(*card_init[ecard]) ();
else
expamem_init_clear2 ();
#ifdef JIT
special_mem |= S_WRITE;
#endif
+ if (ecard >= cardno)
+ return;
value &= 0xff;
switch (addr & 0xff) {
case 0x30:
(*card_map[ecard]) ();
write_log (" Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
++ecard;
- if (ecard < MAX_EXPANSION_BOARDS)
+ if (ecard < cardno)
(*card_init[ecard]) ();
else
expamem_init_clear2 ();
case 0x4c:
write_log (" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
++ecard;
- if (ecard < MAX_EXPANSION_BOARDS)
+ if (ecard < cardno)
(*card_init[ecard]) ();
else
expamem_init_clear2 ();
expamem_init_clear ();
map_banks (&expamem_bank, 0xE8, 1, 0);
++ecard;
- if (ecard < MAX_EXPANSION_BOARDS)
+ if (ecard < cardno)
(*card_init[ecard]) ();
else
expamem_init_clear2 ();
void expamem_reset (void)
{
int do_mount = 1;
- int cardno = 0;
+
ecard = 0;
+ cardno = 0;
if (currprefs.uae_hide)
uae_id = commodore;
card_init[cardno] = expamem_init_last;
card_map[cardno++] = expamem_map_clear;
}
- while (cardno < MAX_EXPANSION_BOARDS) {
- card_init[cardno] = expamem_init_clear;
- card_map[cardno++] = expamem_map_clear;
- }
z3fastmem_start = currprefs.z3fastmem_start;
- (*card_init[0]) ();
+
+ if (cardno == 0)
+ expamem_init_clear_zero ();
+ else
+ (*card_init[0]) ();
}
void expansion_init (void)
extern uaecptr a3000lmem_start, a3000hmem_start;
extern int ersatzkickfile;
-extern int cloanto_rom;
+extern int cloanto_rom, kickstart_rom;
extern uae_u16 kickstart_version;
extern int uae_boot_rom, uae_boot_rom_size;
extern uaecptr rtarea_base;
#define ROMTYPE_NORDIC 0x001000
#define ROMTYPE_XPOWER 0x002000
#define ROMTYPE_CD32CART 0x004000
+#define ROMTYPE_SPECIALKICK 0x008000
#define ROMTYPE_MASK 0x01ffff
#define ROMTYPE_EVEN 0x020000
#define ROMTYPE_ODD 0x040000
int no_gui = 0;
int joystickpresent = 0;
int cloanto_rom = 0;
+int kickstart_rom = 1;
struct gui_info gui_data;
ALTROMPN(24, 2, 1, 4096, ROMTYPE_EVEN | ROMTYPE_8BIT, "252179-01", 0x42553bc4,0x8855a97f,0x7a44e3f6,0x2d1c88d9,0x38fee1f4,0xc606af5b)
ALTROMPN(24, 2, 2, 4096, ROMTYPE_ODD | ROMTYPE_8BIT, "252180-01", 0x8e5b9a37,0xd10f1564,0xb99f5ffe,0x108fa042,0x362e877f,0x569de2c3)
- { "The Diagnostic 2.0 (Logica)", 2, 0, 2, 0, "LOGICA\0", 524288, 72, 0, 0, ROMTYPE_KICK, 0, 0, NULL,
+ { "The Diagnostic 2.0 (Logica)", 2, 0, 2, 0, "LOGICA\0", 524288, 72, 0, 0, ROMTYPE_KICK | ROMTYPE_SPECIALKICK, 0, 0, NULL,
0x8484f426, 0xba10d161,0x66b2e2d6,0x177c979c,0x99edf846,0x2b21651e },
{ "Freezer: Action Replay Mk I v1.00", 1, 0, 1, 0, "AR\0", 65536, 52, 0, 0, ROMTYPE_AR, 0, 1, NULL,
/* ignore Zorro3 expansion space */
if (addr >= 0xff000000 && addr <= 0xff000200)
return;
- /* extended rom */
- if (addr >= 0xf00000 && addr <= 0xf7ffff)
+ /* autoconfig and extended rom */
+ if (addr >= 0xe00000 && addr <= 0xf7ffff)
return;
/* motherboard ram */
if (addr >= 0x08000000 && addr <= 0x08000007)
}
}
+static uae_u32 dummy_get (uaecptr addr, int size)
+{
+ uae_u32 v;
+ if (currprefs.cpu_model >= 68020)
+ return NONEXISTINGDATA;
+ v = (regs.irc << 16) | regs.irc;
+ if (v == 4)
+ return v;
+ if (v == 2)
+ return v & 0xffff;
+ return (addr & 1) ? (v & 0xff) : ((v >> 8) & 0xff);
+}
+
static uae_u32 REGPARAM2 dummy_lget (uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
if (currprefs.illegal_mem)
- dummylog(0, addr, 4, 0, 0);
- if (currprefs.cpu_model >= 68020)
- return NONEXISTINGDATA;
- return (regs.irc << 16) | regs.irc;
+ dummylog (0, addr, 4, 0, 0);
+ return dummy_get (addr, 4);
}
uae_u32 REGPARAM2 dummy_lgeti (uaecptr addr)
{
special_mem |= S_READ;
#endif
if (currprefs.illegal_mem)
- dummylog(0, addr, 4, 0, 1);
- if (currprefs.cpu_model >= 68020)
- return NONEXISTINGDATA;
- return (regs.irc << 16) | regs.irc;
+ dummylog (0, addr, 4, 0, 1);
+ return dummy_get (addr, 4);
}
static uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
special_mem |= S_READ;
#endif
if (currprefs.illegal_mem)
- dummylog(0, addr, 2, 0, 0);
- if (currprefs.cpu_model >= 68020)
- return NONEXISTINGDATA;
- return regs.irc;
+ dummylog (0, addr, 2, 0, 0);
+ return dummy_get (addr, 2);
}
uae_u32 REGPARAM2 dummy_wgeti (uaecptr addr)
{
special_mem |= S_READ;
#endif
if (currprefs.illegal_mem)
- dummylog(0, addr, 2, 0, 1);
- if (currprefs.cpu_model >= 68020)
- return NONEXISTINGDATA;
- return regs.irc;
+ dummylog (0, addr, 2, 0, 1);
+ return dummy_get (addr, 2);
}
static uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
special_mem |= S_READ;
#endif
if (currprefs.illegal_mem)
- dummylog(0, addr, 1, 0, 0);
- if (currprefs.cpu_model >= 68020)
- return NONEXISTINGDATA;
- return (addr & 1) ? regs.irc : regs.irc >> 8;
+ dummylog (0, addr, 1, 0, 0);
+ return dummy_get (addr, 1);
}
static void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
special_mem |= S_WRITE;
#endif
if (currprefs.illegal_mem)
- dummylog(1, addr, 4, l, 0);
+ dummylog (1, addr, 4, l, 0);
}
static void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
{
special_mem |= S_WRITE;
#endif
if (currprefs.illegal_mem)
- dummylog(1, addr, 2, w, 0);
+ dummylog (1, addr, 2, w, 0);
}
static void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
{
special_mem |= S_WRITE;
#endif
if (currprefs.illegal_mem)
- dummylog(1, addr, 1, b, 0);
+ dummylog (1, addr, 1, b, 0);
}
static int REGPARAM2 dummy_check (uaecptr addr, uae_u32 size)
if (strcmp (currprefs.romfile, changed_prefs.romfile) != 0
|| strcmp (currprefs.romextfile, changed_prefs.romextfile) != 0)
{
+ kickstart_rom = 1;
ersatzkickfile = 0;
a1000_handle_kickstart (0);
xfree (a1000_bootrom);
}
if (rd->cloanto)
cloanto_rom = 1;
+ kickstart_rom = 0;
+ if ((rd->type & ROMTYPE_SPECIALKICK | ROMTYPE_KICK) == ROMTYPE_KICK)
+ kickstart_rom = 1;
if ((rd->cpu & 4) && currprefs.cs_compatible) {
/* A4000 ROM = need ramsey, gary and ide */
if (currprefs.cs_ramseyrev < 0)
if (currprefs.cpu_model == 68060) {
regs.pcr = currprefs.fpu_model ? MC68060_PCR : MC68EC060_PCR;
regs.pcr |= (currprefs.cpu060_revision & 0xff) << 8;
- regs.pcr |= 2; /* disable FPU */
+ if (kickstart_rom)
+ regs.pcr |= 2; /* disable FPU */
}
fill_prefetch_slow (®s);
}
if (surf == dxdata.flipping[0] || surf == dxdata.flipping[1])
surf = dxdata.primary;
+ ddrval = IDirectDrawSurface7_IsLost (surf);
+ if (SUCCEEDED (ddrval))
+ return ddrval;
ddrval = IDirectDrawSurface7_Restore (surf);
if (SUCCEEDED (ddrval)) {
if (surf == dxdata.primary && dxdata.palette)
if (surf == dxdata.flipping[0] || surf == dxdata.flipping[1])
surf = dxdata.primary;
+ ddrval = IDirectDrawSurface7_IsLost (surf);
+ if (SUCCEEDED (ddrval))
+ return ddrval;
ddrval = IDirectDrawSurface7_Restore (surf);
if (FAILED (ddrval)) {
write_log ("IDirectDrawSurface7_Restore: %s\n", DXError (ddrval));
return ddrval;
}
+static HRESULT restoresurfacex (LPDIRECTDRAWSURFACE7 surf1, LPDIRECTDRAWSURFACE7 surf2)
+{
+ HRESULT r1, r2;
+
+ r1 = restoresurface (surf1);
+ r2 = restoresurface (surf2);
+ if (SUCCEEDED (r1) && SUCCEEDED (r2))
+ return r1;
+ if (SUCCEEDED (r1))
+ return r2;
+ return r1;
+}
+
static void clearsurf (LPDIRECTDRAWSURFACE7 surf)
{
HRESULT ddrval;
centerdstrect (&dstrect);
while (FAILED (ddrval = IDirectDrawSurface7_Blt (dst, &dstrect, dxdata.secondary, rect, DDBLT_WAIT, NULL))) {
if (ddrval == DDERR_SURFACELOST) {
- ddrval = restoresurface (dst);
+ ddrval = restoresurfacex (dst, dxdata.secondary);
if (FAILED (ddrval))
return 0;
} else if (ddrval != DDERR_SURFACEBUSY) {
centerdstrect (&dstrect);
while (FAILED(ddrval = IDirectDrawSurface7_Blt (dst, &dstrect, dxdata.secondary, &srcrect, DDBLT_WAIT, NULL))) {
if (ddrval == DDERR_SURFACELOST) {
- ddrval = restoresurface (dst);
+ ddrval = restoresurfacex (dst, dxdata.secondary);
if (FAILED (ddrval))
return 0;
} else if (ddrval != DDERR_SURFACEBUSY) {
ddrval = restoresurface_2 (dst);
if (FAILED (ddrval))
break;
+ ddrval = restoresurface_2 (src);
+ if (FAILED (ddrval))
+ break;
} else if (ddrval != DDERR_SURFACEBUSY) {
write_log ("DirectDraw_Blit: %s\n", DXError (ddrval));
break;
ret = ReadFile (hfd->handle, buf, hfd->blocksize, &got, NULL);
err = GetLastError ();
SetErrorMode(errormode);
- if (ret)
- write_log ("read ok\n");
- else
+ if (ret) {
+ if (got == hfd->blocksize) {
+ write_log ("read ok (%d)\n", got);
+ } else {
+ write_log ("read ok but no data (%d)\n", hfd->blocksize);
+ ret = 0;
+ err = 0;
+ }
+ } else {
write_log ("=%d\n", err);
+ }
if (!ret && (err == ERROR_DEV_NOT_EXIST || err == ERROR_WRONG_DISK)) {
if (!first)
break;
x = 23 + (led - 1) * 40;
y = 17;
track = gui_data.drive_track[led - 1];
- if (gui_data.drive_disabled[led - 1])
+ if (gui_data.drive_disabled[led - 1]) {
track = -1;
+ on = 0;
+ }
putnumbers (x, y, track, on);
} else if (led == 0) {
dorect (&coords[4 * 2], on);
size64 = 8 * 1024 * 1024;
if (max_allowed_mman * 1024 * 1024 > size64)
max_allowed_mman = size64 / (1024 * 1024);
- max_z3fastmem = (max_allowed_mman - (max_allowed_mman >> 3)) * 1024 * 1024;
+ if (maxmem == 0)
+ max_z3fastmem = (max_allowed_mman - (max_allowed_mman >> 3)) * 1024 * 1024;
if (max_z3fastmem < 512 * 1024 * 1024)
max_z3fastmem = 512 * 1024 * 1024;
{
int i;
for (i = 1; i < 4; i++) {
- uae_u32 v, vx;
- v = cursorrgb[i];
+ uae_u32 v = cursorrgb[i];
switch (picasso_vidinfo.pixbytes)
{
case 1:
for (y = 0; y < h; y++, yy++) {
uae_u8 *p = tmpbuf + w * bpp * y;
uae_u8 *pprev = p;
- uaecptr img = get_long (bi + PSSO_BoardInfo_MouseImage) + 4 + yy * 4 * hiressprite;
+ uaecptr img = get_long (bi + PSSO_BoardInfo_MouseImage) + 4 * hiressprite + yy * 4 * hiressprite;
x = 0;
while (x < w) {
uae_u32 d1 = get_long (img);
#define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
#define GETBDD(x) ((x) % 100)
-#define WINUAEBETA 14
+#define WINUAEBETA 15
#define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2008, 5, 1)
+#define WINUAEDATE MAKEBD(2008, 5, 2)
#define WINUAEEXTRA ""
#define WINUAEREV ""
if (dxfullscreen) {
int rounds = 3;
for (;;) {
+ HRESULT olderr;
write_log ("set_ddraw: Trying %dx%d, bits=%d, refreshrate=%d\n", width, height, bits, freq);
ddrval = DirectDraw_SetDisplayMode (width, height, bits, freq);
if (SUCCEEDED (ddrval))
break;
- if (ddrval != 0x80004001 && freq != 0) { // "The function called is not supported at this time" (wtf?)
- write_log ("set_ddraw: failed, trying without forced refresh rate\n");
- ddrval = DirectDraw_SetDisplayMode (width, height, bits, 0);
- if (SUCCEEDED (ddrval))
- break;
- }
- if (ddrval != DDERR_INVALIDMODE && ddrval != 0x80004001 && ddrval != DDERR_UNSUPPORTEDMODE)
+ olderr = ddrval;
+ write_log ("set_ddraw: failed, trying without forced refresh rate\n");
+ ddrval = DirectDraw_SetDisplayMode (width, height, bits, 0);
+ if (SUCCEEDED (ddrval))
+ break;
+ if (olderr != DDERR_INVALIDMODE && olderr != 0x80004001 && olderr != DDERR_UNSUPPORTEDMODE)
goto oops;
return -1;
}
+Beta 15:
+
+- autoconfig emulation update, fixes AR3 (broken) autoconfig code that
+ detected non-existing ram expansion at 0x00600000-0x009ffff
+- modified directdraw fullscreen mode fallback code
+- Picasso96 hires hardware sprite problem fixed. It was emulation
+ problem after all.. (I really need new brown paper bag soon)
+- Picasso96 hardware sprite resolution switching problem should be
+ really fixed now. (lots of logging can still happen after alt-tab,
+ this will be removed later)
+- disk insert/remove tweak
+
Beta 14:
- fixed IDE emulation crash