kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
264 wiersze
5.3 KiB
C
264 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;
|
||
|
}
|
||
|
|