mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-25 09:30:50 +00:00
752 lines
37 KiB
Plaintext
752 lines
37 KiB
Plaintext
|
;
|
|||
|
; File: Boot2.a (formerly StartSystem.a)
|
|||
|
;
|
|||
|
; Contains: boot code for the Macintosh system
|
|||
|
;
|
|||
|
; This code lives in the 'boot' 2 resource in the System file.
|
|||
|
;
|
|||
|
; This code takes over after the boot blocks and does some primary setup,
|
|||
|
; then passes the boot process on to a CPU Gibbly. We won’t ever put this
|
|||
|
; code in ROM; instead, we will make it call traps (or specific addresses)
|
|||
|
; in ROM.
|
|||
|
;
|
|||
|
; This contains all the code necessary to get from boot to the Process Mgr.
|
|||
|
; It also contains the code that was formerly in INIT 31 that loads INIT resources
|
|||
|
; from INIT, RDEV, and cdev files.
|
|||
|
;
|
|||
|
; Written by: Darin Adler, based on old boot blocks and StartBoot.a
|
|||
|
;
|
|||
|
; Copyright: © 1990-1992 by Apple Computer, Inc., all rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <77> 6/27/92 DTY #1033818: Leave the Gibbly the current resource map before
|
|||
|
; handing control over so it can tell it’s own resource reference
|
|||
|
; number.
|
|||
|
; <76> 6/24/92 DTY #1033818 <csd>: Move the Gibbly underneath the system resource
|
|||
|
; map before handing control over to 'boot' 3, so that the Gibbly
|
|||
|
; won’t get closed if the system heap grows before Resource
|
|||
|
; Overrides are implemented. Also added call to HGetVInfo to get
|
|||
|
; the System Folder directory ID, since the value that’s being
|
|||
|
; passed in A4 by the boot blocks might be another directory.
|
|||
|
; <75> 5/28/92 DTY #1030972: If no Gibbly capable of booting this machine is found,
|
|||
|
; the code used to call SysError(dsOldSystem). This call doesn’t
|
|||
|
; bring up the dialog any more, because 'DSAT' 0 isn’t set up
|
|||
|
; until 'boot' 3. Now, set a bit in low memory, and call the
|
|||
|
; System file’s 'boot' 3 resource, which will look at this bit,
|
|||
|
; and display the message if the bit is set.
|
|||
|
; <74> 4/20/92 JSM Moved this file from StartSystem.a to Boot2.a, keeping all
|
|||
|
; revisions; remove some equates that are no longer needed now
|
|||
|
; that some of the code originally in this file has been moved to
|
|||
|
; Boot3.a.
|
|||
|
; <73> 4/15/92 DTY #1027491: ioVRefNum needs to be initialized before calling
|
|||
|
; _HGetFileInfo to find a Gibbly, now that nothing does it for us.
|
|||
|
; <72> 4/14/92 DTY Get rid of unecessary includes.
|
|||
|
; <71> 4/2/92 DTY #1025555,<BBM>: StartSystem.a used to call
|
|||
|
; MakeSystemHeapGrowable right after it sets up the globals. That
|
|||
|
; call got lost in the shuffle between here and BootCode.a. Since
|
|||
|
; A/UX wants an early call to make the system heap growable, we’ll
|
|||
|
; put it back in here, before any Gibblies are opened, so we don’t
|
|||
|
; have to worry about them being closed when _InitApplZone is
|
|||
|
; called before the _RsrcZoneInit patch is installed.
|
|||
|
; <70> 3/25/92 FM last checkin was #1025326
|
|||
|
; <69> 3/25/92 FM Rolling everything except gibbly loading code into BootCode.a so
|
|||
|
; that StartSystem.a will be as machine independent as possible!
|
|||
|
; <68> 2/17/92 DTY #1020172: D6 used to hold a handle to DSAT 0, but now I use it
|
|||
|
; to keep track of the number of Gibblies. Save d6 before I use
|
|||
|
; it.
|
|||
|
; <67> 2/11/92 DTY Dean’s on a memory reduction spree. Release each 'gbly' resource
|
|||
|
; after setting up information about each Gibbly on the stack.
|
|||
|
; <66> 2/7/92 DTY I missed the addq in LoadGibbly last time. Make this an addq.l
|
|||
|
; also.
|
|||
|
; <65> 1/27/92 DTY addq #1,d6 is getting compiled to addq.w #1,d6, but the full
|
|||
|
; long of d6 is significant. Change the addq to an addq.l to make
|
|||
|
; the addition right.
|
|||
|
; <64> 1/17/92 DTY Includes LinkedPatchMacros.a to get the kROMVersion equates.
|
|||
|
; <63> 1/14/92 csd Move the BootGlobals record and other equates to BootEqu.a so we
|
|||
|
; don’t have to keep the StartSystem.a and BootCode.a versions in
|
|||
|
; sync.
|
|||
|
; <62> 12/2/91 DTY BoxFlag doesn’t exist on the Mac Plus. Check the ROM version in
|
|||
|
; CanGibblyBootThisMachine to see if this is a Plus. If it is, set
|
|||
|
; up the box value manually instead of fetching it from BoxFlag.
|
|||
|
; <61> 12/2/91 SAM Using official boxflag equates now.
|
|||
|
; <60> 11/19/91 DTY Use bhi instead of bgt to do a proper unsigned longword compare
|
|||
|
; of the time stamp.
|
|||
|
; <59> 11/18/91 DTY _HOpenResFile isn’t around yet. Use _OpenResFile instead.
|
|||
|
; <58> 11/15/91 DTY Change the resource ID of the 'gbly' resource to match the ones
|
|||
|
; in the Gibbly ERS.
|
|||
|
; <57> 11/8/91 DTY Add code which finds CPU Gibblies, and determines who should
|
|||
|
; boot the machine. Split off all the code to do the actual
|
|||
|
; booting into BootCode.a (everything from LoadVMAndDebugger and
|
|||
|
; later.)
|
|||
|
; <56> 11/4/91 YK Register components in the INIT loading loop.
|
|||
|
; <55> 11/4/91 JSM Take out SysPrivateEqu.a again.
|
|||
|
; <54> 10/28/91 SAM Added a default define of false to has3rdFloppy.
|
|||
|
; <53> 10/28/91 SAM/KSM Rolled in Regatta file:
|
|||
|
; On Spike with caches diabled, we patch the MFM WrData vector of
|
|||
|
; the Sony driver so we can use an updated timing constant in the
|
|||
|
; Write code. The original constant is *barely* within spec and
|
|||
|
; with caches disable it is no longer even close.
|
|||
|
; Changed CheckFor040CacheInhibit to use the hwPriv call to push
|
|||
|
; the caches, added a clock rate calculation to determine the
|
|||
|
; amount of adjustment TimeDBRA will require with the caches off
|
|||
|
; on the differently clocked 040s. Added a Terror2 (ROM minor
|
|||
|
; version 17) check to the Zap PRAM routine so it will work on
|
|||
|
; Zydeco.
|
|||
|
; Updated the kNo040CacheTimeDBRA value.
|
|||
|
; Slam a slower/lower TimeDBRA when the 040 caches are inhibited.
|
|||
|
; (jmp) Make the System cmd-opt-r-p PRAM Reset work on TERROR
|
|||
|
; machines to fix a TERROR bug.
|
|||
|
; Changed HighestSupportedBoxFlag to Eclipse33.
|
|||
|
; Added code to inhibit the 68040 caches if the high bit of the
|
|||
|
; MMFlags byte is set (PRAM 8A).
|
|||
|
; Add back the check for Gestalt after loading VM cuz if VM does
|
|||
|
; not load, Gestalt is not yet implemented on non IIci ROM
|
|||
|
; machines.
|
|||
|
; Adding free memory checks after VM loads.
|
|||
|
; Removed the previous revision -- Macsbug has been fixed to load
|
|||
|
; in copyback!
|
|||
|
; Inhibited all 040 caches while loading Macsbug cuz its too
|
|||
|
; brain-damaged to load in copyback.
|
|||
|
; <52> 9/16/91 JSM Cleanup header, don’t include SysPrivateEqu.a (already in dump
|
|||
|
; file).
|
|||
|
; <51> 7/2/91 JSM Remove obsolete 7.0 related SysVers conditionals.
|
|||
|
; <50> 6/12/91 LN added #include 'InternalOnlyEqu.a'
|
|||
|
; <49> 6/11/91 gbm Take out conditional for Regatta
|
|||
|
; <48> 4/13/91 stb dty, BRC#86692: Replace WhichCPU (borrowed from ROM) with
|
|||
|
; HandleMacIIWith030. Now handle exactly one case where we help
|
|||
|
; accelerators be VM-capable.
|
|||
|
; <47> 4/2/91 SAM Bumping HighestSupportedBoxFlag for Regatta build.
|
|||
|
; <46> 3/31/91 csd dba: Changed the test for 040 in the WhichCPU routine so that it
|
|||
|
; doesn’t jam 0 into the CACR, thereby possibly nuking any data
|
|||
|
; which has not been flushed out of the cache.
|
|||
|
; <45> 3/13/91 stb bbm, #83253: setup and use new ExpandMem global
|
|||
|
; emMinSysHeapFreeSpace which specifies how much elbow room to
|
|||
|
; leave in the system/process mgr heaps.
|
|||
|
; <44> 2/19/91 gbm csd, #Go5 approved: Make sure _MemoryDispatch is NOT implemented
|
|||
|
; on machines without PMMUs. Also fix the related bug in the ci
|
|||
|
; ROM that sets MMUType wrong.
|
|||
|
; <43> 2/15/91 gbm stb & dba, BRC # 82829: Fix the WhichCPU routine so that is
|
|||
|
; stops turning off data cache and data bursting on '030s
|
|||
|
; <42> 2/11/91 stb gbm, WS #stb211: change BSR.S back to BSR so MacsBug won’t die
|
|||
|
; if you bail during install (by holding down the mouse button).
|
|||
|
; Disassembler, too.
|
|||
|
; <41> 2/11/91 stb gbm, BRC # 82423: implement StripAddress early enough to use
|
|||
|
; when installing VM
|
|||
|
; <40> 1/29/91 csd stb, Whiteboard Bug: Moved the SetDefaults code to an earlier
|
|||
|
; position so that it executes before code that uses the
|
|||
|
; variables.
|
|||
|
; <39> 1/23/91 stb TED,81551: test a result code before BCC’ing.
|
|||
|
; <38> 1/19/91 stb & DC (& dfh for some of it) change 'dbex' id; adjust file cache
|
|||
|
; allowance; coordinate upward and downward growth limits.
|
|||
|
; <37> 1/14/91 stb & mda; more net booting stuff; disable extension disabling if
|
|||
|
; desired; do DoWeHaveEnoughRAMToBoot earlier; give file cache a
|
|||
|
; little less BufPtr room. add culprit names for VM, Debugger,
|
|||
|
; Disassembler; jam CPUflag to support 3rd-party processors for
|
|||
|
; VM.
|
|||
|
; <36> 12/18/90 stb & JDR; add error check after _MemoryDispatch.
|
|||
|
; fix infinite loop in MakeSysFree if couldn’t get desired amount.
|
|||
|
; <35> 12/15/90 stb & KSM; move the currently-executing filename to avoid conflict
|
|||
|
; with INITs which check CurApName to see if it’s post-boot time.
|
|||
|
; Replace error 106 with 25. Remove _MemoryDispatch declaration.
|
|||
|
; <34> 12/13/90 stb & gbm; no longer load AppleTalk from a file.
|
|||
|
; Use source to GetDefaultStartup to avoid problem on Plus.
|
|||
|
; Reserve 100K for post-boot allocations by Process Mgr & Finder.
|
|||
|
; <33> 12/12/90 stb & gbm; pass bufPtrLimit to LoadFileSystemCache code
|
|||
|
; & dba; added 'appe' (background app) to the list of boot-executables.
|
|||
|
; & bbm; add Cmd-Option-pr to reset PRAM on Plus, SE, II, Portable
|
|||
|
; & k s; add net booting hooks
|
|||
|
; <32> 11/15/90 stb & JDR; move dsBufPtrTooLow to SysErr.a
|
|||
|
; <31> 11/9/90 dba & JSM; move 8•24 GC loading before script system loading
|
|||
|
; <30> 11/1/90 dba & stb; some misc. cleanup; fix bug where we were checking
|
|||
|
; against the wrong value for the barrier; fix obscure error
|
|||
|
; handling bug in NewPtrStartup; add NewPtrStartup for post-boot
|
|||
|
; that returns an error; add an ellipsis on the end of long file
|
|||
|
; names, instead of relying on smart code in the DSAT; put in the
|
|||
|
; file name for all files opened outside the system file, not just
|
|||
|
; for files with INIT resources
|
|||
|
; <29> 10/31/90 dba & csd; add code to load the 8•24 GC support code
|
|||
|
; <28> 10/30/90 stb & BBM; make booting safer and more predictable in low-memory
|
|||
|
; conditions.
|
|||
|
; <27> 10/22/90 JJ Rex V8: Change all box flag references to use boxMacLC. Get rid
|
|||
|
; of boxElsie and boxElsieV8.
|
|||
|
; <26> 10/1/90 dba add innocuous value for location 0
|
|||
|
; <25> 9/25/90 SAM Bumped highestBoxFlag to ElsieV8.
|
|||
|
; <24> 9/22/90 gbm (with dba) change the routines that could kill ApplZone so that
|
|||
|
; they do InitApplZone to get rid of the old contents
|
|||
|
; <23> 9/16/90 gbm Fix detatching of system INITs. I don't think it ever worked...
|
|||
|
; <22> 9/10/90 dba fix name copy bug
|
|||
|
; <21> 8/27/90 VL (actually dba) set TheZone to SysZone when doing
|
|||
|
; MakeSystemHeapGrowable since the application heap goes away.
|
|||
|
; <20> 8/10/90 dba load A/ROSE and AppleTalk; this obsoletes INIT 18 and prevents
|
|||
|
; the need for INIT 16
|
|||
|
; <19> 8/6/90 stb add test for at least 1.5MB to make sure we can boot 7.0
|
|||
|
; <18> 7/20/90 dba get rid of PTCH -1
|
|||
|
; <17> 6/22/90 dba (with emt) move this code onto the stack to avoid fragmenting
|
|||
|
; the system heap
|
|||
|
; <16> 6/11/90 EMT Moved alternate trap dispatcher loading from patch files.
|
|||
|
; <15> 5/29/90 DDG NEEDED FOR SIXPACK: Changed all the sixpack conditionals from
|
|||
|
; six-point-oh-seven to six-point-oh-six.
|
|||
|
; <14> 5/11/90 PKE NEEDED FOR SIXPACK: if this file is used for 6.0.6:
|
|||
|
; Conditionalized early loading of script systems (see <9> and
|
|||
|
; <13>) on SysVers >= $700. ALSO (for 7.0 only): Added call to new
|
|||
|
; Script Mgr _AddScriptFonts routine after all INITs.
|
|||
|
; <13> 5/5/90 PKE Added call to Script Mgr _InitScripts (new) after script system
|
|||
|
; installation.
|
|||
|
; <12> 4/25/90 dba change MMU check in LoadVM section (also add feature to load
|
|||
|
; MacsBug before VM)
|
|||
|
; <11> 4/20/90 dba check to see that the Shift key is the only key held down for
|
|||
|
; Extensions Disabled
|
|||
|
; <10> 4/20/90 dba close QD port much earlier; it isn’t doing anyone any good; do
|
|||
|
; InitApplZone for each INIT file; rely on patch to SetAppBase to
|
|||
|
; do InitApplZones
|
|||
|
; <9> 4/19/90 dba add support for Script Systems; increase system heap size
|
|||
|
; <8> 4/19/90 dba make StartupScreens and Disable Extensions work
|
|||
|
; <7> 4/18/90 dba change bsr.s to bsr (I will never check in w/o building)
|
|||
|
; <6> 4/18/90 dba change branch from pl to mi to fix MakeSysFree bug (INITs were
|
|||
|
; not being loaded); restuff dirID to make setting of the noINITs
|
|||
|
; bit work right
|
|||
|
; <5> 4/17/90 dba fix bug with InitApplZone stuff
|
|||
|
; <4> 4/16/90 csd save registers around calls to ptch and PTCH resources since
|
|||
|
; they don’t obey the register saving conventions.
|
|||
|
; <3> 4/11/90 dba put dynamic system heap size code for the Plus and SE back here;
|
|||
|
; do InitApplZone before each INIT, instead of after each
|
|||
|
; MakeSysFree; detach ourselves so we can support remote booting
|
|||
|
; closing the System file and opening a new one
|
|||
|
; <2> 4/10/90 dba fix bugs in MakeSysFree (wrong register d2 vs. d0 and possible
|
|||
|
; error where size is odd)
|
|||
|
; <1> 4/9/90 dba new today
|
|||
|
;
|
|||
|
; Change History from data fork of System file:
|
|||
|
;
|
|||
|
; <5> 3/22/90 dba change name of LoadPatch to LoadLinkedPatches
|
|||
|
; <4> 3/21/90 dba take out the lingering Debugger statement
|
|||
|
; <3> 3/21/90 dba change to work with new boot blocks for 7.0
|
|||
|
; <2> 12/28/89 dba use MAIN instead of PROC to get dead code stripping; also get
|
|||
|
; rid of wierd header that was required by a strange build rule in
|
|||
|
; the old Make file; a corresponding change was made in
|
|||
|
; SysObj.Make
|
|||
|
; <1.5> 11/17/89 dba got rid of checks for 64K ROMs
|
|||
|
; <1.4> 10/14/89 EMT Always load in RAM cache in system 7.
|
|||
|
; <1.3> 6/5/89 EMT One more try.
|
|||
|
; <1.2> 6/2/89 EMT Fixed coding errors in 1.1.
|
|||
|
; <1.1> 6/1/89 EMT Removed ROM69 stuff. Bootstrap StripAddress if it doesn’t exist.
|
|||
|
; Use StripAddress before executing 'PTCH's.
|
|||
|
; <1.0> 11/16/88 CCH Added to EASE.
|
|||
|
; <S174> 4/10/87 bbm Save off the A5 world for the inits. (Some inits relied on
|
|||
|
; CurrentA5 to be set up.)
|
|||
|
; <S145> 3/27/87 bbm The algorithm that S115 used to grow the heap was to enlarge the
|
|||
|
; heap by 16k or the size of the patch - whichever was bigger.
|
|||
|
; What you really want is 16k free in addition to the size of the
|
|||
|
; patch.
|
|||
|
; <S128> 3/23/87 JTC On 64K ROMs be sure not to use nonexistent traps (such as
|
|||
|
; SizeRsrc) or resize heap (since boot blocks are loaded at 64K).
|
|||
|
; <S115> 3/19/87 JTC Ensure sufficient sys heap space before loading patches, using
|
|||
|
; SizeResource to figure the local min. Then guarantee MinSysExtra
|
|||
|
; space after loading last one. Code borrowed from INIT=31.
|
|||
|
; <S109> 3/18/87 bbm Added the code for ‘PTCH $FFFF’. This enables general patches
|
|||
|
; for all machines before the patches are read in by ‘PTCH 0’ and
|
|||
|
; general patches after the patches are read in by ‘PTCH $FFFF’.
|
|||
|
; <S108> 3/17/87 bbm For system heaps larger than 58k, rom69patch needed to move the
|
|||
|
; boot code (the boot code is loaded in at $10000). Since the boot
|
|||
|
; code has moved, the return address on the stack should be
|
|||
|
; modified. If you change the nature of the stack — which rom69fix
|
|||
|
; depends on - you must also modify rom69fix.a.
|
|||
|
; <P029> 1/22/87 JTC JTC The above dates should surely be ‘86 and the res type is now
|
|||
|
; 'PTCH', despite the above comments. This change is to
|
|||
|
; accommodate the new PTCH=0 patch file for all systems.
|
|||
|
; 11/20/86 BB Changed resource type for patch files from 'PTCH' to 'ptch'.
|
|||
|
; 11/15/86 BB New today.
|
|||
|
;
|
|||
|
; Change History from INIT 31:
|
|||
|
;
|
|||
|
; <2> 2/19/90 sad <version 5>
|
|||
|
; look into Extensions and Control Panels folders using Folder
|
|||
|
; Mgr; use 1-deep resource calls instead of 64K ROM-compatible
|
|||
|
; hacks; got rid of d7 hack for 64K ROMs; assures MinSysFree after
|
|||
|
; last INIT file instead of before first
|
|||
|
; <1.4> 11/17/89 dba got rid of checks for 64K ROMs
|
|||
|
; <1.3> 6/19/89 CCH Removed check for files of type 'mntr' from version 1.2.
|
|||
|
; <1.2> 2/21/89 CCH Added 'mntr' type to list of files that contain INITs.
|
|||
|
; <1.1> 1/17/89 CCH Merged changes from 6.0.3.
|
|||
|
; <1.0> 11/16/88 CCH Added to EASE.
|
|||
|
; <S424> 3/15/88 DBG Prevent invisible INIT files from running
|
|||
|
; <S393> 2/12/88 JRM Use fndrInfo bit to eliminate extra OpenResFiles. Set the bit if
|
|||
|
; no INIT resources are found for a file. Check the bit before
|
|||
|
; calling OpenResFile
|
|||
|
; <SB293> 10/2/87 DAF Added an InitGraf before the InitPalettes so that all gDevices
|
|||
|
; will be active.
|
|||
|
; <S285> 9/21/87 DAF Changed the ROM85 test in s277 to test MacII or greater, rather
|
|||
|
; than equal.
|
|||
|
; <S277> 9/16/87 DAF Added InitPalettes here before INIT files are loaded. This
|
|||
|
; causes the data structures to be allocated early rather than
|
|||
|
; during the first init that calls _InitWindows.
|
|||
|
; <S173> 4/10/87 JTC Fix CDEV to be cdev.
|
|||
|
; <S114> 3/19/87 JTC Fix to get 16K min in sys heap even if no RDEV,INIT,CDEV files.
|
|||
|
; Also, look for CDEV files too.
|
|||
|
; <S9> 2/14/87 JTC Call InitApplZone after SetApplBase to get initialation
|
|||
|
; attendant thereto.
|
|||
|
; <S6> 1/5/87 JTC Add new resource 'sysz' comprising just one long word to request
|
|||
|
; said amount of system heap space. Put code into inner loop of
|
|||
|
; loading and executing INITs below to guarantee #MinSysExtra
|
|||
|
; (borrowed from start code) free space at every execution.
|
|||
|
; 8/4/86 DLD Converted source to MPW.
|
|||
|
;
|
|||
|
; System 3.1
|
|||
|
;
|
|||
|
; 2/8/86 JTC&LAK Fixed bug in patching return address into boot blocks after the
|
|||
|
; boot blocks have been moved. Also added a BCLR to assure that
|
|||
|
; the half-way point in memory is even after the DIV by 2.
|
|||
|
; 2/5/86 LAK Fixed bug for Shuffle: return address needs to be updated after
|
|||
|
; stack move.
|
|||
|
;
|
|||
|
; for InfoSphere
|
|||
|
;
|
|||
|
; 1/7/86 LAK On old ROMs: if not called from $10000 space or BufPtr has been
|
|||
|
; moved below MemTop/2 + 1K already then punt the normalization.
|
|||
|
; Someone has probably already 'normalized' the world, hopefully
|
|||
|
; correctly.
|
|||
|
;
|
|||
|
; System Tools Disk for Plus
|
|||
|
;
|
|||
|
; 12/10/85 LAK Modified to look for files of both INIT and RDEV types.
|
|||
|
; 12/6/85 ELR New Today
|
|||
|
;
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
; equates
|
|||
|
|
|||
|
load 'StandardEqu.d'
|
|||
|
include 'MMUEqu.a'
|
|||
|
include 'BootEqu.a' ; <63>
|
|||
|
include 'LinkedPatchMacros.a' ; <64>
|
|||
|
include 'ResourceMgrPriv.a' ; <76> Needed for mNext
|
|||
|
|
|||
|
bFInvisible equ 7 ; bit in ilFlUsrWds+fdFlags which means an invisible file
|
|||
|
|
|||
|
kCPUGibblyFileType equ 'gbly' ; Type of file containing boot code for CPU’s
|
|||
|
kGibblyResourceType equ 'gbly' ; Resource type containing CPU information <57>
|
|||
|
kGibblyResourceID equ -16385 ; Resource ID of gibbly resource <57>
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
StartSystem main
|
|||
|
|
|||
|
; Registers passed in from boot blocks:
|
|||
|
; A3 = handle to this resource
|
|||
|
; A4 = dirID of the startup application (for pre-7.0 systems; used by the remote booting INIT)
|
|||
|
; A5 = pointer to globals (SP + 400)
|
|||
|
; A6 = pointer to boot blocks (used by the remote booting INIT)
|
|||
|
|
|||
|
move.l a3,a0 ; get the size of this boot code
|
|||
|
_GetHandleSize
|
|||
|
lea @continue,a0 ; copy from @continue to the end of the boot code
|
|||
|
lea StartSystem,a1
|
|||
|
sub.l a0,a1 ; get StartSystem-@continue
|
|||
|
add.l a1,d0 ; fix up size
|
|||
|
|
|||
|
sub.l d0,sp ; make room on the stack
|
|||
|
move.l sp,a1 ; copy onto the stack
|
|||
|
_BlockMove ; move it up
|
|||
|
jmp (a1) ; pass control there
|
|||
|
@continue
|
|||
|
move.l a3,-(sp) ; get rid of the resource
|
|||
|
_ReleaseResource ; and continue with booting as normal
|
|||
|
|
|||
|
move.l ROMBase,a0 ; point into a safe place in ROM
|
|||
|
add.l #$10000,a0 ; 64K into the ROM is always safe
|
|||
|
move.l a0,0 ; jam this nice value into location 0
|
|||
|
|
|||
|
move.l sp,CurStackBase ; MacsBug works better if CurStackBase is set up
|
|||
|
move.l a5,CurrentA5 ; INITs like to have CurrentA5
|
|||
|
clr.l ResumeProc ; there is no ResumeProc before applications load
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
SetDefaults ; <33><34>
|
|||
|
|
|||
|
; Set the lower limit to bufPtr’s descent.
|
|||
|
; This includes consideration for:
|
|||
|
; boot globals
|
|||
|
; sufficient room past the system heap for the process mgr heap (including the Finder) <38>
|
|||
|
|
|||
|
lea BootGlobals.lowestBufPtr(a5),a0 ; the top of the boot globals
|
|||
|
move.l a0,BootGlobals.bufPtrLimit(a5)
|
|||
|
|
|||
|
; Set the amount to reserve in the system heap for after booting.
|
|||
|
|
|||
|
move.l #minSysHeapFreeAfterBoot,BootGlobals.reservedForAfterBoot(a5) ; <34>
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
bsr MakeSystemHeapGrowable ; <71> Back from the dead for A/UX.
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
HandOffBootProcess
|
|||
|
|
|||
|
; <57> Look through the System, ROM, and CPU Gibblies for the newest startup code that
|
|||
|
; can boot this box, and pass the boot process off to it.
|
|||
|
|
|||
|
bsr GetNewestStartupCode ; Find the newest startup code
|
|||
|
jmp (a0) ; And, pass it off.
|
|||
|
|
|||
|
; ——— End of boot arbitration ———
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
ApplZoneExists
|
|||
|
|
|||
|
move.l ApplZone,d0
|
|||
|
cmp.l SysZone,d0
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
MakeSystemHeapGrowable
|
|||
|
|
|||
|
; Set things up so the system heap and the application heap are the same, so the system heap will
|
|||
|
; grow (this is only needed for the Plus and the SE, other ROMs do something like this already).
|
|||
|
|
|||
|
bsr.s ApplZoneExists
|
|||
|
beq.s @noApplZone ; if no ApplZone exists, no need to kill it
|
|||
|
_InitApplZone
|
|||
|
@noApplZone
|
|||
|
move.l SysZone,a0 ; calculate a new minimum size for the heap <28>
|
|||
|
add.l #initialSysHeapSize,a0 ; make it big enough so it won’t need to grow much <28>
|
|||
|
bsr.s PinSysHeapTop ; don’t go farther than we really can <28>
|
|||
|
_SetApplBase ; SetApplBase will never shrink the heap <28>
|
|||
|
|
|||
|
move.l SysZone,a0 ; the one true heap
|
|||
|
move.l a0,ApplZone ; coincident heaps
|
|||
|
move.l a0,TheZone ; make it the current heap too
|
|||
|
move.l bkLim(a0),HeapEnd ; end of dynamic system/application heap
|
|||
|
move.l sp,a0 ; find the stack
|
|||
|
sub.l DefltStack,a0 ; keep room for the stack
|
|||
|
sub.l #minBootAppHeapSize,a0 ; and the application heap
|
|||
|
_SetApplLimit ; this is the highest we should grow
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
PinSysHeapTop ; <28><34>
|
|||
|
|
|||
|
; Things above sysZone include the stack (which starts in the middle) and applZone (if any).
|
|||
|
; This is only called when SysZone is being made ApplZone so it can grow, so there is never
|
|||
|
; an ApplZone to worry about. However, we do have to leave room so we can create one later.
|
|||
|
;
|
|||
|
; Other things above that include: this code (on the stack), BufPtr, MemTop.
|
|||
|
;
|
|||
|
; a0 -> where they think they want the top of heap
|
|||
|
; a0 <- where they get to put the top of the system heap
|
|||
|
;
|
|||
|
; Trashes a1
|
|||
|
;
|
|||
|
; To Do:
|
|||
|
; Consider the case where the recommended top of the sysheap/bottom of the app heap is lower
|
|||
|
; than the current top of the system heap. Bad, but what should happen? We can't cut into
|
|||
|
; the stack or app heap sizes, can we? Maybe we just stop trying to load inits because we
|
|||
|
; ran out of room. How would we get into this state, anyway? Would it (could it) ever happen?
|
|||
|
|
|||
|
move.l sp,a1
|
|||
|
sub.l DefltStack,a1 ; leave room for the stack
|
|||
|
sub.l #minBootAppHeapSize,a1 ; leave room for an app heap later <34>
|
|||
|
sub.l BootGlobals.reservedForAfterBoot(a5),a1 ; leave room for post-boot <34>
|
|||
|
|
|||
|
cmp.l a0,a1
|
|||
|
bhi.s @ok
|
|||
|
move.l a1,a0
|
|||
|
@ok
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
CloseTheFile
|
|||
|
|
|||
|
; Close the current resource file.
|
|||
|
;
|
|||
|
; d4.W -> file refnum
|
|||
|
; d4.W <- -1, indicating no file is open
|
|||
|
; Trashes d0/a0
|
|||
|
|
|||
|
cmp.w #-1,d4
|
|||
|
beq.s @done
|
|||
|
move d4,-(sp) ; refNum of the open file
|
|||
|
_CloseResFile
|
|||
|
moveq #-1,d4 ; no file is open
|
|||
|
@done
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
GetNewestStartupCode
|
|||
|
|
|||
|
; <57> Look for 'gbly' resources in the System, ROM, and CPU Gibbly files and determine
|
|||
|
; which one has the latest boot code that can boot this machine.
|
|||
|
|
|||
|
movem.l d6/d7,-(sp) ; D7 flags whether to display welcome DSAT messages; D6 holds the handle to the DSAT <68>
|
|||
|
|
|||
|
; <76> We used to use the directory ID in a4 to search for Gibblies in. This is the
|
|||
|
; wrong place to search, so get the real dirID of the System Folder out of the
|
|||
|
; master directory block.
|
|||
|
|
|||
|
moveq #0,d7 ; <76>
|
|||
|
lea BootGlobals.paramBlock(a5),a0 ; <76> Get our IO block
|
|||
|
clr.l ioFileName(a0) ; <76> we don’t want the disk’s name
|
|||
|
clr.w ioVolIndex(a0) ; <76> use the vRefNum left over from MountVol
|
|||
|
_HGetVInfo ; <76> see if there is a system folder
|
|||
|
bnz.s @gotSystemFolderDirID ; <76> if we fail, try with a dirID of 0
|
|||
|
move.l ioVFndrInfo(a0),d7 ; <76> get the dirID of system folder
|
|||
|
|
|||
|
@gotSystemFolderDirID
|
|||
|
moveq #-1,d6 ; Keep count of how many bootable Gibblies are found
|
|||
|
bsr GetGibbly ; See if there’s a gibbly in the System file
|
|||
|
bz.s @noSystemGibbly
|
|||
|
|
|||
|
bsr CanThisGibblyBootThisMachine ; See if it knows about this machine
|
|||
|
bmi.s @noSystemGibbly ; If N flag is set, System gibbly is too old
|
|||
|
|
|||
|
moveq #0,d6 ; Got one gibbly
|
|||
|
move.l (a4),a0 ; The System Gibbly knows how to boot this machine.
|
|||
|
move.l 2(a0),-(sp) ; Remember time stamp
|
|||
|
move.w SysMap,-(sp) ; And the file it came from
|
|||
|
move.l a4,-(sp) ; <67>
|
|||
|
_ReleaseResource ; <67> Done with the 'gbly' resource
|
|||
|
|
|||
|
@noSystemGibbly
|
|||
|
move.w #MapTrue,ROMMapInsert ; Look for a gibbly in ROM
|
|||
|
bsr GetGibbly ; Go fetch it
|
|||
|
bz.s @noROMGibbly
|
|||
|
|
|||
|
addq.l #1,d6 ; Got another one <65>
|
|||
|
move.l (a4),a0 ; Gibblies in ROM always know how to boot
|
|||
|
move.l 2(a0),-(sp) ; the machine with the ROM, so don’t bother
|
|||
|
move.w #1,-(sp) ; checking if it can or not.
|
|||
|
move.l a4,-(sp) ; <67>
|
|||
|
_ReleaseResource ; <67> Done with 'gbly' resource
|
|||
|
|
|||
|
@noROMGibbly
|
|||
|
|
|||
|
; Now look for CPU Gibbly files in the root level of the System folder
|
|||
|
|
|||
|
lea BootGlobals.fileName(a5),a0 ; store pointer to file’s name
|
|||
|
move.l a0,BootGlobals.paramBlock+ioFileName(a5)
|
|||
|
clr.w BootGlobals.paramBlock+ioFileType(a5) ; "version" and permissions
|
|||
|
|
|||
|
moveq #0,d3 ; start looping through the files
|
|||
|
@nextGibbly
|
|||
|
addq.w #1,d3 ; increment the file index
|
|||
|
|
|||
|
lea BootGlobals.paramBlock(a5),a0 ; point at IO block
|
|||
|
clr.w ioVRefNum(a0) ; <73> Search the default volume. (At this stage, this is the boot volume.)
|
|||
|
move d3,ioFDirIndex(a0)
|
|||
|
move.l d7,ioDirID(a0)
|
|||
|
_HGetFileInfo ; d3 file in the folder
|
|||
|
bnz @noMoreGibblies ; no more files in the folder, stop loading
|
|||
|
|
|||
|
move.l ioFlUsrWds+fdType(a0),d0 ; grab file type for testing
|
|||
|
cmp.l #kCPUGibblyFileType,d0 ; is this the type we’re looking for?
|
|||
|
bne.s @nextGibbly ; no, move along
|
|||
|
@goodFile
|
|||
|
btst #bFInvisible,ioFlUsrWds+fdFlags(a0) ; is it invisible?
|
|||
|
bnz.s @nextGibbly ; yes, skip it, since it may be evil
|
|||
|
|
|||
|
bsr LoadGibbly ; Get the Gibbly out of this file
|
|||
|
bra @nextGibbly
|
|||
|
|
|||
|
@noMoreGibblies
|
|||
|
|
|||
|
; All usable gibblies and the file they came from are on the stack. Search
|
|||
|
; through these gibblies for the newest one.
|
|||
|
|
|||
|
tst.l d6
|
|||
|
bpl.s @thereAreGibblies ; <75> Gibblies that can boot this machine were found. Pick the newest one.
|
|||
|
|
|||
|
; If there are no Gibblies that can boot this machine, set a bit in low memory, call
|
|||
|
; the 'boot' 3 in the System file, and let it display the System Too Old version.
|
|||
|
|
|||
|
bset #systemEnabledBit,ExtensionsEnabledByte ; <75> Set this bit if no useable Gibblies could be found.
|
|||
|
move.w SysMap,d3 ; <75> Fetch the 'boot' 3 from the System file
|
|||
|
bra.s @notROMGibbly ; <75> And let it show the error
|
|||
|
|
|||
|
@thereAreGibblies
|
|||
|
bclr #systemEnabledBit,ExtensionsEnabledByte ; Clear this bit if a useable Gibbly was found
|
|||
|
moveq #0,d2 ; Initial time stamp value
|
|||
|
moveq #-1,d3 ; Initial reference number
|
|||
|
@findNewestGibbly
|
|||
|
move.w (sp)+,d4 ; Get resource reference number
|
|||
|
move.l (sp)+,d1 ; Get gibbly time stamp
|
|||
|
cmp.l d1,d2 ; Is this gibbly newer?
|
|||
|
bhi.s @releaseOlderGibbly ; <60> No.
|
|||
|
|
|||
|
exg d3,d4 ; Switch handle’s resource map and one to close
|
|||
|
move.l d1,d2 ; Remember the latest date to beat.
|
|||
|
@releaseOlderGibbly
|
|||
|
cmp.w SysMap,d4 ; Don’t allow the System file to be closed
|
|||
|
beq.s @dontCloseSystemFile
|
|||
|
bsr.s CloseTheFile ; Close the resource file in D4
|
|||
|
@dontCloseSystemFile
|
|||
|
dbra d6,@findNewestGibbly ; Keep going until no more gibblies
|
|||
|
|
|||
|
; All old gibblies are closed off and gone away. Get the 'boot' 3 resource from the
|
|||
|
; one remaining Gibbly file, and return it.
|
|||
|
|
|||
|
cmpi.w #1,d3 ; Check to see if the ROM has the newest gibbly
|
|||
|
bne.s @notROMGibbly
|
|||
|
move.w #MapTrue,ROMMapInsert ; If it is, turn on ROMMapInsert
|
|||
|
@notROMGibbly
|
|||
|
move.w d3,CurMap ; Make sure to get the right boot code.
|
|||
|
subq #4,sp
|
|||
|
move.l #'boot',-(sp)
|
|||
|
move.w #3,-(sp) ; Get 'boot' 3
|
|||
|
_Get1Resource ; Get the boot code
|
|||
|
move.l (sp)+,d0 ; Get the handle
|
|||
|
bz.s NoBootCode ; Uh oh!
|
|||
|
|
|||
|
; <76> Move the Gibbly’s resource map underneath the system resource map so the Gibbly
|
|||
|
; won’t get closed by RsrcZoneInit until it’s ready to be made into an override
|
|||
|
; map. Note that this code assumes that only two files are open at this time,
|
|||
|
; the System, and the Gibbly.
|
|||
|
|
|||
|
move.w SysMap,d1 ; <76>
|
|||
|
cmp.w CurMap,d1 ; <76> If there is no Gibbly, don’t do all this.
|
|||
|
beq.s @noExternalGibbly ; <76>
|
|||
|
move.l SysMapHndl,a0 ; <76> Get the system resource map
|
|||
|
move.l (a0),a0 ; <76>
|
|||
|
move.l TopMapHndl,a1 ; <76> We assume that the Gibbly is at the top of the resource chain
|
|||
|
move.l (a1),a1 ; <76>
|
|||
|
move.l mNext(a0),mNext(a1) ; <76> Put whatever’s after the system after the Gibbly
|
|||
|
move.l TopMapHndl,mNext(a0) ; <76> Put the Gibbly after the system
|
|||
|
move.l SysMapHndl,TopMapHndl ; <76> Put the system on top.
|
|||
|
@noExternalGibbly
|
|||
|
move.l d0,a3 ; Boot code expects handle in A3 on entry
|
|||
|
move.l (a3),a0
|
|||
|
|
|||
|
move.l d7,a4 ; Restore A4 boot volume directory
|
|||
|
movem.l (sp)+,d6/d7 ; <68>
|
|||
|
rts ; Let ’er rip.
|
|||
|
|
|||
|
NoBootCode
|
|||
|
moveq #dsOldSystem,d0 ; Report system too old if no boot could be found
|
|||
|
_SysError ; Bombs away!
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
LoadGibbly
|
|||
|
|
|||
|
; Get the 'gbly' resource from the CPU Gibbly file, and put it’s time stamp on the stack if it can boot
|
|||
|
; this machine
|
|||
|
;
|
|||
|
; a5 -> globals, including parameter block and file name storage
|
|||
|
; d7.L -> folder type to look in, then folder dirID
|
|||
|
; d0.W <- error result
|
|||
|
; ResErr <- error result
|
|||
|
;
|
|||
|
; d4.W = refnum of opened file
|
|||
|
;
|
|||
|
|
|||
|
|
|||
|
bsr.s OpenTheFile ; go open the resource file
|
|||
|
bnz.s @skip ; skip file if bad open
|
|||
|
|
|||
|
bsr GetGibbly
|
|||
|
bz.s @noGibbly ; no gibbly, go on
|
|||
|
bsr CanThisGibblyBootThisMachine ; See if it knows about this machine
|
|||
|
bmi.s @noGibbly ; If N flag is set, System gibbly is too old
|
|||
|
|
|||
|
move.l (sp)+,a0 ; Take off the return address before pushing the gibbly handle
|
|||
|
addq.l #1,d6 ; Got another gibbly <66>
|
|||
|
move.l (a4),a1
|
|||
|
move.l 2(a1),-(sp) ; Remember the time stamp of the gibbly if it can boot this machine
|
|||
|
move.w d4,-(sp) ; And remember the file it came from
|
|||
|
move.l a0,-(sp) ; Push the return address back on
|
|||
|
move.l a4,-(sp) ; <67>
|
|||
|
_ReleaseResource ; <67> We don’t need the 'gbly' resource around any more.
|
|||
|
bra.s @skip
|
|||
|
@noGibbly
|
|||
|
bsr.s CloseTheFile ; Close the Gibbly if it won’t be used
|
|||
|
@skip
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
OpenTheFile
|
|||
|
|
|||
|
; Open the current resource file with preloading off.
|
|||
|
;
|
|||
|
; a5 -> globals, including file name at BootGlobals.fileName(a5)
|
|||
|
; d7.L -> parent directory id
|
|||
|
; d4.W <- file refnum
|
|||
|
; d0.W <- error result
|
|||
|
; ResErr <- error result
|
|||
|
;
|
|||
|
; Trashes d0/a0
|
|||
|
|
|||
|
move.l a1,-(sp)
|
|||
|
|
|||
|
clr.b ResLoad ; no preloads please
|
|||
|
subq #2,sp ; room for result
|
|||
|
pea BootGlobals.fileName(a5)
|
|||
|
_OpenResFile ; <59> _HOpenResFile doesn’t exist yet.
|
|||
|
move (sp)+,d4 ; save the refnum
|
|||
|
st ResLoad ; restore resLoad to proper state
|
|||
|
|
|||
|
move.l (sp)+,a1
|
|||
|
move.w ResErr,d0
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
GetGibbly
|
|||
|
|
|||
|
; Get a 'gbly' resource from the current resource map.
|
|||
|
;
|
|||
|
; A4 <- Handle to 'gbly' resource
|
|||
|
; CCR Z if didn’t find a 'gbly', z otherwise
|
|||
|
|
|||
|
subq #4,sp
|
|||
|
move.l #kGibblyResourceType,-(sp)
|
|||
|
move.w #kGibblyResourceID,-(sp)
|
|||
|
_Get1Resource ; Get the Gibbly
|
|||
|
move.l (sp)+,d0 ; Get handle in d0 to set the condition code
|
|||
|
move.l d0,a4 ; And get handle into A4
|
|||
|
rts
|
|||
|
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
CanThisGibblyBootThisMachine
|
|||
|
|
|||
|
; See if a CPU gibbly can boot this machine.
|
|||
|
;
|
|||
|
; A4 -> Handle to 'gbly' resource
|
|||
|
; D0 <- -1 = Can’t boot
|
|||
|
; 0+ = Can boot
|
|||
|
; A1 Hosed
|
|||
|
; D1 Hosed
|
|||
|
|
|||
|
move.l (a4),a0 ; Get pointer to resource
|
|||
|
addq #6,a0 ; Point to boxflag count
|
|||
|
move.w (a0)+,d0 ; Get count
|
|||
|
subq #1,d0 ; Make count zero based for dbra
|
|||
|
moveq #0,d1
|
|||
|
|
|||
|
move.l ROMBase,a1 ; <62>
|
|||
|
cmp.w #kROMVersionPlus,8(a1) ; <62> Plus ROM?
|
|||
|
bne.s @notPlus ; <62> No, get box value from BoxFlag
|
|||
|
move.b #boxPlus,d1 ; <62> Otherwise, set it up ourselves
|
|||
|
bra.s @findBoxFlagInGibbly ; <62>
|
|||
|
|
|||
|
@notPlus
|
|||
|
move.b BoxFlag,d1 ; Get BoxFlag into a register
|
|||
|
@findBoxFlagInGibbly
|
|||
|
cmp.w (a0)+,d1 ; Compare a boxflag from the Gibbly against BoxFlag
|
|||
|
dbeq d0,@findBoxFlagInGibbly ; If not equal, keep looking
|
|||
|
@gibblyCanBoot
|
|||
|
tst.w d0 ; Set the condition code
|
|||
|
rts
|
|||
|
ENDP
|
|||
|
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
|||
|
|
|||
|
|
|||
|
end
|