{ 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];