--- uae/src/ersatz.c 2018/04/24 16:38:39 1.1 +++ uae/src/ersatz.c 2018/04/24 16:40:50 1.1.1.4 @@ -1,6 +1,6 @@ - /* + /* * UAE - The Un*x Amiga Emulator - * + * * A "replacement" for a missing Kickstart * Warning! Q&D * @@ -12,8 +12,10 @@ #include "config.h" #include "options.h" +#include "uae.h" #include "memory.h" #include "custom.h" +#include "readcpu.h" #include "newcpu.h" #include "cia.h" #include "disk.h" @@ -27,8 +29,9 @@ #define EOP_AVAILMEM 5 #define EOP_ALLOCMEM 6 #define EOP_ALLOCABS 7 +#define EOP_LOOP 8 -void init_ersatz_rom (UBYTE *data) +void init_ersatz_rom (uae_u8 *data) { fprintf(stderr, "Trying to use Kickstart replacement.\n"); *data++ = 0x00; *data++ = 0x08; /* initial SP */ @@ -40,41 +43,44 @@ void init_ersatz_rom (UBYTE *data) *data++ = 0x00; *data++ = EOP_INIT; *data++ = 0xFF; *data++ = 0x0D; *data++ = 0x00; *data++ = EOP_NIMP; - + + *data++ = 0xFF; *data++ = 0x0D; + *data++ = 0x00; *data++ = EOP_LOOP; *data++ = 0xFF; *data++ = 0x0D; *data++ = 0x00; *data++ = EOP_DOIO; + *data++ = 0x4E; *data++ = 0x75; *data++ = 0xFF; *data++ = 0x0D; - *data++ = 0x00; *data++ = EOP_SERVEINT; *data++ = 0x4E; *data++ = 0x73; + *data++ = 0xFF; *data++ = 0x0D; *data++ = 0x00; *data++ = EOP_AVAILMEM; - *data++ = 0x4E; *data++ = 0x75; *data++ = 0xFF; *data++ = 0x0D; - *data++ = 0x00; *data++ = EOP_ALLOCMEM; - *data++ = 0x4E; *data++ = 0x75; + *data++ = 0x00; *data++ = EOP_ALLOCMEM; + *data++ = 0x4E; *data++ = 0x75; *data++ = 0xFF; *data++ = 0x0D; *data++ = 0x00; *data++ = EOP_ALLOCABS; + *data++ = 0x4E; *data++ = 0x75; } static void ersatz_doio (void) { - CPTR request = regs.a[1]; + uaecptr request = m68k_areg(regs, 1); switch (get_word (request + 0x1C)) { case 9: /* TD_MOTOR is harmless */ case 2: case 0x8002: /* READ commands */ break; - + default: fprintf(stderr, "Only CMD_READ supported in DoIO()\n"); abort(); } { - CPTR dest = get_long (request + 0x28); + uaecptr dest = get_long (request + 0x28); int start = get_long (request + 0x2C) / 512; int nsecs = get_long (request + 0x24) / 512; int tr = start / 11; @@ -91,44 +97,52 @@ static void ersatz_doio (void) static void ersatz_init (void) { int f; - CPTR request; - CPTR a; - + uaecptr request; + uaecptr a; + + if (disk_empty (0)) { + fprintf (stderr, "You need to have a diskfile in DF0 to use the Kickstart replacement!\n"); + uae_quit (); + m68k_setpc (0xF80010); + return; + } + regs.s = 0; /* Set some interrupt vectors */ for (a = 8; a < 0xC0; a += 4) { - put_long (a, 0xF80016); + put_long (a, 0xF8001A); } regs.isp = regs.msp = regs.usp = 0x800; - regs.a[7] = 0x80000; + m68k_areg(regs, 7) = 0x80000; regs.intmask = 0; - + /* Build a dummy execbase */ - put_long (4, regs.a[6] = 0x676); - put_byte (0x676 + 0x129, 0); - for (f = 1; f < 105; f++) { - put_word (0x676 - 6*f, 0x4EF9); + 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); put_long (0x676 - 6*f + 2, 0xF8000C); } /* Some "supported" functions */ - put_long (0x676 - 456 + 2, 0xF80010); - put_long (0x676 - 216 + 2, 0xF8001C); - put_long (0x676 - 198 + 2, 0xF80022); - put_long (0x676 - 204 + 2, 0xF80028); - put_long (0x676 - 210 + 2, 0xF80026); - + put_long (0x676 - 456 + 2, 0xF80014); + put_long (0x676 - 216 + 2, 0xF80020); + put_long (0x676 - 198 + 2, 0xF80026); + put_long (0x676 - 204 + 2, 0xF8002c); + put_long (0x676 - 210 + 2, 0xF8002a); + /* Build an IORequest */ request = 0x800; put_word (request + 0x1C, 2); put_long (request + 0x28, 0x4000); put_long (request + 0x2C, 0); put_long (request + 0x24, 0x200 * 4); - regs.a[1] = request; + m68k_areg(regs, 1) = request; ersatz_doio (); m68k_setpc (0x400C); + fill_prefetch_0 (); /* Init the hardware */ - put_long (0x3000, 0xFFFFFFFE); + put_long (0x3000, 0xFFFFFFFEul); put_long (0xDFF080, 0x3000); put_word (0xDFF088, 0); put_word (0xDFF096, 0xE390); @@ -139,7 +153,7 @@ static void ersatz_init (void) put_word (0xDFF08E, 0x2C81); put_word (0xDFF090, 0xF4C1); put_word (0xDFF02A, 0x8000); - + put_byte (0xBFD100, 0xF7); put_byte (0xBFEE01, 0); put_byte (0xBFEF01, 0x08); @@ -149,38 +163,44 @@ static void ersatz_init (void) put_byte (0xBFED01, 0x9F); } -void ersatz_perform (UWORD what) +void ersatz_perform (uae_u16 what) { switch (what) { case EOP_INIT: ersatz_init (); break; - + case EOP_SERVEINT: /* Just reset all the interrupt request bits */ put_word (0xDFF09C, get_word (0xDFF01E) & 0x3FFF); break; - + case EOP_DOIO: ersatz_doio (); break; - + case EOP_AVAILMEM: - regs.d[0] = regs.d[1] & 4 ? 0 : 0x70000; + m68k_dreg(regs, 0) = m68k_dreg(regs, 1) & 4 ? 0 : 0x70000; break; - + case EOP_ALLOCMEM: - regs.d[0] = regs.d[1] & 4 ? 0 : 0x0F000; + m68k_dreg(regs, 0) = m68k_dreg(regs, 1) & 4 ? 0 : 0x0F000; break; case EOP_ALLOCABS: - regs.d[0] = regs.a[1]; + m68k_dreg(regs, 0) = m68k_areg(regs, 1); break; case EOP_NIMP: - fprintf(stderr, "Unimplemented Kickstart function called\n"); - abort (); - case EOP_OPENLIB: + fprintf (stderr, "Unimplemented Kickstart function called\n"); + uae_quit (); + + /* fall through */ + case EOP_LOOP: + m68k_setpc (0xF80010); + break; + + case EOP_OPENLIB: default: fprintf(stderr, "Internal error. Giving up.\n"); abort ();