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›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›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›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›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›056829 JSR FLD0R Get arg back›056832 JSR FSUB Arg-integer=fraction›056835 EXP1 LDA #NPCOEF coefficients›056837 LDX # 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›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›056989 JSR FST0R x to plyarg›056992 LDX FPTR2›056994 LDY FPTR2+1›056996 JSR FLD1R›056999 JSR FADD x+c›057002 LDX # FPSCR›057006 JSR FST0R›057009 LDX # PLYARG›057013 JSR FLD0R›057016 LDX FPTR2›057018 LDY FPTR2+1›057020 JSR FLD1R›057023 JSR FSUB x-c›057026 LDX # 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 # =x<=10›057091 LDY # >SQR10›057093 JSR XFORM z=(x-c)/(x+c) c*c=10›057096 LDX # FPSCR›057100 JSR FST0R save z›057103 JSR FMOVE›057106 JSR FMUL z*z›057109 LDA #NLCOEF›057111 LDX # LGCOEF›057115 JSR PLYEVL p(z*z)›057118 LDX # FPSCR›057122 JSR FLD1R›057125 JSR FMUL z*p(z*z)›057128 LDX # 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›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›