{ File name TrapzSubs.mc Last edited by MRR: 13-Oct-86 12:53:51: updated BumpBitAddress label to reference current version. Last edited by JPM: 8-Aug-86 16:24:13: Hacked SaveStack. Last edited by CRF: 4-Aug-86 12:36:57: Deleted code that saves working copy of xMin.val.frac in the stack. Fixes to BumpVars. Changes for second bank operation: changed LSEPReturn1 to LSEPReturn. Last edited by MRR: 18-Jun-86 8:52:12: changed some prefixes from 'bb' to 'tzb'. Removed the Src and Dst LRemap routines, since BltLineGray is called instead of using a version of bbLoops.mc. Description: relative to BitBlt op-code version, modified for TrapezoidBlt to reside in control store bank 1. This file contains the following subroutines: Subroutine Page # ----------- ------- BumpVars - 2 MovrhVToStkandRestore - 4 RestoreRandRHRegs - 4 SaveStack - 5 SavetzbRegs - 6 this file was printed with the following XDE Executive command: >print gacha8/f /-a TrapzSubs.mc } { Copyright (C) 1986 by Xerox Corporation. All rights reserved.} {************************************************************************************************ Bump TrapezoidBlt Variables SUBROUTINE first cycle = c1, last cycle = c2, length = 18 2/3 - 19 2/3 clicks This subroutine is used to increment the working registers per Trapezoid Item transfered. EXITS TO BumpVarsRet ************************************************************************************************} BumpVars: VD ← UdstBpl ,c1; {bump Dst Bit Address by dstBpl} dstWidth ← UWrkrhVD ,c2; srcWrdOffset ← UDtzVALo ,c3; Tzbtmp ← UtzDstBit ,c1; L4 ← L4.TrapzBump ,c2; CALL[BBASubEntry] ,c3; { BumpBitAddress subroutine here {7, or 8 clicks} ,c1-c2;} Noop ,c3, at[L4.TrapzBump,10,BumpBitAddressRet]; UWrkrhVD ← dstWidth ,c1; UDtzVALo ← srcWrdOffset ,c2; {save new Dst hi & lo addrs} UtzDstBit ← Tzbtmp ,c3; Q ← UXMinValFrac ,c1; Tzbtmp ← UXMindValFrac ,c2; {add XMindVal.li to XMinVal.li} TzbAnother ← Tzbtmp + Q, CarryBr ,c3; Q ← UXMinValInt, BRANCH[$, MinValCary] ,c1; Tzbtmp ← UXMindValInt ,c2; Rbb1 ← Tzbtmp + Q, GOTO[StashMinVal] ,c3; MinValCary: Tzbtmp ← UXMindValInt ,c2; Rbb1 ← Tzbtmp + Q + 1 ,c3; StashMinVal: UXMinValFrac ← TzbAnother ,c1; {save new XMinVal.li} Tzbtmp ← Rbb1 - Q ,c2; Q ← UtzSrcBit ,c3; Q ← Q + Tzbtmp ,c1; Q ← Q and 0F ,c2; UtzSrcBit ← Q ,c3; UXMinValInt ← Rbb1 ,c1; Q ← UXMaxValFrac ,c2; Tzbtmp ← UXMaxdValFrac ,c3; TzbAnother ← Tzbtmp + Q, CarryBr ,c1; {add XMaxdVal.li to XMaxVal.li} Q ← UXMaxValInt, BRANCH[$, MaxValCary] ,c2; Tzbtmp ← UXMaxdValInt ,c3; Rbb1 ← Tzbtmp + Q, GOTO[StashMaxVal] ,c1; MaxValCary: Tzbtmp ← UXMaxdValInt ,c3; Rbb1 ← Tzbtmp + Q + 1 ,c1; StashMaxVal: UXMaxValFrac ← TzbAnother ,c2; {save new XMaxVal.li} UXMaxValInt ← Rbb1 ,c3; Tzbtmp ← UyOffset ,c1; {load yOffset} TzbAnother ← UTzbFlags ,c2; TzbAnother ← TzbAnother and 0F ,c3; {look at Height-1} Q ← TzbAnother - Tzbtmp, ZeroBr ,c1; Rbb1 ← UStzVALo, BRANCH[lessthan, equals] ,c2; equals: Rbb1 ← Rbb1 - TzbAnother, CarryBr ,c3; {reset back to top of brick} UyOffset ← 0, BRANCH[decRH, $] ,c1; {reset yOffset to 0} L2Disp, GOTO[rhOK] ,c2; decRH: TzbAnother ← UWrkrhVS, ,c2; TzbAnother ← TzbAnother - 1 ,c3; Noop, GOTO[rhNowOK] ,c1; lessthan: Q ← Tzbtmp + 1 ,c3; {increment yOffset} Rbb1 ← Rbb1 + 1, CarryBr ,c1; {increment source VA} UyOffset ← Q, L2Disp, BRANCH[rhOK, $] ,c2; TzbAnother ← UWrkrhVS, CANCELBR[$, 0F] ,c3; TzbAnother ← TzbAnother + 1 ,c1; rhNowOK: UWrkrhVS ← TzbAnother, L2Disp ,c2; rhOK: UStzVALo ← Rbb1, DISP4[BumpVarsRet] ,c3; {************************************************************************************************ MoverhVToStkandRestore SUBROUTINE length = 3 clicks This subroutine is used to move the rhV registers into the stack. USES L0 caller MOVES Rbb1 to UDstBit Q to USrcBit EXITS TO RestoreRandRHRegs SUBROUTINE ************************************************************************************************} MovrhVToStkandRestore: rhL ← UrhLsave, GOTO[RestoreBlkRegsC3], ,c*{c1}; { RestoreRandRHRegs SUBROUTINE length = 2 1/3 clicks This subroutine is used to restore the R registers and rh registers which were saved at the entry into BitBlt. USES L0 caller RESTORES L from ULsave G from UGsave PC from UPCsave rhMDS from UrhMDSsave rhPC from UrhPCsave rhG from UrhGsave rhL from UrhLsave RETURNS THRU tzbRestoreCallers RestoreBlkRegs entries are used by Block.mc in order to end up on the right cycle. Block.mc saves all registers but does not use them all. } RstrRandRHRegs: rhL ← UrhLsave ,c*{c1}, at[Type.normal,10, LSEPReturn]; RestoreBlkRegsC3: rhPC ← UrhPCsave ,c*{c2}; RestoreBlkRegsC2: rhMDS ← UrhMDSsave ,c*{c3}; RestoreBlkRegsC1: rhG ← UrhGsave ,c*{c1}; RestoreBlkRegsC3Initial: {This entry can be used from Block only if rhG has not yet been modified.} PC ← UPCsave ,c*{c2}; G ← UGsave, L0Disp ,c*{c3}; L ← ULsave, RET[tzbRestoreCallers] ,c*{c1}; {************************************************************************************************ SaveStack SUBROUTINE length = This subroutine staches working loop variables from their proper stack elements. The variables are dstBpl, yOffset, SrcBitOffset, and Source Address. The elements touched are as follows: o fold source and destination rh components into the stack, o merge destination bit offset into the Min and Max Val interpolators, o place yOffset and source bit offset into flags word. USES rhWho caller ************************************************************************************************} SaveStack: Tzbtmp ← UWrkrhVS ,c*{c1}; {UrhTzbVS Ustk←Uwork} Tzbtmp ← Tzbtmp LRot8 ,c*{c2}; Q ← UWrkrhVD ,c*{c3}; {UrhTzbVD Ustk←Uwork} Tzbtmp ← Tzbtmp or Q ,c*{c1}; UrhTzbVSD ← Tzbtmp ,c*{c2}; Q ← UtzDstBit ,c*{c3}; {Add dstbit to interp vals} Tzbtmp ← UXMinValInt ,c*{c1}; Tzbtmp ← Tzbtmp + Q ,c*{c2}; UXMinValInt ← Tzbtmp ,c*{c3}; Tzbtmp ← UXMaxValInt ,c*{c1}; Tzbtmp ← Tzbtmp + Q ,c*{c2}; UXMaxValInt ← Tzbtmp ,c*{c3}; TzbAnother ← UyOffset ,c*{c1}; Q ← UTzbFlags ,c*{c2}; Tzbtmp ← TzbAnother LRot8 or Q ,c*{c3}; {merge yOffset into Flags} TzbAnother ← UtzSrcBit ,c*{c1}; TzbAnother ← TzbAnother LRot4 ,c*{c2}; Tzbtmp ← Tzbtmp or TzbAnother ,c*{c3}; {merge srcBit into Flags} UTzbFlags ← Tzbtmp ,c*{c1}; [] ← rhWho, XDisp ,c*{c2}; DISP4[SaveStackRet,0E] ,c*{c3}; {return to caller} {************************************************************************************************ SavetzbRegs SUBROUTINE length = 2 2/3 clicks This subroutine is used to move the rh registers in U. Note that the caller MUST save L before calling. MOVES TOS STK G to UGsave rhG UrhGsave PC to UPCsave rhPC UrhPCsave L UrhLsave rhL UrhLsave rhMDS UrhMDSsave EXITS TO SavetzbRegsRet ************************************************************************************************} SavetzbRegs: L ← rhL ,c2, at[0,10,SavetzbRegs]; SaveBlkRegs:: PC ← PC - 1 ,c3; SaveBlkRegsx: {Radr same as Ublock containing following Uregs} UPCsave ← PC ,c1; {the following Uregs are at "xB" to allow "← rh"} UGsave ← G ,c2; UrhLsave ← L, G ← rhG ,c3; UrhGsave ← G, PC ← rhPC ,c1; UrhPCsave ← PC, TOS ← rhMDS, pRet2, ,c2; UrhMDSsave ← TOS, RET[SavetzbRegsRet], ,c3; {END}