home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 196_01 / fp128.csm < prev    next >
Text File  |  1985-11-14  |  20KB  |  1,403 lines

  1. ;/*
  2. ;*****************************************************************
  3. ;*    Written by : Hakuo Katayose (JUG-CP/M No.179)        *
  4. ;*        JIP 980                        *
  5. ;*        49-114     kawauchi-Sanjuunin-machi        *
  6. ;*        Sendai, Miyagi, Japan.                *
  7. ;*        Telph.No (0222)61-3219                *
  8. ;*    Edited  by :                         *
  9. ;*                                *
  10. ;*****************************************************************
  11. ;*/
  12. ;
  13.     INCLUDE    "BDS.LIB"
  14.  
  15. BIASEXP    EQU    0400H
  16. NBYTES    EQU    16
  17.  
  18. ;
  19. ;--------------------------------------------------------------
  20. ;--------------------------------------------------------------
  21. ;
  22. ; 128_bit floting opration result flags.
  23. ;
  24. ;    EP        1  byte length.
  25. ;    OUTSGN        1  byte length.
  26. ;    OUTBUF        48 byte length.
  27. ;    
  28. ;    OVF        1  byte length.
  29. ;    UNF        1  byte length.
  30. ;    ZERO        1  byte length.
  31. ;    MINUS        1  byte length.
  32. ;
  33. ;--------------------------------------------------------------
  34. ;    
  35. ; 128_bit floting work_registers.
  36. ;
  37. ;    TEMPW        nbytes+5 byte length.
  38. ;    
  39. ;    UU        nbytes byte length.
  40. ;    VV        nbytes byte length.
  41. ;    WW        nbytes byte length.
  42. ;    XX        nbytes byte length.
  43. ;    YY        nbytes byte length.
  44. ;    
  45. ;--------------------------------------------------------------
  46. ;
  47. ; 128_bit floting Acc registers.
  48. ;
  49. ;    LA    128_bit floting ACC_A.        A_Acc extention.
  50. ;    AREG    128_bit floting ACC_A.        A_Acc.
  51. ;    AEXP    128_bit floting ACC_A.        expornemt.
  52. ;    ASIGN    128_bit floting ACC_A.        sign_flag.
  53. ;    
  54. ;    LB    128_bit floting ACC_B.        B_Acc extention.
  55. ;    BREG    128_bit floting ACC_B.        B_Acc.
  56. ;    BEXP    128_bit floting ACC_B.        expornemt.
  57. ;    BSIGN    128_bit floting ACC_B.        sign_flag.
  58. ;    
  59. ;    TEN1    128_bit floting constant.    10.0
  60. ;    ONE    128_bit floting constant.     1.0
  61. ;    TENM1    128_bit floting constant.     0.1
  62. ;    NUM0    128_bit floting constant.     0.0
  63. ;
  64. ;
  65. ;
  66. ;
  67.  
  68.     FUNCTION    fp128
  69.     call    arghak
  70.     push    b
  71.     lda    arg1
  72.     ora    a
  73.     jz    FPTEST
  74.     cpi    11
  75.     jz    FPIN
  76.     cpi    255
  77.     jz    FPTST2
  78.     lhld    arg2
  79.     xchg
  80.     lxi    h,AREG
  81.     call    unpack        ; (arg2) --> Acc. (Unpack).
  82.     lda    arg1
  83.     cpi    10
  84.     jz    FPCONV
  85.     lhld    arg3
  86.     xchg
  87.     lxi    h,BREG
  88.     call    unpack        ; (arg2) --> Bcc. (Unpack).
  89.     lxi    h,exitp
  90.     push    h
  91.     lda    arg1
  92.     cpi    1
  93.     jz    FPMUL0
  94.     cpi    2
  95.     jz    FPDIV0
  96.     cpi    3
  97.     jz    FPADD0
  98.     cpi    4
  99.     jz    FPSUB0
  100.     pop    h
  101.     pop    b
  102.     lxi    h,0
  103.     ret
  104.  
  105. exitp:    lhld    arg4
  106.     xchg
  107.     call    pack
  108.     lxi    h,OVF
  109.     xra    a
  110.     ora    m
  111.     inx    h
  112.     ora    m
  113.     inx    h
  114.     ora    m
  115.     inx    h
  116.     ora    m
  117.     mov    l,a
  118.     mvi    h,0
  119.     pop    b
  120.     ret
  121.  
  122. ;
  123. ;--------------------------------------------------------------
  124. ; FLOATING POINT DIVIDE ------ Acc = Acc / Bcc.
  125. ;--------------------------------------------------------------
  126.  
  127. FPDIV0:    lxi    h,0
  128.     shld    OVF
  129.     shld    ZERO
  130.     lhld    BEXP
  131.     mov    a,h
  132.     ora    l
  133.     jz    ovrfw
  134.     lhld    AEXP
  135.     mov    a,h
  136.     ora    l
  137.     jz    setzero
  138.     ;
  139. fdiv1:    lxi    h,0
  140.     shld    LA
  141.     shld    LA+2
  142.     shld    LA+4
  143.     shld    LA+6
  144.     lxi    h,LA+NBYTES+NBYTES-1
  145.     mvi    b,NBYTES+1
  146.     xra    a
  147.     call    sftr0
  148.     lxi    h,BREG+NBYTES-1
  149.     xra    a
  150.     call    sftr
  151.     lhld    BEXP
  152.     inx    h
  153.     shld    BEXP
  154.     mvi    b,NBYTES*8
  155. fdiv2:    push    b
  156.     lxi    d,AREG+NBYTES-1
  157.     lxi    h,BREG+NBYTES-1
  158.     call    icmp        ; comp  Acc - Bcc.
  159.     jc    fdiv3        ; if Acc < Bcc then fdiv3.
  160.     lxi    d,AREG
  161.     lxi    h,BREG
  162.     call    isub        ; Acc = Acc - Bcc.
  163.     xra    a
  164. fdiv3:    cmc
  165.     lxi    h,LA
  166.     call    sftl
  167.     call    sftl
  168.     pop    b
  169. ;    djnz    fdiv2
  170.     db    010h,0dch
  171.  
  172.     lxi    h,LA
  173.     lxi    d,AREG
  174.     lxi    b,NBYTES
  175.     ldir
  176.     lhld    AEXP
  177.     lxi    d,BIASEXP+2
  178.     dad    d
  179.     xchg
  180.     lhld    BEXP
  181.     xchg
  182.     jmp    expnrm
  183.  
  184.  
  185.  
  186. ;
  187. ;--------------------------------------------------------------
  188. ; FLOATING POINT MULTIPLY ------ Acc = Acc * Bcc.
  189. ;--------------------------------------------------------------
  190. ;
  191. FPMUL0:    lxi    h,0
  192.     shld    OVF
  193.     shld    ZERO
  194.     lhld    BEXP
  195.     mov    a,h
  196.     ora    l
  197.     jz    setzero
  198.     lhld    AEXP
  199.     mov    a,h
  200.     ora    l
  201.     jz    setzero
  202.     ;
  203. fmul3:    lxi    h,AREG
  204.     lxi    d,LA
  205.     lxi    b,nbytes
  206.     ldir
  207.  
  208.     lxi    h,BREG
  209.     call    imul
  210.  
  211.     lhld    AEXP
  212.     xchg
  213.     lhld    BEXP
  214.     dad    d
  215.     lxi    d,BIASEXP
  216.  
  217. expnrm:    ora    a
  218.     dsbc    d
  219.     shld    AEXP
  220.     jc    undrfw
  221.     mov    a,h
  222.     cpi    BIASEXP/128
  223.     jnc    ovrfw
  224.     lda    ASIGN
  225.     lxi    h,BSIGN
  226.     xra    m
  227.     sta    ASIGN
  228.     jmp    fpnorm
  229.  
  230. ;
  231. ;--------------------------------------------------------------
  232. ; FLOATING POINT ADDITION  Acc = Acc + Bcc.
  233. ; FLOATING POINT SUBTRACT  Acc = Acc - Bcc.
  234. ;--------------------------------------------------------------
  235. ;
  236.  
  237. FPSUB0:    lda    BSIGN
  238.     xri    080h
  239.     sta    BSIGN
  240. ;
  241. FPADD0:    lxi    h,0
  242.     shld    OVF
  243.     shld    ZERO
  244.     lhld    AEXP
  245.     mov    a,h
  246.     ora    l
  247.     xchg
  248.     jnz    fadd1
  249.     lxi    h,BREG
  250.     lxi    d,AREG
  251.     lxi    b,NBYTES+3
  252.     ldir
  253.     jmp    fpnorm
  254. fadd1:    lhld    BEXP
  255.     mov    a,h
  256.     ora    l
  257.     jz    fpnorm
  258.     xchg
  259.     dsbc    d
  260.     jz    fadd4
  261.     jnc    fadd2
  262.  
  263.     lda    ASIGN        ; Acc_flag <--> Bcc_flag.
  264.     mov    c,a
  265.     lda    BSIGN
  266.     sta    ASIGN
  267.     mov    a,c
  268.     sta    BSIGN
  269.     lxi    h,AREG
  270.     lxi    d,BREG
  271.     mvi    b,nbytes+2
  272.     call    swap0
  273.  
  274.     shld    BEXP
  275.     xchg
  276.     shld    AEXP
  277.     ora    a
  278.     dsbc    d
  279. fadd2:    mov    a,h
  280.     ora    a
  281.     jnz    fpnorm
  282.     mov    a,l
  283.     cpi    NBYTES*8-1
  284.     jnc    fpnorm
  285.     mov    b,a
  286.     lhld    BEXP
  287.     xchg
  288. fadd3:    push    b
  289.     xra    a
  290.     lxi    h,BREG+NBYTES-1
  291.     call    sftr
  292.     inx    d
  293.     pop    b
  294. ;    djnz    fadd3
  295.     db    010h,0f4h
  296. fadd4:    xchg
  297.     shld    BEXP
  298.     lda    ASIGN
  299.     lxi    h,BSIGN
  300.     xra    m
  301.     jnz    fadd5
  302. ;
  303. ;  if same sign.
  304. ;
  305.     lxi    d,AREG
  306.     lxi    h,BREG
  307.     call    iadd        ; (Acc) = (Acc) + (Bcc).
  308.     jnc    fpnorm
  309.     lxi    h,AREG+NBYTES-1    ; if carry_flag set then,
  310.     call    sftr        ;  shift right
  311.     lhld    AEXP
  312.     inx    h
  313.     shld    AEXP        ;  & exp = exp + 1.
  314.     jmp    fpnorm
  315. ;
  316. ;  if different sign.
  317. ;
  318. fadd5:    lxi    d,AREG
  319.     lxi    h,BREG
  320.     call    isub        ; Acc = Acc - Bcc.
  321.     jnc    fpnorm
  322.     lxi    h,AREG
  323.     call    ineg        ; negate Acc.
  324.     lda    BSIGN
  325.     sta    ASIGN        ; Asign = Bsign.
  326.     call    fpnorm
  327.     ret
  328. ;
  329. ;--------------------------------------------------------------
  330. ; UNPACK (DE) -> (HL).
  331. ;--------------------------------------------------------------
  332. ;
  333.  
  334. UNPACK:    xra    a
  335.     mov    m,a
  336.     inx    h
  337.     push    h
  338.     xchg
  339.     lxi    b,NBYTES
  340.     ldir
  341.     pop    h
  342.     xra    a
  343.     mvi    b,nbytes
  344. unpck1:    rld
  345.     inx    h
  346. ;    djnz    unpck1
  347.     db    010h,0fbh
  348.  
  349.     mov    c,a
  350.     ani    00000111b
  351.     mov    m,a
  352.     mov    a,c
  353.     ani    00001000b
  354.     jz    unpck2
  355.     mvi    a,080h
  356. unpck2:    inx    h
  357.     mov    m,a
  358.     ret
  359. ;
  360. ;--------------------------------------------------------------
  361. ; PACK SOURCE = A REG , DESTINATION = DE.
  362. ;--------------------------------------------------------------
  363. ;
  364.  
  365. pack:    push    d
  366.     lxi    h,OVF
  367.     mov    a,m        ; OVF
  368.     inx    h
  369.     ora    m        ; UNF
  370.     inx    h
  371.     ora    m        ; ZERO
  372.     jnz    pack1
  373.  
  374.     lxi    h,AREG+1
  375.     mov    a,m
  376.     ani    08h
  377.     cnz    inca
  378.  
  379. pack1:    lda    ASIGN
  380.     ora    a
  381.     mvi    c,0
  382.     jz    pack2
  383.     mvi    c,08h
  384. pack2:    lda    AEXP+1
  385.     ani    00000111b
  386.     ora    c
  387.     lxi    h,AEXP
  388.     mvi    b,nbytes
  389. pack3:    rrd
  390.     dcx    h
  391. ;    djnz    pack3
  392.     db    010h,0fbh
  393.  
  394.     inx    h
  395.     pop    d
  396.     lxi    b,NBYTES
  397.     ldir
  398.     RET
  399. ;
  400. ;
  401. ; INCREMENT A AND CORRECT FORM.
  402. ;
  403. inca:    mov    a,m
  404.     ani    0f8h
  405.     adi    08h
  406.     mov    m,a
  407.     rnc
  408.     mvi    b,NBYTES-2
  409. inca1:    inx    h
  410.     inr    m
  411.     rnz
  412. ;    djnz    inca1
  413.     db    010h,0fbh
  414.  
  415.     stc
  416.     call    sftr
  417.     lhld    AEXP
  418.     inx    h
  419.     shld    AEXP
  420.     mov    a,h
  421.     cpi    BIASEXP/128
  422.     rc
  423.     mvi    h,BIASEXP/128-1
  424.     shld    AEXP
  425.     mvi    a,08h
  426.     sta    OVF
  427.     ret
  428.  
  429. ;
  430. ;--------------------------------------------------------------
  431. ; FLOTING NUMBER OUTPUT CONVERTION.
  432. ;--------------------------------------------------------------
  433. ;
  434.  
  435. FPCONV:    lda    ASIGN
  436.     ora    a
  437.     mvi    a,' '
  438.     jz    conv1
  439.     mvi    a,'-'
  440. conv1:    sta    outsgn
  441.     lhld    AEXP
  442.     mov    a,h
  443.     ora    l
  444.     jz    conv9
  445.  
  446.     xra    a
  447.     sta    ASIGN
  448.     lxi    h,0
  449.     shld    EP        ; EP = 0;
  450. conv20:    lxi    h,256
  451.     shld    k2        ; k2 = 256;
  452.  
  453. conv2:    lxi    d,AREG+NBYTES+1
  454.     lxi    h,ONE +NBYTES+1
  455.     mvi    b,nbytes+2
  456.     call    icmp0
  457.     jc    mconv        ; if (A < 1.0) then mconv.
  458.  
  459.     lxi    h,TEN256    ; T  = TEN256;
  460.     shld    T        ;
  461.  
  462. pconv1:    lxi    d,NBYTES+1
  463.     dad    d
  464.     lxi    d,AREG+NBYTES+1
  465.     mvi    b,nbytes+2
  466.     call    icmp0
  467.     jc    pconv2        ; if (A < *T) then  pconv2
  468.  
  469.     lhld    T        ; A = A / *T;
  470.     lxi    d,BREG
  471.     lxi    b,NBYTES+3
  472.     ldir
  473.     call    FPDIV0;
  474.  
  475.     lhld    k2        ; EP = EP + k2;
  476.     xchg
  477.     lhld    EP
  478.     dad    d
  479.     shld    EP
  480.                 ;            }
  481. pconv2:
  482.     lhld    k2
  483.     srlr    h
  484.     rarr    l        ;        k2 = k2 / 2;
  485.     shld    k2
  486.     mov    a,h
  487.     ora    l
  488.     jz    conv3
  489.  
  490.     lhld    T
  491.     lxi    d,nbytes+3
  492.     dad    d
  493.     shld    T        ;        T = T + NBYTES+3;
  494.     jmp    pconv1        ;    }
  495.  
  496. ;
  497. ;
  498. ;
  499. mconv:    lxi    d,AREG+nbytes+1
  500.     lxi    h,TENM1+nbytes+1
  501.     mvi    b,nbytes+2
  502.     call    icmp0
  503.     jnc    conv3        ; if (A >= 0.1) then conv3
  504.  
  505.     lxi    h,TENM128    ; T  = 10**(-128);
  506.     shld    T
  507.  
  508.     lxi    d,AREG+NBYTES+1
  509.     lxi    h,TENM256+NBYTES+1
  510.     mvi    b,nbytes+2
  511.     call    icmp0
  512.     jnc    mconv1        ; if (A >= *T) then mconv2
  513.     lxi    h,TEN256
  514.     lxi    d,BREG
  515.     lxi    b,NBYTES+3
  516.     ldir
  517.     call    FPMUL0;
  518.     lxi    h,TEN256
  519.     lxi    d,BREG
  520.     lxi    b,NBYTES+3
  521.     ldir
  522.     call    FPMUL0;
  523.  
  524.     lxi    h,-512
  525.     shld    EP
  526.     jmp    conv20
  527.  
  528. mconv1:    lhld    T
  529.     lxi    d,nbytes+1
  530.     dad    d
  531.     lxi    d,AREG+NBYTES+1
  532.     mvi    b,nbytes+2
  533.     call    icmp0
  534.     jc    mconv2        ; if (A < *T) then mconv2.
  535.  
  536.     lhld    k2
  537.     srlr    h
  538.     rarr    l        ;        k2 = k2 / 2;
  539.     shld    k2
  540.  
  541.     lhld    T
  542.     lxi    d,nbytes+3
  543.     dad    d
  544.     shld    T        ;        T = T + NBYTES+3;
  545.     jmp    mconv1        ;    }
  546.  
  547.  
  548. mconv2:    lhld    T        ;            A = A / *T;
  549.     dcx    h
  550.     lxi    d,BREG+NBYTES+2
  551.     lxi    b,NBYTES+3
  552.     lddr
  553.     call    FPDIV0;
  554.  
  555.     lhld    k2        ;            EP = EP - k2;
  556.     xchg
  557.     lhld    EP
  558.     ora    a
  559.     dsbc    d
  560.     shld    EP
  561.     jmp    conv20
  562.  
  563.  
  564. conv3:    lxi    d,AREG+NBYTES+1
  565.     lxi    h,ONE +NBYTES+1
  566.     mvi    b,nbytes+2
  567.     call    icmp0
  568.     jc    conv4        ; if (A < 1.0) then conv4.
  569.     lxi    h,TEN1
  570.     lxi    d,BREG
  571.     lxi    b,NBYTES+3
  572.     ldir
  573.     call    FPDIV0
  574.     lhld    EP
  575.     inx    h
  576.     shld    EP
  577. conv4:    lxi    h,0
  578.     shld    AREG-1
  579.     lhld    AEXP
  580.     lxi    d,BIASEXP
  581.     xchg
  582.     ora    a
  583.     dsbc    d
  584.     jz    conv6
  585.     mov    b,l
  586. conv5:    push    b
  587.     lxi    h,AREG+NBYTES-1
  588.     xra    a
  589.     mvi    b,nbytes+1
  590.     call    sftr0
  591.     pop    b
  592. ;    djnz    conv5
  593.     db    010h,0f3h
  594. conv6:    mvi    b,34
  595.     lxi    h,outbuf+2
  596. conv7:    call    tenthA
  597.     adi    '0'
  598.     mov    m,a
  599.     inx    h
  600. ;    djnz    conv7
  601.     db    010h,0f7h
  602.  
  603.     call    tenthA
  604.     cpi    5
  605.     jc    conv8
  606.  
  607.     mvi    b,34
  608. conv70:    dcx    h
  609.     mov    a,m
  610.     inr    a
  611.     mov    m,a
  612.     cpi    '9'+1
  613.     jnz    conv8
  614.     mvi    a,'0'
  615.     mov    m,a
  616. ;    djnz    conv70
  617.     db    010h,0f2h
  618.  
  619.     mvi    a,'1'
  620.     sta    outbuf+2
  621.     lxi    h,outbuf+3
  622.     lxi    d,outbuf+4
  623.     lxi    b,33
  624.     mvi    m,'0'
  625.     ldir
  626.     lhld    EP
  627.     inx    h
  628.     shld    EP
  629.  
  630. conv8:    mvi    a,0
  631.     sta    outbuf+36
  632.     mvi    a,'0'
  633.     sta    outbuf
  634.     mvi    a,'.'
  635.     sta    outbuf+1
  636.     lxi    h,EP
  637.     pop    b
  638.     ret
  639.  
  640. conv9:    lxi    h,outbuf+2
  641.     lxi    d,outbuf+3
  642.     lxi    b,34
  643.     mvi    m,'0'
  644.     ldir
  645.     mvi    m,0
  646.     jmp    conv8
  647. ;
  648. tenthA:    push    h
  649.     push    d
  650.     push    b
  651.      lxi    h,AREG-1
  652.     lxi    d,BREG-1
  653.     lxi    b,NBYTES+4
  654.     LDIR
  655.     stc
  656.     lxi    h,AREG-1
  657.     mvi    b,nbytes+1
  658.     call    sftl0
  659.     mvi    a,0
  660.     ral
  661.  
  662.     lxi    h,AREG-1
  663.     mvi    b,nbytes+1
  664.     call    sftl0
  665.     ral
  666.  
  667.     mov    c,a
  668.     lxi    d,AREG-1
  669.     lxi    h,BREG-1
  670.     mvi    b,nbytes+1
  671.     call    iadd0
  672.     mvi    a,0
  673.     adc    c
  674.  
  675.     lxi    h,AREG-1
  676.     mvi    b,nbytes+1
  677.     call    sftl0
  678.     ral
  679.     pop    b
  680.     pop    d
  681.     pop    h
  682.     ret
  683.  
  684. ;
  685. ;
  686. ;
  687. FPIN:    call    cleara
  688.     lxi    h,0
  689.     shld    EPX
  690.     mvi    a,0
  691.     sta    SIGNX
  692.     sta    outsgn
  693.     lhld    arg2
  694.     xra    a        ; null terminator search.
  695.      lxi    b,100
  696.     ccir
  697.     jnz    fpin15        ; if not found goto fpin15.
  698.     xchg
  699.     lhld    arg2
  700.     xchg
  701.     ora    a
  702.     dsbc    d
  703.     push    h        ; string length save.
  704. ;
  705.     mov    b,h
  706.     mov    c,l
  707.     lhld    arg2
  708.     mvi    a,'E'
  709.     ccir
  710.     pop    b
  711.     jz    fpin1
  712. ;
  713.     lhld    arg2
  714.     mvi    a,'e'
  715.     ccir
  716.     jnz    fpin6
  717. ;
  718. ;
  719. fpin1:    dcx    h
  720.     mvi    m,0
  721.     inx    h
  722.     mov    a,m
  723.     cpi    '-'
  724.     jnz    fpin2
  725.     sta    SIGNX
  726.     jmp    fpin3
  727. fpin2:    cpi    '+'
  728.     jnz    fpin4
  729. fpin3:    inx    h
  730. fpin4:    call    ctoi
  731.     jc    fpin5
  732.     push    h
  733.     lhld    EPX
  734.     mov    d,h
  735.     mov    e,l
  736.     dad    h
  737.     dad    h
  738.     dad    d
  739.     dad    h
  740.     mov    e,a
  741.     mvi    d,0
  742.     dad    d
  743.     shld    EPX
  744.     pop    h
  745.     jmp    fpin3
  746.  
  747. fpin5:    lda    SIGNX
  748.     cpi    '-'
  749.     jnz    fpin6
  750.     lhld    EPX
  751.     xchg
  752.     lxi    h,0
  753.     ora    a
  754.     dsbc    d
  755.     shld    EPX
  756. ;
  757. fpin6:    xra    a
  758.     sta    SIGNX
  759.     lhld    arg2
  760.     mov    a,m
  761.     cpi    '+'
  762.     jz    fpin7
  763.     cpi    '-'
  764.     jnz    fpin8
  765.     sta    outsgn
  766. fpin7:    inx    h
  767. fpin8:    mov    a,m
  768.     cpi    '.'
  769.     jz    fpin10        ; goto real part.
  770.     cpi    '0'
  771.     jnz    fpin11        ; goto integer part.
  772.     jmp    fpin7
  773. ;
  774. fpin10:    inx    h        ; real part. ( 0.000...nn)
  775.     mov    a,m
  776.     cpi    '0'
  777.     jnz    fpin13
  778.     xchg
  779.     lhld    EPX
  780.     dcx    h
  781.     shld    EPX
  782.     xchg
  783.     jmp    fpin10
  784. ;
  785. fpin11:    call    ctoi        ; integer part.
  786.     jc    fpin12
  787.     call    fpinx
  788.     inx    h
  789.     jmp    fpin11
  790. ;
  791. fpin12:    cpi    '.'
  792.     jnz    fpin14
  793.     inx    h
  794. fpin13:    call    ctoi        ; real part. ( n.mmm)
  795.     jc    fpin14
  796.     call    fpinx
  797.     xchg
  798.     lhld    EPX
  799.     dcx    h
  800.     shld    EPX
  801.     xchg
  802.     inx    h
  803.     jmp    fpin13
  804. ;
  805. fpin14:    lhld    EPX
  806.     mov    a,h
  807.     ora    l
  808.     jz    fpin15
  809.     lxi    h,AREG
  810.     lxi    d,xx
  811.     lxi    b,NBYTES+3
  812.     ldir
  813.     call    exp
  814.     lxi    h,AREG
  815.     lxi    d,BREG
  816.     lxi    b,NBYTES+3
  817.     ldir
  818.     lxi    h,xx
  819.     lxi    d,AREG
  820.     lxi    b,NBYTES+3
  821.     ldir
  822. ;
  823.     lda    SIGNX
  824.     cpi    '-'
  825.     jnz    fpin17
  826.     call    FPDIV0
  827.     jmp    fpin15
  828. fpin17:    call    FPMUL0
  829.  
  830. fpin15:    lda    outsgn
  831.     ora    a
  832.     jz    fpin16
  833.     mvi    a,080h
  834.     sta    ASIGN
  835. fpin16:    lhld    arg3
  836.     xchg
  837.     call    pack
  838.     pop    b
  839.     ret
  840.  
  841. ctoi:    mov    a,m
  842.     call    isdigit
  843.     rc
  844.     sui    '0'
  845.     ret
  846.  
  847. fpinx:    push    h
  848.     push    psw
  849.     lxi    h,TEN1
  850.     lxi    d,BREG
  851.     lxi    b,NBYTES+3
  852.     ldir
  853.     call    FPMUL0
  854.     pop    psw
  855.     mov    c,a
  856.     add    a
  857.     add    a
  858.     add    c
  859.     add    a
  860.     add    a
  861.     sub    c
  862.     mov    c,a
  863.     mvi    b,0
  864.     lxi    h,NUM0
  865.     dad    b
  866.     lxi    d,BREG
  867.     lxi    b,NBYTES+3
  868.     ldir
  869.     call    FPADD0
  870.     pop    h
  871.     ret
  872. ;
  873. exp:    lhld    EPX
  874.     mov    a,h
  875.     ora    a
  876.     jp    exp0
  877.     xchg
  878.     lxi    h,0
  879.     ora    a
  880.     dsbc    d
  881.     shld    EPX
  882.     mvi    a,'-'
  883.     sta    SIGNX
  884. ;
  885. exp0:    lxi    h,ONE
  886.     lxi    d,AREG
  887.     lxi    b,NBYTES+3
  888.     ldir
  889.     lhld    EPX
  890.     mov    a,h
  891.     ora    l
  892.     rz
  893.     mov    a,h
  894.     ora    a
  895.     jz    exp1
  896.     lxi    h,TEN256
  897.     lxi    d,AREG
  898.     lxi    b,NBYTES+3
  899.     ldir
  900.     lhld    EPX
  901. exp1:    mvi    c,128
  902.     mvi    b,0
  903. exp2:    mov    a,l
  904.     ora    a
  905.     rz
  906.     sub    c
  907.     jc    exp3
  908.     mov    l,a
  909.     push    b
  910.     push    h
  911.     mov    a,b
  912.     add    a
  913.     add    a
  914.     add    b
  915.     add    a
  916.     add    a
  917.     sub    b
  918.     mov    c,a
  919.     mvi    b,0
  920.     lxi    h,TEN128
  921.     dad    b
  922.     lxi    d,BREG
  923.     lxi    b,NBYTES+3
  924.     ldir
  925.     call    FPMUL0
  926.     pop    h
  927.     pop    b
  928. exp3:    srlr    c
  929.     inr    b
  930.     jmp    exp2
  931. ;
  932.  
  933. SIGNX    ds    1
  934. EPX    ds    2
  935. T    ds    2
  936. numlen    ds    2
  937. ;
  938. ;
  939. ;
  940. FPTEST:    lhld    arg2
  941.     push    h
  942.     pop    d
  943.     dad    h
  944.     dad    h
  945.     dad    d
  946.     dad    h
  947.     dad    h
  948.     dsbc    d
  949.     lxi    d,TEN256
  950.     dad    d
  951.     lxi    d,AREG
  952.     lxi    b,NBYTES+3
  953.     ldir
  954.     jmp    FPCONV
  955.  
  956.  
  957. FPTST2:    lhld    arg2
  958.     lxi    d,AREG
  959.     lxi    b,NBYTES+3
  960.     ldir
  961.     jmp    FPCONV
  962.  
  963.  
  964. isdigit:cpi    '0'
  965.     rc
  966.     cpi    '9'+1
  967.     cmc
  968.     ret
  969.  
  970. cleara:    push    h
  971.     lxi    h,areg
  972.     mvi    b,nbytes+3
  973.     call    iclr0
  974.     pop    h
  975.     ret
  976. ;
  977. ;
  978. ;
  979. iclr:    mvi    b,nbytes
  980. iclr0:    push    psw
  981.     xra    a
  982. iclr1:    mov    m,a
  983.     inx    h
  984. ;    djnz    iclr1
  985.     db    010h,0fch
  986.     pop    psw
  987.     ret
  988. ;
  989. ;
  990. ;
  991. imul:    shld    tmp
  992.     lxi    h,areg
  993.     call    iclr
  994.     mvi    b,nbytes*8
  995. loopml:    push    b
  996.     lxi    h,la+nbytes-1
  997.     call    sftr
  998.     jnc    jumpml
  999.     lhld    tmp
  1000.     lxi    d,areg
  1001.     ora    a
  1002.     call    iadd
  1003. jumpml:    lxi    h,areg+nbytes-1
  1004.     call    sftr
  1005.     pop    b
  1006. ;    djnz    loopml
  1007.     db    010h,0e3h
  1008.     call    sftr
  1009.     ret
  1010. ;
  1011. ;
  1012. ;
  1013. idiv:    shld    tmp
  1014.     lxi    h,areg
  1015.     call    iclr
  1016.     mvi    b,nbytes*8
  1017.     lda    la+nbytes-1
  1018.     bit    7,a
  1019.     jnz    loopdv
  1020. dvchkk:    ;djnz    dvchk
  1021.     db    010h,02h
  1022.     stc
  1023.     ret
  1024. dvchk:    push    b
  1025.     lxi    h,la
  1026.     call    sftl
  1027.     pop    b
  1028.     jp    dvchkk
  1029. loopdv:    push    b
  1030.     lxi    h,la
  1031.     call    sftl
  1032.     call    sftl
  1033.     lhld    tmp
  1034.     lxi    d,areg
  1035.     ora    a
  1036.     call    isub
  1037.     jnc    jumpdv
  1038.     lhld    tmp
  1039.     lxi    d,areg
  1040.     ora    a
  1041.     call    iadd
  1042. jumpdv:    cmc    
  1043.     pop    b
  1044. ;    djnz    loopdv
  1045.     db    010h,0dbh
  1046.     lxi    h,la
  1047.     call    sftl
  1048.     ana    a
  1049.     ret
  1050. ;
  1051. ;
  1052. ;
  1053. iadd:    mvi    b,nbytes
  1054. iadd0:    ldax    d
  1055.     adc    m
  1056.     stax    d
  1057.     inx    h
  1058.     inx    d
  1059. ;    djnz    iadd0
  1060.     db    010h,0f9h
  1061.     ret
  1062. ;
  1063. ;
  1064. ;
  1065. isub:    mvi    b,nbytes
  1066. isub1:    ldax    d
  1067.     sbb    m
  1068.     stax    d
  1069.     inx    d
  1070.     inx    h
  1071. ;    djnz    isub1
  1072.     db    010h,0f9h
  1073.     ret
  1074. ;
  1075. ;
  1076. ;
  1077. icmp:    mvi    b,nbytes
  1078. icmp0:    ldax    d
  1079.     sub    m
  1080.     rnz
  1081.     dcx    d
  1082.     dcx    h
  1083. ;    djnz    icmp0
  1084.     db    010h,0f9h
  1085.     ret
  1086. ;
  1087. ineg:    mvi    b,nbytes
  1088. ineg0:    mov    a,m
  1089.     cma
  1090.     adi    1
  1091.     mov    m,a
  1092.     dcr    b
  1093. ineg1:    inx    h
  1094.     mov    a,m
  1095.     cma
  1096.     aci    0
  1097.     mov    m,a
  1098. ;    djnz    ineg1
  1099.     db    010h,0f8h
  1100.     ret
  1101. ;
  1102. ;
  1103. ;
  1104. sftl:    mvi    b,nbytes
  1105. sftl0:    ralr    m
  1106.     inx    h
  1107. ;    djnz    sftl0
  1108.     db    010h,0fbh
  1109.     ret
  1110. ;
  1111. ;
  1112. ;
  1113. sftr:    mvi    b,nbytes
  1114. sftr0:    rarr    m
  1115.     dcx    h
  1116. ;    djnz    sftr0
  1117.     db    010h,0fbh
  1118.     ret
  1119. ;
  1120. ;
  1121. ;
  1122. tenth:    push    b
  1123.     shld    tmp
  1124.     lxi    d,llwork
  1125.     lxi    b,nbytes
  1126.     ldir
  1127.     xra    a
  1128.     lhld    tmp
  1129.     call    sftl
  1130.     ral
  1131.     ora    a
  1132.     lhld    tmp
  1133.     call    sftl
  1134.     ral
  1135.     mov    c,a
  1136.     lhld    tmp
  1137.     lxi    d,llwork
  1138.     xchg
  1139.     call    iadd
  1140.     mvi    a,0
  1141.     adc    c
  1142.     ora    a
  1143.     lhld    tmp
  1144.     call    sftl
  1145.     ral
  1146.     pop    b
  1147.     ret
  1148.  
  1149. swap:    mvi    b,nbytes
  1150. swap0:    mov    c,m
  1151.     ldax    d
  1152.     mov    m,a
  1153.     mov    a,c
  1154.     stax    d
  1155.     inx    h
  1156.     inx    d
  1157. ;    djnz    swap0
  1158.     db    010h,0f7h
  1159.     ret
  1160.  
  1161. ;
  1162. ;--------------------------------------------------------------
  1163. ; FLOATING POINT normalization.
  1164. ;--------------------------------------------------------------
  1165. ;
  1166. fpnorm:    lhld    AEXP
  1167.     xchg
  1168.     lxi    b,1
  1169. fpnrm1:    lda    AREG+NBYTES-1
  1170.     ral
  1171.     jc    fpnrm2
  1172.     lxi    h,la
  1173.     call    sftl
  1174.     call    sftl
  1175.     xchg
  1176.     dsbc    b
  1177.     xchg
  1178.     jnc    fpnrm1
  1179.     jmp    undrfw
  1180.  
  1181. fpnrm2:    xchg
  1182.     mov    a,h
  1183.     cpi    BIASEXP/128
  1184.     jnc    ovrfw
  1185.     shld    AEXP
  1186.     jmp    extnrm
  1187.  
  1188.  
  1189. ovrfw:    lxi    h,AREG
  1190.     call    iclr
  1191.     mvi    h,BIASEXP/128-1
  1192.     shld    AEXP
  1193.     mvi    a,08h
  1194.     sta    OVF
  1195.     xra    a
  1196.     sta    ZERO
  1197.     jmp    extnrm
  1198.     ;
  1199.     ;
  1200. undrfw:    lxi    h,AREG
  1201.     mvi    b,nbytes+2
  1202.     call    iclr0
  1203.     mvi    a,04h
  1204.     sta    UNF
  1205.     xra    a
  1206.     sta    ZERO
  1207. extnrm:    lda    ASIGN
  1208.     ora    a
  1209.     jz    extnm2
  1210.     mvi    a,1
  1211. extnm2:    sta    MINUS
  1212.     ret
  1213.     ;
  1214.     ;
  1215. setzero:
  1216.     lxi    h,AREG
  1217.     mvi    b,nbytes+3
  1218.     call    iclr0
  1219.     lxi    h,0
  1220.     shld    OVF
  1221.     mvi    a,020h
  1222.     sta    ZERO
  1223.     xra    a
  1224.     sta    MINUS
  1225.     ret
  1226.  
  1227.  
  1228. llwork    ds    nbytes+3
  1229. ;
  1230.  
  1231. k2    ds    2
  1232. EP    ds    2
  1233. OUTSGN    ds    1
  1234. OUTBUF    ds    48
  1235.     ;
  1236. OVF    ds    1
  1237. UNF    ds    1
  1238. ZERO    ds    1
  1239. MINUS    ds    1
  1240. ;
  1241. ;
  1242. tempw    ds    nbytes+8
  1243. uu    ds    nbytes+3
  1244. vv    ds    nbytes+3
  1245. ww    ds    nbytes+3
  1246. xx    ds    nbytes+3
  1247. yy    ds    nbytes+3
  1248. ;
  1249. ;
  1250. LA    DS    NBYTES
  1251. AREG    DS    NBYTES
  1252. AEXP    DS    2
  1253. ASIGN    DS    1
  1254.     ;
  1255. LB:    DS    NBYTES
  1256. BREG:    DS    NBYTES
  1257. BEXP:    DS    2
  1258. BSIGN:    DS    1
  1259. ;
  1260. ;
  1261. ;
  1262. ten256    db    0b7h,0eah,0feh,098h,01bh,090h,0bbh,0ddh
  1263.     db    08dh,0deh,0f9h,09dh,0fbh,0ebh,07eh,0aah
  1264.     dw    biasexp+353h
  1265.     db    000h
  1266. ten128    db    037h,001h,0b1h,036h,06ch,033h,06fh,0c6h
  1267.     db    0dfh,08ch,0e9h,080h,0c9h,047h,0bah,093h
  1268.     dw    biasexp+1aah
  1269.     db    000h
  1270. ten64    db    0fbh,025h,06bh,0c7h,071h,06bh,0bfh,03ch
  1271.     db    0d5h,0a6h,0cfh,0ffh,049h,01fh,078h,0c2h
  1272.     dw    biasexp+0d5h
  1273.     db    000h
  1274. ten32    db    000h,000h,000h,000h,000h,000h,020h,0f0h
  1275.     db    09dh,0b5h,070h,02bh,0a8h,0adh,0c5h,09dh
  1276.     dw    biasexp+06bh
  1277.     db    000h
  1278. ten16    db    000h,000h,000h,000h,000h,000h,000h,000h
  1279.     db    000h,000h,000h,004h,0bfh,0c9h,01bh,08eh
  1280.     dw    biasexp+036h
  1281.     db    000h
  1282. ten8    db    000h,000h,000h,000h,000h,000h,000h,000h
  1283.     db    000h,000h,000h,000h,000h,020h,0bch,0beh
  1284.     dw    biasexp+01bh
  1285.     db    000h
  1286. ten4    db    000h,000h,000h,000h,000h,000h,000h,000h
  1287.     db    000h,000h,000h,000h,000h,000h,040h,09ch
  1288.     dw    biasexp+00eh
  1289.     db    000h
  1290. ten2    db    000h,000h,000h,000h,000h,000h,000h,000h
  1291.     db    000h,000h,000h,000h,000h,000h,000h,0c8h
  1292.     dw    biasexp+007h
  1293.     db    000h
  1294. ten1    db    000h,000h,000h,000h,000h,000h,000h,000h
  1295.     db    000h,000h,000h,000h,000h,000h,000h,0a0h
  1296.     dw    biasexp+004h
  1297.     db    000h
  1298. one    db    000h,000h,000h,000h,000h,000h,000h,000h
  1299.     db    000h,000h,000h,000h,000h,000h,000h,080h
  1300.     dw    biasexp+001h
  1301.     db    000h
  1302. ;
  1303. tenm256    db    008h,053h,0fbh,0feh,055h,011h,091h,0fah
  1304.     db    039h,019h,07ah,063h,025h,043h,031h,0c0h
  1305.     dw    biasexp-352h
  1306.     db    000h
  1307. tenm128    db    0deh,0dbh,05dh,0d0h,0f6h,0b3h,07ch,0ach
  1308.     db    0a0h,0e4h,0bch,064h,07ch,046h,0d0h,0ddh
  1309.     dw    biasexp-1a9h
  1310.     db    000h
  1311. tenm64    db    024h,062h,0b3h,047h,0d7h,098h,023h,03fh
  1312.     db    0a5h,0e9h,039h,0a5h,027h,0eah,07fh,0a8h
  1313.     dw    biasexp-0d4h
  1314.     db    000h
  1315. tenm32    db    0f2h,04ah,081h,0a5h,0edh,018h,0deh,067h
  1316.     db    0bah,094h,039h,045h,0adh,01eh,0b1h,0cfh
  1317.     dw    biasexp-06ah
  1318.     db    000h
  1319. tenm16    db    0b3h,0a9h,089h,079h,068h,0beh,02eh,04ch
  1320.     db    05bh,0e1h,04dh,0c4h,0beh,094h,095h,0e6h
  1321.     dw    biasexp-035h
  1322.     db    000h
  1323. tenm8    db    03dh,07ch,0bah,036h,02bh,00dh,0c2h,0fdh
  1324.     db    0fch,0ceh,061h,084h,011h,077h,0cch,0abh
  1325.     dw    biasexp-01ah
  1326.     db    000h
  1327. tenm4    db    0a8h,0a4h,04eh,040h,013h,061h,0c3h,0d3h
  1328.     db    02bh,065h,019h,0e2h,058h,017h,0b7h,0d1h
  1329.     dw    biasexp-00dh
  1330.     db    000h
  1331. tenm2    db    0a3h,070h,03dh,00ah,0d7h,0a3h,070h,03dh
  1332.     db    00ah,0d7h,0a3h,070h,03dh,00ah,0d7h,0a3h
  1333.     dw    biasexp-006h
  1334.     db    000h
  1335. tenm1    db    0cdh,0cch,0cch,0cch,0cch,0cch,0cch,0cch
  1336.     db    0cch,0cch,0cch,0cch,0cch,0cch,0cch,0cch
  1337.     dw    biasexp-003h
  1338.     db    000h
  1339. ;
  1340. ;
  1341. ;
  1342. num0    db    000h,000h,000h,000h,000h,000h,000h,000h
  1343.     db    000h,000h,000h,000h,000h,000h,000h,000h
  1344.     dw    000h
  1345.     db    000h
  1346. num1    db    000h,000h,000h,000h,000h,000h,000h,000h
  1347.     db    000h,000h,000h,000h,000h,000h,000h,080h
  1348.     dw    biasexp+001h
  1349.     db    000h
  1350. num2    db    000h,000h,000h,000h,000h,000h,000h,000h
  1351.     db    000h,000h,000h,000h,000h,000h,000h,080h
  1352.     dw    biasexp+002h
  1353.     db    000h
  1354. num3    db    000h,000h,000h,000h,000h,000h,000h,000h
  1355.     db    000h,000h,000h,000h,000h,000h,000h,0c0h
  1356.     dw    biasexp+002h
  1357.     db    000h
  1358. num4    db    000h,000h,000h,000h,000h,000h,000h,000h
  1359.     db    000h,000h,000h,000h,000h,000h,000h,080h
  1360.     dw    biasexp+003h
  1361.     db    000h
  1362. num5    db    000h,000h,000h,000h,000h,000h,000h,000h
  1363.     db    000h,000h,000h,000h,000h,000h,000h,0a0h
  1364.     dw    biasexp+003h
  1365.     db    000h
  1366. num6    db    000h,000h,000h,000h,000h,000h,000h,000h
  1367.     db    000h,000h,000h,000h,000h,000h,000h,0c0h
  1368.     dw    biasexp+003h
  1369.     db    000h
  1370. num7    db    000h,000h,000h,000h,000h,000h,000h,000h
  1371.     db    000h,000h,000h,000h,000h,000h,000h,0e0h
  1372.     dw    biasexp+003h
  1373.     db    000h
  1374. num8    db    000h,000h,000h,000h,000h,000h,000h,000h
  1375.     db    000h,000h,000h,000h,000h,000h,000h,080h
  1376.     dw    biasexp+004h
  1377.     db    000h
  1378. num9    db    000h,000h,000h,000h,000h,000h,000h,000h
  1379.     db    000h,000h,000h,000h,000h,000h,000h,090h
  1380.     dw    biasexp+004h
  1381.     db    000h
  1382. ;
  1383. ;
  1384. ;
  1385. pai    db    000h,020h,0dah,080h,08bh,062h,0c6h,0c4h
  1386.     db    034h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  1387.     dw    biasexp+002h
  1388.     db    000h
  1389. pai2    db    000h,020h,0dah,080h,08bh,062h,0c6h,0c4h
  1390.     db    034h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  1391.     dw    biasexp+003h
  1392.     db    000h
  1393. paid2    db    000h,020h,0dah,080h,08bh,062h,0c6h,0c4h
  1394.     db    034h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  1395.     dw    biasexp+001h
  1396.     db    000h
  1397. paid4    db    000h,020h,0dah,080h,08bh,062h,0c6h,0c4h
  1398.     db    034h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  1399.     dw    biasexp+000h
  1400.     db    000h
  1401.  
  1402.     ENDFUNC
  1403.