1469 lines
39 KiB
C
1469 lines
39 KiB
C
/* Copyright 1994 - 1996 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_launch[] =
|
|
"$Id: launch.c 88 2005-05-25 03:59:37Z ctm $";
|
|
#endif
|
|
|
|
#include "rsys/common.h"
|
|
|
|
#include "QuickDraw.h"
|
|
#include "CQuickDraw.h"
|
|
#include "ResourceMgr.h"
|
|
#include "SegmentLdr.h"
|
|
#include "MemoryMgr.h"
|
|
#include "StdFilePkg.h"
|
|
#include "EventMgr.h"
|
|
#include "VRetraceMgr.h"
|
|
#include "OSUtil.h"
|
|
#include "FontMgr.h"
|
|
#include "ScrapMgr.h"
|
|
#include "ToolboxUtil.h"
|
|
#include "FileMgr.h"
|
|
#include "ControlMgr.h"
|
|
#include "DeviceMgr.h"
|
|
#include "SoundDvr.h"
|
|
#include "TextEdit.h"
|
|
#include "SysErr.h"
|
|
#include "MenuMgr.h"
|
|
#include "ScriptMgr.h"
|
|
#include "DeskMgr.h"
|
|
#include "AppleTalk.h"
|
|
#include "PrintMgr.h"
|
|
#include "StartMgr.h"
|
|
#include "ToolboxEvent.h"
|
|
#include "TimeMgr.h"
|
|
#include "ProcessMgr.h"
|
|
#include "AppleEvents.h"
|
|
#include "Gestalt.h"
|
|
#include "Package.h"
|
|
#include "AliasMgr.h"
|
|
|
|
#include "rsys/trapglue.h"
|
|
#include "rsys/file.h"
|
|
#include "rsys/next.h"
|
|
#include "rsys/sounddriver.h"
|
|
#include "rsys/pstuff.h"
|
|
#include "rsys/jumpvectors.h"
|
|
#include "rsys/prefs.h"
|
|
#include "rsys/flags.h"
|
|
#include "rsys/aboutpanel.h"
|
|
#include "rsys/segment.h"
|
|
#include "rsys/misc.h"
|
|
#include "rsys/pstuff.h"
|
|
#include "rsys/tesave.h"
|
|
#include "rsys/blockinterrupts.h"
|
|
#include "rsys/resource.h"
|
|
#include "rsys/hfs.h"
|
|
#include "rsys/osutil.h"
|
|
#include "rsys/memory_layout.h"
|
|
#include "rsys/stdfile.h"
|
|
#include "rsys/notmac.h"
|
|
#include "rsys/ctl.h"
|
|
#include "rsys/refresh.h"
|
|
|
|
#include "rsys/options.h"
|
|
#include "rsys/cquick.h"
|
|
#include "rsys/desk.h"
|
|
#include "rsys/parse.h"
|
|
#include "rsys/executor.h"
|
|
#include "rsys/crc.h"
|
|
#include "rsys/float.h"
|
|
#include "rsys/mman.h"
|
|
#include "rsys/vdriver.h"
|
|
#include "rsys/font.h"
|
|
#include "rsys/emustubs.h"
|
|
|
|
#include "rsys/adb.h"
|
|
#include "rsys/print.h"
|
|
#include "rsys/gestalt.h"
|
|
#include "rsys/osevent.h"
|
|
|
|
#include "rsys/cfm.h"
|
|
#include "rsys/launch.h"
|
|
#include "rsys/local_charset.h"
|
|
#include "rsys/version.h"
|
|
#include "rsys/appearance.h"
|
|
|
|
PRIVATE boolean_t ppc_launch_p = FALSE;
|
|
|
|
PUBLIC void ROMlib_set_ppc (boolean_t val)
|
|
{
|
|
ppc_launch_p = val;
|
|
}
|
|
|
|
#define CONFIGEXTENSION ".ecf"
|
|
#define OLD_CONFIG_EXTENSION ".econf" /* must be longer than configextension */
|
|
|
|
FILE *configfile;
|
|
|
|
int32 ROMlib_options;
|
|
|
|
static int16 name0stripappl(StringPtr name)
|
|
{
|
|
char *p;
|
|
int16 retval;
|
|
|
|
retval = name[0];
|
|
if (name[0] >= 5) {
|
|
p = (char *)name + name[0] + 1 - 5;
|
|
if ( p[0] == '.' &&
|
|
(p[1] == 'a' || p[1] == 'A') &&
|
|
(p[2] == 'p' || p[2] == 'P') &&
|
|
(p[3] == 'p' || p[3] == 'P') &&
|
|
(p[4] == 'l' || p[4] == 'L'))
|
|
retval -= 5;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
/*
|
|
* NOTE: ParseConfigFile now has three arguments. The second is a standard
|
|
* OSType and will be expanded to 0x1234ABCD.ecf if exefname.ecf
|
|
* doesn't open. The third is whether or not to do resizes (based on whether
|
|
* the user has changed things by hand).
|
|
*/
|
|
|
|
PUBLIC int ROMlib_nowarn32;
|
|
|
|
PUBLIC char *ROMlib_configfilename = NULL;
|
|
|
|
PUBLIC int ROMlib_pretend_help = FALSE;
|
|
PUBLIC int ROMlib_pretend_alias = FALSE;
|
|
PUBLIC int ROMlib_pretend_edition = FALSE;
|
|
PUBLIC int ROMlib_pretend_script = FALSE;
|
|
|
|
void
|
|
remalloc (char **strp)
|
|
{
|
|
char *new_string;
|
|
long len;
|
|
|
|
if (*strp)
|
|
{
|
|
len = strlen (*strp) + 1;
|
|
new_string = malloc (len);
|
|
if (new_string)
|
|
memcpy (new_string, *strp, len);
|
|
*strp = new_string;
|
|
}
|
|
}
|
|
|
|
void
|
|
reset_string (char **strp)
|
|
{
|
|
if (*strp)
|
|
free (*strp);
|
|
*strp = 0;
|
|
}
|
|
|
|
int ROMlib_desired_bpp;
|
|
|
|
PRIVATE void ParseConfigFile(StringPtr exefname, OSType type)
|
|
{
|
|
Ptr strdst, savestrdst;
|
|
INTEGER allocsize, dirsize;
|
|
int strwidth;
|
|
char *newtitle;
|
|
char *dot;
|
|
INTEGER fname0;
|
|
|
|
reset_string (&ROMlib_WindowName);
|
|
reset_string (&ROMlib_Comments);
|
|
ROMlib_desired_bpp = 0;
|
|
fname0 = name0stripappl(exefname);
|
|
allocsize = fname0;
|
|
if (allocsize < (int) sizeof("0x1234ABCD")-1) /* IMPORTANT TO CODE */
|
|
allocsize = sizeof("0x1234ABCD")-1; /* BELOW */
|
|
dirsize = strlen(ROMlib_ConfigurationFolder);
|
|
ROMlib_configfilename =
|
|
realloc(ROMlib_configfilename,
|
|
dirsize + 1 + allocsize + sizeof(OLD_CONFIG_EXTENSION));
|
|
strdst = (Ptr) ROMlib_configfilename;
|
|
BlockMove((Ptr) ROMlib_ConfigurationFolder, strdst, dirsize);
|
|
strdst += dirsize;
|
|
*strdst++ = '/';
|
|
BlockMove((Ptr) exefname+1, strdst, fname0);
|
|
savestrdst = strdst;
|
|
strdst += fname0;
|
|
BlockMove((Ptr) CONFIGEXTENSION, strdst, sizeof(CONFIGEXTENSION));
|
|
configfile = Ufopen(ROMlib_configfilename, "r");
|
|
if (!configfile) {
|
|
BlockMove((Ptr) OLD_CONFIG_EXTENSION, strdst, sizeof(OLD_CONFIG_EXTENSION));
|
|
configfile = Ufopen(ROMlib_configfilename, "r");
|
|
}
|
|
if (!configfile && type != 0) {
|
|
strdst = savestrdst;
|
|
sprintf((char *) strdst, "%08x", type);
|
|
strdst += sizeof("1234ABCD")-1;
|
|
BlockMove((Ptr) CONFIGEXTENSION, strdst, sizeof(CONFIGEXTENSION));
|
|
configfile = Ufopen(ROMlib_configfilename, "r");
|
|
}
|
|
if (configfile) {
|
|
yyparse();
|
|
|
|
if (ROMlib_get_appearance () == appearance_win3)
|
|
ROMlib_options |= ROMLIB_RECT_SCREEN_BIT;
|
|
|
|
#if 0
|
|
if (ROMlib_options & ROMLIB_NOCLOCK_BIT)
|
|
ROMlib_noclock = 1;
|
|
#endif
|
|
if (ROMlib_options & ROMLIB_BLIT_OS_BIT)
|
|
ROMlib_WriteWhen(WriteInOSEvent);
|
|
if (ROMlib_options & ROMLIB_BLIT_TRAP_BIT)
|
|
ROMlib_WriteWhen(WriteAtEndOfTrap);
|
|
if (ROMlib_options & ROMLIB_BLIT_OFTEN_BIT)
|
|
ROMlib_WriteWhen(WriteInBltrgn);
|
|
#if 0
|
|
if (ROMlib_options & ROMLIB_ACCELERATED_BIT)
|
|
ROMlib_accelerated = TRUE;
|
|
else
|
|
ROMlib_accelerated = FALSE;
|
|
#endif
|
|
if (ROMlib_options & ROMLIB_REFRESH_BIT)
|
|
ROMlib_refresh = 10;
|
|
if (ROMlib_options & ROMLIB_DIRTY_VARIANT_BIT)
|
|
ROMlib_dirtyvariant = TRUE;
|
|
else
|
|
ROMlib_dirtyvariant = FALSE;
|
|
if (ROMlib_options & ROMLIB_SOUNDOFF_BIT)
|
|
ROMlib_PretendSound = soundoff;
|
|
if (ROMlib_options & ROMLIB_PRETENDSOUND_BIT)
|
|
ROMlib_PretendSound = soundpretend;
|
|
if (ROMlib_options & ROMLIB_SOUNDON_BIT)
|
|
ROMlib_PretendSound = SOUND_WORKS_P () ? soundon : soundpretend;
|
|
#if 0
|
|
if (ROMlib_options & ROMLIB_PASSPOSTSCRIPT_BIT)
|
|
ROMlib_passpostscript = TRUE;
|
|
else
|
|
ROMlib_passpostscript = FALSE;
|
|
#else
|
|
/* #warning ROMlib_passpostscript wired to TRUE */
|
|
ROMlib_passpostscript = TRUE;
|
|
#endif
|
|
if (ROMlib_options & ROMLIB_NEWLINETOCR_BIT)
|
|
ROMlib_newlinetocr = TRUE;
|
|
else
|
|
ROMlib_newlinetocr = FALSE;
|
|
if (ROMlib_options & ROMLIB_DIRECTDISKACCESS_BIT)
|
|
ROMlib_directdiskaccess = TRUE;
|
|
else
|
|
ROMlib_directdiskaccess = FALSE;
|
|
if (ROMlib_options & ROMLIB_NOWARN32_BIT)
|
|
ROMlib_nowarn32 = TRUE;
|
|
else
|
|
ROMlib_nowarn32 = FALSE;
|
|
if (ROMlib_options & ROMLIB_FLUSHOFTEN_BIT)
|
|
ROMlib_flushoften = TRUE;
|
|
else
|
|
ROMlib_flushoften = FALSE;
|
|
|
|
if (ROMlib_options & ROMLIB_PRETEND_HELP_BIT)
|
|
ROMlib_pretend_help = TRUE;
|
|
else
|
|
ROMlib_pretend_help = FALSE;
|
|
|
|
if (ROMlib_options & ROMLIB_PRETEND_ALIAS_BIT)
|
|
ROMlib_pretend_alias = TRUE;
|
|
else
|
|
ROMlib_pretend_alias = FALSE;
|
|
|
|
if (ROMlib_options & ROMLIB_PRETEND_EDITION_BIT)
|
|
ROMlib_pretend_edition = TRUE;
|
|
else
|
|
ROMlib_pretend_edition = FALSE;
|
|
|
|
if (ROMlib_options & ROMLIB_PRETEND_SCRIPT_BIT)
|
|
ROMlib_pretend_script = TRUE;
|
|
else
|
|
ROMlib_pretend_script = FALSE;
|
|
|
|
if (ROMlib_desired_bpp)
|
|
SetDepth (MR (MainDevice), ROMlib_desired_bpp, 0, 0);
|
|
fclose(configfile);
|
|
}
|
|
|
|
#if !defined (VDRIVER_DISPLAYED_IN_WINDOW)
|
|
|
|
#define SetTitle(x) do { ROMlib_WindowName = x; } while (0)
|
|
|
|
#else
|
|
|
|
#define SetTitle(x) \
|
|
do \
|
|
{ \
|
|
char *_x; \
|
|
char *_title; \
|
|
int len; \
|
|
\
|
|
_x = (x); \
|
|
len = strlen (_x) + 1; \
|
|
_title = alloca (len); \
|
|
memcpy (_title, _x, len); \
|
|
ROMlib_localize_string (_title); \
|
|
ROMlib_SetTitle (_title); \
|
|
} \
|
|
while (0)
|
|
|
|
#endif
|
|
|
|
if (ROMlib_WindowName)
|
|
SetTitle(ROMlib_WindowName);
|
|
else {
|
|
strwidth = fname0;
|
|
newtitle = alloca(strwidth + 1);
|
|
memcpy(newtitle, exefname+1, strwidth);
|
|
newtitle[strwidth] = 0;
|
|
dot = strrchr(newtitle, '.');
|
|
if (dot && (strcmp(dot, ".appl") == 0 ||
|
|
strcmp(dot, ".APPL") == 0))
|
|
*dot = 0;
|
|
SetTitle(newtitle);
|
|
}
|
|
#if 0
|
|
if (ROMlib_ScreenLocation.first != INITIALPAIRVALUE)
|
|
ROMlib_HideScreen();
|
|
if (ROMlib_ScreenLocation.first != INITIALPAIRVALUE) {
|
|
ROMlib_SetLocation(&ROMlib_ScreenLocation);
|
|
ROMlib_ShowScreen();
|
|
}
|
|
#endif
|
|
|
|
remalloc (&ROMlib_WindowName);
|
|
remalloc (&ROMlib_Comments);
|
|
}
|
|
|
|
PRIVATE void beginexecutingat( LONGINT startpc )
|
|
{
|
|
#if defined (SYN68K)
|
|
#define ALINETRAPNUMBER 0xA
|
|
trap_install_handler( ALINETRAPNUMBER, alinehandler, (void *) 0);
|
|
#endif
|
|
|
|
EM_D0 = 0;
|
|
EM_D1 = 0xFFFC000;
|
|
EM_D2 = 0;
|
|
EM_D3 = 0x800008;
|
|
EM_D4 = 0x408;
|
|
EM_D5 = 0x10204000;
|
|
EM_D6 = 0x7F0000;
|
|
EM_D7 = 0x80000800;
|
|
|
|
EM_A0 = 0x3EF796;
|
|
EM_A1 = 0x910;
|
|
EM_A2 = EM_D3;
|
|
EM_A3 = 0;
|
|
EM_A4 = 0;
|
|
EM_A5 = CL((LONGINT) CurrentA5); /* was smashed when we
|
|
initialized above */
|
|
EM_A6 = 0x1EF;
|
|
|
|
CALL_EMULATOR(startpc);
|
|
C_ExitToShell();
|
|
}
|
|
|
|
PUBLIC LONGINT ROMlib_appbit;
|
|
|
|
size_info_t size_info;
|
|
|
|
#define VERSFMT "(0x%02x, 0x%02x, 0x%02x, 0x%02x, %d)"
|
|
#define VERSSIZE(vp) (sizeof(VERSFMT) + (vp)->shortname[0] + 6)
|
|
|
|
LONGINT ROMlib_creator;
|
|
|
|
PUBLIC void *ROMlib_foolgcc; /* to force the alloca to be done */
|
|
|
|
PUBLIC void SFSaveDisk_Update (INTEGER vrefnum, Str255 filename)
|
|
{
|
|
ParamBlockRec pbr;
|
|
Str255 save_name;
|
|
|
|
str255assign (save_name, filename);
|
|
pbr.volumeParam.ioNamePtr = (StringPtr) RM ((long) save_name);
|
|
pbr.volumeParam.ioVolIndex = CWC (-1);
|
|
pbr.volumeParam.ioVRefNum = CW (vrefnum);
|
|
PBGetVInfo (&pbr, FALSE);
|
|
SFSaveDisk = CW (-CW (pbr.volumeParam.ioVRefNum));
|
|
}
|
|
|
|
PUBLIC uint32 ROMlib_version_long;
|
|
|
|
PRIVATE boolean_t
|
|
cfrg_match (const cfir_t *cfirp, OSType arch_x, uint8 type_x, Str255 name)
|
|
{
|
|
boolean_t retval;
|
|
|
|
retval = (CFIR_ISA_X (cfirp) == arch_x &&
|
|
CFIR_TYPE_X (cfirp) == type_x &&
|
|
(!name[0] || EqualString (name, (StringPtr) CFIR_NAME (cfirp),
|
|
FALSE, TRUE)));
|
|
return retval;
|
|
}
|
|
|
|
PUBLIC cfir_t *
|
|
ROMlib_find_cfrg (Handle cfrg, OSType arch, uint8 type, Str255 name)
|
|
{
|
|
cfrg_resource_t *cfrgp;
|
|
int n_descripts;
|
|
cfir_t *cfirp;
|
|
OSType desired_arch_x;
|
|
uint8 type_x;
|
|
cfir_t *retval;
|
|
|
|
cfrgp = (cfrg_resource_t *) STARH (cfrg);
|
|
cfirp = (cfir_t *) ((char *) cfrgp + sizeof *cfrgp);
|
|
desired_arch_x = CL (arch);
|
|
type_x = CB (type);
|
|
for (n_descripts = CFRG_N_DESCRIPTS (cfrgp);
|
|
n_descripts > 0 && !cfrg_match (cfirp, desired_arch_x, type_x, name);
|
|
--n_descripts, cfirp = (cfir_t *) ((char *) cfirp + CFIR_LENGTH(cfirp)))
|
|
;
|
|
retval = n_descripts > 0 ? cfirp : 0;
|
|
|
|
return retval;
|
|
}
|
|
|
|
PRIVATE void
|
|
cfm_launch (Handle cfrg0, OSType desired_arch, FSSpecPtr fsp)
|
|
{
|
|
cfir_t *cfirp;
|
|
|
|
cfirp = ROMlib_find_cfrg (cfrg0, desired_arch, kApplicationCFrag,
|
|
(StringPtr) "");
|
|
|
|
#if (defined (powerpc) || defined (__ppc__)) && !defined (CFM_PROBLEMS)
|
|
if (cfirp)
|
|
{
|
|
Ptr mainAddr;
|
|
Str255 errName;
|
|
ConnectionID c_id;
|
|
|
|
ROMlib_release_tracking_values ();
|
|
|
|
if (CFIR_LOCATION (cfirp) == kOnDiskFlat)
|
|
{
|
|
// #warning were ignoring a lot of the cfir attributes
|
|
GetDiskFragment (fsp, CFIR_OFFSET_TO_FRAGMENT (cfirp),
|
|
CFIR_FRAGMENT_LENGTH (cfirp), "",
|
|
kLoadLib,
|
|
&c_id,
|
|
&mainAddr,
|
|
errName);
|
|
}
|
|
else if (CFIR_LOCATION (cfirp) == kOnDiskSegmented)
|
|
{
|
|
ResType typ;
|
|
INTEGER id;
|
|
Handle h;
|
|
|
|
typ = (ResType) CFIR_OFFSET_TO_FRAGMENT (cfirp);
|
|
id = CFIR_FRAGMENT_LENGTH (cfirp);
|
|
h = GetResource (typ, id);
|
|
HLock (h);
|
|
GetMemFragment (STARH (h), GetHandleSize (h), "", kLoadLib,
|
|
&c_id, &mainAddr, errName);
|
|
|
|
fprintf (stderr, "Memory leak from segmented fragment\n");
|
|
}
|
|
{
|
|
uint32 new_toc;
|
|
void *new_pc;
|
|
|
|
new_toc = ((uint32 *)mainAddr)[1];
|
|
new_pc = ((void **)mainAddr)[0];
|
|
ppc_call (new_toc, new_pc, 0);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
C_ExitToShell ();
|
|
}
|
|
|
|
PUBLIC int ROMlib_uaf;
|
|
|
|
PUBLIC launch_failure_t ROMlib_launch_failure = launch_no_failure;
|
|
PUBLIC INTEGER ROMlib_exevrefnum;
|
|
|
|
PRIVATE void launchchain(StringPtr fName, INTEGER vRefNum, BOOLEAN resetmemory,
|
|
LaunchParamBlockRec *lpbp)
|
|
{
|
|
OSErr err;
|
|
FInfo finfo;
|
|
Handle code0;
|
|
Handle cfrg0;
|
|
Handle h;
|
|
vers_t *vp;
|
|
char *versbuf, *namebuf;
|
|
int namelen;
|
|
LONGINT abovea5, belowa5, jumplen, jumpoff, *lp;
|
|
INTEGER toskip;
|
|
Byte *p;
|
|
WDPBRec wdpb;
|
|
StringPtr ename;
|
|
INTEGER elen;
|
|
char quickbytes[grafSize];
|
|
LONGINT tmpa5;
|
|
|
|
|
|
for (p = fName + fName[0] + 1; p > fName && *--p != ':';)
|
|
;
|
|
toskip = p - fName;
|
|
CurApName[0] = MIN(fName[0]-toskip, 31);
|
|
BlockMove((Ptr) fName+1+toskip, (Ptr) CurApName+1,
|
|
(Size) CurApName[0]);
|
|
#if 0
|
|
Munger(MR(AppParmHandle), 2L*sizeof(INTEGER), (Ptr) 0,
|
|
(LONGINT) sizeof(AppFile), (Ptr) "", 0L);
|
|
#endif
|
|
if (!lpbp || lpbp->launchBlockID != CWC (extendedBlock))
|
|
{
|
|
CInfoPBRec hpb;
|
|
|
|
hpb.hFileInfo.ioNamePtr = RM(&fName[0]);
|
|
hpb.hFileInfo.ioVRefNum = CW(vRefNum);
|
|
hpb.hFileInfo.ioFDirIndex = CWC (0);
|
|
hpb.hFileInfo.ioDirID = 0;
|
|
PBGetCatInfo(&hpb, FALSE);
|
|
wdpb.ioVRefNum = CW(vRefNum);
|
|
wdpb.ioWDDirID = hpb.hFileInfo.ioFlParID;
|
|
}
|
|
else
|
|
{
|
|
FSSpecPtr fsp;
|
|
|
|
fsp = MR (lpbp->launchAppSpec);
|
|
wdpb.ioVRefNum = fsp->vRefNum;
|
|
wdpb.ioWDDirID = fsp->parID;
|
|
}
|
|
/* Do not do this -- Loser does it SFSaveDisk_Update (vRefNum, fName); */
|
|
wdpb.ioWDProcID = T('X','c','t','r');
|
|
wdpb.ioNamePtr = 0;
|
|
PBOpenWD(&wdpb, FALSE);
|
|
ROMlib_exevrefnum = CW(wdpb.ioVRefNum);
|
|
ROMlib_exefname = CurApName;
|
|
#if 0
|
|
/* I'm skeptical that this is correct */
|
|
if (CurMap != SysMap)
|
|
CloseResFile(CurMap);
|
|
#endif
|
|
SetVol((StringPtr) 0, ROMlib_exevrefnum);
|
|
CurApRefNum = CW(OpenResFile(ROMlib_exefname));
|
|
|
|
/* setupsignals(); */
|
|
|
|
err = GetFInfo(ROMlib_exefname, ROMlib_exevrefnum, &finfo);
|
|
|
|
process_create (FALSE, finfo.fdType, finfo.fdCreator);
|
|
|
|
if (ROMlib_exeuname)
|
|
free (ROMlib_exeuname);
|
|
ROMlib_exeuname = ROMlib_newunixfrommac((char *) ROMlib_exefname+1,
|
|
ROMlib_exefname[0]);
|
|
elen = strlen(ROMlib_exeuname);
|
|
ename = (StringPtr) alloca(elen+1);
|
|
BlockMove((Ptr) ROMlib_exeuname, (Ptr) ename+1, elen);
|
|
ename[0] = elen;
|
|
|
|
ROMlib_creator = CL(finfo.fdCreator);
|
|
|
|
#define LEMMINGSHACK
|
|
#if defined(LEMMINGSHACK)
|
|
{
|
|
if (finfo.fdCreator == CL(TICK("Psyg"))
|
|
|| finfo.fdCreator == CL(TICK("Psod")))
|
|
ROMlib_flushoften = TRUE;
|
|
}
|
|
#endif /* defined(LEMMINGSHACK) */
|
|
|
|
#if defined (ULTIMA_III_HACK)
|
|
ROMlib_ultima_iii_hack = (finfo.fdCreator == CL(TICK("Ult3")));
|
|
#endif
|
|
|
|
h = GetResource(T('v','e','r','s'), 2);
|
|
if (!h)
|
|
h = GetResource(T('v','e','r','s'), 1);
|
|
|
|
ROMlib_version_long = 0;
|
|
if (h) {
|
|
vp = (vers_t *) STARH(h);
|
|
versbuf = alloca(VERSSIZE(vp));
|
|
memcpy(versbuf, vp->shortname+1, vp->shortname[0]);
|
|
sprintf(versbuf+vp->shortname[0], VERSFMT,
|
|
(LONGINT) vp->c[0],
|
|
(LONGINT) vp->c[1],
|
|
(LONGINT) vp->c[2],
|
|
(LONGINT) vp->c[3],
|
|
(LONGINT) vp->loc);
|
|
ROMlib_version_long = ((vp->c[0] << 24)|
|
|
(vp->c[1] << 16)|
|
|
(vp->c[2] << 8)|
|
|
(vp->c[3] << 0));
|
|
} else
|
|
versbuf = "";
|
|
|
|
ROMlib_ScreenSize.first = INITIALPAIRVALUE;
|
|
ROMlib_MacSize.first = INITIALPAIRVALUE;
|
|
ROMlib_directdiskaccess = FALSE;
|
|
ROMlib_clear_gestalt_list ();
|
|
ParseConfigFile ((StringPtr) "\017ExecutorDefault", 0);
|
|
ParseConfigFile (ename, err == noErr ? CL(finfo.fdCreator) : 0);
|
|
ROMlib_clockonoff(!ROMlib_noclock);
|
|
if ((ROMlib_ScreenSize.first != INITIALPAIRVALUE
|
|
|| ROMlib_MacSize.first != INITIALPAIRVALUE))
|
|
{
|
|
if (ROMlib_ScreenSize.first == INITIALPAIRVALUE)
|
|
ROMlib_ScreenSize = ROMlib_MacSize;
|
|
if (ROMlib_MacSize.first == INITIALPAIRVALUE)
|
|
ROMlib_MacSize = ROMlib_ScreenSize;
|
|
}
|
|
code0 = Get1Resource (T('C','O','D','E'), 0);
|
|
cfrg0 = Get1Resource (T('c','f','r','g'), 0);
|
|
|
|
if (cfrg0 && ppc_launch_p &&
|
|
ROMlib_find_cfrg (cfrg0, T('p','w','p','c'), kApplicationCFrag,
|
|
(StringPtr) ""))
|
|
code0 = NULL;
|
|
else if (!code0)
|
|
{
|
|
if (cfrg0)
|
|
{
|
|
if (ROMlib_find_cfrg (cfrg0, T('m','6','8','k'),
|
|
kApplicationCFrag, (StringPtr) ""))
|
|
ROMlib_launch_failure = launch_cfm_requiring;
|
|
else
|
|
ROMlib_launch_failure = launch_ppc_only;
|
|
}
|
|
else
|
|
ROMlib_launch_failure = launch_damaged;
|
|
C_ExitToShell ();
|
|
}
|
|
|
|
{
|
|
Handle size_resource_h;
|
|
int16 size_flags;
|
|
|
|
size_resource_h = Get1Resource (T ('S','I','Z','E'), 0);
|
|
if (size_resource_h == NULL)
|
|
size_resource_h = Get1Resource (T ('S','I','Z','E'), -1);
|
|
if (size_resource_h)
|
|
{
|
|
size_info_t *size_resource;
|
|
|
|
size_resource = (size_info_t *) STARH (size_resource_h);
|
|
size_info.size_flags = CW (size_resource->size_flags);
|
|
size_info.preferred_size = CL (size_resource->preferred_size);
|
|
size_info.minimum_size = CL (size_resource->minimum_size);
|
|
size_info.size_resource_present_p = TRUE;
|
|
}
|
|
else
|
|
{
|
|
memset (&size_info, '\000', sizeof size_info);
|
|
size_info.size_resource_present_p = FALSE;
|
|
}
|
|
size_info.application_p = TRUE;
|
|
|
|
size_flags = size_info.size_flags;
|
|
|
|
/* we don't accept open app events until a handler is installed */
|
|
application_accepts_open_app_aevt_p = FALSE;
|
|
send_application_open_aevt_p
|
|
= system_version >= 0x700
|
|
&& ((size_flags & SZisHighLevelEventAware)
|
|
== SZisHighLevelEventAware);
|
|
}
|
|
|
|
h = GetResource(CL(finfo.fdCreator), 0);
|
|
if (h) {
|
|
namelen = *MR(*(unsigned char **)h);
|
|
namebuf = alloca(namelen+1);
|
|
memcpy(namebuf, (char *) STARH(h)+1, namelen);
|
|
namebuf[namelen] = 0;
|
|
} else
|
|
namebuf = "";
|
|
|
|
if (!code0)
|
|
{
|
|
lp = 0; /* just to shut GCC up */
|
|
jumplen = jumpoff = 0; /* just to shut GCC up */
|
|
a5 = (LONGINT) (long) US_TO_SYN68K (&tmpa5);
|
|
CurrentA5 = (Ptr) CL (a5);
|
|
InitGraf ((Ptr) quickbytes + grafSize - 4);
|
|
}
|
|
else
|
|
{
|
|
HLock(code0);
|
|
|
|
lp = (LONGINT *) STARH(code0);
|
|
abovea5 = CL(*lp++);
|
|
belowa5 = CL(*lp++);
|
|
jumplen = CL(*lp++);
|
|
jumpoff = CL(*lp++);
|
|
|
|
/*
|
|
* NOTE: The stack initialization code that was here has been moved
|
|
* to ROMlib_InitZones in mman.c
|
|
*/
|
|
/* #warning Stack is getting reinitialized even when Chain is called ... */
|
|
|
|
#if defined(SYN68K)
|
|
EM_A7 -= abovea5 + belowa5;
|
|
CurStackBase = (Ptr) CL(EM_A7);
|
|
#else /* !defined(SYN68K) */
|
|
ROMlib_foolgcc = alloca(abovea5 + belowa5);
|
|
CurStackBase
|
|
= CL(MAC_STACK_START + MAC_STACK_SIZE - (abovea5 + belowa5));
|
|
#endif /* !defined(SYN68K) */
|
|
|
|
CurrentA5 = RM(MR(CurStackBase) + belowa5); /* set CurrentA5 */
|
|
BufPtr = RM(MR(CurrentA5) + abovea5);
|
|
CurJTOffset = CW(jumpoff);
|
|
a5 = CL((LONGINT) CurrentA5);
|
|
}
|
|
|
|
GetDateTime((LONGINT *) &Time);
|
|
ROMBase = RM((Ptr) ROMlib_phoneyrom);
|
|
dodusesit = ROMBase;
|
|
QDExist = WWExist = EXIST_NO;
|
|
TheZone = ApplZone;
|
|
ROMlib_memnomove_p = TRUE;
|
|
|
|
#if defined(NEXTSTEP)
|
|
ROMlib_startapp();
|
|
#endif
|
|
/*
|
|
* NOTE: this memcpy has to be done after all local variables have been used
|
|
* because it will quite possibly smash stuff that's on our stack.
|
|
* In reality, we only see this if we compile without optimization,
|
|
* but trust me, it was *very* confusing when this memcpy was up
|
|
* before we were done with our local varibles.
|
|
*/
|
|
if (code0)
|
|
{
|
|
memcpy(MR(CurrentA5) + jumpoff, lp, jumplen); /* copy in the
|
|
jump table */
|
|
ROMlib_destroy_blocks (0, ~0, FALSE);
|
|
#if defined(ONLY_DESTROY_BETWEEN_CODE_SEGMENTS)
|
|
ROMlib_num_code_resources = 0; /* Force a recompute. */
|
|
#endif
|
|
}
|
|
SetCursor(STARH(GetCursor(watchCursor)));
|
|
|
|
/* Call this routine in case the refresh value changed, either just
|
|
* now or when the config file was parsed. We want to do this
|
|
* before the screen's depth might be changed.
|
|
*/
|
|
{
|
|
int save_ROMlib_refresh = ROMlib_refresh;
|
|
dequeue_refresh_task ();
|
|
set_refresh_rate (0);
|
|
set_refresh_rate (save_ROMlib_refresh);
|
|
}
|
|
|
|
ROMlib_uaf = 0;
|
|
|
|
if (code0)
|
|
beginexecutingat(CL((LONGINT) CurrentA5) + CW(CurJTOffset) + 2);
|
|
else
|
|
{
|
|
FSSpec fs;
|
|
|
|
FSMakeFSSpec (ROMlib_exevrefnum, 0, ROMlib_exefname, &fs);
|
|
cfm_launch (cfrg0, T('p','w','p','c'), &fs);
|
|
}
|
|
}
|
|
|
|
A2(PUBLIC trap, void, Chain, StringPtr, fName, INTEGER, vRefNum)
|
|
{
|
|
launchchain(fName, vRefNum, FALSE, 0);
|
|
}
|
|
|
|
PRIVATE void reset_low_globals(void)
|
|
{
|
|
/*
|
|
* we're about to smash applzone ... we may want to verify a few low-mem
|
|
* globals beforehand
|
|
*/
|
|
|
|
ProcPtr saveDABeeper;
|
|
THz saveSysZone;
|
|
uint32 saveTicks;
|
|
INTEGER saveBootDrive;
|
|
LONGINT saveLo3Bytes;
|
|
LONGINT save20, save28, save58, save5C;
|
|
Ptr saveSoundBase;
|
|
Ptr saveVIA;
|
|
Ptr saveSCCRd;
|
|
Ptr saveSCCWr;
|
|
Handle saveAppParmHandle;
|
|
QHdr saveVCBQHdr;
|
|
QHdr saveFSQHdr;
|
|
QHdr saveDrvQHdr;
|
|
QHdr saveEventQueue;
|
|
QHdr saveVBLQueue;
|
|
Ptr saveFCBSPtr;
|
|
Ptr saveWDCBsPtr;
|
|
LONGINT saveCurDirStore;
|
|
INTEGER saveSFSaveDisk;
|
|
VCBPtr saveDefVCBPtr;
|
|
char saveCurApName[sizeof(CurApName)];
|
|
INTEGER saveCurApRefNum;
|
|
INTEGER saveCurMap;
|
|
Handle saveTopMapHndl;
|
|
Handle saveSysMapHndl;
|
|
INTEGER saveSysMap;
|
|
LONGINT saveScrapSize;
|
|
Handle saveScrapHandle;
|
|
INTEGER saveScrapCount;
|
|
INTEGER saveScrapState;
|
|
StringPtr saveScrapName;
|
|
Handle saveROMFont0;
|
|
Handle saveWidthListHand;
|
|
Byte saveSPValid;
|
|
Byte saveSPATalkA;
|
|
Byte saveSPATalkB;
|
|
Byte saveSPConfig;
|
|
INTEGER saveSPPortA;
|
|
INTEGER saveSPPortB;
|
|
LONGINT saveSPAlarm;
|
|
INTEGER saveSPFont;
|
|
Byte saveSPKbd;
|
|
Byte saveSPPrint;
|
|
Byte saveSPVolCtl;
|
|
Byte saveSPClikCaret;
|
|
Byte saveSPMisc2;
|
|
INTEGER saveKeyThresh;
|
|
INTEGER saveKeyRepThresh;
|
|
INTEGER saveMenuFlash;
|
|
LONGINT saveCaretTime;
|
|
LONGINT saveDoubleTime;
|
|
LONGINT saveDefDirID;
|
|
HIDDEN_Handle saveDAStrings[4];
|
|
Ptr saveMemTop;
|
|
DCtlHandlePtr saveUTableBase;
|
|
INTEGER saveUnitNtryCnt;
|
|
Point saveMouseLocation;
|
|
CGrafPtr saveWMgrCPort;
|
|
Handle saveMBDFHndl;
|
|
ProcPtr saveJCrsrTask;
|
|
|
|
AE_info_t *saveAE_info;
|
|
|
|
RGBColor saveHiliteRGB;
|
|
GDHandle saveTheGDevice, saveMainDevice, saveDeviceList;
|
|
char saveKeyMap[sizeof_KeyMap];
|
|
|
|
Byte saveFinderName[sizeof(FinderName)];
|
|
virtual_int_state_t bt;
|
|
|
|
bt = block_virtual_ints ();
|
|
saveSysZone = SysZone;
|
|
saveTicks = Ticks;
|
|
saveBootDrive = BootDrive;
|
|
saveLo3Bytes = Lo3Bytes;
|
|
save20 = *(LONGINT *) SYN68K_TO_US(0x20);
|
|
save28 = *(LONGINT *) SYN68K_TO_US(0x28);
|
|
save58 = *(LONGINT *) SYN68K_TO_US(0x58);
|
|
save5C = *(LONGINT *) SYN68K_TO_US(0x5C);
|
|
saveVIA = VIA;
|
|
saveSCCRd = SCCRd_H.p;
|
|
saveSCCWr = SCCWr_H.p;
|
|
saveSoundBase = SoundBase;
|
|
saveAppParmHandle = AppParmHandle;
|
|
saveVCBQHdr = VCBQHdr;
|
|
saveFSQHdr = FSQHdr;
|
|
saveDrvQHdr = DrvQHdr;
|
|
saveFCBSPtr = FCBSPtr;
|
|
saveWDCBsPtr = WDCBsPtr;
|
|
saveSFSaveDisk = SFSaveDisk;
|
|
saveCurDirStore = CurDirStore;
|
|
saveEventQueue = EventQueue;
|
|
saveVBLQueue = VBLQueue;
|
|
saveDefVCBPtr = DefVCBPtr;
|
|
memcpy(saveCurApName, CurApName, sizeof(CurApName));
|
|
saveCurApRefNum = CurApRefNum;
|
|
saveCurMap = CurMap;
|
|
saveTopMapHndl = TopMapHndl;
|
|
saveSysMapHndl = SysMapHndl;
|
|
saveSysMap = SysMap;
|
|
saveScrapSize = ScrapSize;
|
|
saveScrapHandle = ScrapHandle;
|
|
saveScrapCount = ScrapCount;
|
|
saveScrapState = ScrapState;
|
|
saveScrapName = ScrapName;
|
|
saveROMFont0 = ROMFont0;
|
|
saveWidthListHand = WidthListHand;
|
|
saveSPValid = SPValid;
|
|
saveSPATalkA = SPATalkA;
|
|
saveSPATalkB = SPATalkB;
|
|
saveSPConfig = SPConfig;
|
|
saveSPPortA = SPPortA;
|
|
saveSPPortB = SPPortB;
|
|
saveSPAlarm = SPAlarm;
|
|
saveSPFont = SPFont;
|
|
saveSPKbd = SPKbd;
|
|
saveSPPrint = SPPrint;
|
|
saveSPVolCtl = SPVolCtl;
|
|
saveSPClikCaret = SPClikCaret;
|
|
saveSPMisc2 = SPMisc2;
|
|
saveKeyThresh = KeyThresh;
|
|
saveKeyRepThresh = KeyRepThresh;
|
|
saveMenuFlash = MenuFlash;
|
|
saveCaretTime = CaretTime;
|
|
saveDoubleTime = DoubleTime;
|
|
saveDefDirID = DefDirID;
|
|
|
|
saveHiliteRGB = HiliteRGB;
|
|
saveTheGDevice = TheGDevice;
|
|
saveMainDevice = MainDevice;
|
|
saveDeviceList = DeviceList;
|
|
saveDAStrings[0] = DAStrings_H[0];
|
|
saveDAStrings[1] = DAStrings_H[1];
|
|
saveDAStrings[2] = DAStrings_H[2];
|
|
saveDAStrings[3] = DAStrings_H[3];
|
|
saveMemTop = MemTop;
|
|
saveUTableBase = UTableBase;
|
|
saveUnitNtryCnt = UnitNtryCnt;
|
|
|
|
saveMouseLocation = MouseLocation;
|
|
saveDABeeper = DABeeper;
|
|
|
|
memcpy(saveFinderName, FinderName, sizeof(saveFinderName));
|
|
saveWMgrCPort = WMgrCPort;
|
|
saveMBDFHndl = MBDFHndl;
|
|
|
|
saveJCrsrTask = JCrsrTask;
|
|
|
|
saveAE_info = AE_info;
|
|
memcpy (saveKeyMap, KeyMap, sizeof_KeyMap);
|
|
|
|
/* Set low globals to 0xFF, but don't touch exception vectors. */
|
|
memset ((char *)&nilhandle + 64 * sizeof (ULONGINT),
|
|
0xFF,
|
|
((char *)&lastlowglobal - (char *)&nilhandle
|
|
- 64 * sizeof (ULONGINT)));
|
|
|
|
AE_info = saveAE_info;
|
|
|
|
JCrsrTask = saveJCrsrTask;
|
|
|
|
MBDFHndl = saveMBDFHndl;
|
|
WMgrCPort = saveWMgrCPort;
|
|
WindowList = NULL;
|
|
memcpy(FinderName, saveFinderName, sizeof(FinderName));
|
|
|
|
DABeeper = saveDABeeper;
|
|
MouseLocation = saveMouseLocation;
|
|
MouseLocation2 = saveMouseLocation;
|
|
|
|
UTableBase = saveUTableBase;
|
|
UnitNtryCnt = saveUnitNtryCnt;
|
|
MemTop = saveMemTop;
|
|
DAStrings_H[3] = saveDAStrings[3];
|
|
DAStrings_H[2] = saveDAStrings[2];
|
|
DAStrings_H[1] = saveDAStrings[1];
|
|
DAStrings_H[0] = saveDAStrings[0];
|
|
DefDirID = saveDefDirID;
|
|
DoubleTime = saveDoubleTime;
|
|
CaretTime = saveCaretTime;
|
|
MenuFlash = saveMenuFlash;
|
|
KeyRepThresh = saveKeyRepThresh;
|
|
KeyThresh = saveKeyThresh;
|
|
SPMisc2 = saveSPMisc2;
|
|
SPClikCaret = saveSPClikCaret;
|
|
SPVolCtl = saveSPVolCtl;
|
|
SPPrint = saveSPPrint;
|
|
SPKbd = saveSPKbd;
|
|
SPFont = saveSPFont;
|
|
SPAlarm = saveSPAlarm;
|
|
SPPortB = saveSPPortB;
|
|
SPPortA = saveSPPortA;
|
|
SPConfig = saveSPConfig;
|
|
SPATalkB = saveSPATalkB;
|
|
SPATalkA = saveSPATalkA;
|
|
SPValid = saveSPValid;
|
|
WidthListHand = saveWidthListHand;
|
|
ROMFont0 = saveROMFont0;
|
|
ScrapName = saveScrapName;
|
|
ScrapState = saveScrapState;
|
|
ScrapCount = saveScrapCount;
|
|
ScrapHandle = saveScrapHandle;
|
|
ScrapSize = saveScrapSize;
|
|
SysMap = saveSysMap;
|
|
SysMapHndl = saveSysMapHndl;
|
|
TopMapHndl = saveTopMapHndl;
|
|
CurMap = saveCurMap;
|
|
CurApRefNum = saveCurApRefNum;
|
|
memcpy(CurApName, saveCurApName, sizeof(CurApName));
|
|
DefVCBPtr = saveDefVCBPtr;
|
|
VBLQueue = saveVBLQueue;
|
|
EventQueue = saveEventQueue;
|
|
CurDirStore = saveCurDirStore;
|
|
SFSaveDisk = saveSFSaveDisk;
|
|
WDCBsPtr = saveWDCBsPtr;
|
|
FCBSPtr = saveFCBSPtr;
|
|
DrvQHdr = saveDrvQHdr;
|
|
FSQHdr = saveFSQHdr;
|
|
VCBQHdr = saveVCBQHdr;
|
|
Lo3Bytes = saveLo3Bytes;
|
|
VIA = saveVIA;
|
|
SCCRd_H.p = saveSCCRd;
|
|
SCCWr_H.p = saveSCCWr;
|
|
SoundBase = saveSoundBase;
|
|
Ticks_UL.u = saveTicks;
|
|
SysZone = saveSysZone;
|
|
BootDrive = saveBootDrive;
|
|
AppParmHandle = saveAppParmHandle;
|
|
|
|
HiliteRGB = saveHiliteRGB;
|
|
TheGDevice = saveTheGDevice;
|
|
MainDevice = saveMainDevice;
|
|
DeviceList = saveDeviceList;
|
|
|
|
restore_virtual_ints (bt);
|
|
|
|
nilhandle = 0; /* so nil dereferences "work" */
|
|
|
|
CrsrBusy = 0;
|
|
TESysJust = 0;
|
|
DSAlertTab = 0;
|
|
ResumeProc = 0;
|
|
GZRootHnd = 0;
|
|
ANumber = 0;
|
|
ResErrProc = 0;
|
|
#if 0
|
|
FractEnable = 0xff; /* NEW MOD -- QUESTIONABLE */
|
|
#else
|
|
FractEnable = 0;
|
|
#endif
|
|
SEvtEnb = 0;
|
|
MenuList = 0;
|
|
MBarEnable = 0;
|
|
MenuFlash = 0;
|
|
TheMenu = 0;
|
|
MBarHook = 0;
|
|
MenuHook = 0;
|
|
HeapEnd = 0;
|
|
ApplLimit = 0;
|
|
SoundActive = soundactiveoff;
|
|
PortBUse = 2; /* configured for Serial driver */
|
|
|
|
memcpy (KeyMap, saveKeyMap, sizeof_KeyMap);
|
|
OneOne = CLC(0x00010001);
|
|
DragHook = 0;
|
|
MBDFHndl = 0;
|
|
MenuList = 0;
|
|
MBSaveLoc = 0;
|
|
SysFontFam = 0;
|
|
|
|
SysVersion = CW (system_version);
|
|
FSFCBLen = CWC (94);
|
|
|
|
/*
|
|
* TODO: how does this relate to Launch?
|
|
*/
|
|
/* Set up default floating point environment. */
|
|
{
|
|
INTEGER env = 0;
|
|
ROMlib_Fsetenv (&env, 0);
|
|
}
|
|
|
|
TEDoText = RM((ProcPtr) P_ROMlib_dotext); /* where should this go ? */
|
|
|
|
WWExist = QDExist = EXIST_NO; /* TODO: LOOK HERE! */
|
|
SCSIFlags = CWC (0xEC00); /* scsi+clock+xparam+mmu+adb
|
|
(no fpu,aux or pwrmgr) */
|
|
|
|
MMUType = 5;
|
|
KbdType = 2;
|
|
|
|
MCLKPCmiss1 = 0; /* &MCLKPCmiss1 = 0x358 + 72 (MacLinkPC starts
|
|
adding the 72 byte offset to VCB pointers too
|
|
soon, starting with 0x358, which is not the
|
|
address of a VCB) */
|
|
|
|
MCLKPCmiss2 = 0; /* &MCLKPCmiss1 = 0x358 + 78 (MacLinkPC misses) */
|
|
AuxCtlHead = 0;
|
|
CurDeactive = 0;
|
|
CurActivate = 0;
|
|
macfpstate[0] = 0;
|
|
fondid = 0;
|
|
PrintErr = 0;
|
|
mouseoffset = 0;
|
|
heapcheck = 0;
|
|
DefltStack = CLC(0x2000); /* nobody really cares about these two */
|
|
MinStack = CLC(0x400); /* values ... */
|
|
IAZNotify = 0;
|
|
CurPitch = 0;
|
|
JSwapFont = (ProcPtr) RM(P_FMSwapFont);
|
|
JInitCrsr = (ProcPtr) RM(P_InitCursor);
|
|
|
|
JHideCursor = (ProcPtr) RM(P_HideCursor);
|
|
JShowCursor = (ProcPtr) RM(P_ShowCursor);
|
|
JShieldCursor = (ProcPtr) RM(P_ShieldCursor);
|
|
JSetCrsr = (ProcPtr) RM(P_SetCursor);
|
|
JCrsrObscure = (ProcPtr) RM(P_ObscureCursor);
|
|
|
|
#if 0
|
|
JUnknown574 = (ProcPtr) RM(P_Unknown574);
|
|
#else
|
|
*(long *)(0x574 + ROMlib_offset) = (long) RM(P_Unknown574);
|
|
#endif
|
|
|
|
Key1Trans = (Ptr) RM(P_Key1Trans);
|
|
Key2Trans = (Ptr) RM(P_Key2Trans);
|
|
JFLUSH = (ProcPtr) RM(P_flushcache);
|
|
JResUnknown1 = JFLUSH; /* I don't know what these are supposed to */
|
|
JResUnknown2 = JFLUSH; /* do, but they're not called enough for
|
|
us to worry about the cache flushing
|
|
overhead */
|
|
|
|
CPUFlag = 4; /* mc68040 */
|
|
UnitNtryCnt = 0; /* how many units in the table */
|
|
|
|
TheZone = ApplZone;
|
|
|
|
#if !defined(SYN68K)
|
|
bzero((char *) &nilhandle, 0xc0); /* exception vectors */
|
|
/* pagemaker 2.0 looks at 108
|
|
and doesn't want to see -1 */
|
|
#endif /* !defined(SYN68K) */
|
|
*(LONGINT *) SYN68K_TO_US(0x20) = save20;
|
|
*(LONGINT *) SYN68K_TO_US(0x28) = save28;
|
|
*(LONGINT *) SYN68K_TO_US(0x58) = save58;
|
|
*(LONGINT *) SYN68K_TO_US(0x5C) = save5C;
|
|
|
|
HiliteMode = CB(0xFF); /* I think this is correct */
|
|
ROM85 = CWC(0x3FFF); /* We be color now */
|
|
MMU32Bit = 0x01;
|
|
loadtrap = 0;
|
|
*(LONGINT *) SYN68K_TO_US(0x1008) = CLC (0x4); /* Quark XPress 3.0 references 0x1008
|
|
explicitly. It takes the value
|
|
found there, subtracts four from
|
|
it and dereferences that value.
|
|
Yahoo */
|
|
*(short *) SYN68K_TO_US(4) = CWC (0x4e75); /* RTS, so when we dynamically recompile
|
|
code starting at 0 we won't get far */
|
|
|
|
/* Micro-cap dereferences location one of the AppPacks locations */
|
|
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < (int) NELEM (AppPacks_H); ++i)
|
|
AppPacks_H[i].p = 0;
|
|
}
|
|
SysEvtMask = CWC(~(1L<< keyUp)); /* EVERYTHING except keyUp */
|
|
SdVolume = 7; /* for Beebop 2 */
|
|
CurrentA5 = (Ptr) CL (EM_A5);
|
|
}
|
|
|
|
PRIVATE void reset_traps(void)
|
|
{
|
|
static void *savetooltraptable[0x400];
|
|
static void *saveostraptable[0x100];
|
|
static BOOLEAN beenhere = FALSE;
|
|
|
|
ROMlib_reset_bad_trap_addresses ();
|
|
if (!beenhere) {
|
|
memcpy( saveostraptable, ostraptable, sizeof( saveostraptable));
|
|
memcpy(savetooltraptable, tooltraptable, sizeof(savetooltraptable));
|
|
beenhere = TRUE;
|
|
} else {
|
|
/*
|
|
* NOTE: I'm not preserving patches that go into the SystemZone. Right now
|
|
* that just seems like an unnecessary source of mystery bugs.
|
|
*/
|
|
memcpy( ostraptable, saveostraptable, sizeof( saveostraptable));
|
|
memcpy(tooltraptable, savetooltraptable, sizeof(savetooltraptable));
|
|
}
|
|
}
|
|
|
|
PRIVATE boolean_t
|
|
our_special_map (resmaphand map)
|
|
{
|
|
boolean_t retval;
|
|
Handle h;
|
|
|
|
CurMap = STARH(map)->resfn;
|
|
h = Get1Resource (TICK("nUSE"), 0);
|
|
retval = h ? TRUE : FALSE;
|
|
|
|
return retval;
|
|
}
|
|
|
|
|
|
void
|
|
empty_timer_queues (void)
|
|
{
|
|
TMTask *tp, *nexttp;
|
|
VBLTaskPtr vp, nextvp;
|
|
virtual_int_state_t bt;
|
|
|
|
bt = block_virtual_ints ();
|
|
|
|
dequeue_refresh_task ();
|
|
clear_pending_sounds ();
|
|
for (vp = (VBLTaskPtr) MR (VBLQueue.qHead); vp; vp = nextvp)
|
|
{
|
|
nextvp = (VBLTaskPtr) MR (vp->qLink);
|
|
VRemove (vp);
|
|
}
|
|
for (tp = MR ((TMTask *) ROMlib_timehead.qHead); tp; tp = nexttp)
|
|
{
|
|
nexttp = (TMTask *) MR (tp->qLink);
|
|
RmvTime ((QElemPtr) tp);
|
|
}
|
|
|
|
restore_virtual_ints (bt);
|
|
}
|
|
|
|
|
|
PRIVATE void reinitialize_things(void)
|
|
{
|
|
resmaphand map, nextmap;
|
|
filecontrolblock *fcbp, *efcbp;
|
|
INTEGER length;
|
|
INTEGER special_fn;
|
|
int i;
|
|
|
|
ROMlib_shutdown_font_manager ();
|
|
SetZone (MR(SysZone));
|
|
/* NOTE: we really shouldn't be closing desk accessories at all, but
|
|
since we don't properly handle them when they're left open, it is
|
|
better to close them down than not. */
|
|
|
|
for (i = DESK_ACC_MIN; i <= DESK_ACC_MAX; ++i)
|
|
CloseDriver (-i - 1);
|
|
|
|
empty_timer_queues ();
|
|
ROMlib_clock = 0; /* CLOCKOFF */
|
|
|
|
special_fn = 0;
|
|
for (map = (resmaphand) MR(TopMapHndl); map; map = nextmap) {
|
|
nextmap = (resmaphand) HxP(map, nextmap);
|
|
if (HxX(map, resfn) == SysMap)
|
|
UpdateResFile (Hx (map, resfn));
|
|
else
|
|
{
|
|
if (!our_special_map (map))
|
|
CloseResFile(Hx(map, resfn));
|
|
else
|
|
{
|
|
special_fn = Hx(map, resfn);
|
|
UpdateResFile (special_fn);
|
|
}
|
|
}
|
|
}
|
|
|
|
length = CW(*(short *)MR(FCBSPtr));
|
|
fcbp = (filecontrolblock *) ((short *)MR(FCBSPtr)+1);
|
|
efcbp = (filecontrolblock *) ((char *)MR(FCBSPtr) + length);
|
|
for (;fcbp < efcbp;
|
|
fcbp = (filecontrolblock *) ((char *)fcbp + CW(FSFCBLen)))
|
|
{
|
|
INTEGER rn;
|
|
|
|
rn = (char *) fcbp - (char *) MR(FCBSPtr);
|
|
if (fcbp->fcbCName[0]
|
|
/* && rn != Param_ram_rn */
|
|
&& rn != CW (SysMap)
|
|
&& rn != special_fn)
|
|
FSClose((char *) fcbp - (char *) MR(FCBSPtr));
|
|
}
|
|
|
|
CurMap = STARH((resmaphand)MR(TopMapHndl))->resfn;
|
|
|
|
/* TODO replace the code in main.c with this stuff */
|
|
#if !defined(MSDOS)
|
|
/*
|
|
* In the GO32 environment we're not guaranteed to have a floating point
|
|
* coprocessor, so we delay floating point environment initialization until
|
|
* we actually use it.
|
|
*/
|
|
/* Set up default floating point environment. */
|
|
{
|
|
INTEGER env = 0;
|
|
ROMlib_Fsetenv (&env, 0);
|
|
}
|
|
#endif
|
|
|
|
ROMlib_destroy_blocks (0, ~0, FALSE);
|
|
#if defined(ONLY_DESTROY_BETWEEN_CODE_SEGMENTS)
|
|
ROMlib_num_code_resources = 0; /* Force a recompute. */
|
|
#endif
|
|
}
|
|
|
|
PRIVATE OSErr
|
|
ROMlib_filename_from_fsspec (char **strp, FSSpec *fsp)
|
|
{
|
|
OSErr retval;
|
|
ParamBlockRec pbr;
|
|
char *filename, *endname;
|
|
VCBExtra *vcbp;
|
|
struct stat sbuf;
|
|
|
|
memset (&pbr, 0, sizeof pbr);
|
|
pbr.ioParam.ioVRefNum = fsp->vRefNum;
|
|
pbr.ioParam.ioNamePtr = (StringPtr) RM ((Ptr) fsp->name);
|
|
retval = ROMlib_nami (&pbr, CL (fsp->parID), NoIndex, strp, &filename,
|
|
&endname, FALSE, &vcbp, &sbuf);
|
|
return retval;
|
|
}
|
|
|
|
PUBLIC OSErr
|
|
NewLaunch (StringPtr fName_arg, INTEGER vRefNum_arg, LaunchParamBlockRec *lpbp)
|
|
{
|
|
OSErr retval;
|
|
static char beenhere = FALSE;
|
|
static jmp_buf buf;
|
|
static Str255 fName;
|
|
static INTEGER vRefNum;
|
|
static LaunchParamBlockRec lpb;
|
|
BOOLEAN extended_p;
|
|
|
|
retval = noErr;
|
|
if (lpbp && lpbp->launchBlockID == CWC (extendedBlock))
|
|
{
|
|
lpb = *lpbp;
|
|
str255assign (fName, (MR (lpbp->launchAppSpec))->name);
|
|
extended_p = TRUE;
|
|
}
|
|
else
|
|
{
|
|
lpb.launchBlockID = 0;
|
|
str255assign (fName, fName_arg);
|
|
vRefNum = vRefNum_arg;
|
|
extended_p = FALSE;
|
|
}
|
|
|
|
if (extended_p && (lpbp->launchControlFlags & CWC (launchContinue)))
|
|
{
|
|
int n_filenames;
|
|
char **filenames;
|
|
int i;
|
|
AppParametersPtr ap;
|
|
int n_filename_bytes;
|
|
|
|
#if !defined (LETGCCWAIL)
|
|
ap = NULL;
|
|
#endif
|
|
n_filenames = 1;
|
|
if (lpbp->launchAppParameters)
|
|
{
|
|
ap = MR (lpbp->launchAppParameters);
|
|
n_filenames += CW (ap->n_fsspec);
|
|
}
|
|
n_filename_bytes = n_filenames * sizeof *filenames;
|
|
filenames = alloca (n_filename_bytes);
|
|
memset (filenames, 0, n_filename_bytes);
|
|
retval = ROMlib_filename_from_fsspec (&filenames[0],
|
|
MR (lpbp->launchAppSpec));
|
|
for (i = 1; retval == noErr && i < n_filenames; ++i)
|
|
retval = ROMlib_filename_from_fsspec (&filenames[1],
|
|
&ap->fsspec[i-1]);
|
|
if (retval == noErr)
|
|
retval = ROMlib_launch_native_app (n_filenames, filenames);
|
|
for (i = 0; i < n_filenames; ++i)
|
|
free (filenames[i]);
|
|
}
|
|
else
|
|
{
|
|
/* This setjmp/longjmp code might be better put in launchchain */
|
|
if (!beenhere)
|
|
{
|
|
beenhere = TRUE;
|
|
setjmp(buf);
|
|
}
|
|
else
|
|
longjmp(buf, 1);
|
|
|
|
retval = noErr;
|
|
reset_adb_vector ();
|
|
reinitialize_things();
|
|
reset_traps();
|
|
reset_low_globals();
|
|
ROMlib_InitZones(offset_no_change); /* too late to change memory offset */
|
|
ROMlib_InitGWorlds();
|
|
hle_reinit ();
|
|
AE_reinit ();
|
|
print_reinit ();
|
|
|
|
gd_set_bpp (MR (MainDevice), !vdriver_grayscale_p, vdriver_fixed_clut_p,
|
|
vdriver_bpp);
|
|
ROMlib_init_stdfile();
|
|
#if ERROR_SUPPORTED_P (ERROR_UNEXPECTED)
|
|
if (ERROR_ENABLED_P (ERROR_UNEXPECTED))
|
|
{
|
|
long lp;
|
|
|
|
for (lp = (long) &nilhandle_H; lp <= (long) &lastlowglobal; lp += 2)
|
|
if ( lp != (long) &TheZone_H
|
|
&& lp != (long) &ApplZone_H
|
|
&& lp != (long) &FSFCBLen
|
|
&& lp != (long) &SysMap
|
|
&& lp != (long) SYN68K_TO_US(0x2f6)
|
|
&& lp != (long) SYN68K_TO_US(0x8e6)
|
|
&& lp != (long) SYN68K_TO_US(0x900)
|
|
&& lp != (long) &CurMap
|
|
&& lp != (long) SYN68K_TO_US(0x8a6)
|
|
&& lp != (long) SYN68K_TO_US(0x8aa)
|
|
&& lp != (long) SYN68K_TO_US(0x268)
|
|
&& lp != (long) SYN68K_TO_US(0x982)
|
|
&& lp != (long) SYN68K_TO_US(0xaee)
|
|
&& lp != (long) SYN68K_TO_US(0xcca)
|
|
&& lp != (long) SYN68K_TO_US(0xd50)
|
|
&& lp != (long) SYN68K_TO_US(0x18e)
|
|
&& lp != (long) SYN68K_TO_US(0x190)
|
|
&& lp != (long) SYN68K_TO_US(0x2f2)
|
|
&& lp != (long) SYN68K_TO_US(0x11e)
|
|
&& lp != (long) SYN68K_TO_US(0x15c)
|
|
&& lp != (long) SYN68K_TO_US(0x27e)
|
|
&& lp != (long) SYN68K_TO_US(0x31a)
|
|
&& lp != (long) SYN68K_TO_US(0x82c)
|
|
&& lp != (long) SYN68K_TO_US(0x82e)
|
|
&& lp != (long) SYN68K_TO_US(0x830)
|
|
&& lp != (long) SYN68K_TO_US(0x832)
|
|
&& lp != (long) SYN68K_TO_US(0xa4a)
|
|
&& lp != (long) SYN68K_TO_US(0xa52)
|
|
&& lp != (long) SYN68K_TO_US(0xa56)
|
|
&& lp != (long) SYN68K_TO_US(0xbf4)
|
|
&& lp != (long) SYN68K_TO_US(0x828)
|
|
&& lp != (long) SYN68K_TO_US(0x82a)
|
|
&& lp != (long) SYN68K_TO_US(0x16c)
|
|
)
|
|
if (MR(*(int32 *)lp) >= (int32) MR(ApplZone)
|
|
&& MR(*(int32 *)lp) < (int32) MR(MR(ApplZone)->bkLim))
|
|
warning_unexpected ("Low global at 0x%lx may point into "
|
|
"ApplZone and probably shouldn't.",
|
|
(unsigned long) US_TO_SYN68K (lp));
|
|
}
|
|
#endif
|
|
launchchain(fName, vRefNum, TRUE, &lpb);
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
A2(PUBLIC trap, void, Launch, StringPtr, fName_arg, INTEGER, vRefNum_arg)
|
|
{
|
|
#if 0
|
|
/* NOTE: we're messing with launch between Executor 2 beta 1 and Executor 2
|
|
proper. We really shouldn't do anything differently from what we were
|
|
doing before, so we don't have the liberty to do things cleanly */
|
|
|
|
LaunchParamBlockRec pbr;
|
|
|
|
memset (&pbr, 0, sizeof pbr);
|
|
pbr.launchBlockID = CWC (extendedBlock);
|
|
pbr.launchEPBLength = CLC (extendedBlockLen);
|
|
pbr.launchControlFlags = CWC (launchNoFileFlags|launchInhibitDaemon);
|
|
FSMakeFSSpec (vRefNum_arg, 0, fName_arg, &pbr.launchAppSpec);
|
|
pbr.launchAppSpec.vRefNum = vRefNum_arg);
|
|
NewLaunch (&pbr);
|
|
#else
|
|
NewLaunch (fName_arg, vRefNum_arg, 0);
|
|
#endif
|
|
}
|