boot3/Patches/BeforePatches.a
Elliot Nunn 5b0f0cc134 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 10:02:57 +08:00

776 lines
32 KiB
Plaintext

;
; File: BeforePatches.a (formerly RomAllFix.a)
;
; Contains: patches and patch installation code for all ROMs.
;
; Copyright: © 1986-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 5/20/92 stb Change an include to :Internal:Decompression.a. I did this once
; before, but I donÕt know where it went.
; <26> 1/19/92 DTY Check if AppleTalk is inactive. If it is, set
; emAppleTalkInactiveOnBoot to true, to let other things later on
; in the boot process and the Chooser know that network code
; shouldnÕt be loaded.
; <25> 12/18/91 DTY Clear only the decompressPasswordBit in the memory attributes
; instead of the entire byte.
; <24> 10/15/91 DTY Set to twoDeepBit to cause one deep calls on the System file to
; look further down the chain for resources. DonÕt set the
; overrideNextMapBit (formerly the mapInsertedBit) for the System
; file.
; <23> 10/15/91 DTY Set the mapInsertedBit and dontCountOrIndexDuplicatesBit for the
; System file.
; <22> 9/18/91 JSM Cleanup header.
; <21> 7/3/91 JSM Remove obsolete conditionals and obsolete DSAT patch.
; <20> 6/12/91 LN Removed #includes for private interfaces from public interfaces.
; Changed #include 'HardwareEqu.a' to 'HardwarePrivateEqu.a'
; <19> 1/30/91 gbm sab, #38: Change the name of one of the decompressor header
; files (because Sheila said it was okay)
; <18> 10/30/90 dba Put code in here to set the bit on the system map so that dcmp
; resources will be loaded from it.
; <17> 7/11/90 gbm make changes trending to the elimination of assembler warnings
; <16> 6/14/90 JSM NEEDED FOR SIXPACK: Changed move.w of emRecSize to move.l. This
; doesn't really matter unless the ExpandMem block gets above 64K,
; which will never happen.
; <15> 5/29/90 DDG NEEDED FOR SIXPACK: Changed all the sixpack conditionals from
; six-point-oh-seven to six-point-oh-six.
; <14> 5/24/90 HJR NEEDED FOR SIXPACK: Fixed bug in ExpandMem where the system will
; create its own when the ROM's is larger.
; <13> 5/24/90 CCH Made eclipse the highest box flag supported on 6.0.6 and 6.1.
; (This should not be rolled into SixPac!)
; <12> 3/22/90 dba get rid of the DSAT 2 code for $700 since new boot code no
; longer exhibits this problem
; <11> 3/20/90 DDG Changed Sys607 to work on all machines thru Elsie.
; <10> 2/28/90 DD put proc and endp around the ADBInitPatch too.
; <9> 2/28/90 DD added proc and endP directives so we can use the BIND macros in
; DecompressPatch.a
; <8> 1/24/90 CV Adding checks to limit the CPUs supported by each system disc.
; System 6.0.5 will support CPUs through F-19. Sytem 6.0.6 will
; support CPUs through XO. System 6.1.0 will support CPUs through
; Erickson.
; <7> 1/22/90 CCH NEEDED FOR 6.0.5: Now gets the current size from any existing
; record, and points the expandMem global to the new record before
; disposing of the old one.
; <6> 1/19/90 PKE NEEDED FOR 6.0.5 AND Scripts604: install an ADBproc so that
; ADBReInit will set up the correct KCHR for use by KeyTrans.
; <5> 1/18/90 DD Changed a comment
; <4> 1/18/90 DD Moved DeCompressor patch in front of KeyTrans Patch so the
; conditional cutback will work.
; <3> 1/17/90 DD Added DeCompressor patch.
; <2> 1/4/90 PKE Updated conditionals so SS-6.0.4 changes go in 6.0.5 as well as
; 7.0. Updated header to BBS format.
; <1> 12/17/89 CCH Adding for the first time into BBS.
; (BBS versions above, EASE versions below)
; <1.9> 12/1/89 dba NEEDED FOR 6.0.5: changed conditionals left over from 6.0.4
; <1.8> 11/16/89 EMT Moved KeyTrans trap as well, since keyboard relies on it.
; <1.7> 11/16/89 EMT Moved keyboard initialization from ROM75Fix for FullWrite and
; MacroMaker.
; <1.6> 8/28/89 SMB NEEDED FOR 604 Scripts: Must increase ExpandMem for TE vectors
; for Mac Portable for 6.0.4 Script System Builds. Removed load of
; nEqu.d.
; <1.5> 8/11/89 dba NEEDED FOR 6.0.4: improved the check for Òtoo newÓ ROMs by
; checking ROM85 before looking at BoxFlag; left check in for 7.0
; on the assumption that there will be ROMs too new for us even
; then
; <1.4> 8/10/89 CCH NEEDED FOR 6.0.4: For 6.0.4 only, make sure we're running on a
; pre-F19 system and that we're in 24-bit mode.
; <1.3> 2/21/89 CCH Added check to see if expandMem has already been initialized
; before re-initializing it.
; <1.2> 2/20/89 JB (with DNF) Moved cache control trap (PP332), "not a Mac disk"
; ExtFSPatch (P003), and MapFBlock (S118,P005) to individual
; machine patch files. No longer here!
; <1.1> 1/16/89 CCH Merged 6.0.3 final sources into 7.0.
; 1/1/89 CCH Start using SysVers equate, and added conditionals for 6.0.4.
; <1.0> 11/16/88 CCH Added to EASE.
; (pre-EASE history below)
; <S518> 7/1/88 EKH Bumped the hex version number to v6.1, for the Altair release.
; <S507> 6/21/88 EKH Bumped the hex version number to v6.0.1, for the next release.
; <PPyyy> 1/8/88 EKH Bumped the hex version number to v6.0, to match the system disk
; version.
; <PP332> 12/14/87 JB Added cache control trap
; <PPyyy> 12/3/87 EKH Bumped the hex version number for v4.4 system (used by
; SysEnvirons calls).
; <PP296> 10/19/87 SHF Moved call to SCSILoad to each individual patch file (rom75fix,
; etc.).
; <PP282> 9/19/87 BB Modified ExtFS patch (S084 in BeforePatches.a) to release the
; AppleShare FCB following an unsuccessful Close call on an
; offline server volume.
; <PA254> 8/7/87 bbm bumped version number (SysVersNo) for new release.
; <PP227> 7/23/87 BB Fixed ExtFSPatch (S084) to properly set up stack befor calling
; an external FS.
; <PPyyy> 6/15/87 JTC Changes to make system A/UX-friendly.
;
; Above changes are post version 4.2
;
; <PP149> 3/28/87 JTC Jam system version number to its rightful home in SysVersion.
; <PP130> 3/24/87 JTC&SHF Avoid hitting HwCfgFlags on ROM69 machines when installing SCSI
; patch.
; <P005><S118> 3/19/87 BB Added patch to MapFBlock to fix error in the calculation of
; physical block numbers (adding a word value rather than a long
; word value).
; <P004><S089> 3/7/87 SHF Added call to SCSILoad in ROM to load drivers from drives which
; weren't ready at initial boot up.
; <P003><S084> 3/5/87 BB Added patch to CmdDone to call external file systems if
; 'NoMacDskErr' is returned from MountaVol.
; <P002><Pyyy> 2/28/87 med Added patch to load the DSAT 2 for Mac,Mac+,Maui
; <P001><Pxxx> 2/27/87 med Add some more memory for keyboards, Use equates for ExpandMem,
; and record
; <P001><P029> 1/24/87 JTC Created file today, based on PatchSEROM.a. Added code to
; allocate
;
;############################## ROM All Patch File ##############################
LOAD 'StandardEqu.d'
include 'HardWarePrivateEqu.a'
include 'SCSIEqu.a'
include 'ScriptPriv.a'
include 'PatchMacros.a'
include 'ApplDeskBus.a' ; <6>
include 'ResourceMgrPriv.a'
include 'Decompression.a' ; <sm1>stb
ROMAllFix PROC EXPORT
IMPORT RAMSysInit
EXPORT SysBase,CutBack
; Cut back Code:
;
; SysBase is the entry point for ROMAllFix. Upon entry D1.L contains our handle.
;
; Once the patches have been installed, this code is cut back to exclude the patch
; installation code.
SysBase
BRA RAMSysInit ; do the patch installation.
DC.l ('PTCH') ; resource type
DC.W $0000 ; patch ID 0 to work with all ROMs.
DC.W 0 ; current version number.
; cut back the ram-based system code to exclude this initialization code
CutBack
_SetHandleSize ; adjust our size
MOVEQ #$7F,D0 ; a soon to be large number
SWAP D0
_CompactMem ,SYS ; optional comma
RTS ; all done
ENDP
;#####################################################################################
;############################## START PATCH CODE #####################################
;#####################################################################################
; Put new resident patch code here.
;######################### ADBReInit PATCH ********########################## <6>
; ADBReInit causes ADB keyboards to be reset to use KCHR 0. It can be called
; after booting - for example, on the Portable at wakeup if devices are
; connected to the external ADB port. This causes problems for international
; systems, which are normally using other KCHRs. On the non-Roman systems, users
; may also frequently switch back and forth between various KCHRs. Fortunately,
; a pointer to the current KCHR is kept in ExpandMem. This patch (actually, an
; ADBProc) gets the current KCHR pointer from ExpandMem and stuffs it into the
; keyboard driver data structures for all connected keyboards.
;################################################################################
ADBReInitProc Proc
EXPORT ADBReInitPatch, oldJADBProc
oldJADBProc ds.l 1 ; old jADBProc vector (writeable)
ADBReInitPatch
; Only set up KCHR if this is a post-processing call to jADBProc and we
; have an active KCHR pointer in ExpandMem. ADBReInit can't get called on
; non-ADB machines, so we don't have to test if ADB is present.
with ExpandMemRec
tst.b d0 ; is this post processing?
beq.s @doneADBReInitPatch ; no, skip
move.l ExpandMem,a0 ; get expandmem pointer
move.l emKeyCache(a0),d1 ; is there a KCHR pointer?
beq.s @doneADBReInitPatch ; no, bail
endwith ;ExpandMemRec
; save regs and set up for loop
with ADBDataBlock
movem.l d0/d3-d4,-(sp) ; save regs (incl. flag in d0)
move.l d1,d4 ; copy KCHR pointer
sub.w #dbBlkSize,sp ; allocate ADBDataBlock on stack
; Loop through the ADB records, setting the KCHR pointer in all records
; belonging to keyboard devices.
_CountADBs ; load ADB count.
move.w d0,d3 ; copy count for loop.
bra.s @nextADB ; enter loop at bottom.
@ADBLoop move.w d3,d0 ; device table index - 1.
addq.w #1,d0 ; get real index (1..n).
move.l sp,a0 ; pass addr of ADBDataBlock.
_GetIndADB ; load device record.
cmp.b #kybdADBAddr,origADBAddr(sp) ; is it a keyboard?
bne.s @nextADB ; if not, skip it.
move.l dbDataAreaAddr(sp),a0 ; load data area pointer.
clr.l KybdDriverData.deadKey(a0) ; clear dead state.
move.l d4,KybdDriverData.KCHRPtr(a0) ; set KCHR pointer.
@nextADB dbra d3,@ADBLoop ; next ADB device or done.
; clean up stack and restore regs
add.w #dbBlkSize,sp ; kill ADBDataBlock
movem.l (sp)+,d0/d3-d4 ; restore regs
endwith ;ADBDataBlock
; do previously-installed proc(s) and return
@doneADBReInitPatch
move.l oldJADBProc,a0 ; get old jADBProc vector
jsr (a0) ; do previously-installed procs
rts ; (can't we just jmp above and
; skip this rts?)
ENDP
;######################### DeCompressor PATCH ********#####################
include 'DeCompressorPatch.a'
;######################### KeyTrans PATCH ********#####################
; -----------------------------------------------------------------------------
; Routine: KeyHook
; Input: d1.b option, alpha, shift keys in 2,1,0.
; $17A.b bit #7 1 iff feature key set.
; d2.w keycode (0-127).
; d3.b minus iff keyup, plus iff keydown.
; Output: d0.b ASCII code.
;
; Macintosh keyboard mapping hook, which relies on the new KeyTrans trap.
; -----------------------------------------------------------------------------
KeyHook PROC EXPORT
with ExpandMemRec
bra.s SkipHeader ; skip the header.
; Global variables left here for the wacky Key Caps accessory.
deadEnable dc.w $ffff ; enable the dead key processing.
dc.l ('INIT') ; resource type.
dc.w 0 ; resource id number.
export intlEnable
intlEnable dc.b $00 ; intl keybooard flag (false).
dc.b 7 ; hook version number.
dc.w $0000 ; slot to mollify MacTerm. <S159>
; If this is the domestic or international keyboard hook, we check for keycodes
; that are in the keypad range. These are handled by just returning zero so
; the keypad hook can handle them.
SkipHeader
cmp.b #$40,d2 ; beyond keyboard range?
bhs.s @domestic ; yes -> skip mapping.
; If the international flag is on in the header, this is an original
; Macintosh 128K, 512K, 512Ke, or MacPlus, and the keyboard type is not
; the MacPlus key dorfer with built-in keypad, then we perform a mapping
; from key codes to virtual key codes. The original domestic keyboard and
; MacPlus key dorfer just happen to generate virtual key codes all by
; themselves.
move.b intlEnable,d0 ; international flag set?
beq.s @domestic ; no -> skip remapping.
move.w HwCfgFlags,d0 ; load hardware configuration.
btst.l #hwCbADB,d0 ; ADB present?
bne.s @domestic ; yes -> skip remapping.
cmp.b #$0b,kbdType ; MacPlus keyboard?
beq.s @domestic ; yes -> skip remapping.
lea keyTable,a0 ; find the table.
move.b 0(a0,d2.w),d2 ; map to virtual key code.
; Build the arguments and call to the keyboard trap to produce an ASCII code.
; We get the modifiers from the arguments, except for the command key, which is
@domestic
move.b $17A,d0 ; command key is in high bit of D0
lsl.b #1,d0 ; command bit is in X CC
roxl.w #1,d1 ; command now in low bit of D1
move.b d3,d0 ; up/down key is in high bit of D0
lsl.b #1,d0 ; up/down bit is in X CC
roxl.w #1,d1 ; up down now in low bit of D1
lsl.w #7,d1 ; shift all the way up
or.b d2,d1 ; put keycode in low 7 bits.
move.b deadEnable,d0 ; dead keys enabled?
bne.s @deadOn ; yes -> allow key down calls.
bset #7,d1 ; no -> force key up call.
@deadOn
subq.l #4,sp ; make room for result.
move.l expandMem,a0 ; get low memory pointer
move.l emKeyCache(a0),-(sp) ; pass the key cache pointer
move.w d1,-(sp) ; push keycode and modifiers.
pea emKeyDeadState(a0) ; push address of dead key state.
_KeyTrans ; call keyboard trap.
; KeyTrans has left a present for us on the stack. Each word is an ASCII code
; if that word is to be reported as an event, or zero if nothing should happen.
; Coincidentally, our caller expects us to return zero if he should not report
; the event, or the ASCII code if he should. We check the first word and do
; that one ourselves. The second one is left up to the caller. Bring in the
; Hydra!
moveq #0,d0 ; clear a long.
move.w (sp)+,d0 ; get first return code.
beq.s @noPost ; no need to post an event
lsl.w #8,d2 ; shift key code over.
or.w d2,d0 ; or in key code.
move.w #KeyUpEvt,a0 ; assume key up
tst.b d3 ; keyUp?
bmi.s @postIt ; yes -> skip check
move.w #KeyDwnEvt,a0 ; load key down
@postIt _PostEvent ; generate an extra event.
@noPost move.w (sp)+,d0 ; get the second return code.
rts ; return to the caller.
endwith
; ----------------------------------------------------------------------------
; In order to map the old international keyboard correctly, we use the
; following translation table to map key codes to virtual key codes. This
; is not necessary on an old domestic keyboard as the key codes Òjust happen
; to matchÓ the virtual key codes.
; ----------------------------------------------------------------------------
keyTable
dc.b $00, $01, $02, $03, $04, $05, $32, $06 ; $00 .. $07
dc.b $07, $08, $2c, $09, $0c, $0d, $0e, $0f ; $08 .. $0f
dc.b $10, $11, $12, $13, $14, $15, $16, $17 ; $10 .. $17
dc.b $18, $19, $1a, $1b, $1c, $1d, $1e, $1f ; $18 .. $1f
dc.b $20, $21, $22, $23, $2a, $25, $26, $27 ; $20 .. $27
dc.b $28, $29, $24, $2e, $2f, $0b, $2d, $2b ; $28 .. $2f
dc.b $30, $34, $0a, $33, $31, $35, $36, $37 ; $30 .. $37
dc.b $38, $39, $3a, $3b, $3c, $3d, $3e, $3f ; $38 .. $3f
ENDP
; -----------------------------------------------------------------------------
; (Patch #60) KeyTrans by Ed Tecot.
;
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
;AppleSystemPatch PatchPlusROM.a 21Nov86 #60 (KeyTrans) (KeyTrans)
;
; Keyboard transation trap for MacPlus. This is provided for compatability
; with new system file resources.
;
; FUNCTION KeyTrans(transData: Ptr; keyCode: Integer;
; Var state: LongInt): LongInt;
;
; Translates a keycode to ASCII.
; TransData is a pointer to a KCHR resource for the use of KeyTrans.
; KeyCode is an integer which contains in bits:
; 0-6 "virtual" keycode
; 7 1 = key up
; 8-15 modifier flags similar to event manager.
; State is an internal code used by KeyTrans, which should be 0 on first call.
; The LongInt returned is actually two words which are to be posted as events.
; $0000 should not be posted; if both words contain values, the high word
; should be posted first.
;
; <21Nov86 jdt>
; -----------------------------------------------------------------------------
KeyTrans PROC EXPORT
; Equates for keyboard character tables (type 'KCHR').
vers EQU $00
tInx EQU vers+2
tCnt EQU tInx+$100
tBgn EQU tCnt+2
MOVE.L (SP)+, D0 ; Return address in D0
MOVE.L (SP)+, A0 ; state address in A0
MOVE.W (SP)+, D1 ; keycode in D1
MOVE.L (SP)+, A1 ; KCHR address in A1
MOVE.L D0, -(SP) ; Put the return address back.
MOVEM.L A2/D3, -(SP) ; Save registers
MOVE.W D1, D2
LSR.W #8, D2 ; Shift modifier flags down
MOVE.B tInx(A1, D2.W), D2 ; Table number in D2
MOVEQ #$7F, D0
AND.B D1, D0 ; D0 contains virtual keycode only
EXT.W D1
EXT.L D1 ; Move up/down bit to bit 31
MOVE.B D2, D1 ; Put the table number in D1
LSL.W #8, D1 ; Shift it up one byte
MOVE.B D0, D1 ; Put in the virtual keycode
; At this point D1 contains all the neccesary input information:
; Bit 31 up/down bit (BMI for up stroke)
; Bits 15-8 modifier bits (also in low byte of D2)
; Bit 7 0
; Bits 6-0 "virtual" keycode
LSL.W #7, D2 ; Multiply by 128
OR.B D1, D2 ; Stuff in keycode
ADD #tBgn, A1 ; A1 is now start of tables
MOVE.B (A1, D2.W), D0 ; ASCII byte in D0
BEQ.S MightBeDead ; Go find out if it really is a dead key.
TST.L D1 ; Key up or down?
BMI.S UpKey ; Skip if up
MOVE.L (A0), D3 ; Previous key dead?
BEQ.S KeyExit ; Done if not
CLR.L (A0) ; Clear out dead key state
LEA (A1, D3.L), A2 ; A2 points to completor table
MOVE.W (A2)+, D2 ; Number of completors in D2
BEQ.S NoComp ; If none, skip
SUBQ.W #1, D2 ; Turn it into a zero-based count
CompLoop
CMP.B (A2)+, D0 ; Do we match?
BEQ.S GotComp ; Jump out if we do
ADDQ.L #1, A2 ; Get to next completor
DBRA D2, CompLoop ; Go around again
NoComp
SWAP D0
MOVE.W (A2), D0 ; Store the default code
SWAP D0
BRA.S KeyExit
GotComp
MOVE.B (A2), D0 ; Get the completor
BRA.S KeyExit
MightBeDead
MOVE.W -2(A1), D3 ; Number of tables in D3
LSL.W #7, D3 ; 128 bytes per table
LEA (A1, D3.W), A2 ; Start of dead key table in A2
MOVE.W (A2)+, D2 ; Number of dead keys in D2
BEQ.S NotDead ; There are no dead keys
SUBQ.W #1, D2 ; Turn it into a zero-based count
DeadLoop
CMP.W (A2)+, D1 ; Do we match?
BEQ.S GotDead ; Jump out if we do
MOVE.W (A2)+, D3 ; Get number of completors
LSL.W #1, D3 ; Multiply by 2
LEA 2(A2, D3.W), A2 ; A2 now points to next entry
DBRA D2, DeadLoop ; Go around again
NotDead ; D0 already contains $00000000
UpKey ; D0 already contains correct ASCII
KeyExit
MOVEM.L (SP)+, A2/D3 ; Restore registers
MOVE.L D0, 4(SP) ; Put return value on stack
RTS ; Sayonara
; The key is a dead key. A2 points to the beginning of the completor table.
GotDead
TST.L D1 ; Key up or down?
BMI.S UpDead ; Skip if up
MOVE.L (A0), D3 ; Previous key dead?
BEQ.S SaveState ; Skip if not
MOVEQ #0, D2 ;
MOVE.W (A1, D3.L), D2 ; Get the number of completors for previous
LSL.W #1, D2 ; Multiply by 2
ADD.L D2, D3 ;
MOVE.W 2(A1, D3.L), D0 ; D0 now has default code for previous dead key
SaveState
TST.W (A2) ; See if there are any completors
BEQ.S @1 ; Skip if not
MOVE.L A2, D2 ; Location of completor table
SUB.L A1, D2 ; Subtract base address
MOVE.L D2, (A0) ; Save it
BRA.S KeyExit
@1 CLR.L (A0) ; Clear out dead key state
SWAP D0 ; There might be something in the low word
MOVE.W 2(A2), D0 ; Send out the default code
BRA.S KeyExit ;
UpDead
MOVE.W (A2)+, D3 ; Get the number of completors
LSL.W #1, D3 ; Multiply by 2
MOVE.W (A2, D3.W), D0 ; Put default code in D0
BRA.S KeyExit
ENDP
;#####################################################################################
;############################### END PATCH CODE ######################################
;#####################################################################################
;#####################################################################################
;############################# PATCH INSTALL CODE ####################################
;#####################################################################################
RAMSysInit PROC EXPORT
IMPORT SysBase,CutBack
Move.L D1,-(SP) ;save our handle
;#####################################################################################
; P001 P027 24Jan87 JTC Allocate extended memory for international folks.
; This is not a patch, but it belongs in line.
;
; P001 Pxxx 2/27/87 med Add some more memory for keyboards,
; Use equates for ExpandMem, and record
; pp582 10/20/88 bbm&cch now checks to see if rom initialized expandmem.
; 24Aug89 smb Must increase ExpandMem for TE vectors on Mac Portable
; <7> 1/22/90 cch Now gets the current size from any existing record, and points the
; expandMem global to the new record before disposing of the old
; one.
;#####################################################################################
with ExpandMemRec
move.l ExpandMem,D0 ; test if expandmem is initialized <pp582>
addq #1,D0 ; (not inited is -1) <pp582>
beq.s @MakeExpandMem ; <24Aug89smb>
; must increase ExpandMem for TE vectors for Mac Portable <24Aug89smb>
; test if already allocated new block for ExpandMem <2Feb89smb>
movea.l ExpandMem,a0
move.l emSize(a0),d0 ; current size of ExpandMem record <7>
cmpi.l #emRecSize,d0 ; already allocated new blocks?
bge.s @noSpandex ; <14>
; allocate new block for ExpandMem
movea.l a0,a1 ; save original ExpandMem pointer
move.l #emRecSize,d0 ; allocate correct amount of space <7> <16>
_NewPtr ,SYS,CLEAR
bne @ErrorXit
; a0 = pointer allocated for new expandMem of emRecSize bytes.
; copy original bytes of expandMem into my local space.
move.l emSize(a1),d0 ; current size of ExpandMem record <7>
exg a0,a1 ; want source in a0 <29June89smb>
_BlockMove ; <29June89smb>
move.w #emCurVersion,emVersion(a1) ; version number <7>
move.l #emRecSize,emSize(a1) ; size <7>
move.l a1,ExpandMem ; start using new expandMem <7>
; dispose of original ExpandMem pointer.
_DisposPtr ; still in a0 after move <29June89smb>
beq.s @noSpandex ; exit if everything is ok <7>
@ErrorXit _SysError ; <24Aug89smb>
@MakeExpandMem
clr.l ExpandMem ; aka ÔBasicGlobÕ
move.l #emRecSize,d0 ; size of extension to old low-mem
_NewPtr sys,clear ; get a blob of extension memory
bne.s @noSpandex ; if no mem, leave null in global ptr
move.l a0,ExpandMem ; stuff global ptr
move.w #emCurVersion,(a0)+ ; version number
move.l #emRecSize,(a0) ; size
endWith
@noSpandex ; skip around when no room
;____________________________________________________________________________________
; Jam system version number. <PP149>
move.w #SysVers,SysVersion ; jam sys version number <v1.1>
;____________________________________________________________________________________
; Check to see if AppleTalk is active. If it is not, set emAppleTalkInactiveOnBoot
; to true. Various other parts of the System will look at this global later on to
; determine whether or not network code should be loaded.
move.b SPConfig,d0 ; <26> Get serial port configuration
and.b #$0f,d0 ; <26> Mask off Port B bits
cmp.b #useATalk,d0 ; <26> Configured for AppleTalk?
beq.s @appleTalkIsActive ; <26> Yes. DonÕt set emAppleTalkInactiveOnBoot
with ExpandMemRec
move.l ExpandMem,a0 ; <26>
move.w #-1,emAppleTalkInactiveOnBoot(a0) ; <26>
@appleTalkIsActive
;____________________________________________________________________________________
; Install the keyboard translation code.
; If the cache has not been allocated, load the KCHR 0 resource from the
; system file, create the key cache, and load the KCHR data into the key
; cache. Not finding the KCHR resource and failing to allocate the key
; cache are both serious errors. Note that this code depends upon ExpandMem
; being allocated above.
move.l expandMem,a2 ; get the memory.
move.l emKeyCache(a2),d0 ; has key cache already?
bne.s @doneCache ; yes -> skip allocation.
clr.l -(sp) ; make room for handle.
move.l #'KCHR',-(sp) ; push KCHR type.
clr.w -(sp) ; try for zero.
_GetResource ; get the KCHR resource.
move.l (sp)+,a3 ; load handle.
move.l a3,d0 ; handle nil?
beq.s @badError ; yes, serious bail.
move.l a3,a0 ; load resource handle.
_GetHandleSize ; find resource size.
clr.l d1 ; longize.
move.w #keyCacheMin,d1 ; minimum size.
cmp.l d1,d0 ; big enough?
bge.s @skipResize ; yes (signed compare ok).
move.l d1,d0 ; set to minimum size.
@skipResize
move.w #keyCacheSlop,d1 ; load slop.
add.l d1,d0 ; add slop.
move.l d0,d2 ; save size.
_NewPtr sys,clear ; new pointer of proper size.
; Copy the KCHR data into the key cache buffer area. This is all done in
; case of a switch launch to an old system file that does not know about
; KCHR resources.
move.l a0,emKeyCache(a2) ; store in emKeyCache (expandMem).
move.l a0,a1 ; set up destination.
move.l a3,a0 ; load resource handle.
move.l (a0),a0 ; load resource pointer.
move.l d2,d0 ; load size.
_BlockMove ; copy keyboard table.
@doneCache
; Load the international configuration resource from the system file.
; Copy the old international keyboard flag into our resource header.
clr.l -(sp) ; make room for handle.
move.l #'itlc',-(sp) ; push itlc type.
move.w #0,-(sp) ; try for zero.
_GetResource ; get the itlc resource.
move.l (sp)+,a0 ; load resource handle.
move.l a0,d0 ; handle nil?
beq.s @badError ; yes, serious bail.
move.l (a0),a0 ; load resource pointer.
lea intlEnable,a1 ; load flag pointer.
move.b 6(a0),(a1) ; copy flag value.
; The keyboard translation routine is ready to go, so store the low memory hooks
lea KeyHook,a0 ; load entry point.
move.l a0,Key1Trans ; install the Key1Trans hook.
move.l a0,Key2Trans ; install the Key2Trans hook.
bra.s @doneInit ; weÕre done.
@badError
; A serious error occurred somewhere. Do that crazy system bomb thing.
move.l #dsSysErr,d0 ; pick system bomb number.
_SysError ; pow, biff, boffo.
@doneInit
endwith
; HACK ALERT!
; Cutback is conditionalized on whether or not we install KeyTrans.
; Hopefully, when no one uses Key1Trans and Key2Trans, we can put this
; and the above mess back into ROM75Fix where it belongs
IMPORT KeyTrans
PEA KeyTrans ; Assume we donÕt.
GetTrapA0 $A89F ; Get unimplemented trap
MOVE.L A0,D1 ; Save its address
GetTrapA0 $A9C3 ; Get KeyTrans
CMP.L A0,D1 ; Are they the same?
BNE.S @1 ; No, so it must exist
SetTrap KeyTrans,$A9C3 ; KeyTrans patch.
LEA RAMSysInit,A0 ; DonÕt cut it back.
MOVE.L A0,(SP)
@1
;######################### DeCompressor INSTALLATION ********#####################
IMPORT OldCheckLoadJump,MyCheckLoad
Lea OldCheckLoadJump+2,A0 ; < Denman 1/17/90 >
Move.L jCheckLoad,(A0) ; store the old address in our code
; Set new trap address to this ptr
Lea MyCheckLoad,A0 ; compute the address of the patch code.
Move.L A0,jCheckLoad ; stuff in my checkLoad hook.
; Fix the BIND's to ROM addresses for the Decompressor (SizeRsrc patch).
FixROMAddresses ; bind the addresses
; install our patch to _SizeRsrc.
PatchOSJump Read,$A002 ;Remember the old address of _Read.
InstOSTp ReadDecompression,$A002 ;set the read trap to ReadDecompression
; loop through all the open resource files, and clear the alternate attributes byte
; then, set it for the system file
SetupResourceFileAttributes
move.l TopMapHndl,a0 ;start with the first map
@next
move.l a0,d0 ;are we done?
bz.s @done
move.l (a0),a0 ;get the map pointer
bclr #decompressionPasswordBit,mInMemoryAttr(a0) ; <25> clear the flags for this map
move.l mNext(a0),a0 ;go on to the next map
bra.s @next
@done
move.l SysMapHndl,a0 ;get the system map
move.l (a0),a0
bset #decompressionPasswordBit,mInMemoryAttr(a0) ; allow dcmps here
bset #dontCountOrIndexDuplicatesBit,mInMemoryAttr(a0) ; <23> DonÕt count duplicate resources in the System file
bset #twoDeepBit,mInMemoryAttr(a0) ; <24> One deep calls on the System file will search two (or more) maps.
;#####################################################################################
;######################### A/UX CONDITIONAL INSTALLATION ********#####################
;#####################################################################################
; Patches in this group are bypassed when running on A/UX.
MOVE.W HwCfgFlags,D0 ; check Ôem the compulsive way <PPyyy>
BTST #hwCbAUX,D0 ; is it A/UX time? <PPyyy>
BNE skipOSInstalls ; if so skip this OS stuff <PPyyy>
;############################################################################# <6>
; Install ADBReInitPatch - Save old jADBProc and put ADBReInitPatch addr in
; jADBProc. Only do this on ADB machines!
;
; Note - right now this is not installed for A/UX; A/UX didn't (and may still not)
; support ADBReInit.
;#################################################################################
move.w HwCfgFlags,d0 ; hardware configuration
btst #HwCbADB,d0 ; is ADB present?
beq.s @doneADBProcInstall ; no, skip this install
lea oldJADBProc,a0 ; get addr for saving old jADBProc
move.l jADBProc,(a0) ; save it there
lea ADBReInitPatch,a0 ; get addr of new ADBProc
move.l a0,jADBProc ; stuff it in jADBProc
@doneADBProcInstall
;#####################################################################################
skipOSInstalls ; end of the line for OS/hardware <PPyyy>
;#####################################################################################
;############################### END INSTALL CODE ####################################
;#####################################################################################
;############################# PATCHES CUT BACK CODE #################################
;
MOVE.L (SP)+,A1 ; cut back point on stack
LEA SysBase,A0 ; start of patch code <23Apr86 LAK>
Sub.L A0,A1 ; size of patch code <23Apr86 LAK>
Move.L A1,D0 ; <23Apr86 LAK>
Move.L (SP)+,A0 ; restore the handle passed by SysPatch <23Apr86 LAK>
BRA CutBack ; cut us back -> <23Apr86 LAK>
ENDP
END
;########################### END PATCHES CUT BACK CODE ################################