mac-rom/OS/StartMgr/StartBoot.a

1055 lines
42 KiB
Plaintext

;
; File: StartBoot.a
;
; Contains: This part of the Start Manager locates the Startup Device, loads its driver
; (if it hasn't already been loaded by InitIO), and asks the driver to get the boot blocks.
; It uses information in the boot blocks to initialize system variables,
; decide whether to load a debugger, and launch a Startup Application.
;
; Written by: Larry Kenyon February 1985
; modified by Wayne R. Loofbourrow August 1986
;
; Copyright: © 1985-1994 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM58> 1/28/94 chp Roll back <SM56> which is no longer required.
; <SM57> 12/6/93 DCB ShutInit was being called twice. The ShutDown queue is already
; setup in StartInit.a. The second call to it in InitSys7Toolbox
; blows away all ShutDown tasks that have been installed since the
; system booted. Since this is undesirable I am getting rid of the
; second ShutInit.
; <SM56> 11/10/93 chp Disable LateLoad on TNT (for now).
; <SM55> 11/7/93 SAM Roll in <MC5> from mc900ftjesus.
; <MC5> 11/6/93 SAM Removed <MC3>. Eric beat me to it. VM pokes the level 4 irq
; handler into the supervisior vector table itself.
; <SM54> 10/15/93 SAM Roll in <MC4> from mc900ftjesus.
; <MC4> 10/15/93 SAM For PDM. The DMA irq hander is now installed in the supervisor
; vector table when VM is on.
; <SM53> 9/29/93 SAM From mc900ftjesus.
; <MC3> 9/27/93 SAM Cosmetic changes.
; <MC2> 9/26/93 pdw Removed extra OptimizePACKs.
; <SM52> 9/2/93 IH Add Display Manager Install to boot process.
; <SM51> 8/5/93 JDR integrate Component Mgr from Reality
; <SM50> 8/4/93 JDR Integrate sound manager 3.0 project.
; <SM49> 7/20/93 SAM Cleaned up this file a bit. Rewrote what used to be
; "installmgr." Removed a patch file in the process. This change
; fixes the "the top 1/3 of my Cyclone system heap is not heal
; down with VM on" and quite a host of others... Moved all that
; disabled password junk to the end of the file.
; <SM48> 5/30/93 SAM Commented out Robert's password thing and the syserr F-Line
; patch that would destroy the pc of the offending instruction.
; Moved the ROM_EM stuff to Tidbits.
; <SM47> 4/9/93 SAM Commented out the calls to init Bass (they've been moved to
; StartInit. (INSTALLBASSCOMMON and FORCEINITFONTSCALL)
; <SM46> 3/25/93 RB Added Robert Polic's password-on-boot code from Ludwig.
; <SM45> 2/13/93 PW Reenabled LateLoad for PDM.
; <SM44> 2/6/93 RC Comment out LateLoad for PDM since the last change caused PDM to
; Hang on Boot
; <SM43> 2/5/93 PN Adding scsiLateLoad into the end of InstallMgr
; <SM42> 1/12/93 PN Fix a bug where in InitFonts it used emSplineKey which is not
; yet initialized. So the call InstallBassCommon has to precede
; Initfonts. InitFonts is taken out of this file because it is
; called in the boot block before Welcome to Macintosh.
; <SM41> 12/16/92 SWC Moved InitEvents->OSEventMgr.a and CenterRect->StartBoot.a.
; Removed dead code.
; <SM40> 12/3/92 PN Add AfterBootSetApplBase to the InstallMgr to patch out
; SetApplBase trap at Gibbly time
; <SM39> 11/24/92 RB Use the feature hasROM_EM so it can be easily taken out, because
; Steve Glass doesn't want the extra feature in his ROMs.
; <SM38> 11/23/92 RB Moved an LC930 conditional.
; <SM37> 11/20/92 rab Changed BootMe to call ReBoot if execution of the Boot Blocks
; fail. This allows BootMask to be updated and proper booting to
; continue if a device with Boot Blocks but no System is
; encountered.
; <SM36> 11/18/92 RB Add a call to the Disk Cache installation routine from the
; InitManagers call.
; <SM35> 11/5/92 RB Add a call to check the state of the extensions at the end of
; InstallMgr.
; <SM34> 11/3/92 rab Horror ROM sync-up. Rolled CloseNetBootPatch from Horror
; StartInit.a into Reboot.
; <SM33> 10/30/92 HY Add "Ginty" support to boot process.
; <SM32> 10/28/92 PN Remove LoadProcessMgrSegmentLowerInSysHeap since it's been done
; in BootCode3.a and call the QDSecondaryInit.
; <SM31> 10/26/92 RB Exclude any unused code from the LC930 build (1 Meg ROM). System
; 7 never returns control to the ROM after executing the Boot
; blocks, and we are System 7 based.
; <SM30> 9/15/92 RB The Boot code in Cube-e has a list of ROMs it knows about
; (Boot1.a), as it finds a ROM it sets up a parameter block
; pointer in d7, but if it does not find the ROM id d7 is never
; setup and later used as am parameter block, therefore the last
; value in d7 gets used as param block pointer and memory
; somewhere is trashed. So just in case set d7 to our boot time
; param block before we execute the boot blocks.
; <SM29> 9/10/92 AEK Removed call to InstallTimeMgr (not needed if new TM in ROM)
; NOTE: TimeMgrPatch.a should now be removed from ROM builds
; <SM28> 8/20/92 PN Call InstallSndPrimitives at boot time
; <SM27> 7/13/92 CCH Don't call the _VM trap unless it's implemented.
; <SM26> 6/30/92 PN Adding init routines to set up CommToolbox in SuperMario
; <SM25> 6/30/92 JSM InstallSpeedScrollGlob is now InitScrollSpeedGlobals.
; <SM24> 6/26/92 FM Remove call to resource manager install proc since all it does
; is unimplement the AddReference and RmvReference traps. We can
; do that in DispTable.a.o
; <SM23> 6/25/92 PN Move InitFasterInvals into StartInit.a
; <SM22> 6/12/92 PN Roll in patchIIciROM.a. Check for PowerBook140 and set the
; boxflag is moved to StartInit.a.
; <SM21> 6/11/92 PN Roll in patchIIciROM.a installing vector for the "FPU not
; installed" dialog box if we don't have FPU. Install optimized
; package4 and package5. Check and put in the correct boxflag for
; PowerBook140.
; <SM20> 6/10/92 JSM InstallDilogGlobals is now InitDialogMgrGlobals.
; <SM19> 5/16/92 kc Remove call to ADBMouseInit. This patch is already rolled
; inline.
; <SM18> 5/6/92 TN Initialize the Notification Manager here instead of from an
; InstallProc.
; <SM17> 4/27/92 PN Put VMSecondaryInitialization and add a routine to init global
; memory for scrollspeedfix
; <SM16> 4/22/92 PN Roll in hasSoftPowerOff and GestaltColorQuickDrawFeatures into
; GestaltFunctions and remove these routines from InstallMgr. Also
; FontMgr Gestalt moves to GestaltFunction.a
; <SM15> 4/16/92 PN Adding TrueType initialized call (SplineCall) to the start code
; <SM14> 4/14/92 kc Add call to BTreeInstall.
; <SM13> 4/8/92 RLM add call to init DialogMgrGlobals
; <SM12> 3/31/92 PN Adding Init routines for ComponentMgr and TextServiceMgr
; <SM11> 3/24/92 PN Remove SoundMgr initialization stuff and adding
; ProcessMgrSegmentTweak
; <SM10> 3/11/92 PN Adding MiscPatches into the InstallMgr
; <SM9> 3/10/92 PN Adding call to initialize soundmgr
; <SM8> 3/6/92 PN Taking out HFSInit and BTReeinstall
; <SM7> 3/4/92 PN Putting InstallMgr back in
; <SM6> 3/3/92 kc Roll out all SuperMario changes and move them into StartInit.a.
; <SM5> 2/19/92 RLM move installs
; <SM4> 2/13/92 PN Add InstallMgr.
; <SM3> 2/13/92 RLM Add NotificationMgrPatch roll-ins
; <SM2> 2/12/92 RLM InstallProc roll-in from SCSILinkPatch.a.
; ¥ Pre-SuperMario Comments Follow ¥
; <8> 1/20/92 PN Roll-in linkedpatches into MenuMgr.a
; <7> 1/7/92 PN Call AliasMgr installation routines
; <6> 10/1/91 JSM DonÕt use hasADB conditional, all future ROMs will support ADB.
; <5> 9/27/91 JSM DonÕt use hasCQD conditional, all future ROMs will have color
; QuickDraw.
; <4> 9/16/91 JSM Cleanup header.
; <3> 6/12/91 LN removed #include 'HardwareEqu.a'
; <2> 1/11/90 CCH Added include of ÒHardwarePrivateEqu.aÓ.
; <2.1> 9/18/89 djw Changed secondary_init from a trap to a subroutine call
; <2.0> 8/22/89 SES Removed references to nFiles. Changed include DeclRomEqu.a to
; RomEqu.a. Changed include xFixMath.a to FixMath.a and added equ
; so that _FracMul will use trap instead of jsr. Changed
; sRsrc_BootRec & sRsrc_Flags to sRsrcBootRec & sRsrcFlags.
; <1.9> 6/29/89 GGD Added BigJSR to InitADBDrvr to fix link problems as we expand.
; <1.8> 6/14/89 SWC Fixed a bug in LoadOne: I wasn't shifty enough...
; <1.7> 6/10/89 SWC Changed INIT loading so if a ROM-based version exists, it will
; be used instead of the disk version, unless there is a ROM
; override.
; <1.6> 5/24/89 GGD Converted to feature based conditionals.
; <1.5> 4/10/89 gmr Changed ReBoot to not call eject if the boot drive was not
; ejectable (DIP=08), and after calling eject, if the drive was
; not ejectable (DIP=$48), clear the BootMask bit for the drive
; (e.g. on RAM disks) so we won't keep trying to boot off them.
; <1.4> 4/3/89 MSH Fixed ShowStartScreen for HcMac.
; <1.3> 2/20/89 djw Added call to _SecondaryInit after patches are loaded.
; <1.2> 11/17/88 GGD Moved file system initialization code from StartBoot into TFS.a
; <1.1> 11/10/88 CCH Fixed Header.
; <1.0> 11/9/88 CCH Adding to EASE.
; <¥1.4> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles
; <1.3> 9/10/88 rwh Make relative System heap sizing use BufPtr for ALL machines so
; that
; <1.2> 6/15/88 MSH CompSysHeap uses BufPtr instead of MemTop, if HcMac.
; <1.1> 6/7/88 MSH Converted to using Mac ][ boot screen code for HcMac.
; <1.0> 2/10/88 BBM Adding file for the first time into EASEÉ
; <C932> 11/5/87 EMT Roll in S161 - preserve high bit of SPVolCtl.
; <C914> 10/29/87 rwh Port to Modern Victorian (on MvMac)
; <C874> 9/2/87 MSH Port to HcMac (Laguna)
; <PB131> 6/2/87 JTC Roll in fix to detach DSAT=2 after loading, as defense against
; subsequent switch-launches.
; <C840> 2/20/87 EHB When drawing to new grafPort, get proper bounds
; <C793> 2/11/87 JTC Use _InitApplZone as well as _SetApplBase in _InitLoop, to get
; full advantage of the initialization attendant thereto.
; <C785> 2/10/87 GWN Preserve the spsPointer field.
; <C741> 2/2/87 JTC Cleanups after yet another code review.
; <C720> 1/29/87 GWN Cleared spExtDev field where neccessary.
; <C681> 1/26/87 JTC Clean up after StartSearch (really SCSILoad) splits the sys/app
; zones into 2 pieces. Just reset the globals and go...
; <C692> 1/25/87 GWN Changed sType to 8-bytes.
; <C682> 1/24/87 WRL Allow a PICT 0 resource in the StartupScreen file. This allows
; the startup screen to take up a lot less space, and it allows
; for color startup screens.
; <C641> 1/15/87 GWN Get seOSType and seReserved from PRAM.
; <C592> 1/5/87 GWN Added code to erase happy Mac (Need to add a test to see if
; necessary).
; <C587> 1/4/87 JTC Tricky changes for dynamic system heap sizing. See related
; comment atop StartInit.a.
; <C565> 12/22/86 RDC Hack system heap code to ensure 96K heap for NuMac
; <C534> 12/14/86 GWN Fixed another bug in OpenSlots.
; <C525> 12/14/86 GWN Zapped a bug.
; <C470> 11/30/86 EHB Clear flag so devices will get initialized from resource file.
; <C457> 11/23/86 EHB Added call to initialize GrafDevices for all video cards.
; <C469> 11/21/86 GWN Modified code to Open all slot drivers: A slot driver will not
; be loaded if the fOpenAtStart sResource flag is clear (Default
; setting, if no flag register is present, is yes).
; <C452> 11/21/86 GWN Added code to Open all slot drivers.
; <A403> 11/11/86 WRL Fix to handle old HD20 drivers which pretended hard disks were
; ejectable. This caused them to be retried forever if the System
; file isn't present.
; <A286> 10/28/86 WRL Put in a check to make sure proposed system heap size is
; reasonable.
; <A271> 10/27/86 BB Changed switcher table set up for WDCBs and PMSP to use use long
; addresses.
; <C277> 10/27/86 SMH Changed the mouse tracking init code in Startinit.a,
; startboot.a, CCrsrCore.a and CrsrCore.a for Time Averageing
; <C218> 10/14/86 SMH Changed the mouse tracking init code in Startinit.a, startboot.a
; and kbd.a
; <C206> 10/9/86 bbm Modified to mpw aincludes.
; <C152> 9/13/86 WRL Major cleanup after code review. Modified boot block version
; paradigm to allow for relative system heap sizes. Removed
; InitDrvr subroutine - it is now called from kbd.a as
; InitADBDrvr. We now unmount the boot volume if we discover that
; it has no system file. Replaced search for boot device with code
; in StartSearch.
; <C108> 8/6/86 WRL Aladdin wants a 96k system heap as well. Removed load of "ADBS"
; resources for NuMac - new ADB not in yet.
; <C104> 8/4/86 WRL CSL Added temporary fix for loading "ADBS" resources
; <C56> 7/1/86 WRL [NuMac] Increased system heap to 96k. Removed old check for 128k
; machine.
; <C46> 6/16/86 WRL Changed label NoDir to @NoDir so as not to conflict with Slot
; equates. Changed JSR InitCache to BigJsr.
; 1/20/86 ELR Added ROM75Fix bug patches: (1) set up BootDrive before
; prefixing to StartUp App folder; (2) don't skip OpenWD if folder
; is the root - the File System should return a VRefNum anyways,
; and the SetVol is needed to find a file in the root if current
; prefix is to a folder.
;
BLANKS ON
STRING ASIS
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'HardwarePrivateEqu.a'
FixMathNonPortable EQU 1
INCLUDE 'FixMath.a'
INCLUDE 'SlotMgrEqu.a'
INCLUDE 'ROMEqu.a'
INCLUDE 'ColorEqu.a'
INCLUDE 'Aliases.a'
INCLUDE 'DisplaysPriv.a'
INCLUDE 'GestaltEqu.a'
INCLUDE 'AtalkPrivateEQU.a' ; <SM34>
INCLUDE 'UniversalEqu.a' ; <SM33>
INCLUDE 'EDiskEqu.a' ; <SM33>
INCLUDE 'MMUEqu.a' ; <SM36>
INCLUDE 'BootEqu.a' ; <SM36>
PRINT ON
MACHINE MC68020 ; <SM33>
MyIOPBA6 EQU -$400 ; A6 offset for IO parameter block
MyPortA6 EQU -$200 ; A6 offset for port
MyOwnBufA6 EQU $400 ; A6 offset for OwnBuf
MyScrnImA6 EQU $800 ; A6 offset for screen image
DIP EQU -3 ; DiskInPlace offset in DQE
VMGlobals EQU $0B78 ; VMGlobals [V0 constant] <SM49>
;---------------------------------------------------
; IMPORTs
;---------------------------------------------------
IMPORT FindStartupDevice ; StartSearch.a <SM49>
IMPORT AddVidDevice
IMPORT OpenSDrvr
IMPORT ADDFONTSTOCHAIN ; <SM15>
IMPORT AfterBootSetApplBase ; MemMgrBoot.a
IMPORT ALIASMGRINSTALL ;
IMPORT CacheInstall ; DiskCache.a
IMPORT ClearSysErrorUpdateRect ;
IMPORT __InitComponentManager
IMPORT ExtBTreeInstall ;
IMPORT HelpMgrInstall ;
IMPORT InitDialogMgrGlobals ;
IMPORT InitScrollSpeedGlobals ;
IMPORT InitSystemMenuList ;
IMPORT InitValidateMenuBarSemaphore ;
IMPORT MiscPatchesInstall ;
IMPORT NewGestaltSelectors ;
IMPORT NMINIT ;
IMPORT PPCINSTALL ;
IMPORT SetupGestalt ;
IMPORT SetupGlobals ;
IMPORT ShutInit ; ShutdownMgr.a
IMPORT SlotMgrSecondaryInitializationIIci
IMPORT TSMgrInstall ; TSMDispatch.a (Text Services Manager)
IMPORT LateLoad ; SCSILateLoad.a
IMPORT MakeIconData
IMPORT DavesRandomVideoStuff
IMPORT InitADBDrvr
BootMe PROC EXPORT
EXPORT InitSys7Toolbox
EXPORT OpenSlots
BSR FindStartupDevice ; Find the startup device & load boot blocks.
; (see StartSearch.a)
; SCSI people mess with the zones. Reunify the sys and app zones for
; possible expansion. Code borrowed from StartInit.
@foundBootDisk ; <SM33>
MOVE.L SysZone,A0 ; get the REAL zone
MOVE.L A0,TheZone ; make it THE REAL zone
MOVE.L A0,ApplZone ; good-bye to the app zone
MOVE.L bkLim(A0),HeapEnd ; one last pertinent global
;------------------------------------------------------------------------------------------------
; A5 = points to "A5 world" data, the first long of which is a pointer to QuickDraw globals.
; A6 = points to the boot blocks, which have been read from the Startup Device.
; SP = I/O parameter block = -$400(A6).
;------------------------------------------------------------------------------------------------
TheBoot
;------------------------------------------------------------------------------------------------
; Install vector for the ÒFPU not installedÓ dialog box if we donÕt have an
; FPU or an MMU.
IF 0 THEN ; <SM48>
move.l #gestaltFPUType,d0 ; do we have an FPU ? <SM21>
_Gestalt
cmp.w #gestaltNoFPU,a0 ; if this has FPU, then we skip <SM21>
bne.s @hasFPU ; ..the installation of this patch <SM21>
lea NewFLineRoutine,a0 ; get the address of our F-Line routine into A0 <SM21>
move.l A0,Line1111 ; Make F-traps come to us first <SM21>
@hasFPU
ENDIF
BSR OptimizePACKs ; Optimize Pack4 and Pack5 <SM21>
;------------------------------------------------------------------------------------------------
; check for executable boot blocks
;------------------------------------------------------------------------------------------------
MyExecMask EQU BBNewMask+BBExecMask
MOVE.B BBVersion(A6),D1 ; Get high byte of bb version number
CMP.B #BBOldExecVers,D1 ; Are these old executable boot blocks?
BEQ.S @ExecBB ; If so, execute them
AND.B #MyExecMask,D1 ; Only check New and Exec bits
CMP.B #MyExecMask,D1 ; Are these new executable boot blocks?
BNE.S @NoExec ; If not, don't execute them
@ExecBB BSR MessWithZones
LEA MyIOPBA6(A6),A0 ; point to parameter block <SM30>
MOVE.L A0,D7 ; set it where Boot blocks want it <SM30>
JSR BBEntry(A6) ; Execute the boot blocks
@NoExec
;------------------------------------------------------------------------------------------------
; reboot if the boot blocks fail
;------------------------------------------------------------------------------------------------
ReBoot move.w BootDrive,D3 ; Get current boot drive number
move.w BtDskRfN,d1 ; Get current drive ref num
bsr getDiskInPlace ; Get DiskInPlace for the boot drive
cmpi.b #8,d0 ; are we ejectable?
beq.s @DisableNextTime ; No, don't do eject
move.b d0,-(sp) ; save it
LEA MyIOPBA6(A6),A0 ; use stack parameter block
MOVE.W BtDskRfN,IORefNum(A0) ; driver refnum
MOVE.W #EjectCode,CSCode(A0)
MOVE.W D3,IODrvNum(A0) ; d3 = BootDrive, must be a drive# here!
_Control ; eject the bad diskette
move.b (sp)+,d0 ; restore DiskInPlace byte
tst -$3f0(a6)
bne.b @DisableNextTime
cmpi.b #8,d0 ; were we ejectable?
bge @DisableNextTime ; no, don't boot from this drive again
@DisableNextTime
MOVE.W BootMask,D0
BCLR D3,D0
MOVE.W D0,BootMask
@1
IF HasNetBoot THEN ; <SM34>
lea MyIOPBA6(a6),a0 ; use stack parameter block
move #-(49+1),ioRefNum(a0) ; refnum of the netBoot driver
_Close ; close that puppy
moveq.l #-1, d0 ; a register to clear lomem with
move.l d0,AGBHandle ; clear the appletalk dispatch vector
move.l d0,AtalkHk2 ; clear the LapManager hook
ENDIF ; <SM34>
bra BootMe ; time to try again <SM37>
MessWithZones
MoveM.L D0/A0-A1, -(A7)
Move.L (ApplZone), D0
Cmp.L (SysZone), D0
BEQ.B (* + $4)
_InitApplZone
MoveA.L (SysZone), A0
AddA.L #$A00000, A0
MoveA.L A7, A1
SubA.L (DefltStack), A1
SubA.L #$40000, A1
SubA.L #$64000, A1
CmpA.L A0, A1
BHI.B (* + $4)
MoveA.L A1, A0
_SetApplBase
MoveA.L (SysZone), A0
Move.L A0, (ApplZone)
Move.L A0, (TheZone)
Move.L (A0), (HeapEnd)
MoveA.L A7, A0
SubA.L (DefltStack), A0
SubA.L #$40000, A0
_SetApplLimit
MoveM.L (A7)+, D0/A0-A1
Rts
;________________________________________________________________________________________________
IF 0 THEN ; <SM49> <SM49>
IMPORT IRQException ;
NewFLineRoutine
cmp.w #$002C,6(sp) ;make sure that this is our stack frame. If not <SM21>
bne.s OldFLineRoutine ;..then jump thru the old exception vector <SM21>
MOVEM.L A0/D0,-(SP) ; Save these two registers <SM21>
move.l 8+2(sp),a0 ;get the address of the instruction word that caused <SM21>
move.w (a0),d0 ;..this exception. Then copy the word into DO <SM21>
and.w #%0000111000000000,d0 ;get just the co-processor ID from the instruction <SM21>
cmp.w #%0000001000000000,d0 ;if itÕs not one, then it isnÕt a FPU instruction <SM21>
bne.s stackError ;..so return thru the old FPU replacement routine <SM21>
lea continue,a0 ;change the saved return address to our continuation <SM21>
move.l a0,8+2(sp) ;..point and return out of exception mode. <SM21>
MOVEM.L (SP)+,A0/D0 ; Restore the regs <SM21>
rte
continue move.w #dsNoFPU,d0 ;this displays the dialog that lets the user <SM21>
_SysError ;..return to the finder (FPU type) <SM20>
stackError MOVEM.L (SP)+,A0/D0 ; Restore the regs <SM21>
OldFLineRoutine
lea IRQException,a1 ; <SM21>
jmp -6(a1) ;jump back to Line1111 <SM21>
ENDIF
;____________________________________________________________________________
; SANE Package Optimization
;
; Optimize the SANE packages which are ROM Resources, by having the dispatch
; table entry point right to the first instruction of the package, instead
; of going through the Package Manager which finds the package by de-referencing
; a handle.
;
OptimizePACKs
lea @PackOptTable,a3 ; point to the optimization table <SM21>
@optLoop move.w (a3)+,d0 ; get the package number <SM21>
bmi.s @done ; exit at end of list <SM21>
move.w d0,-(sp) ; push the package number <SM21>
_InitPack ; get the ROM resource, update AppPacks table <SM21>
move.w (a3)+,d1 ; get the trap word <SM21>
move.w (a3)+,a0 ; get the low mem address <SM21>
move.l (a0),d0 ; get the handle <SM21>
beq.s @optLoop ; if null, skip it <SM21>
movea.l d0,a0 ; setup to de-reference it <SM21>
move.l (a0),d0 ; get a pointer to the routine <SM21>
beq.s @optLoop ; if null, skip it <SM21>
movea.l d0,a0 ; setup pointer to code <SM21>
cmpi.b #$60,(a0) ; see if first instruction is a BRA.S <SM21>
bne.s @branchOptDone ; if not, don't optimize it <SM21>
move.w (a0)+,d0 ; get the BRA.S instruction <SM21>
ext.w d0 ; extend the branch displacement <SM21>
adda.w d0,a0 ; update the entry point address <SM21>
@branchOptDone
move.w d1,d0 ; setup the trap word <SM21>
_SetTrapAddress ; go directly to the first instr of the package <SM21>
bra.s @optLoop ; optimize the next package <SM21>
@PackOptTable
dc.w 4 ; package number 4 <SM21>
_FP68K ; trap name for PACK 4 <SM21>
dc.w AppPacks+4*4 ; low mem address of handle to PACK 4 <SM21>
dc.w 5 ; package number 5 <SM21>
_Elems68K ; trap name for PACK 5 <SM21>
dc.w AppPacks+5*4 ; low mem address of handle to PACK 5 <SM21>
dc.w -1 ; package number -1, end of list <SM21>
@done
rts
;________________________________________________________________________________________________
; Routine: getDiskInPlace
; Inputs: D1.b = BtDskRfN, boot disk ref num
; D3.b = BootDrive - Boot Drive Number
;
; Outputs: D0.b = DiskInPlace byte if Drive Queue element is found
; = 0 if not found (shouldn't happen)
; Destroys: A0
; Calls: none
; Called by: ReBoot
;
; Function: Searches the drive queue for the Drive Queue Element
; associated with the boot drive, and returns the DiskInPlace byte
; if DQE was found, otherwise return 0
;________________________________________________________________________________________________
getDiskInPlace ; find the drive queue element
lea DrvQHdr+QHead-QLink,a0 ; get the drive queue head
@search move.l QLink(a0),d0 ; check next drive queue element
beq.s @done ; if drive queue is empty, assume ejectable
movea.l d0,a0 ; a0 := drive queue element
cmp.w DQDrive(a0),d3 ; check for a drive match
bne.s @search ; keep looking if not our drive
cmp.w DQRefNum(a0),d1 ; check for a drive queue ref num match
bne.s @search ; keep looking if not for our driver
move.b DIP(a0),d0 ; return the DiskInPlace byte
@done rts
;--------------------------------------------------------------------
; Open all slot drivers which request to be opened at Start time.
; Destroys no registers.
; Note: *** A0, A1, D3 & D4 must be preserved by OpenSDrvr,OpenBDrvrs and AddVidDevice.
;--------------------------------------------------------------------
OpenSlots
WITH spBlock, seBlock
MOVEM.L A0-A1/D0-D4,-(SP) ; Save registers
LEA -IOQElSize(SP),SP ; Allocate parameter block for device manager calls.
MOVE.L SP,A1
CLR.B IOPermssn(A1) ; r/w permissions
SUB #spBlockSize,SP ; Allocate parameter block for SDM calls.
MOVE.L SP,A0
CLR.B spSlot(A0) ; Start with slot #0.
CLR.B spExtDev(A0)
CLR.B D3 ; Start with sResource ID #0
; Search for next sResource and open the driver if the fOpenAtStart flag is set (or sRsrc_Flags are missing).
;REPEAT
@Repeat MOVE.B D3,spId(A0) ; Restore the sResource Id
_sNextsRsrc ; Find next sResource
BNE.S @Done ; Done if no more sResources
;
MOVE.B spId(A0),D3 ; Save the sResource id
MOVE.L spsPointer(A0),D4 ; Save the sPointer
MOVE.B #sRsrcFlags,spId(A0) ; Read the sResource flags
_sReadWord ; IF sRsrc_Flags are missing THEN
BNE.S @10 ; default = flag is set, Open the drvr
MOVE.W spResult+2(A0),D0
BTST.L #fOpenAtStart,D0 ; IF fOpenAtStart flag is not set THEN
BEQ.S @Repeat ; do not open the driver
@10 MOVE.B #sRsrcBootRec,spId(A0)
_sFindStruct ; IF there is no sBoot Record THEN
BNE.S @20 ; Branch
; ELSE
MOVE.B D3,spId(A0) ; Restore the sResource Id
MOVE.L D4,spsPointer(A0) ; Restore the sPointer
BSR OpenBDrvrs ; Open all drivers for this device
BRA.S @Repeat ; continue with loop
@20 MOVE.B D3,spId(A0) ; Restore the sResource Id
BSR OpensDrvr ; Try to open the driver
BNE.S @Repeat ; If error THEN it can't be opened
; If it is a video card, then install into device chain
CMP.L #(CatDisplay<<16)++TypVideo,spCategory(A0) ; Check for proper <Category><Type>
BNE.S @Repeat ; continue loop if not
CMP.W #DrSWApple,spDrvrSW(A0) ; Check for an Apple driver interface
BNE.S @Repeat ; =>no, not a video card
BSR AddVidDevice ; else add video device to device list
@Until BRA.S @Repeat ;UNTIL (no more sResources)
@Done LEA IOQElSize+spBlockSize(SP),SP ;Deallocate parameter blocks.
;-------------------------------------
; Clear flag so InitGraf will load screen configuration from system file
; (Flag was set in InitVidDeflt to avoid initialization before all devices open)
;-------------------------------------
MOVE.L DeviceList,A0 ;get first device in list
MOVE.L (A0),A0 ;point to this device
BCLR #AllInit,GDFlags(A0) ;say devices not initialized
MOVEM.L (SP)+,A0-A1/D0-D4 ;Restore registers
RTS
;------------------------------------------------------------------------------------------------
; PROCEDURE:OpenBDrvrs
; Execute sBoot code to load in all drivers for this hw device
; A0 -> Pointer to SDM parameter block.
; Destroys no registers
; Called by : OpenSlots.
;------------------------------------------------------------------------------------------------
OpenBDrvrs MOVE.B spSlot(A0),-(SP) ;Save slot
MOVE.B spId(A0),-(SP) ;Save Id
MOVEM.L D0-D3/A0-A1,-(SP) ;Save registers.
SUB #seBlockSize,SP ;Allocate parameter block for code executed by _sExec.
MOVE.L SP,A1
MOVE.L A1,spsExecPBlk(A0) ;Save pointer to se parameter block.
; Get the default OS of Startup Device (Use the same OS type to load the drivers)
MOVE.L A0,D3 ;Save A0
SUBQ.L #2,SP ;Make room for parameters
MOVE.L SP,A0 ;Point to the parameter block
_GetOSDefault ;Get info about the default device
MOVE.W (SP)+,D2 ;D2 <- <Reserved><OSType>
MOVE.L D3,A0 ;Restore A0
; Set the parameters for the code in sExec.
MOVE.B spSlot(A0),seSlot(A1) ;Slot,
MOVE.B spId(A0),sesRsrcId(A1) ;sResource.
CLR.B sePartition(A1) ;Partition,
CLR.B seDevice(A1) ;Device, and
MOVE.B D2,seOSType(A1) ;Default OS
LSR.L #8,D2
MOVE.B D2,seReserved(A1) ;Reserved field
MOVE.B #sbState1,seBootState(A1) ;State of StartBoot code.
; Execute the code in the sBoot record.
MOVE.B #sRsrcBootRec,spId(A0) ;Execute the code:
_sExec ; On entry to the boot code, A0 points to the SE parameter block.
; Exit.
ADD #seBlockSize,SP ;De-Allocate SE parameter block.
MOVEM.L (SP)+,D0-D3/A0-A1 ;Restore registers.
MOVE.B (SP)+,spId(A0) ;Restore Id
MOVE.B (SP)+,spSlot(A0) ;Restore slot
RTS
;______________________________________________________________________________________
; All the 7.0 managers are installed here, the Gibbly calls us via a ROM vector at
; the start or the ROM.
;
; Sure would have been nice if each of these generic routines were commented when
; they were added.... (Sigh) Rewrote most of this code today <SM49>. <SAM>
;
;______________________________________________________________________________________
InitSys7Toolbox
RTS
ENDP
IF 0 THEN
;------------------------------------------------------------------------------------------
; CheckPassword; <SM46> rb, start
;
; Here we will check to see if the machine is password protected, and if so, display
; a dialog to enter the password. Three strikes and we shut down.
;
; Input: nothing
; Output: nothing
;------------------------------------------------------------------------------------------
CheckPassword PROC EXPORT
MyStack RECORD 0,DECREMENT
DialogRect DS.W 4
ItemRect DS.W 4
NewPass DS.B 8
PRAMPass DS.B 8
PassLength DS.B 1
myFiller DS.B 1
myTimer DS.L 1
MyFrameSize EQU *
ENDR
WITH MyStack
Link A6,#MyFrameSize ; Stack frame.
Movem.l D0-D7/A0-A5,-(Sp) ; Save everyone.
Lea @LockFunction,A0 ; Function pointer.
Move.l #'lock',D0 ; Selector code.
_NewGestalt ; Install it.
Lea PassLength(A6),A0
Move.l #$00010045,D0 ; Get #, addr PRAM bytes.
_ReadXPram ; Read password checksum.
Move.b (A0),D3 ; Is there a password?
Beq @ExitCheck ; No? Then done.
Btst #3,D3 ; Disabled?
Bne @ExitCheck ; Yes? Then leave.
And.b #$F,(A0) ; Just save length.
Addq.b #1,(A0) ; Make one based.
Lea PRAMPass(A6),A0 ; PRAM password.
Move.l #$00040004,D0 ; Get #, addr PRAM bytes.
_ReadXPram ; Read password.
Lea 4(A0),A0 ; PRAM password.
Move.l #$000300AB,D0 ; Get #, addr PRAM bytes.
_ReadXPram ; Read password.
Lea 3(A0),A0 ; PRAM password.
Move.l #$000100BC,D0 ; Get #, addr PRAM bytes.
_ReadXPram ; Read password.
Subq.w #7,A0 ; Start of password.
Moveq #7,D0 ; Loop.
@DecryptLoop Eor.b D3,(A0,D0.w) ; Decrypt password.
Dbra D0,@DecryptLoop ; Loop till done.
Moveq #0,D0 ; Init register.
Move.b PassLength(A6),D0 ; Length of password.
Subq.w #1,D0 ; For looping.
Moveq #0,D1 ; Odd parity.
Moveq #0,D2 ; Even parity.
@ParityLoop Move.b (A0)+,D4 ; Byte.
Moveq #7,D5 ; Loop.
Moveq #0,D6 ; Counter.
@0 Rol.b #1,D4 ; Check bit.
Bcc.s @Next ; Not set? Then continue.
Addq.w #1,D6 ; Bump counter.
@Next Dbra D5,@0 ; Loop till done with byte.
Ror.b #1,D6 ; Check for even or odd.
Bcs.s @Odd ; Set? Then odd.
Addq.w #1,D2 ; Bump even.
Bra.s @1
@Odd Addq.w #1,D1 ; Bump odd.
@1 Dbra D0,@ParityLoop ; Do next byte.
Asr.b #4,D3 ; Parity in low 4 bits.
And.b #$F,D3
Lsl.b #2,D1 ; Move odd parity up 2.
And.b #3,D2 ; Strip extra even parity bits.
Or.b D2,D1 ; Or together.
And.b #$F,D1 ; Strip extras.
Cmp.b D1,D3 ; Match?
Bne @ExitCheck ; No? Then leave.
Move.l (A5),A3 ; Quickdraw globals.
Lea screenBits(A3),A0 ; Port bitmap.
Lea DialogRect(A6),A2 ; The rect.
Move.w bounds+bottom(A0),D1 ; Center it.
Move.w DRect+bottom,D0
Sub.w DRect+top,D0
Sub.w D0,D1
Asr.w #1,D1
Move.w D1,top(A2)
Add.w D0,D1
Move.w D1,bottom(A2)
Move.w bounds+right(A0),D1
Move.w DRect+right,D0
Sub.w DRect+left,D0
Sub.w D0,D1
Asr.w #1,D1
Move.w D1,left(A2)
Add.w D0,D1
Move.w D1,right(A2)
Move.l A2,-(Sp)
_EraseRect
Move.l A2,-(Sp)
_FrameRect
Addq.w #3,top(A2)
Addq.w #3,left(A2)
Subq.w #3,bottom(A2)
Subq.w #3,right(A2)
Move.l A2,-(Sp)
_FrameRect
Addq.w #1,top(A2)
Addq.w #1,left(A2)
Subq.w #1,bottom(A2)
Subq.w #1,right(A2)
Move.l A2,-(Sp)
_FrameRect
Lea ItemRect(A6),A4 ; Item rect.
Lea ItemList,A2 ; Dialog items.
Move.w (A2)+,D7 ; Loop counter.
@ItemLoop Move.l DialogRect(A6),top(A4)
Move.l DialogRect(A6),bottom(A4)
Tst.l (A2)+ ; Ignore handle.
Move.w (A2)+,D0
Add.w D0,top(A4) ; Set rect.
Move.w (A2)+,D0
Add.w D0,left(A4)
Move.w (A2)+,D0
Add.w D0,bottom(A4)
Move.w (A2)+,D0
Add.w D0,right(A4)
Cmp.b #editText,(A2)+ ; Edit item?
Beq.s @DrawEdit ; Yes? Then draw it.
Tst.b (A2)+ ; Skip length.
Move.l A4,-(Sp) ; Rect.
Tst.l -(Sp) ; Room for resource handle.
Move.w (A2)+,-(Sp) ; Resource ID.
_GetIcon ; Load icon.
_PlotIcon
Bra.s @NextItem
@DrawEdit Move.l A4,-(Sp) ; Rect.
_FrameRect ; Frame it.
Tst.b (A2)+
@NextItem Dbra D7,@ItemLoop
Move.l Ticks,myTimer(A6) ; Init timeout value.
Add.l #5*60*60,myTimer(A6) ; Timeout after five minutes.
Moveq #2,D5 ; Number of retries (-1).
Moveq #0,D7 ; Last key hit.
@RetryLoop Moveq #0,D6 ; Number of keys.
Lea NewPass(A6),A3 ; Start of password.
Lea ItemRect(A6),A0 ; Item rect.
Move.l DialogRect(A6),top(A0)
Move.l DialogRect(A6),bottom(A0)
Move.w EditRect+top,D0
Addq.w #6,D0
Add.w D0,top(A0)
Addq.w #5,D0
Add.w D0,bottom(A0)
Move.w EditRect+left,D0
Addq.w #4,D0
Add.w D0,left(A0)
Addq.w #5,D0
Add.w D0,right(A0)
@CharLoop Lea KeyMap,A2 ; Pointer to key map.
Moveq #0,D0 ; Starting offset.
Moveq #2,D1 ; Loop.
Bclr #31,D7 ; Keyup flag.
@KeyLoop Moveq #31,D4 ; Bits to check.
Move.l (A2)+,D2 ; Keys.
@BitLoop Rol.l #1,D2 ; Check bit.
Bcc @NextBit ; 0? Then check next bit.
Lea ShiftMap,A1 ; Shift key map.
Btst #0,KeyMap+7 ; Shift key down?
Bne.s @CheckKey ; Yes? Then we have the right char.
Lea CapsMap,A1 ; Capsdown key map.
Btst #1,keyMap+7 ; Caps lock?
Bne.s @CheckKey ; Yes? Then we have the right char.
Lea LowerMap,A1 ; Must be lowercase map.
@CheckKey Move.b 0(A1,D0),D3 ; The character.
Ble.s @NextBit ; Yes? Then check next one.
Bset #31,D7 ; Set keydown flag.
Cmp.b D3,D7 ; Same as last key?
Beq.s @CharLoop ; Yes? Then start scanning again.
Move.b D3,D7 ; Set last char.
Cmp.b #$0D,D3 ; Return or Enter?
Beq @CheckPass ; Yes? Then check password.
Cmp.b #$1B,D3 ; Escape?
Beq @ShutDown ; Yes? Then shutdown.
Cmp.b #$08,D3 ; Backspace?
Bne.s @InstallChar ; No? Then use char.
Tst.w D6 ; Any chars entered?
Beq.s @NextBit ; No? Then continue.
Subq.w #1,D6 ; Decrement count.
Movem.l D0-D2,-(Sp) ; Save registers.
Lea ItemRect(A6),A0
Subq.w #6,left(A0)
Subq.w #6,right(A0)
Move.l A0,-(Sp)
_EraseRect
Movem.l (Sp)+,D0-D2 ; Restore registers.
Bra.s @NextBit ; Check next one.
@InstallChar Cmp.w #8,D6 ; Maxed out?
Beq.s @NextBit ; Yes? Then check next bit.
Move.b D3,0(A3,D6.w) ; Install char.
Addq.w #1,D6 ; Increment count.
Movem.l D0-D2,-(Sp) ; Save registers.
Pea ItemRect(A6)
Move.l (A5),A0 ; Quickdraw globals.
Pea black(A0) ; Use black as background
_FillOval ; Draw bullet.
Movem.l (Sp)+,D0-D2 ; Restore registers.
Lea ItemRect(A6),A0
Addq.w #6,left(A0)
Addq.w #6,right(A0)
Bra.s @CharLoop ; Start scanning again.
@NextBit Addq.w #1,D0 ; Next offset.
Dbra D4,@BitLoop ; Check next bit.
Dbra D1,@KeyLoop ; Next KeyMap long.
Move.l Ticks,D1 ; Current tick count.
Cmp.l myTimer(A6),D1 ; Timeout yet?
Bgt @ShutDown ; Yes? Then shutdown.
Tst.l D7 ; Key down?
Bmi.s @CharLoop ; Yes? Then loop.
Moveq #0,D7 ; No? Then reset last key.
Bra.s @CharLoop ; Keep looping.
@CheckPass Tst.w D6 ; Length 0?
Beq.s @ShutDown ; Yes? Then shutdown.
Cmp.b PassLength(A6),D6 ; Same length?
Bne.s @NextTry ; No? Then try again.
Lea PRAMPass(A6),A0 ; Saved password.
@CheckLoop Move.b (A3)+,D0 ; The character.
Cmp.b (A0)+,D0 ; Match?
Bne.s @NextTry ; No? Then retry.
Subq.w #1,D6 ; Decrement count.
Bne.s @CheckLoop ; Check next one.
Bra.s @Exit ; Done? Then we've passed.
@NextTry Lea ItemRect(A6),A0 ; Item rect.
Move.l DialogRect(A6),top(A0)
Move.l DialogRect(A6),bottom(A0)
Move.w EditRect+top,D0
Addq.w #2,D0
Add.w D0,top(A0)
Move.w EditRect+left,D0
Addq.w #2,D0
Add.w D0,left(A0)
Move.w EditRect+bottom,D0
Subq.w #2,D0
Add.w D0,bottom(A0)
Move.w EditRect+right,D0
Subq.w #2,D0
Add.w D0,right(A0)
Moveq #2,D3
@FlashLoop Pea ItemRect(A6)
_InverRect
Lea 6,A0
_Delay
Pea ItemRect(A6)
_InverRect
Lea 6,A0
_Delay
Dbra D3,@FlashLoop
Pea ItemRect(A6)
_EraseRect
Dbra D5,@RetryLoop ; Retry.
@ShutDown Move.w #1,-(SP)
_ShutDown
@Exit Lea DialogRect(A6),A2
Subq.w #4,top(A2)
Subq.w #4,left(A2)
Addq.w #4,bottom(A2)
Addq.w #4,right(A2)
Move.l A2,-(Sp) ; The rect.
Move.l (A5),A3 ; Quickdraw globals.
Pea gray(A3) ; Use gray as background
_FillRect ; Erase the rectangle to the desktop pattern
@ExitCheck Movem.l (Sp)+,D0-D7/A0-A5 ; Restore everybody.
Unlk A6
Rts
@LockFunction Move.l (Sp)+,4(SP) ; Return address.
Move.l (Sp)+,A0 ; VAR responce.
Move.l #'yep!',(A0) ; Set responce.
Move.w #noErr,4(Sp) ; Set OSErr to noErr.
Rts ; Return.
DRect Dc.w 0,0,50,124 ; Dialog rect.
ItemList Dc.w 1 ; Number of items - 1.
Dc.l 0 ; Place holder for handle.
EditRect Dc.w 13,53,29,108 ; EditText rect.
Dc.b editText ; Item type (edit text).
Dc.b 0 ; Item length & title.
Dc.l 0 ; Place holder for handle.
Dc.w 5,8,37,40 ; Icon rect.
Dc.b iconItem+itemDisable ; Item type (icon/disabled).
Dc.b 2,$72,$70 ; Item length, resource ID.
ModifierMap Dc.b $37,$38,$39,$3A,$3B,$00 ; Command,Shift,Caps,Option,Ctl.
CursorMap Dc.b $7B,$7C,$7D,$7E ; <,>,^,v
ShiftMap Dc.b 'X','Z','G','H','F','D','S','A' ; 00
Dc.b 'R','E','W','Q','B',$00,'V','C' ; 08
Dc.b '%','^','$','#','@','!','T','Y' ; 10
Dc.b 'O','}',')','*','_','&','(','+' ; 18
Dc.b '"','J','L',$0D,'P','I','{','U' ; 20
Dc.b '>','M','N','?','<','|',':','K' ; 28
Dc.b $FF,$00,$1B,$00,$08,'~',' ',$00 ; 30
Dc.b $00,$00,$00,$00,$FF,$FF,$FF,$FF ; 38
Dc.b $00,$00,'+',$00,'*',$00,'.',$00 ; 40
Dc.b $00,'-',$00,$0D,'/',$00,$00,$00 ; 48
Dc.b '5','4','3','2','1','0',$00,$00 ; 50
Dc.b $00,$00,$00,'9','8',$00,'7','6' ; 58
CapsMap Dc.b 'X','Z','G','H','F','D','S','A' ; 00
Dc.b 'R','E','W','Q','B',$00,'V','C' ; 08
Dc.b '5','6','4','3','2','1','T','Y' ; 10
Dc.b 'O',']','0','8','-','7','9','=' ; 18
Dc.b $27,'J','L',$0D,'P','I','[','U' ; 20
Dc.b '.','M','N','/',',','\',';','K' ; 28
Dc.b $FF,$00,$1B,$00,$08,'`',' ',$00 ; 30
Dc.b $00,$00,$00,$00,$FF,$FF,$FF,$FF ; 38
Dc.b $00,$00,'+',$00,'*',$00,'.',$00 ; 40
Dc.b $00,'-',$00,$0D,'/',$00,$00,$00 ; 48
Dc.b '5','4','3','2','1','0',$00,$00 ; 50
Dc.b $00,$00,$00,'9','8',$00,'7','6' ; 58
LowerMap Dc.b 'x','z','g','h','f','d','s','a' ; 00
Dc.b 'r','e','w','q','b',$00,'v','c' ; 08
Dc.b '5','6','4','3','2','1','t','y' ; 10
Dc.b 'o',']','0','8','-','7','9','=' ; 18
Dc.b $27,'j','l',$0D,'p','i','[','u' ; 20
Dc.b '.','m','n','/',',','\',';','k' ; 28
Dc.b $FF,$00,$1B,$00,$08,'`',' ',$00 ; 30
Dc.b $00,$00,$00,$00,$FF,$FF,$FF,$FF ; 38
Dc.b $00,$00,'+',$00,'*',$00,'.',$00 ; 40
Dc.b $00,'-',$00,$0D,'/',$00,$00,$00 ; 48
Dc.b '5','4','3','2','1','0',$00,$00 ; 50
Dc.b $00,$00,$00,'9','8',$00,'7','6' ; 58
ENDP ; <SM46> rb, end
ENDIF
END