--- uae/src/ersatz.c 2018/04/24 16:40:50 1.1.1.4 +++ uae/src/ersatz.c 2018/04/24 17:05:32 1.1.1.7 @@ -15,7 +15,6 @@ #include "uae.h" #include "memory.h" #include "custom.h" -#include "readcpu.h" #include "newcpu.h" #include "cia.h" #include "disk.h" @@ -33,7 +32,7 @@ void init_ersatz_rom (uae_u8 *data) { - fprintf(stderr, "Trying to use Kickstart replacement.\n"); + write_log ("Trying to use Kickstart replacement.\n"); *data++ = 0x00; *data++ = 0x08; /* initial SP */ *data++ = 0x00; *data++ = 0x00; *data++ = 0x00; *data++ = 0xF8; /* initial PC */ @@ -76,7 +75,7 @@ static void ersatz_doio (void) break; default: - fprintf(stderr, "Only CMD_READ supported in DoIO()\n"); + write_log ("Only CMD_READ supported in DoIO()\n"); abort(); } { @@ -101,7 +100,7 @@ static void ersatz_init (void) uaecptr a; if (disk_empty (0)) { - fprintf (stderr, "You need to have a diskfile in DF0 to use the Kickstart replacement!\n"); + write_log ("You need to have a diskfile in DF0 to use the Kickstart replacement!\n"); uae_quit (); m68k_setpc (0xF80010); return; @@ -138,6 +137,39 @@ static void ersatz_init (void) put_long (request + 0x24, 0x200 * 4); m68k_areg(regs, 1) = request; ersatz_doio (); + /* kickstart disk loader */ + 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... */ + write_log ("NOTE: if UAE crashes set CPU to 68000 and/or chipmem size to 512KB!\n"); + + /* read rom image from kickstart disk */ + put_word (request + 0x1C, 2); + put_long (request + 0x28, 0xF80000); + put_long (request + 0x2C, 0x200); + put_long (request + 0x24, 0x200 * 512); + m68k_areg(regs, 1) = request; + ersatz_doio (); + + /* read rom image once again to mirror address space. + not elegant, but it works... */ + put_word (request + 0x1C, 2); + put_long (request + 0x28, 0xFC0000); + put_long (request + 0x2C, 0x200); + put_long (request + 0x24, 0x200 * 512); + m68k_areg(regs, 1) = request; + ersatz_doio (); + + disk_eject (0); + + m68k_setpc (0xFC0002); + fill_prefetch_0 (); + uae_reset (); + ersatzkickfile = 0; + return; + } + m68k_setpc (0x400C); fill_prefetch_0 (); @@ -192,7 +224,7 @@ void ersatz_perform (uae_u16 what) break; case EOP_NIMP: - fprintf (stderr, "Unimplemented Kickstart function called\n"); + write_log ("Unimplemented Kickstart function called\n"); uae_quit (); /* fall through */ @@ -202,7 +234,7 @@ void ersatz_perform (uae_u16 what) case EOP_OPENLIB: default: - fprintf(stderr, "Internal error. Giving up.\n"); + write_log ("Internal error. Giving up.\n"); abort (); } }