📄 tran.u
字号:
|* Trig Approximations|* enter with:|* x in recovery register|* loop counter set to no. of constants|* pointer 5 pointing at last constant (they are in reverse order)|*|* exit with:|* z in A register of multiplier|* z*(c1 + z*(c2 + ( ...+ z*cn) in output of multiplier|* (multiply has just started)sexpansion:|* square x ; ; ; recoe; ; ; las cslm; reg; recoe; ; ; lbsf smul cslm; reg; recoe; ;|* enter here if z has just begun multiplyingsexpansion2: ; ; ; ; ; lpreg- ; ; ; ; ; ; ; ; ; ; jloop stlp; las cslm csuxm usp; ; ; rcssp ptr5; rtn; lbsf smul cslm; reg; ; ; ptr5-stlp: ; ; ; ; ; ; ; ; ; ; ; ; ; ; rcssp ptr5; ; las csla csuxm usp; reg; ; ; ; ; ; ; ; ptr5- ; lbsf sadd csla woem; ; ; ;|* enter here if addition has just begunsexpansion3: ; ; ; ; ; lpreg- ; ; ; ; ; ; ; ; ; ; ; csuxa usp; ; ; ; jloop stlp; ; ; ; ; rtn; lbsf smul cslm woea;; ; ;|* the following line needed to pass assembler restriction ; ; ; ; ;|* Enter with:|* X in location pointed to by ptr1 (location will be overwritten|* or restored later).|* Loop counter set to no. of constants.|* Pointer 5 pointing at last constant (they are in reverse order).|*|* Exit with:|* z in A register of multiplier|* z*(c1 + z*(c2 + ( ...+ z*cn) in output of multiplier|* (multiply has just started)#ifdef OLDdexpansion: ; ; ; ; rcsmsw ptr1; ; lam cslm; reg; ; rcsmsw ptr1; ; lbm cslm; reg; ; ; ; ; ; ; ; ; ; ; ; rcslsw ptr1; ; lal cslm; reg; ; rcslsw ptr1; ; lblf dmul cslm; reg; ; ;|* enter here if z has just begun multiplying ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;#endifdexpansion2: ; ; ; ; rcsmsw ptr5; ; lbm cslm; reg; ; rcslsw ptr5; ; lbl cslm; reg; ; ; lpreg- ; lam cslm csuxm umsw; ; ; ; ptr5- jloop dtlp; lal cslm csuxm ulsw; ; ; ; rtn; lf dmul cslm; ; ; ;dtlp: ; ; ; ; ; ; ; ; ; ; ; ; ; ; rcsmsw ptr5; ; lam csla; reg; ; rcslsw ptr5; ; lal csla; reg; ; ; ; csuxm umsw; ; ; ; ptr5- ; csuxm ulsw; ; ; ; ; lbm csla woem; ; ; ; ; lblf dadd csla woem; ; ; ; ; ; ; ; ; ; ; ; ; ; lpreg- ; ; ; ; ; ; csuxa ulsw; ; ; ; ; csuxa umsw; ; ; ; jloop dtlp; lbl cslm woea; ; ; ; rtn; lbmf dmul cslm woea; ; ; ; ; ; ; ; ;sreturnx:|* this routine is called to return x with inexact status returned if|* x is not 0 call wait3; lf scmp0 csla; reg; ; ; ; csuxa usp; ; ; ptr1; ; ; ; recoe; ramwe rcssp ptr1; jeq sreturnzerostat;woea; ; recoe; ramwe ptr1;sreturninexact: ; ; ; ; ; ptr5!c_sinexact call wait1; ; ; recclk; rcssp ptr5; jwerr restor.r1 cstat restore;; ; ; ; call idle1; ; ; ; ;|* this is used for sincos in which case we must restore reg4 in case of errorsreturninexact.4: ; ; ; ; ; ptr5!c_sinexact call wait1; ; ; recclk; rcssp ptr5; jwerr restor.r41 cstat restore;; ; ; ; call idle1; ; ; ; ;#ifdef SQRTsreturnx0: ; ; ; recoe; ramwe rcssp ptr1; ; ; ; recoe; ramwe ptr1;#endifsreturnzerostat: ; ; ; ; ; ptr5!c_szerostat call wait1; ; ; recclk; rcssp ptr5; call idle1 cstat restore;; ; ; ;| *assumes that x is in ptr1dreturnx: call wait3; lf dcmp0 csla; reg; ; ; call wait1; csuxa usp; ; ; ; jeq dreturnx0; woea; ; ; ;dreturninexact: ; ; ; ; ; ptr5!c_sinexact call wait1; ; ; recclk; rcssp ptr5; jwerr drestor.r1 cstat restore;; ; ; ; call idle1; ; ; ; ;| this is used just to conserve linesdrtn.inx.soon: ; ; ; ; ;dwrt1: call wait1; ; ; ; ; ; csuxa umsw; ; ; ; ; csuxa ulsw; ; ; ptr1; ; woea; dtor; ; ramwe rcsmsw ptr1; ; woea; dtor; ; ramwe rcslsw ptr1; call dreturninexact;; dtor; ; ramwe ptr1;|* This is used for sincos since we must restore ptr4dreturninexact.4: ; ; ; ; ; ptr5!c_sinexact call wait1; ; ; recclk; rcssp ptr5; jwerr drestor.r41 cstat restore;; ; ; ; call idle1; ; ; ; ;oberr: ; ; ; ; ; ptr5!c_soberr call wait1; ; ; recclk; rcssp ptr5; call werr cstat restore;; ; ; ;soberr: ; ; ; ; ; ptr5!c_soberr call wait1; ; ; recclk; rcssp ptr5; call restor.r1 cstat restore;; ; ; ;doberr: ; ; ; ; ; ptr5!c_soberr call wait1; ; ; recclk; rcssp ptr5; call drestor.r1 cstat restore;; ; ; ;dreturnx0:| assumes ptr1 already contains proper datadreturnzerostat: ; ; ; ; ; ptr5!c_szerostat call wait1; ; ; recclk; rcssp ptr5; call idle1 cstat restore;; ; ; ;sreturnx1: ; ; ; recclk; rcssp ptr5; ; ; ; recclk; ptr1; ; ; ; recoe; ramwe rcssp ptr1; ; ; ; recoe; ramwe ptr1;sreturnexact:dreturnexact: ; ; ; ; ; ptr5!c_sexact call wait1; ; ; recclk; rcssp ptr5; call idle1 cstat restore;; ; ; ;dreturnx1: ; ; ; recclk; rcsmsw ptr5; ; ; ; recclk; rcslsw ptr5; ; ; ; ; ptr1; ; ; ; recoe; ramwe rcsmsw ptr1; ; ; ; recoe recclk;ramwe ptr1; ; ; ; recoe; ramwe rcslsw ptr1; call dreturnexact;; ; recoe; ramwe ptr1; #ifdef OLD|* Inverse Tangent approximationsitanapprox: ; ; ; ; ; lpreg!7 call sexpansion;; ; ; ; call wait2; ; ; ; ; ; las cslm csuxm usp; ; recoe; ; ; lbsf smul cslm; reg; recoe; ; ; las csla; reg; recoe; ; ; ; ; ; ; ; ; ; ; ; ; csuxm usp; ; ; ; ; ; ; ; ; call wait2; lbsf sadd csla woem; ; ; ; ; ; ; ; ; ptr5!smone|# (Note: 12 will cause a delay of 26) ; lbs csla csuxa usp; ; ; rcssp ptr5; lpreg!12 ; lasf sdiv csla; reg; ; ; call wait; ; ; ; ; call salu.inx4; ; ; ; ;#endif|*|* Single Precision Arctangent Instruction|*routine xs.atan w01000000110 las ssub call stran.start;; ; ; ; ; ; ; ; ; ptr5!s39o16 ; ; ; ; rcssp ptr5; call wait3; lbsf scmpm csla; reg; ; ; ; csuxa usp; ; ; ; ; csuxa usp; ; ; ; ptr5!s7o16|* if the operand was a NaN, branch jwerr soberr; woea; ; ; ;|* if abs(operand) > 39/16 then branch jgt xsa.e1; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!c_satan_big|* abs(operand) <= 39/16 call wait3; lbsf scmpm csla; reg; ; ; ; csuxa usp; ; ; ; ; ; ; ; ; ptr5!c_satan_small jgt xsa.e2; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!s19o16|* abs(operand) <= 7/16 call wait3; lbsf scmpm csla; reg; ; ; call wait1; csuxa usp; ; ; ; jlt sreturnx; woea; ; ; ;|* small < abs(operand) <= 7/16| put ptr2 into "t" ; ; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5; ; ; ; recoe; ramwe rcssp ptr5; ; ; ; recoe; ramwe ptr5; ptr5!c_satan_00| jump to compute atan with hi = 0, lo = 0 call xsa.getz; ; ; ; ;xsa.e2:|* 7/16 < abs(operand) <= 39/16 ; ; ; ; rcssp ptr5; ptr5!s11o16 call wait3; lbsf scmpm csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.e3; woea; ; ; ; ; ; ; ; rcssp ptr5;|* 7/16 < abs(operand) <= 19/16 call wait3; lbsf scmpm csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.e4; woea; ; ; ;|* 7/16 < abs(operand) <= 11/16 ; ; ; ; ; ptr5!stwo ; ; ; ; rcssp ptr5;| start y+2 call wait3; lbsf saddm csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| write y+2 to temp ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; ; ; ; rcssp ptr2; ptr5!sone call wait3; lbsf saddm csla; reg; ; ; ; las csla csuxa usp; ; ; rcssp ptr5; ptr5!c_dSCRATCH_5 call wait3; lbsf ssub csla; reg; ; ; ; las csla csuxa usp; ; ; rcssp ptr5; lpreg!13 call wait; lbsf sdiv csla; reg; ; ; ; csuxa usp; ; ; ; ; ; ; ; ptr5;| pass value of "t" ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; ; ; ; rcssp ptr2; call wait3; lasf scmp0 csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.getz; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!c_satan_hhilo call wait3; lasf sneg csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| pass -"t" and -hi, -lo ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ptr5!c_satan_mhhilo call xsa.getz; ; ; ; ;xsa.e4:|* 11/16 < abs(operand) <= 19/16 ; ; ; ; ; ptr5!sone ; ; ; ; rcssp ptr5;| start y+1 call wait3; lbsf saddm csla; reg; ; ; ; lf ssubm csla csuxa usp;; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| write y+1 to temp ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; las csla csuxa usp; ; ; rcssp ptr5; lpreg!13 call wait; lbsf sdiv csla; reg; ; ; ; csuxa usp; ; ; ; ; ; ; ; ptr5;| pass value of "t" ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; ; ; ; rcssp ptr2; call wait3; lasf scmp0 csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.getz; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!c_satan_40 call wait3; lasf sneg csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| pass -"t" and -hi, -lo ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ptr5!c_satan_m40 call xsa.getz; ; ; ; ;xsa.e3:|* 19/16 < abs(operand) <= 39/16 ; ; ; ; rcssp ptr2; ptr5!stwo call wait3; lbsf saddm csla; reg; ; ; call wait3; lbsf saddm csla csuxa usp;; ; ; ; las csla csuxa usp; ; ; rcssp ptr5;| start (y+y+y) + 2 call wait3; lbsf sadd csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| write (y+y+y) + 2 to temp ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; ; ; ; rcssp ptr2; ptr5!sone ; las csla; reg; ; rcssp ptr5;| start y - 1 call wait3; lbsf ssubm csla; reg; ; ; ; las csla csuxa usp; ; ; ; ptr5!sone| start z+z call wait3; lbsf sadd csla csuxa usp;; ; ; ; las csla csuxa usp; ; ; rcssp ptr5; ptr5!c_dSCRATCH_5 call wait3; lbsf ssub csla; reg; ; ; ; las csla csuxa usp; ; ; rcssp ptr5; lpreg!13 call wait; lbsf sdiv csla; reg; ; ; ; csuxa usp; ; ; ; ; ; ; ; ptr5;| pass value of "t" ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ; ; ; ; rcssp ptr2; call wait3; lasf scmp0 csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.getz; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!c_satan_lhilo call wait3; lasf sneg csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| pass -"t" and -hi, -lo ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5; ptr5!c_satan_mlhilo call xsa.getz; ; ; ; ;xsa.e1:|* abs(operand) > 39/16 ; ; ; ; rcssp ptr5; call wait3; lbsf scmpm csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.e5; woea; ; ; ;|* 39/16 < abs(operand) <= big ; ; ; ; rcssp ptr2; ptr5!smone ; lbs csla; reg; ; rcssp ptr5; lpreg!13 call wait; lasf sdiv csla; reg; ; ; ; csuxa usp; ; ; ; ptr5!c_dSCRATCH_5 ; ; ; ; ptr5;| pass "t" and pi/2, 0 ; woea; dtor; ; ramwe rcssp ptr5; ; ; dtor; ; ramwe ptr5;xsa.e6: ; ; ; ; rcssp ptr2; call wait3; lasf scmp0 csla; reg; ; ; call wait1; csuxa usp; ; ; ; jgt xsa.getz; woea; ; ; ; ; ; ; ; ; ptr5!c_satan_20 ; ; ; ; ; ptr5!c_satan_m20 call xsa.getz; ; ; ; ;xsa.e5:|* abs(operand) > big| (we already checked for NaN's) ; ; ; ; ; ptr5!szero ; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_5 ; ; ; recclk; ptr5; ; ; ; recoe; ramwe rcssp ptr5; ; ; ; recoe; ramwe ptr5; ptr5!c_satan_20 call xsa.e6; ; ; ; ;|* finished with argument reduction; compute z nowxsa.getz:| We need to copy hi and low to 2 and 3 first! ; ; ; recclk; rcssp ptr5; ptr5- ; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_2 ; ; ; ; ptr5; ; ; ; recoe; ramwe rcssp ptr5; ; ; ; recoe; ramwe ptr5; ptr5!c_dSCRATCH_3 ; ; ; recclk; ptr5; ; ; ; recoe; ramwe rcssp ptr5; ; ; ; recoe; ramwe ptr5; ptr5!c_dSCRATCH_5 ; ; ; ; rcssp ptr5; lpreg!9 ; las cslm; reg; ; rcssp ptr5; ptr5!c_satan_c9 call sexpansion2;lbsf smul cslm; reg; ; ; call wait1; ; ; ; ; ; ; ; ; ; ptr5!c_dSCRATCH_5 ; las cslm csuxm usp; ; ; rcssp ptr5; ptr5!c_dSCRATCH_3 call wait3; lbsf smul cslm; reg; ; ; ; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_5 ; las csla csuxm usp; reg; ; ; ; ; ; ; ;| start z = lo - z call wait3; lbsf ssub csla woem; ; ; ; ; las csla csuxa usp; ; ; rcssp ptr5; ptr5!c_dSCRATCH_2| start z = z + t call wait3; lbsf sadd csla; reg; ; ; ; lbs csla csuxa usp; ; ; rcssp ptr5;| start z = hi + z call salu.inx1; lasf sadd csla; reg; ; ;|*|* Double Precision Arctangent Instruction|*routine xd.atan w01000000111 lnop ssub call dtran.start;; ; ; ; ; ; ; ; rcsmsw ptr1; ptr5!s39o16 ; lam csla; reg; ; rcssp ptr5; ; lbs csla; reg; ; rcslsw ptr1;| *save ptr2 for later comparison ; lalf dcmpm csla; reg; recclk; rcsmsw ptr2; ; ; ; recclk; rcslsw ptr2; ptr5!c_dSCRATCH_6 ; ; ; ; ptr5; ; ; ; recoe; ramwe rcsmsw ptr5; ; csuxa umsw; ; recoe recclk;ramwe ptr5; ; csuxa ulsw; ; recoe; ramwe rcslsw ptr5; ptr5!s7o16 jwerr doberr; woea; ; recoe; ramwe ptr5; jgt xda.e1; woea; ; ; ; ; ; ; ; rcssp ptr5; ptr5!c_sdatan_big| abs(x) < 39/16 ; lbs csla; reg; ; ; call wait3; lf dcmpm csla; ; ; ; ; csuxa umsw; ; ; ; ; ; ; ; ; ptr5!c_sdatan_small jgt xda.e2; woea; ; ; ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -