Files
Arquivotheca.SunOS-4.1.4/usr.etc/gp/vp/ropnull.vp.u
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

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