Exemplo n.º 1
0
uaecptr libemu_InstallFunctionFlags (TrapFunction f, uaecptr libbase, int offset,
				     int flags, const char *tracename)
{
    int i;
    uaecptr retval;
    uaecptr execbase = get_long (four);
    int trnum;
    uaecptr addr = here();
    calltrap (trnum = deftrap2 (f, flags, tracename));
    dw (RTS);

    _68k_areg(1) = libbase;
    _68k_areg(0) = offset;
    _68k_dreg(0) = addr;
    retval = CallLib (execbase, -420);

    trapoldfunc[trnum] = retval;
#if 0
    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;
#endif
    return retval;
}
Exemplo n.º 2
0
static uae_u32 call_m68k (uaecptr addr, int saveuae_regs)
{
    volatile uae_u32 retval = 0;
    volatile int do_save = saveuae_regs;
    if (current_extra_stack == NULL)
	return 0;
#ifdef CAN_DO_STACK_MAGIC
    {
	volatile struct uae_regstruct saved_uae_regs;
	jmp_buf *j = (jmp_buf *)current_extra_stack;

	if (do_save)
	    saved_uae_regs = uae_regs;
	m68k_calladdr = addr;
	switch (setjmp(j[1])) {
	 case 0:
	    /*write_log ("doing call\n");*/
	    /* Returning directly: now switch to main stack and do the call */
	    longjmp (j[0], 2);
	 case 1:
	    /*write_log ("returning from call\n");*/
	    retval = _68k_dreg (0);
	    if (do_save)
		uae_regs = saved_uae_regs;
	    /* Returning after the call. */
	    break;
	}
    }
#endif
    return retval;
}
Exemplo n.º 3
0
void carga(void)
{
    unsigned pc,sr,a0,a1,a2,a3,a4,a5,a6,a7,d0,d1,d2,d3,d4,d5,d6,d7;
    FILE *f=fopen("/tmp/uae4all_guarda","rb");
    if (f)
    {
        fread((void *)&pc,sizeof(unsigned),1,f);
        fread((void *)&sr,sizeof(unsigned),1,f);
        fread((void *)&a0,sizeof(unsigned),1,f);
        fread((void *)&a1,sizeof(unsigned),1,f);
        fread((void *)&a2,sizeof(unsigned),1,f);
        fread((void *)&a3,sizeof(unsigned),1,f);
        fread((void *)&a4,sizeof(unsigned),1,f);
        fread((void *)&a5,sizeof(unsigned),1,f);
        fread((void *)&a6,sizeof(unsigned),1,f);
        fread((void *)&a7,sizeof(unsigned),1,f);
        fread((void *)&d0,sizeof(unsigned),1,f);
        fread((void *)&d1,sizeof(unsigned),1,f);
        fread((void *)&d2,sizeof(unsigned),1,f);
        fread((void *)&d3,sizeof(unsigned),1,f);
        fread((void *)&d4,sizeof(unsigned),1,f);
        fread((void *)&d5,sizeof(unsigned),1,f);
        fread((void *)&d6,sizeof(unsigned),1,f);
        fread((void *)&d7,sizeof(unsigned),1,f);
        fread((void *)chipmemory,1,allocated_chipmem,f);
        fclose(f);
        {
            unsigned char *p=(unsigned char *)chipmemory;
            unsigned i;
            for (i=0; i<allocated_chipmem; i+=2)
            {
                unsigned char t=p[i];
                p[i]=p[i+1];
                p[i+1]=t;
            }
        }
        _68k_areg(0)=a0;
        _68k_areg(1)=a1;
        _68k_areg(2)=a2;
        _68k_areg(3)=a3;
        _68k_areg(4)=a4;
        _68k_areg(5)=a5;
        _68k_areg(6)=a6;
        _68k_areg(7)=a7;
        _68k_dreg(0)=d0;
        _68k_dreg(1)=d1;
        _68k_dreg(2)=d2;
        _68k_dreg(3)=d3;
        _68k_dreg(4)=d4;
        _68k_dreg(5)=d5;
        _68k_dreg(6)=d6;
        _68k_dreg(7)=d7;
        _68k_sreg=sr;
        _68k_setpc(pc);
    }
}
Exemplo n.º 4
0
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:
	_68k_dreg(0) = _68k_dreg(1) & 4 ? 0 : 0x70000;
	break;

     case EOP_ALLOCMEM:
	_68k_dreg(0) = _68k_dreg(1) & 4 ? 0 : 0x0F000;
	break;

     case EOP_ALLOCABS:
	_68k_dreg(0) = _68k_areg(1);
	break;

     case EOP_NIMP:
	write_log ("Unimplemented Kickstart function called\n");
	uae_quit ();
	
	/* fall through */
     case EOP_LOOP:
	_68k_setpc (0xF80010);
	break;

     case EOP_OPENLIB:
     default:
	write_log ("Internal error. Giving up.\n");
	return;
    }
}
Exemplo n.º 5
0
uaecptr libemu_InstallFunctionFlags (TrapFunction f, uaecptr libbase, int offset,
				     int flags, const char *tracename)
{
    int i;
    uaecptr retval;
    uaecptr execbase = get_long (four);
    int trnum;
    uaecptr addr = here();
    calltrap (trnum = deftrap2 (f, flags, tracename));
    dw (RTS);

    _68k_areg(1) = libbase;
    _68k_areg(0) = offset;
    _68k_dreg(0) = addr;
    retval = CallLib (execbase, -420);

    trapoldfunc[trnum] = retval;
    return retval;
}
Exemplo n.º 6
0
static void do_stack_magic (TrapFunction f, void *s, int has_retval)
{
#ifdef CAN_DO_STACK_MAGIC
    uaecptr a7;
    jmp_buf *j = (jmp_buf *)s;
    switch (setjmp (j[0])) {
     case 0:
	/* Returning directly */
	current_extra_stack = s;
	if (has_retval == -1) {
	    /*write_log ("finishing m68k mode return\n");*/
	    longjmp (j[1], 1);
	}
	/*write_log ("calling native function\n");*/
	transfer_control (s, EXTRA_STACK_SIZE, stack_stub, f, has_retval);
	/* not reached */
	return;

     case 1:
	/*write_log ("native function complete\n");*/
	/* Returning normally. */
	if (stack_has_retval (s, EXTRA_STACK_SIZE))
	    _68k_dreg (0) = get_retval_from_stack (s, EXTRA_STACK_SIZE);
	free_extra_stack (s);
	break;

     case 2:
	/* Returning to do a m68k call. We're now back on the main stack. */
	a7 = _68k_areg(7) -= (sizeof (void *) + 7) & ~3;
	/* Save stack to restore */
	*((void **)get_real_address (a7 + 4)) = s;
	/* Save special return address: this address contains a
	 * calltrap that will longjmp to the right stack. */
	put_long (_68k_areg (7), RTAREA_BASE + 0xFF00);
	_68k_setpc (m68k_calladdr);
	fill_prefetch_0 ();
	/*write_log ("native function calls m68k\n");*/
	break;
    }
    current_extra_stack = 0;
#endif
}
Exemplo n.º 7
0
void REGPARAM2 call_calltrap(int func)
{
    uae_u32 retval = 0;
    int has_retval = (trapmode[func] & TRAPFLAG_NO_RETVAL) == 0;
    int implicit_rts = (trapmode[func] & TRAPFLAG_DORET) != 0;

    if (*trapstr[func] != 0 && trace_traps)
	write_log ("TRAP: %s\n", trapstr[func]);

    /* For monitoring only? */
    if (traps[func] == NULL) {
	_68k_setpc(trapoldfunc[func]);
	fill_prefetch_0 ();
	return;
    }

    if (func < max_trap) {
	if (trapmode[func] & TRAPFLAG_EXTRA_STACK) {
	    execute_fn_on_extra_stack(traps[func], has_retval);
	    return;
	}
	retval = (*traps[func])();
    } else
	write_log ("illegal emulator trap\n");
    
    if (has_retval)
	_68k_dreg(0) = retval;
    if (implicit_rts) {
#ifndef USE_FAME_CORE
    	m68k_do_rts ();
#else
    	/* WinUAE code - m68k_do_rts() */
    	_68k_setpc(get_long(_68k_areg(7)));
    	_68k_areg(7) += 4;
    	/*******************************/
#endif
    	fill_prefetch_0 ();
    }
}