home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Serious Magazine 11
/
Serious_Magazine_11_2002_Dial_pl_Disk_2_of_2_Side_B.atr
/
rom_01.lzh
/
FLOAT2.TXT
< prev
next >
Wrap
Text File
|
2002-05-26
|
14KB
|
1 lines
09 .OPT NO LIST¢10 ; SAVE #D1:FLOAT2.M65¢20 ;¢30 ;¢40 ; LOAD #D1:CHARSET1.M65¢50 LIST ¢056320 NORM LDX #0 for add norm B¢056322 STX FRE shift in a 0¢056324 NORM1 LDX #4¢056326 LDA FR0 get exponent¢056328 BEQ ?NDONE done if 0¢056330 ?NORM2 LDA FR0+1 get 1st mantissa¢056332 BNE ?TSTBIG if not 0, no shift¢056334 LDY #0¢056336 ?NSH LDA FR0+2,Y¢056339 STA FR0+1,Y¢056342 INY ¢056343 CPY #5¢056345 BCC ?NSH¢056347 DEC FR0 decr exponent¢056349 DEX ¢056350 BNE ?NORM2¢056352 LDA FR0+1 mantissa still 0?¢056354 BNE ?TSTBIG see if too big¢056356 STA FR0 else clear exponent¢056358 CLC ¢056359 RTS ¢056360 ?TSTBIG LDA FR0 get absolute¢056362 AND #$7F exponent¢056364 CMP #49+$40 less than 49+64?¢056366 BCC ?TSTUND Yes, test underflow¢056368 RTS ¢056369 ?TSTUND CMP #-49+$40 done if >=¢056371 BCS ?NDONE ; -49+$40¢056373 JSR ZFR0 Else number = 0¢056376 ?NDONE CLC ¢056377 RTS ¢056378 RSHFT0 LDX #FR0 Point to Fr0¢056380 BNE ?RSH¢056382 RSHFT1 LDX #FR1 Point to Fr1¢056384 ?RSH STX ZTEMP3 Save fr pointer¢056386 STA ZTEMP4 Save # bytes to shift¢056388 STA ZTEMP4+1 save for later¢056390 ?RSH2 LDY #4 Get # bytes to move¢056392 ?RSH1 LDA 4,X Get char¢056394 STA 5,X Store char¢056396 DEX Point to next¢056397 DEY Dec loop control¢056398 BNE ?RSH1 If more repeat¢056400 LDA #0 Get first byte¢056402 STA 5,X store it¢056404 LDX ZTEMP3 Get Fr pointer¢056406 DEC ZTEMP4 Do we need to repeat?¢056408 BNE ?RSH2 If yes do it¢056410 LDA 0,X Get exponent¢056412 CLC ¢056413 ADC ZTEMP4+1 Sub # of shifts¢056415 STA 0,X save new exponent¢056417 RTS ¢056418 RSHF0E LDX #5*2 Get loop control¢056420 ?NXTB1 LDA FR0,X Get a byte¢056422 STA FR0+1,X Move it over one¢056424 DEX Dec counter¢056425 BPL ?NXTB1 Move next byte¢056427 LDA #0 Get 0¢056429 STA FR0 Shift it in¢056431 RTS ¢056432 ?CVFR0 STA ZTEMP4 Save decimal position¢056434 LDX #0 Set index into mantissa¢056436 LDY #0 Set index into output¢056438 ?CVBYTE JSR ?TSTDP Put in DP now?¢056441 SEC Dec DP position¢056442 SBC #1¢056444 STA ZTEMP4 Save it¢056446 LDA FR0+1,X Get from Fr0¢056448 LSR A Shift out low order bits¢056449 LSR A To get 1st digit¢056450 LSR A¢056451 LSR A¢056452 JSR ?STNUM Go put number in buffer¢056455 LDA FR0+1,X Do second digit¢056457 AND #$0F Strip high bits¢056459 JSR ?STNUM Store in buffer¢056462 INX Incr pointer¢056463 CPX #5 Done?¢056465 BCC ?CVBYTE If not do more¢056467 ?TSTDP LDA ZTEMP4 Get DP position¢056469 BNE ?TST1 If not 0, return¢056471 LDA #'. Get ascii DP¢056473 JSR ?STCHAR Put in buffer¢056476 ?TST1 RTS ¢056477 ?STNUM ORA #'0 Convert to ascii¢056479 ?STCHAR STA LBUFF,Y Put in Lbuff¢056482 INY Incr. pointer¢056483 RTS ¢056484 ?FNZERO LDX #10 Point to last char in lbuff¢056486 ?FN3 LDA LBUFF,X Get character¢056489 CMP #'. Is it a DP?¢056491 BEQ ?FN1 If yes, go¢056493 CMP #'0 Is it a 0?¢056495 BNE ?FN2 Go if not¢056497 DEX Decr. index¢056498 BNE ?FN3 Go always¢056500 ?FN1 DEX Decr. buffer index¢056501 LDA LBUFF,X Get last char¢056504 ?FN2 RTS ¢056505 ?GETDIG JSR NIBSH0 Shift Fr0 left one nybble¢056508 LDA FRX Get byte containing shifted nybble¢056510 AND #$0F Strip high order bits¢056512 RTS ¢056513 ?DECINB SEC Subtract one from inbuff¢056514 LDA INBUFF¢056516 SBC #1¢056518 STA INBUFF¢056520 LDA INBUFF+1¢056522 SBC #0¢056524 STA INBUFF+1¢056526 RTS ¢056527 MDESUP LDA FR0 Get FR0 exponent¢056529 EOR FR1 Get Fr1 exponent¢056531 AND #$80 Strip all but sign bit¢056533 STA FRSIGN Save sign¢056535 ASL FR1 Shift out sign in Fr1 exponent¢056537 LSR FR1 Restore Fr1 less sign¢056539 LDA FR0 Get Fr0 exponent¢056541 AND #$7F Strip sign bit¢056543 RTS ¢056544 MDSUP ORA FRSIGN Or in sign bit¢056546 STA EEXP Save exponent¢056548 LDA #0 Clear a¢056550 STA FR0 and Fr0¢056552 STA FR1 and Fr1¢056554 JSR MVFR12 Move Fr1 to Fr2¢056557 JSR NIBSH2 Shift Fr2 one nybble left¢056560 LDA FRX Get shifted nybble¢056562 AND #$0F Strip high order bits¢056564 STA FR2 Store to finish shift¢056566 LDA #5 Set loop control¢056568 STA ZTEMP1¢056570 JSR MVFR0E Move Fr0 to Fre¢056573 JSR ZFR0 Clear Fr0¢056576 RTS ¢056577 FRA10 LDX #FR0+5 Point to last byte of sum¢056579 BNE ?F1¢056581 FRA20 LDX #FR0+5¢056583 BNE ?F2¢056585 FRA1E LDX #FRE+5¢056587 ?F1 LDY #FR1+5¢056589 BNE ?FRA¢056591 FRA2E LDX #FRE+5¢056593 ?F2 LDY #FR2+5¢056595 ?FRA LDA #5 Set loop control¢056597 STA ZTEMP4¢056599 CLC ¢056600 SED Decimal mode¢056601 ?FRA1 LDA 0,X Get 1st byte¢056603 ADC 0,Y add¢056606 STA 0,X store¢056608 DEX ¢056609 DEY ¢056610 DEC ZTEMP4 Decr loop control¢056612 BPL ?FRA1 til done¢056614 CLD Clear decimal¢056615 RTS ¢056616 MVFR12 LDY #5 Move Fr1 to Fr2¢056618 ?MV2 LDA FR1,Y¢056621 STA FR2,Y¢056624 DEY ¢056625 BPL ?MV2¢056627 RTS ¢056628 MVFR0E LDY #5 Move Fr0 to Fre¢056630 ?MV1 LDA FR0,Y¢056633 STA FRE,Y¢056636 DEY ¢056637 BPL ?MV1¢056639 RTS ¢056640 PLYEVL STX FPTR2 save pointer to coefs B¢056642 STY FPTR2+1¢056644 STA PLYCNT¢056646 LDX # <PLYARG¢056648 LDY # >PLYARG¢056650 JSR FST0R Save arg¢056653 JSR FMOVE Arg->Fr1¢056656 LDX FPTR2¢056658 LDY FPTR2+1¢056660 JSR FLD0R Coeff->Fr0 (init sum)¢056663 DEC PLYCNT Done?¢056665 BEQ ?PLYOUT¢056667 ?PLYEV1 JSR FMUL sum*arg¢056670 BCS ?PLYOUT Overflow¢056672 CLC ¢056673 LDA FPTR2 bump coeff pointer¢056675 ADC #FPREC¢056677 STA FPTR2¢056679 BCC ?PLYEV2¢056681 LDA FPTR2+1 across page¢056683 ADC #0¢056685 STA FPTR2+1¢056687 ?PLYEV2 LDX FPTR2¢056689 LDY FPTR2+1¢056691 JSR FLD1R Get next coeff¢056694 JSR FADD sum*arg+coef¢056697 BCS ?PLYOUT overflow¢056699 DEC PLYCNT¢056701 BEQ ?PLYOUT¢056703 LDX # <PLYARG¢056705 LDY # >PLYARG¢056707 JSR FLD1R Get arg again¢056710 BMI ?PLYEV1 Go always¢056712 ?PLYOUT RTS ¢056713 FLD0R STX FLPTR Set Flptr B¢056715 STY FLPTR+1¢056717 FLD0P LDY #5 ; # bytes¢056719 FLD01 LDA (FLPTR),Y Move them¢056721 STA FR0,Y¢056724 DEY ¢056725 BPL FLD01¢056727 RTS ¢056728 FLD1R STX FLPTR B¢056730 STY FLPTR+1¢056732 FLD1P LDY #5¢056734 FLD11 LDA (FLPTR),Y Copy (Flptr)¢056736 STA FR1,Y to Fr1¢056739 DEY ¢056740 BPL FLD11¢056742 RTS ¢056743 FST0R STX FLPTR B¢056745 STY FLPTR+1¢056747 FST0P LDY #5¢056749 FST01 LDA FR0,Y¢056752 STA (FLPTR),Y¢056754 DEY ¢056755 BPL FST01¢056757 RTS ¢056758 FMOVE LDX #5 aka MV0TO1 B¢056760 FMOVE1 LDA FR0,X Copy Fr0 to Fr1¢056762 STA FR1,X¢056764 DEX ¢056765 BPL FMOVE1¢056767 RTS ¢056768 EXP LDX # <LOG10E e^x=10^(x^ln(10)) B¢056770 LDY # >LOG10E¢056772 JSR FLD1R¢056775 JSR FMUL¢056778 BCS EXPERR¢056780 EXP10 LDA #0 ;10^x B¢056782 STA XFMFLG Clear transform flag¢056784 LDA FR0¢056786 STA SGNFLG Remember arg sign¢056788 AND #$7F and make +ve¢056790 STA FR0¢056792 SEC ¢056793 SBC #$40¢056795 BMI EXP1 x<1 so use series directly¢056797 CMP #4¢056799 BPL EXPERR arg to big¢056801 LDX # <FPSCR¢056803 LDY # >FPSCR¢056805 JSR FST0R save arg¢056808 JSR FPI make integer¢056811 LDA FR0¢056813 STA XFMFLG save multiplier exponent¢056815 LDA FR0+1 check msb¢056817 BNE EXPERR should be none¢056819 JSR IFP Back to floating point¢056822 JSR FMOVE¢056825 LDX # <FPSCR¢056827 LDY # >FPSCR¢056829 JSR FLD0R Get arg back¢056832 JSR FSUB Arg-integer=fraction¢056835 EXP1 LDA #NPCOEF coefficients¢056837 LDX # <P10COF¢056839 LDY # >P10COF¢056841 JSR PLYEVL p(x)¢056844 JSR FMOVE¢056847 JSR FMUL p(x)*p(x)¢056850 LDA XFMFLG did we transform arg¢056852 BEQ EXPSGN No, leave result alone¢056854 CLC i/2¢056855 ROR A¢056856 STA FR1¢056858 LDA #1 Get mantissa byte¢056860 BCC EXP2 Check bit shifted out of a¢056862 LDA #$10 i was odd, mantissa=10¢056864 EXP2 STA FR1+1¢056866 LDX #4¢056868 LDA #0¢056870 EXP3 STA FR1+2,X Clear rest of mantissa¢056872 DEX ¢056873 BPL EXP3¢056875 LDA FR1 back to exponent¢056877 CLC ¢056878 ADC #$40 bias it¢056880 BCS EXPERR Too big¢056882 BMI EXPERR¢056884 STA FR1 Fr1=10^i¢056886 JSR FMUL (10^i)*(10^f)¢056889 EXPSGN LDA SGNFLG arg<0?¢056891 BPL EXPOUT No, done¢056893 JSR FMOVE Yes, invert result¢056896 LDX # <FONE¢056898 LDY # >FONE¢056900 JSR FLD0R¢056903 JSR FDIV¢056906 EXPOUT RTS Done¢056907 EXPERR SEC Flag error¢056908 RTS Quit¢056909 P10COF .BYTE $3D,$17,$94,$19,0,0¢056910 ; .FLOAT 0.0000179419¢056915 .BYTE $3D,$57,$33,$05,0,0¢056916 ; .FLOAT 0.0000573305¢056921 .BYTE $3E,$05,$54,$76,$62,0¢056922 ; .FLOAT 0.0005547662¢056927 .BYTE $3E,$32,$19,$62,$27,0¢056928 ; .FLOAT 0.0032176227¢056933 .BYTE $3F,$01,$68,$60,$30,$36¢056934 ; .FLOAT 0.0168603036¢056939 .BYTE $3F,$07,$32,$03,$27,$41¢056940 ; .FLOAT 0.0732032741¢056945 .BYTE $3F,$25,$43,$34,$56,$75¢056946 ; .FLOAT 0.02543345675¢056951 .BYTE $3F,$66,$27,$37,$30,$50¢056952 ; .FLOAT 0.66273730505¢056957 .BYTE $40,$01,$15,$12,$92,$55¢056958 ; .FLOAT 1.15129255555¢056963 .BYTE $3F,$99,$99,$99,$99,$99¢056964 ; .FLOAT 0,99999999999¢056965 NPCOEF = [*-P10COF]/6¢056969 LOG10E .BYTE $3F,$43,$42,$94,$48,$19¢056970 ; .FLOAT 0.43429448190 log(e)¢056975 FONE .BYTE $40,1,0,0,0,0¢056976 ; .FLOAT 1¢056981 XFORM STX FPTR2 z=(x-c)/(x+c) B¢056983 STY FPTR2+1¢056985 LDX # <PLYARG¢056987 LDY # >PLYARG¢056989 JSR FST0R x to plyarg¢056992 LDX FPTR2¢056994 LDY FPTR2+1¢056996 JSR FLD1R¢056999 JSR FADD x+c¢057002 LDX # <FPSCR¢057004 LDY # >FPSCR¢057006 JSR FST0R¢057009 LDX # <PLYARG¢057011 LDY # >PLYARG¢057013 JSR FLD0R¢057016 LDX FPTR2¢057018 LDY FPTR2+1¢057020 JSR FLD1R¢057023 JSR FSUB x-c¢057026 LDX # <FPSCR¢057028 LDY # >FPSCR¢057030 JSR FLD1R¢057033 JSR FDIV (x-c)/(x+c)=z¢057036 RTS ¢057037 LOG LDA #1 ln(x) B¢057039 BNE LOGBTH¢057041 LOG10 LDA #0 log(x) B¢057043 LOGBTH STA SGNFLG Use sign to remember entry¢057045 LDA FR0¢057046 ; -----------¢057047 BEQ LOGERR different from¢057049 BMI LOGERR book¢057051 JMP LOG1 jump patch¢057052 ;¢057054 LOGERR SEC Address = book+5¢057055 RTS ;-----------¢057056 ?XPATCH SBC #$40 Addreses match¢057058 ASL A book again¢057059 STA XFMFLG Remember y¢057061 LDA FR0+1¢057063 AND #$F0¢057065 BNE LOG2¢057067 LDA #1¢057069 BNE LOG3¢057071 LOG2 INC XFMFLG bump y¢057073 LDA #$10¢057075 LOG3 STA FR1+1 Set mantissa¢057077 LDX #4 Clear rest¢057079 LDA #0¢057081 LOG4 STA FR1+2,X¢057083 DEX ¢057084 BPL LOG4¢057086 JSR FDIV¢057089 FLOG10 LDX # <SQR10 log(x) 1>=x<=10¢057091 LDY # >SQR10¢057093 JSR XFORM z=(x-c)/(x+c) c*c=10¢057096 LDX # <FPSCR¢057098 LDY # >FPSCR¢057100 JSR FST0R save z¢057103 JSR FMOVE¢057106 JSR FMUL z*z¢057109 LDA #NLCOEF¢057111 LDX # <LGCOEF¢057113 LDY # >LGCOEF¢057115 JSR PLYEVL p(z*z)¢057118 LDX # <FPSCR¢057120 LDY # >FPSCR¢057122 JSR FLD1R¢057125 JSR FMUL z*p(z*z)¢057128 LDX # <FHALF¢057130 LDY # >FHALF¢057132 JSR FLD1R¢057135 JSR FADD 0.5+z*p(z*z)¢057138 JSR FMOVE¢057141 LDA #0¢057143 STA FR0+1¢057145 LDA XFMFLG¢057147 STA FR0¢057149 BPL LOG6¢057151 EOR #$FF flip sign¢057153 CLC ¢057154 ADC #1¢057156 STA FR0¢057158 LOG6 JSR IFP leaves Fr1 alone¢057161 BIT XFMFLG¢057163 BPL LOG7¢057165 LDA #$80 Flip again¢057167 ORA FR0¢057169 STA FR0¢057171 LOG7 JSR FADD ln(x)=ln(x)+y¢057174 LOGOUT LDA SGNFLG¢057176 BEQ LOGDON was log, not ln¢057178 LDX # <LOG10E ln(x)/log(e)¢057180 LDY # >LOG10E¢057181 ; .FLOAT 3.16227766 sqr(10)¢057182 JSR FLD1R¢057185 JSR FDIV¢057188 LOGDON CLC ¢057189 RTS ¢057190 SQR10 .BYTE $40,$03,$16,$22,$77,$66¢057196 FHALF .BYTE $3F,$50,0,0,0,0 B¢057197 ; .FLOAT 0.5¢057202 LGCOEF .BYTE $3F,$49,$15,$57,$11,$08¢057203 ; .FLOAT 0.4915571108¢057208 .BYTE $BF,$51,$70,$49,$47,$08¢057209 ; .FLOAT -0.5170494708¢057214 .BYTE $3F,$39,$20,$57,$61,$95¢057215 ; .FLOAT 0.3920576195¢057220 .BYTE $BF,$04,$39,$63,$03,$55¢057221 ; .FLOAT -0.0439630355¢057226 .BYTE $3F,$10,$09,$30,$12,$64¢057227 ; .FLOAT 0.1009301264¢057229 ; .FLOAT 0.7853981634¢057230 ; pi/4=arctan(1.0)¢057232 .BYTE $3F,$09,$39,$08,$04,$60¢057233 ; .FLOAT 0.0939080460¢057238 .BYTE $3F,$12,$42,$58,$47,$42¢057239 ; .FLOAT 0.1242584742¢057244 .BYTE $3F,$17,$37,$12,$06,$08¢057245 ; .FLOAT 0.1737120608¢057250 .BYTE $3F,$28,$95,$29,$71,$17¢057251 ; .FLOAT 0.2895297117¢057256 .BYTE $3F,$86,$85,$88,$96,$44¢057257 ; .FLOAT 0.8685889644¢057258 NLCOEF = [*-LGCOEF]/FPREC¢057262 ATCOEF .BYTE $3E,$16,$05,$44,$49,$00 B¢057263 ; .FLOAT 0.0016054449¢057268 .BYTE $BE,$95,$68,$38,$45,$00¢057269 ; .FLOAT -0.00956834500¢057274 .BYTE $3F,$02,$68,$79,$94,$16¢057275 ; .FLOAT 0.0268799416¢057280 .BYTE $BF,$04,$92,$78,$90,$80¢057281 ; .FLOAT -0.0492789080¢057286 .BYTE $3F,$07,$03,$15,$20,$00¢057287 ; .FLOAT 0.0703152000¢057292 .BYTE $BF,$08,$92,$29,$12,$44¢057293 ; .FLOAT -0.0892291244¢057298 .BYTE $3F,$11,$08,$40,$09,$11¢057299 ; .FLOAT 0.1108400911¢057304 .BYTE $BF,$14,$28,$31,$56,$04¢057305 ; .FLOAT -0.1428315604¢057310 .BYTE $3F,$19,$99,$98,$77,$44¢057311 ; .FLOAT 0.1999987744¢057316 .BYTE $BF,$33,$33,$33,$31,$13¢057317 ; .FLOAT -0.3333333113¢057322 FP9S .BYTE $3F,$99,$99,$99,$99,$99 B¢057323 ; .FLOAT 0.9999999999¢057324 NATCF = [*-ATCOEF]/FPREC¢057328 PIOV4 .BYTE $3F,$78,$53,$98,$16,$34 B¢057334 LOG1 LDA FR0 Patch inserted¢057336 STA FR1 to make space in¢057338 SEC log to check for¢057339 JMP ?XPATCH log(0) or ln(0)¢057342 .BYTE 0,0 unused¢