; ; 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): ; ; 1/28/94 chp Roll back which is no longer required. ; 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. ; 11/10/93 chp Disable LateLoad on TNT (for now). ; 11/7/93 SAM Roll in from mc900ftjesus. ; 11/6/93 SAM Removed . Eric beat me to it. VM pokes the level 4 irq ; handler into the supervisior vector table itself. ; 10/15/93 SAM Roll in from mc900ftjesus. ; 10/15/93 SAM For PDM. The DMA irq hander is now installed in the supervisor ; vector table when VM is on. ; 9/29/93 SAM From mc900ftjesus. ; 9/27/93 SAM Cosmetic changes. ; 9/26/93 pdw Removed extra OptimizePACKs. ; 9/2/93 IH Add Display Manager Install to boot process. ; 8/5/93 JDR integrate Component Mgr from Reality ; 8/4/93 JDR Integrate sound manager 3.0 project. ; 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. ; 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. ; 4/9/93 SAM Commented out the calls to init Bass (they've been moved to ; StartInit. (INSTALLBASSCOMMON and FORCEINITFONTSCALL) ; 3/25/93 RB Added Robert Polic's password-on-boot code from Ludwig. ; 2/13/93 PW Reenabled LateLoad for PDM. ; 2/6/93 RC Comment out LateLoad for PDM since the last change caused PDM to ; Hang on Boot ; 2/5/93 PN Adding scsiLateLoad into the end of InstallMgr ; 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. ; 12/16/92 SWC Moved InitEvents->OSEventMgr.a and CenterRect->StartBoot.a. ; Removed dead code. ; 12/3/92 PN Add AfterBootSetApplBase to the InstallMgr to patch out ; SetApplBase trap at Gibbly time ; 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. ; 11/23/92 RB Moved an LC930 conditional. ; 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. ; 11/18/92 RB Add a call to the Disk Cache installation routine from the ; InitManagers call. ; 11/5/92 RB Add a call to check the state of the extensions at the end of ; InstallMgr. ; 11/3/92 rab Horror ROM sync-up. Rolled CloseNetBootPatch from Horror ; StartInit.a into Reboot. ; 10/30/92 HY Add "Ginty" support to boot process. ; 10/28/92 PN Remove LoadProcessMgrSegmentLowerInSysHeap since it's been done ; in BootCode3.a and call the QDSecondaryInit. ; 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. ; 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. ; 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 ; 8/20/92 PN Call InstallSndPrimitives at boot time ; 7/13/92 CCH Don't call the _VM trap unless it's implemented. ; 6/30/92 PN Adding init routines to set up CommToolbox in SuperMario ; 6/30/92 JSM InstallSpeedScrollGlob is now InitScrollSpeedGlobals. ; 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 ; 6/25/92 PN Move InitFasterInvals into StartInit.a ; 6/12/92 PN Roll in patchIIciROM.a. Check for PowerBook140 and set the ; boxflag is moved to StartInit.a. ; 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. ; 6/10/92 JSM InstallDilogGlobals is now InitDialogMgrGlobals. ; 5/16/92 kc Remove call to ADBMouseInit. This patch is already rolled ; inline. ; 5/6/92 TN Initialize the Notification Manager here instead of from an ; InstallProc. ; 4/27/92 PN Put VMSecondaryInitialization and add a routine to init global ; memory for scrollspeedfix ; 4/22/92 PN Roll in hasSoftPowerOff and GestaltColorQuickDrawFeatures into ; GestaltFunctions and remove these routines from InstallMgr. Also ; FontMgr Gestalt moves to GestaltFunction.a ; 4/16/92 PN Adding TrueType initialized call (SplineCall) to the start code ; 4/14/92 kc Add call to BTreeInstall. ; 4/8/92 RLM add call to init DialogMgrGlobals ; 3/31/92 PN Adding Init routines for ComponentMgr and TextServiceMgr ; 3/24/92 PN Remove SoundMgr initialization stuff and adding ; ProcessMgrSegmentTweak ; 3/11/92 PN Adding MiscPatches into the InstallMgr ; 3/10/92 PN Adding call to initialize soundmgr ; 3/6/92 PN Taking out HFSInit and BTReeinstall ; 3/4/92 PN Putting InstallMgr back in ; 3/3/92 kc Roll out all SuperMario changes and move them into StartInit.a. ; 2/19/92 RLM move installs ; 2/13/92 PN Add InstallMgr. ; 2/13/92 RLM Add NotificationMgrPatch roll-ins ; 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É ; 11/5/87 EMT Roll in S161 - preserve high bit of SPVolCtl. ; 10/29/87 rwh Port to Modern Victorian (on MvMac) ; 9/2/87 MSH Port to HcMac (Laguna) ; 6/2/87 JTC Roll in fix to detach DSAT=2 after loading, as defense against ; subsequent switch-launches. ; 2/20/87 EHB When drawing to new grafPort, get proper bounds ; 2/11/87 JTC Use _InitApplZone as well as _SetApplBase in _InitLoop, to get ; full advantage of the initialization attendant thereto. ; 2/10/87 GWN Preserve the spsPointer field. ; 2/2/87 JTC Cleanups after yet another code review. ; 1/29/87 GWN Cleared spExtDev field where neccessary. ; 1/26/87 JTC Clean up after StartSearch (really SCSILoad) splits the sys/app ; zones into 2 pieces. Just reset the globals and go... ; 1/25/87 GWN Changed sType to 8-bytes. ; 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. ; 1/15/87 GWN Get seOSType and seReserved from PRAM. ; 1/5/87 GWN Added code to erase happy Mac (Need to add a test to see if ; necessary). ; 1/4/87 JTC Tricky changes for dynamic system heap sizing. See related ; comment atop StartInit.a. ; 12/22/86 RDC Hack system heap code to ensure 96K heap for NuMac ; 12/14/86 GWN Fixed another bug in OpenSlots. ; 12/14/86 GWN Zapped a bug. ; 11/30/86 EHB Clear flag so devices will get initialized from resource file. ; 11/23/86 EHB Added call to initialize GrafDevices for all video cards. ; 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). ; 11/21/86 GWN Added code to Open all slot drivers. ; 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. ; 10/28/86 WRL Put in a check to make sure proposed system heap size is ; reasonable. ; 10/27/86 BB Changed switcher table set up for WDCBs and PMSP to use use long ; addresses. ; 10/27/86 SMH Changed the mouse tracking init code in Startinit.a, ; startboot.a, CCrsrCore.a and CrsrCore.a for Time Averageing ; 10/14/86 SMH Changed the mouse tracking init code in Startinit.a, startboot.a ; and kbd.a ; 10/9/86 bbm Modified to mpw aincludes. ; 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. ; 8/6/86 WRL Aladdin wants a 96k system heap as well. Removed load of "ADBS" ; resources for NuMac - new ADB not in yet. ; 8/4/86 WRL CSL Added temporary fix for loading "ADBS" resources ; 7/1/86 WRL [NuMac] Increased system heap to 96k. Removed old check for 128k ; machine. ; 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' ; INCLUDE 'UniversalEqu.a' ; INCLUDE 'EDiskEqu.a' ; INCLUDE 'MMUEqu.a' ; INCLUDE 'BootEqu.a' ; PRINT ON MACHINE MC68020 ; 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] ;--------------------------------------------------- ; IMPORTs ;--------------------------------------------------- IMPORT FindStartupDevice ; StartSearch.a IMPORT AddVidDevice IMPORT OpenSDrvr IMPORT ADDFONTSTOCHAIN ; 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 ; 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 ; move.l #gestaltFPUType,d0 ; do we have an FPU ? _Gestalt cmp.w #gestaltNoFPU,a0 ; if this has FPU, then we skip bne.s @hasFPU ; ..the installation of this patch lea NewFLineRoutine,a0 ; get the address of our F-Line routine into A0 move.l A0,Line1111 ; Make F-traps come to us first @hasFPU ENDIF BSR OptimizePACKs ; Optimize Pack4 and Pack5 ;------------------------------------------------------------------------------------------------ ; 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 MOVE.L A0,D7 ; set it where Boot blocks want it 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 ; 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 ; bra BootMe ; time to try again 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 ; IMPORT IRQException ; NewFLineRoutine cmp.w #$002C,6(sp) ;make sure that this is our stack frame. If not bne.s OldFLineRoutine ;..then jump thru the old exception vector MOVEM.L A0/D0,-(SP) ; Save these two registers move.l 8+2(sp),a0 ;get the address of the instruction word that caused move.w (a0),d0 ;..this exception. Then copy the word into DO and.w #%0000111000000000,d0 ;get just the co-processor ID from the instruction cmp.w #%0000001000000000,d0 ;if itÕs not one, then it isnÕt a FPU instruction bne.s stackError ;..so return thru the old FPU replacement routine lea continue,a0 ;change the saved return address to our continuation move.l a0,8+2(sp) ;..point and return out of exception mode. MOVEM.L (SP)+,A0/D0 ; Restore the regs rte continue move.w #dsNoFPU,d0 ;this displays the dialog that lets the user _SysError ;..return to the finder (FPU type) stackError MOVEM.L (SP)+,A0/D0 ; Restore the regs OldFLineRoutine lea IRQException,a1 ; jmp -6(a1) ;jump back to Line1111 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 @optLoop move.w (a3)+,d0 ; get the package number bmi.s @done ; exit at end of list move.w d0,-(sp) ; push the package number _InitPack ; get the ROM resource, update AppPacks table move.w (a3)+,d1 ; get the trap word move.w (a3)+,a0 ; get the low mem address move.l (a0),d0 ; get the handle beq.s @optLoop ; if null, skip it movea.l d0,a0 ; setup to de-reference it move.l (a0),d0 ; get a pointer to the routine beq.s @optLoop ; if null, skip it movea.l d0,a0 ; setup pointer to code cmpi.b #$60,(a0) ; see if first instruction is a BRA.S bne.s @branchOptDone ; if not, don't optimize it move.w (a0)+,d0 ; get the BRA.S instruction ext.w d0 ; extend the branch displacement adda.w d0,a0 ; update the entry point address @branchOptDone move.w d1,d0 ; setup the trap word _SetTrapAddress ; go directly to the first instr of the package bra.s @optLoop ; optimize the next package @PackOptTable dc.w 4 ; package number 4 _FP68K ; trap name for PACK 4 dc.w AppPacks+4*4 ; low mem address of handle to PACK 4 dc.w 5 ; package number 5 _Elems68K ; trap name for PACK 5 dc.w AppPacks+5*4 ; low mem address of handle to PACK 5 dc.w -1 ; package number -1, end of list @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 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 <- 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 . ; ;______________________________________________________________________________________ InitSys7Toolbox RTS ENDP IF 0 THEN ;------------------------------------------------------------------------------------------ ; CheckPassword; 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 ; rb, end ENDIF END