mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-26 01:49:19 +00:00
776 lines
32 KiB
Plaintext
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 ################################
|