--- uae/src/autoconf.c 2018/04/24 16:38:39 1.1 +++ uae/src/autoconf.c 2018/04/24 17:18:18 1.1.1.13 @@ -1,222 +1,84 @@ - /* + /* * UAE - The Un*x Amiga Emulator - * + * * AutoConfig devices * - * (c) 1995 Bernd Schmidt - * (c) 1996 Ed Hanway + * Copyright 1995, 1996 Bernd Schmidt + * Copyright 1996 Ed Hanway */ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" #include "options.h" +#include "uae.h" #include "memory.h" #include "custom.h" #include "newcpu.h" -#include "disk.h" -#include "xwin.h" #include "autoconf.h" - -static struct { - CPTR libbase; - TrapFunction functions[300]; /* I don't think any library has more than 300 functions */ -} libpatches[20]; -static int n_libpatches = 0; - -ULONG Call68k_retaddr(CPTR address, int saveregs, CPTR retaddr) -{ - ULONG retval; - CPTR oldpc = m68k_getpc(); - - struct regstruct backup_regs; - if (saveregs) - backup_regs = regs; - regs.a[7] -= 4; - put_long (regs.a[7], retaddr); - m68k_setpc(address); - m68k_go(0); - retval = regs.d[0]; - if (saveregs) - regs = backup_regs; - m68k_setpc(oldpc); - return retval; -} - -ULONG Call68k(CPTR address, int saveregs) -{ - return Call68k_retaddr(address, saveregs, 0xF0FFF0); -} - -ULONG CallLib(CPTR base, WORD offset) -{ - int i; - CPTR olda6 = regs.a[6]; - ULONG retval; - - for (i = 0; i < n_libpatches; i++) { - if (libpatches[i].libbase == base && libpatches[i].functions[-offset/6] != NULL) - return (*libpatches[i].functions[-offset/6])(); - } - - regs.a[6] = base; - retval = Call68k(base + offset, 1); - regs.a[6] = olda6; - return retval; -} - -/* @$%&§ compiler bugs */ -static volatile int four = 4; - -CPTR libemu_InstallFunctionFlags(TrapFunction f, CPTR libbase, int offset, - int flags) -{ - int i; - CPTR retval; - CPTR execbase = get_long(four); - ULONG addr = here(); - calltrap2(deftrap2(f, flags)); - dw(RTS); - - regs.a[1] = libbase; - regs.a[0] = offset; - regs.d[0] = addr; - retval = CallLib(execbase, -420); - for (i = 0; i < n_libpatches; i++) { - if (libpatches[i].libbase == libbase) - break; - } - if (i == n_libpatches) { - int j; - libpatches[i].libbase = libbase; - for (j = 0; j < 300; j++) - libpatches[i].functions[j] = NULL; - n_libpatches++; - } - libpatches[i].functions[-offset/6] = f; - return retval; -} - -CPTR libemu_InstallFunction(TrapFunction f, CPTR libbase, int offset) -{ - return libemu_InstallFunctionFlags(f, libbase, offset, 0); -} +#include "traps.h" /* Commonly used autoconfig strings */ -CPTR EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion; -CPTR EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36; -CPTR EXPANSION_bootcode; - -static int current_deviceno = 0; - -int get_new_device(char **devname, CPTR *devname_amiga) -{ - char buffer[80]; - - sprintf(buffer,"UAE%d", current_deviceno); - - *devname_amiga = ds(*devname = strdup(buffer)); - return current_deviceno++; -} +uaecptr EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion; +uaecptr EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36; +uaecptr EXPANSION_bootcode, EXPANSION_nullfunc; +uaecptr EXPANSION_cddevice; /* ROM tag area memory access */ -static UBYTE rtarea[65536]; +uae_u8 *rtarea; -static ULONG rtarea_lget(CPTR) REGPARAM; -static UWORD rtarea_wget(CPTR) REGPARAM; -static UBYTE rtarea_bget(CPTR) REGPARAM; -static void rtarea_lput(CPTR, ULONG) REGPARAM; -static void rtarea_wput(CPTR, UWORD) REGPARAM; -static void rtarea_bput(CPTR, UBYTE) REGPARAM; -static UBYTE *rtarea_xlate(CPTR) REGPARAM; +static uae_u32 rtarea_lget (uaecptr) REGPARAM; +static uae_u32 rtarea_wget (uaecptr) REGPARAM; +static uae_u32 rtarea_bget (uaecptr) REGPARAM; +static void rtarea_lput (uaecptr, uae_u32) REGPARAM; +static void rtarea_wput (uaecptr, uae_u32) REGPARAM; +static void rtarea_bput (uaecptr, uae_u32) REGPARAM; +static uae_u8 *rtarea_xlate (uaecptr) REGPARAM; -addrbank rtarea_bank = { - rtarea_lget, rtarea_wget, - rtarea_lget, rtarea_wget, rtarea_bget, - rtarea_lput, rtarea_wput, rtarea_bput, - rtarea_xlate, default_check -}; - -UBYTE *rtarea_xlate(CPTR addr) +static uae_u8 REGPARAM2 *rtarea_xlate (uaecptr addr) { addr &= 0xFFFF; return rtarea + addr; } -ULONG rtarea_lget(CPTR addr) +static uae_u32 REGPARAM2 rtarea_lget (uaecptr addr) { addr &= 0xFFFF; - return (ULONG)(rtarea_wget(addr) << 16) + rtarea_wget(addr+2); + return (uae_u32)(rtarea_wget (addr) << 16) + rtarea_wget (addr+2); } -UWORD rtarea_wget(CPTR addr) +static uae_u32 REGPARAM2 rtarea_wget (uaecptr addr) { addr &= 0xFFFF; return (rtarea[addr]<<8) + rtarea[addr+1]; } -UBYTE rtarea_bget(CPTR addr) +static uae_u32 REGPARAM2 rtarea_bget (uaecptr addr) { - UWORD data; addr &= 0xFFFF; return rtarea[addr]; } -void rtarea_lput(CPTR addr, ULONG value) { } -void rtarea_bput(CPTR addr, UBYTE value) { } - -/* Don't start at 0 -- can get bogus writes there. */ -static ULONG trap_base_addr = 0x00F00180; - -/* We'll need a lot of these. */ -TrapFunction traps[16384]; -char trapmode[16384]; - -static int max_trap = 0; - -int lasttrap; - -void do_emultrap(int tr) +static void REGPARAM2 rtarea_lput (uaecptr addr, uae_u32 value) { - struct regstruct backup_regs; - ULONG retval; - - if ((trapmode[tr] & 1) == 0) - backup_regs = regs; - retval = (*traps[tr])(); - if ((trapmode[tr] & 1) == 0) - regs = backup_regs; - if ((trapmode[tr] & 2) == 0) - regs.d[0] = retval; } -void rtarea_wput(CPTR addr, UWORD value) +static void REGPARAM2 rtarea_wput (uaecptr addr, uae_u32 value) { - /* Save all registers */ - struct regstruct backup_regs; - ULONG retval = 0; - ULONG func = ((addr - trap_base_addr) & 0xFFFF) >> 1; +} - if (func == 0) { - lasttrap = get_long(regs.a[7]); - regs.a[7] += 4; - regs.spcflags |= SPCFLAG_EMULTRAP; - return; - } - - backup_regs = regs; - if(func < max_trap) { - retval = (*traps[func])(); - } else { - fprintf(stderr, "illegal emulator trap\n"); - } - regs = backup_regs; - regs.d[0] = retval; +static void REGPARAM2 rtarea_bput (uaecptr addr, uae_u32 value) +{ } +addrbank rtarea_bank = { + rtarea_lget, rtarea_wget, rtarea_bget, + rtarea_lput, rtarea_wput, rtarea_bput, + rtarea_xlate, default_check, NULL, "UAE Boot ROM" +}; + /* some quick & dirty code to fill in the rt area and save me a lot of * scratch paper */ @@ -224,18 +86,23 @@ void rtarea_wput(CPTR addr, UWORD value) static int rt_addr = 0; static int rt_straddr = 0xFF00 - 2; -ULONG addr(int ptr) +uae_u32 addr (int ptr) { - return (ULONG)ptr + 0x00F00000; + return (uae_u32)ptr + RTAREA_BASE; } -void dw(UWORD data) +void db (uae_u8 data) +{ + rtarea[rt_addr++] = data; +} + +void dw (uae_u16 data) { rtarea[rt_addr++] = data >> 8; rtarea[rt_addr++] = data; } -void dl(ULONG data) +void dl (uae_u32 data) { rtarea[rt_addr++] = data >> 24; rtarea[rt_addr++] = data >> 16; @@ -247,104 +114,121 @@ void dl(ULONG data) * backward. store pointer at current address */ -ULONG ds(char *str) +uae_u32 ds (char *str) { - int len = strlen(str) + 1; + int len = strlen (str) + 1; rt_straddr -= len; - strcpy(rtarea + rt_straddr, str); - - return addr(rt_straddr); + strcpy ((char *)rtarea + rt_straddr, str); + + return addr (rt_straddr); } -void calltrap2(ULONG n) +void calltrap (uae_u32 n) { - dw(0x4878); /* PEA.L n.w */ - dw(n); - /* Call trap #0 is reserved for this */ - dw(0x33C0); /* MOVE.W D0,abs32 */ - dl(trap_base_addr); + dw (0xA000 + n); } -void calltrap(ULONG n) +void org (uae_u32 a) { -#if 1 - dw(0x33C0); /* MOVE.W D0,abs32 */ - dl(n*2 + trap_base_addr); -#else - calltrap2(n); -#endif + rt_addr = a - RTAREA_BASE; } -void org(ULONG a) +uae_u32 here (void) { - rt_addr = a - 0x00F00000; + return addr (rt_addr); } -ULONG here(void) +void align (int b) { - return addr(rt_addr); + rt_addr = (rt_addr + b - 1) & ~(b - 1); } -int deftrap(TrapFunction func) +static uae_u32 nullfunc (TrapContext *dummy) { - int num = max_trap++; - traps[num] = func; - trapmode[num] = 0; - return num; + write_log ("Null function called\n"); + return 0; } -int deftrap2(TrapFunction func, int mode) +static uae_u32 getchipmemsize (TrapContext *dummy) { - int num = max_trap++; - traps[num] = func; - trapmode[num] = mode; - return num; + return allocated_chipmem; } -void align(int b) +static uae_u32 uae_puts (TrapContext *dummy) { - rt_addr = (rt_addr + (b-1)) & ~(b-1); + puts (get_real_address (m68k_areg (regs, 0))); + return 0; } -static ULONG bootcode(void) +/* Used to keep the m68k emulation sane when we hit a call to + * default_xlate. */ +static void m68k_infinite_loop (void) { - regs.a[1] = EXPANSION_doslibname; - regs.d[0] = CallLib (regs.a[6], -96); /* FindResident() */ - regs.a[0] = get_long(regs.d[0]+22); /* get dos.library rt_init */ - return regs.a[0]; + m68k_setpc (0xF0FFC0); } -void rtarea_init() +static void rtarea_init_mem (void) { - ULONG a; + rtarea = mapped_malloc (0x10000, "rtarea"); + if (!rtarea) { + write_log ("virtual memory exhausted (rtarea)!\n"); + abort (); + } + rtarea_bank.baseaddr = rtarea; +} + + +void rtarea_init (void) +{ + uae_u32 a; char uaever[100]; - sprintf(uaever, "uae-%d.%d.%d", (version / 100) % 10, (version / 10) % 10, (version / 1) % 10); - EXPANSION_uaeversion = ds(uaever); - EXPANSION_explibname = ds("expansion.library"); - EXPANSION_doslibname = ds("dos.library"); - EXPANSION_uaedevname = ds("uae.device"); - - deftrap(NULL); /* Generic emulator trap */ - lasttrap = 0; - - align(4); - EXPANSION_bootcode = here(); - calltrap2(deftrap2(bootcode, 1)); - dw(0x2040); /* move.l d0,a0 */ - dw(0x4e90); /* jsr (a0) */ - dw(RTS); + rtarea_init_mem (); + + sprintf (uaever, "uae-%s", PACKAGE_VERSION); + + EXPANSION_uaeversion = ds (uaever); + EXPANSION_explibname = ds ("expansion.library"); + EXPANSION_doslibname = ds ("dos.library"); + EXPANSION_uaedevname = ds ("uae.device"); + + deftrap (NULL); /* Generic emulator trap */ + + EXPANSION_nullfunc = here (); + calltrap (deftrap (nullfunc)); + dw (RTS); a = here(); + /* Dummy trap - removing this breaks the filesys emulation. */ + org (RTAREA_BASE + 0xFF00); + calltrap (deftrap2 (nullfunc, TRAPFLAG_NO_RETVAL, "")); + + org (RTAREA_BASE + 0xFF80); + calltrap (deftrap2 (getchipmemsize, TRAPFLAG_DORET, "")); + + org (RTAREA_BASE + 0xFF10); + calltrap (deftrap2 (uae_puts, TRAPFLAG_NO_RETVAL, "")); + dw (RTS); + + org (RTAREA_BASE + 0xFFC0); + calltrap (deftrap2 (m68k_infinite_loop, TRAPFLAG_NO_RETVAL, "")); + + org (a); - /* Idle task */ - org(0xF0FFF0 - 4); - dw(0x4E72); dw (0x2000); /* STOP 0x2000 */ - - /* Standard "return from 68k mode" trap */ - /*org(0xF0FFF0); */ - calltrap2(0); - dw(RTS); - org(a); + filesys_install_code (); + + uae_boot_rom_size = here() - RTAREA_BASE; + init_extended_traps (); +} + +volatile int uae_int_requested = 0; + +void set_uae_int_flag (void) +{ + rtarea[0xFFFB] = uae_int_requested; +} + +void rtarea_setup (void) +{ }