[LMH]Re: LispM-Hackers digest, Vol 1 #190 - 1 msg
Steve Krueger
stevelisp@grape-krueger.com
Sat Jul 12 21:39:00 2003
Nyef wrote:
>Does anyone have any ideas for what to do about emulating DTP-U-Entry
>"functions"? I'm going to take a stab at getting the U-Entry for LIST
>working tomorrow...
>
>
>
OK. I'm looking at the old microcode for this one. I don't think this
changed in any way in VM2.
Remember that the functional calling microcode dispatches on the
datatype of the object being called and almost any datatype is actually
a valid function. (Aside: This dispatch table is called D-QMRCL. We
always thought the MIT folks called it that because its a miracle when
it works!) If the object is a DTP-U-Entry object, the following is the
algorithm to resolve it to a microcode routine:
1. Treat the pointer field of the DTP-U-Entry as an integer. Check that
it is in range for uentries (compare to A-AMCENT). Trap if out of range
(ERROR-TABLE MICRO-CODE-ENTRY-OUT-OF-RANGE).
2. Use the entry number to index into the microcode entry area
(A-V-MICRO-CODE-ENTRY-AREA).
3. If the word is not a fixnum. Then this isn't really a microcoded
function so try the call again with this object as the called function.
4. If the selected word in the microcode entry area is a fixnum, then it
is a microcode entry. Save the fixnum for later use.
5. The args info word is in another table, the microcode entry args info
area (A-V-MICRO-CODE-ENTRY-ARGS-INFO-AREA).
6. Set M-AP (args pointer) to the new frame.
7. Use the args descriptor to check for too many or too few args.
8. Check for and handle PDL buffer overflow.
9. Copy the args to the top of stack.
10. Build the entry state word. (This might be a bit different in VM2).
This is the same as for a macro-to-macro call.
11. Now that the stack is set up, handle any traps:
a. if trap-on-calls
b. signal any errors previously detected (wrong number of args,
etc.).
12. Use the number from step 4 to index into yet another table, the
micocode symbol area (A-V-MICRO-CODE-SYMBOL-AREA). The result is
probably a fixnum. Its low 16-bits are a microcode address.
13. Push the finish-up routine on the micro-stack.
14. Jump to the microcode address from step 12.
15. Run the microcoded routine. It may trap, call out to macrocode (via
the support vector) or by interrupted.
16. When it is done, it must return a value. That value becomes the
value of the function.
17. On return the usual checks (trap on exit, PDL underflow, throw, etc.
checks are performed) then the stack frame is exited and the result
returned.
The comments on the LIST entry are:
This is not callable with MISC instructions, only as a function.
It is documented as taking an &REST argument but actually takes
63 optional args. When entered, the arguments are on the stack and M-R
contains the number of them.
Other forms of LIST are LIST* and LIST-IN-AREA (first argument is AREA
to cons in). They are probably in adjacent entries in the microcode
entry area and probably have microinstruction entry address that differ
by 5 to 25 with LIST being the lowest microaddress, LIST* next and
LIST-IN-AREA last.
I hope this helps.
-Steve
11.