2020-03-22 08:44:21 +00:00
|
|
|
|
;
|
|
|
|
|
; Hacks to match MacOS (most recent first):
|
|
|
|
|
;
|
|
|
|
|
; <Sys7.1> 8/3/92 Reverted <SM5>: disassembled SMgrCalcRect. Reverted <SM4>: changed back
|
|
|
|
|
; to short branches.
|
|
|
|
|
; 9/2/94 SuperMario ROM source dump (header preserved below)
|
|
|
|
|
;
|
|
|
|
|
|
2019-07-27 14:37:48 +00:00
|
|
|
|
;
|
|
|
|
|
; File: ScriptMgrMisc.a (formerly SMgrMisc.a)
|
|
|
|
|
;
|
|
|
|
|
; Contains: Miscellaneous Script Manager routines.
|
|
|
|
|
;
|
|
|
|
|
; Written by: JDT Joe Ternasky
|
|
|
|
|
; MED Mark Davis
|
|
|
|
|
; LDC Lee Collins
|
|
|
|
|
; PKE Peter Edberg
|
|
|
|
|
;
|
|
|
|
|
; Copyright: © 1986-1993 by Apple Computer, Inc., all rights reserved.
|
|
|
|
|
;
|
|
|
|
|
; Change History (most recent first):
|
|
|
|
|
;
|
|
|
|
|
; <SM5> 5/21/93 CSS Delete body of SMgrCalRect as it is obsolete per P. Edberg's
|
|
|
|
|
; review. Leave an RTS so that the vector here still works.
|
|
|
|
|
; <SM4> 10/22/92 CSS Change some branch short instructions to word branches.
|
|
|
|
|
; <10> 6/12/92 FM Broke out the SMgrpostMunging routine into its own proc, and put
|
|
|
|
|
; it here. It used to be in ScriptMgrPatch.a. This way it can be
|
|
|
|
|
; used in the rom build without all the unecessary patch code for
|
|
|
|
|
; the GetOSEvent patch.
|
|
|
|
|
; <9> 5/31/92 FM Remove rom only version of PrintAction. It is in
|
|
|
|
|
; ScriptMgrExtensions now. I left in the forROM conditionals that
|
|
|
|
|
; cause the ScriptMgr to jump through vectors.
|
|
|
|
|
; <8> 4/29/92 JSM Get rid of conditionals: Don’t use smgrSysVers, smgrUseStdExit
|
|
|
|
|
; and ScriptMgrKeyboardMenu are always true. Leave forROM
|
|
|
|
|
; conditionals in for now until we fix the ROM build.
|
|
|
|
|
; <7> 12/10/91 PKE #1017754: Script Mgr Print Action dispatcher should leave
|
|
|
|
|
; ScriptRecord ptr in a0. For non-ROM builds, move PrintAction to
|
|
|
|
|
; ptch 27 for all CPUs. Delete some obsolete conditionalized code.
|
|
|
|
|
; <6> 12/15/90 PKE (gbm) Move ‘itlk’ loading from KeyScript into SwapKybd. Fixes
|
|
|
|
|
; bugs with some European keyboards when using Keyboard menu, etc.
|
|
|
|
|
; <5> 12/14/90 PKE (DC) Force SwapKybd to load 'KCHR' resources from System file.
|
|
|
|
|
; <4> 5/13/90 SMB Just ‘rts’ if SwapIcon is called. No one should still be calling
|
|
|
|
|
; it in 7.0, but just in case.... (better safe than sorry..)
|
|
|
|
|
; <3> 4/10/90 PKE Use smgrSysVers, smgrROMVers, forRom, doScriptMgrUseKscn, and
|
|
|
|
|
; doScriptMgrRstKCHRFix symbols instead of buildLevel. Deleted
|
|
|
|
|
; conditionalized def’n of forRom and SysVers. Fixed up header and
|
|
|
|
|
; tabs.
|
|
|
|
|
; <2> 3/20/90 EMT Removed unnecessary ROM85 references and oldMacTweek code.
|
|
|
|
|
; <1> 12/18/89 CCH Adding for the first time into BBS. Changed include 'inc.sum.a'
|
|
|
|
|
; to load 'StandardEqu.d'. Updated file name references.
|
|
|
|
|
;
|
|
|
|
|
; (BBS versions above, EASE versions below)
|
|
|
|
|
; <1.9> 11/17/89 PKE In ResetKCHR, clear KybdDriverData.deadKey as long, not word.
|
|
|
|
|
; <1.8> 9/18/89 PKE For 7.0, SwapIcon uses new type 'kscn' instead of 'SICN'.
|
|
|
|
|
; <1.7> 8/26/89 PKE Cleaned up conditionals.
|
|
|
|
|
; <1.6> 8/22/89 SES Removed references to nFiles.
|
|
|
|
|
; <1.5> 6/30/89 PKE NEEDED FOR AURORA: For ROM, SwapIcon & SwapKybd now dispatch
|
|
|
|
|
; through an internal vector.
|
|
|
|
|
; <1.4> 6/23/89 PKE Skip definition of buildLevel (done in ScriptPriv.a).
|
|
|
|
|
; <1.3> 2/21/89 PKE Replaced with RomProj version, which already had system and Rom
|
|
|
|
|
; sources merged.
|
|
|
|
|
; (EASE ROMproj versions below)
|
|
|
|
|
; <1.5> 2/21/89 PKE Fix up includes: always use include 'inc.sum.a'.
|
|
|
|
|
; <1.4> 2/14/89 PKE Updated to use MPW 3.0 final ScriptEqu.a equate names
|
|
|
|
|
; <1.3> 2/3/89 PKE Merged with current system sources (CCH's 01/16/1989 merge of
|
|
|
|
|
; 6.0.3 and 7.0 sources, done in RES.sys:smgr)
|
|
|
|
|
; <1.2> 11/14/88 PKE Synchronize EASE and Projector
|
|
|
|
|
; <1.1> 11/11/88 CCH Fixed Header.
|
|
|
|
|
; <1.0> 11/9/88 CCH Adding to EASE.
|
|
|
|
|
; (old EASE ROMproj versions below)
|
|
|
|
|
; <1.8> 10/31/88 CCH Added inside of ScriptPriv.a
|
|
|
|
|
; (EASE SYSproj versions below)
|
|
|
|
|
; <1.2> 2/14/89 PKE Updated to use MPW 3.0 final ScriptEqu.a equates
|
|
|
|
|
; <1.1> 1/16/89 CCH Merged 6.0.3 final sources into 7.0.
|
|
|
|
|
; <1.0> 11/16/88 CCH Added to EASE.
|
|
|
|
|
; (preEASE versions below)
|
|
|
|
|
; 10/13/88 ldc Added include of 'AppleDeskBusPriv.a'
|
|
|
|
|
; 10/10/88 ldc use inc.sum.a for rom
|
|
|
|
|
; 5/19/88 ldc standardized exit via StdUnlink
|
|
|
|
|
; ** changes above for ROM or sys $700 **
|
|
|
|
|
; 2/22/88 med Zap Ed’s keyboard if it is left around
|
|
|
|
|
; 8/21/87 med Used smgrGenFlags (field) as offset, not verb.
|
|
|
|
|
; 7/24/87 med SwapKybd was not saving D4
|
|
|
|
|
; 7/7/87 med Cleaned up adb equate usage
|
|
|
|
|
; 7/7/87 med Test for MBarHeight before drawing icon, test for smfShowIcon
|
|
|
|
|
; for showing icon always
|
|
|
|
|
; 5/21/87 med Was swapping keyboard using icon number
|
|
|
|
|
; 5/21/87 med Made fix to use adb.origADBAddr to test keyboard
|
|
|
|
|
; 3/9/87 med Minor equate change
|
|
|
|
|
; 2/28/87 med Expand keycache ptr if possible. Reset emKeyCache between copies.
|
|
|
|
|
; 2/27/87 med Changed test of ADB machine to be more robust, Used ExpandMem
|
|
|
|
|
; fields instead of SMgr fields
|
|
|
|
|
; 12/31/86 jdt Moved check on smgrEnabled <= 1 into SwapIcon.
|
|
|
|
|
; 12/28/86 jdt Fixed SwapIcon to save and restore the current GrafPort and the
|
|
|
|
|
; clipping region of the Window Manager port. Removed checks on
|
|
|
|
|
; ResErr after GetResources calls. Replaced resource constants
|
|
|
|
|
; with literals.
|
|
|
|
|
; 12/22/86 jdt Changed stack frames to include argument sizes. Removed WMgrPort
|
|
|
|
|
; clipping region stuff in SwapIcon. Replace event mask with
|
|
|
|
|
; constant.
|
|
|
|
|
; 12/9/86 jdt Created from initialization code..
|
|
|
|
|
;___________________________________________________________________________________________________
|
|
|
|
|
; To Do:
|
|
|
|
|
;
|
|
|
|
|
;___________________________________________________________________________________________________
|
|
|
|
|
|
|
|
|
|
load 'standardequ.d'
|
|
|
|
|
include 'ApplDeskBus.a'
|
|
|
|
|
include 'ScriptPriv.a'
|
|
|
|
|
|
|
|
|
|
hwCbADB EQU 10 ; Apple Desktop Bus present.
|
|
|
|
|
|
|
|
|
|
proc
|
|
|
|
|
blanks on
|
|
|
|
|
string asis
|
|
|
|
|
|
|
|
|
|
export SwapKybd ; swaps KCHR resource.
|
|
|
|
|
export SwapIcon ; swaps kscn resource.
|
|
|
|
|
|
|
|
|
|
import StdUnlink
|
|
|
|
|
|
|
|
|
|
export xSwapKybd,xSwapIcon ; <06/30/89 pke>
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; function: SwapIcon
|
|
|
|
|
; warning: This routine follows Pascal register conventions.
|
|
|
|
|
;
|
|
|
|
|
; SwapIcon blits the key script icon in the upper right corner of the screen,
|
|
|
|
|
; opposite the apple symbol in the menu bar. It only draws the icon if the
|
|
|
|
|
; menuList is not nil.
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
siRecord record {a6link},decr
|
|
|
|
|
return ds.l 1 ; return address.
|
|
|
|
|
a6link ds.l 1 ; old a6 register.
|
|
|
|
|
oldPort ds.l 1 ; saved GrafPtr.
|
|
|
|
|
oldClip ds.l 1 ; save region handle.
|
|
|
|
|
siLocals equ * ; size of local variables.
|
|
|
|
|
endr
|
|
|
|
|
SwapIconRegs reg a2-a3 ; swap regs
|
|
|
|
|
|
|
|
|
|
; Save the registers and link the stack. If the MenuBar handle is nil,
|
|
|
|
|
; the script manager is disabled, or there is only one script system, bail
|
|
|
|
|
; out without drawing the icon.
|
|
|
|
|
|
|
|
|
|
SwapIcon
|
|
|
|
|
IF forRom THEN ; <06/30/89 pke>
|
|
|
|
|
GetSMgrCore a0
|
|
|
|
|
move.l SmgrRecord.sVectSwapIcon(a0),a0 ; load address of routine
|
|
|
|
|
jmp (a0) ; jmp to it & return through it
|
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
xSwapIcon ; <06/30/89 pke>
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; function: SwapKybd;
|
|
|
|
|
; warning: This routine follows Pascal register conventions.
|
|
|
|
|
;
|
|
|
|
|
; Loads the keyboard character table for the key script into the key cache.
|
|
|
|
|
; The keyboard is disabled while the swap is occurring, and all pending
|
|
|
|
|
; keyboard events are flushed from the queue before the keyboard is enabled
|
|
|
|
|
; again.
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
flushMask equ $0038 ; keyDwn, keyUp, and autoKey.
|
|
|
|
|
|
|
|
|
|
; Save the registers and load the script manager globals pointer.
|
|
|
|
|
;
|
|
|
|
|
; a3.l old Key Cache Pointer
|
|
|
|
|
; a2.l New KCHR handle.
|
|
|
|
|
; d4.l cache size ; <7/25/87med>
|
|
|
|
|
|
|
|
|
|
SwapKybdRegs reg a2/a3/d4 ; added d4 <7/25/87med>
|
|
|
|
|
|
|
|
|
|
SwapKybd
|
|
|
|
|
IF forRom THEN ; <06/30/89 pke>
|
|
|
|
|
GetSMgrCore a0
|
|
|
|
|
move.l SmgrRecord.sVectSwapKybd(a0),a0 ; load address of routine
|
|
|
|
|
jmp (a0) ; jmp to it & return through it
|
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
xSwapKybd ; <06/30/89 pke>
|
|
|
|
|
with smgrRecord,scriptRecord,ExpandMemRec
|
|
|
|
|
link a6,#0 ; link the stack.
|
|
|
|
|
movem.l SwapKybdRegs,-(sp) ; save the registers.
|
|
|
|
|
move.l expandMem,a3 ; load expandMemPtr
|
|
|
|
|
move.l emKeyCache(a3),a3 ; get pointer to key cache
|
|
|
|
|
|
|
|
|
|
; Load the new keyboard character resource from the system file. If we
|
|
|
|
|
; cannot find it, continue using the old keyboard character table.
|
|
|
|
|
|
|
|
|
|
@LoadKybd
|
|
|
|
|
move.w CurMap,-(sp) ; leave cur resfile refnum on stack <5>
|
|
|
|
|
clr.w -(sp) ; specify system file <5>
|
|
|
|
|
_UseResFile ; <5>
|
|
|
|
|
|
|
|
|
|
sub.l #4,sp ; make room for handle.
|
|
|
|
|
move.l #'KCHR',-(sp) ; push KCHR type.
|
|
|
|
|
GetSMgrCore a0 ; load smgrCore pointer.
|
|
|
|
|
move.w smgrKeyScript(a0),d0 ; get key script code.
|
|
|
|
|
lsl.w #2,d0 ; convert to long offset.
|
|
|
|
|
move.l smgrEntry(a0,d0.w),a0 ; get key script entry.
|
|
|
|
|
|
|
|
|
|
move.w scriptBundle.itlbKeys(a0),d4 ; save KCHR id number in d4… <6>
|
|
|
|
|
move.w d4,-(sp) ; and push it <6>
|
|
|
|
|
|
|
|
|
|
move.w #-1,RomMapInsert ; look for KCHR in ROM and load.
|
|
|
|
|
|
|
|
|
|
_GetResource ; get the KCHR resource.
|
|
|
|
|
move.l (sp)+,a2 ; load handle
|
|
|
|
|
move.l a2,d0 ; handle = nil?
|
|
|
|
|
|
|
|
|
|
bne.s @loadItlk ; no - go load itlk. Otherwise…
|
|
|
|
|
_UseResFile ; restore old resfile (refnum on stack) <5><6>
|
2020-03-22 08:44:21 +00:00
|
|
|
|
bra.s DoneKybd ; bail, keep old KCHR & itlk. ex<SM4> CSS <Sys7.1>
|
2019-07-27 14:37:48 +00:00
|
|
|
|
|
|
|
|
|
@loadItlk
|
|
|
|
|
; if we already have an itlk, dispose of it <6>
|
|
|
|
|
GetSMgrCore a0 ;
|
|
|
|
|
move.l smgrCurITLK(a0),d0 ; have old handle?
|
|
|
|
|
beq.s @noOld ; no -> skip dispose
|
|
|
|
|
clr.l smgrCurITLK(a0) ; clear the handle storage
|
|
|
|
|
move.l d0,a0 ; copy itlk handle
|
|
|
|
|
_DisposHandle ; dispose of the itlk
|
|
|
|
|
@noOld
|
|
|
|
|
; load the itlk resource, detach it, and store its handle <6>
|
|
|
|
|
subq #4,sp ; make room for handle
|
|
|
|
|
move.l #'itlk',-(sp) ; push resource type
|
|
|
|
|
move.w d4,-(sp) ; push resource ID number
|
|
|
|
|
_GetResource ; load the resource
|
|
|
|
|
move.l (sp)+,d0 ; found the itlk resource?
|
|
|
|
|
beq.s @noNew ; no -> skip installation
|
|
|
|
|
|
|
|
|
|
GetSMgrCore a0 ;
|
|
|
|
|
move.l d0,smgrCurITLK(a0) ; save new itlk handle
|
|
|
|
|
move.l d0,-(sp) ; push itlk handle
|
|
|
|
|
_DetachResource ; detach from system file
|
|
|
|
|
@noNew
|
|
|
|
|
; restore previous resource file
|
|
|
|
|
_UseResFile ; restore old resfile (refnum on stack) <5><6>
|
|
|
|
|
|
|
|
|
|
; Lock the KCHR down and reset all ADB keyboard devices to use it.
|
|
|
|
|
|
|
|
|
|
move.l a2,a0 ; load KCHR handle.
|
|
|
|
|
_HLock ; lock it down.
|
|
|
|
|
move.l (a2),-(sp) ; push pointer.
|
|
|
|
|
jsr ResetKCHR ; let ADB devices use it.
|
|
|
|
|
|
|
|
|
|
; Copy the new keyboard character table into the cache area. Then flush
|
|
|
|
|
; all pending keyboard events from the event queue. This can lead to a
|
|
|
|
|
; mysterious dropping of key presses, which has been known to upset Dave
|
|
|
|
|
; Kleinberg.
|
|
|
|
|
|
|
|
|
|
CopyKybd
|
|
|
|
|
move.l a2,a0 ; load resource handle.
|
|
|
|
|
_GetHandleSize ; find resource size.
|
|
|
|
|
|
|
|
|
|
; Check that we have enough room to copy.
|
|
|
|
|
|
|
|
|
|
move.l d0,d4 ; save size
|
|
|
|
|
move.l a3,a0 ; get the cache ptr
|
|
|
|
|
_GetPtrSize ; find size
|
|
|
|
|
cmp.l d0,d4 ; big enough?
|
|
|
|
|
blt.s @SkipResize ; yep, keep going
|
|
|
|
|
|
|
|
|
|
; cache too small: try getting enough room in the system heap
|
|
|
|
|
|
|
|
|
|
move.l d4,d0 ; pass new size
|
|
|
|
|
_NewHandle sys ; try to get it
|
|
|
|
|
bne.s @ResetKybd ; just not there, reset
|
|
|
|
|
_DisposHandle ; get rid of test handle
|
|
|
|
|
move.l a3,a0 ; get the cache ptr
|
|
|
|
|
_DisposPtr ; get rid of it
|
|
|
|
|
move.l d4,d0 ; get new size
|
|
|
|
|
_NewPtr sys,clear ; have to get it, since test succeeded
|
|
|
|
|
move.l a0,a3 ; set the cache ptr
|
|
|
|
|
|
|
|
|
|
@SkipResize
|
|
|
|
|
|
|
|
|
|
move.l (a2),a0 ; load resource pointer.
|
|
|
|
|
move.l a3,a1 ; load cache pointer.
|
|
|
|
|
move.l d4,d0 ; load size
|
|
|
|
|
_BlockMove ; copy keyboard table.
|
|
|
|
|
|
|
|
|
|
; Unlock the KCHR and tell the ADB keyboard devices to use the standard
|
|
|
|
|
; keyboard cache area.
|
|
|
|
|
|
|
|
|
|
@ResetKybd
|
|
|
|
|
|
|
|
|
|
move.l a3,-(sp) ; load cache pointer.
|
|
|
|
|
jsr ResetKCHR ; let ADB devices use it.
|
|
|
|
|
move.l a2,a0 ; load KCHR handle.
|
|
|
|
|
_HUnlock ; unlock it.
|
|
|
|
|
|
|
|
|
|
move.l #flushMask,d0 ; flush all keyboard events.
|
|
|
|
|
_FlushEvents ; die you wretched events.
|
|
|
|
|
|
|
|
|
|
; Restore the registers and return to the caller.
|
|
|
|
|
|
|
|
|
|
DoneKybd
|
|
|
|
|
movem.l (sp)+,SwapKybdRegs ; restore the registers.
|
|
|
|
|
unlk a6 ; unlink the stack.
|
|
|
|
|
rts ; return to the caller.
|
|
|
|
|
endWith ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; function: ResetKCHR(kchr: Ptr);
|
|
|
|
|
; input: (sp).l New KCHR pointer.
|
|
|
|
|
; warning: This routine follows Pascal register conventions.
|
|
|
|
|
;
|
|
|
|
|
; Steps through the ADB data structures and resets the KCHR pointer for all
|
|
|
|
|
; keyboard devices. This is only done if the current ROM supports the ADB.
|
|
|
|
|
; This code was ruthlessly stolen from Mark Davis.
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
rkRecord record {a6link},decr
|
|
|
|
|
rkArgs equ *-8 ; size of arguments.
|
|
|
|
|
pointer ds.l 1 ; new KCHR pointer.
|
|
|
|
|
return ds.l 1 ; return address.
|
|
|
|
|
a6link ds.l 1 ; old a6 register.
|
|
|
|
|
adb ds ADBDataBlock ; ADB data structure.
|
|
|
|
|
oldKeyboard ds.l 1 ; old keyboard pointer <2/22/88med>
|
|
|
|
|
rkLocals equ * ; size of local variables.
|
|
|
|
|
endr
|
|
|
|
|
|
|
|
|
|
ResetKCHRRegs reg d3
|
|
|
|
|
|
|
|
|
|
ResetKCHR
|
|
|
|
|
with rkRecord,expandMemRec
|
|
|
|
|
link a6,#rkLocals ; link the stack.
|
|
|
|
|
movem.l ResetKCHRRegs,-(sp) ; save the registers.
|
|
|
|
|
|
|
|
|
|
move.l ExpandMem,a0 ; get expanded memory
|
|
|
|
|
clr.l ExpandMemRec.emKeyDeadState(a0) ; clear dead key state. <7/7/87med>
|
|
|
|
|
move.l pointer(a6),ExpandMemRec.emKeyCache(a0) ; reset the pointer <7/7/87med>
|
|
|
|
|
|
|
|
|
|
move.l RomBase,a0 ; get rombase
|
|
|
|
|
tst.b 8(a0) ; possible ADB machine (>= 1)?
|
|
|
|
|
beq.s ResetDone ; no, bail
|
|
|
|
|
move.w HwCfgFlags,d0 ; hardware configuration
|
|
|
|
|
btst #HwCbADB,d0 ; is ADB present?
|
|
|
|
|
beq.s ResetDone ; no, bail
|
|
|
|
|
|
|
|
|
|
;; move.l ROMBase,a0 ; load ROM pointer.
|
|
|
|
|
;; cmp.w #$75,8(a0) ; newer than ROM75?
|
|
|
|
|
;; ble.s ResetDone ; no -> skip KCHR resetting.
|
|
|
|
|
|
|
|
|
|
; Loop through the ADB records, changing the KCHR pointer in all records
|
|
|
|
|
; belonging to keyboard devices.
|
|
|
|
|
|
|
|
|
|
_CountADBs ; load ADB count.
|
|
|
|
|
move.w d0,d3 ; copy count for loop.
|
|
|
|
|
bra.s @1 ; enter loop at bottom.
|
|
|
|
|
|
|
|
|
|
@0 move.w d3,d0 ; pass number.
|
|
|
|
|
add.w #1,d0 ; increment for 1 based number.
|
|
|
|
|
lea adb(a6),a0 ; pass record address.
|
|
|
|
|
_GetIndADB ; load device record.
|
|
|
|
|
cmp.b #kybdADBAddr,adb.origADBAddr(a6) ; is it a keyboard? Changed from D0 <5/14/87med>
|
|
|
|
|
bne.s @1 ; no -> skip it.
|
|
|
|
|
move.l adb.dbDataAreaAddr(a6),a0 ; load data area pointer. (adb+6) <7/7/87med>
|
|
|
|
|
|
|
|
|
|
clr.l KybdDriverData.deadKey(a0) ; clear dead state - long! <7/7/87med><1.9>
|
|
|
|
|
|
|
|
|
|
lea KybdDriverData.KCHRPtr(a0),a0 ; get pointer location <2/22/88med>
|
|
|
|
|
move.l (a0),oldKeyboard(a6) ; save old pointer <2/22/88med>
|
|
|
|
|
move.l pointer(a6),(a0) ; reset KCHR pointer. (20) <2/22/88med>
|
|
|
|
|
@1 dbra d3,@0 ; do the next ADB device.
|
|
|
|
|
|
|
|
|
|
; zap Tecot’s keyboard first time through <2/22/88med>
|
|
|
|
|
|
|
|
|
|
move.l expandMem,a1 ; globals
|
|
|
|
|
lea emFirstKeyboard(a1),a1 ; get location of byte
|
|
|
|
|
tst.b (a1) ; first time?
|
|
|
|
|
bne.s @FirstDone ; no, exit
|
|
|
|
|
st (a1) ; flag for posterity
|
|
|
|
|
move.l oldKeyboard(a6),a0 ; release
|
|
|
|
|
_RecoverHandle ; get back handle
|
|
|
|
|
tst.w MemErr ; any error?
|
|
|
|
|
bne.s @FirstDone ; if so, bail.
|
|
|
|
|
_DisposHandle ; get rid of it
|
|
|
|
|
@FirstDone
|
|
|
|
|
|
|
|
|
|
; Restore the registers, unlink the stack and return to the caller.
|
|
|
|
|
|
|
|
|
|
ResetDone
|
|
|
|
|
movem.l (sp)+,ResetKCHRRegs ; restore the registers.
|
|
|
|
|
|
|
|
|
|
;<5/19/88ldc> standardized exit
|
|
|
|
|
move.w #rkArgs, d0
|
|
|
|
|
bra StdUnlink
|
|
|
|
|
|
|
|
|
|
endProc
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; SMgrPostMunging
|
|
|
|
|
;
|
|
|
|
|
; This routine is called by both the xGetOSEvent patch in ptch 4 and from GetOSEvent in the
|
|
|
|
|
; ROM source.
|
|
|
|
|
;
|
|
|
|
|
; It expectes and EventPtr in A0
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; This routine screens all events and determines when to change the key
|
|
|
|
|
; script. If it does change the key script, region symbol in the menu bar
|
|
|
|
|
; is redrawn.
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
modMask equ $fffb ; mask off capsLock key.
|
|
|
|
|
|
|
|
|
|
SMgrPostMunging proc export
|
|
|
|
|
with SMgrRecord
|
|
|
|
|
|
|
|
|
|
movem.l a0-a4/d0-d2,-(sp) ; save the registers.
|
|
|
|
|
GetSMgrCore a4 ; load SMgr globals. <4/26/88ldc>
|
|
|
|
|
move.l a0,a2 ; save the event pointer.
|
|
|
|
|
|
|
|
|
|
; If this is a keyDown event, check to see if the keyboard code and
|
|
|
|
|
; modifiers match any of the combinations in the keyboard swapping table.
|
|
|
|
|
|
|
|
|
|
FilterKey
|
|
|
|
|
cmp.w #keyDwnEvt,evtNum(a2) ; evtNum = keyDown?
|
|
|
|
|
beq.s @1 ; yes -> check message.
|
|
|
|
|
cmp.w #autoKeyEvt,evtNum(a2) ; evtNum = autoKey?
|
|
|
|
|
bne.s DoneEvent ; no -> bail out.
|
|
|
|
|
@1
|
|
|
|
|
move.l smgrKeySwap(a4),d0 ; swap table = nil?
|
|
|
|
|
beq.s DoneEvent ; yes -> skip key swapping.
|
|
|
|
|
move.l d0,a0 ; load swap table handle.
|
|
|
|
|
move.l (a0),a0 ; load swap table pointer.
|
|
|
|
|
move.l evtMessage(a2),d1 ; get event message
|
|
|
|
|
move.b evtMeta(a2),d1 ; get modifier keys.
|
|
|
|
|
and.w #modMask,d1 ; mask off alpha modifier.
|
|
|
|
|
@2
|
|
|
|
|
move.l (a0)+,d0 ; tuple = 0?
|
|
|
|
|
beq.s DoneEvent ; yes -> bail out.
|
|
|
|
|
cmp.w d0,d1 ; tuple = message?
|
|
|
|
|
bne.s @2 ; no -> try next tuple.
|
|
|
|
|
swap d0 ; get KeyScript verb.
|
|
|
|
|
|
|
|
|
|
; Change the current keyboard. Call KeyScript to load the new keyboard
|
|
|
|
|
; and to draw the keyboard icon in the menu bar. Remember to null out
|
|
|
|
|
; the event type and return that no events were available.
|
|
|
|
|
;
|
|
|
|
|
; Beginning with System 7, we only strip the event if it meaningful <12>
|
|
|
|
|
; in the current system - i.e., the KeyScript return code is true.
|
|
|
|
|
|
|
|
|
|
ScriptEvent
|
|
|
|
|
move.w d0,-(sp) ; push script code.
|
|
|
|
|
_KeyScript ; invoke the trap.
|
|
|
|
|
tst.b smgrKeyScriptResult(a4) ; Did KeyScript do something useful? <12>
|
|
|
|
|
beq.s DoneEvent ; if not, don't strip event <12>
|
|
|
|
|
move.w #nullEvt,evtNum(a2) ; null event type.
|
|
|
|
|
move.l MinusOne,(sp) ; return no event in d0. <was #MinusOne,
|
|
|
|
|
; fixed <02/28/89 pke>
|
|
|
|
|
; Restore the registers and return to the caller.
|
|
|
|
|
|
|
|
|
|
DoneEvent
|
|
|
|
|
movem.l (sp)+,a0-a4/d0-d2 ; restore the registers.
|
|
|
|
|
rts ; return to the caller.
|
|
|
|
|
|
|
|
|
|
endwith
|
|
|
|
|
endproc
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; routine: SMgrCalcRect
|
|
|
|
|
; input: none
|
|
|
|
|
; output: none
|
|
|
|
|
; trashes: a0 (in 7.0)
|
|
|
|
|
; warning: This routine is a trap patch for InitMenus.
|
|
|
|
|
; This routine saves all registers.
|
|
|
|
|
;
|
2020-03-22 08:44:21 +00:00
|
|
|
|
; This routine calculates the bounds of the menubar icon. ex<SM5> <Sys7.1>
|
2019-07-27 14:37:48 +00:00
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
|
2020-03-22 08:44:21 +00:00
|
|
|
|
mbarIconPix equ 16
|
|
|
|
|
|
2019-07-27 14:37:48 +00:00
|
|
|
|
SMgrCalcRect Proc Export
|
2020-03-22 08:44:21 +00:00
|
|
|
|
with SMgrRecord
|
|
|
|
|
|
|
|
|
|
movem.l a2,-(sp)
|
|
|
|
|
GetSMgrCore a2
|
|
|
|
|
|
|
|
|
|
move.w MBarHeight,d0 ; vertical placement
|
|
|
|
|
lsr.w #1,d0
|
|
|
|
|
subq #mbarIconPix/2,d0
|
|
|
|
|
move.w d0,smgrRect+top(a2)
|
|
|
|
|
add.w #mbarIconPix,d0
|
|
|
|
|
move.w d0,smgrRect+bottom(a2)
|
|
|
|
|
|
|
|
|
|
subq #4,sp
|
|
|
|
|
move.l sp,-(sp)
|
|
|
|
|
_GetWMgrPort
|
|
|
|
|
move.l (sp)+,a0
|
|
|
|
|
|
|
|
|
|
tst.b smgrIconSideFlag(a2) ; horizontal placement
|
|
|
|
|
bnz.s @iconLeft
|
|
|
|
|
|
|
|
|
|
@iconRight ; ...on one side...
|
|
|
|
|
move.w portRect+right(a0),d0
|
|
|
|
|
sub.w smgrIconOffset(a2),d0
|
|
|
|
|
move.w d0,smgrRect+right(a2)
|
|
|
|
|
sub.w #mbarIconPix,d0
|
|
|
|
|
move.w d0,smgrRect+left(a2)
|
|
|
|
|
bra.s @return
|
|
|
|
|
@iconLeft ; ...or the other.
|
|
|
|
|
move.w portRect+left(a0),d0
|
|
|
|
|
add.w smgrIconOffset(a2),d0
|
|
|
|
|
move.w d0,smgrRect+left(a2)
|
|
|
|
|
add.w #mbarIconPix,d0
|
|
|
|
|
move.w d0,smgrRect+right(a2)
|
|
|
|
|
|
|
|
|
|
@return
|
|
|
|
|
movem.l (sp)+,a2
|
2019-07-27 14:37:48 +00:00
|
|
|
|
rts
|
2020-03-22 08:44:21 +00:00
|
|
|
|
|
|
|
|
|
endwith
|
2019-07-27 14:37:48 +00:00
|
|
|
|
endproc
|
|
|
|
|
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
; routine: SMgrFont
|
|
|
|
|
; input: none
|
|
|
|
|
; output: none
|
|
|
|
|
; warning: This routine is a trap patch for InitFonts.
|
|
|
|
|
; trashes none.
|
|
|
|
|
;
|
|
|
|
|
; This routine ensures that the system and application fonts are set to
|
|
|
|
|
; the fonts chosen by the system script.
|
|
|
|
|
; ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
fiSaveRegs reg a0/a2-a3/d0/d3
|
|
|
|
|
sGlb equ a2 ; register for Script Globals
|
|
|
|
|
disabCacheReq equ -2 ; disable cache request in CurFMInput
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SMgrInitFonts proc export ; called from rom _InitFont
|
|
|
|
|
with smgrRecord,scriptRecord
|
|
|
|
|
|
|
|
|
|
movem.l fiSaveRegs,-(sp) ; save the registers.
|
|
|
|
|
GetSMgrCore sGlb ; get SM globals
|
|
|
|
|
|
|
|
|
|
IF forRom THEN
|
|
|
|
|
cmpa.l #-1,sGlb ; SMgr installed? <11/14/88 pke>
|
|
|
|
|
beq @skipInitFonts ; bail if not <11/14/88 pke>
|
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
; Set the system and application fonts from the script entry record of the system script.
|
|
|
|
|
; This is not done on original Macintosh ROMs.
|
|
|
|
|
|
|
|
|
|
move.b smgrFontForce(sGlb),-(sp) ; save the old value <3/4/87med>
|
|
|
|
|
sf smgrFontForce(sGlb) ; turn it off <3/4/87med>
|
|
|
|
|
|
|
|
|
|
tst.b smgrEnabled(sGlb) ; script manager disabled?
|
|
|
|
|
beq.s @noFonts ; yes -> bail out.
|
|
|
|
|
move.w smgrSysScript(sGlb),d3 ; get system script code.
|
|
|
|
|
move.w d3,d0 ; copy system script code.
|
|
|
|
|
lsl.w #2,d0 ; script code is long index.
|
|
|
|
|
move.l smgrEntry(sGlb,d0.w),a3 ; load system script entry.
|
|
|
|
|
|
|
|
|
|
clr.w -(sp) ; make room for script code.
|
|
|
|
|
move.w SysFontFam,-(sp) ; push system font number.
|
|
|
|
|
_Font2Script ; convert font to script.
|
|
|
|
|
cmp.w (sp)+,d3 ; code = system script?
|
|
|
|
|
|
|
|
|
|
bne.s @remapSysFont ; <06/05/89 pke, per med>
|
|
|
|
|
tst.b smgrDefault(sGlb) ; <06/05/89 pke, per med>
|
|
|
|
|
|
|
|
|
|
beq.s @noSysFont ; yes -> skip resetting.
|
|
|
|
|
@remapSysFont ; <06/05/89 pke>
|
|
|
|
|
move.w scriptSysFond(a3),SysFontFam ; set system font.
|
|
|
|
|
move.w #disabCacheReq,CurFMInput ; disable cache request <3/5/87med>
|
|
|
|
|
@noSysFont
|
|
|
|
|
clr.w -(sp) ; make room for script code.
|
|
|
|
|
move.w ApFontID,-(sp) ; push application font number.
|
|
|
|
|
_Font2Script ; convert font to script.
|
|
|
|
|
cmp.w (sp)+,d3 ; code = system script?
|
|
|
|
|
|
|
|
|
|
bne.s @remapAppFont ; <06/05/89 pke, per med>
|
|
|
|
|
tst.b smgrDefault(sGlb) ; <06/05/89 pke, per med>
|
|
|
|
|
|
|
|
|
|
beq.s @noAppFont ; yes -> skip resetting.
|
|
|
|
|
@remapAppFont ; <06/05/89 pke>
|
|
|
|
|
move.w scriptAppFond(a3),ApFontID ; set application font.
|
|
|
|
|
move.w #disabCacheReq,CurFMInput ; disable cache request <3/5/87med>
|
|
|
|
|
@noAppFont
|
|
|
|
|
@noFonts
|
|
|
|
|
|
|
|
|
|
move.b (sp)+,smgrFontForce(sGlb) ; restore the old value <3/4/87med>
|
|
|
|
|
@skipInitFonts ; <11/14/88 pke>
|
|
|
|
|
movem.l (sp)+,fiSaveRegs ; restore the registers.
|
|
|
|
|
rts ; return to the caller.
|
|
|
|
|
endWith
|
|
|
|
|
endProc
|
|
|
|
|
end
|
|
|
|
|
|