sys7.1-doc-wip/OS/StartMgr/Boot2.a
2019-07-27 22:37:48 +08:00

752 lines
37 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; 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 wont 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 its 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
; wont 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 thats 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 doesnt
; bring up the dialog any more, because 'DSAT' 0 isnt set up
; until 'boot' 3. Now, set a bit in low memory, and call the
; System files '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, well
; put it back in here, before any Gibblies are opened, so we dont
; 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 Deans 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
; dont have to keep the StartSystem.a and BootCode.a versions in
; sync.
; <62> 12/2/91 DTY BoxFlag doesnt 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 isnt 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, dont 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
; doesnt 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 wont 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 BCCing.
; <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 couldnt 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 its 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 isnt 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 dont 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 doesnt 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 CPUs
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 bufPtrs 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 wont need to grow much <28>
bsr.s PinSysHeapTop ; dont 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 dont want the disks 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 theres 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 dont 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 files 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 were 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 handles resource map and one to close
move.l d1,d2 ; Remember the latest date to beat.
@releaseOlderGibbly
cmp.w SysMap,d4 ; Dont 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 Gibblys resource map underneath the system resource map so the Gibbly
; wont get closed by RsrcZoneInit until its 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, dont 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 whatevers 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 its 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 dont need the 'gbly' resource around any more.
bra.s @skip
@noGibbly
bsr.s CloseTheFile ; Close the Gibbly if it wont 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 doesnt 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 didnt 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 = Cant 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