Patches from Walter Ruetten (walter@ghpc8.ihf.rwth-aachen.de)
and Daniel Risacher (magnus@mit.edu). Apparently with some helpful discussion from John Wittkoski (jpw@insoft.com). This works on my IIcx and IIsi. Still needs a bit of cleaning up.
This commit is contained in:
parent
b1598cdd1b
commit
b1addb6674
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: machdep.c,v 1.46 1995/06/21 03:41:51 briggs Exp $ */
|
/* $NetBSD: machdep.c,v 1.47 1995/06/25 03:24:09 briggs Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988 University of Utah.
|
* Copyright (c) 1988 University of Utah.
|
||||||
|
@ -2139,9 +2139,8 @@ static int firstpass = 1;
|
||||||
/*
|
/*
|
||||||
* Set up current ROM Glue vectors
|
* Set up current ROM Glue vectors
|
||||||
*/
|
*/
|
||||||
if (cpui->class != MACH_CLASSIIsi)
|
if ((mac68k_machine.serial_console & 0x01) == 0)
|
||||||
if ((mac68k_machine.serial_console & 0x01) == 0)
|
mrg_setvectors(cpui->rom_vectors);
|
||||||
mrg_setvectors(cpui->rom_vectors);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up any machine specific stuff that we have to before
|
* Set up any machine specific stuff that we have to before
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: macrom.c,v 1.4 1995/06/21 03:46:52 briggs Exp $ */
|
/* $NetBSD: macrom.c,v 1.5 1995/06/25 03:24:12 briggs Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (C) 1994 Bradley A. Grantham
|
* Copyright (C) 1994 Bradley A. Grantham
|
||||||
|
@ -63,36 +63,48 @@
|
||||||
|
|
||||||
|
|
||||||
/* Mac Rom Glue global variables */
|
/* Mac Rom Glue global variables */
|
||||||
u_char mrg_adbstore[512]; /* ADB Storage - what size does this need to be? */
|
/*
|
||||||
u_char mrg_adbstore2[512]; /* ADB Storage - what size does this need to be? */
|
* ADB Storage. Is 512 bytes enough? Too much?
|
||||||
u_char mrg_adbstore3[512]; /* ADB Storage - what size does this need to be? */
|
*/
|
||||||
caddr_t mrg_romadbintr = (caddr_t)0x40807002; /* ROM ADB interrupt */
|
u_char mrg_adbstore[512];
|
||||||
caddr_t mrg_rompmintr = 0; /* ROM PM (?) interrupt */
|
u_char mrg_adbstore2[512];
|
||||||
char *mrg_romident = NULL; /* identifying string for ROMs */
|
u_char mrg_adbstore3[512];
|
||||||
|
|
||||||
|
caddr_t mrg_romadbintr = (caddr_t)0x40807002; /* ROM ADB interrupt */
|
||||||
|
caddr_t mrg_rompmintr = 0; /* ROM PM (?) interrupt */
|
||||||
|
char *mrg_romident = NULL; /* ident string for ROMs */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Last straw functions; we didn't set them up, so freak out!
|
* Last straw functions; we didn't set them up, so freak out!
|
||||||
* When someone sees these called, we can finally go back and
|
* When someone sees these called, we can finally go back and
|
||||||
* bother to implement them.
|
* bother to implement them.
|
||||||
*/
|
*/
|
||||||
void mrg_lvl1dtpanic() /* Lvl1DT stopper */
|
void
|
||||||
{ printf("Agh! I was called from Lvl1DT!!!\n"); Debugger(); }
|
mrg_lvl1dtpanic() /* Lvl1DT stopper */
|
||||||
|
{ /*
|
||||||
|
* The timer tick from the Egret triggers the routine via
|
||||||
|
* Lvl1DT[2] (addr 0x19a) every second.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
void mrg_lvl2dtpanic() /* Lvl2DT stopper */
|
void
|
||||||
|
mrg_lvl2dtpanic() /* Lvl2DT stopper */
|
||||||
{ printf("Agh! I was called from Lvl2DT!!!\n"); Debugger(); }
|
{ printf("Agh! I was called from Lvl2DT!!!\n"); Debugger(); }
|
||||||
|
|
||||||
void mrg_jadbprocpanic() /* JADBProc stopper */
|
void
|
||||||
|
mrg_jadbprocpanic() /* JADBProc stopper */
|
||||||
{printf("Agh! Called JADBProc!\n"); Debugger(); }
|
{printf("Agh! Called JADBProc!\n"); Debugger(); }
|
||||||
|
|
||||||
void mrg_jswapmmupanic() /* jSwapMMU stopper */
|
void
|
||||||
|
mrg_jswapmmupanic() /* jSwapMMU stopper */
|
||||||
{printf("Agh! Called jSwapMMU!\n"); Debugger(); }
|
{printf("Agh! Called jSwapMMU!\n"); Debugger(); }
|
||||||
|
|
||||||
void mrg_jkybdtaskpanic() /* JKybdTask stopper */
|
void
|
||||||
|
mrg_jkybdtaskpanic() /* JKybdTask stopper */
|
||||||
{printf("Agh! Called JKybdTask!\n"); Debugger(); }
|
{printf("Agh! Called JKybdTask!\n"); Debugger(); }
|
||||||
|
|
||||||
|
long
|
||||||
long mrg_adbintr() /* Call ROM ADB Interrupt */
|
mrg_adbintr() /* Call ROM ADB Interrupt */
|
||||||
{
|
{
|
||||||
if(mrg_romadbintr != NULL)
|
if(mrg_romadbintr != NULL)
|
||||||
{
|
{
|
||||||
|
@ -103,7 +115,7 @@ long mrg_adbintr() /* Call ROM ADB Interrupt */
|
||||||
/* Gotta load a1 with VIA address. */
|
/* Gotta load a1 with VIA address. */
|
||||||
/* ADB int expects it from Mac intr routine. */
|
/* ADB int expects it from Mac intr routine. */
|
||||||
asm("
|
asm("
|
||||||
movml #0xffff, sp@- | better save all registers!
|
movml #0xffff, sp@- | better save all registers!
|
||||||
movl %0, a0
|
movl %0, a0
|
||||||
movl _VIA, a1
|
movl _VIA, a1
|
||||||
jbsr a0@
|
jbsr a0@
|
||||||
|
@ -119,8 +131,8 @@ long mrg_adbintr() /* Call ROM ADB Interrupt */
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long
|
||||||
long mrg_pmintr() /* Call ROM PM Interrupt */
|
mrg_pmintr() /* Call ROM PM Interrupt */
|
||||||
{
|
{
|
||||||
if(mrg_rompmintr != NULL)
|
if(mrg_rompmintr != NULL)
|
||||||
{
|
{
|
||||||
|
@ -131,7 +143,7 @@ long mrg_pmintr() /* Call ROM PM Interrupt */
|
||||||
/* Gotta load a1 with VIA address. */
|
/* Gotta load a1 with VIA address. */
|
||||||
/* ADB int expects it from Mac intr routine. */
|
/* ADB int expects it from Mac intr routine. */
|
||||||
asm("
|
asm("
|
||||||
movml #0xffff, sp@- | better save all registers!
|
movml #0xffff, sp@- | better save all registers!
|
||||||
movl %0, a0
|
movl %0, a0
|
||||||
movl _VIA, a1
|
movl _VIA, a1
|
||||||
jbsr a0@
|
jbsr a0@
|
||||||
|
@ -142,27 +154,28 @@ long mrg_pmintr() /* Call ROM PM Interrupt */
|
||||||
#if defined(MRG_TRACE)
|
#if defined(MRG_TRACE)
|
||||||
troff();
|
troff();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void mrg_notrap()
|
void
|
||||||
|
mrg_notrap()
|
||||||
{
|
{
|
||||||
printf("Aigh!\n");
|
printf("Aigh!\n");
|
||||||
panic("We're doomed!\n");
|
panic("mrg_notrap: We're doomed!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int myowntrap()
|
myowntrap()
|
||||||
{
|
{
|
||||||
printf("Oooo! My Own Trap Routine!\n");
|
printf("Oooo! My Own Trap Routine!\n");
|
||||||
return(50);
|
return(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int mrg_NewPtr()
|
int
|
||||||
|
mrg_NewPtr()
|
||||||
{
|
{
|
||||||
int result = noErr;
|
int result = noErr;
|
||||||
u_int numbytes;
|
u_int numbytes;
|
||||||
|
@ -201,8 +214,8 @@ int mrg_NewPtr()
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int mrg_DisposPtr()
|
mrg_DisposPtr()
|
||||||
{
|
{
|
||||||
int result = noErr;
|
int result = noErr;
|
||||||
caddr_t ptr;
|
caddr_t ptr;
|
||||||
|
@ -222,8 +235,8 @@ int mrg_DisposPtr()
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int mrg_GetPtrSize()
|
mrg_GetPtrSize()
|
||||||
{
|
{
|
||||||
int result = noErr;
|
int result = noErr;
|
||||||
caddr_t ptr;
|
caddr_t ptr;
|
||||||
|
@ -240,8 +253,8 @@ int mrg_GetPtrSize()
|
||||||
return(*(int *)(ptr - 4));
|
return(*(int *)(ptr - 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int mrg_SetPtrSize()
|
mrg_SetPtrSize()
|
||||||
{
|
{
|
||||||
int result = noErr;
|
int result = noErr;
|
||||||
caddr_t ptr;
|
caddr_t ptr;
|
||||||
|
@ -292,15 +305,16 @@ caddr_t mrg_OStraps[256] = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
caddr_t mrg_ToolBoxtraps[1024] = {
|
caddr_t mrg_ToolBoxtraps[1024] = {
|
||||||
[0x1a0] (caddr_t)mrg_GetResource,
|
[0x1a0] (caddr_t)mrg_GetResource,
|
||||||
[0x1af] (caddr_t)mrg_ResError,
|
[0x1af] (caddr_t)mrg_ResError,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
/* handle a supervisor mode A-line trap */
|
* Handle a supervisor mode A-line trap.
|
||||||
void mrg_aline_super(struct frame *frame)
|
*/
|
||||||
|
void
|
||||||
|
mrg_aline_super(struct frame *frame)
|
||||||
{
|
{
|
||||||
caddr_t trapaddr;
|
caddr_t trapaddr;
|
||||||
u_short trapword;
|
u_short trapword;
|
||||||
|
@ -308,17 +322,29 @@ void mrg_aline_super(struct frame *frame)
|
||||||
int trapnum;
|
int trapnum;
|
||||||
int a0passback;
|
int a0passback;
|
||||||
u_long a0bucket, d0bucket;
|
u_long a0bucket, d0bucket;
|
||||||
|
int danprint=0; /* This shouldn't be necessary, but seems to be. */
|
||||||
|
|
||||||
#if defined(MRG_DEBUG)
|
#if defined(MRG_DEBUG)
|
||||||
printf("mrg: a super");
|
printf("mrg: a super");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
trapword = *(u_short *)frame->f_pc;
|
trapword = *(u_short *)frame->f_pc;
|
||||||
|
|
||||||
|
if (trapword == 0xa71e)
|
||||||
|
danprint = 1;
|
||||||
|
|
||||||
#if defined(MRG_DEBUG)
|
#if defined(MRG_DEBUG)
|
||||||
printf(" wd 0x%x", trapword);
|
printf(" wd 0x%x", trapword);
|
||||||
#endif
|
#endif
|
||||||
isOStrap = ! TRAP_TOOLBOX(trapword);
|
isOStrap = ! TRAP_TOOLBOX(trapword);
|
||||||
trapnum = TRAP_NUM(trapword);
|
trapnum = TRAP_NUM(trapword);
|
||||||
|
|
||||||
|
if (danprint)
|
||||||
|
{
|
||||||
|
/* Without these print statements, ADBReInit fails on IIsi */
|
||||||
|
printf(""); printf("");
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(MRG_DEBUG)
|
#if defined(MRG_DEBUG)
|
||||||
printf(" %s # 0x%x", isOStrap? "OS" :
|
printf(" %s # 0x%x", isOStrap? "OS" :
|
||||||
"ToolBox", trapnum);
|
"ToolBox", trapnum);
|
||||||
|
@ -389,9 +415,9 @@ void mrg_aline_super(struct frame *frame)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* handle a user mode A-line trap */
|
/* handle a user mode A-line trap */
|
||||||
void mrg_aline_user()
|
void
|
||||||
|
mrg_aline_user()
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
/* send process a SIGILL; aline traps are illegal as yet */
|
/* send process a SIGILL; aline traps are illegal as yet */
|
||||||
|
@ -403,14 +429,12 @@ void mrg_aline_user()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern u_long traceloopstart[];
|
extern u_long traceloopstart[];
|
||||||
extern u_long traceloopend;
|
extern u_long traceloopend;
|
||||||
extern u_long *traceloopptr;
|
extern u_long *traceloopptr;
|
||||||
|
|
||||||
|
void
|
||||||
void dumptrace(
|
dumptrace()
|
||||||
void)
|
|
||||||
{
|
{
|
||||||
#if defined(MRG_TRACE)
|
#if defined(MRG_TRACE)
|
||||||
u_long *traceindex;
|
u_long *traceindex;
|
||||||
|
@ -428,10 +452,10 @@ void dumptrace(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Set ROM Vectors */
|
/* Set ROM Vectors */
|
||||||
void mrg_setvectors(
|
void
|
||||||
romvec_t *rom)
|
mrg_setvectors(rom)
|
||||||
|
romvec_t *rom;
|
||||||
{
|
{
|
||||||
if(rom == NULL)
|
if(rom == NULL)
|
||||||
return; /* whoops! ROM vectors not defined! */
|
return; /* whoops! ROM vectors not defined! */
|
||||||
|
@ -442,6 +466,20 @@ void mrg_setvectors(
|
||||||
/* mrg_adbstore becomes ADBBase */
|
/* mrg_adbstore becomes ADBBase */
|
||||||
*((unsigned long *)(mrg_adbstore + 0x130)) = (unsigned long)rom->adb130intr;
|
*((unsigned long *)(mrg_adbstore + 0x130)) = (unsigned long)rom->adb130intr;
|
||||||
|
|
||||||
|
/* in MacIIvi otherwise uninitialized when ADBReInit() runs */
|
||||||
|
if(current_mac_model->class == MACH_CLASSIIsi)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
*((unsigned long *)(0x0dd0)) = 0x0000773f; /* Egret and ADBReInit look into these */
|
||||||
|
*((unsigned long *)(0x0dd4)) = 0x000001a6;
|
||||||
|
|
||||||
|
for (i=0; i<4; i++) /* some basic inits */
|
||||||
|
*((unsigned long *)(0x174 + 4*i)) = 0;
|
||||||
|
*((unsigned short *)(0x216)) = 0;
|
||||||
|
*((unsigned short *)(mrg_adbstore + 0x184)) = 0xff01;
|
||||||
|
}
|
||||||
|
|
||||||
/* IIsi crap */
|
/* IIsi crap */
|
||||||
*((unsigned long *)(mrg_adbstore + 0x180)) = 0x4081517c;
|
*((unsigned long *)(mrg_adbstore + 0x180)) = 0x4081517c;
|
||||||
*((unsigned long *)(mrg_adbstore + 0x194)) = 0x408151ea;
|
*((unsigned long *)(mrg_adbstore + 0x194)) = 0x408151ea;
|
||||||
|
@ -470,21 +508,19 @@ void mrg_setvectors(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* To find out if we're okay calling ROM vectors */
|
/* To find out if we're okay calling ROM vectors */
|
||||||
int mrg_romready(
|
int
|
||||||
void)
|
mrg_romready()
|
||||||
{
|
{
|
||||||
return(mrg_romident != NULL);
|
return(mrg_romident != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern unsigned long IOBase;
|
extern unsigned long IOBase;
|
||||||
extern volatile unsigned char *sccA;
|
extern volatile unsigned char *sccA;
|
||||||
|
|
||||||
|
|
||||||
/* initialize Mac ROM Glue */
|
/* initialize Mac ROM Glue */
|
||||||
void mrg_init()
|
void
|
||||||
|
mrg_init()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *findername = "MacBSD FakeFinder";
|
char *findername = "MacBSD FakeFinder";
|
||||||
|
@ -619,23 +655,34 @@ void mrg_init()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
void mrg_initadbintr()
|
mrg_initadbintr()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
via_reg(VIA1, vIFR) = 0x4; /* XXX - why are we setting the flag? */
|
if(current_mac_model->class == MACH_CLASSIIsi) {
|
||||||
|
/* _vSetupTags initializes ADBState (mrg_ADBStore2) and
|
||||||
via_reg(VIA1, vIER) = 0x84; /* enable ADB interrupt. */
|
enables interrupts */
|
||||||
|
asm(" movml a0-a2, sp@-
|
||||||
|
movl 0x0de0, a0 /* ADBState, mrg_ADBStore2 */
|
||||||
|
movl _ROMBase,a1
|
||||||
|
addl #0x147c4,a1 /* _vSetUpTags + 0x04 */
|
||||||
|
/* avoids calling _NewPtr */
|
||||||
|
jbsr a1@
|
||||||
|
movml sp@+, a0-a2 ");
|
||||||
|
} else {
|
||||||
|
via_reg(VIA1, vIFR) = 0x4; /* XXX - why are we setting the flag? */
|
||||||
|
via_reg(VIA1, vIER) = 0x84; /* enable ADB interrupt. */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mrg_fixupROMBase(obase, nbase)
|
mrg_fixupROMBase(obase, nbase)
|
||||||
caddr_t obase;
|
caddr_t obase;
|
||||||
caddr_t nbase;
|
caddr_t nbase;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u_long temp, *p, oldbase, newbase;
|
u_long temp, *p, oldbase, newbase;
|
||||||
|
|
||||||
oldbase = (u_long) obase;
|
oldbase = (u_long) obase;
|
||||||
newbase = (u_long) nbase;
|
newbase = (u_long) nbase;
|
||||||
|
|
Loading…
Reference in New Issue