{
File name MiscPCE.mc
Description: Special ESC codes for PC Emulation display
Author: JPM    
Created: April 19, 1985
Last edit by: JAC	24-Jul-85  9:59:54	fix rotation of translation table
Last edit by: JAC	22-Jul-85 17:18:35	fix order of parameters on stack
}

{ 	Copyright (C) 1985 by Xerox Corporation.  All rights reserved.}

Set[PCEwpl, 40'd];
Set[PCEwplMinus1, Sub[PCEwpl, 1]];
Set[PCEcnt, Sub[100, PCEwpl]]; {stored in RH register; when incremented until 
   carry out of the register, we've processed the entire line}

{PCEMedRes	Translate one line of PCE display to medium-resolution gray.
	Parameters:
		TOS = translation table (4 entries of 2x2 bits)
		[STK-1, STK] = long (virtual) pointer to scratch buffer stored in rhTT,TT
		[STK-3, STK-2] = long (virtual) pointer to PCE display line stored in rhT,T
	Returns: none
	Assumptions:
		PCE display and scratch buffer are pinned in memory in contiguous real pages.
}
@PCEMedRes:
	rhTT ← STK, pop,					c1, at[0B,10,ESC8n];
	TT ← STK, pop,						c2;
	rhT ← STK, pop,						c3;

	Map ← [rhTT, TT], TT ← TT and 0FF,			c1;
	T ← STK, pop,						c2;
	rhTT ← MD, Q ← MD,					c3;

	Map ← [rhT, T], T ← T and 0FF,				c1;
	Rx ← Q and ~0FF,					c2;
	rhT ← MD, Q ← MD,					c3;

	TT ← TT or Rx, fXpop, push,				c1;
	Rx ← Q and ~0FF,					c2;
	T ← T or Rx,						c3;

	MAR ← [rhT, T + 0],					c1;
	rhRio ← PCEcnt, GOTO[PCEMREntry],			c2;

PCEMRWordLoop:  {loop for each word in line}
	MAR ← [rhT, T + 0],					c1;
	rhRio ← Rio LRot0,					c2;
PCEMREntry:
	Rx ← MD,						c3;

	T ← T + 1, Xbus ← Rx LRot4, XDisp,			c1;
	Rio ← 1, DISP4[PCEMRBitLoop,3],				c2;
	{when that leading one is shifted to the most significant bit, the word (except for one final shift) has been translated}
PCEMRBitLoop0:
	GOTO[PCEMRBits0],					c3, at[3,10,PCEMRBitLoop];
PCEMRBitLoop1:
	GOTO[PCEMRBits1],					c3, at[7,10,PCEMRBitLoop];
PCEMRBitLoop2:
	GOTO[PCEMRBits2],					c3, at[0B,10,PCEMRBitLoop];
PCEMRBitLoop3:
	GOTO[PCEMRBits3],					c3, at[0F,10,PCEMRBitLoop];

PCEMRBits0:  {process each character (of 2 bits) in word}
	r0100 ← TOS LRot0, GOTO[PCEMRShift],			c1, at[0C,10,PCEMRBits];
PCEMRBits1:
	r0100 ← TOS LRot4, GOTO[PCEMRShift],			c1, at[0D,10,PCEMRBits];
PCEMRBits2:
	r0100 ← TOS LRot8, GOTO[PCEMRShift],			c1, at[0E,10,PCEMRBits];
PCEMRBits3:
	r0100 ← TOS LRot12, GOTO[PCEMRShift],			c1, at[0F,10,PCEMRBits];
PCEMRShift:
	{get translation bitmap into the most significant byte for easy shift of
	the top 2 translation bits into Rio and bottom 2 into Rx}
	Q ← r0100,						c2;
	Rio ← DLShift1 Rio,					c3;

	Rio ← DLShift1 Rio, Xbus ← Rio LRot0, XHDisp,		c1;
	Rx ← DLShift1 Rx, Xbus ← Rx LRot4, XDisp, BRANCH[$,PCEMRBitsDone,2], c2;
	Rx ← DLShift1 Rx, DISP4[PCEMRBits,0C],			c3;
PCEMRBitsDone:
	Rx ← DLShift1 Rx, CANCELBR[$,0F],			c3;

	MAR ← [rhTT, TT + 0],					c1;
	MDR ← Rio, Rio ← rhRio + 1, PgCarryBr,			c2;
	TT ← TT + PCEwpl, BRANCH[$,PCEMRWordsDone],		c3;

	MAR ← [rhTT, TT + 0],					c1;
	MDR ← Rx,						c2;
	TT ← TT - PCEwplMinus1, GOTO[PCEMRWordLoop],		c3;

PCEMRWordsDone:
	MAR ← [rhTT, TT + 0],					c1;
	MDR ← Rx, TOS ← STK, pop, IBDisp,			c2;
	r0100 ← 0FF + 1, DISPNI[OpTable],			c3;

{-------------------------------------------------------------------------}

{Catch unused landing spots.}

@a214:	PC ← PC - 1, GOTO[ESCb],				c1, at[0C,10,ESC8n];
@a215:	PC ← PC - 1, GOTO[ESCb],				c1, at[0D,10,ESC8n];
@a216:	PC ← PC - 1, GOTO[ESCb],				c1, at[0E,10,ESC8n];
@a217:	PC ← PC - 1, GOTO[ESCb],				c1, at[0F,10,ESC8n];