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

699 lines
29 KiB
Plaintext

| "@(#)3Dfp.vp.u 1.1 94/10/31 SMI"
| Copyright 1986 by Sun Microsystems, Inc.
| data pointers for 3-D routines
#define zbdcln r[25]
#define resltflg r[24]
#define xf3ptr r[23]
#define mvlist r[16]
#define inptr r[15]
#define outptr r[14]
#define clipplanes r[11]
#define countr r[10]
#define matrixptr r[9]
#define savoutcode1 r[8]
#define savoutcode0 r[7]
#define parallel r[5]
#define vwpsclptr r[4]
#define recaddr r[2]
#define count r[0]
#define tmp0 r[0]
#define tmp1 r[1]
| This utility checks if there is a gb present, and it is linked to this frame buffer. Returns a value
| of '1' if all ok, and '0' if we can't do 3d.
check3d: ; ; cjs,go gb_board_inq; ; | check GB status
xorw,s fbindx,acc,y; ; cjp,neg .+2; ; | 2D if there is no GB
incw,s 0,y; ; crtn,zer; ; | return 1 if ok
movw,s 0,y; ; crtn,go; ; | return 0 if fails
| Floating point register addresses for xf_line_flt_3d & xf_line_int_3d
| store pt1 stored at fpr[64] (fpdp=64)
| store pt2 stored at fpr[68] (fpdp=68)
| xform pt1 inptr=64, outptr = 72
| xform pt2 inptr=68, outptr = 76
| clip vector inptr=72, outptr = x
| vwp pts 1 & 2 inptr=72, outptr = 80
| store xf pt2 stored at fpr[88] (this is done before we clip)
#define move 0
#define dcue 0
| xfln3dinit sets up the texture attributes on the pp, loads the 3d matrix and viewport scaling parameters,
| and loads 1.0 for w2 before returning. It is called by xflineflt3d, and xflineint3d.
xfln3dinit:
addw frameptr,VWPXSCL_FRMOFF,y; ; ; ; | move viewport parameters (x,y & z) to fpr[32]
IMM; am->shmemp; ldct 5; ; | must do before calling dcinit
mov2nw 5,y; am->fpdp; cjs,go shm_to_fpr; ; | x,y & z parameters are moved
#ifdef GPPLUS
addw frameptr,HIDDENSURF_FRMOFF,y; ; ; ; | prepare zbdcln
IMM; am->shmemp; cjs,go check3d; ; | will shift offset up 7 bits for z-buffering
movw d,zbdcln; shmem->am; cjp,~zer .+2; ; | word is now zb.hs
movw 0,zbdcln; ; ; ; | ignore zbline attribute if no gb
bclrw dcue,zbdcln; ; cjs,go zbshiftoff; ; | clear depth cueing bit, make word zb.0
addw frameptr,DEPTHCUE_FRMOFF,y; ; ; ; |
IMM; am->shmemp; ; ; |
orw d,zbdcln,zbdcln; shmem->am; push,~go; ; | or in depth cueing bit
testw (d); PPSETZBLINE->fifo1; loop,f1nf; ; | send zbdc status to pp
movw zbdcln,y; am->fifo1; cjp,f1f .; ; |
; ; cjs,~zer dcinit_jmap; ; | initialize depth cueing params if enabaled
#endif GPPLUS
addw frameptr,TEX_FRMOFF,y; ; ; ; |
IMM; am->shmemp; cjs, go tvec_attr; ; | Texture addr->scrmemp.
movw matrixptr,y; am->shmemp; ldct 15; ; |
mov2nw 4,y; am->fpdp; cjs,go shm_to_fpr; ; | move matrix to fpr[16]
; 71->fpdp; ; ; | movw w2=1.0 to fpr[71] (only done once)
; 0x3F80->fpregh; ; ; |
; 0->fpregl; ; ; |
movw cmdptr,y; am->shmemp; ldct 2; ; |
movw,s d,mvlist; shmem->am; crtn, go; ; shp+ | pull first mvlist element & return.
#ifdef GPPLUS
dcinit_jmap:
; ; jmap dcinit; ; | jmap to dcinit on other bank
dcinit_ret: ; ; crtn,go; ; | return to line initialization
#endif GPPLUS
| incw cmdptr,cmdptr; ; jmap XF_LINE_FLT_3D; | cmdptr points to first element of mvlist
XF_LINE_FLT_3D:
; ; cjs,go xfln3dinit; ; |
xf1stpt: mov2nw 6,inptr; am->fpdp; cjs,go shm_to_fpr; ; | inptr=64, move pt1 x,y,z to here
addw d,cmdptr,cmdptr; 7->am; ; ; | cmdptr += 7
#ifndef GPPLUS
; ; cjp,neg getcmd; ; | return if was last pt
#else GPPLUS
; ; cjp,neg pickup; ; | return if was last pt
#endif GPPLUS
btstw,s move,d; shmem->am; ldct 2; ; shp+ | mvlist for second point
movw,s d,mvlist; ; cjp,~zer xf1stpt; ; | jump if 2nd point is a move.
add2nw 3,inptr,outptr; 0x3F80->fpregh; ; ; | outptr=72, want xf pt1 x,y,z,w here
movw 0,y; am->fpregl; ; ; | w1 = 1.0 at fpr[67]
mov2nw 4,y; am->fpap; cjs,go xf3; ; | matrix ptr in fpap; xform 1st point
add2nw 3,inptr; ; ; ; | inptr = 72
add2nw 3,outptr; ; ; ; | outptr = 80
xf2ndpt: ; 16->fpap; ; ; | move pt2 x,y,z coords to fpr[68]
sub2nw 2,inptr; am->fpdp; cjs,go shm_to_fpr; ; | inptr = 68, fetch pt2 x,y,z & store here
sub2nw 2,outptr; ; cjs,go xf3; ; | outptr = 76, want xf 2nd pt here
#ifndef GPPLUS
; 88->fpdp; ; ; | store xformed, unclipped pt2 at fpr[88]
#else GPPLUS
incw pkcntlo,pkcntlo; 88->fpdp; ; ; | store xformed, unclipped pt2 at fpr[88]
addcw d,pkcnthi,pkcnthi; 0->am; ; ; | add carry to high word
#endif GPPLUS
mov2nw 2,count; 76->fpap; ; ; | xformed pt2 is currently at fpr[76]
xfstpt2: sub2nw,s 0,count; fpregh->fpregh; ; ; |
movw,s clipplanes,y; fpregl->fpregl; cjp,~zer xfstpt2; ; adp+ | increment a & d pointers, loop till done
add2nw,s 2,inptr; am->fpap; cjs,~zer clpvec3;; | inptr = 72 (xf 1st pt.) clip vector if clipplanes!=0;
| also if no clip, force cc to ~zer so vec is drawn
add2nw 2,outptr; ; cjs,~zer vwpsndvec3_xy;; | outptr = 80. if visible, scale to viewport, cnvrt to
| int, & xmit to PP
movw,s mvlist,y; 7->am; ; ; | test if just sent last vector
#ifndef GPPLUS
addw d,cmdptr,cmdptr; am->shmemp; cjp,neg getcmd; ; | cmdptr += 7 and exit if was last vector
#else GPPLUS
addw d,cmdptr,cmdptr; am->shmemp; cjp,neg pickup; ; | cmdptr += 7 and exit if was last vector
#endif GPPLUS
movw d,mvlist; shmem->am; ldct 2; ; shp+ | fetch mvlist for next point
btstw,s move,mvlist; 88->fpap; ; ; | copy xf pt2 to xf pt1 area
mov2nw 2,count; 72->fpdp; ; ; |
movw,s mvlist,y; ; cjp,~zer xf1stpt; ; | Will check if last point if jump.
sub2nw,s 0,count; fpregh->fpregh; ; ; | jump if 2nd point is a movw
xfswap: ; fpregl->fpregl; cjp,zer xf2ndpt; ; adp+ | increment a & d pointers
sub2nw,s 0,count; fpregh->fpregh; cjp,go xfswap; ; | loop
| incw cmdptr,cmdptr; ; jmap XF_LINE_INT_3D; | cmdptr points to first element of mvlist
XF_LINE_INT_3D:
; ; cjs,go xfln3dinit; ; |
xf1stpti: mov2nw 6,inptr; am->fpdp; cjs,go shm_to_fpr; ; | inptr=64, move pt1 x,y,z to here
addw d,cmdptr,cmdptr; 7->am; ; ; | cmdptr += 7
#ifndef GPPLUS
; ; cjp,neg getcmd; ; | return if was last pt
#else GPPLUS
; ; cjp,neg pickup; ; | return if was last pt
#endif GPPLUS
btstw,s move,d; shmem->am; ldct 2; ; shp+ | mvlist for second point
movw,s d,mvlist; ; cjp,~zer xf1stpti; ; | jump if 2nd point is a move.
add2nw 3,inptr,outptr; 0x3F80->fpregh; ; ; | outptr=72, want xf pt1 x,y,z,w here
movw 0,y; am->fpregl; ; ; | w1 = 1.0 at fpr[67]
mov2nw 4,y; am->fpap; cjs,go xfint3; ; | matrix ptr in fpap; convert to int & xform 1st point
add2nw 3,inptr; ; ; ; | inptr = 72
add2nw 3,outptr; ; ; ; | outptr = 80
xf2ndpti: ; 16->fpap; ; ; | move pt2 x,y,z coords to fpr[68]
sub2nw 2,inptr; am->fpdp; cjs,go shm_to_fpr; ; | inptr = 68, fetch pt2 x,y,z & store here
sub2nw 2,outptr; ; cjs,go xfint3; ; | outptr = 76, 2nd pt->int & xform to here
#ifndef GPPLUS
; 88->fpdp; ; ; | store xformed, unclipped pt2 at fpr[88]
#else GPPLUS
incw,s pkcntlo,pkcntlo; 88->fpdp; ; ; | store xformed, unclipped pt2 at fpr[88]
addcw d,pkcnthi,pkcnthi; 0->am; ; ; | add carry to high word
#endif GPPLUS
mov2nw 2,count; 76->fpap; ; ; | xformed pt2 is currently at fpr[76]
xfstpt2i: sub2nw,s 0,count; fpregh->fpregh; ; ; |
movw,s clipplanes,y; fpregl->fpregl; cjp,~zer xfstpt2i; ; adp+ | increment a & d pointers, loop till done
add2nw,s 2,inptr; am->fpap; cjs,~zer clpvec3;; | inptr = 72 (xf 1st pt.) clip vector if clipplanes!=0;
| also if no clip, force cc to ~zer so vec is drawn
add2nw 2,outptr; ; cjs,~zer vwpsndvec3_xy;; | outptr = 80. if visible, scale to viewport, cnvrt to
| int, & xmit to PP
movw,s mvlist,y; 7->am; ; ; | test if just sent last vector
#ifndef GPPLUS
addw d,cmdptr,cmdptr; am->shmemp; cjp,neg getcmd; ; | cmdptr += 7 and exit if was last vector
#else GPPLUS
addw d,cmdptr,cmdptr; am->shmemp; cjp,neg pickup; ; | cmdptr += 7 and exit if was last vector
#endif GPPLUS
movw d,mvlist; shmem->am; ldct 2; ; shp+ | fetch mvlist for next point
btstw,s move,mvlist; 88->fpap; ; ; | copy xf pt2 to xf pt1 area
mov2nw 2,count; 72->fpdp; ; ; |
movw,s mvlist,y; ; cjp,~zer xf1stpti; ; | Will check if last point if jump.
sub2nw,s 0,count; fpregh->fpregh; ; ; | jump if 2nd point is a movw
xfswapi: ; fpregl->fpregl; cjp,zer xf2ndpti; ; adp+ | increment a & d pointers
sub2nw,s 0,count; fpregh->fpregh; cjp,go xfswapi; ; | loop
#undef move
| xfvec3dinit is called by xfvec_3d and corendcvec_3d to perform initialization.
xfvec3dinit:
movw frameptr,y; am->shmemp; cjs,go vec_attr; ;
movw matrixptr,y; am->shmemp; ldct 15; ;
mov2nw 4,y; am->fpdp; cjs,go shm_to_fpr;; | move matrix to fpr[16]
#ifndef GPPLUS
addw d,frameptr,acc; VWPXSCL_FRMOFF->am; ; ; |
#else
addw d,frameptr,acc; VWPXSCL_FRMOFF->am; push,~go; ; |
; PPSETZBLINE->fifo1; loop,f1nf; ; |
movw 0,zbdcln; am->fifo1; cjp,f1f .; ; | disable zbuffering and depth cueing for line
; PPSETPICKMODE->am; ; ; | disable picking for old commands
movw d,y; am->fifo1; cjp,f1f .; ; |
movw 0,y; am->fifo1; cjp,f1f .; ; |
#endif GPPLUS
movw acc,y; am->shmemp; ldct 5; ; | move viewport parameters to fpr[32]
mov2nw 5,y; am->fpdp; cjp,go shm_to_fpr; ; | x,y & z parameters
| negw d,countr; shmem->am; jmap XFVEC_3D; ;
XFVEC_3D: ; ; cjs,go xfvec3dinit; ; | initialization for old format opers.
add2nw 1,cmdptr; am->shmemp; ldct 2; ;
nxtvec3: mov2nw 6,inptr; am->fpdp; cjs,go shm_to_fpr;; | move pt1 x,y,z coords to fpr[64]
add2nw 2,cmdptr; 0x3F80->fpregh; ; ; | w1 = 1.0, cmdptr += 4
movw 0,y; am->fpregl; ldct 2; ; dp+ | ldct 2 into 2910 counter
movw,s clipplanes,y; ; cjs,go shm_to_fpr;; | move pt2 x,y,z coords to fpr[68]
| clipplanes==0? (xf3 doesn't affect cc's)
add2nw 3,inptr,outptr; 0x3F80->fpregh; ; ; | want transformed endpoints at fpr[72]
movw 0,y; am->fpregl; ; ; | w2 = 1.0
mov2nw 4,y; am->fpap; cjs,go xf3; ; | matrix ptr in fpap; xform 1st point
add2nw 2,inptr; 16->fpap; ; ;
add2nw 2,outptr; ; cjs,go xf3; ; | transform 2nd point
add2nw,s 2,inptr; am->fpap; cjs,~zer clpvec3;; | clip vector if clipplanes!=0; also if no
| clip, force cc to ~zer so vec is drawn
add2nw 2,outptr; ; cjs,~zer vwpsndvec3_xy;; | if visible, scale to viewport, cnvrt to
| int, & xmit to PP
incw,s countr,countr; ; ldct 2; ; | reload 2910 R reg; incr vec loop cntr
add2nw 3,cmdptr; am->shmemp; cjp,~zer nxtvec3;; | cmdptr += 8 and loop if more vectors
; ; jmap getcmd; ;
| negw d,countr; shmem->am; jmap CORENDCVEC_3D;;
CORENDCVEC_3D:
; ; cjs,go xfvec3dinit; ; | initialization for old format opers.
add2nw 1,cmdptr; am->shmemp; ldct 2; ;
cnxtvec3: mov2nw 6,inptr; am->fpdp; cjs,go shm_to_fpr;; | move pt1 x,y,z coords to fpr[64]
add2nw 2,cmdptr; 0x3F80->fpregh; ; ; | w1 = 1.0, cmdptr += 4
movw 0,y; am->fpregl; ldct 2; ; dp+ | ldct 2 into 2910 counter
movw,s clipplanes,y; ; cjs,go shm_to_fpr;; | move pt2 x,y,z coords to fpr[68]
| clipplanes==0? (xf3 doesn't affect cc's)
add2nw 3,inptr,outptr; 0x3F80->fpregh; ; ; | want transformed endpoints at fpr[72]
movw 0,y; am->fpregl; cjs,go ndcflt3; ; | w2 = 1.0; convert xyz's to float
mov2nw 4,y; am->fpap; cjs,go xf3; ; | matrix ptr in fpap; xform 1st point
add2nw 2,inptr; 16->fpap; ; ;
add2nw 2,outptr; ; cjs,go xf3; ; | transform 2nd point
add2nw,s 2,inptr; am->fpap; cjs,~zer clpvec3;; | clip vector if clipplanes!=0; also if no
| clip, force cc to ~zer so vec is drawn
add2nw 2,outptr; ; cjs,~zer vwpsndvec3_xy;; | if visible, scale to viewport, cnvrt to
| int, & xmit to PP
incw,s countr,countr; ; ldct 2; ; | reload 2910 R reg; incr vec loop cntr
add2nw 3,cmdptr; am->shmemp; cjp,~zer cnxtvec3;; | cmdptr += 8 and loop if more vectors
; ; jmap getcmd; ;
ndcflt3: movw inptr,y; am->fpap; ; lmode rn,ai,pipe,fast; | cnvrt 2 xyz's starting at inptr to float
; ; ; floata,la,hi; | x0
; ; ; ; ap+
; ; ; floata,la,hi; | y0
; ; ; ; ap+
addw inptr,4,acc; ; ; floata,la,hi; | z0
IMM; am->fpap; ; ;
; ; ; floata,la,hi; | x1
; ; ; ; ap+
mov2nw 0,y; am->brreg; ; floata,la,a,hi; | y1
movw inptr,y; am->fpdp; push,go; ; ap+
; ; ; floata,la,a,st,hi; | z1; store x0' & y0'
; ; rfct; ; dp+
; ; ; pa,a,st,hi; | store z0
movw acc,y; am->fpdp; push,go; ;
; ; ; pa,a,st,hi; | store x1 and y1
; ; rfct; ; dp+
; ; ; noflop,st,hi; | store z1
; ; crtn,go; ; | return
| negw d,countr; shmem->am; jmap PROC_LINE_INT_3D;;
PROC_LINE_INT_3D:
movw d,xf3ptr; =xfint3->am; ; ; | set ptr to fixtofloat routine
; ; cjp,~zer cwdvec3; ; | and fall through to xf3. otherwise
| use regular float routine
proc3_ret: add2nw 1,cmdptr; am->shmemp; jmap getcmd2; ; | return if nvecs == 0
| negw,s d,countr; shmem->am; jmap PROC_LINE_FLT_3D;;
PROC_LINE_FLT_3D:
movw d,xf3ptr; =xf3->am; ; ; | set ptr to regular xf3 routine
cwdvec3: addw d,frameptr,acc; CLPPLNS_FRMOFF->am; ; ; |
movw acc,y; am->shmemp; cjp,zer proc3_ret; ; |
movw d,clipplanes; shmem->am; ; ; shp+ | save clipplanes
; shmem->shmemp; ldct 15; ; | shmemp <- matrixptr
mov2nw 4,y; am->fpdp; cjs,go shm_to_fpr;; | move matrix to fpr[16]
addw d,frameptr,acc; VWPXSCL_FRMOFF->am;; ;
movw acc,y; am->shmemp; ldct 5; ; |shmemp <- addr of vwp params
mov2nw 5,y; am->fpdp; cjs,go shm_to_fpr;; | move viewport parameters to fpr[32]
add2nw 1,cmdptr; am->shmemp; ldct 2; ;
cwnnxtvec3:
mov2nw 6,inptr; am->fpdp; cjs,go shm_to_fpr; ; shp+ | move pt1 x,y,z coords to fpr[64]
movw 0,resltflg; 0x3F80->fpregh; ; ; | w1 = 1.0; reset resltflg for each vector
movw 0,y; am->fpregl; ldct 2; ; dp+ | ldct 2 into 2910 counter
movw,s clipplanes,y; ; cjs,go shm_to_fpr;; | move pt2 x,y,z coords to fpr[68]
| clipplanes==0? (xf3 doesn't affect cc's)
; ; cjs,go cwn3; ; | shared routine to process 3D vector
cwnout3: btstw,s 0,resltflg; ; ; ; | test if invisible
; ; cjp,~zer cwnnovec3; ; | if so next vector
movw vwpsclptr,y; am->fpap; ; lmode rn,ai,pipe,fast; | fpap <- &x0; pipeline mode
; ; ; fixa,la,hi; | convert x0 to integer
; ; ; ; ap+
; ; ; fixa,la,hi; | y0
; ; ; ; ap+
movw 76,y; ; ; fixa,la,hi; | z0
IMM; am->fpap; ; ; | fpap <- &x1
movw 5,y; ; ; fixa,la,hi; | x1
IMM; am->brreg; ; ; ap+ | brreg <- 5
; ; ; fixa,la,a,hi; | y1
movw 0,y; am->fpdp; push,go; ; ap+ | fpdp <- 0; 2910 R reg <- 5
; ; ; fixa,la,a,st,hi; | fix z1; store x0,y0,z0,x1,y1,z1 starting
movw 0,y; am->fpap; rfct; ; dp+ | fpreg[0]; fpap <- 0
addw d,cmdptr,cmdptr; 13->am; push,go; ; | cmdptr += 13
; fpregh->shmem; ; ; shp+ | overwrite original coords in shmem
; fpregl->shmem; rfct; ; shp+,abp+
cwnloop3:
movw 0,y; am->shmem; ; ; shp+ | dataready[i] <- 0;shmemp <- nxt vec addr
incw,s countr,countr; ; ldct 2; ; | reload 2910 R reg; incr vec loop cntr
incw cmdptr,cmdptr; ; cjp,~zer cwnnxtvec3;; | cmdptr += 1 and loop if more vectors
; ; jmap getcmd; ;
cwn3: movw xf3ptr,y; am->brreg; ; ; |
add2nw 3,inptr,outptr; 0x3F80->fpregh; ; ; | want transformed endpoints at fpr[72]
movw 0,y; am->fpregl; ; ; | w2 = 1.0
mov2nw 4,y; am->fpap; cjs,go; ; | matrix ptr in fpap; xform 1st point
add2nw 2,inptr; 16->fpap; ; ;
add2nw 2,outptr; ; cjs,go; ; | transform 2nd point
add2nw,s 2,inptr; am->fpap; cjs,~zer clpvec3;; | clip vector if clipplanes!=0; also if no
| clip, force cc to ~zer so vec is vwpscld
movw clipplanes,acc; ; cjp,zer cwnsetreslt;; | if invisible, don't scale to viewport
andw,s savoutcode0,acc,y;; ; ; | set cc to reflect clip status of pt1
movw 0,tmp0; ; cjp,zer .+2; ; | tmp0<-0; compute resultflag[i] in tmp0
bsetw 0,tmp0; ; ; ; | set bit 0 if pt1 was clipped
andw,s savoutcode1,acc,y;; ; ; | set cc to reflect clip status of pt2
movw cmdptr,y; am->shmemp; cjp,zer .+2; ; | shmemp <- &resultflag[i]
bsetw 1,tmp0; am->shmem; cjp,go .+2; ; shp+ | set bit 1 if pt2 clip; resultflag<-tmp0
movw tmp0,y; am->shmem; ; ; shp+ | resultflag<-tmp0 (if pt2 not clipped)
| clpvec3 returns with fpap==inptr if pt
| visible, so fpap==inptr==72 from above
sub2nw 0,inptr,vwpsclptr; am->fpdp; push,go 3; ; | fpdp <- vwpsclptr <- 71
; fpregh->fpregh; ; ; | shift x0,y0,z0,w0 up by 1 fpreg location
; fpregl->fpregl; rfct; ; adp+ | so spacing between x0 and x1 is correct
| for vwpsclpts3 routine (5 locations)
incw 0,y; am->brreg; cjp,go vwpsclpts3;; | call vwpsclpts3 with brreg==1 (npts-1)
| & vwpsclptr==&x0 to vwpscl pts in place
cwnsetreslt:
mov2nw 0,resltflg; ; crtn,go; ; | set resultflag = 1 for invisible
cwnnovec3:
movw cmdptr,y; am->shmemp; ; ; | shmemp <- &resultflag[i]
addw cmdptr,13,cmdptr; 0xFFFF->shmem; ; ; | resultflag for this vector <- 0xFFFF
IMM; am->shmemp; cjp,go cwnloop3;; | shmemp <- cmdptr <- &dataready[i]
| goto cwnloop3
| mulptinit3 does the initialization for mulpt int and flt 3d.
mulptinit3:
addw frameptr,MATRIXPTR_FRMOFF,y; 3->brreg; ; ; | brreg <- 3
IMM; am->shmemp; ; ; | shmemp <- addr of matrixptr
mov2nw 2,outptr; shmem->shmemp; ldct 15; ; | shmemp <- addr of matrix; outptr <- 4
mov2nw 4,y; am->fpdp; cjs,go shm_to_fpr;; | move matrix to fpr[16]
add2nw 1,cmdptr; am->shmemp; ldct; ; | shmemp <- (cmdptr += 2), addr of 1st pt
; ; crtn,go; ; |
| negw d,countr; shmem->am; jmap MUL_POINT_FLT_3D;; | countr <- -npts
MUL_POINT_FLT_3D:
; ; cjs,go mulptinit3; ; |
xfpt3nxt: movw 0,inptr; am->fpdp; cjs,go shm_to_fpr;; | move pt[i] to fpr[0]
mov2nw 4,y; am->fpap; cjs,go xf3; ; | xform pt and store result at fpr[4]
movw cmdptr,y; am->shmemp; ; ; | shmemp <- addr of pt
incw,s countr,countr; 4->fpap; push,go; ; | countr += 1; fpap <- addr of xformed pt
; fpregh->shmem; ; ; shp+ | move xformed pt to shared memory,
; fpregl->shmem; rfct; ; shp+,abp+ | overwriting original pt
addw d,cmdptr,cmdptr; 9->am; ldct; ; | cmdptr += 9, addr of pt[i+1]
movw 0,y; am->shmem; cjp,~zer xfpt3nxt;; shp+ | flag[i] <- 0, indicating xform done
| loop back for next pt;shmemp == &pt[i+1]
; ; jmap getcmd; ;
| negw d,countr; shmem->am; jmap MUL_POINT_INT_3D;; | countr <- -npts
MUL_POINT_INT_3D:
; ; cjs,go mulptinit3; ; |
xfpt3nxti: movw 0,inptr; am->fpdp; cjs,go shm_to_fpr; ; | move pt[i] to fpr[0]
mov2nw 4,y; am->fpap; cjs,go xfint3w; ; | xform pt & w & store result at fpr[4]
movw outptr,inptr; ; cjs,go fltoint3; ; | convert float res to int, need inptr
movw cmdptr,y; am->shmemp; ; ; | shmemp <- addr of pt
incw,s countr,countr; 4->fpap; push,go; ; | countr += 1; fpap <- addr of xformed pt
; fpregh->shmem; ; ; shp+ | move xformed pt to shared memory,
; fpregl->shmem; rfct; ; shp+,abp+ | overwriting original pt
addw d,cmdptr,cmdptr; 9->am; ldct; ; | cmdptr += 9, addr of pt[i+1]
movw 0,y; am->shmem; cjp,~zer xfpt3nxti;; shp+ | flag[i] <- 0, indicating xform done
| loop back for next pt;shmemp == &pt[i+1]
; ; jmap getcmd; ;
| movw d,acc; shmem->am; jmap MUL_MAT_3D;; shp+ | acc <- indexA
MUL_MAT_3D:
movw d,tmp0; shmem->am; ; ; shp+ | tmp0 <- indexB
movw d,tmp1; shmem->am; ; ; | tmp1 <- indexC
; ; cjs,go indices2addrs; ; | convert matrix indices to matrix addresses
movw acc,y; am->shmemp; ldct 15; ; | shmemp <- addr of matrix A
mov2nw 4,inptr; am->fpdp; cjs,go shm_to_fpr;; | move matrix A to fpr[16]
movw tmp0,y; am->shmemp; ldct 15; ; | shmemp <- addr of matrix B
mov2nw 5,y; am->fpdp; cjs,go shm_to_fpr;; | move matrix B to fpr[32]
mov2nw 5,y; am->fpap; ; ; | fpap <- addr of matrix B (in fpr)
mov2nw 6,outptr; ; cjs,go xf3; ; | outptr <- addr of matrix C (fpr[64])
| inptr == addr of 1st row of matrix A
| xf3 produces 1st row of matrix C
add2nw 2,inptr; 32->fpap; ; ;
add2nw 2,outptr; ; cjs,go xf3; ; | produce 2nd row of matrix C
add2nw 2,inptr; 32->fpap; ; ;
add2nw 2,outptr; ; cjs,go xf3; ; | produce 3rd row of matrix C
add2nw 2,inptr; 32->fpap; ; ;
add2nw 2,outptr; ; cjs,go xf3; ; | produce 4th row of matrix C
; 64->fpap; ; ; | fpap <- addr of matrix C (in fpr)
movw tmp1,y; am->shmemp; push,go 15; ; | shmemp <- addr of matrix C (in shmem)
| (d still has XFORM_FRMOFF)
; fpregh->shmem; ; ; shp+ | move matrix C to shmem
; fpregl->shmem; rfct; ; shp+,abp+
add2nw 2,cmdptr,cmdptr; ; jmap getcmd; ; | cmdptr += 4; jump to cmd loop
| fltoint3 -- 3D conversion from float to int. Operates on a single point and converts
| the points in place, ie, overwrites the original floating point value.
|
| Input Parameters: inptr -- Location of point to be converted.
fltoint3: movw inptr,y; am->fpap; ; lmode rn,ai,pipe,fast;
movw inptr,y; am->fpdp; ; fixa,la,hi; | convert x to int
; ; ; ; ap+
; ; ; fixa,la,hi; | convert y to int
; ; ; ; ap+
; ; ; fixa,la,hi; | convert z to int
; ; ; ; ap+
; ; ; fixa,la,hi; | convert w to int
; ; ; ;
; ; ; pa,a,hi;
; ; ; ;
; ; ; pa,a,st,hi; | overwrite x
; ; ; ; dp+
; ; ; pa,a,st,hi; | overwrite y
; ; ; ; dp+
; ; ; pa,a,st,hi; | overwrite z
; ; ; ; dp+
; ; ; noflop,st,hi; | overwrite w
; ; crtn, go; ;
| xfint3w -- convert point from fix to float, including w, and jump to xf3.
|
| Important Properties: Does not use brreg; Does not use 2910 R register (counter)
| Does not change latched 29116 condition code status
| Note: difference with xfint3 is that this converts w also.
|
xfint3w: movw inptr,y; am->fpap; ; lmode rn,ai,pipe,fast;
; ; ; floata,la,hi; | x
; ; ; ; ap+
; ; ; floata,la,hi; | y
; ; ; ; ap+
; ; ; floata,la,hi; | z
; ; ; ; ap+
; ; ; floata,la,hi; | w
; ; ; ;
; ; ; pa,a,hi;
movw inptr,y; am->fpdp; ; ;
; ; ; pa,a,st,hi; | overwrite x
; ; ; ; dp+
; ; ; pa,a,st,hi; | overwrite y
; ; ; ; dp+
; ; ; pa,a,st,hi; | overwrite z
; ; ; ; dp+
; ; ; noflop,st,hi; | overwrite w
mov2nw 4,y; am->fpap; ; ; | reload fpap and call xf3
; ; cjp,go xf3; ;
|
| Important Properties: Does not use brreg; Does not use 2910 R register (counter)
| Does not change latched 29116 condition code status
|
xfint3: movw inptr,y; am->fpap; ; lmode rn,ai,pipe,fast; |
; ; ; floata,la,hi; | x
; ; ; ; ap+
; ; ; floata,la,hi; | y
; ; ; ; ap+
; ; ; floata,la,hi; | z
; ; ; ;
; ; ; pa,hi;
; ; ; ;
; ; ; pa,a,hi;
movw inptr,y; am->fpdp; ; ;
; ; ; pa,a,st,hi; | overwrite x
; ; ; ; dp+
; ; ; pa,a,st,hi; | overwrite y
; ; ; ; dp+
; ; ; noflop,st,hi; | overwrite z
mov2nw 4,y; am->fpap; ; ; | reload fpap and fall through to xf3
| xf3 -- 3-D floating point transform
|
| Input Parameters: inptr -- Address of input point
| outptr -- Address of output point
| matrix -- fpap should have been loaded
| with the address of the matrix
| prior to calling this routine.
| A 4x4 matrix
|
| Comments: Locations at address outptr are used as temporary storage.
| This routine cannot be used to transform a point in place,
| i.e. inptr should not be the same as outptr.
|
|
| Important Properties: Does not use brreg; Does not use 2910 R register (counter)
| Does not change latched 29116 condition code status
|
xf3: movw inptr,y; am->fpbp; ; lmode rn,ai,pipe,fast;
movw outptr,y; am->fpdp; ; maba,lab,hi; | m11*x
; ; ; ; ap+
; ; ; maba,la,hi; | m12*x
; ; ; ; ap+
; ; ; maba,la,hi; | m13*x
; ; ; ; ap+
; ; ; maba,la,hi; | m14*x
; ; ; ; abp+
; ; ; maba,lab,m,hi; | m21*y
; ; ; ; ap+
; ; ; maba,la,m,st,hi; | m22*y , store m11*x
; ; ; ; adp+
; ; ; maba,la,m,st,hi; | m23*y , store m12*x
; ; ; ; adp+
; ; ; maba,la,m,st,hi; | m24*y , store m13*x
; ; ; ; adp+
movw outptr,y; am->fpbp; ; pa,m,st,hi; | store m14*x
movw outptr,y; am->fpdp; ; ;
; ; ; addr,lab,m,hi; | m21*y + m11*x
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m22*y + m12*x
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m23*y + m13*x
; ; ; ; bp+
addw inptr,2,y; ; ; addr,lab,hi; | m24*y + m14*x
; am->fpbp; ; ;
; ; ; maba,lab,a,hi; | m31*z
; ; ; ; ap+
; ; ; maba,la,a,st,hi; | m32*z , store m21*y + m11*x
; ; ; ; adp+
; ; ; maba,la,a,st,hi; | m33*z , store m22*y + m12*x
; ; ; ; adp+
; ; ; maba,la,a,st,hi; | m34*z , store m23*y + m13*x
; ; ; ; adp+
movw outptr,y; am->fpbp; ; pa,m,st,hi; | store m24*y + m14*x
movw outptr,y; am->fpdp; ; ;
; ; ; addr,lab,m,hi; | m31*z + (m21*y + m11*x)
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m32*z + (m22*y + m12*x)
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m33*z + (m23*y + m13*x)
; ; ; ; bp+
addw inptr,3,y; ; ; addr,lab,hi; | m34*z + (m24*y + m14*x)
; am->fpbp; ; ;
; ; ; maba,lab,a,hi; | m41*w
; ; ; ; ap+
; ; ; maba,la,a,st,hi; | m42*w , store m31*z + (m21*y + m11*x)
; ; ; ; adp+
; ; ; maba,la,a,st,hi; | m43*w , store m32*z + (m22*y + m12*x)
; ; ; ; adp+
; ; ; maba,la,a,st,hi; | m44*w , store m33*z + (m23*y + m13*x)
; ; ; ; dp+
movw outptr,y; am->fpbp; ; pa,m,st,hi; | store m34*z + (m24*y + m14*x)
movw outptr,y; am->fpdp; ; ;
; ; ; addr,lab,m,hi; | m41*w + (m31*z + m21*y + m11*x)
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m42*w + (m32*z + m22*y + m12*x)
; ; ; ; bp+
; ; ; addr,lab,m,hi; | m43*w + (m33*z + m23*y + m13*x)
; ; ; ; bp+
; ; ; addr,lab,hi; | m44*w + (m34*z + m24*y + m14*x)
; ; ; ;
; ; ; pa,a,hi;
; ; ; ;
; ; ; pa,a,st,hi; | x' = m41*w + m31*z + m21*y + m11*x
; ; ; ; dp+
; ; ; pa,a,st,hi; | y' = m42*w + m32*z + m22*y + m12*x
; ; ; ; dp+
; ; ; pa,a,st,hi; | z' = m43*w + m33*z + m23*y + m13*x
; ; ; ; dp+
; ; ; noflop,st,hi; | w' = m44*w + m34*z + m24*y + m14*x
; ; crtn,go; ;
| vwpsndvec3_xy -- scale 3-D vector (x0,y0,z0,w0 x1,y1,z1,w1) to viewport,
| convert floating point coordinates to integer, and
| send to Painting Processor
| produces only scaled x and y
| input vectors are in NDC, i.e. clipped vectors will have
| -1.0 <= x/w,y/w <= 1.0
|
| Input Parameters: inptr -- address of first input point x,y,z,w (transformed and clipped)
| outptr -- address for viewport scaled x,y
|
|
vwpsndvec3_xy:
movw 0,recaddr; 3->am; ; ; | use fpr[0,1] for reciprocals
addw d,inptr,y; am->fpap; cjs,go paratest; ; | test for parallel proj: w == 1
incw recaddr,recaddr; 7->am; ; ;
vwrecp2: addw d,inptr,y; am->fpap; cjs,go recip; ; | compute reciprocal of w1
movw inptr,y; am->fpap; ; lmode rn,ai,pipe,fast;
movw 0,y; am->fpbp; ; ; | address of w0 -> fpbp
; ; ; maba,lab,hi; | x0 * 1/w0
movw 0,parallel; ; ; ; ap+
addw inptr,4,y; ; ; maba,la,hi; | y0 * 1/w0
IMM; am->fpap; ; ; bp+
movw =vwpsv2,y; ; ; maba,lab,hi; | x1 * 1/w1
IMM; am->brreg; ; ; ap+
; ; ; maba,la,hi; | y1 * 1/w1
; ; ; ;
mov2nw 5,acc; am->fpbp; ; pa,m,hi; | fpbp pts to viewport params
; ; ; ;
; ; ; mabr,lab,m,hi; | x0 * VWPXSCL
add2nw 1,acc; am->fpbp; ; ;
; ; ; mabr,lab,m,hi; | y0 * VWPYSCL
sub2nw 1,acc; am->fpbp; ; ;
; ; ; mabr,lab,m,hi; | x1 * VWPXSCL
add2nw 1,acc; am->fpbp; ; ;
movw 0,parallel; ; ; mabr,lab,hi; | y1 * VWPYSCL, note that did persp. proj.
sub2nw 0,acc; am->fpbp; cjp,go; ; | fpbp<-&Vwpxoff; jump to vwpsv2 to
| finish scaling, conversion, & xmit to PP
vwparll: mov2nw 5,acc; am->fpbp; ; lmode rn,ai,pipe,fast; | fpbp pts to viewport params
movw =vwpsv2,y; ; ; ;
IMM; am->brreg; ; maba,lab,hi; | x0 * VWPXSCL
add2nw 1,acc; am->fpbp; ; ; ap+
incw 0,parallel; ; ; maba,lab,hi; | y0 * VWPYSCL, note that did parallel proj.
sub2nw 1,acc; am->fpbp; ; ; ap+
add2nw 2,inptr,tmp0; am->fpap; ; ;
; ; ; maba,lab,hi; | x1 * VWPXSCL
add2nw 1,acc; am->fpbp; ; ; ap+
; ; ; maba,lab,hi; | y1 * VWPYSCL
sub2nw 0,acc; am->fpbp; cjp, go; ; | fpbp<-&Vwpxoff; jump to vwpsv2 to
| finish scaling, conversion, & xmit to PP
paratest:
movw d,acc; 0x3f80->am; ; ; | test for fp 1.0
subw,s d,acc,y; fpregh->am; ; ; | compare msw
movw,s d,y; fpregl->am; cjp,~zer recip; ; | compare lsw, if either fail jp recip
movw recaddr,y; am->fpdp; cjp,~zer recip; ; | otherwise no need for divide
sub2nw 0,outptr,tmp0; am->fpap; ; ; | w2 is at (outptr-1)
subw,s d,acc,y; fpregh->am; ; ; | compare msw (fp 1 is in acc)
movw,s d,y; fpregl->am; cjp,~zer parecip; ; | jump if w2 is also 1
movw inptr,y; am->fpap; cjpp,zer vwparll; ; | jump to vwp scale if w2==1 also
parecip: sub2nw 2,tmp0; am->fpap; ; ; | 'a' ptr set to w1
incw recaddr,recaddr; fpregh->fpregh; ; ; | need to set recip for w1==1 for multiply
; 7->am; ; ; | adjust d-latch for vwrecp2
; fpregl->fpregl; cjpp,go vwrecp2; ; | return to find recip for pt2
#undef tmp0
#undef tmp1
#undef count
#undef matrixptr
#include "clpvec3.vp.u"
#undef zbdcln
#undef resltflg
#undef xf3ptr
#undef mvlist
#undef parallel
#undef inptr
#undef outptr
#undef clipplanes
#undef countr
#undef recaddr
#undef move
#undef dcue
#include "xfpolygon3.vp.u"