{File name LispStkScan.mc
Description: DandeLion InterLisp Emulator StkScan
Author: Charnley
Last modified: Charnley 2-May-84 12:09:41
Created: 2-May-84 11:42:53
}
{- - - - - - - - - - - - - - - - - - - - - - - - - -
57 STKSCAN 0 0 \STKSCAN
TOS is VAR.
NO! -- If TOS is not litatom, punt.
Returns 24 bit pointer to cell where VAR is bound.
NO! -- Note: must check VAR=NIL, and return pointer to NIL's
value cell. (Free variable lookup algorithm fails if
given NIL, at least on Dorado.)
If variable was bound on stack, the value returned will
be a pointer into stack space.
If variable is not bound, value will be pointer to top
level value cell.
- - - - - - - - - - - - - - - - - - - - - - - - - -}
@STKSCAN: opcode[57'b],
{free var lookup on tos, which is an atom}
{ look up variable in current frame; fill in binding pointer
(chaining not implemented)
This code assumes that NAMETABLE is contiguous in real memory {either it is on the stack, or within a code header which is non-page crossing}
on Entry: c1
uTOS restored to TOS if fault
uTOSH restored to TOSH if fault
PV current frame (point to PV region)
Q {uChain} (odd) stack pointer to variable to be looked up (Pv + ib + 1)
rhTT, TT virtual address of name table (usually function header)
L3 caller's return link at[L3, 10, fvCaller] also used with fvfixup after fault
uses during subroutine:
rhRx, Rx real address of name table
PV frame extension pointers (point to PV region)(travel up alinks)
uPV save local PV
TOS used
uChain TOSH{chain}
rhTOSH nRhS {set once at odd time; must be left}{*} used with TOSH{chain}
uName TOSH{name} ← [UvCL + T/2 {- UvCL.nlocals} + UvCL.fvaroffset]
ntSize, offset, L0, L1
on Return: c1
preserves S, PV, PC, L2, uTOS, uTOSH
smashes TOS, TOSH {but preserved in uTOS, uTOSH}
rhTT, TT virtual address of free value
@(chain) filled in binding pointer
L1 binding type{fvStack, fvGlobal} Dispatch pending
on Fault: TOS ← uTOS, TOSH ← uTOSH, PV ← uPV
}
{ INITIALIZE:
uTOS ← TOS
uTOSH ← TOSH
TOSH ← name {from TOS}
uChain ← 0
uPV ← PV
L3 ← L3.StkScan
enter at newFrame: c1
}
uPV ← PV, L3 ← L3.StkScan, c1;
uTOSH ← TOSH, c2;
uTOS ← TOSH ← TOS, c3;
uChain ← 0, c1;
, c2;
CALL[newFrame], c3;
Q ← rhTT, CANCELBR[$, 0F], c1, at[L3.StkScan, 10, fvCaller];
TOSH ← Q, c2;
TOS ← TT, GOTO[evalEND], c3;
PV ← uPV, GOTO[NoFixes], c3, at[L3.StkScan, 10, fvfixup];
{ E N D }