144 lines
5.4 KiB
Plaintext
144 lines
5.4 KiB
Plaintext
| "@(#)%M 1.1 94/10/31 SMI"
|
|
| Copyright (c) 1986 by Sun Microsystems,Inc.
|
|
|
|
| Utilities for texture.
|
|
|
|
|
|
| rolw 9,acc,acc; ; jmap SET_PGON_TEX_BLK; ;
|
|
SET_PGON_TEX_BLK:
|
|
andw,s d,acc,y; 0xf1ff->am; ; ; | Check for out of range block. comp 0x0e00
|
|
incw cmdptr,cmdptr; ; cjp,zer stfok; ; |
|
|
compw 0,acc; ; cjp,go stfshm; ; | Invalid tex frame is -1.
|
|
stfok: addw d,acc,acc; 0x3000->am; ; ; | Similar to USEFRAME
|
|
stfshm: addw frameptr,TEX2FRAME_FRMOFF,y; ; ; ; |
|
|
IMM; am->shmemp; ; ; |
|
|
movw acc,y; am->shmem; jmap getcmd; ; |
|
|
|
|
|
|
|
|
#define Depth r[15]
|
|
#define Width r[14]
|
|
#define Height r[13]
|
|
#define Words r[12]
|
|
#define Rows r[11]
|
|
#define Block r[10]
|
|
|
|
|
|
| Can't use r[0] in stprep or stexld because PR_POLYTEX needs cmd (r[0]) preserved for use by PR_POLYSOL.
|
|
| Loads 8-bit pixels packed two per 16 bit word.
|
|
SET_PGON_TEX:
|
|
addw frameptr,TEX2FRAME_FRMOFF,y; ; ; ; | Check for valid block ptr.
|
|
IMM; am->shmemp; ; ; |
|
|
movw,s d,Block; shmem->am; ; ; | -1 == invalid tex frame.
|
|
incw cmdptr,y; am->shmemp; cjp,~neg stcmdok; ; | restore cmdptr.
|
|
movw d,Depth; shmem->am; ; ; shp+ |
|
|
movw d,r[2]; shmem->am; ; ; shp+ | Width. Pad it out.
|
|
btstw,s 3,Depth; ; ; ; |
|
|
add2nw 2,cmdptr; ; cjp,zer stbad1; ; | 4= cmd,depth,width,height
|
|
addw d,r[2],r[2]; 1->am; ; ; | 8-bit: Width= (Width + 1) >> 1
|
|
sr0w r[2],r[2]; ; cjp,go stbad0; ; |
|
|
stbad1: addw d,r[2],r[2]; 15->am; ; ; | 1-bit: Width= (Width + 15) >> 4
|
|
rolw 12,r[2],r[2]; ; ; ; |
|
|
andw d,r[2],r[2]; 0xfff->am; ; ; |
|
|
stbad0: movw d,acc; shmem->am; cjs,go multiply; ; shp+ | NumWords= Width * Height...
|
|
addw cmdptr,acc,cmdptr; ; jmap getcmd; ; | Skip cmdptr over texture.
|
|
|
|
stcmdok: ; ; cjp,f1f .; ; |
|
|
; PPLDTEX->fifo1; ; ; |
|
|
; ; cjs,go stprep_pp; ; |
|
|
|
|
stexld0: sub2nw,s 0,Rows; ; push,go; ; | Copy texture into floating pt. regs.
|
|
; shmem->fpregl; rfct; ; shp+,dp+|
|
|
movw Words,y; am->brreg; cjp,~zer stexld0; ; |
|
|
|
|
movw Width,y; am->fifo1; cjp,f1f .; ; | stores d,w,h and setups shmemp.
|
|
addw frameptr,TEX2DEPTH_FRMOFF,y; ; ; ; |
|
|
IMM; am->shmemp; ; ; |
|
|
movw Height,y; am->fifo1; cjp,f1f .; ; |
|
|
movw Depth,y; am->shmem; ; ; shp+ |
|
|
movw Width,y; am->shmem; ; ; shp+ |
|
|
movw Height,y; am->shmem; ; ; shp+ |
|
|
movw Depth,y; am->fifo1; cjp,f1f .; ; |
|
|
; TEX2DPPFRM_GL->shmemp; ; ; | What texture is on PP.
|
|
movw Block,y; am->shmem; ; ; |
|
|
movw Block,y; am->shmemp; ; ; | TexBlock pointer -> shmemp.
|
|
movw Words,y; am->brreg; ; ; |
|
|
movw Height,Rows; TempFPAddr->fpap; ; ; |
|
|
|
|
stexld: sub2nw,s 0,Rows; ; push,go; ; | Copy from fl. pt. regs to shmem & fifo
|
|
; fpregl->fifo1; cjp,f1f .; ; |
|
|
incw cmdptr,cmdptr; fpregl->shmem; ; ; ap+ |
|
|
movw d,acc; 4->am; rfct; ; shp+ | shp+,ap+ illegal combination of controls
|
|
movw Words,y; am->brreg; cjp,~zer stexld; ; |
|
|
|
|
streturn: addw cmdptr,acc,cmdptr; ; jmap getcmd; ; |
|
|
|
|
|
|
| stprep_pp does not adjust cmdptr,which must account for 3 items (d,w,h) taken from shared memory.
|
|
stprep_pp: movw d,Depth; shmem->am; ; ; shp+ |
|
|
movw d,Width; shmem->am; ; ; shp+ |
|
|
movw d,Height; shmem->am; ; ; shp+ |
|
|
btstw,s 3,Depth; =stex8_pp->brreg; ; ; |
|
|
andw,s d,Width,y; 0xf->am; cjp,~zer; ; | Is Width a multiple of 16?
|
|
rolw 12,Width,Words; 0xfff->am; ; ; | Words= Width >> 4
|
|
andw d,Words,Words; am->brreg; cjp,~zer .+2; ; |
|
|
sub2nw 0,Words; am->brreg; ; ; | If (Width not a multiple of 16) Words++
|
|
movw Height,Rows; TempFPAddr->fpdp; crtn,go; ; | Really decrement Words for loop.
|
|
stex8_pp: sub2nw 0,Width,Words; ; ; ; |
|
|
sr0w Words,Words; am->brreg; ; ; | Packed 2 per 16 bit word.
|
|
movw Height,Rows; TempFPAddr->fpdp; crtn,go; ; | TempFPAddr to avoid matrices.
|
|
|
|
|
|
|
|
| add2nw 1,cmdptr; ; jmap SET_PGON_TEX_ORG_SCR; ;
|
|
SET_PGON_TEX_ORG_SCR:
|
|
movw d,r[0]; shmem->am; ; ; shp+ | temp store sx.
|
|
movw d,r[1]; shmem->am; ; ; | temp store sy.
|
|
addw d,frameptr,acc; TEX2SX_FRMOFF->am; ; ; |
|
|
movw acc,y; am->shmemp; ; ; |
|
|
movw r[0],y; am->shmem; ; ; shp+ | store sx.
|
|
movw r[1],y; am->shmem; ; ; | store sy.
|
|
addw d,frameptr,acc; TEX2OFFKIND_FRMOFF->am; ; ; | Set kind = screen sx sy
|
|
movw acc,y; am->shmemp; ; ; |
|
|
; TEX2_SXSY->shmem; ; ; |
|
|
incw cmdptr,cmdptr; ; jmap getcmd; ; |
|
|
|
|
|
|
|
|
| movw 0,y; am->fpdp; jmap SET_PGON_TEX_ORG_XF_2D;
|
|
SET_PGON_TEX_ORG_XF_2D:
|
|
movw 0,y; am->fpap; push,go 1; ; |
|
|
movw TEX2OFFX2_FRMOFF,acc; shmem->fpregh; ; ; shp+ |
|
|
IMM; shmem->fpregl; rfct; ; shp+,dp+|
|
|
addw frameptr,acc,y; am->shmemp; push,go 1; ; |
|
|
movw 5,acc; fpregh->shmem; ; ; shp+ |
|
|
IMM; fpregl->shmem; rfct; ; shp+ |
|
|
addw d,frameptr,r[16]; TEX2OFFKIND_FRMOFF->am; ; ; | Set kind = 2D
|
|
movw r[16],y; am->shmemp; ; ; |
|
|
; TEX2_2D->shmem; ; ; |
|
|
addw cmdptr,acc,cmdptr; ; jmap getcmd; ; |
|
|
|
|
|
|
|
|
| movw 0,y; am->fpdp; jmap SET_PGON_TEX_ORG_XF_3D;
|
|
SET_PGON_TEX_ORG_XF_3D:
|
|
movw 0,y; am->fpap; push,go 2; ; |
|
|
movw TEX2OFFX3_FRMOFF,acc; shmem->fpregh; ; ; shp+ |
|
|
IMM; shmem->fpregl; rfct; ; shp+,dp+|
|
|
addw frameptr,acc,y; am->shmemp; push,go 2; ; |
|
|
movw 7,acc; fpregh->shmem; ; ; shp+ |
|
|
IMM; fpregl->shmem; rfct; ; shp+ |
|
|
addw d,frameptr,r[16]; TEX2OFFKIND_FRMOFF->am; ; ; | Set kind = 3D
|
|
movw r[16],y; am->shmemp; ; ; |
|
|
; TEX2_3D->shmem; ; ; |
|
|
addw cmdptr,acc,cmdptr; ; jmap getcmd; ; |
|
|
|
|
|
|
|
|
#undef Depth
|
|
#undef Width
|
|
#undef Height
|
|
#undef Words
|
|
#undef Rows
|
|
#undef Block
|