188 lines
6.1 KiB
Plaintext
188 lines
6.1 KiB
Plaintext
| Copyright (c) 1985 by Sun Microsystems, Inc.
|
|
| @(#)ropnull.vp.u 1.1 94/10/31 SMI
|
|
|
|
| Null to frame buffer rops.
|
|
|
|
#define LMaskTable 4096 /* vpprom address. */
|
|
#define RMaskTable 4112 /* 4096 + 16 */
|
|
|
|
#define dstx r[0] /* dbd->cgpr_offset.x */
|
|
#define dsty r[1] /* dbd->cgpr_offset.y */
|
|
#define dstwid r[2] /* dst.pr->pr_size.x */
|
|
#define dstht r[3] /* dst.pr->pr_size.y */
|
|
#define recx r[4] /* dst.pos.x */
|
|
#define recy r[5] /* dst.pos.y */
|
|
#define recwid r[6] /* dst.size.x */
|
|
#define recht r[7] /* dst.size.y */
|
|
#define w r[8]
|
|
#define color r[9]
|
|
#define FBHi r[10]
|
|
#define op r[11]
|
|
#define addrhi r[12]
|
|
#define addrlo r[13]
|
|
#define junk r[14]
|
|
#define Multiplier r[14] /* Must be same as in ropfb.vp.u. */
|
|
#define temp r[15]
|
|
#define ropmode r[16]
|
|
#define nodst r[17]
|
|
|
|
| subw,s d,fbindx,y; shmem->am; jmap PRROPNF; ;
|
|
PRROPNF: movw d,acc; shmem->am; cjs,~zer getfbaddr; ; shp+
|
|
movw PPMASK,acc; =wrfifo->brreg; ; ;
|
|
; am->fifo1; cjs,f1f; ;
|
|
andw d,cmd,acc; 0xff->am; cjs,go; ; | low 8 bits of cmd
|
|
movw d,op; shmem->am; cjs,go roprect; ; shp+
|
|
|
|
| SetUp ()
|
|
andw,s d,op,y; 1->am; ; ; | if (!(op & PIX_DONTCLIP)) prclip ()
|
|
; ; cjs,zer prclip2;;
|
|
negw,s recwid,y; ; ; ; | if ((dst.size.x <= 0) ||
|
|
negw,s recht,y; ; cjp,~neg prrnend; ; | (dst.size.y <= 0)) return
|
|
; ; cjp,~neg prrnend;;
|
|
movw PPROPNULL,acc; =wrfifo->brreg; ; ;
|
|
IMM; am->fifo1; cjs,f1f; ; | pp command
|
|
movw dstx,acc; ; ; ; | dst.pos.x += dbd->cgpr_offset.x
|
|
addw recx,acc,recx; ; ; ;
|
|
movw dsty,acc; ; ; ; | dst.pos.y += dbd->cgpr_offset.y
|
|
addw recy,acc,recy; ; ; ;
|
|
andw d,recx,temp; 0xf->am; ; ; | skew= cg2_prskew (dst.pos.x) == recx & 15
|
|
sub2nw 0,temp; am->am; ; ; | w= (dst.size.x + skew - 1) >> 4.
|
|
addw d,recwid,acc; ; ; ;
|
|
rolw 12,acc,w; ; ; ;
|
|
andw d,w,w; 0xfff->am; ; ;
|
|
rolw 11,op,color; ; ; ; | color= PIX_COLOR (op)= (op >> 5) & 0xff.
|
|
andw d,color,color; 0xff->am; ; ;
|
|
sr0w op,op; ; ; ; | op= (op >> 1) & 0xf
|
|
andw d,op,op; 0xf->am; ; ;
|
|
| SetPPMask ()
|
|
movw op,acc; ; ; ; | PIXOP_NEEDS_DST (op<<1)= (op^(op<<1)) &0xa
|
|
sl0w acc,acc; ; ; ;
|
|
xorw op,acc,acc; =wrfifo->brreg; ; ;
|
|
andw,s d,acc,acc; 0xa->am; ; ;
|
|
movw d,ropmode; 6->am; ; ; | PWRWRD->am
|
|
movw 0,nodst; ; cjp,~zer rnrop; ;
|
|
movw d,ropmode; 4->am; ; ; | PRRWRD->am
|
|
incw 0,nodst; ; ; ;
|
|
rnrop: movw d,acc; 6->am; cjs,go; ; | PWRWRD->fifo1
|
|
rnopf: movw op,acc; am->fifo1; cjs,f1f; ; | cg2_setfunction (fb,CG2_ALLROP,op)
|
|
movw 0,acc; am->fifo1; cjs,f1f; ; | RRPattern= 0
|
|
andw d,recx,acc; 0xf->am; ; ; | RRMask1= mrc_lmasktable [dst.pos.x&0xf]
|
|
addw d,acc,acc; LMaskTable->am; ; ;
|
|
movw acc,y; am->vppromp; ; ;
|
|
sub2nw 0,recwid,junk; am->am; ; ; | RRMask2= mrc_rmasktable
|
|
addw d,recx,acc; ; ; ; | [(dst.pos.x+dst.size.x-1)&0xf]
|
|
movw d,temp; vpprom->am; ; ; | temp= RRMask1
|
|
andw d,acc,acc; 0xf->am; ; ;
|
|
addw d,acc,acc; RMaskTable->am; ; ;
|
|
movw acc,y; am->vppromp; ; ;
|
|
; ; ; ;
|
|
; ; ; ;
|
|
; vpprom->fifo1; cjp,f1f .; ; | Mask2
|
|
movw temp,y; am->fifo1; cjp,f1f .; ; | Mask1
|
|
movw w,y; am->fifo1; cjp,f1f .; ; | cg2_setwidth (fb,CG2_ALLROP,w,...)
|
|
movw w,y; am->fifo1; cjp,f1f .; ; | cg2_setwidth (,,,w)
|
|
rolw 8,d,acc; 1->am; ; ; | cg2_setshift (fb,CG2_ALLROP,0,1)
|
|
movw acc,y; am->fifo1; cjp,f1f .; ; | cg2_setshift (fb,CG2_ALLROP,0,1)
|
|
rolw 8,color,acc; ; ; ; | RRSource2= color | color << 8
|
|
orw color,acc,acc; ; ; ;
|
|
movw acc,y; am->fifo1; cjp,f1f .; ;
|
|
movw recy,Multiplier; ; cjs,go MulSWWid;; | by= cg2_ropwordaddr (fb,0,recx,recy)
|
|
; ; cjs,go fbaddr; ;
|
|
movw acc,FBHi; ; ; ;
|
|
rolw 13,recx,acc; ; ; ;
|
|
andw d,acc,acc; 0x1fff->am; ; ;
|
|
addw addrlo,acc,addrlo;; ; ;
|
|
addcw d,FBHi,acc; 0x20->am; ; ; | RopFB->am
|
|
movw addrlo,y; am->fifo1; cjp,f1f .; ;
|
|
addw addrhi,acc,addrhi;; ; ;
|
|
movw addrhi,y; am->fifo1; cjp,f1f .; ;
|
|
movw recht,y; am->fifo1; cjp,f1f .; ;
|
|
movw color,y; am->fifo1; cjp,f1f .; ;
|
|
movw w,y; am->fifo1; cjp,f1f .; ;
|
|
movw nodst,y; am->fifo1; cjp,f1f .; ;
|
|
movw ropmode,y; am->fifo1; cjp,f1f .; ;
|
|
prrnend: addw d,cmdptr,cmdptr; 11->am; ; ;
|
|
; ; jmap getcmd; ;
|
|
|
|
|
|
roprect: movw d,dstx; shmem->am; ; ; shp+
|
|
movw d,dsty; shmem->am; ; ; shp+
|
|
movw d,dstwid; shmem->am; ; ; shp+
|
|
movw d,dstht; shmem->am; ; ; shp+
|
|
movw d,recx; shmem->am; ; ; shp+
|
|
movw d,recy; shmem->am; ; ; shp+
|
|
movw d,recwid; shmem->am; ; ; shp+
|
|
movw d,recht; shmem->am; crtn,go; ; shp+
|
|
|
|
|
|
prclip2:movw,s recx,y; am->am; ; ;
|
|
movw,s recy,y; ; cjp,~neg prclip2a;;
|
|
addw d,recwid,recwid; ; ; ;
|
|
movw 0,recx; ; ; ;
|
|
prclip2a:movw recy,y; am->am; cjp,~neg prclip2b;;
|
|
addw d,recht,recht; ; ; ;
|
|
movw 0,recy; ; ; ;
|
|
prclip2b:movw recx,y; am->am; ; ;
|
|
subw d,dstwid,acc; ; ; ;
|
|
subw,s recwid,acc,y; ; ; ;
|
|
movw recy,y; am->am; cjp,~neg prclip2c;;
|
|
movw acc,recwid; ; ; ;
|
|
prclip2c:subw d,dstht,acc; ; ; ;
|
|
subw,s recht,acc,y; ; ; ;
|
|
; ; crtn,~neg; ;
|
|
movw acc,recht; ; crtn,go; ;
|
|
|
|
|
|
#ifndef SWIDTH
|
|
#define SWIDTH 1152
|
|
#endif
|
|
|
|
| Multiply by SWWidth (SWidth/8). Number comes in Multiplier
|
|
| and goes out in r[0] (low) and r[1] (high).
|
|
| Must save accumulator.
|
|
|
|
#if SWIDTH == 1152
|
|
| y * 144 = y * 128 + y * 16 = y << 7 + y << 4 = (y << 3 + y) << 4
|
|
| y < (1 << 10).
|
|
| y << 3 needs no masking because y is < 1024.
|
|
#define m10 acc
|
|
MulSWWid:rolw 3,Multiplier,m10;; ; ; | y << 3. Highbits 0.
|
|
addw Multiplier,m10,m10;; ; ; | y << 3 + y.
|
|
rolw 4,m10,addrhi; ; ; ; | (y << 3 + y) << 4.
|
|
andw d,addrhi,addrlo; 0xfff0->am; ; ;
|
|
andw d,addrhi,addrhi; 0xf->am; crtn,go; ;
|
|
#undef m10
|
|
|
|
#endif
|
|
#if SWIDTH == 1024
|
|
|
|
| y * 128 = y << 7
|
|
MulSWWid:rolw 7,Multiplier,addrhi;; ; ; | (y << 3 + y) << 7.
|
|
andw d,addrhi,addrlo; 0xff80->am; ; ;
|
|
andw d,addrhi,addrhi; 0x7f->am; crtn,go; ;
|
|
|
|
#endif
|
|
|
|
#undef LMaskTable
|
|
#undef RMaskTable
|
|
|
|
#undef dstx
|
|
#undef dsty
|
|
#undef dstwid
|
|
#undef dstht
|
|
#undef recx
|
|
#undef recy
|
|
#undef recwid
|
|
#undef recht
|
|
#undef w
|
|
#undef color
|
|
#undef FBHi
|
|
#undef op
|
|
#undef addrhi
|
|
#undef addrlo
|
|
#undef junk
|
|
#undef Multiplier
|
|
#undef temp
|
|
#undef ropmode
|
|
#undef nodst
|