MCUME/MCUME_teensy41/teensyuae/autoconf.c

263 wiersze
5.3 KiB
C

/*
* UAE - The Un*x Amiga Emulator
*
* AutoConfig devices
*
* Copyright 1995, 1996 Bernd Schmidt
* Copyright 1996 Ed Hanway
*/
#include "shared.h"
#include "machdep/m68k.h"
#include "uae.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 32 //4096
static TrapFunction traps[MAX_TRAPS];
static uae_u8 trapmode[MAX_TRAPS];
static uaecptr trapoldfunc[MAX_TRAPS];
static int max_trap = 0;
static uae_u32 m68k_mode_return(void)
{
return 0;
}
/* Commonly used autoconfig strings */
uaecptr EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion;
uaecptr EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36;
uaecptr EXPANSION_bootcode, EXPANSION_nullfunc;
static int current_deviceno = 0;
int get_new_device(char **devname, uaecptr *devname_amiga)
{
char buffer[80];
strcpy(buffer,"UAE1");
//buffer[0]=0;
sprintf(buffer,"UAE%d", current_deviceno);
emu_printf("get new device");
emu_printf(buffer);
*devname_amiga = ds(*devname = my_strdup(buffer));
return current_deviceno++;
}
/* ROM tag area memory access */
static uae_u8 rtarea[65536];
//static uae_u8 * rtarea;
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_bget,
rtarea_lput, rtarea_wput, rtarea_bput,
rtarea_xlate, default_check
};
uae_u8 REGPARAM2 *rtarea_xlate(uaecptr addr)
{
addr &= 0xFFFF;
return rtarea + addr;
}
uae_u32 REGPARAM2 rtarea_lget(uaecptr addr)
{
addr &= 0xFFFF;
return (uae_u32)(rtarea_wget(addr) << 16) + rtarea_wget(addr+2);
}
uae_u32 REGPARAM2 rtarea_wget(uaecptr addr)
{
addr &= 0xFFFF;
return (rtarea[addr]<<8) + rtarea[addr+1];
}
uae_u32 REGPARAM2 rtarea_bget(uaecptr addr)
{
uae_u16 data;
addr &= 0xFFFF;
return rtarea[addr];
}
void REGPARAM2 rtarea_lput(uaecptr addr, uae_u32 value) { }
void REGPARAM2 rtarea_bput(uaecptr addr, uae_u32 value) { }
/* Don't start at 0 -- can get bogus writes there. */
static uae_u32 trap_base_addr = 0x00F00180;
void REGPARAM2 rtarea_wput(uaecptr addr, uae_u32 value)
{
uae_u32 retval = 0;
uae_u32 func = ((addr - trap_base_addr) & 0xFFFF) >> 1;
int has_retval = (trapmode[func] & TRAPFLAG_NO_RETVAL) == 0;
/* For monitoring only? */
if (traps[func] == NULL) {
m68k_setpc(trapoldfunc[func]);
return;
}
if (func < max_trap) {
if (trapmode[func] & TRAPFLAG_EXTRA_STACK) {
//execute_fn_on_extra_stack(traps[func], has_retval);
return;
}
retval = (*traps[func])();
}
if (has_retval)
m68k_dreg(regs, 0) = retval;
}
/* some quick & dirty code to fill in the rt area and save me a lot of
* scratch paper
*/
static int rt_addr = 0;
static int rt_straddr = 0xFF00 - 2;
uae_u32 addr(int ptr)
{
return (uae_u32)ptr + 0x00F00000;
}
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(uae_u32 data)
{
rtarea[rt_addr++] = data >> 24;
rtarea[rt_addr++] = data >> 16;
rtarea[rt_addr++] = data >> 8;
rtarea[rt_addr++] = data;
}
/* store strings starting at the end of the rt area and working
* backward. store pointer at current address
*/
uae_u32 ds(char *str)
{
int len = strlen(str) + 1;
rt_straddr -= len;
strcpy((char *)rtarea + rt_straddr, str);
return addr(rt_straddr);
}
void calltrap(uae_u32 n)
{
dw(0x33C0); /* MOVE.W D0,abs32 */
dl(n*2 + trap_base_addr);
}
void org(uae_u32 a)
{
rt_addr = a - 0x00F00000;
}
uae_u32 here(void)
{
return addr(rt_addr);
}
int deftrap2(TrapFunction func, int mode, const char *str)
{
int num = max_trap++;
traps[num] = func;
trapmode[num] = mode;
return num;
}
int deftrap(TrapFunction func)
{
return deftrap2(func, 0, "");
}
void align(int b)
{
rt_addr = (rt_addr + (b-1)) & ~(b-1);
}
static uae_u32 nullfunc(void)
{
fprintf(stderr, "Null function called\n");
return 0;
}
static uae_u32 getchipmemsize (void)
{
return chipmem_size;
}
void rtarea_init()
{
uae_u32 a;
char uaever[100];
sprintf(uaever, "uae-%d.%d.%d", (version / 100) % 10, (version / 10) % 10, (version / 1) % 10);
//rtarea = emu_Malloc(65536);
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();
/* Standard "return from 68k mode" trap */
org(0xF0FF00);
calltrap (deftrap2(m68k_mode_return, TRAPFLAG_NO_RETVAL, ""));
org (0xF0FF80);
calltrap (deftrap (getchipmemsize));
dw (RTS);
org(a);
filesys_install_code ();
}
volatile int uae_int_requested = 0;
void set_uae_int_flag (void)
{
rtarea[0xFFFB] = uae_int_requested;
}