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

188 lines
7.7 KiB
Plaintext

| "@(#)offset.pp.u 1.1 94/10/31"
| Copyright 1986 by Sun Microsystems, Inc.
| Written by Stuart Levy
| Expects the following registers to be loaded:
| segaddr,stoff,majax,patln,givpatln,cloff.
| Loads the following registers for future use.
| seg,offset,polyoff(stored in scrmem).
#define err acc
#define addrlo r[0]
#define addrhi r[1]
#define cnt r[2]
#define minax r[3]
#define majax r[4]
#define reflect r[5]
#define segaddr r[6]
#define options r[7]
#define stoff r[8]
#define cloff r[9]
#define patln r[10]
#define offset r[11] /* NEW, used to be r[13] */
#define seg r[14]
#define numsegs r[15]
#define dvsr acc
#define result r[0]
#define dvdnd r[0]
#define modoff r[1]
#define quot r[2]
#define mod r[2] /* NEW, used to be r[12] */
#define polyoff r[11]
#define zbuf 1
#define right 8
#define balance 13
| majax and minax go into scrmem, so don't get stepped on in divide routine.
#define savpolyoff 0x133
#define savtemp 0x140
offinit: ; savtemp->scrmemp; ; |
movw err,y; am->scrmem; ; scrmp+ | Error
movw addrlo,y; am->scrmem; ; scrmp+ | Addrlo
movw addrhi,y; am->scrmem; ; scrmp+ | Addrhi
movw cnt,y; am->scrmem; ; scrmp+ | Cnt
movw minax,y; am->scrmem; ; scrmp+ | Minax
movw majax,y; am->scrmem; ; | Majax
offstart: negw majax,r[0]; ; ; | Majax is really (-majax)!
incw r[0],dvdnd; ; ; | Move (majax + 1) -> dividend.
movw patln,dvsr; ; cjs, go divide; | Move pattern length into divisor, call divide.
movw acc,mod; ; ; | modulus is left in accumulator
btstw,s right,options; savpolyoff->scrmemp; ; | This is testing if on right side.
addw stoff,acc,modoff; am->am; cjp, ~zer offrt; | modoff = mod + stoff, jump if on right side.
offlft: incw modoff,polyoff; am->scrmem; ; | LEFT SIDE. polyoff = modoff + 1.
subw d,patln,acc; ; ; | stoff = cloff + patln - (mod + stoff).
btstw,s balance,options; ; ; | Testing balanced field of options.
addw,s cloff,acc,stoff; am->am; cjp, zer offlt0; |
sub2nw 0,numsegs,r[0]; am->am; ; | if (balanced), stoff += mod>>1 - seg[numsegs-1]>>1.
subw d,segaddr,y; am->scrmemp; ; |
sr0w d,acc; scrmem->am; ; | seg[numsegs-1]>>1 -> acc.
sr0w mod,r[0]; am->am; ; | Note: seg[numsegs-1] is at segaddr-(numsegs-1)
rsubw d,acc,acc; ; ; | mod>>1 - seg[numsegs-1]>>1 in d-latch.
addw,s stoff,acc,stoff; am->am; ; |
offlt0: addw d,patln,acc; ; cjp, ~neg offsoff; | Jump if stoff >= 0.
offlt1: movw,s acc,stoff; am->am; ldct offsoff; | Load new stoff & put in d-latch.
addw patln,acc,acc; ; jrp, neg offlt1; | while(stoff<0), stoff += patln, when fails=offsoff.
offrt: decw modoff,polyoff; am->scrmem; ; | RIGHT SIDE. polyoff = modoff - 1.
movw stoff,acc; ; ; |
addw cloff,acc,stoff; am->am; ; | stoff += cloff.
btstw,s balance,options; ; ; | Testing balanced field of options.
movw segaddr,y; am->scrmemp; cjp, zer offsoff; | stoff += [patln - mod>>1] + segment[0]>>1
sr0w d,acc; scrmem->am; ; | segment[0]>>1 in accumulator
sr0w mod,r[0]; am->am; ; | mod>>1 in d-latch
subw d,patln,r[0]; ; ; | patln - mod>>1
addw r[0],acc,acc; ; ; | [patln - mod>>1] + segment[0]>>1
addw stoff,acc,stoff; am->am; ; |
offsoff: rsubw,s d,patln,y; ; ; | Note: stoff in d-latch!.
movw,s stoff,acc; ; cjp, neg offpoff; | Jump if (stoff < patln).
subw,s patln,acc,acc; ; cjp, ~neg .; | Loop until stoff < patln.
addw patln,acc,acc; ; ; | This gets done twice more than it should.
addw,s patln,acc,stoff; ; ; |
offpoff: movw polyoff,y; am->am; ; |
rsubw,s d,patln,y; ; ; |
movw,s polyoff,acc; ; cjp, neg offseg0; | Jump if (polyoff < patln).
subw,s patln,acc,acc; ; cjp, ~neg .; | Loop until polyoff < patln.
addw patln,acc,acc; savpolyoff->scrmemp; ; | This gets done twice more than it should.
addw patln,acc,polyoff; am->scrmem; ; | Store polyoff in scrmem.
offseg0: testw (stoff); ; ; |
movw d,seg; 0x1->am; ; |
movw segaddr,y; am->scrmemp; ; | Load starting address.
btstw,s right,options; ; cjp, ~zer offloop; | Jump if stoff != 0.
movw d,offset; scrmem->am; cjp, go offres; | Check order of operations! Inc pointer for next fetch.
offloop: ; ; cjp, zer offloopL; | Jump if on left side.
offloopR: rsubw,s d,stoff,acc; scrmem->am; ; | Compute (offset - stoff)
incw seg,seg; ; cjp, ~neg offgtR; | Jump if >= 0, therfore stoff < offset
negw acc,stoff; ; cjp, go offloopR; scrmp+ | stoff -= offset.
offgtR: movw,s acc,offset; ; ; | offset -= stoff.
sub2nw 0,seg,seg; am->am; cjp, ~zer offres; | Return if offset != 0. Inc pointer for next fetch.
subw,s d,numsegs,y; ; ; | Check if (seg >= numsegs).
addw d,segaddr,y; am->scrmemp; cjp, zer offirst; |
movw d,offset; scrmem->am; ; | Return if (seg != numsegs).
incw seg,seg; ; cjp, go offres; | Increment seg and restore.
offloopL: decw seg ; ; ; |
offloopLa: rsubw,s d,stoff,acc; scrmem->am; ; | Compute (offset - stoff)
incw seg,seg; am->am; cjp, ~neg offgtL; | Jump if >= 0, therfore stoff < offset
subw d,segaddr,y; am->scrmemp; ; | scrmemp = segaddr - seg.
negw acc,stoff; ; cjp, go offloopLa; | stoff -= offset.
offgtL: movw acc,offset; ; cjp, ~zer offres; | offset -= stoff.
subw,s d,numsegs,y; ; ; | Check if (seg >= numsegs).
subw d,segaddr,y; am->scrmemp; cjp, zer offirst; |
movw d,offset; scrmem->am; ; | Return if (seg != numsegs). Inc pointer for next fetch.
incw seg,seg; ; cjp, go offres; | Increment seg and restore.
offirst: movw segaddr,y; am->scrmemp; ; | Load in first segment.
movw d,offset; scrmem->am; ; |
movw d,seg; 0x1->am; ; | Zero out seg, offset=1st, Inc pointer for next fetch.
offres: ; savtemp->scrmemp; ; |
movw d,err; scrmem->am; ; scrmp+ | Error
movw d,addrlo; scrmem->am; ; scrmp+ | Addrlo
movw d,addrhi; scrmem->am; ; scrmp+ | Addrhi
movw d,cnt; scrmem->am; ; scrmp+ | Cnt
movw d,minax; scrmem->am; ; scrmp+ | Minax
movw d,majax; scrmem->am; ; | Majax
#ifdef GPPLUS
| Check if z-buffering or depth cueing is enabled, and if so, we jmap to the appropriate routine from here.
; VecAtts->scrmemp; ; |
testw (d); scrmem->am; ; | test if z-buffering or depth cueing is enabled
btstw,s right,options; ; cjp,~zer offdczb; |
#endif GPPLUS
btstw,s right,options; ; ; | Check if right or left side.
movw segaddr,y; am->am; cjp, zer offresL; | Reset scrmemp for either side.
offresR: addw d,seg,y; am->scrmemp; cjp, go toctdrw; | Jump back to texvec.
offresL: rsubw d,seg,y; am->scrmemp; cjp, go toctdrw; |
#ifdef GPPLUS
| Here we do some final initialization & then we call the dc textured drawing routines. The initialization
| must be done here, as we can't touch the scrmemp after this point.
offdczb: btstw,s zbuf,d; ; ; |
btstw,s right,options; ; cjp, ~zer offzb; | jump if z buffering enabled
offdc: movw segaddr,y; am->am; cjp, zer .+2; | Reset scrmemp for either side.
addw d,seg,y; am->scrmemp; jmap dctoctdrw; | Jmap to other bank, depth cueing routine
rsubw d,seg,y; am->scrmemp; jmap dctoctdrw; |
offzb: movw segaddr,y; am->am; cjp, zer .+2; | Reset scrmemp for either side.
addw d,seg,y; am->scrmemp; jmap zbtoctdrw; | Jmap to other bank, depth cueing routine
rsubw d,seg,y; am->scrmemp; jmap zbtoctdrw; |
#endif GPPLUS
#undef err
#undef addrlo
#undef addrhi
#undef cnt
#undef minax
#undef majax
#undef reflect
#undef segaddr
#undef options
#undef stoff
#undef cloff
#undef patln
#undef offset
#undef seg
#undef numsegs
#undef clo
#undef chi
#undef dvsr
#undef result
#undef dvdnd
#undef quot
#undef polyoff
#undef mod
#undef zbuf
#undef right
#undef balance
#undef savpolyoff
#undef savtemp