--- uae/src/autoconf.c 2018/04/24 16:38:39 1.1.1.1 +++ uae/src/autoconf.c 2018/04/24 16:38:59 1.1.1.2 @@ -3,8 +3,8 @@ * * AutoConfig devices * - * (c) 1995 Bernd Schmidt - * (c) 1996 Ed Hanway + * Copyright 1995, 1996 Bernd Schmidt + * Copyright 1996 Ed Hanway */ #include "sysconfig.h" @@ -12,13 +12,26 @@ #include "config.h" #include "options.h" +#include "machdep/m68k.h" #include "memory.h" #include "custom.h" +#include "readcpu.h" #include "newcpu.h" #include "disk.h" #include "xwin.h" #include "autoconf.h" +/* We'll need a lot of these. */ +#define MAX_TRAPS 4096 +static TrapFunction traps[MAX_TRAPS]; +static char trapmode[MAX_TRAPS]; +static const char *trapstr[MAX_TRAPS]; +static CPTR trapoldfunc[MAX_TRAPS]; + +static int max_trap = 0; +static int trace_traps = 0; +int lasttrap; + static struct { CPTR libbase; TrapFunction functions[300]; /* I don't think any library has more than 300 functions */ @@ -31,15 +44,21 @@ ULONG Call68k_retaddr(CPTR address, int CPTR oldpc = m68k_getpc(); struct regstruct backup_regs; - if (saveregs) + struct flag_struct backup_flags; + + if (saveregs) { backup_regs = regs; - regs.a[7] -= 4; - put_long (regs.a[7], retaddr); + backup_flags = regflags; + } + m68k_areg(regs, 7) -= 4; + put_long (m68k_areg(regs, 7), retaddr); m68k_setpc(address); m68k_go(0); - retval = regs.d[0]; - if (saveregs) + retval = m68k_dreg(regs, 0); + if (saveregs) { regs = backup_regs; + regflags = backup_flags; + } m68k_setpc(oldpc); return retval; } @@ -52,7 +71,7 @@ ULONG Call68k(CPTR address, int saveregs ULONG CallLib(CPTR base, WORD offset) { int i; - CPTR olda6 = regs.a[6]; + CPTR olda6 = m68k_areg(regs, 6); ULONG retval; for (i = 0; i < n_libpatches; i++) { @@ -60,9 +79,9 @@ ULONG CallLib(CPTR base, WORD offset) return (*libpatches[i].functions[-offset/6])(); } - regs.a[6] = base; + m68k_areg(regs, 6) = base; retval = Call68k(base + offset, 1); - regs.a[6] = olda6; + m68k_areg(regs, 6) = olda6; return retval; } @@ -70,19 +89,23 @@ ULONG CallLib(CPTR base, WORD offset) static volatile int four = 4; CPTR libemu_InstallFunctionFlags(TrapFunction f, CPTR libbase, int offset, - int flags) + int flags, const char *tracename) { int i; CPTR retval; CPTR execbase = get_long(four); + int trnum; ULONG addr = here(); - calltrap2(deftrap2(f, flags)); + calltrap2(trnum = deftrap2(f, flags, tracename)); dw(RTS); - regs.a[1] = libbase; - regs.a[0] = offset; - regs.d[0] = addr; + m68k_areg(regs, 1) = libbase; + m68k_areg(regs, 0) = offset; + m68k_dreg(regs, 0) = addr; retval = CallLib(execbase, -420); + + trapoldfunc[trnum] = retval; + for (i = 0; i < n_libpatches; i++) { if (libpatches[i].libbase == libbase) break; @@ -98,16 +121,17 @@ CPTR libemu_InstallFunctionFlags(TrapFun return retval; } -CPTR libemu_InstallFunction(TrapFunction f, CPTR libbase, int offset) +CPTR libemu_InstallFunction(TrapFunction f, CPTR libbase, int offset, + const char *tracename) { - return libemu_InstallFunctionFlags(f, libbase, offset, 0); + return libemu_InstallFunctionFlags(f, libbase, offset, 0, tracename); } /* Commonly used autoconfig strings */ CPTR EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion; CPTR EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36; -CPTR EXPANSION_bootcode; +CPTR EXPANSION_bootcode, EXPANSION_nullfunc; static int current_deviceno = 0; @@ -117,7 +141,7 @@ int get_new_device(char **devname, CPTR sprintf(buffer,"UAE%d", current_deviceno); - *devname_amiga = ds(*devname = strdup(buffer)); + *devname_amiga = ds(*devname = my_strdup(buffer)); return current_deviceno++; } @@ -126,11 +150,11 @@ int get_new_device(char **devname, CPTR static UBYTE rtarea[65536]; static ULONG rtarea_lget(CPTR) REGPARAM; -static UWORD rtarea_wget(CPTR) REGPARAM; -static UBYTE rtarea_bget(CPTR) REGPARAM; +static ULONG rtarea_wget(CPTR) REGPARAM; +static ULONG 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 void rtarea_wput(CPTR, ULONG) REGPARAM; +static void rtarea_bput(CPTR, ULONG) REGPARAM; static UBYTE *rtarea_xlate(CPTR) REGPARAM; addrbank rtarea_bank = { @@ -140,60 +164,66 @@ addrbank rtarea_bank = { rtarea_xlate, default_check }; -UBYTE *rtarea_xlate(CPTR addr) +UBYTE REGPARAM2 *rtarea_xlate(CPTR addr) { addr &= 0xFFFF; return rtarea + addr; } -ULONG rtarea_lget(CPTR addr) +ULONG REGPARAM2 rtarea_lget(CPTR addr) { addr &= 0xFFFF; return (ULONG)(rtarea_wget(addr) << 16) + rtarea_wget(addr+2); } -UWORD rtarea_wget(CPTR addr) +ULONG REGPARAM2 rtarea_wget(CPTR addr) { addr &= 0xFFFF; return (rtarea[addr]<<8) + rtarea[addr+1]; } -UBYTE rtarea_bget(CPTR addr) +ULONG REGPARAM2 rtarea_bget(CPTR addr) { UWORD data; addr &= 0xFFFF; return rtarea[addr]; } -void rtarea_lput(CPTR addr, ULONG value) { } -void rtarea_bput(CPTR addr, UBYTE value) { } +void REGPARAM2 rtarea_lput(CPTR addr, ULONG value) { } +void REGPARAM2 rtarea_bput(CPTR addr, ULONG 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) { struct regstruct backup_regs; ULONG retval; - if ((trapmode[tr] & 1) == 0) + if (*trapstr[tr] != 0 && trace_traps) + fprintf(stderr, "TRAP: %s\n", trapstr[tr]); + + /* For monitoring only? */ + if (traps[tr] == NULL) { + Call68k(trapoldfunc[tr], 0); + if (*trapstr[tr] != 0 && trace_traps) + fprintf(stderr, "RET : %s\n", trapstr[tr]); + return; + } + + if ((trapmode[tr] & TRAPFLAG_NOREGSAVE) == 0) backup_regs = regs; + retval = (*traps[tr])(); - if ((trapmode[tr] & 1) == 0) + + if ((trapmode[tr] & TRAPFLAG_NOREGSAVE) == 0) regs = backup_regs; - if ((trapmode[tr] & 2) == 0) - regs.d[0] = retval; + if ((trapmode[tr] & TRAPFLAG_NORETVAL) == 0) { + m68k_dreg(regs, 0) = retval; + } } -void rtarea_wput(CPTR addr, UWORD value) +void REGPARAM2 rtarea_wput(CPTR addr, ULONG value) { /* Save all registers */ struct regstruct backup_regs; @@ -201,8 +231,8 @@ void rtarea_wput(CPTR addr, UWORD value) ULONG func = ((addr - trap_base_addr) & 0xFFFF) >> 1; if (func == 0) { - lasttrap = get_long(regs.a[7]); - regs.a[7] += 4; + lasttrap = get_long(m68k_areg(regs, 7)); + m68k_areg(regs, 7) += 4; regs.spcflags |= SPCFLAG_EMULTRAP; return; } @@ -214,7 +244,7 @@ void rtarea_wput(CPTR addr, UWORD value) fprintf(stderr, "illegal emulator trap\n"); } regs = backup_regs; - regs.d[0] = retval; + m68k_dreg(regs, 0) = retval; } /* some quick & dirty code to fill in the rt area and save me a lot of @@ -252,7 +282,7 @@ ULONG ds(char *str) int len = strlen(str) + 1; rt_straddr -= len; - strcpy(rtarea + rt_straddr, str); + strcpy((char *)rtarea + rt_straddr, str); return addr(rt_straddr); } @@ -291,14 +321,16 @@ int deftrap(TrapFunction func) int num = max_trap++; traps[num] = func; trapmode[num] = 0; + trapstr[num] = ""; return num; } -int deftrap2(TrapFunction func, int mode) +int deftrap2(TrapFunction func, int mode, const char *str) { int num = max_trap++; traps[num] = func; trapmode[num] = mode; + trapstr[num] = str; return num; } @@ -309,10 +341,16 @@ void align(int b) static ULONG bootcode(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_areg(regs, 1) = EXPANSION_doslibname; + m68k_dreg(regs, 0) = CallLib (m68k_areg(regs, 6), -96); /* FindResident() */ + m68k_areg(regs, 0) = get_long(m68k_dreg(regs, 0) + 22); /* get dos.library rt_init */ + return m68k_areg(regs, 0); +} + +static ULONG nullfunc(void) +{ + fprintf(stderr, "Null function called\n"); + return 0; } void rtarea_init() @@ -331,20 +369,82 @@ void rtarea_init() align(4); EXPANSION_bootcode = here(); - calltrap2(deftrap2(bootcode, 1)); + calltrap2(deftrap2(bootcode, 1, "")); dw(0x2040); /* move.l d0,a0 */ dw(0x4e90); /* jsr (a0) */ dw(RTS); - a = here(); - - /* Idle task */ - org(0xF0FFF0 - 4); - dw(0x4E72); dw (0x2000); /* STOP 0x2000 */ + EXPANSION_nullfunc = here(); + calltrap(deftrap(nullfunc)); + dw(RTS); + a = here(); /* Standard "return from 68k mode" trap */ - /*org(0xF0FFF0); */ + org(0xF0FFF0); calltrap2(0); dw(RTS); org(a); } + +static ULONG hyperchip_init(void) +{ +#if 0 /* This doesn't work either. Arrrgh!! */ + CPTR execbase = get_long(4); + CPTR memlist = execbase + 322; + CPTR memh; + + for (;;) { + memh = get_long(memlist); + if (get_long(memh) == 0) { + fprintf(stderr, "No chip memory !?!??\n"); + return 0; + } + + if (get_word(memh + 14) == 3) + break; + + memlist = memh; + } + put_long(memh + 24, get_long(memh + 24) + chipmem_size - 0x200000); + put_long(memh + 28, get_long(memh + 28) + chipmem_size - 0x200000); + memlist = memh + 16; + for (;;) { + memh = get_long(memlist); + if (memh == 0) + break; + memlist = memh; + } + put_long(memlist, 0x200000); + put_long(0x200000, 0); + put_long(0x200004, chipmem_size - 0x200000); +#endif + return 0; +} + +void rtarea_setup(void) +{ +#if 0 + if (chipmem_size > 0x200000) { + CPTR a = here(); + /* Build a struct Resident for the 8MB chipmem support */ + dw(0x4AFC); + dl(a); + dl(a + 0x1A); /* Continue scan here */ + dw(0x0101); /* RTF_COLDSTART; Version 1 */ + dw(0x0305); /* NT_DEVICE; pri 05 */ + a = ds("UAE HyperChip (tm)"); + dl(a); dl(a); /* Identification */ + dl(here() + 4); /* Init code */ + + calltrap(deftrap(hyperchip_init)); +#if 0 /* This doesn't work for some reason */ + dw(0x2c78); dw(4); /* move.l $4,a6 */ + dw(0x203c); dl(chipmem_size - 0x200000); + dw(0x7203); dw(0x74f6); + dw(0x207c); dl(0x200000); + dw(0x227c); dl(ds("Chip RAM")); + dw(0x4eee); dw(0xfd96); /* jmp AddMemList(a6) */ +#endif + } +#endif +}