--- uae/src/ersatz.c 2018/04/24 17:05:32 1.1.1.7 +++ uae/src/ersatz.c 2018/04/24 17:18:19 1.1.1.12 @@ -10,7 +10,6 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" #include "options.h" #include "uae.h" #include "memory.h" @@ -30,6 +29,8 @@ #define EOP_ALLOCABS 7 #define EOP_LOOP 8 +static int already_failed = 0; + void init_ersatz_rom (uae_u8 *data) { write_log ("Trying to use Kickstart replacement.\n"); @@ -66,9 +67,21 @@ void init_ersatz_rom (uae_u8 *data) *data++ = 0x4E; *data++ = 0x75; } +static void ersatz_failed (void) +{ + if (already_failed) + return; + already_failed = 1; +#if 0 + notify_user (NUMSG_KICKREPNO); + uae_restart (-1, NULL); +#endif + uae_quit (); +} + static void ersatz_doio (void) { - uaecptr request = m68k_areg(regs, 1); + uaecptr request = m68k_areg (regs, 1); switch (get_word (request + 0x1C)) { case 9: /* TD_MOTOR is harmless */ case 2: case 0x8002: /* READ commands */ @@ -76,7 +89,7 @@ static void ersatz_doio (void) default: write_log ("Only CMD_READ supported in DoIO()\n"); - abort(); + ersatz_failed (); } { uaecptr dest = get_long (request + 0x28); @@ -112,11 +125,11 @@ static void ersatz_init (void) put_long (a, 0xF8001A); } regs.isp = regs.msp = regs.usp = 0x800; - m68k_areg(regs, 7) = 0x80000; + m68k_areg (regs, 7) = 0x80000; regs.intmask = 0; /* Build a dummy execbase */ - put_long (4, m68k_areg(regs, 6) = 0x676); + put_long (4, m68k_areg (regs, 6) = 0x676); put_byte (0x676 + 0x129, 0); for (f = 1; f < 105; f++) { put_word (0x676 - 6*f, 0x4EF9); @@ -135,10 +148,10 @@ static void ersatz_init (void) put_long (request + 0x28, 0x4000); put_long (request + 0x2C, 0); put_long (request + 0x24, 0x200 * 4); - m68k_areg(regs, 1) = request; + m68k_areg (regs, 1) = request; ersatz_doio (); /* kickstart disk loader */ - if (get_long(0x4000) == 0x4b49434b) { + if (get_long (0x4000) == 0x4b49434b) { /* a kickstart disk was found in drive 0! */ write_log ("Loading Kickstart rom image from Kickstart disk\n"); /* print some notes... */ @@ -149,7 +162,7 @@ static void ersatz_init (void) put_long (request + 0x28, 0xF80000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); - m68k_areg(regs, 1) = request; + m68k_areg (regs, 1) = request; ersatz_doio (); /* read rom image once again to mirror address space. @@ -158,20 +171,20 @@ static void ersatz_init (void) put_long (request + 0x28, 0xFC0000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); - m68k_areg(regs, 1) = request; + m68k_areg (regs, 1) = request; ersatz_doio (); disk_eject (0); m68k_setpc (0xFC0002); - fill_prefetch_0 (); - uae_reset (); + fill_prefetch_slow (); + uae_reset (0); ersatzkickfile = 0; return; } m68k_setpc (0x400C); - fill_prefetch_0 (); + fill_prefetch_slow (); /* Init the hardware */ put_long (0x3000, 0xFFFFFFFEul); @@ -212,21 +225,22 @@ void ersatz_perform (uae_u16 what) break; case EOP_AVAILMEM: - m68k_dreg(regs, 0) = m68k_dreg(regs, 1) & 4 ? 0 : 0x70000; + m68k_dreg (regs, 0) = m68k_dreg (regs, 1) & 4 ? 0 : 0x70000; break; case EOP_ALLOCMEM: - m68k_dreg(regs, 0) = m68k_dreg(regs, 1) & 4 ? 0 : 0x0F000; + m68k_dreg (regs, 0) = m68k_dreg (regs, 1) & 4 ? 0 : 0x0F000; break; case EOP_ALLOCABS: - m68k_dreg(regs, 0) = m68k_areg(regs, 1); + m68k_dreg (regs, 0) = m68k_areg (regs, 1); break; case EOP_NIMP: write_log ("Unimplemented Kickstart function called\n"); - uae_quit (); - + ersatz_failed (); + break; + /* fall through */ case EOP_LOOP: m68k_setpc (0xF80010); @@ -235,6 +249,7 @@ void ersatz_perform (uae_u16 what) case EOP_OPENLIB: default: write_log ("Internal error. Giving up.\n"); - abort (); + ersatz_failed (); + break; } }