[comp.sys.mac.programmer] Further Adventures with the Option Key...

pete@titan.rice.edu (Pete Keleher) (12/02/89)

Ok. I don't really know what LSC is doing with this CallPascal business, and
besides, Amanda used assembly. 

I know assembly.

So, I quickly whipped up an assembly version where I did EVERYTHING myself.
It now works MUCH better. No crashes, no address error. Unfortunately, it
doesn't work either. The bits may or may not be twiddled, but option-a still
prints out a funny-looking char. To see if I was in the right place, I nulled
out the entire 16-bit keyCode quantity instead of twiddling with it. No change.
"Is this thing really getting called?", says I. So, I put a "jsr (a5)" in at
the beginning of my trap code, and everything died as expected.

It's getting called, but it doesn't seem to make any difference. 

=============================================================================


static
__GetTrapAddr()
{
	asm {
		bsr.s	@1
		dc.l	0			;  store trap address here
@1		move.l	(sp)+,a0
	}
}

asmblyTry()
{
	asm 
	{
		move.w	6(sp),d0	; get the modifiers param
		move.w	d0,d1		; get two copies of the modifiers
		move.w	d0,d2		
		andi.w	#cmdKey,d1	; get 'cmdKey' bit in d1
		lsr.w	#1,d1		; shift into the 'optionKey' position
		andi.w	#optionKey,d2	; get 'optionKey bit in d2
		lsl.w	#1,d2		; shift into the 'cmdKey' position
		or.w	d1,d2		; get the switched bits into one reg*/
		andi.w	#0xe7ff,d0	; mask off the two bits in the original copy
		or.w	d2,d0		; set the switched bits in the origninal copy
		move.w	d0,6(sp)	; and write the modified flags back into the param
	}
	__GetTrapAddr();			/* puts the location of the trap address in a0 */
	asm
	{
		move.l	(a0),a0		; get the trap address from our location
		jmp		(a0)		; Jump to the silly trap
	}
}


initappl()
{
	extern char	last_uncomp_pat[];
	
	wins.next = (win_t *)&wins;
	wins.prev = (win_t *)&wins;
	last_pat[0] = last_uncomp_pat[0] = 0;
	init_menus();
	initBindings();
	initOptions();

	keyTransAddr = NGetTrapAddress((int)0xac93,ToolTrap);
	__GetTrapAddr();
	asm
	{
		move.l	keyTransAddr,(a0)		; store the trap address
	}
	NSetTrapAddress(asmblyTry,(int)0xac93,ToolTrap);
	if (NGetTrapAddress((int)0xac93,ToolTrap) != (long)asmblyTry)
	{
		SysBeep(1);
		Debugger();
	}
}
--

===========================================================================
Pete Keleher						pete@titan.rice.edu

Rice University knows nuttin about what I say, or what I do ...
===========================================================================

amanda@intercon.com (Amanda Walker) (12/02/89)

I think you want 8(sp) instead of 6(sp).  You could also use BTST and BSET/BCLR
instructions to do the bit fiddling...

Aside from that it looks like you're on the right track.

--
Amanda Walker
InterCon Systems Corporation
amanda@intercon.com