mirror of
https://github.com/livingcomputermuseum/Darkstar.git
synced 2026-02-28 09:37:43 +00:00
39 lines
18 KiB
Plaintext
39 lines
18 KiB
Plaintext
head 1.1;
|
||
branch 1.1.1;
|
||
access ;
|
||
symbols start:1.1.1.1 Xerox:1.1.1;
|
||
locks ; strict;
|
||
comment @# @;
|
||
|
||
|
||
1.1
|
||
date 2001.08.12.22.22.18; author freier; state Exp;
|
||
branches 1.1.1.1;
|
||
next ;
|
||
|
||
1.1.1.1
|
||
date 2001.08.12.22.22.18; author freier; state Exp;
|
||
branches ;
|
||
next ;
|
||
|
||
|
||
desc
|
||
@@
|
||
|
||
|
||
|
||
1.1
|
||
log
|
||
@Initial revision
|
||
@
|
||
text
|
||
@{
|
||
File name bbInit.mc
|
||
Description: Mesa BitBlt op-code
|
||
DEG 1-Sep-84 19:19:04 Add copyright notice
|
||
JGS November 2, 1981 2:28 PM New Instruction Set
|
||
Last edited by Jim August 20, 1981 2:20 PM: Fix for new assembler.
|
||
Last edited by Jim JXF : March 31, 1981 8:39 AM: Change SrcMapRet from Mod 8 to Mod 10.
|
||
Last edited by Don DXC : March 6, 1981 1:48 PM: Fixed PageFault/64K cross interaction problem.
|
||
Last edited by Don DXC : March 3, 1981 4:08 PM: Moved UWidth into stack, no memory reads after int and pf, stack now has 12'd things.
|
||
Last edited by PXO : February 27, 1981 2:51 PM
|
||
Last edited by Don DXC : February 26, 1981 2:35 PM: Add changes for new stack size to save 10 instructions.
|
||
Author: don DXC
|
||
Created: January, 1980
|
||
}
|
||
|
||
{ Copyright (C) 1982, 1983 by Xerox Corporation. All rights reserved.}
|
||
|
||
|
||
@@BITBLT: {Save R and RH registers}
|
||
ULsave ¬ L, pCall2, CALL[SavebbRegs], ,c1, at[0B,10,ESC2n];
|
||
|
||
{SaveRegs subroutine here {2 2/3 Clicks} ,c2-c3;}
|
||
|
||
rhType ¬ Type.normal, push ,c1, at[0,10,SavebbRegsRet];
|
||
Xbus ¬ ErrnIBnStkp, XDisp ,c2, at[Savebb.BANDBLT,10,SavebbRegsRet];
|
||
Noop, DISP4[HowBigStack,06] ,c3;
|
||
|
||
{move BitBltArg to stack and rh}
|
||
bbNormEntry: {non-interrupts come here}
|
||
{get real address of BitBltArg}
|
||
{and insure that it is 0 mod 16}
|
||
VS ¬ UBitBltArg, ,c1, at[hbs.2,10,HowBigStack];
|
||
{rhVS = rhMDS, so no need to load it}
|
||
VS ¬ VS and ~0F, L2 ¬ sd.spec ,c2;
|
||
rhRet ¬ argMap, CALL[SrcMapSpec] ,c3;
|
||
|
||
{SrcMapSpec subroutine here {2 Clicks} ,c1-c3;}
|
||
|
||
bbGetArg: {move BitBltArg to U registers}
|
||
|
||
{rtn here} MAR ¬ [rhSrcA,SrcA + 8], L0 ¬ 0 ,c1, at[argMap,10,SrcMapRet];
|
||
CANCELBR[$,0], L0Disp ,c2;
|
||
MDtoRbb0: Rbb0 ¬ MD{UWidth}, DISP4[MDtoRbb0Ret] ,c3;
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 0A], L0 ¬ 1 ,c1, at[0,10,MDtoRbb0Ret];
|
||
UWidth ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{UFlags}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 3], L0 ¬ 2 ,c1, at[1,10,MDtoRbb0Ret];
|
||
UFlags ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{UDstBpl}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 7], L0 ¬ 3 ,c1, at[2,10,MDtoRbb0Ret];
|
||
UDstBpl ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{SrcBpl}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 9], L0 ¬ 4 ,c1, at[3,10,MDtoRbb0Ret];
|
||
USrcBpl ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{Height}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 0], L0 ¬ 5 ,c1, at[4,10,MDtoRbb0Ret];
|
||
UHeight ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{DLo}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 2], L0 ¬ 6 ,c1, at[5,10,MDtoRbb0Ret];
|
||
UDstVALo ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{DBit}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 4], L0 ¬ 7 ,c1, at[6,10,MDtoRbb0Ret];
|
||
UDstBit ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{SLo}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 6], L0 ¬ 8 ,c1, at[7,10,MDtoRbb0Ret];
|
||
USrcVALo ¬ Rbb0, CANCELBR[MDtoRbb0,0], L0Disp ,c2;
|
||
{MDtoRbb0: Rbb0 ¬ MD{SBit}, DISP4[MDtoRbb0Ret] ,c3;}
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 5] ,c1, at[8,10,MDtoRbb0Ret];
|
||
USrcBit ¬ Rbb0, CANCELBR[$,0] ,c2;
|
||
VS ¬ rhVS ¬ MD{SHi} ,c3;
|
||
|
||
MAR ¬ [rhSrcA,SrcA + 1] ,c1;
|
||
UrhVS ¬ VS, CANCELBR[$,0] ,c2;
|
||
VD ¬ rhVD ¬ MD{DHi} ,c3;
|
||
|
||
[] ¬ UFlags, NegBr ,c1;
|
||
UrhVD ¬ VD, BRANCH[FsetUp,$] ,c2;
|
||
{if direction backward, mod SrcVA and DstVA}
|
||
{Note: gray is always forward}
|
||
{Backwards SetUp}
|
||
TempBpl ¬ UWidth ,c3;
|
||
|
||
TempBpl ¬ TempBpl - 1, rhWho ¬ sdWidth, CALL[DstVAMod] ,c1;
|
||
|
||
{DstVAMod subroutine here {4 clicks} ,c2-c1;}
|
||
|
||
TempBpl ¬ UWidth ,c2, at[sdWidth,4,DstVAModRet];
|
||
|
||
TempBpl ¬ TempBpl - 1, CALL[SrcVAMod] ,c3;
|
||
|
||
{SrcVAMod subroutine here {4 clicks} ,c1-c3;}
|
||
|
||
{interrupt entry goes thru this code}
|
||
{restore rh from u regs}
|
||
|
||
BandBLTNormEntry:
|
||
rhVS ¬ UrhVS, GOTO[rhfromu] ,c1, at[hbs.C,10,HowBigStack];
|
||
rhVS ¬ UrhVS, GOTO[rhfromu] ,c1, at[hbs.D,10,HowBigStack];
|
||
rhfromu: rhVD ¬ UrhVD ,c2;
|
||
FsetUp: Noop ,c3;
|
||
|
||
TextBltToBitBltEntry:
|
||
Rbb3{W} ¬ UWidth ,c1, at[sdWidth,4,SrcVAModRet];
|
||
Rbb0{W-1} ¬ Rbb3{W} - 1, NegBr {test if width = 0} ,c2;
|
||
Rbb2 ¬ 0F, BRANCH[$,Widtheq0] ,c3;
|
||
|
||
Rbb2 ¬ Rbb2 LRot12 ,c1;
|
||
[] ¬ Rbb2 and Rbb3, ZeroBr ,c2;
|
||
Rbb1 ¬ 8, BRANCH[wnotsmall,wsmall] ,c3;
|
||
|
||
wnotsmall: Q ¬ 2 ,c1;
|
||
Q ¬ Q or rhType ,c2;
|
||
rhType ¬ Q LRot0 ,c3;
|
||
|
||
wsmall: Rbb4 ¬ UFlags, NegBr ,c1;
|
||
Rbb3 ¬ Rbb4 LRot4, BRANCH[DirFor,DirBack] ,c2;
|
||
|
||
DirFor: Rbb1 ¬ 0 ,c3;
|
||
|
||
Rbb2{W-1} ¬ Rbb0{W-1}, GOTO[uwwpos] ,c1;
|
||
|
||
DirBack: Rbb0 ¬ 0 - Rbb0, NegBr ,c3;
|
||
|
||
Rbb2{0-(W-1)} ¬ 0 - Rbb0{W-1}, BRANCH[uwwpos,uwwneg] ,c1;
|
||
uwwpos: Rbb2 ¬ Rbb2 and ~0F, GOTO[conL13] ,c2;
|
||
uwwneg: Rbb2 ¬ Rbb2 or 0F, GOTO[conL13] ,c2;
|
||
conL13: Rbb2 ¬ Rbb2 LRot12{this only used for PgCarry and sign check} ,c3;
|
||
|
||
UWidthM1 ¬ Rbb0 ,c1;
|
||
UWidthW ¬ Rbb2 ,c2;
|
||
[] ¬ UHeight, ZeroBr {test if height = 0} ,c3;
|
||
|
||
{L3 ¬ 0,,gr,,0,,sF}
|
||
{gr and srcFunc}
|
||
Rbb0 ¬ LRot1 Rbb3, BRANCH[$,Heighteq0] ,c1;
|
||
Rbb0 ¬ Rbb0 and 3 ,c2;
|
||
Rbb0 ¬ Rbb0 + 6 ,c3;
|
||
|
||
[] ¬ Rbb0 and 5, YDisp ,c1;
|
||
Xbus ¬ dtRet.L3, L3 ¬ 0, XDisp, DISP4[dT] ,c2;
|
||
{dT subroutine here {1 cycle} ,c3;}
|
||
|
||
{dstFunc and dir}
|
||
Rbb0 ¬ Rbb4 LRot8 ,c1, at[dtRet.L3,10,dTRets];
|
||
Rbb0 ¬ Rbb0 and 6 ,c2;
|
||
[] ¬ Rbb0 or Rbb1, YDisp ,c3;
|
||
|
||
Xbus ¬ dtRet.L1, L1 ¬ 0, XDisp, DISP4[dT] ,c1;
|
||
{dT subroutine here {1 cycle} ,c2;}
|
||
Rbb0 ¬ UDstBpl ,c3, at[dtRet.L1,10,dTRets];
|
||
|
||
[] ¬ Rbb0 and 0F, ZeroBr ,c1;
|
||
Rbb1 ¬ dbneq0, grDisp, BRANCH[dstwn0,$] ,c2;
|
||
Rbb0 ¬ USrcBpl, grDISP[srcgrchk] ,c3;
|
||
|
||
Xbus ¬ 1, XDisp, GOTO[srcchk] ,c1, at[gr.gray,grM,srcgrchk];
|
||
[] ¬ Rbb0 and 0F, ZeroBr, GOTO[srcchk] ,c1, at[gr.notgray,grM,srcgrchk];
|
||
srcchk: Rbb1 ¬ sbneq0, BRANCH[sbnot0,sbis0] ,c2;
|
||
sbis0: UrefillType ¬ dbsb0, GOTO[SetUpAllC1] ,c3;
|
||
sbnot0: UrefillType ¬ Rbb1{sbneq0}, GOTO[SetUpAllC1] ,c3;
|
||
|
||
dstwn0: UrefillType ¬ Rbb1{dbneq0}, CANCELBR[SetUpAllC1,0F] ,c3;
|
||
|
||
|
||
{ ITEM REFILL }
|
||
{updateHeight, test if thru}
|
||
ItemRefill3:
|
||
Rbb0 ¬ UHeight, L2 ¬ sd.src ,c3;
|
||
|
||
Rbb0 ¬ Rbb0 - 1, ZeroBr ,c1;
|
||
UHeight ¬ Rbb0, grDisp, BRANCH[$,bbNormExit] ,c2;
|
||
rhWho ¬ sdBpl, grDISP[srcgrayornot] ,c3;
|
||
|
||
{notGray} TempBpl ¬ USrcBpl, CALL[SrcVAMod] ,c1, at[gr.notgray,grM,srcgrayornot];
|
||
|
||
{SrcVAMod subroutine {4 clicks} ,c2-c1;}
|
||
{will return to dstUphere}
|
||
|
||
{update Src address}
|
||
{gray} Rbb0{max} ¬ UGray ,c1, at[gr.gray,grM,srcgrayornot];
|
||
Rbb1{cur} ¬ Rbb0 LRot8 ,c2;
|
||
Rbb0{max} ¬ Rbb0 and 0F, ZeroBr ,c3;
|
||
|
||
Rbb1{cur} ¬ Rbb1 and 0F, BRANCH[$,dstUphere] ,c1;
|
||
Rbb1{cur+1} ¬ Rbb1{cur} + 1 ,c2;
|
||
[] ¬ Rbb0{max} - Rbb1{cur+1}, NegBr ,c3;
|
||
|
||
Rbb1 ¬ Rbb1 LRot8, BRANCH[$,GrayWrap] ,c1;
|
||
{not gray wrap}
|
||
UGray ¬ Rbb1 xor Rbb0 ,c2;
|
||
Rbb2{usva} ¬ USrcVALo ,c3;
|
||
|
||
Rbb2{usva+1} ¬ Rbb2{usva} + 1, PgCarryBr ,c1;
|
||
Noop, BRANCH[$,GrayNewPage] ,c2;
|
||
USrcVALo ¬ Rbb2{usva+1} ,c3;
|
||
|
||
GOTO[dstUphere] ,c1;
|
||
|
||
GrayNewPage:
|
||
Noop ,c3;
|
||
|
||
TempBpl ¬ 10, CALL[SrcVAMod] ,c1;
|
||
|
||
GrayWrap: UGray ¬ Rbb0 ,c2;
|
||
Rbb1{maxX10} ¬ Rbb0{max} LRot4 ,c3;
|
||
|
||
Rbb2{usva} ¬ USrcVALo ,c1;
|
||
Rbb2{usva-max} ¬ Rbb2{usva} - Rbb0{max}, PgCarryBr ,c2;
|
||
Noop, BRANCH[GrayWrapNewPage,$] ,c3;
|
||
|
||
USrcVALo ¬ Rbb2{usva-max}, GOTO[dstUphere] ,c1;
|
||
|
||
GrayWrapNewPage:
|
||
TempBpl ¬ 0 - Rbb1{maxX10}, CALL[SrcVAMod] ,c1;
|
||
|
||
{update Dst address}
|
||
dstUphere: TempBpl ¬ UDstBpl, CALL[DstVAMod] ,c2, at[sdBpl,4,SrcVAModRet];
|
||
|
||
{DstVAMod subroutine {4 clicks} ,c3-c2;}
|
||
{will return to IntTest}
|
||
|
||
IntTest: Q ¬ UWidthM1, MesaIntBr ,c3, at[sdBpl,4,DstVAModRet];
|
||
wdcTest: [] ¬ uWDC, ZeroBr, BRANCH[bbNoInt2, MaybeInt] ,c1;
|
||
MaybeInt: [] ¬ uWP, ZeroBr, BRANCH[bbNoWDC, bbWDC] ,c2;
|
||
bbWDC: ClrIntErr, BRANCH[bbDoInt, bbNoInt1] ,c3;
|
||
|
||
{no mesa interrupt}
|
||
bbNoWDC: ClrIntErr, CANCELBR[$] ,c3;
|
||
|
||
bbNoInt1:
|
||
Noop ,c1;
|
||
bbNoInt2:
|
||
Xbus ¬ UrefillType, XDisp, CANCELBR[SetUpTest] ,c2;
|
||
|
||
SetUpTest:
|
||
[] ¬ USrcBit + Q, NibCarryBr, LOOPHOLE[niblTiming], DISP2[SetUpAllC1] ,c3;
|
||
|
||
SetUpAllC1:
|
||
{Lcount ¬ number of dest words to be written minus 1 }
|
||
Rbb1 ¬ UDstBit, dirDisp, CANCELBR[$] ,c1, at[dbneq0,4,SetUpAllC1];
|
||
Lcount ¬ Rbb1 and 0F, dirDISP[lcx] ,c2;
|
||
Lcount ¬ 10 - Lcount ,c3, at[dir.backwards,dirM,lcx];
|
||
|
||
Rbb0 ¬ ~UWidthM1, GOTO[lccont] ,c1;
|
||
|
||
Rbb0 ¬ UWidthM1 ,c3, at[dir.forward,dirM,lcx];
|
||
|
||
Noop, GOTO[lccont] ,c1;
|
||
|
||
lccont: Lcount ¬ Lcount + Rbb0 ,c2;
|
||
Lcount ¬ Lcount and ~0F ,c3;
|
||
|
||
{Umask1 ¬ Rmask[0 - DstBit]}
|
||
[] ¬ 0F - Rbb1{db}, YDisp ,c1;
|
||
|
||
Xbus ¬ maskRet.f1, XDisp, DISP4[MaskTbl] ,c2;
|
||
{MaskTbl subroutine here {1 cycle} ,c3;}
|
||
|
||
Lcount ¬ Lcount LRot12, dirDisp ,c1, at[maskRet.f1,10,MaskRet];
|
||
ULcntsav ¬ Lcount, dirDISP[m2set] ,c2;
|
||
|
||
{FORWARD MASKS HERE}
|
||
Umask1 ¬ Rbb2 ,c3, at[dir.forward,dirM,m2set];
|
||
|
||
Rbb0{-w+1} ¬ 0 - Rbb0{w-1} ,c1;
|
||
[] ¬ Rbb0{-w+1} - Rbb1{db} - 1, YDisp ,c2;
|
||
Xbus ¬ maskRet.f2, XDisp, DISP4[MaskTbl] ,c3;
|
||
|
||
{MaskTbl subroutine here {1 cycle} ,c1;}
|
||
Rbb2 ¬ RShift1 ~Rbb2, SE ¬ 1, GOTO[stum2] ,c2, at[maskRet.f2,10,MaskRet];
|
||
|
||
{BACKWARDS MASKS HERE}
|
||
Rbb2 ¬ RShift1 ~Rbb2, SE ¬ 1 ,c3, at[dir.backwards,dirM,m2set];
|
||
|
||
Noop ,c1;
|
||
Umask1 ¬ Rbb2 ,c2;
|
||
{Umask2 ¬ Rmask[width - DstBit - 1]}
|
||
[] ¬ Rbb0{w-2} - Rbb1{db}, YDisp ,c3;
|
||
|
||
Xbus ¬ maskRet.b2, XDisp, DISP4[MaskTbl] ,c1;
|
||
{MaskTbl subroutine here ,c2;}
|
||
|
||
stum2: Umask2 ¬ Rbb2 ,c3, at[maskRet.b2,10,MaskRet];
|
||
|
||
{L0 ¬ skew + 2}
|
||
Rbb0{sb} ¬ USrcBit, dirDisp, CANCELBR[$] ,c1, at[sbneq0,4,SetUpAllC1];
|
||
Rbb1{db} ¬ UDstBit, dirDISP[WhichMasks] ,c2;
|
||
|
||
{Q ¬ Rmask[SrcBit - DstBit]}
|
||
[] ¬ Rbb0{sb} - Rbb1{db} - 1, YDisp ,c3, at[dir.forward,dirM,WhichMasks];
|
||
|
||
Xbus ¬ maskRet.fQ, XDisp, DISP4[MaskTbl] ,c1;
|
||
{MaskTbl subroutine here {1 cycle} ,c2;}
|
||
GOTO[setL0] {leave pre-Qmask in Rbb2} ,c3, at[maskRet.fQ,10,MaskRet];
|
||
|
||
{Q ¬ Lmask[DstBit - SrcBit]}
|
||
[] ¬ Rbb0{sb} - Rbb1{db}, YDisp ,c3, at[dir.backwards,dirM,WhichMasks];
|
||
Xbus ¬ maskRet.bQ, XDisp, DISP4[MaskTbl] ,c1;
|
||
|
||
{MaskTbl subroutine here {1 cycle} ,c2;}
|
||
Rbb2 ¬ RShift1 ~Rbb2, SE ¬ 1, GOTO[setL0] {leave pre-Qmask in Rbb2} ,c3, at[maskRet.bQ,10,MaskRet];
|
||
|
||
setL0: Rbb0{skew} ¬ Rbb0{sb} - Rbb1{db} ,c1;
|
||
[]{skew+2} ¬ Rbb0{skew} + 2, YDisp ,c2;
|
||
[] ¬ dtRet.L0, L0 ¬ 0, XDisp, DISP4[dT] ,c3;
|
||
|
||
{dT subroutine here {1 cycle} ,c1;}
|
||
scDisp ,c2, at[dtRet.L0,10,dTRets];
|
||
Q ¬ UWidthM1, sc3DISP[FixQ] ,c3;
|
||
Rbb2 ¬ LRot1 Rbb2, GOTO[SavQval] ,c1, at[0D,10,FixQ];
|
||
Rbb2 ¬ RRot1 Rbb2, GOTO[SavQval] ,c1, at[0F,10,FixQ];
|
||
|
||
SavQval: UmaskL ¬ Rbb2, L2 ¬ sd.src ,c2;
|
||
[] ¬ USrcBit + Q, NibCarryBr, {L2 ¬ sd.src}, LOOPHOLE[niblTiming] ,c3;
|
||
|
||
|
||
|
||
TouchSourcePages:
|
||
Q ¬ UWidthW, NegBr, BRANCH[oldWords,newWords] ,c1, at[dbsb0,4,SetUpAllC1];
|
||
oldWords: BRANCH[oldposchks,oldnegchks] ,c2;
|
||
newWords: Q ¬ Q + 1, PgCarryBr, BRANCH[newposchks1,newnegchks1] ,c2;
|
||
oldposchks: [] ¬ rhType, XDisp, GOTO[oldposs1] ,c3;
|
||
oldnegchks: [] ¬ rhType, XDisp, GOTO[oldnegs1] ,c3;
|
||
newposchks1: [] ¬ rhType, XDisp, BRANCH[oldposs1,newposs1] ,c3;
|
||
newnegchks1: [] ¬ rhType, XDisp, BRANCH[newnegs1,oldnegs1] ,c3;
|
||
|
||
oldposs1: [] ¬ USrcVALo + Q, PgCarryBr, DISP3[SrcsmallP,5], LOOPHOLE[byteTiming] ,c1;
|
||
newposs1: CANCELBR[$,7] ,c1;
|
||
Noop, CANCELBR[pospgs,1] ,c2, at[type.notsmall,typeM,SrcsmallP];
|
||
|
||
rhRet ¬ MapOne, BRANCH[posnopgs,pospgs] ,c2, at[type.small,typeM,SrcsmallP];
|
||
|
||
newnegs1: [] ¬ USrcVALo + Q , PgCarryBr, DISP3[SrcsmallN,5], LOOPHOLE[byteTiming] ,c1;
|
||
oldnegs1: Xbus ¬ 1, XDisp, DISP3[SrcsmallN,5] ,c1;
|
||
rhRet ¬ MapOne, BRANCH[negpgs,negnopgs] ,c2, at[type.small,typeM,SrcsmallN];
|
||
|
||
Noop, CANCELBR[pospgs,1] ,c2, at[type.notsmall,typeM,SrcsmallN];
|
||
|
||
pospgs: Q ¬ USrcVALo, grDisp, GOTO[smapmore] ,c3;
|
||
negpgs: Q ¬ USrcVALo, grDisp, GOTO[smapmore] ,c3;
|
||
|
||
smapmore: TempB ¬ USrcBit, grDISP[schkgray] ,c1;
|
||
rhRet ¬ srcTP ,c2, at[gr.notgray,grM,schkgray];
|
||
callva: TempBpl ¬ UWidthM1, CALL[VAMod] ,c3;
|
||
|
||
{VAMod subroutine here {2 or 3 clicks} ,c1-c3;}
|
||
VS ¬ rhVS + TempBpl, GOTO[fixrhVS], LOOPHOLE[byteTiming] ,c1, at[Or[srcTP,1],8,VAModRet];
|
||
|
||
|
||
TempB{old} ¬ USrcVALo, GOTO[comA] ,c1, at[srcTP,8,VAModRet];
|
||
comA: Q{new hi} ¬ Q and ~0FF, dirDisp ,c2;
|
||
TempBpl{old hi} ¬ TempB and ~0FF, dirDISP[comA.1] ,c3;
|
||
|
||
TempBpl{num hi} ¬ Q{new hi} - TempBpl{old hi}, GOTO[comX] ,c1, at[dir.forward,dirM,comA.1];
|
||
TempBpl{num hi} ¬ TempBpl{old hi} - Q{new hi}, GOTO[comX] ,c1, at[dir.backwards,dirM,comA.1];
|
||
comX: TempB{old low} ¬ TempB{old} and 0FF ,c2;
|
||
TempB ¬ TempB{old low} or Q{new hi}, sdDisp ,c3;
|
||
|
||
TempBpl{num low} ¬ TempBpl LRot8, sdDISP[comB] ,c1;
|
||
VS ¬ TempB ,c2, at[sd.src,sdM,comB];
|
||
csrc: rhRet ¬ sdMap, CALL[SrcMapSpec] ,c3;
|
||
sSnonewrhF: VS ¬ USrcVALoSav, CALL[SrcMapSpec] ,c3;
|
||
sSnonewrhB: VS ¬ USrcVALoSav, CALL[SrcMapSpec] ,c3;
|
||
|
||
{ SrcMapSpec subroutine here 2 clicks ,c1-c3;}
|
||
|
||
TempBpl ¬ TempBpl - 1, NegBr ,c1, at[sdMap,10,SrcMapRet];
|
||
VS ¬ 0FF + 1, dirDisp, BRANCH[srcmore,srcthru] ,c2;
|
||
srcmore: TempB ¬ USrcVALoSav, dirDISP[y.f] ,c3;
|
||
|
||
TempB ¬ TempB - VS, CarryBr ,c1, at[dir.forward,dirM,y.f];
|
||
USrcVALoSav ¬ TempB, BRANCH[sSnewrhF,sSnonewrhF] ,c2;
|
||
sSnewrhF: VS ¬ rhVS - 1, LOOPHOLE[byteTiming] ,c3;
|
||
|
||
y.c: rhVS ¬ VS LRot0 ,c1;
|
||
CALL[SrcMap] ,c2;
|
||
|
||
TempB ¬ TempB + VS, CarryBr ,c1, at[dir.backwards,dirM,y.f];
|
||
USrcVALoSav ¬ TempB, BRANCH[sSnonewrhB,sSnewrhB] ,c2;
|
||
sSnewrhB: VS ¬ rhVS + 1, GOTO[y.c], LOOPHOLE[byteTiming] ,c3;
|
||
|
||
srcthru: CANCELBR[$,Sub[dirM,2]] ,c3;
|
||
|
||
Mask2 ¬ Umask2 {Mask2 = VS}, GOTO[sss] ,c1;
|
||
|
||
rhRet ¬ MapOne, GOTO[posnopgs] ,c2, at[gr.gray,grM,schkgray];
|
||
|
||
posnopgs: VS ¬ USrcVALo, CALL[SrcMapSpec] ,c3;
|
||
negnopgs: VS ¬ USrcVALo, CALL[SrcMapSpec] ,c3;
|
||
|
||
{ SrcMapSpec subroutine here 2 clicks ,c1-c3;}
|
||
|
||
srcFin: Mask2 ¬ Umask2 {Mask2 = VS}, GOTO[sss] ,c1, at[MapOne,10,SrcMapRet];
|
||
sss: Q ¬ UWidthM1 ,c2;
|
||
[] ¬ UDstBit + Q, NibCarryBr, L2 ¬ sd.dst, LOOPHOLE[niblTiming] ,c3;
|
||
|
||
TouchDestPages:
|
||
Q ¬ UWidthW, NegBr, BRANCH[oldWordd,newWordd] ,c1;
|
||
oldWordd: BRANCH[oldposchkd,oldnegchkd] ,c2;
|
||
newWordd: Q ¬ Q + 1, PgCarryBr, BRANCH[newposchkd1,newnegchkd1] ,c2;
|
||
oldposchkd: [] ¬ rhType, XDisp, GOTO[oldposd1] ,c3;
|
||
oldnegchkd: [] ¬ rhType, XDisp, GOTO[oldnegd1] ,c3;
|
||
newposchkd1: [] ¬ rhType, XDisp, BRANCH[oldposd1,newposd1] ,c3;
|
||
newnegchkd1: [] ¬ rhType, XDisp, BRANCH[newnegd1,oldnegd1] ,c3;
|
||
|
||
oldposd1: [] ¬ UDstVALo + Q, PgCarryBr, DISP3[DstsmallP,5], LOOPHOLE[byteTiming] ,c1;
|
||
newposd1: CANCELBR[$,7] ,c1;
|
||
Noop, CANCELBR[pospgd,1] ,c2, at[type.notsmall,typeM,DstsmallP];
|
||
|
||
rhRet ¬ MapOne, BRANCH[posnopgd,pospgd] ,c2, at[type.small,typeM,DstsmallP];
|
||
|
||
newnegd1: [] ¬ UDstVALo + Q, PgCarryBr, DISP3[DstsmallN,5], LOOPHOLE[byteTiming] ,c1;
|
||
oldnegd1: Xbus ¬ 1, XDisp, DISP3[DstsmallN,5] ,c1;
|
||
rhRet ¬ MapOne, BRANCH[negpgd,negnopgd] ,c2, at[type.small,typeM,DstsmallN];
|
||
|
||
Noop, CANCELBR[pospgd,1] ,c2, at[type.notsmall,typeM,DstsmallN];
|
||
|
||
pospgd: Q ¬ UDstVALo, GOTO[dmapmore] ,c3;
|
||
negpgd: Q ¬ UDstVALo, GOTO[dmapmore] ,c3;
|
||
|
||
dmapmore: TempB ¬ UDstBit ,c1;
|
||
rhRet ¬ dstTP, GOTO[callva] ,c2;
|
||
{callva: TempBpl ¬ UWidthM1, CALL[VAMod] ,c3;}
|
||
|
||
{VAMod subroutine here {2 or 3 clicks} ,c1-c3;}
|
||
VD ¬ rhVD + TempBpl, GOTO[fixrhVD], LOOPHOLE[byteTiming] ,c1, at[Or[dstTP,1],8,VAModRet];
|
||
|
||
|
||
TempB{old} ¬ UDstVALo, GOTO[comA] ,c1, at[dstTP,8,VAModRet];
|
||
{comA: Q{new hi} ¬ Q and ~0FF, dirDisp ,c2;}
|
||
{ TempBpl{old hi} ¬ TempB and ~0FF, sdDisp, dirDISP[comA.1] ,c3;}
|
||
|
||
{ TempBpl{num hi} ¬ Q{new hi} - TempBpl{old hi}, GOTO[comX] ,c1, at[dir.forward,dirM,comA.1];}
|
||
{ TempBpl{num hi} ¬ TempBpl{old hi} - Q{new hi}, GOTO[comX] ,c1, at[dir.backwards,dirM,comA.1];}
|
||
{comX: TempB{old low} ¬ TempB{old} and 0FF ,c2;}
|
||
{ TempB ¬ TempB{old low} or Q{new hi}, sdDisp ,c3;}
|
||
|
||
{ TempBpl{num low} ¬ TempBpl LRot8, sdDISP[comB] ,c1;}
|
||
VD ¬ TempB{first touch address} ,c2, at[sd.dst,sdM,comB];
|
||
cdst: rhRet ¬ sdMap, CALL[DstMapSpec] ,c3;
|
||
dSnonewrhF: VD ¬ UDstVALoSav, CALL[DstMapSpec] ,c3;
|
||
dSnonewrhB: VD ¬ UDstVALoSav, CALL[DstMapSpec] ,c3;
|
||
|
||
{ DstMapSpec subroutine here 2 clicks ,c1-c3;}
|
||
|
||
TempBpl ¬ TempBpl - 1, NegBr ,c1, at[sdMap,4,DstMapRet];
|
||
VD ¬ 0FF + 1, dirDisp, BRANCH[dstmore,dstthru] ,c2;
|
||
dstmore: TempB ¬ UDstVALoSav, dirDISP[y.fx] ,c3;
|
||
|
||
TempB ¬ TempB - VD, CarryBr ,c1, at[dir.forward,dirM,y.fx];
|
||
UDstVALoSav ¬ TempB, BRANCH[dSnewrhF,dSnonewrhF] ,c2;
|
||
dSnewrhF: VD ¬ rhVD - 1, LOOPHOLE[byteTiming] ,c3;
|
||
|
||
y.cx: rhVD ¬ VD LRot0 ,c1;
|
||
CALL[DstMap] ,c2;
|
||
|
||
TempB ¬ TempB + VD, CarryBr ,c1, at[dir.backwards,dirM,y.fx];
|
||
UDstVALoSav ¬ TempB, BRANCH[dSnonewrhB,dSnewrhB] ,c2;
|
||
dSnewrhB: VD ¬ rhVD + 1, GOTO[y.cx], LOOPHOLE[byteTiming] ,c3;
|
||
|
||
dstthru: CANCELBR[$,Sub[dirM,2]] ,c3;
|
||
|
||
Lcount ¬ ULcntsav, GOTO[detLoop] ,c1;
|
||
|
||
posnopgd: VD ¬ UDstVALo, CALL[DstMapSpec] ,c3;
|
||
negnopgd: VD ¬ UDstVALo, CALL[DstMapSpec] ,c3;
|
||
|
||
{ DstMapSpec subroutine here 2 clicks ,c1-c3;}
|
||
|
||
dstFin: Lcount ¬ ULcntsav, GOTO[detLoop] ,c1, at[MapOne,4,DstMapRet];
|
||
|
||
{determine loop and entry point}
|
||
detLoop: Mask1 ¬ Umask1, grDisp ,c2;
|
||
Q ¬ UmaskL, grDISP[chooseLoop] ,c3;
|
||
|
||
{if gray then Entry to L1 and L2D at L1I1lsar}
|
||
|
||
{Entry to L4}
|
||
L4SetUp: dirDisp, Dst ¬ UDstBit{Dbit} ,c1, at[gr.notgray,grM,chooseLoop];
|
||
Src ¬ USrcBit{Sbit}, dirDISP[CheckL4Init] ,c2;
|
||
{forward: fetch 1 if Dbit >= Sbit, else fetch 2}
|
||
[] ¬ Dst{Dbit} - Src{Sbit}, NibCarryBr, GOTO[L4I1lsar] ,c3, at[dir.forward,dirM,CheckL4Init];
|
||
|
||
{backwards: fetch 1 if Sbit >= Dbit, else fetch 2}
|
||
[] ¬ Src{Sbit} - Dst{Dbit}, NibCarryBr, GOTO[L4I1lsar] ,c3, at[dir.backwards,dirM,CheckL4Init];
|
||
|
||
{Exits}
|
||
|
||
Heighteq0: Noop ,c2;
|
||
bbNormExit: CANCELBR[$,Sub[grM,1]] ,c3;
|
||
Widtheq0: [] ¬ rhType, XDisp, L0 ¬ restore.term ,c1;
|
||
stackP ¬ 0, DISP3[LSEPReturn,2] ,c2;
|
||
{will go to RestoreRandRHRegs if not LSEP}
|
||
|
||
{RestoreRandRHRegs subroutine {2 1/3 clicks} ,c3-c3;}
|
||
|
||
BBExit: Xbus ¬ uPCCross, XRefBr ,c1, at[restore.term,10,RestoreCallers];
|
||
PC ¬ PC + 1, BRANCH[$,BBSetInt] ,c2;
|
||
Noop, GOTO[NxtInstc1] ,c3;
|
||
BBSetInt:
|
||
MesaIntRq, GOTO[NxtInstc1] ,c3;
|
||
|
||
|
||
{Mesa Interrupt}
|
||
|
||
bbDoInt: stackP ¬ 0C ,c1;
|
||
L0 ¬ restore.int ,c2;
|
||
Xbus ¬ rhType, XDisp ,c3;
|
||
|
||
DISP3[MoverhVToStkandRestore,3] ,c1;
|
||
|
||
{RestoreRandRHRegs subroutine {2 1/3 clicks} ,c2-c2;}
|
||
|
||
|
||
Rx ¬ pInt, push ,c3, at[restore.int,10,RestoreCallers];
|
||
|
||
TOS ¬ STK, pop, GOTO[SaveRegs] ,c1;
|
||
|
||
{PAGE FAULTS}
|
||
|
||
DFault: UVSsave ¬ Q ,c3;
|
||
|
||
uFaultParm0 ¬ VD ,c1;
|
||
Q ¬ rhVD, GOTO[pfCom] ,c2;
|
||
|
||
SFault: UVSsave ¬ Q ,c3;
|
||
|
||
uFaultParm0 ¬ VS, sdDisp ,c1;
|
||
Q ¬ rhVS, sdDISP[pfCom] ,c2;
|
||
pfCom: stackP ¬ 0C, GOTO[bbDoFault] ,c3, at[sd.src,sdM,pfCom];
|
||
stackP ¬ 1, GOTO[bbDoFault] ,c3, at[sd.spec,sdM,pfCom];
|
||
|
||
bbDoFault:
|
||
uFaultParm1 ¬ Q ,c1;
|
||
L0 ¬ restore.pf ,c2;
|
||
Xbus ¬ rhType, XDisp ,c3;
|
||
|
||
DISP3[MoverhVToStkandRestore,3] ,c1;
|
||
|
||
{RestoreRandRHRegs subroutine {2 1/3 clicks} ,c2-c2;}
|
||
|
||
T ¬ UVSsave {Trap index} ,c3, at[restore.pf,10,RestoreCallers];
|
||
|
||
Rx ¬ pFault, GOTO[SaveRegs] ,c1;
|
||
|
||
{END}
|
||
|
||
@
|
||
|
||
|
||
1.1.1.1
|
||
log
|
||
@first add
|
||
@
|
||
text
|
||
@@
|