From: mheiskan@snakemail.hut.fi (Mika Heiskanen)
Subject: Re: (up/dn)MATCH Q's...
Reply-To: mheiskan@.vipunen.hut.fi
Organization: Helsinki University of Technology, Finland
	<1992Nov3.220518.9744@tamsun.tamu.edu>
	<ins534z.721012871@aurora.cc.monash.edu.au>
Date: 06 Nov 92 16:50:57 GMT

In article <ins534z.721012871@aurora.cc.monash.edu.au> ins534z@aurora.cc.monash.edu.au (Quetzal) writes:

>The RULES menu does this by operating on a string containing the algebraic,
>I'm led to believe.  It formats it for the EquationWriter, but all it
>is is a string.  Consult an expert on this.  I'm not.

No, it is a Meta object. Commands in rules menu work like this:

For each internal function the are the so called algebraic flags. One of them
is for indicating that there is a pointer after the program itself pointing
to a list of rules commands that suit that particular function. These are
then appended to the rules that work for all commands, ie DNEG, DINV etc.
This list is then shown in the rules menu.
When you press one of these keys, you start a primitive code object that
calls a special dispatching routine, which checks *addresses* of the first
objects in the meta. After that, the eqwr display is rebuilt.
For an example here's a disassembly of the primitive executed by TRG*:

5C91D P  MTRG*

5C91D:5C922 Prefixed MC    |  
5C922:34E2EB5   LC(5)   #5BE2E  ; rf r_x+ 
5C929:8F9F6F5   GOSBVL  #5F6F9  ; mc NS:ObDispatch 
5C930:31000             | :: xSIN       | :: HP:x+      | Any   | Any   | Any
5C935:29E200F0650       ; ROMPTR 240 86
5C940:32000             | :: xSIN       | :: HP:x-      | Any   | Any   | Any
5C945:29E200F0650       ; ROMPTR 240 86
5C950:41000             | :: xCOS       | :: HP:x+      | Any   | Any   | Any
5C955:29E200F0750       ; ROMPTR 240 87
5C960:42000             | :: xCOS       | :: HP:x-      | Any   | Any   | Any
5C965:29E200F0750       ; ROMPTR 240 87
5C970:61000             | :: xSINH      | :: HP:x+      | Any   | Any   | Any
5C975:29E200F0950       ; ROMPTR 240 89
5C980:62000             | :: xSINH      | :: HP:x-      | Any   | Any   | Any
5C985:29E200F0950       ; ROMPTR 240 89
5C990:71000             | :: xCOSH      | :: HP:x+      | Any   | Any   | Any
5C995:29E200F0A50       ; ROMPTR 240 90
5C9A0:72000             | :: xCOSH      | :: HP:x-      | Any   | Any   | Any
5C9A5:29E200F0A50       ; ROMPTR 240 90
5C9B0:81000             | :: xTANH      | :: HP:x+      | Any   | Any   | Any
5C9B5:29E200F0B50       ; ROMPTR 240 91
5C9C0:82000             | :: xTANH      | :: HP:x-      | Any   | Any   | Any
5C9C5:29E200F0B50       ; ROMPTR 240 91
5C9D0:51000             | :: xTAN       | :: HP:x+      | Any   | Any   | Any
5C9D5:29E200F0850       ; ROMPTR 240 88
5C9E0:52000             | :: xTAN       | :: HP:x-      | Any   | Any   | Any
5C9E5:29E200F0850       ; ROMPTR 240 88
5C9F0:F                 ; End of Data

Thus TRG* does transform (In MATCH terminology):
SIN(&1+&2), SIN(&1-&2) ... TAN(&1-&2).

This dispatching is much faster than using the match commands. That is why
for instance COLCT uses some of these primitives. Should anybody want to
use these entries, just look into entries.Z around address 5C000 and the
comments for ObDispatch at 5F6F9.

The old disassembler in seq doesn't disassemble these calls correctly. I'll
update it as soon as I've gone through the entries again. Until then you're
free to email and ask for the source.

--
--> mheiskan@vipunen.hut.fi