{File: RumByteCodes.mc
12-Dec-84 23:03:53
Lasr edited by Makoto Udagawa 22-Feb-85 13:33:10 Modify Bank value for 2MWord smalltalk-80.
}
{
This file contains the code to switch from the Mesa bank to the Interpreter bank
}
{Register equates for saving the address of the Rum Communications Record -- these registers are completely unused by Mesa. This is essential if we are to continue Rum microcode after going to the Mesa debugger (or any other non-smalltalk MDE volume).}
RegDef [uRumRecordHigh, U, 49];
RegDef [uRumRecordLow, U, 5f];
Set [objectTableHighOffset, 12];
Set [objectHeaderSize, 3];
doInitializationBytecode:
Bank ← 5, c1, at [0A, 10, ESC8n];
Noop, c2;
GOTOABS [doInitialization], c3;
returnFromRumBank:
TOS ← STK, pop, GOTO [IBDispOnly], c1, at [returnFromRumBank];
doBytecodesBytecode:
Bank ← 5, L0 ← 0, c1, at [0B, 10, ESC8n];
Noop, c2;
switchToRum:
GOTOABS [doBytecodes], c3;
doStabilizationBytecode:
Bank ← 5, L0 ← 1, c1, at [0C, 10, ESC8n];
GOTO [switchToRum], c2;
doCompress:
Bank ← 5, L0 ← 2, c1, at [0D, 10, ESC8n];
GOTO [switchToRum], c2;
pMemFetch: {PMemFetch: PROCEDURE [address: VirtualAddress] RETURNS [Word]}
rhT ← TOS LRot0, c1, at [4, 10, ESC8n];
T ← STK, fXpop, fZpop, c2;
Noop, c3;
{ MAR ← [rhT, T + 0], c1; {read word}
CANCELBR [$, 2], c2;
TOS ← MD, c3;
Noop, c1;
IBDisp, c2;
DISPNI [OpTable], c3;}
MAR ← [rhT, T + 0], c1; {read word}
IBDisp, CANCELBR [$, 2], c2;
TOS ← MD, DISPNI [OpTable], c3;
pMemSmash: {PMemSmash: PROCEDURE [address: VirtualAddress, value: Word]}
rhT ← STK, pop, {high address} c1, at [5, 10, ESC8n];
T ← STK, pop, {low address} c2;
Noop, {TOS = value} c3;
{ MAR ← [rhT, T + 0], c1; {smash word}
MDR ← TOS, LOOPHOLE [wok], CANCELBR [$, 2], c2;
TOS ← STK, pop, c3;
Noop, c1;
IBDisp, c2;
DISPNI [OpTable], c3;}
MAR ← [rhT, T + 0], c1; {smash word}
MDR ← TOS, LOOPHOLE [wok], IBDisp, CANCELBR [$, 2], c2;
TOS ← STK, pop, DISPNI [OpTable], c3;
getBase: {GetBase: PROCEDURE [oop: Word] RETURNS [RealAddress]}
TT ← TOS, fXpop, push, c1, at [6, 10, ESC8n];
rhT ← uRumRecordHigh, push, c2;
T ← uRumRecordLow, c3;
MAR ← [rhT, T + objectTableHighOffset], c1; {read ot base}
push, fZpop, CANCELBR [$, 2], c2;
rhTT ← MD, c3;
MAR ← [rhTT, TT + 0], c1; {index ot, get low addr}
CANCELBR [$, 2], c2;
T ← MD, c3;
MAR ← [rhTT, TT + 1], c1; {index ot, get high addr}
T ← T + objectHeaderSize, IBDisp, CANCELBR [$, 2], c2; {adjust low}
STK ← T, TOS ← MD, DISPNI [OpTable], c3;
{getBase: {GetBase: PROCEDURE [oop: Word] RETURNS [RealAddress]}
TT ← TOS, fXpop, push, c1, at [6, 10, ESC8n];
rhT ← uRumRecordHigh, c2;
T ← uRumRecordLow, c3;
MAR ← [rhT, T + objectTableHighOffset], c1; {read ot base}
CANCELBR [$, 2], c2;
rhTT ← MD, c3;
MAR ← [rhTT, TT + 0], c1; {index ot, get low addr}
CANCELBR [$, 2], c2;
T ← MD, c3;
MAR ← [rhTT, TT + 1], c1; {index ot, get high addr}
T ← T + objectHeaderSize, CANCELBR [$, 2], c2; {adjust low}
TOS ← MD, push, c3; {push high addr}
STK ← T, push, fZpop, c1; {push low addr}
IBDisp, c2;
DISPNI [OpTable], c3;}