CMD-Shift-3
Volume Number: 2
Issue Number: 8
Column Tag: Assembly Language Lab
CMD-Shift-3 Patch for the New ROMS 
By Harvey Grosser, Oakland, CA
Menu Snapshots with the new ROMs
As was described in the July MacTutor, attempting to take a screen dump with a
menu pullled down on a machine with the 128K ROM results in the menu snapping up
before the dump is taken. Also, on both old and new ROMs, pulling down a menu results
in the Alarm clock (and any other desk accessories which require periodic updates)
freezing, because no call is made to SystemTask by the Menu Manager. This short patch
fixes both of these problems.
First, we need to patch the menu definition 0 resource in the system file. To do
that, start up ResEdit and open the system file. Select MDEF 0 resource. Double-click
on it and insert the following code at the beginning of the resource:
9EFC 0012 3F3C 0008
486F 0004 A970 DEFC
0012 A9B4
You may want to set the system heap flag as well to improve performance. This
will cause it to be loaded once by the Finder and then remain on the system heap for
subsequent applications.
Fig. 1 It Works Again on a Mac Plus!
Now close and save the system file. Assemble and link the INIT resource at the
end of this article, and paste it into your system file. (Note: Make sure that the ID of
this INIT, (17), does not duplicate that of an existing one-change if if necessary.)
When you run an application, you will find that pressing Command-Shift-3 with a menu
pulled down results in a screen dump being taken immediately, without waiting for the
mouse to be released. This permits multiple snapshots to be taken from the same menu
without having to pull it down each time, a boon when documenting a long menu. Also,
desk accessories will no longer freeze when a menu is down, although they will still
freeze when the cursor is in an unused part of the menu bar.
How it Works
This is the source code for this patch above:
SUBA.W #18,SP ;stack space for evt record, result
MOVE.W #8,-(SP) ;keydown event mask
PEA 4(SP) ;address of evt record VAR param
_GetNextEvent
ADDA.W #18,SP ;discard function result & event rec
_SystemTask ;allow DAs to work
Since the menu definition function is executed repeatedly while a menu is pulled
down, this results in calls to GetNextEvent with an event mask which permits it to take
key down events from the system event queue. When it sees one of these, it executes the
appropriate FKEY routine if a Command-Shift-number key combination was pressed.
The call to SystemTask permits desk accessories to run. The INIT routine is necessary
because the new resource manager uses the MDEF 0 in ROM rather than the one in the
System File. (See the Aug. '85 issue of MacTutor for info on the INIT resources.) The
patch functions by setting ROMmapInsert to 0 before every call to GetResource when
the type asked for is MDEF or FONT. (This permits editing the Chicago font, some
characters of which I consider really bad.) It is necessary to patch GetResource
directly like this because the Menu Manager always sets ROMmapInsert to TRUE before
making the call. I would really appreciate it if someone out there could give the exact
meaning of the individual bytes at $B9E (ROMmapInsert) and $B9F (TempResLoad);
Apple's Tech Note #57 is rather vague on this.
; MDEFINIT.ASM
; place this INIT in system file
; to fix cmd-shift-3 bug
; Place this patch in MDEF 0
; resource (at beginning), in
; your system file:
;
; 9EFC 0012 3F3C 0008
; 486F 0004 A970 DEFC
; 0012 A9B4
;
; Patch meaning:
;
; SUBA.W #18,SP
; MOVE.W #8, -(SP)
; PEA 4(SP)
; _GETNEXTEVENT
; ADDA.W #18,SP
; _SYSTEMTASK
;
INCLUDE MACTRAPS.D
GetResource equ $A9A0 ;trap address
ROM85 equ $28E ;new ROM= $7FFF
RomMapInsert equ $B9E
RESOURCE 'INIT' 17 'MDEF Init' $50 ;SysHeap+locked
start:
BRA.W after
patch:
CMPI.L #'MDEF', 6(SP) ;check type
BEQ.S @1 ;for MDEF or FONT;
CMPI.L #'FONT', 6(SP) ;if not,
BNE.S jump ;don't change map
@1:
CLR.W ROMmapInsert
jump:
JMP $12345678 ;filled in by init routine
after:
LEA start,A0
_RecoverHandle ;handle to proc
TST.W ROM85 ;new roms? (7FFF)
BPL.S newROM ;yes, go for it
_DisposHandle ;no, forget it
RTS ;and exit
newROM:
MOVE.L #after-start,D0 ;get our size
_SetHandleSize ;chop off init routine
MOVE.W #GetResource,D0
_GetTrapAddress ;addr of GetResource
LEA jump+2,A1 ;paste it into patch
MOVE.L A0, (A1) ;patch it
LEA patch, A0
MOVE.W #GetResource,D0
_SetTrapAddress ;install patch
RTS
END