mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
1055 lines
42 KiB
Plaintext
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
|