sys7.1-doc-wip/Toolbox/ScriptMgr/ScriptMgrExtTail.a
2019-07-27 22:37:48 +08:00

1027 lines
45 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; File: ScriptMgrExtTail.a (formerly SMgrExtTail.a)
;
; Contains: Installation and initialization code at the end of the Script Mgr extensions patch, ptch 27.
;
; Written by: PKE Peter Edberg
; SMB Sue Bartalo
; JH John Harvey
; KSM Kevin MacDonell
; YK Yousuke Kurita
;
; Copyright: © 1989-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <62> 6/17/92 HA #1029756,<PKE>: #1029756 <PKE> make sure that we stuff the real
; vector of StyledLineBreak after moving it to ptch 27.
; <61> 5/19/92 PKE #1030321,<jh>: Add installation of private interface to existing
; NFindScriptRun routine.
; <60> 5/14/92 PKE #1027061,<ha>: Add installation of private ScriptToRange
; routine.
; <59> 5/10/92 SMB #1026551,<pke>: Deleted patch installation code for
; ptchDrawMenuBar since no longer patching this. (See
; ScriptMgrKeyGetSet.a comments for new strategy.)
; <58> 4/30/92 DTY Get rid of debugger breaks that Jeff left lying around.
; <57> 4/29/92 JSM Dont include ScriptMgrDispatch.a and ScriptMgrKetGetSet.a here,
; link them in instead, delete some unneeded include files.
; <56> 4/28/92 JSM Move all resident code to ScriptMgrExtensions.a. Leave tail
; patch ptchLwrString here (compiled only when FixCacheAndStr2Date
; is true), it now jumps to ScriptMgrExtensions.a. Also leave
; GetScaledFontInfo routine here, and make sure it only compiles
; when useInterChar is true since the only place that calls it is
; in RomanNewJust.a under the same condition. This saves some
; space in CubeE. Note that these two things are the only pieces
; of resident code now left in this file, and under the current
; conditional settings none of them are compiled. They probably
; dont work anyway and should be removed, but I left it here.
; Only fix up ROM binds if there are any (i.e. if either of the
; above routines are compiled). Dont include GestaltEqu.a or use
; smgrSysVers conditional anymore.
; <55> 4/22/92 PKE #1026767: (no reviewer before check-in: it is late at night,
; nobody is around, I am going out of town early tomorrow morning,
; and I have to have this in for the a7 build) Don't load handles
; in itl2/itl4 cache, since we no longer cache handles, just IDs.
; <54> 4/22/92 PKE #1027368,<FM>: Move Roman CharType here and make it handle
; direction bit for R-L scripts.
; <53> 4/10/92 SMB #1026551,<pke>: Install head patch to DrawMenuBar to handle
; disabling for Keyboard Menu state.
; <52> 4/10/92 PKE #1026778,<amw>: To make FindWord not depend on having script
; code passed in d2 (script code will not be in d2 when it is
; called from one-byte extension), need to have script code in new
; scriptID field of ScriptRecord. InitScripts must set this up at
; boot.
; <51> 4/8/92 PKE #1025369,<cv>: Holding down Shift should disable loading of
; Simple Scripts (e.g. Cyrillic).
; <50> 4/2/92 PKE #1025998,<ha>: (actually part of fix for bugs #1025998,
; #1025364, #1025998, #1024837) Move Roman GetScript/SetScript
; here and change them to not require selector on the stack, so
; they will work if called from one-byte extension. They used to
; just branch to the unimplemented routine handler, which needed
; the selector. This also fixes an old bug in which Roman
; SetScript did not return the correct error code for bad verbs.
; <49> 2/13/92 PKE #1021419, Cube-E: Change Roman dispatch table to have nil
; (instead of address of unimplemented routine) for IsSpecialFont
; & RawPrinterValues. This makes one-byte extension handle them
; properly.
; <48> 2/11/92 DCL Changed the name of TSMEqu.[aph] to TextServices.[aph] for
; better read-ability.
; <47> 1/7/92 JH InitScripts has a subroutine called FixFond that claims that a2
; contains a ptr to some scripts globals. In actual case, a3
; contains said pointer and a2 contains a ptr to the script's
; itlb. So changing FixFond to reflect this.
; <46> 12/11/91 SMB For CubeE, updated dependencies to include TSMequ.a &
; Component.a.
; <45> 12/10/91 PKE #1017754: For non-ROM builds, move PrintAction here for all
; CPUs, and change it to leave ScriptRecord ptr in a0.
; <44> 12/6/91 PKE #1017161: Make TestLetter available through private Script Mgr
; selector, for use by script systems. Move it to resident code
; section.
; <43> 11/21/91 YK InputUtils were gone. What was that!?
; <42> 11/8/91 SMB #1015613 (for CubeE & Bruges) - Update dependencies to include
; MenuMgrPriv.a.
; <41> 10/28/91 PKE #1014968 (for Cube-E & Bruges): InitScripts should set
; SysFontFam and ApFontId to the values it believes are correct
; even the values already there are in the correct script.
; <40> 10/25/91 YK Don't load an InputUtils resource at init. Unnecessary clearing
; code was commented out.
; <39> 10/23/91 YK Added InitDictionaryMgr and InitInputUtils at the end of
; SMgrInstallExt.
; <38> 10/8/91 PKE For Cube-E (and Bruges): Move remainder of LwrString here from
; ScriptMgrPatch.a (ptch 4), modify to use GetScriptItl and
; SCTransliterate, and add SCLwrString entry; install new
; (currently private) RealScript, Font2RealScript, SCLwrString
; routines in dispatch table (needed for bugs #1013149, #1012949).
; Include IntlUtilsPriv.a. Clean up some more conditionals.
; <37> 9/26/91 PKE For Cube-E (and Bruges): Update InitScripts to initialize
; TESysJust from 'itlc' resource, and to set smgrBidirect and
; smgrDoubleByte according to enabled scripts. Fix
; auto-initialization so Opt-E (on any keyboard!) disables simple
; scripts too; to do this, make some changes in IsCmdChar so we
; can share code. Also conditionalize out some code related to
; interchar spacing in Roman (not used). Remove some conditionals
; for smgrSysVers>=$700 and smgrSysVers>=$606, and remove some old
; code for smgrSysVers<$700.
; <36> 8/22/91 KSM PKE,#Bruges: Nobody told me the ScriptMgr dispatcher left its
; selector on the stack...
; <35> 2/15/91 PKE JSM,#54736: Redo conditionals to move change <34> to Post 7.0.
; Object compare identical to <33>.
; <34> 1/28/91 JH PKE,#54736: Added a comefrom patch to _LowerString so that
; String2Time could use the new Date Cache structure.
; <33> 1/14/91 PKE (stb, except that routine in here by KSM was reviewed by PKE,
; with algorithm review by dba): Allocate handle to ClientLLRecord
; and put handle in SMgrRecord. Add Kevins private FindCharInSet
; routine to be called by Dialog Mgr and Finder.
; <32> 12/10/90 PKE (VL) Add private ReInitScripts routine to be called after net
; booting switches system files. It cleans up Script Mgr data
; structures based on resources in old file, then calls
; InitScripts to set up new structures based on current file.
; <31> 9/17/90 SMB (PKE) NEEDED FOR SIXPACK & SS-606. Must test for itl2 extensions
; before loading FindScriptTable. Bug fixes in FindScriptRun code:
; needed to branch unsigned, special case for length of 1, used .w
; rather than .l when adding to pointers, and slight
; size/performance improvement.
; <30> 9/1/90 PKE When expanding the Roman dispatch table, need to fill in
; BitBucket entries for the two special Kanji selectors, which are
; not implemented in Roman. Otherwise print driver may try to call
; IsSpecialFont or RawPrinterValues for Roman, and crash.
; <29> 8/24/90 PKE CleanupScriptApp should reset ExpandMemRec.emScriptAppGlobals to
; 0 to ensure that we dont try to use a disposed handle.
; <28> 8/2/90 PKE Initialize application-specific Script Mgr globals to all 0.
; <27> 7/25/90 PKE Add private InitScriptApp and CleanupScriptApp routines to be
; called when apps are launched and closed in order to set up and
; delete the new application-specific script globals (which, for
; now, just contain the application itl cache). Renamed
; emItlAppCacheHndl to emScriptAppGlobals.
; <26> 7/20/90 PKE Changes to InitScripts, AddScriptFonts, and patch
; initialization: (1) Move FixSMgrWorld code to InitScripts and
; patch out ROM version entirely. Change script enable loop so IT
; copies extended itlb info into ScriptRecord, instead of doing it
; in patch initialization separately for Roman and simple scripts.
; We now get extended font info from scripts itlb resource
; regardless of the state of the auto-initialization bit. (2) Move
; setting of smgrRegionCode to InitScripts. (3) InitScripts now
; pre-loads the sys itl cache. (4) InitScripts now loops through
; each enabled script and calls its scriptAvail vector (if ≠0).
; (4) AddScriptFonts now loops through each enabled script and
; calls its scriptAddFonts vector (if ≠0). Also, dont bother
; doing ReleaseResource on purgeable resources.
; <25> 7/16/90 PKE Use new names for fields in ExpandMemRec: emItlCache2Ptr becomes
; emItlSysCachePtr, emItlAppCachePtr becomes emItlAppCacheHndl.
; Renamed Cache2Rec to NewItlCacheRec.
; <24> 7/11/90 PKE Added private routine IsCmdChar for checking Command-key combos
; in an international way (needed mainly for Command-period, and
; needed by new standard Filter Proc for dialogs…).
; <23> 7/2/90 PKE Initialize emItlAppCachePtr to -1.
; <22> 6/13/90 PKE Install private RebuildKeybdMenu routine in Script Mgr dispatch
; table.
; <21> 6/7/90 PKE Move GetScaledFontInfo routine here from RomanNewJust. Use BINDs
; so that we jump into ROM code for most of it. Rearrange its
; parameter order for efficiency. Initialize new emNumer and
; emDenom fields in ExpandMemRec.
; <20> 6/5/90 SMB Fixed odd address bug when initializing Roman scriptRecord
; fields scriptValidStyles and scriptAliasStyle from Roman 'itlb'.
; <19> 5/31/90 PKE Install new private routine SetKbdMenuInfo. Initialize Roman
; scriptRecord fields scriptValidStyles and scriptAliasStyle from
; Roman 'itlb'.
; <18> 5/29/90 PKE NEEDED FOR SIXPACK DISK: Moved ParseTable here from ptch 4 so we
; can fix an old unbalanced stack bug in both RAM and ROM
; versions. Also, for 6.x, dont override version number set in
; ROM or ptch 4. The new sections are flagged with <18>.
; <17> 5/24/90 PKE Moved ScriptUtil dispatcher and FontScript, Font2Script,
; IntlScript here (ptch 27) from ScriptMgrUtil.a (ptch 4).
; Combined ScriptUtil dispatcher with special FindWord patches
; that were already here. Changed FontScript, Font2Script,
; IntlScript to default to system script instead of Roman. These
; routines are all in a separate file, ScriptMgrDispatch.a, which
; is included here.
; <16> 5/11/90 PKE Add _AddScriptFonts routine and its installation.
; <15> 5/8/90 PKE Added the meat to InitScripts: it now initializes new sort cache
; and script/lang map tables.
; <14> 5/5/90 PKE NEEDED FOR 6.0.7 AND 7.0: Fixed a bug introduced in <13>: Simple
; scripts were not getting initialized correctly because one of
; the new SimpleTable entries had a value of 0, which terminated
; the table. Changed terminator to be -1. Relevant lines are
; marked <**>. NEEDED ONLY FOR 7.0: Added private ScriptUtil
; routine InitScripts (called by StartSystem.a); it calls
; FixSMgrWorld and then does other extensions that have yet to be
; added. Install InitScripts and Sues InitKeyboardMenu routine
; into Script Mgr dispatch table. Added Sues installation for her
; SystemMenu patch. Added doExpandSMgrDispTable conditional
; symbol.
; <13> 4/26/90 PKE NEEDED FOR 6.0.7: Cleaned up script auto-initialize stuff - use
; SimpleTable loop to initialize scriptVersion, scriptCreator,
; scriptFile instead of of explicitly initializing them.
; <12> 4/10/90 PKE Moved KeyScript, Get/SetEnvirons, and Get/SetScript into a
; separate file ScriptMgrKeyGetSet.a, which is included here.
; Moved all of the roman routines that handle justified text into
; a separate file RomanNewJust.a, which is assembled separately
; and linked in. Moved TruncString, TruncText, and ReplaceText
; into another separate file ScriptMgrTruncRepl.a which is also
; assembled separately and linked in. Adjusted the includes
; accordingly. Wrong version was being put into simple script
; ScriptRecords; fixed it.
; <11> 3/26/90 PKE Conditionalize so ptch 27 can be used in Sys 6.0.7+ to get
; script auto-initialize capability. Use new conditionals
; doScriptMgrGestalt, doScriptMgrLwrString2; otherwise just
; conditionalize on smgrSysVers (need to improve this later).
; <10> 3/22/90 PKE Now initialize Roman font data from 'itlb' resource. Get Help
; Mgr font/size from 'itlb' for all scripts.
; <9> 3/21/90 PKE Changed scrTable so GetScript and SetScript support new
; smScriptAppFondSize and smScriptHelpFondSize verbs.
; <8> 3/21/90 SMB For 7.0, move FindScriptRun here from ptch 4 and modify it to
; handle any simple script using optional table in itl2. Add
; automatic installation of simple scripts.
; <7> 3/5/90 PKE In TruncString/TruncText, changed NTruncX selectors to TruncX.
; <6> 3/2/90 PKE Use new name nItl4Rec for 7.0 extended version of Itl4Rec.
; <5> 2/22/90 PKE For 7.0, moved Char2Pixel, DrawJust, MeasureJust here because we
; patch them out entirely for ROM; added these to NewRomanTable so
; their vectors get filled in. Added new InitJustData,
; AdjustSpChExtra, and RestoreSpChExtra utility routines for
; handling justification parameters with intercharacter spacing,
; using new JustDataRec structure. Added other utility routines
; GetFontSize, DrawGap, SignFixRound. Rewrote (N)PortionText,
; (N)DrawJust, (N)MeasureJust, (N)Char2Pixel and (N)Pixel2Char
; routines to fully implement the new justification model, using
; the above utility routines. Also made the N versions standard
; for these routines, so that the old interfaces just redo the
; stack and fall through to the new routines.
; <4> 1/18/90 PKE Fixed bug introduced in <2>: for most of the installation code,
; a4 was assumed to point to SMgrRecord, but the RomanUtil
; dispatch table update in <2> made it point to the Roman
; ScriptRecord, messing up subsequent initializations; we now
; point it back to SMgrRecord after the RomanUtil dispatch table
; update. Now initialize smgrRegionCode from the itlc resource.
; <3> 1/17/90 PKE Added handling of new GetEnvirons verb smRegionCode.
; <2> 1/11/90 PKE Moved Roman PortionText and Pixel2Char here so we can fix them
; later for all systems (deal with color grafPorts, etc.) and also
; to reduce duplication of code in new interfaces. We may move
; other Roman routines here later. Added crude implementations of
; some new interfaces: NPortionText, NDrawJust, NMeasureJust,
; NChar2Pixel, and NPixel2Char. These ignore styleRunPosition, but
; otherwise behave as specified. Added code to expand the
; RomanUtil dispatch table if necessary (i.e. for ROM version of
; ScriptMgr) and fill in vectors for PortionText, Pixel2Char, and
; new interfaces listed above. Updated header to be in BBS format.
; <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.8> 12/8/89 PKE FOR 7.0: Patch LwrString to handle 2-byte chars via
; Transliterate (yuck), including extensions to handle LwrString
; opcode bits.
; <1.7> 11/8/89 PKE Modify TruncString and TruncText to support both new and old
; calling conventions (with and without truncWhere parameter).
; Implement handling of center truncation (in TruncText).
; <1.6> 10/2/89 PKE Added code in GetEnvirons/SetEnvirons to handle new smKCHRCache
; verb.
; <1.5> 9/18/89 PKE Moved KeyScript here from ptch 4 so we can move 'itlk'
; GetResource after the point at which meta-script numbers are
; mapped to real script numbers and checks are made for script
; installed and enabled. Replaced the _GetScript call in this
; 'itlk' stuff with a direct access to ScriptRecord since we have
; already done the validity checking.
; <1.4> 9/17/89 PKE Better error reporting in TruncText, ReplaceText. Moved
; gestaltScriptMgr function, GetEnvirons/SetEnvirons and
; GetScript/SetScript here from ptch 4 for 7.0 so we can remove
; gestaltScriptMgr and Get/SetScript from PTCH files and so we
; don't have to also add Get/SetEnvirons there. Added new
; smDoubleByte verb for Get/SetEnvirons. Also moved initialization
; of new ScriptRecord font/size fields for Roman system here from
; ptch 4 and PTCH files. Updated Roman Script System version using
; new romanVersPriv constant.
; <1.3> 9/15/89 PKE Change NFindWord references to xNFindWord, do install it again
; in dispatch table - we'll permit direct calls in addition to
; getting to it from the old FindWord selector via the glue. Add
; and install framework code for TruncString, TruncText,
; ReplaceText. Stuff correct version number in SMgrRecord.
; <1.2> 9/5/89 PKE Add ScriptUtil patch which checks for FindWord call, sets up and
; checks tables, and decides between new or old FindWord. Don't
; install NFindWord address in trap table anymore. Include
; 'PackMacs.a'.
; <1.1> 9/4/89 PKE Put new routine addresses into dispatch table pointed to by
; smgrDispTable, expanding it if necessary (i.e. for ROM version
; of Script Mgr).
; <1.0> 9/1/89 PKE Set up framework for 'ptch' resource 27, which contains 7.0
; extensions for Script Mgr. This file and ScriptMgrExtHead.a
; replace SMgrExt.a.
;___________________________________________________________________________________________________
; To Do:
; Figure out best way to use FindWord glue for ROM too.
; Figure out best way to use new initialization stuff for ROM too.
;
;___________________________________________________________________________________________________
blanks on
string asis
LOAD 'StandardEqu.d'
include 'ScriptPriv.a'
include 'PatchMacros.a'
; =============================================================================
; RESIDENT CODE
; Code that is not in ROM <56>
; Note: as the conditionals stand now, none of the following code is used.
; =============================================================================
ROMVersions MacPlus,MacSE,MacII,Esprit,Aurora
FixCacheAndStr2Date equ 0 ; do this for 7.1? (not 7.0.1) <35>
useInterChar equ 0 ; Turn off code related to interchar spacing in Roman <37>
; also defined in RomanNewJust.a
IF FixCacheAndStr2Date THEN ; <34><35>
;
; for ptchComeFromString2Time
; note all the MacPlus,$0 kind of parameters this is only to keep the FixRomAddress macro happy
; the patch code will never be reached on a Plus,SE, or II since String2Time doesn't exist in the ROM
ROMMatchStringJSR BIND (MacPlus,$0),(MacSE,$0),(MacII,$0),(Aurora,$1F664),(Esprit,$19142)
ROMStr2TimeUprText BIND (MacPlus,$0),(MacSE,$0),(MacII,$0),(Aurora,$1F64C),(Esprit,$1912A)
ptchLwrString proc export
; If we are coming from String2Time on Portable or IIci ROMs, change return
; address so we return to ROM through our tail patch. Makes changes in String2Time
; to accomodate new cache structure. Slime central.
bra.s @protection
BackToTrap oldLwrString2 ; Jump back to the Rom
@protection
move.l RomBase,a1 ; note: preserve a0,d0,d1 for LwrString
move.w 8(a1),d2 ; get ROM number as word
cmp.w #Esprit,d2 ; is this a Portable?
beq.s @tweakRetnAddr ; if so, see if we're in String2Time
cmp.w #Aurora,d2 ; is this IIci family?
bne.s @beginRealPatch ; if not, skip check for String2Time
@tweakRetnAddr
CMPBIND ROMStr2TimeUprText,OSTrapReturnAddressDepth(sp) ; From String2Time?
bne.s @beginRealPatch ; if not, just continue with patch
lea ptchComeFromString2Time,a1 ; addr for LwrString to return to
move.l a1,OSTrapReturnAddressDepth(sp) ; so trap returns to patch, not ROM
@beginRealPatch
import NewLwrString ; in ScriptMgrExtensions.a <56>
bra.s NewLwrString ; <56>
endproc
; ----------------------------------------------------------------------------
; Tail patch to LwrString, changes String2Time to use new cache structure <34>
; ----------------------------------------------------------------------------
; include new cache record here
; it will redefine TimeLen, NumTimeStrings
Str15 EQU 16 ; length of string[15]
Str4 EQU 5 ; length of string[4] added for more space-efficient cache <1-8-91jh><10>
Str8 EQU 9 ; length of string[8] ditto <34>
TimeLen equ 4 ; length of time strings
NumDays EQU 7 ; length of various arrays
NumMonths EQU 12
NumTimeStrings equ 4 ; number of time strings ( we now have AM, PM, 24 hour AM, 24 hour PM)
DayList EQU NumDays*Str15
MonthList EQU NumMonths*Str15
maxExtraSeps equ 10 ; count of extra seps in cache, must be at least 1!! <10>
IF maxExtraSeps<1 THEN ; <34>
aerror &concat('maxExtraSeps wrong: ',&i2s(maxExtraSeps)) ; <34>
ENDIF ; <34>
;========================IMPORTANT NOTE,POTENTIAL DANGER===================================
;
; The Data structure below is actually 6 bytes longer than the size of a
; DateCacheRecord. Initially, I fixed it so that the Record fit within 512 bytes
; but that change forced very large patches to String2Date and String2Time in the
; aurora and esprit ROMs.
;
; Since these patches were large and required a fair amount of change to ScriptMgrROMPatch.a
; we rethought fixing the cache so that it fit into 512 bytes and instead opted
; for keeping the fields in identical offsets.
;
; This is not as bad as it sounds (although it is bad, let there be no doubt about that)
; since the last 32 bytes of a tokenBlock are reserved and at this time (7.0 and earlier)
; are neither read from nor written to. For that reason, the fact that the declaration
; below is 6 bytes longer than the memory provided for it is only a forgiveable bit
; of forgetfulness.
;
; However, do NOT read or write any values past the itlResource field of the token block.
; And do NOT do what inside mac and the published headers say to do which is zero out
; the last 32 bytes of the token block. Doing that will TRASH memory. DON'T DO IT.
;========================================================================================
Cache RECORD 0
version ds.w 1
CurrentDate DS LongDateRec
BaseDate DS LongDateRec
theDays DS.B DayList
theMonths DS.B MonthList
theEveStr DS.B Str4 ;use new string definitions to make room for altseps
theMornStr DS.B Str4 ;
the24hrAMStr DS.B Str4 ;
the24hrPMStr DS.B Str4 ;
countAltSeps DS.W 1 ;number of separator tokens <1-8-91, jh>
AltSeps DS.W maxExtraSeps ;contains an array of separator tokens <1-8-91, jh>
filler DS.B 6
theTimeSep DS.W 1
theDateSep DS.W 1
theDateOrder DS.b 1
longDateOrder ds.b 1
theAbbrLen DS.W 1
TBlock DS tokenBlock
CacheSize equ *
theTimeStrings equ theEveStr
ENDR
ptchComeFromString2Time
;ok we came from the _UpperText call in String2Time so set up the stack for a JSR to matchString
;and then JMP back
CLR.W -(SP) ; attempt to find a time string which matches alpha token
MOVE.L A2,-(SP)
WITH TokenRec,Cache
MOVE.W length+2(a3),-(SP) ; push length as integer
MOVE.W #2,-(SP) ; push minlen as integer <2/23/88med>
PEA theTimeStrings(a4) ; array
ENDWITH
MOVE.W #TimeLen,-(SP)
MOVE.W #NumTimeStrings,-(SP)
JMPBIND ROMMatchStringJSR ; jump to the JSR MatchString in the old String2Time
endproc
ENDIF ; FixCacheAndStr2Date
IF useInterChar THEN ; only called in RomanNewJust.a when this conditional is true <56>
; for GetScaledFontInfo <21>
ROMGetFontInfoPlus14H BIND (MacPlus,$8E98),(MacSE,$13608),(MacII,$19A88),(Esprit,$20046),(Aurora,$29434)
;------------------------------------------ <5><21>
;
; PROCEDURE GetScaledFontInfo(VAR info: FontInfo; numer, denom: Point);
;
; Just modifies the beginning of GetFontInfo, then jumps into ROM for
; the rest.
;
proc
export GetScaledFontInfo
NUMER EQU -4 ;POINT
DENOM EQU NUMER-4 ;POINT
VARSIZE EQU DENOM ;TOTAL LOCALS
GetScaledFontInfo
move.l (sp)+,a0 ; pop return address
move.l (sp)+,d1 ; pop denom
move.l (sp)+,d0 ; pop numer
move.l a0,-(sp) ; restore return address
; Now we are set up like GetFontInfo call, but scaling params are in d0 and d1.
LINK A6,#VARSIZE ;ALLOCATE LOCALS
MOVE.L d0,NUMER(A6) ;set numer to scaling value
MOVE.L d1,DENOM(A6) ;set denom to scaling value
JMPBIND ROMGetFontInfoPlus14H ; jump into ROM
endproc
ENDIF ; useInterChar <56>
; =============================================================================
; END RESIDENT CODE
; =============================================================================
CutBackPt Proc Export
; EntryTable YourTrap,YourTrapID
EntryTable 0 ; <=== Last table entry
EndProc
; =============================================================================
; BEGIN INSTALL CODE
; =============================================================================
SMgrInstallExt Proc Export ; init routine
Import CutBackPt
Import CodeEntry
With SMgrRecord
; begin init code
; -----------------------------------------------------------------------------
; The FixRomAddresses macro has to be located after the last bind macro in the
; code, but has to be executed before any of them. So we put it at the end and
; BSR to it.
IF (FixCacheAndStr2Date OR useInterChar) THEN ; <56>
bsr DoFixRomAddresses ; there are only ROM binds if one of the above is true
ENDIF ; <56>
movem.l d3/a2-a4,-(sp)
GetSMgrCore a4 ; get pointer to SMgrRecord
; -----------------------------------------------------------------------------
; update ScriptUtil dispatch table
;
smLowCall32 equ smLowCall++$FFFF0000 ; make longint; assumes smLowCall<0
move.l smgrDispTable(a4),a3 ; get pointer to DispTable
move.w smgrDispLow(a4),d1 ; get old low limit
cmp.w #smLowCall,d1 ; how low does table go?
ble.s @tableSizeOk ; if low enough, skip resizing
; need to allocate bigger table, copy old contents
moveq #0,d0 ; for longizing
move.w smgrDispHigh(a4),d0 ; get current high limit
add.w d0,d0 ; make long offset
move.l d0,d2 ; save for later
sub.w #2*(smLowCall32-2),d0 ; subtract new low offset (negative)
_NewPtr sys,clear ; now a0 points to new space
bne ErrExit ; if error, bail
lea -2*smLowCall32(a0),a2 ; ptr to new entry for selector=0
add.w d1,d1 ; old low offset
lea 0(a3,d1.w),a0 ; pointer to start of old table vectors
move.l a0,a3 ; save for _DisposPtr
lea 0(a2,d1.w),a1 ; pointer to same place in new table
move.l d2,d0 ; high offset; already longized!
sub.w d1,d0 ; subtract low offset
addq #4,d0 ; need 1 long more than difference
_BlockMove ; move old vectors to new place
bne ErrExit ; if error, bail
move.l a3,a0 ; pointer to start of old space
_DisposPtr ; dispose of it; don't care if we fail
move.l a2,a3 ; new DispTable pointer in a3
move.l a3,smgrDispTable(a4) ; new DispTable pointer in globals
move.w #smLowCall,smgrDispLow(a4) ; new low limit in globals
@tableSizeOk
; now fill in real addresses for new routines.
lea NewUtilTable,a1
lea CodeEntry,a2
@fillLoop
move.l (a1)+,d0 ; routine offset in low word
beq.s @doneFill ; if terminator, quit
lea 0(a2,d0.w),a0 ; get routine address
swap d0 ; get selector from high word
add.w d0,d0 ; make long offset
move.l a0,0(a3,d0.w) ; put in dispatch table
bra.s @fillLoop
@doneFill
; -----------------------------------------------------------------------------
; update RomanUtil dispatch table <2>
move.l smgrEntry+(smRoman*4)(a4),d0 ; Roman ScriptRecord ptr
beq.s @romanDoneFill ; if 0, no disp table!
move.l d0,a4 ; copy pointer
with ScriptRecord
move.l scriptDispTable(a4),a3 ; get pointer to DispTable
move.w scriptDispHigh(a4),d1 ; get old high limit
cmp.w #sisHighCall,d1 ; how high does table go?
bge.s @romanTableSizeOk ; if high enough, skip resizing
; need to allocate bigger table, copy old contents
moveq #0,d0 ; for longizing
move.w #sisHighCall+2,d0 ; get desired high limit (>0)
sub.w scriptDispLow(a4),d0 ; subtract current low limit (>0)
add.w d0,d0 ; size for longs, not words
_NewPtr sys,clear ; now a0 points to new space
bne ErrExit ; if error, bail
move.l a0,a2 ; save new pointer
move.l a3,a0 ; beginning of old table
move.l a2,a1 ; beginning of new table
moveq #0,d0 ; for longizing
move.w scriptDispHigh(a4),d0 ; get old high limit
sub.w scriptDispLow(a4),d0 ; subtract old low limit
addq.w #2,d0
add.w d0,d0 ; now we have size of old table
_BlockMove ; move old vectors to new place
bne ErrExit ; if error, bail
move.l a3,a0 ; pointer to start of old space
_DisposPtr ; dispose of it; don't care if we fail
move.l a2,a3 ; new DispTable pointer in a3
move.l a3,scriptDispTable(a4) ; new DispTable pointer in globals
move.w #sisHighCall,scriptDispHigh(a4) ; new low limit in globals
@romanTableSizeOk
; now fill in real addresses for new routines.
; assumes new scriptDispTable pointer in a3, ScriptRecord pointer in a4
lea NewRomanTable,a1
lea CodeEntry,a2
@romanFillLoop
move.l (a1)+,d0 ; get routine offset in low word
beq.s @romanDoneFill ; if terminator, quit
movea.l #0,a0 ; assume 0 entry in dispatch table <49>
tst.w d0 ; is this what we want? <49>
beq.s @gotAddress ; if so, leave it as 0 <49>
lea 0(a2,d0.w),a0 ; otherwise get real routine address
@gotAddress ; <49>
swap d0 ; get selector from high word
sub.w scriptDispLow(a4),d0 ; make word offset in table
add.w d0,d0 ; make long offset
move.l a0,0(a3,d0.w) ; put in dispatch table
bra.s @romanFillLoop
endwith
@romanDoneFill
; -----------------------------------------------------------------------------
; install ScriptUtil patch <1.2> remove conditionals <37>
InstToolTp xScriptUtil,$0B5
; -----------------------------------------------------------------------------
; update version number <1.3>
;
; The GetSMgrCore below was commented out; uncomment it because we blew a4 away
; with the RomanUtil dispatch table update in <2> above. <4>
GetSMgrCore a4 ; get pointer to SMgrRecord
move.w #smgrVersPriv,smgrVersion(a4) ; <18>
; ----------------------------------------------------------------------------- <45>
; Install new PrintAction routine
;; GetSMgrCore a4 ; get pointer to SMgrRecord
import PrintAction ; <56>
lea PrintAction,a0
move.l a0,smgrPrint(a4)
; -----------------------------------------------------------------------------
; Inactivate sVectFixSMgrWorld vector. <14><25>
;
; We want to inactivate the old sVectFixSMgrWorld vector by stuffing the
; address of an rts. This ensures that any calls from the ROM InitWindows
; or InitResources to FixSMgrWorld will be harmless.
;; GetSMgrCore a4 ; get pointer to SMgrRecord
import KillOldFixWorldVec ; <56>
lea KillOldFixWorldVec,a0
move.l a0,sVectFixSMgrWorld(a4)
; -----------------------------------------------------------------------------
; Initialize new emNumer and emDenom fields in ExpandMem <21>
; Also initialize emScriptAppGlobals field. <23><27>
;
with ExpandMemRec
move.l ExpandMem,a0
move.l #$00010001,d0
move.l d0,emNumer(a0)
move.l d0,emDenom(a0)
move.l #-1,emScriptAppGlobals(a0) ; <23><27>
endwith ;ExpandMemRec
; -----------------------------------------------------------------------------
; update Roman version no. <1.4><11>
;
; moved initialization of Roman font and style info from here to InitScripts <26>
;
with ScriptRecord
;; GetSMgrCore a4 ; get pointer to SMgrRecord
move.l smgrEntry+(smRoman*4)(a4),a2 ; Roman ScriptRecord pointer
move.w #romanVersPriv,scriptVersion(a2) ; set version no. <1.4>
endwith ;ScriptRecord
; -----------------------------------------------------------------------------
; Install Script Manager's Gestalt selectors. <1.4>
import gestaltScriptMgr,gestaltSMgrTable
lea gestaltSMgrTable,a2 ; table of Gestalt selectors
; and GetEnvirons verbs
@loopInstallGestalt
move.l (a2)+,d0 ; get next Gestalt selector
beq.s @doneInstallGestalt ; 0 means we're done
addq.l #2,a2 ; skip GetEnvirons verb
lea gestaltScriptMgr,a0 ; push gestaltFunction ProcPtr
_NewGestalt
; ignore OSErr in d0 (what can
; we do if it is not noErr?)
bra.s @loopInstallGestalt
@doneInstallGestalt
; -----------------------------------------------------------------------------
; install LwrString patch for 2-byte chars <1.8>
IF FixCacheAndStr2Date THEN ; <34><35>
PatchOSJump oldLwrString2,$56 ; for our _LwrString come from patch in
; String2Date (aurora, esprit only)
InstOSTp ptchLwrString,$56 ; …and then install patch
ELSE ; <56>
InstOSTp NewLwrString,$56 ; in ScriptMgrExtensions.a <56>
ENDIF
; -----------------------------------------------------------------------------
; Allocate handle to ClientLLRecord and put handle in SMgrRecord. <33>
IF useInterChar THEN ; <33><37>
with ClientLLRecord
move.l IntlSpec,a1
move.l #cllRecSize,d0
_NewHandle
bne.s @doneAllocClientLLRec
move.l a0,smgrClientLLRecHndl(a1)
endwith ;ClientLLRecord
@doneAllocClientLLRec
ENDIF ; <33>
; -----------------------------------------------------------------------------
; Perform auto-initialization of script systems based on info in their itlb <8>
; Skip if Opt-E or Shift <37><51>
btst #0,KeyMap+7 ; shift key down? <51>
bne DoneAutoInit ; if yes, skip script install <51>
btst #2,KeyMap+7 ; option key down? <37>
beq.s @noSkipInstall ; no, skip check. <37>
subq #2,sp ; make room for Boolean result <37>
move.w #'e',-(sp) ; push 'e' as the char to test for <37>
import iTestLetter ; <56>
bsr iTestLetter ; returns TRUE if key with Roman 'e' being pressed <37>44>
tst.b (sp)+ ; what was the result? <37>
bne DoneAutoInit ; if Opt-e, skip script install <37>
@noSkipInstall ; <37>
; no Opt-E, go ahead
with scriptRecord,itlbRecord,ItlbExtRecord
GetSMgrCore a4 ; reset a4 to point to SMgrRecord
move.w #smgrCount-1,d3 ; for all entries.
@SimpleLoopStart
move.w d3,d0 ; copy index.
lsl.w #2,d0 ; long word offset.
move.l smgrEntry(a4,d0.w),d0 ; script installed?
bne @NextSimple ; yes -> try next entry.
subq.l #4,sp ; make room for handle.
move.l #'itlb',-(sp) ; push bundle type.
move.w d3,-(sp) ; push bundle number.
_GetResource ; load the resource.
move.l (sp)+,d0 ; handle = nil?
beq @NextSimple ; yes -> try next entry.
; we have a prospective itlb, so check if the simple bit is on
move.l d0,a3 ; load bundle handle.
move.l (a3),a0 ; load bundle pointer.
btst.b #smsfAutoInit,itlbFlags+1(a0) ; auto-init it? (+1 for mem test)
beq @ReleaseSimple ; no, try next one
; we have a simple script, so allocate the record, load the font numbers
move.l itlbLocalSize(a0),d0 ; requested size for script locals
cmp.l #scriptSize,d0 ; must be ≥ ScriptRecord size
bcc.s @doneFixLocalRecordSize ; if it already is, skip fix
move.l #scriptSize,d0 ; if too small, fix it
@doneFixLocalRecordSize
_NewPtr sys,clear ; allocate script local data
bne ErrExit ; if error, bail
move.l a0,a2 ; save entry pointer.
move.w d3,d0 ; get script number
asl.w #2,d0 ; *4 for long array
move.l a2,smgrEntry(a4,d0.w) ; store in SMgr globals.
; Use SimpleTable to initialize scriptVersion, scriptCreator, scriptFile instead <13>
; of explicitly initializing them here.
; Copy font information from itlb, and check it.
; For 7.0, this is moved to InitScripts. <26>
; copy relevant entries from Roman ScriptRecord to simple ScriptRecord
; a2=simple ScriptRecord
move.l smgrEntry+(smRoman*4)(a4),a0 ; address of roman globals
lea SimpleTable,a1 ; load table pointer.
@SimpleEntryLoop
move.w (a1)+,d0 ; get offset (and trap code).
blt.s @ReleaseSimple ; last entry is -1. <14><**>
move.w 0(a0,d0.w),0(a2,d0.w) ; copy Roman word to simple scriptRecord
bra.s @SimpleEntryLoop ; do the next routine.
@ReleaseSimple
; Don't bother releasing anymore <26>
@NextSimple
subq #1,d3 ; don't do Roman
bgt.s @SimpleLoopStart ; keep going until 0 or less
bra DoneAutoInit ; clean exit <37>
endWith ;
; -----------------------------------------------------------------------------
; Table of ScriptRecord fields to copy from Roman when auto-initializing
; a script.
;
; Moved initialization of scriptVersion, scriptCreator, scriptFile here instead <13>
; of explicitly initializing them above.
;
; Changed terminator to be -1, cause one of the fields we want to initialize <14><**>
; with this table has an offset of 0.
; -----------------------------------------------------------------------------
SimpleTable
with ScriptRecord
dc.w scriptVersion ; <13>
dc.w scriptCreator ; <13>
dc.w scriptCreator+2 ; (long) <13>
dc.w scriptFile ; <13>
dc.w scriptFile+2 ; (long) <13>
dc.w scriptDispTable
dc.w scriptDispTable+2 ; (long)
dc.w scriptDispLow
dc.w scriptDispHigh
dc.w scriptPrint
dc.w scriptPrint+2 ; (long)
dc.w scriptTrap
dc.w scriptTrap+2 ; (long)
dc.w scriptName
dc.w scriptName+2 ; (long)
dc.w $ffff ; now -1 is terminator <14><**>
endwith
DoneAutoInit
;____________________________________________________________________________ <14>
; Installing head patch to SystemMenu to handle Keyboard Menu.
import ptchSystemMenu
move.w #$1B5,d0 ; SystemMenu trap number
_GetTrapAddress ; returns in a0
move.l IntlSpec,a1
move.l a0,sVectOldSystemMenu(a1)
InstToolTp ptchSystemMenu,$1B5
;------------------------------------------------------------------------------
;
bsr InitDictionaryMgr
; -----------------------------------------------------------------------------
; end init code
Exit
movem.l (sp)+,d3/a2-a4
lea CutBackPt,a0 ; <=== Keep these two lines…
Rts ; <=== in any case
ErrExit
move.w #dsSysErr,d0 ; load generic error
_SysError ; system error!
bra.s Exit
;=======================================================================
;
; InitDictionaryMgr
; Called to load the 'dimg' file which contains the
; Dictionary Manager code. We load the resources stick
; them into expand mem, and call it a day.
; JH, 10-9-91
;========================================================================
InitDictionaryMgr
with ExpandMemRec
clr.l -(sp) ;room for our handle
move.l #'dimg',-(sp) ;looking for a 'dimg' resource
move.w #-16385,-(sp) ;with an id of -16385
move.w #MapFalse,RomMapInsert ;don't load it
_GetResource ;see if we can get it
move.l ExpandMem,a0 ;ptr to expandmem rec into a0
move.l (sp)+,emDictionaryMgrPackHandle(a0) ;move the handle into our expandmem handle
; move.w #0,emDictionaryMgrUseCount(a0) ;0 our count
rts
endwith ;ExpandMemRec
; -----------------------------------------------------------------------------
; *** We need a better way to handle the conditionals here. The table here needs <14>
; *** to be sized depending on the min and max codes for a given set of
; *** conditionals, and the installation code needs to fill in BitBucket for any
; *** holes. This won't work correctly if any of the conditionals below happen
; *** not to be equal to (smgrSysVers >= $700).
NewUtilTable
import FontScript ; <17>
dc.w smFontScript,FontScript-CodeEntry ; <17>
import IntlScript ; <17>
dc.w smIntlScript,IntlScript-CodeEntry ; <17>
import Font2Script ; <17>
dc.w smFont2Script,Font2Script-CodeEntry ; <17>
import RealScript ; <38>
dc.w smRealScript,RealScript-CodeEntry ; <38>
import Font2RealScript ; <38>
dc.w smFont2RealScript,Font2RealScript-CodeEntry ; <38>
import SCLwrString ; <38>
dc.w smSCLwrString,SCLwrString-CodeEntry ; <38>
import xTestLetter ; <44>
dc.w smTestLetter,xTestLetter-CodeEntry ; <44>
import ScriptToRange ; <60>
dc.w smScriptToRange,ScriptToRange-CodeEntry ; <60>
import NFindScriptRun ; <61>
dc.w smNFindScriptRun,NFindScriptRun-CodeEntry ; <61>
import StyledLineBreak ; <62>
dc.w -2,StyledLineBreak-CodeEntry ; <62>
import GetEnvirons ; <1.4><12>
dc.w smGetEnvirons,GetEnvirons-CodeEntry ; <1.4><12>
import SetEnvirons ; <1.4><12>
dc.w smSetEnvirons,SetEnvirons-CodeEntry ; <1.4><12>
import GetScript ; <1.4><12>
dc.w smGetScript,GetScript-CodeEntry ; <1.4><12>
import SetScript ; <1.4><12>
dc.w smSetScript,SetScript-CodeEntry ; <1.4><12>
import KeyScript ; <1.5><12>
dc.w smKybdScript,KeyScript-CodeEntry ; <1.5><12>
import xNFindWord ; <1.3>
dc.w smNFindWord,xNFindWord-CodeEntry ; <1.3>
import TruncString ; <1.3><12>
dc.w smTruncString,TruncString-CodeEntry ; <1.3><12>
import TruncText ; <1.3><12>
dc.w smTruncText,TruncText-CodeEntry ; <1.3><12>
import ReplaceText ; <1.3><12>
dc.w smReplaceText,ReplaceText-CodeEntry ; <1.3><12>
import InitScripts ; <14>
dc.w smInitScripts,InitScripts-CodeEntry ; <14>
import AddScriptFonts ; <16>
dc.w smAddScriptFonts,AddScriptFonts-CodeEntry ; <16>
import IsCmdChar ; <24>
dc.w smIsCmdChar,IsCmdChar-CodeEntry ; <24>
import InitScriptApp ; <27>
dc.w smInitScriptApp,InitScriptApp-CodeEntry ; <27>
import CleanupScriptApp ; <27>
dc.w smCleanupScriptApp,CleanupScriptApp-CodeEntry ; <27>
import ReInitScripts ; <32>
dc.w smReInitScripts,ReInitScripts-CodeEntry ; <32>
import FindCharInSet ; <33>
dc.w smFindCharInSet,FindCharInSet-CodeEntry ; <33>
import InitKeybdMenu ; <14>
dc.w smInitKeybdMenu,InitKeybdMenu-CodeEntry ; <14>
import SetKbdMenuInfo ; <19>
dc.w smSetKbdMenuInfo,SetKbdMenuInfo-CodeEntry ; <19>
import RebuildKeybdMenu ; <22>
dc.w smRebuildKeybdMenu,RebuildKeybdMenu-CodeEntry ; <22>
dc.l 0 ; terminator
NewRomanTable
import Char2Pixel ; <5>
dc.w smChar2Pixel,Char2Pixel-CodeEntry ; <5>
import Pixel2Char ; <2>
dc.w smPixel2Char,Pixel2Char-CodeEntry ; <2>
import DrawJust ; <5>
dc.w smDrawJust,DrawJust-CodeEntry ; <5>
import MeasureJust ; <5>
dc.w smMeasureJust,MeasureJust-CodeEntry ; <5>
import PortionText ; <2>
dc.w smPortionText,PortionText-CodeEntry ; <2>
;; import BitBucket ; <30>
;; dc.w smIsSpecialFont,BitBucket-CodeEntry ; <30>
;; dc.w smRawPrinterValues,BitBucket-CodeEntry ; <30>
dc.w smIsSpecialFont,0 ; <49>
dc.w smRawPrinterValues,0 ; <49>
import NChar2Pixel ; <2>
dc.w smNChar2Pixel,NChar2Pixel-CodeEntry ; <2>
import NPixel2Char ; <2>
dc.w smNPixel2Char,NPixel2Char-CodeEntry ; <2>
import NDrawJust ; <2>
dc.w smNDrawJust,NDrawJust-CodeEntry ; <2>
import NMeasureJust ; <2>
dc.w smNMeasureJust,NMeasureJust-CodeEntry ; <2>
import NPortionText ; <2>
dc.w smNPortionText,NPortionText-CodeEntry ; <2>
import FindScriptRun ; <8>
dc.w smFindScriptRun,FindScriptRun-CodeEntry ; <8>
import ParseTable ; <18>
dc.w smParseTable,ParseTable-CodeEntry ; <18>
import RomanGetScript, RomanSetScript ; <50>
dc.w smGetScript,RomanGetScript-CodeEntry ; <50>
dc.w smSetScript,RomanSetScript-CodeEntry ; <50>
import CharType ; <54>
dc.w smCharType,CharType-CodeEntry ; <54>
dc.l 0
EndWith
IF (FixCacheAndStr2Date OR useInterChar) THEN ; <56> only needed if one of these is true
DoFixRomAddresses ; <21>
FixRomAddresses ; new macro <21>
rts ; <21>
ENDIF ; <56>
EndProc
END