home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 196_01 / fp64.csm < prev    next >
Text File  |  1985-11-14  |  41KB  |  3,082 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.  
  16. BIASEXP    EQU    0400H
  17. NBYTES    EQU    8
  18.  
  19. ;
  20. ;--------------------------------------------------------------
  21. ;--------------------------------------------------------------
  22. ;
  23. ; 64_bit INTEGER basic_subroutines.
  24. ;
  25. ;    IMUL64    64_bit multiplay.    LA   =  LA  * (hl).
  26. ;    IDIV64    64_bit divide.        LA   =  LA  / (hl).
  27. ;    IADDA    64_bit addition.    LA   =  LA  + (hl).
  28. ;    ISUBA    64_bit subtruction.    LA   =  LA  - (hl).
  29. ;    
  30. ;    IADD64    64_bit addition.    (de) = (de) + (hl).
  31. ;    ISUB64    64_bit subtruction.    (de) = (de) - (hl).
  32. ;    
  33. ;    ICMP64    64_bit compare.        c,z  = (de) - (hl).
  34. ;
  35. ;    INEG64    64_bit negation.    (hl) = ~(hl).
  36. ;    
  37. ;    SFTL64    64_bit left shift.    (carry set).
  38. ;    SFTR64    64_bit right shift.    (carry set).
  39. ;    
  40. ;    DSHFTL    128_bit left  shift.
  41. ;    DSHFTR    128_bit right shift.
  42. ;    
  43. ;    ITENTH    64_bit 10 times.    (hl) = (hl) * 10.
  44. ;    
  45. ;
  46. ; work area:
  47. ;    TEN    64_bit constant.    10.
  48. ;    LLWORK    LLong type work_area.
  49. ;    
  50. ;--------------------------------------------------------------
  51. ;
  52.  
  53. ;
  54. ;--------------------------------------------------------------
  55. ;--------------------------------------------------------------
  56. ;
  57. ; 64_bit floting opration result flags.
  58. ;
  59. ;    EP        1  byte length.
  60. ;    OUTSGN        1  byte length.
  61. ;    OUTBUF        20 byte length.
  62. ;    
  63. ;    OVF        1  byte length.
  64. ;    UNF        1  byte length.
  65. ;    ZERO        1  byte length.
  66. ;    MINUS        1  byte length.
  67. ;
  68. ;--------------------------------------------------------------
  69. ;    
  70. ; 64_bit floting work_registers.
  71. ;
  72. ;    TEMPW        16 byte length.
  73. ;    
  74. ;    UU        nbytes byte length.
  75. ;    VV        nbytes byte length.
  76. ;    WW        nbytes byte length.
  77. ;    XX        nbytes byte length.
  78. ;    YY        nbytes byte length.
  79. ;    
  80. ;--------------------------------------------------------------
  81. ;
  82. ; 64_bit floting Acc registers.
  83. ;
  84. ;    LA    64_bit floting ACC_A.        A_Acc extention.
  85. ;    AREG    64_bit floting ACC_A.        A_Acc.
  86. ;    AEXP    64_bit floting ACC_A.        expornemt.
  87. ;    ASIGN    64_bit floting ACC_A.        sign_flag.
  88. ;    
  89. ;    LB    64_bit floting ACC_B.        B_Acc extention.
  90. ;    BREG    64_bit floting ACC_B.        B_Acc.
  91. ;    BEXP    64_bit floting ACC_B.        expornemt.
  92. ;    BSIGN    64_bit floting ACC_B.        sign_flag.
  93. ;    
  94. ;    TEN1    64_bit floting constant.    10.0
  95. ;    ONE    64_bit floting constant.     1.0
  96. ;    TENM1    64_bit floting constant.     0.1
  97. ;    NUM0    64_bit floting constant.     0.0
  98. ;
  99. ;
  100. ;
  101. ;
  102.  
  103.     FUNCTION    fp64
  104.     call    arghak
  105.     push    b
  106.  
  107.     lda    arg1
  108.     cpi    255
  109.     jz    FPTST1
  110.     cpi    254
  111.     jz    FPTST2
  112.  
  113.     lhld    arg1
  114.     dad    h
  115.     lxi    b,JMPTBL
  116.     dad    b
  117.     mov    a,m
  118.     inx    h
  119.     mov    h,m
  120.     mov    l,a
  121.     push    h
  122.     popix
  123.  
  124.     lhld    arg3
  125.     xchg
  126.     lhld    arg2        ; de = arg3. hl = arg2.
  127.  
  128.     pcix
  129.  
  130. JMPTBL:    dw    FPGETK
  131.     dw    FPADD        ; no.1
  132.     dw    FPSUB
  133.     dw    FPMUL
  134.     dw    FPDIV
  135.     dw    FPCMP
  136.     dw    FPNEG
  137.     dw    FPSFT
  138.     dw    FPHALF
  139.     dw    FPDBL
  140.     dw    FPCNV        ; no.10
  141.     dw    FPIN
  142.     dw    SQRT
  143.     dw    SIN
  144.     dw    ATAN2
  145.     dw    EXPP
  146.     dw    LOG
  147.     dw    exitp        ;jmp17
  148.     dw    exitp        ;jmp18
  149.     dw    exitp        ;jmp19
  150.     dw    exitp        ;jmp20
  151.     dw    LLADD
  152.     dw    LLSUB
  153.     dw    LLMUL
  154.     dw    LLDIV
  155.     dw    LLCMP
  156.     dw    LLNEG
  157.     dw    LLMOV
  158.     dw    LLSFTL
  159.     dw    LLSFTR
  160.     dw    ATOLL
  161.     dw    LLTOA
  162.     dw    LLTEN
  163.  
  164. exitp:    lhld    arg4
  165.     xchg
  166.     call    pack
  167.     lxi    h,OVF
  168.     xra    a
  169.     ora    m
  170.     inx    h
  171.     ora    m
  172.     inx    h
  173.     ora    m
  174.     inx    h
  175.     ora    m
  176.     mov    l,a
  177.     mvi    h,0
  178.     pop    b
  179.     ret
  180. ;
  181. ;
  182. ;
  183. FPADD:    push    h
  184.     lxi    h,BREG
  185.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  186.     pop    d
  187.     lxi    h,AREG
  188.     call    unpack        ; (arg2) --> Acc. (Unpack).
  189.     call    FPADD0
  190.     jmp    exitp
  191. ;
  192. ;
  193. FPSUB:    push    h
  194.     lxi    h,BREG
  195.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  196.     pop    d
  197.     lxi    h,AREG
  198.     call    unpack        ; (arg2) --> Acc. (Unpack).
  199.     call    FPSUB0
  200.     jmp    exitp
  201. ;
  202. ;
  203. FPMUL:    push    h
  204.     lxi    h,BREG
  205.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  206.     pop    d
  207.     lxi    h,AREG
  208.     call    unpack        ; (arg2) --> Acc. (Unpack).
  209.     call    FPMUL0
  210.     jmp    exitp
  211. ;
  212. ;
  213. FPDIV:    push    h
  214.     lxi    h,BREG
  215.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  216.     pop    d
  217.     lxi    h,AREG
  218.     call    unpack        ; (arg2) --> Acc. (Unpack).
  219.     call    FPDIV0
  220.     jmp    exitp
  221. ;
  222. ;
  223. FPCMP:    lxi    b,NBYTES-1
  224.     dad    b
  225.     xchg
  226.     dad    b
  227.     ldax    d
  228.     ora    a
  229.     jp    fpcmp1
  230.     mov    a,m
  231.     ora    a
  232.     xchg
  233.     jm    fpcmp2
  234.     lxi    h,-1
  235.     pop    b
  236.     ret
  237.  
  238. fpcmp1:    mov    a,m
  239.     ora    a
  240.     jp    fpcmp2
  241.     lxi    h,1
  242.     pop    b
  243.     ret
  244.  
  245. fpcmp2:    call    icmp64
  246.     lxi    h,0
  247.     pop    b
  248.     rz
  249.     lxi    h,-1
  250.     rc
  251.     lxi    h,1
  252.     ret
  253. ;
  254. ;
  255. FPNEG:    lhld    arg2
  256.     xchg
  257.     lhld    arg4
  258.     xchg
  259.     lxi    b,NBYTES
  260.     ldir
  261.     lhld    arg4
  262.     lxi    b,nbytes-1
  263.     dad    b
  264.     mvi    a,080h
  265.     xra    m
  266.     mov    m,a
  267.     pop    b
  268.     ret
  269. ;
  270. ;
  271. FPCNV:    xchg
  272.     lxi    h,AREG
  273.     call    unpack        ; (arg2) --> Acc. (Unpack).
  274.     jmp    FPCONV
  275. ;
  276. ;
  277. LLADD:    xchg
  278.     lhld    arg4
  279.     push    h
  280.     xchg
  281.     lxi    b,NBYTES
  282.     ldir
  283.     pop    d
  284.     lhld    arg2
  285.     call    iadd64
  286.     pop    b
  287.     ret
  288.  
  289. LLSUB:    xchg
  290.     lhld    arg4
  291.     push    h
  292.     xchg
  293.     lxi    b,NBYTES
  294.     ldir
  295.     pop    d
  296.     lhld    arg3
  297.     call    isub64
  298.     pop    b
  299.     ret
  300.  
  301. LLMUL:    lxi    d,la
  302.     lxi    b,nbytes
  303.     ldir
  304.     lhld    arg3
  305.     call    imul64
  306.     lhld    arg4
  307.     xchg
  308.     lxi    h,la
  309.     lxi    b,nbytes
  310.     ldir
  311.     pop    b
  312.     ret
  313.  
  314. LLDIV:    lxi    d,la
  315.     lxi    b,nbytes
  316.     ldir
  317.     lhld    arg3
  318.     call    idiv64
  319.     lhld    arg4
  320.     xchg
  321.     lxi    h,la
  322.     lxi    b,nbytes
  323.     ldir
  324.     pop    b
  325.     ret
  326.  
  327. LLCMP:    lxi    b,NBYTES-1
  328.     dad    b
  329.     xchg
  330.     lhld    arg3
  331.     dad    b
  332.     ora    a
  333.     xchg
  334.     lhld    arg3
  335.     call    icmp64
  336.     lxi    h,0
  337.     pop    b
  338.     rz
  339.     lxi    h,-1
  340.     rc
  341.     lxi    h,1
  342.     ret
  343.  
  344. LLNEG:    call    ineg64
  345.     pop    b
  346.     ret
  347.  
  348. LLTEN:    call    itenth
  349.     pop    b
  350.     ret
  351.  
  352. LLMOV:    xchg
  353.     lhld    arg4
  354.     xchg
  355.     lxi    b,nbytes
  356.     ldir
  357.     pop    b
  358.     ret
  359.  
  360. LLSFTL:    lda    arg4
  361.     rar
  362.     call    sftl64
  363.     jmp    sftext
  364.  
  365. LLSFTR:    lxi    d,nbytes-1
  366.     dad    d
  367.     lda    arg3
  368.     rar
  369.     call    sftr64
  370.     pop    b
  371. sftext:    lxi    h,0
  372.     rnc
  373.     lxi    h,080h
  374.     ret
  375.  
  376. ATOLL:    mvi    a,' '
  377.     sta    asign
  378.     lxi    h,0
  379.     shld    la
  380.     shld    la+2
  381.     shld    la+4
  382.     shld    la+6
  383.     lhld    arg2
  384. encod1:    mov    a,m
  385.     call    isdigit
  386.     jnc    encod3
  387.     cpi    ' '
  388.     jz    encod2
  389.     cpi    '+'
  390.     jz    encoda
  391.     cpi    '-'
  392.     jnz    encod8
  393.     mvi    a,'-'
  394.     sta    asign
  395. encoda:    inx    h
  396.     jmp    encod3
  397. encod2:    inx    h
  398.     jmp    encod1
  399.  
  400. encod3:    mvi    b,18
  401. encod7:    mov    a,m
  402.     call    isdigit
  403.     jnc    encod9
  404.     cpi    ','
  405.     jnz    encod8
  406.     inx    h
  407.     jmp    encod7
  408. encod9:    push    b
  409.     push    h
  410.     push    psw
  411.     lxi    h,la
  412.     call    itenth
  413.     pop    psw
  414.     ani    0fh
  415.     lxi    h,la
  416.     add    m
  417.     mov    m,a
  418.     jnc    encod5
  419.     mvi    b,nbytes-1
  420. encod4:    inx    h
  421.     mvi    a,0
  422.     adc    m
  423.     mov    m,a
  424.     jnc    encod5
  425.     dcr    b
  426.     jnz    encod4
  427. encod5:    pop    h
  428.     pop    b
  429.     inx    h
  430.     dcr    b
  431.     jnz    encod7
  432.  
  433. encod8:    lda    asign
  434.     cpi    '-'
  435.     lxi    h,la
  436.     cz    ineg64
  437.     lhld    arg4
  438.     xchg
  439.     lxi    h,la
  440.     lxi    b,nbytes
  441.     ldir
  442.     pop    b
  443.     ret
  444.  
  445. LLTOA:    lxi    d,la
  446.     lxi    b,nbytes
  447.     ldir
  448.     lxi    h,outbuf
  449.     lxi    d,outbuf+1
  450.     lxi    b,18
  451.     mvi    m,' '
  452.     ldir
  453.     lxi    h,outbuf+19
  454.     mvi    m,0
  455.     lhld    la
  456.     mov    a,h
  457.     ora    l
  458.     jnz    decode
  459.     lhld    la+2
  460.     mov    a,h
  461.     ora    l
  462.     jnz    decode
  463.     lhld    la+4
  464.     mov    a,h
  465.     ora    l
  466.     jnz    decode
  467.     lhld    la+6
  468.     mov    a,h
  469.     ora    l
  470.     jnz    decode
  471.     lxi    h,outbuf+18
  472.     mvi    m,'0'
  473.     lxi    h,outbuf
  474.     pop    b
  475.     ret
  476.  
  477. decode:    lda    la+nbytes-1
  478.     ani    080h    
  479.     mvi    a,' '
  480.     jz    decod1
  481.     lxi    h,la
  482.     call    ineg64
  483.     mvi    a,'-'
  484. decod1:    sta    outsgn
  485.     lxi    h,outbuf+18
  486.     mvi    m,'0'
  487. decod3:    push    h
  488.     lxi    h,ten
  489.     call    idiv64
  490.     pop    h
  491.     jc    decod4
  492.     lda    la+nbytes
  493.     adi    '0'
  494.     mov    m,a
  495.     dcx    h
  496.     mov    a,m
  497.     ana    a
  498.     jnz    decod3
  499. decod4:    lda    outsgn
  500.     mov    m,a
  501.     lxi    h,outbuf
  502.     pop    b
  503.     ret
  504.  
  505. FPHALF:    xchg
  506.     lhld    arg4
  507.     xchg
  508.     lxi    b,nbytes
  509.     ldir
  510.     lhld    arg4
  511.     lxi    d,nbytes-2
  512.     dad    d
  513.     mov    a,m
  514.     sui    010h
  515.     mov    m,a
  516.     jnc    fphlf1
  517.     inx    h
  518.     dcr    m
  519. fphlf1:    pop    b
  520.     ret
  521.  
  522. FPDBL:    xchg
  523.     lhld    arg4
  524.     xchg
  525.     lxi    b,nbytes
  526.     ldir
  527.     lhld    arg4
  528.     lxi    d,nbytes-2
  529.     dad    d
  530.     mov    a,m
  531.     adi    010h
  532.     mov    m,a
  533.     jnc    fpdbl1
  534.     inx    h
  535.     inr    m
  536. fpdbl1:    pop    b
  537.     ret
  538.  
  539. FPSFT:    xchg
  540.     lhld    arg4
  541.     xchg
  542.     lxi    b,nbytes
  543.     ldir
  544.     lhld    arg3
  545.     mov    a,h
  546.     ora    l
  547.     jz    fpsft5
  548.     dad    h
  549.     dad    h
  550.     dad    h
  551.     dad    h
  552.     xchg
  553.     lhld    arg4
  554.     lxi    b,nbytes-1
  555.     dad    b
  556.     push    h
  557.     mov    a,m
  558.     dcx    h
  559.     mov    l,m
  560.     mov    h,a
  561.     ani    080h
  562.     dadc    d
  563.     jpo    fpsft4        ; parity=odd --> no overflow.
  564.     lxi    h,0
  565.     jnc    fpsft3
  566.     lxi    h,07fffh
  567. fpsft3:    ora    h
  568.     mov    h,a
  569. fpsft4:    xchg
  570.     pop    h
  571.     mov    m,d
  572.     dcx    h
  573.     mov    m,e
  574. fpsft5:    pop    b
  575.     ret
  576. ;
  577. ;--------------------------------------------------------------
  578. ; FLOATING POINT DIVIDE ------ Acc = Acc / Bcc.
  579. ;--------------------------------------------------------------
  580.  
  581. FPDIV0:    lxi    h,0
  582.     shld    OVF
  583.     shld    ZERO
  584.     lhld    BEXP
  585.     mov    a,h
  586.     ora    l
  587.     jz    ovrfw
  588.     lhld    AEXP
  589.     mov    a,h
  590.     ora    l
  591.     jz    setzero
  592.     ;
  593. fdiv1:    lxi    h,0
  594.     shld    LA
  595.     shld    LA+2
  596.     shld    LA+4
  597.     shld    LA+6
  598.     lxi    h,LA+NBYTES+NBYTES-1
  599.     xra    a
  600.     call    dshftr
  601.     lxi    h,BREG+NBYTES-1
  602.     xra    a
  603.     call    sftr64
  604.     lhld    BEXP
  605.     inx    h
  606.     shld    BEXP
  607.     mvi    b,NBYTES*8
  608. fdiv2:    lxi    d,AREG+NBYTES-1
  609.     lxi    h,BREG+NBYTES-1
  610.     call    icmp64        ; comp  Acc - Bcc.
  611.     jc    fdiv3        ; if Acc < Bcc then fdiv3.
  612.     lxi    d,AREG
  613.     lxi    h,BREG
  614.     call    isub64        ; Acc = Acc - Bcc.
  615.     xra    a
  616. fdiv3:    cmc
  617.     lxi    h,LA
  618.     call    dshftl
  619.     dcr    b
  620.     jnz    fdiv2
  621.  
  622.     lxi    h,LA
  623.     lxi    d,AREG
  624.     lxi    b,NBYTES
  625.     ldir
  626.     lhld    AEXP
  627.     lxi    d,BIASEXP+2
  628.     dad    d
  629.     xchg
  630.     lhld    BEXP
  631.     xchg
  632.     jmp    expnrm
  633.  
  634.  
  635.  
  636. ;
  637. ;--------------------------------------------------------------
  638. ; FLOATING POINT MULTIPLY ------ Acc = Acc * Bcc.
  639. ;--------------------------------------------------------------
  640. ;
  641. FPMUL0:    lxi    h,0
  642.     shld    OVF
  643.     shld    ZERO
  644.     lhld    BEXP
  645.     mov    a,h
  646.     ora    l
  647.     jz    setzero
  648.     lhld    AEXP
  649.     mov    a,h
  650.     ora    l
  651.     jz    setzero
  652.     ;
  653. fmul3:    lhld    AREG
  654.     shld    LA
  655.     lhld    AREG+2
  656.     shld    LA+2
  657.     lhld    AREG+4
  658.     shld    LA+4
  659.     lhld    AREG+6
  660.     shld    LA+6
  661.     lxi    h,BREG
  662.     call    imul64
  663.  
  664.     lhld    AEXP
  665.     xchg
  666.     lhld    BEXP
  667.     dad    d
  668.     lxi    d,BIASEXP
  669.  
  670. expnrm:    ora    a
  671.     dsbc    d
  672.     shld    AEXP
  673.     jc    undrfw
  674.     mov    a,h
  675.     cpi    BIASEXP/128
  676.     jnc    ovrfw
  677.     lda    ASIGN
  678.     lxi    h,BSIGN
  679.     xra    m
  680.     sta    ASIGN
  681.     jmp    fpnorm
  682.  
  683. ;
  684. ;--------------------------------------------------------------
  685. ; FLOATING POINT ADDITION  Acc = Acc + Bcc.
  686. ; FLOATING POINT SUBTRACT  Acc = Acc - Bcc.
  687. ;--------------------------------------------------------------
  688. ;
  689.  
  690. FPSUB0:    lda    BSIGN
  691.     xri    080h
  692.     sta    BSIGN
  693. ;
  694. FPADD0:    lxi    h,0
  695.     shld    OVF
  696.     shld    ZERO
  697.     lhld    AEXP
  698.     mov    a,h
  699.     ora    l
  700.     xchg
  701.     jnz    fadd1
  702.     lxi    h,BREG
  703.     lxi    d,AREG
  704.     lxi    b,NBYTES+3
  705.     ldir
  706.     jmp    fpnorm
  707. fadd1:    lhld    BEXP
  708.     mov    a,h
  709.     ora    l
  710.     jz    fpnorm
  711.     xchg
  712.     dsbc    d
  713.     jz    fadd4
  714.     jnc    fadd2
  715.  
  716.     lda    ASIGN        ; Acc_flag <--> Bcc_flag.
  717.     mov    c,a
  718.     lda    BSIGN
  719.     sta    ASIGN
  720.     mov    a,c
  721.     sta    BSIGN
  722.     call    swap64
  723.     lhld    AEXP
  724.     xchg
  725.     lhld    BEXP
  726.     shld    AEXP
  727.     xchg
  728.     shld    BEXP
  729.  
  730.     xchg
  731.     ora    a
  732.     dsbc    d
  733. fadd2:    mov    a,h
  734.     ora    a
  735.     jnz    fpnorm
  736.     mov    a,l
  737.     cpi    NBYTES*8-1
  738.     jnc    fpnorm
  739.     mov    b,a
  740.     lhld    BEXP
  741.     xchg
  742. fadd3:    xra    a
  743.     lxi    h,BREG+NBYTES-1
  744.     call    sftr64
  745.     inx    d
  746.     dcr    b
  747.     jnz    fadd3
  748. fadd4:    xchg
  749.     shld    BEXP
  750.     lda    ASIGN
  751.     lxi    h,BSIGN
  752.     xra    m
  753.     jnz    fadd5
  754. ;
  755. ;  if same sign.
  756. ;
  757.     lxi    d,AREG
  758.     lxi    h,BREG
  759.     call    iadd64        ; (Acc) = (Acc) + (Bcc).
  760.     jnc    fpnorm
  761.     lxi    h,AREG+NBYTES-1    ; if carry_flag set then,
  762.     call    sftr64        ;  shift right
  763.     lhld    AEXP
  764.     inx    h
  765.     shld    AEXP        ;  & exp = exp + 1.
  766.     jmp    fpnorm
  767. ;
  768. ;  if different sign.
  769. ;
  770. fadd5:    lxi    d,AREG
  771.     lxi    h,BREG
  772.     call    isub64        ; Acc = Acc - Bcc.
  773.     jnc    fpnorm
  774.     lxi    h,AREG
  775.     call    ineg64        ; negate Acc.
  776.     lda    BSIGN
  777.     sta    ASIGN        ; Asign = Bsign.
  778.     call    fpnorm
  779.     ret
  780. ;
  781. ;--------------------------------------------------------------
  782. ; UNPACK (DE) -> (HL).
  783. ;--------------------------------------------------------------
  784. ;
  785.  
  786. UNPACK:    xra    a
  787.     mov    m,a
  788.     inx    h
  789.     push    h
  790.     xchg
  791.     lxi    b,NBYTES
  792.     ldir
  793.     pop    h
  794.     xra    a
  795.     rld        ; 1
  796.     inx    h
  797.     rld        ; 2
  798.     inx    h
  799.     rld        ; 3
  800.     inx    h
  801.     rld        ; 4
  802.     inx    h
  803.     rld        ; 5
  804.     inx    h
  805.     rld        ; 6
  806.     inx    h
  807.     rld        ; 7
  808.     inx    h
  809.     rld        ; 8
  810.     inx    h
  811.     mov    c,a
  812.     ani    BIASEXP/128-1
  813.     mov    m,a
  814.     mov    a,c
  815.     ani    08h
  816.     mvi    a,0
  817.     jz    unpck1
  818.     mvi    a,080h
  819. unpck1:    inx    h
  820.     mov    m,a
  821.     ret
  822.  
  823. ;
  824. ;--------------------------------------------------------------
  825. ; PACK SOURCE = A REG , DESTINATION = DE.
  826. ;--------------------------------------------------------------
  827. ;
  828.  
  829. PACK:    push    d
  830.     lxi    h,OVF
  831.     mov    a,m        ; OVF
  832.     inx    h
  833.     ora    m        ; UNF
  834.     inx    h
  835.     ora    m        ; ZERO
  836.     jnz    pack1
  837.  
  838.     lxi    h,AREG+1
  839.     mvi    b,NBYTES-2
  840.     call    inca
  841.  
  842. pack1:    lda    ASIGN
  843.     ora    a
  844.     mvi    c,0
  845.     jz    pack2
  846.     mvi    c,08h
  847. pack2:    lda    AEXP+1
  848.     ani    00000111b
  849.     ora    c
  850.     lxi    h,AEXP
  851.     rrd        ; 1
  852.     dcx    h
  853.     rrd        ; 2
  854.     dcx    h
  855.     rrd        ; 3
  856.     dcx    h
  857.     rrd        ; 4
  858.     dcx    h
  859.     rrd        ; 5
  860.     dcx    h
  861.     rrd        ; 6
  862.     dcx    h
  863.     rrd        ; 7
  864.     dcx    h
  865.     rrd        ; 8
  866.  
  867.     pop    d
  868.     lxi    b,NBYTES
  869.     ldir
  870.     RET
  871. ;
  872. ;
  873. ; INCREMENT A AND CORRECT FORM.
  874. ;
  875. inca:    mov    a,m
  876.     adi    08h
  877.     mov    m,a
  878.     rnc
  879. inca1:    inx    h
  880.     inr    m
  881.     rnz
  882.     dcr    b
  883.     jnz    inca1
  884.     ;
  885.     stc
  886.     call    sftr64
  887.     lhld    AEXP
  888.     inx    h
  889.     shld    AEXP
  890.     mov    a,h
  891.     cpi    BIASEXP/128
  892.     rc
  893.     mvi    h,BIASEXP/128-1
  894.     shld    AEXP
  895.     mvi    a,08h
  896.     sta    OVF
  897.     ret
  898.  
  899. ;
  900. ;--------------------------------------------------------------
  901. ; FLOTING NUMBER OUTPUT CONVERTION.
  902. ;--------------------------------------------------------------
  903. ;
  904.  
  905. FPCONV:    lda    ASIGN
  906.     ora    a
  907.     mvi    a,' '
  908.     jz    conv1
  909.     mvi    a,'-'
  910. conv1:    sta    outsgn
  911.     lhld    AEXP
  912.     mov    a,h
  913.     ora    l
  914.     jz    conv9
  915.  
  916.     xra    a
  917.     sta    ASIGN
  918.     lxi    h,0
  919.     shld    EP        ; EP = 0;
  920. conv20:    lxi    h,256
  921.     shld    k2        ; k2 = 256;
  922.  
  923. conv2:    lxi    d,AREG+NBYTES+1
  924.     lxi    h,ONE +NBYTES+1
  925.     call    icmp80
  926.     jc    mconv        ; if (A < 1.0) then mconv.
  927.  
  928.     lxi    h,TEN256    ; T  = TEN256;
  929.     shld    T        ;
  930.  
  931. pconv1:    lxi    d,NBYTES+1
  932.     dad    d
  933.     lxi    d,AREG+NBYTES+1
  934.     call    icmp80
  935.     jc    pconv2        ; if (A < *T) then  pconv2
  936.  
  937.     lhld    T        ; A = A / *T;
  938.     lxi    d,BREG
  939.     lxi    b,NBYTES+3
  940.     ldir
  941.     call    FPDIV0;
  942.  
  943.     lhld    k2        ; EP = EP + k2;
  944.     xchg
  945.     lhld    EP
  946.     dad    d
  947.     shld    EP
  948.                 ;            }
  949. pconv2:
  950.     lhld    k2
  951.     srlr    h
  952.     rarr    l        ;        k2 = k2 / 2;
  953.     shld    k2
  954.     mov    a,h
  955.     ora    l
  956.     jz    conv3
  957.  
  958.     lhld    T
  959.     lxi    d,nbytes+3
  960.     dad    d
  961.     shld    T        ;        T = T + NBYTES+3;
  962.     jmp    pconv1        ;    }
  963.  
  964. ;
  965. ;
  966. ;
  967. mconv:    lxi    d,AREG+nbytes+1
  968.     lxi    h,TENM1+nbytes+1
  969.     call    icmp80
  970.     jnc    conv3        ; if (A >= 0.1) then conv3
  971.  
  972.     lxi    h,TENM128    ; T  = 10**(-128);
  973.     shld    T
  974.  
  975.     lxi    d,AREG+NBYTES+1
  976.     lxi    h,TENM256+NBYTES+1
  977.     call    icmp80
  978.     jnc    mconv1        ; if (A >= *T) then mconv2
  979.     lxi    h,TEN256
  980.     lxi    d,BREG
  981.     lxi    b,NBYTES+3
  982.     ldir
  983.     call    FPMUL0;
  984.     lxi    h,TEN256
  985.     lxi    d,BREG
  986.     lxi    b,NBYTES+3
  987.     ldir
  988.     call    FPMUL0;
  989.  
  990.     lxi    h,-512
  991.     shld    EP
  992.     jmp    conv20
  993.  
  994. mconv1:    lhld    T
  995.     lxi    d,nbytes+1
  996.     dad    d
  997.     lxi    d,AREG+NBYTES+1
  998.     call    icmp80
  999.     jc    mconv2        ; if (A < *T) then mconv2.
  1000.  
  1001.     lhld    k2
  1002.     srlr    h
  1003.     rarr    l        ;        k2 = k2 / 2;
  1004.     shld    k2
  1005.  
  1006.     lhld    T
  1007.     lxi    d,nbytes+3
  1008.     dad    d
  1009.     shld    T        ;        T = T + NBYTES+3;
  1010.     jmp    mconv1        ;    }
  1011.  
  1012.  
  1013. mconv2:    lhld    T        ;            A = A / *T;
  1014.     dcx    h
  1015.     lxi    d,BREG+NBYTES+2
  1016.     lxi    b,NBYTES+3
  1017.     lddr
  1018.     call    FPDIV0;
  1019.  
  1020.     lhld    k2        ;            EP = EP - k2;
  1021.     xchg
  1022.     lhld    EP
  1023.     ora    a
  1024.     dsbc    d
  1025.     shld    EP
  1026.     jmp    conv20
  1027.  
  1028.  
  1029. conv3:    lxi    d,AREG+NBYTES+1
  1030.     lxi    h,ONE +NBYTES+1
  1031.     call    icmp80
  1032.     jc    conv4        ; if (A < 1.0) then conv4.
  1033.     lxi    h,TEN1
  1034.     lxi    d,BREG
  1035.     lxi    b,NBYTES+3
  1036.     ldir
  1037.     call    FPDIV0
  1038.     lhld    EP
  1039.     inx    h
  1040.     shld    EP
  1041. conv4:    lxi    h,0h
  1042.     shld    AREG-1
  1043.     lhld    AEXP
  1044.     lxi    d,BIASEXP
  1045.     xchg
  1046.     ora    a
  1047.     dsbc    d
  1048.     jz    conv6
  1049.     mov    b,l
  1050. conv5:    lxi    h,AREG+NBYTES-1
  1051.     xra    a
  1052.     call    sftr72
  1053.     dcr    b
  1054.     jnz    conv5
  1055. conv6:    mvi    b,15
  1056.     lxi    h,outbuf+2
  1057. conv7:    call    tenth
  1058.     adi    '0'
  1059.     mov    m,a
  1060.     inx    h
  1061.     dcr    b
  1062.     jnz    conv7
  1063.  
  1064.     call    tenth
  1065.     cpi    5
  1066.     jc    conv8
  1067.  
  1068.     mvi    b,15
  1069. conv70:    dcx    h
  1070.     mov    a,m
  1071.     inr    a
  1072.     mov    m,a
  1073.     cpi    '9'+1
  1074.     jnz    conv8
  1075.     mvi    a,'0'
  1076.     mov    m,a
  1077.     dcr    b
  1078.     jnz    conv70
  1079.  
  1080.     mvi    a,'1'
  1081.     sta    outbuf+2
  1082.     lxi    h,outbuf+3
  1083.     lxi    d,outbuf+4
  1084.     lxi    b,14
  1085.     mvi    m,'0'
  1086.     ldir
  1087.     lhld    EP
  1088.     inx    h
  1089.     shld    EP
  1090.  
  1091. conv8:    mvi    a,0
  1092.     sta    outbuf+17
  1093.     mvi    a,'0'
  1094.     sta    outbuf
  1095.     mvi    a,'.'
  1096.     sta    outbuf+1
  1097.     lxi    h,EP
  1098.     pop    b
  1099.     ret
  1100.  
  1101. conv9:    lxi    h,outbuf+2
  1102.     lxi    d,outbuf+3
  1103.     lxi    b,15
  1104.     mvi    m,'0'
  1105.     ldir
  1106.     mvi    m,0
  1107.     jmp    conv8
  1108. ;
  1109. tenth:    push    h
  1110.     push    d
  1111.     push    b
  1112.      lxi    h,AREG-1
  1113.     lxi    d,BREG-1
  1114.     lxi    b,NBYTES+4
  1115.     LDIR
  1116.     stc
  1117.     lxi    h,AREG-1
  1118.     call    sftl72
  1119.     mvi    a,0
  1120.     ral
  1121.  
  1122.     lxi    h,AREG-1
  1123.     call    sftl72
  1124.     ral
  1125.  
  1126.     mov    c,a
  1127.     lxi    d,AREG-1
  1128.     lxi    h,BREG-1
  1129.     call    iadd72
  1130.     mvi    a,0
  1131.     adc    c
  1132.  
  1133.     lxi    h,AREG-1
  1134.     call    sftl72
  1135.     ral
  1136.     pop    b
  1137.     pop    d
  1138.     pop    h
  1139.     ret
  1140.  
  1141. ;
  1142. ;
  1143. ;
  1144. FPIN:    call    cleara
  1145.     lxi    h,0
  1146.     shld    EPX
  1147.     mvi    a,0
  1148.     sta    SIGNX
  1149.     sta    outsgn
  1150.     lhld    arg2
  1151.     xra    a        ; null terminator search.
  1152.      lxi    b,100
  1153.     ccir
  1154.     jnz    fpin15        ; if not found goto fpin15.
  1155.     xchg
  1156.     lhld    arg2
  1157.     xchg
  1158.     ora    a
  1159.     dsbc    d
  1160.     push    h        ; string length save.
  1161. ;
  1162.     mov    b,h
  1163.     mov    c,l
  1164.     lhld    arg2
  1165.     mvi    a,'E'
  1166.     ccir
  1167.     pop    b
  1168.     jz    fpin1
  1169. ;
  1170.     lhld    arg2
  1171.     mvi    a,'e'
  1172.     ccir
  1173.     jnz    fpin6
  1174. ;
  1175. ;
  1176. fpin1:    dcx    h
  1177.     mvi    m,0
  1178.     inx    h
  1179.     mov    a,m
  1180.     cpi    '-'
  1181.     jnz    fpin2
  1182.     sta    SIGNX
  1183.     jmp    fpin3
  1184. fpin2:    cpi    '+'
  1185.     jnz    fpin4
  1186. fpin3:    inx    h
  1187. fpin4:    call    ctoi
  1188.     jc    fpin5
  1189.     push    h
  1190.     lhld    EPX
  1191.     mov    d,h
  1192.     mov    e,l
  1193.     dad    h
  1194.     dad    h
  1195.     dad    d
  1196.     dad    h
  1197.     mov    e,a
  1198.     mvi    d,0
  1199.     dad    d
  1200.     shld    EPX
  1201.     pop    h
  1202.     jmp    fpin3
  1203.  
  1204. fpin5:    lda    SIGNX
  1205.     cpi    '-'
  1206.     jnz    fpin6
  1207.     lhld    EPX
  1208.     xchg
  1209.     lxi    h,0
  1210.     ora    a
  1211.     dsbc    d
  1212.     shld    EPX
  1213. ;
  1214. fpin6:    xra    a
  1215.     sta    SIGNX
  1216.     lhld    arg2
  1217.     mov    a,m
  1218.     cpi    '+'
  1219.     jz    fpin7
  1220.     cpi    '-'
  1221.     jnz    fpin8
  1222.     sta    outsgn
  1223. fpin7:    inx    h
  1224. fpin8:    mov    a,m
  1225.     cpi    '.'
  1226.     jz    fpin10        ; goto real part.
  1227.     cpi    '0'
  1228.     jnz    fpin11        ; goto integer part.
  1229.     jmp    fpin7
  1230. ;
  1231. fpin10:    inx    h
  1232.     mov    a,m
  1233.     cpi    '0'
  1234.     jnz    fpin13
  1235.     xchg            ; real part. ( 0.000...nn)
  1236.     lhld    EPX
  1237.     dcx    h
  1238.     shld    EPX
  1239.     xchg
  1240.     jmp    fpin10
  1241. ;
  1242. fpin11:    call    ctoi        ; integer part.
  1243.     jc    fpin12
  1244.     call    fpinx
  1245.     inx    h
  1246.     jmp    fpin11
  1247. ;
  1248. fpin12:    cpi    '.'
  1249.     jnz    fpin14
  1250.     inx    h
  1251. fpin13:    call    ctoi        ; real part. ( n.mmm)
  1252.     jc    fpin14
  1253.     call    fpinx
  1254.     xchg
  1255.     lhld    EPX
  1256.     dcx    h
  1257.     shld    EPX
  1258.     xchg
  1259.     inx    h
  1260.     jmp    fpin13
  1261. ;
  1262. fpin14:    lhld    EPX
  1263.     mov    a,h
  1264.     ora    a
  1265.     jz    fpin15
  1266.     lxi    h,AREG
  1267.     lxi    d,xx
  1268.     lxi    b,NBYTES+3
  1269.     ldir
  1270.     call    exp
  1271.     lxi    h,AREG
  1272.     lxi    d,BREG
  1273.     lxi    b,NBYTES+3
  1274.     ldir
  1275.     lxi    h,xx
  1276.     lxi    d,AREG
  1277.     lxi    b,NBYTES+3
  1278.     ldir
  1279. ;
  1280.     lda    SIGNX
  1281.     cpi    '-'
  1282.     jnz    fpin17
  1283.     call    FPDIV0
  1284.     jmp    fpin15
  1285. fpin17:    call    FPMUL0
  1286.  
  1287. fpin15:    lda    outsgn
  1288.     ora    a
  1289.     jz    fpin16
  1290.     mvi    a,080h
  1291.     sta    ASIGN
  1292. fpin16:    lhld    arg4
  1293.     xchg
  1294.     call    pack
  1295.     pop    b
  1296.     ret
  1297.  
  1298. ctoi:    mov    a,m
  1299.     call    isdigit
  1300.     rc
  1301.     sui    '0'
  1302.     ret
  1303.  
  1304. fpinx:    push    h
  1305.     push    psw
  1306.     lxi    h,TEN1
  1307.     lxi    d,BREG
  1308.     lxi    b,NBYTES+3
  1309.     ldir
  1310.     call    FPMUL0
  1311.     pop    psw
  1312.     mov    c,a
  1313.     add    a
  1314.     add    a
  1315.     add    c
  1316.     add    a
  1317.     add    c
  1318.     mov    c,a
  1319.     mvi    b,0
  1320.     lxi    h,NUM0
  1321.     dad    b
  1322.     lxi    d,BREG
  1323.     lxi    b,NBYTES+3
  1324.     ldir
  1325.     call    FPADD0
  1326.     pop    h
  1327.     ret
  1328. ;
  1329. exp:    lhld    EPX
  1330.     mov    a,h
  1331.     ora    a
  1332.     jp    exp0
  1333.     xchg
  1334.     lxi    h,0
  1335.     ora    a
  1336.     dsbc    d
  1337.     shld    EPX
  1338.     mvi    a,'-'
  1339.     sta    SIGNX
  1340. ;
  1341. exp0:    lxi    h,ONE
  1342.     lxi    d,AREG
  1343.     lxi    b,NBYTES+3
  1344.     ldir
  1345.     lhld    EPX
  1346.     mov    a,h
  1347.     ora    a
  1348.     jz    exp1
  1349.     lxi    h,TEN256
  1350.     lxi    d,AREG
  1351.     lxi    b,NBYTES+3
  1352.     ldir
  1353.     lhld    EPX
  1354. exp1:    mvi    c,128
  1355.     mvi    b,0
  1356. exp2:    mov    a,l
  1357.     ora    a
  1358.     rz
  1359.     sub    c
  1360.     jc    exp3
  1361.     mov    l,a
  1362.     push    b
  1363.     push    h
  1364.     mov    a,b
  1365.     add    a
  1366.     add    a
  1367.     add    b
  1368.     add    a
  1369.     add    b
  1370.     mov    c,a
  1371.     mvi    b,0
  1372.     lxi    h,TEN128
  1373.     dad    b
  1374.     lxi    d,BREG
  1375.     lxi    b,NBYTES+3
  1376.     ldir
  1377.     call    FPMUL0
  1378.     pop    h
  1379.     pop    b
  1380. exp3:    srlr    c
  1381.     inr    b
  1382.     jmp    exp2
  1383. ;
  1384. cleara:    push    h
  1385.     lxi    h,0
  1386.     shld    AREG
  1387.     shld    AREG+2
  1388.     shld    AREG+4
  1389.     shld    AREG+6
  1390.     shld    AREG+8
  1391.     shld    AREG+9
  1392.     pop    h
  1393.     ret
  1394.  
  1395. SIGNX    ds    1
  1396. EPX    ds    2
  1397. T    ds    2
  1398. numlen    ds    2
  1399. ;
  1400. ;
  1401. FPTST1:    lhld    arg2
  1402.     mov    d,h
  1403.     mov    e,l
  1404.     dad    h
  1405.     dad    h
  1406.     dad    d
  1407.     dad    h
  1408.     dad    d
  1409.     lxi    d,TEN256
  1410.     dad    d
  1411.     lxi    d,AREG
  1412.     lxi    b,NBYTES+3
  1413.     ldir
  1414.     jmp    FPCONV
  1415.  
  1416. FPGETK:    mov    d,h
  1417.     mov    e,l
  1418.     dad    h
  1419.     dad    h
  1420.     dad    d
  1421.     dad    h
  1422.     dad    d
  1423.     lxi    d,TEN256
  1424.     dad    d
  1425.     lxi    d,AREG
  1426.     lxi    b,NBYTES+3
  1427.     ldir
  1428.     jmp    fpin16
  1429.  
  1430.  
  1431. FPTST2:    lhld    arg2
  1432.     lxi    d,AREG
  1433.     lxi    b,NBYTES+3
  1434.     ldir
  1435.     jmp    FPCONV
  1436. ;
  1437. ;
  1438. ;
  1439. isdigit:cpi    '0'
  1440.     rc
  1441.     cpi    '9'+1
  1442.     cmc
  1443.     ret
  1444.  
  1445. imul64:    shld    tmp
  1446.     lxi    h,0
  1447.     shld    areg
  1448.     shld    areg+2    
  1449.     shld    areg+4
  1450.     shld    areg+6
  1451.     mvi    b,nbytes*8
  1452. loopml:    lxi    h,la+nbytes-1
  1453.     call    sftr64
  1454.     jnc    jumpml
  1455.     lhld    tmp
  1456.     lxi    d,areg
  1457.     ora    a
  1458.     call    iadd64
  1459. jumpml:    lxi    h,areg+nbytes-1
  1460.     call    sftr64
  1461. ;    djnz    loopml
  1462.     db    010h,0e5h
  1463.     call    sftr64
  1464.     ret
  1465. ;
  1466. ;
  1467. ;
  1468. idiv64:    shld    tmp
  1469.     lxi    h,0
  1470.     shld    areg
  1471.     shld    areg+2    
  1472.     shld    areg+4
  1473.     shld    areg+6
  1474.     mvi    b,nbytes*8
  1475.     lda    la+nbytes-1
  1476.     bit    7,a
  1477.     jnz    loopdv
  1478. dvchkk:
  1479. ;    djnz    dvchk
  1480.     db    010h,02h
  1481.     stc
  1482.     ret
  1483. dvchk:    lxi    h,la
  1484.     call    sftl64
  1485.     jp    dvchkk
  1486. loopdv:    lxi    h,la
  1487.     call    dshftl
  1488.     lhld    tmp
  1489.     lxi    d,areg
  1490.     ora    a
  1491.     call    isub64
  1492.     jnc    jumpdv
  1493.     lhld    tmp
  1494.     lxi    d,areg
  1495.     ora    a
  1496.     call    iadd64
  1497. jumpdv:    cmc    
  1498. ;    djnz    loopdv
  1499.     db    010h,0e0h
  1500.     lxi    h,la
  1501.     call    sftl64
  1502.     ana    a
  1503.     ret
  1504. ;
  1505. ;
  1506. ;
  1507. iadd88:    ldax    d
  1508.     add    m    ; 7
  1509.     stax    d
  1510.     inx    h
  1511.     inx    d
  1512. iadd80:    ldax    d
  1513.     adc    m    ; 8
  1514.     stax    d
  1515.     inx    h
  1516.     inx    d
  1517. iadd72:    ldax    d
  1518.     adc    m    ; 8
  1519.     stax    d
  1520.     inx    h
  1521.     inx    d
  1522. iadd64:    ldax    d
  1523.     adc    m    ; 1
  1524.     stax    d
  1525.     inx    h
  1526.     inx    d
  1527.     ldax    d
  1528.     adc    m    ; 2
  1529.     stax    d
  1530.     inx    h
  1531.     inx    d
  1532.     ldax    d
  1533.     adc    m    ; 3
  1534.     stax    d
  1535.     inx    h
  1536.     inx    d
  1537.     ldax    d
  1538.     adc    m    ; 4
  1539.     stax    d
  1540.     inx    h
  1541.     inx    d
  1542.     ldax    d
  1543.     adc    m    ; 5
  1544.     stax    d
  1545.     inx    h
  1546.     inx    d
  1547.     ldax    d
  1548.     adc    m    ; 6
  1549.     stax    d
  1550.     inx    h
  1551.     inx    d
  1552.     ldax    d
  1553.     adc    m    ; 7
  1554.     stax    d
  1555.     inx    h
  1556.     inx    d
  1557.     ldax    d
  1558.     adc    m    ; 8
  1559.     stax    d
  1560.     ret
  1561. ;
  1562. ;
  1563. ;
  1564. isub88:    ldax    d
  1565.     sub    m    ; 7
  1566.     stax    d
  1567.     inx    d
  1568.     inx    h
  1569. isub80:    ldax    d
  1570.     sbb    m    ; 8
  1571.     stax    d
  1572.     inx    d
  1573.     inx    h
  1574. isub72:    ldax    d
  1575.     sbb    m    ; 8
  1576.     stax    d
  1577.     inx    d
  1578.     inx    h
  1579. isub64:    ldax    d
  1580.     sbb    m    ; 1
  1581.     stax    d
  1582.     inx    d
  1583.     inx    h
  1584.     ldax    d
  1585.     sbb    m    ; 2
  1586.     stax    d
  1587.     inx    d
  1588.     inx    h
  1589.     ldax    d
  1590.     sbb    m    ; 3
  1591.     stax    d
  1592.     inx    d
  1593.     inx    h
  1594.     ldax    d
  1595.     sbb    m    ; 4
  1596.     stax    d
  1597.     inx    d
  1598.     inx    h
  1599.     ldax    d
  1600.     sbb    m    ; 5
  1601.     stax    d
  1602.     inx    d
  1603.     inx    h
  1604.     ldax    d
  1605.     sbb    m    ; 6
  1606.     stax    d
  1607.     inx    d
  1608.     inx    h
  1609.     ldax    d
  1610.     sbb    m    ; 7
  1611.     stax    d
  1612.     inx    d
  1613.     inx    h
  1614.     ldax    d
  1615.     sbb    m    ; 8
  1616.     stax    d
  1617.     ret
  1618. ;
  1619. ;
  1620. ;
  1621. icmp88:    ldax    d
  1622.     sub    m
  1623.     rnz
  1624.     dcx    d
  1625.     dcx    h
  1626. icmp80:    ldax    d
  1627.     sub    m
  1628.     rnz
  1629.     dcx    d
  1630.     dcx    h
  1631. icmp72:    ldax    d
  1632.     sub    m
  1633.     rnz
  1634.     dcx    d
  1635.     dcx    h
  1636. icmp64:    ldax    d
  1637.     sub    m    ;1
  1638.     rnz
  1639.     dcx    d
  1640.     dcx    h
  1641.     ldax    d
  1642.     sub    m    ;2
  1643.     rnz
  1644.     dcx    d
  1645.     dcx    h
  1646.     ldax    d
  1647.     sub    m    ;3
  1648.     rnz
  1649.     dcx    d
  1650.     dcx    h
  1651.     ldax    d
  1652.     sub    m    ;4
  1653.     rnz
  1654.     dcx    d
  1655.     dcx    h
  1656.     ldax    d
  1657.     sub    m    ;5
  1658.     rnz
  1659.     dcx    d
  1660.     dcx    h
  1661.     ldax    d
  1662.     sub    m    ;6
  1663.     rnz
  1664.     dcx    d
  1665.     dcx    h
  1666.     ldax    d
  1667.     sub    m    ;7
  1668.     rnz
  1669.     dcx    d
  1670.     dcx    h
  1671.     ldax    d
  1672.     sub    m    ;8
  1673.     ret
  1674. ;
  1675. ineg88:    mov    a,m        ; .1
  1676.     cma
  1677.     adi    1
  1678.     mov    m,a
  1679.     inx    h
  1680.     mov    a,m        ; .2
  1681.     cma
  1682.     aci    0
  1683.     mov    m,a
  1684.     inx    h
  1685.     mov    a,m        ; .3
  1686.     cma
  1687.     aci    0
  1688.     mov    m,a
  1689.     inx    h
  1690.     mov    a,m        ; .4
  1691.     cma
  1692.     aci    0
  1693.     mov    m,a
  1694.     inx    h
  1695.     jmp    ineg0
  1696. ineg64:    mov    a,m
  1697.     cma
  1698.     adi    1
  1699.     mov    m,a
  1700.     inx    h
  1701. ineg0:    mov    a,m        ; .
  1702.     cma
  1703.     aci    0
  1704.     mov    m,a
  1705.     inx    h
  1706.     mov    a,m        ; .
  1707.     cma
  1708.     aci    0
  1709.     mov    m,a
  1710.     inx    h
  1711.     mov    a,m        ; .
  1712.     cma
  1713.     aci    0
  1714.     mov    m,a
  1715.     inx    h
  1716.     mov    a,m        ; .
  1717.     cma
  1718.     aci    0
  1719.     mov    m,a
  1720.     inx    h
  1721.     mov    a,m        ; .
  1722.     cma
  1723.     aci    0
  1724.     mov    m,a
  1725.     inx    h
  1726.     mov    a,m        ; .
  1727.     cma
  1728.     aci    0
  1729.     mov    m,a
  1730.     inx    h
  1731.     mov    a,m        ; .
  1732.     cma
  1733.     aci    0
  1734.     mov    m,a
  1735.     ret
  1736. ;
  1737. ;
  1738. ;
  1739. dshftl:    ralr    m
  1740.     inx    h
  1741.     ralr    m
  1742.     inx    h
  1743.     ralr    m
  1744.     inx    h
  1745.     ralr    m
  1746.     inx    h
  1747.     ralr    m
  1748.     inx    h
  1749. sftl88    ralr    m
  1750.     inx    h
  1751. sftl80:    ralr    m
  1752.     inx    h
  1753. sftl72:    ralr    m
  1754.     inx    h
  1755. sftl64:    ralr    m
  1756.     inx    h
  1757.     ralr    m
  1758.     inx    h
  1759.     ralr    m
  1760.     inx    h
  1761.     ralr    m
  1762.     inx    h
  1763. sftl32:    ralr    m
  1764.     inx    h
  1765.     ralr    m
  1766.     inx    h
  1767.     ralr    m
  1768.     inx    h
  1769.     ralr    m
  1770.     ret
  1771. ;
  1772. ;
  1773. ;
  1774. dshftr:    rarr    m
  1775.     dcx    h
  1776.     rarr    m
  1777.     dcx    h
  1778.     rarr    m
  1779.     dcx    h
  1780.     rarr    m
  1781.     dcx    h
  1782. sftr96:    rarr    m
  1783.     dcx    h
  1784. sftr88:    rarr    m
  1785.     dcx    h
  1786. sftr80:    rarr    m
  1787.     dcx    h
  1788. sftr72:    rarr    m
  1789.     dcx    h
  1790. sftr64:    rarr    m
  1791.     dcx    h
  1792.     rarr    m
  1793.     dcx    h
  1794.     rarr    m
  1795.     dcx    h
  1796.     rarr    m
  1797.     dcx    h
  1798. sftr32:    rarr    m
  1799.     dcx    h
  1800.     rarr    m
  1801.     dcx    h
  1802.     rarr    m
  1803.     dcx    h
  1804.     rarr    m
  1805.     ret
  1806.  
  1807. itenth:    shld    lltmp
  1808.     lxi    d,llwork
  1809.     lxi    b,nbytes
  1810.     ldir
  1811.     xra    a
  1812.     lhld    lltmp
  1813.     call    sftl64
  1814.     ral
  1815.     ora    a
  1816.     lhld    lltmp
  1817.     call    sftl64
  1818.     ral
  1819.     mov    c,a
  1820.     lhld    lltmp
  1821.     lxi    d,llwork
  1822.     xchg
  1823.     call    iadd64
  1824.     mvi    a,0
  1825.     adc    c
  1826.     ora    a
  1827.     lhld    lltmp
  1828.     call    sftl64
  1829.     ral
  1830.     ret
  1831.  
  1832. swap72:    lhld    AEXP        ; Acc <--> Bcc.
  1833.     xchg
  1834.     lhld    BEXP
  1835.     shld    AEXP
  1836.     xchg
  1837.     shld    BEXP
  1838. swap64:    lhld    AREG        ; Acc <--> Bcc.
  1839.     xchg
  1840.     lhld    BREG
  1841.     shld    AREG
  1842.     xchg
  1843.     shld    BREG
  1844.     lhld    AREG+2        ; Acc <--> Bcc. byte_2,3
  1845.     xchg
  1846.     lhld    BREG+2
  1847.     shld    AREG+2
  1848.     xchg
  1849.     shld    BREG+2
  1850.     lhld    AREG+4        ; Acc <--> Bcc. byte_4,5
  1851.     xchg
  1852.     lhld    BREG+4
  1853.     shld    AREG+4
  1854.     xchg
  1855.     shld    BREG+4
  1856.     lhld    AREG+6        ; Acc <--> Bcc. byte 6,7
  1857.     xchg
  1858.     lhld    BREG+6
  1859.     shld    AREG+6
  1860.     xchg
  1861.     shld    BREG+6
  1862.     ret
  1863.  
  1864. ;
  1865. ;--------------------------------------------------------------
  1866. ; FLOATING POINT normalization.
  1867. ;--------------------------------------------------------------
  1868. ;
  1869. fpnorm:    lhld    AEXP
  1870.     xchg
  1871.     lxi    b,1
  1872. fpnrm1:    lda    AREG+NBYTES-1
  1873.     ral
  1874.     jc    fpnrm2
  1875.     lxi    h,la
  1876.     call    dshftl
  1877.     xchg
  1878.     dsbc    b
  1879.     xchg
  1880.     jnc    fpnrm1
  1881.     jmp    undrfw
  1882.  
  1883. fpnrm2:    xchg
  1884.     mov    a,h
  1885.     cpi    BIASEXP/128
  1886.     jnc    ovrfw
  1887.     shld    AEXP
  1888.     jmp    extnrm
  1889.  
  1890.  
  1891. ovrfw:    lxi    h,0ffffh
  1892.     shld    AREG
  1893.     shld    AREG+2
  1894.     shld    AREG+4
  1895.     shld    AREG+6
  1896.     mvi    h,BIASEXP/128-1
  1897.     shld    AEXP
  1898.     mvi    a,08h
  1899.     sta    OVF
  1900.     xra    a
  1901.     sta    ZERO
  1902.     jmp    extnrm
  1903.     ;
  1904.     ;
  1905. undrfw:    lxi    h,0
  1906.     shld    AREG
  1907.     shld    AREG+2
  1908.     shld    AREG+4
  1909.     shld    AREG+6
  1910.     shld    AEXP
  1911.     mvi    a,04h
  1912.     sta    UNF
  1913.     xra    a
  1914.     sta    ZERO
  1915. extnrm:    lda    ASIGN
  1916.     ora    a
  1917.     jz    extnm2
  1918.     mvi    a,1
  1919. extnm2:    sta    MINUS
  1920.     ret
  1921.     ;
  1922.     ;
  1923. setzero:
  1924.     lxi    h,0
  1925.     shld    AREG
  1926.     shld    AREG+2
  1927.     shld    AREG+4
  1928.     shld    AREG+6
  1929.     shld    AEXP
  1930.     shld    OVF
  1931.     mvi    a,020h
  1932.     sta    ZERO
  1933.     xra    a
  1934.     sta    ASIGN
  1935.     sta    MINUS
  1936.     ret
  1937.  
  1938. ;
  1939. ;
  1940. ;
  1941. SQRT:    xchg
  1942.     lxi    h,AREG
  1943.     call    unpack        ; (arg2) --> Acc. (Unpack).
  1944.     lxi    h,AREG
  1945.     lxi    d,yy
  1946.     lxi    b,NBYTES+3
  1947.     ldir
  1948.     lhld    AEXP
  1949.     lxi    d,BIASEXP+1
  1950.     ora    a
  1951.     dsbc    d        ; AEXP = AEXP - 0401H.
  1952.     srar    h
  1953.     rarr    l
  1954.     jc    sqrt1
  1955.     dad    d
  1956.     shld    AEXP
  1957.     ora    a
  1958.     lxi    h,AREG+NBYTES-1
  1959.     call    sftr64
  1960.     lxi    h,AREG
  1961.     lxi    d,BREG
  1962.     lxi    b,NBYTES+3
  1963.     ldir
  1964.     ora    a
  1965.     lxi    h,AREG+NBYTES-1
  1966.     call    sftr64
  1967.     ora    a
  1968.     lxi    h,AREG+NBYTES-1
  1969.     call    sftr64
  1970.     ora    a
  1971.     lxi    h,AREG+NBYTES-1
  1972.     call    sftr64
  1973.     lxi    d,AREG
  1974.     lxi    h,BREG
  1975.     call    iadd64
  1976.     lhld    AREG+NBYTES-1
  1977.     lxi    b,70h
  1978.     dad    b
  1979.     shld    AREG+NBYTES-1
  1980.     jmp    sqrt2
  1981. sqrt1:    inx    h
  1982.     dad    d
  1983.     shld    AEXP
  1984.     lxi    h,AREG+NBYTES-1
  1985.     ora    a
  1986.     call    sftr64
  1987.     lxi    h,AREG
  1988.     lxi    d,BREG
  1989.     lxi    b,NBYTES+3
  1990.     ldir
  1991.     lxi    h,BREG+NBYTES-1
  1992.     ora    a
  1993.     call    sftr64
  1994.     lxi    h,BREG+NBYTES-1
  1995.     ora    a
  1996.     call    sftr64
  1997.     lxi    h,BREG+NBYTES-1
  1998.     ora    a
  1999.     call    sftr64
  2000.     lxi    d,AREG
  2001.     lxi    h,BREG
  2002.     call    isub64
  2003.     lhld    AREG+NBYTES-1
  2004.     lxi    b,048h
  2005.     dad    b
  2006.     shld    AREG+NBYTES-1    
  2007. sqrt2:    mvi    b,5
  2008. sqrt3:    push    b
  2009.     lxi    h,AREG
  2010.     lxi    d,xx
  2011.     lxi    b,NBYTES+3
  2012.     ldir
  2013.     lxi    h,yy
  2014.     lxi    d,AREG
  2015.     lxi    b,NBYTES+3
  2016.     ldir
  2017.     lxi    h,xx
  2018.     lxi    d,BREG
  2019.     lxi    b,NBYTES+3
  2020.     ldir
  2021.     call    FPDIV0        ; fp64(FPDIV,yy,x,xx);
  2022.  
  2023.     lxi    h,xx
  2024.     lxi    d,BREG
  2025.     lxi    b,NBYTES+3
  2026.     ldir
  2027.     call    FPADD0        ; fp64(FPADD,x,xx,xx);
  2028.  
  2029.     lhld    AEXP
  2030.     dcx    h
  2031.     shld    AEXP        ; fp64(FPHLF,xx,0,x);
  2032.     pop    b
  2033.     dcr    b
  2034.     jnz    sqrt3
  2035.  
  2036.     lhld    arg4
  2037.     xchg
  2038.     call    pack
  2039.     pop    b
  2040.     ret
  2041. ;
  2042. ;
  2043. ;
  2044. SETCRD:    xchg            ; (hl) --> (de) encode.
  2045.     inx    h
  2046.     inx    h
  2047.     inx    h
  2048.     shld    vv3
  2049.     inx    h
  2050.     xchg
  2051.     lxi    b,NBYTES-1
  2052.     ldir
  2053.     xchg
  2054.     dcx    h
  2055.     shld    vvn
  2056.     mov    a,m
  2057.     ani    0fh
  2058.     mov    m,a
  2059.     xchg
  2060.     mov    a,m
  2061.     ani    080h
  2062.     sta    vvsign
  2063.     mov    a,m
  2064.     ani    07fh
  2065.     dcx    h
  2066.     mov    l,m
  2067.     mov    h,a
  2068.     xra    a
  2069.     dad    h
  2070.     ral
  2071.     dad    h
  2072.     ral
  2073.     dad    h
  2074.     ral
  2075.     dad    h
  2076.     ral
  2077.     mov    e,h
  2078.     mov    d,a
  2079.     lxi    h,BIASEXP+3
  2080.     dsbc    d
  2081.     jc    errstc
  2082.     lxi    h,BIASEXP
  2083.     dsbc    d
  2084.     jc    stcrd4
  2085.     mov    a,h
  2086.     ora    a
  2087.     jnz    errstc
  2088.     mov    a,l
  2089.     cpi    NBYTES*8
  2090.     jnc    errstc
  2091.     mov    b,a
  2092.     lda    vvsign
  2093.     ora    a
  2094.     jz    stcrd1
  2095.     lhld    vv3
  2096.     call    ineg64
  2097. stcrd1:    mov    a,b
  2098.     ora    a
  2099.     jz    stcrd3
  2100. stcrd2:    mov    a,c
  2101.     ral
  2102.     lhld    vvn
  2103.     call    sftr88
  2104.     dcr    b
  2105.     jnz    stcrd2
  2106.  
  2107. stcrd3:    lxi    h,ATN00
  2108.     shld    tw
  2109.     lxi    h,ATN29
  2110.     lxi    d,zz
  2111.     lxi    b,NBYTES+3
  2112.     ldir
  2113.     lxi    h,0
  2114.     shld    ii        ; set ii.(counter)
  2115.     xra    a
  2116.     ret
  2117.  
  2118. stcrd4:    xchg
  2119. stcrd5:    lhld    vv3
  2120.     ora    a
  2121.     call    sftl64
  2122.     inx    d
  2123.     mov    a,d
  2124.     ora    e
  2125.     jnz    stcrd5
  2126.     lda    vvsign
  2127.     ora    a
  2128.     jz    stcrd3
  2129.     lhld    vv3
  2130.     call    ineg64
  2131.     jmp    stcrd3
  2132. ;
  2133. errstc:    scf
  2134.     ret
  2135. ;
  2136. ;
  2137. crdpck:    xra    a
  2138.     sta    ASIGN
  2139.     shld    vv3
  2140.     lxi    b,NBYTES+2
  2141.     dad    b
  2142.     mvi    b,NBYTES*8
  2143.     lxi    d,BIASEXP+3
  2144.     mov    a,m
  2145.     ora    a
  2146.     jp    cdpck1
  2147.     mvi    a,080h
  2148.     sta    ASIGN
  2149.     lhld    vv3
  2150.     call    ineg88
  2151. cdpck1:    lhld    vv3
  2152.     ora    a
  2153.     call    sftl88
  2154.     jm    cdpck2
  2155.     dcx    d
  2156.     dcr    b
  2157.     jnz    cdpck1
  2158.     lxi    d,0
  2159. cdpck2:    xchg
  2160.     shld    AEXP
  2161.     lhld    vv3
  2162.     inx    h
  2163.     inx    h
  2164.     inx    h
  2165.     lxi    d,AREG
  2166.     lxi    b,NBYTES
  2167.     ldir
  2168.     ret
  2169. ;
  2170. ;    sin(t,x,y)
  2171. ;
  2172. ;
  2173. SIN:    lxi    h,xx
  2174.     lxi    d,xx+1
  2175.     lxi    b,NBYTES*3+9-1
  2176.     mvi    m,0
  2177.     ldir            ; yy = 0.0.
  2178.  
  2179.     lxi    h,KKK
  2180.     lxi    d,xx
  2181.     lxi    b,NBYTES+3
  2182.     ldir            ; xx = 1.0/K. (0.6...)
  2183.  
  2184.     lhld    arg2
  2185.     lxi    d,vv
  2186.     call    setcrd
  2187.  
  2188.     mvi    b,26
  2189. sin2:    push    b
  2190.     call    CRDSIN
  2191.     lda    ii
  2192.     inr    a
  2193.     sta    ii
  2194.     lhld    tw
  2195.     lxi    b,NBYTES+3
  2196.     dad    b
  2197.     shld    tw
  2198.     pop    b
  2199.     dcr    b
  2200.     jnz    sin2
  2201.  
  2202.     lxi    h,vv
  2203.     call    crdpck
  2204.     lxi    h,AREG
  2205.     lxi    d,vv
  2206.     lxi    b,NBYTES+3
  2207.     ldir
  2208.     lxi    h,xx
  2209.     call    crdpck
  2210.     lxi    h,AREG
  2211.     lxi    d,xx
  2212.     lxi    b,NBYTES+3
  2213.     ldir
  2214.     lxi    h,yy
  2215.     call    crdpck
  2216.     lxi    h,AREG
  2217.     lxi    d,yy
  2218.     lxi    b,NBYTES+3
  2219.     ldir
  2220.     lxi    h,vv
  2221.     lxi    d,BREG
  2222.     lxi    b,NBYTES+3
  2223.     ldir
  2224.     call    FPMUL0
  2225.     lxi    h,AREG
  2226.     lxi    d,BREG
  2227.     lxi    b,NBYTES+3
  2228.     ldir
  2229.     lxi    h,xx
  2230.     lxi    d,AREG
  2231.     lxi    b,NBYTES+3
  2232.     ldir
  2233.     call    FPSUB0
  2234.     lhld    arg3
  2235.     xchg
  2236.     call    pack
  2237.  
  2238.     lxi    h,vv
  2239.     lxi    d,AREG
  2240.     lxi    b,NBYTES+3
  2241.     ldir
  2242.     lxi    h,xx
  2243.     lxi    d,BREG
  2244.     lxi    b,NBYTES+3
  2245.     ldir
  2246.     call    FPMUL0
  2247.     lxi    h,yy
  2248.     lxi    d,BREG
  2249.     lxi    b,NBYTES+3
  2250.     ldir
  2251.     call    FPADD0
  2252.     lhld    arg4
  2253.     xchg
  2254.     call    pack
  2255.     pop    b
  2256.     ret
  2257. ;
  2258. ;
  2259. CRDSIN:    call    CORD16
  2260.     lda    vv+NBYTES+2
  2261.     ora    a
  2262.     jp    CORD17
  2263.     jmp    CORD18
  2264. ;
  2265. ;    atan(t,x,y)
  2266. ;    char *t,*x, *y;        ; atan(t)
  2267. ;    {
  2268. ATAN2:    lxi    h,xx
  2269.     lxi    d,xx+1
  2270.     lxi    b,NBYTES*3+9-1
  2271.     mvi    m,0
  2272.     ldir
  2273.  
  2274.     lxi    h,010h
  2275.     shld    xx+NBYTES+2    ; xx = 1.0
  2276.  
  2277.     lhld    arg2
  2278.     lxi    d,yy
  2279.     call    setcrd
  2280.  
  2281.     mvi    b,NBYTES*8
  2282. atan22:    push    b
  2283.     call    CRDATN
  2284.     lda    ii
  2285.     inr    a
  2286.     sta    ii
  2287.     cpi    30
  2288.     jc    atan3
  2289.     lxi    h,zz+NBYTES-2
  2290.     ora    a
  2291.     call    sftr32
  2292.     lxi    h,zz
  2293.     jmp    atan4
  2294. atan3:    lhld    tw
  2295.     lxi    b,NBYTES+3
  2296.     dad    b
  2297. atan4:    shld    tw
  2298.     pop    b
  2299.     dcr    b
  2300.     jnz    atan22
  2301.  
  2302.     lxi    h,xx
  2303.     call    crdpck
  2304.     lxi    h,KK
  2305.     lxi    d,BREG
  2306.     lxi    b,NBYTES+3
  2307.     ldir
  2308.     call    FPMUL0
  2309.     lhld    arg3
  2310.     xchg
  2311.     call    pack
  2312.  
  2313.     lxi    h,vv
  2314.     call    crdpck
  2315.     lhld    arg4
  2316.     xchg
  2317.     call    pack
  2318.     pop    b
  2319.     ret
  2320. ;
  2321. ;
  2322. CRDATN:    call    CORD16
  2323.     lda    yy+NBYTES+2
  2324.     ora    a
  2325.     jm    CORD17
  2326.     jmp    CORD18
  2327. ;
  2328. ;
  2329. ;
  2330. CORD16:    lxi    h,yy
  2331.     lxi    d,uu
  2332.     lxi    b,NBYTES+3
  2333.     ldir            ; fp64(FPSFT,y,-i,u);
  2334.     lda    ii
  2335.     mov    b,a
  2336.     ora    a
  2337.     jz    c162
  2338. c161:    lxi    h,uu+NBYTES+2
  2339.     mov    a,m
  2340.     ral
  2341.     call    sftr88
  2342.     dcr    b
  2343.     jnz    c161
  2344.  
  2345. c162:    lxi    h,xx
  2346.     lxi    d,ww
  2347.     lxi    b,NBYTES+3
  2348.     ldir            ; fp64(FPSFT,x,-i,w);
  2349.     lda    ii
  2350.     mov    b,a
  2351.     ora    a
  2352.     rz
  2353. c163:    lxi    h,ww+NBYTES+2
  2354.     mov    a,m
  2355.     ral
  2356.     call    sftr88
  2357.     dcr    b
  2358.     jnz    c163
  2359.     ret
  2360. ;
  2361. ;
  2362. CORD17:    lxi    d,xx
  2363.     lxi    h,uu
  2364.     ora    a
  2365.     call    isub88        ; xx = xx - uu.
  2366. ;
  2367.     lxi    d,yy
  2368.     lxi    h,ww
  2369.     ora    a
  2370.     call    iadd88        ; yy = yy + ww.
  2371. ;
  2372.     lxi    d,vv
  2373.     lhld    tw
  2374.     call    isub88        ; vv = vv - g[i].
  2375.     ret
  2376. ;
  2377. ;
  2378. CORD18:    lxi    d,xx
  2379.     lxi    h,uu
  2380.     ora    a
  2381.     call    iadd88        ; xx = xx + uu.
  2382. ;
  2383.     lxi    d,yy
  2384.     lxi    h,ww
  2385.     ora    a
  2386.     call    isub88        ; yy = yy - ww.
  2387. ;
  2388.     lxi    d,vv
  2389.     lhld    tw
  2390.     call    iadd88        ; vv = vv + g[i].
  2391.     ret
  2392. ;
  2393. ;
  2394. ;
  2395. LOG:    lxi    h,xx
  2396.     lxi    d,xx+1
  2397.     lxi    b,NBYTES*3+9-1
  2398.     mvi    m,0
  2399.     ldir
  2400.  
  2401.     lhld    arg2
  2402.     xchg
  2403.     lxi    h,AREG
  2404.     call    unpack
  2405.     lhld    AEXP
  2406.     push    h
  2407.     lxi    h,BIASEXP
  2408.     shld    AEXP
  2409.     lhld    arg4
  2410.     xchg
  2411.     call    pack
  2412.  
  2413.     mvi    a,0
  2414.     sta    ASIGN
  2415.     pop    h
  2416.     lxi    d,BIASEXP
  2417.     ora    a
  2418.     dsbc    d
  2419.     jnc    log14
  2420.     mvi    a,080h
  2421.     sta    ASIGN
  2422.     lxi    d,0
  2423.     xchg
  2424.     ora    a
  2425.     dsbc    d
  2426. log14:    mov    a,h
  2427.     lxi    d,BIASEXP+16
  2428.     mvi    b,16
  2429. log12:    ora    a
  2430.     jm    log11
  2431.     dcx    d
  2432.     slar    l
  2433.     ral
  2434.     dcr    b
  2435.     jnz    log12
  2436.  
  2437. log11:    mov    h,a
  2438.     shld    AREG+6
  2439.     xchg
  2440.     shld    AEXP
  2441.     lxi    h,0
  2442.     shld    AREG
  2443.     shld    AREG+2
  2444.     shld    AREG+4
  2445.     lxi    h,loge
  2446.     lxi    d,BREG
  2447.     lxi    b,NBYTES+3
  2448.     ldir
  2449.     call    FPDIV0
  2450.     lxi    h,AREG
  2451.     lxi    d,uu
  2452.     lxi    b,NBYTES+3
  2453.     ldir
  2454.  
  2455.     lhld    arg4
  2456.     lxi    d,xx
  2457.     call    setcrd
  2458.     lxi    h,1
  2459.     shld    ii
  2460.     lxi    h,LOG1
  2461.     shld    tw
  2462.  
  2463.     mvi    b,29
  2464. log2:    push    b
  2465. ;    call    check
  2466.     call    STLLOG
  2467.     lda    ii
  2468.     inr    a
  2469.     sta    ii
  2470.     lhld    tw
  2471.     lxi    b,NBYTES
  2472.     dad    b
  2473.     shld    tw
  2474.     pop    b
  2475.     dcr    b
  2476.     jnz    log2
  2477.  
  2478.     lxi    h,ww+3
  2479.     lxi    d,ww+4
  2480.     lxi    b,NBYTES-2
  2481.     mvi    m,0
  2482.     ldir
  2483.     mvi    a,010h
  2484.     sta    ww+NBYTES+2    ; xx = 1.0
  2485.     lxi    d,ww+3
  2486.     lxi    h,xx+3
  2487.     call    isub64
  2488.  
  2489.     lxi    d,yy+3
  2490.     lxi    h,ww+3
  2491.     call    isub64
  2492.  
  2493.     lxi    h,yy
  2494.     call    crdpck
  2495.     lxi    h,uu
  2496.     lxi    d,BREG
  2497.     lxi    b,NBYTES+3
  2498.     ldir
  2499.     call    FPADD0
  2500.     lhld    arg4
  2501.     xchg
  2502.     call    pack
  2503.     pop    b
  2504.     ret
  2505. ;
  2506. STLLOG:    lxi    h,xx+3
  2507.     lxi    d,ww+3
  2508.     lxi    b,NBYTES
  2509.     ldir            ; fp64(FPSFT,x,-i,w);
  2510.     lda    ii
  2511.     mov    b,a
  2512. slog1:    lxi    h,ww+NBYTES+2
  2513.     mov    a,m
  2514.     ral
  2515.     call    sftr64
  2516.     dcr    b
  2517.     jnz    slog1
  2518.  
  2519.     lxi    d,ww+3
  2520.     lxi    h,xx+3
  2521.     ora    a
  2522.     call    iadd64
  2523.     lda    ww+NBYTES+2    ; xx = 1.0
  2524.     cpi    010h
  2525.     rnc
  2526.     lxi    h,ww+3
  2527.     lxi    d,xx+3
  2528.     lxi    b,NBYTES
  2529.     ldir
  2530.  
  2531.     lxi    d,yy+3
  2532.     lhld    tw
  2533.     call    isub64
  2534.     ret
  2535. ;
  2536. ;
  2537. ;
  2538. INT:    lhld    AEXP
  2539.     lxi    d,BIASEXP
  2540.     ora    a
  2541.     dsbc    d
  2542.     mov    b,l
  2543.     lxi    h,0
  2544.     shld    AEXP
  2545. intg1:    lxi    h,AREG
  2546.     ora    a
  2547.     call    sftl80
  2548.     dcr    b
  2549.     jnz    intg1
  2550. intg2:    lhld    AEXP
  2551.     shld    xexp
  2552.     lxi    h,BIASEXP
  2553.     shld    AEXP
  2554.  
  2555.     xchg
  2556.     lda    AREG+NBYTES-1
  2557.     ral
  2558.     jc    intg5
  2559.     mvi    b,NBYTES*8
  2560. intg3:    dcx    d
  2561.     lxi    h,AREG
  2562.     ora    a
  2563.     call    sftl64
  2564.     jm    intg4
  2565.     dcr    b
  2566.     jnz    intg3
  2567.     lxi    d,0
  2568. intg4:    xchg
  2569.     shld    AEXP
  2570. intg5:    ora    a
  2571.     ret
  2572. ;
  2573. EXPP:    lxi    h,xx
  2574.     lxi    d,xx+1
  2575.     lxi    b,NBYTES*3+9-1
  2576.     mvi    m,0
  2577.     ldir
  2578.  
  2579.     mvi    a,010h
  2580.     sta    yy+NBYTES+2    ; yy = 1.0
  2581.  
  2582.     lxi    h,0
  2583.     shld    xexp
  2584.  
  2585.     lhld    arg2
  2586.     lxi    d,NBYTES-2
  2587.     dad    d
  2588.     mov    e,m
  2589.     inx    h
  2590.     mov    d,m
  2591.     lxi    h,03cf9h
  2592.     ora    a
  2593.     dsbc    d
  2594.     jnc    expp6
  2595.     lxi    h,040b8h
  2596.     ora    a
  2597.     dsbc    d
  2598.     jc    expp8
  2599.  
  2600.     lxi    h,0400dh
  2601.     ora    a
  2602.     dsbc    d
  2603.     jnc    expp1
  2604.  
  2605.     lhld    arg2
  2606.     xchg
  2607.     lxi    h,AREG
  2608.     call    unpack
  2609.     lxi    h,loge
  2610.     lxi    d,BREG
  2611.     lxi    b,NBYTES+3
  2612.     ldir
  2613.     call    FPMUL0
  2614.     call    INT
  2615.     lxi    h,loge
  2616.     lxi    d,BREG
  2617.     lxi    b,NBYTES+3
  2618.     ldir
  2619.     call    FPDIV0
  2620.     lhld    arg4
  2621.     xchg
  2622.     call    pack
  2623.     lhld    arg4
  2624.     jmp    expp11
  2625.  
  2626. expp1:    lhld    arg2
  2627. expp11:    lxi    d,xx
  2628.     call    setcrd
  2629.  
  2630.     lxi    h,1
  2631.     shld    ii
  2632.     lxi    h,LOG1
  2633.     shld    tw
  2634.  
  2635.     mvi    b,29
  2636. expp2:    push    b
  2637.     call    STLEXP
  2638.     lda    ii
  2639.     inr    a
  2640.     sta    ii
  2641.     lhld    tw
  2642.     lxi    b,NBYTES
  2643.     dad    b
  2644.     shld    tw
  2645.     pop    b
  2646.     dcr    b
  2647.     jnz    expp2
  2648.  
  2649.     lhld    xx+3
  2650.     xchg
  2651.     lhld    xx+5
  2652.  
  2653.     xchg
  2654.     dad    h
  2655.     xchg
  2656.     dadc    h
  2657.  
  2658.     mvi    b,29
  2659. expp3:    xchg
  2660.     dad    h
  2661.     xchg
  2662.     dadc    h
  2663.     exx
  2664.     cc    STLEXX
  2665.     exx
  2666.     lda    ii
  2667.     inr    a
  2668.     sta    ii
  2669.     dcr    b
  2670.     jnz    expp3
  2671.     
  2672. expp6:    lxi    h,yy
  2673.     call    crdpck
  2674. expp7:    lhld    xexp
  2675.     xchg
  2676.     lhld    AEXP
  2677.     dad    d
  2678.     shld    AEXP
  2679.     lhld    arg4
  2680.     xchg
  2681.     call    pack
  2682.     pop    b
  2683.     ret
  2684. expp8:    lxi    h,-1
  2685.     shld    AREG
  2686.     shld    AREG+2
  2687.     shld    AREG+4
  2688.     shld    AREG+6
  2689.     lxi    h,08000h
  2690.     shld    AEXP
  2691.     mvi    a,0
  2692.     sta    ASIGN
  2693.     jmp    expp7
  2694. ;
  2695. STLEXP:    lxi    h,xx+3
  2696.     lxi    d,ww+3
  2697.     lxi    b,NBYTES
  2698.     ldir            ; fp64(FPSFT,x,-i,w);
  2699.     lxi    d,ww+3
  2700.     lhld    tw
  2701.     call    isub64
  2702.     rc
  2703.  
  2704.     lxi    h,ww+3
  2705.     lxi    d,xx+3
  2706.     lxi    b,NBYTES
  2707.     ldir
  2708.  
  2709. STLEXX:    lxi    h,yy+3
  2710.     lxi    d,uu+3
  2711.     lxi    b,NBYTES
  2712.     ldir
  2713.     lda    ii
  2714.     mov    b,a
  2715. sexp1:    lxi    h,uu+NBYTES+2
  2716.     mov    a,m
  2717.     ral
  2718.     call    sftr64
  2719.     dcr    b
  2720.     jnz    sexp1
  2721.  
  2722.     lxi    d,yy+3
  2723.     lxi    h,uu+3
  2724.     call    iadd64
  2725.     ret
  2726. ;
  2727. ;
  2728. ten    db    10,0,0,0,0,0,0,0
  2729. lltmp    ds    2
  2730. llwork    ds    nbytes+3
  2731. ;
  2732.  
  2733. k2    ds    2
  2734. EP    ds    2
  2735. OUTSGN    ds    1
  2736. OUTBUF    ds    20
  2737.     ;
  2738. OVF    ds    1
  2739. UNF    ds    1
  2740. ZERO    ds    1
  2741. MINUS    ds    1
  2742. ;
  2743. ;
  2744. ii    ds    2
  2745. tw    ds    2
  2746. vv3    ds    2
  2747. vvn    ds    2
  2748. vvsign    ds    1
  2749. xexp    ds    2
  2750. xx    ds    nbytes+3
  2751. yy    ds    nbytes+3
  2752. vv    ds    nbytes+3
  2753. uu    ds    nbytes+3
  2754. ww    ds    nbytes+3
  2755. zz    ds    nbytes+3
  2756. ;
  2757. ;
  2758. LA    DS    NBYTES
  2759. AREG    DS    NBYTES
  2760. AEXP    DS    2
  2761. ASIGN    DS    1
  2762.     ;
  2763. LB:    DS    NBYTES
  2764. BREG:    DS    NBYTES
  2765. BEXP:    DS    2
  2766. BSIGN:    DS    1
  2767. ;
  2768. ;
  2769. ;
  2770. ten256:    db    08eh,0deh,0f9h,09dh,0fbh,0ebh,07eh,0aah
  2771.     dw    biasexp+353h
  2772.     db    000h
  2773. ten128:    db    0e0h,08ch,0e9h,080h,0c9h,047h,0bah,093h
  2774.     dw    biasexp+1aah
  2775.     db    000h
  2776. ten64:    db    0d5h,0a6h,0cfh,0ffh,049h,01fh,078h,0c2h
  2777.     dw    biasexp+0d5h
  2778.     db    000h
  2779. ten32:    db    09eh,0b5h,070h,02bh,0a8h,0adh,0c5h,09dh
  2780.     dw    biasexp+06bh
  2781.     db    000h
  2782. ten16:    db    000h,000h,000h,004h,0bfh,0c9h,01bh,08eh
  2783.     dw    biasexp+036h
  2784.     db    000h
  2785. ten8:    db    000h,000h,000h,000h,000h,020h,0bch,0beh
  2786.     dw    biasexp+01bh
  2787.     db    000h
  2788. ten4:    db    000h,000h,000h,000h,000h,000h,040h,09ch
  2789.     dw    biasexp+00eh
  2790.     db    000h
  2791. ten2:    db    000h,000h,000h,000h,000h,000h,000h,0c8h
  2792.     dw    biasexp+007h
  2793.     db    000h
  2794. ten1:    db    000h,000h,000h,000h,000h,000h,000h,0a0h
  2795.     dw    biasexp+004h
  2796.     db    000h
  2797. one:    db    000h,000h,000h,000h,000h,000h,000h,080h
  2798.     dw    biasexp+001h
  2799.     db    000h
  2800. ;
  2801. tenm256:
  2802.     db    03ah,019h,07ah,063h,025h,043h,031h,0c0h
  2803.     dw    biasexp-352h
  2804.     db    000h
  2805. tenm128:
  2806.     db    0a1h,0e4h,0bch,064h,07ch,046h,0d0h,0ddh
  2807.     dw    biasexp-1a9h
  2808.     db    000h
  2809. tenm64:    db    0a5h,0e9h,039h,0a5h,027h,0eah,07fh,0a8h
  2810.     dw    biasexp-0d4h
  2811.     db    000h
  2812. tenm32:    db    0bah,094h,039h,045h,0adh,01eh,0b1h,0cfh
  2813.     dw    biasexp-06ah
  2814.     db    000h
  2815. tenm16:    db    05bh,0e1h,04dh,0c4h,0beh,094h,095h,0e6h
  2816.     dw    biasexp-035h
  2817.     db    000h
  2818. tenm8:    db    0fdh,0ceh,061h,084h,011h,077h,0cch,0abh
  2819.     dw    biasexp-01ah
  2820.     db    000h
  2821. tenm4:    db    02ch,065h,019h,0e2h,058h,017h,0b7h,0d1h
  2822.     dw    biasexp-00dh
  2823.     db    000h
  2824. tenm2:    db    00ah,0d7h,0a3h,070h,03dh,00ah,0d7h,0a3h
  2825.     dw    biasexp-006h
  2826.     db    000h
  2827. tenm1:    db    0cdh,0cch,0cch,0cch,0cch,0cch,0cch,0cch
  2828.     dw    biasexp-003h
  2829.     db    000h
  2830. ;
  2831. ;
  2832. ;
  2833. num0:    db    000h,000h,000h,000h,000h,000h,000h,000h
  2834.     dw    000h
  2835.     db    000h
  2836. num1:    db    000h,000h,000h,000h,000h,000h,000h,080h
  2837.     dw    biasexp+001h
  2838.     db    000h
  2839. num2:    db    000h,000h,000h,000h,000h,000h,000h,080h
  2840.     dw    biasexp+002h
  2841.     db    000h
  2842. num3:    db    000h,000h,000h,000h,000h,000h,000h,0c0h
  2843.     dw    biasexp+002h
  2844.     db    000h
  2845. num4:    db    000h,000h,000h,000h,000h,000h,000h,080h
  2846.     dw    biasexp+003h
  2847.     db    000h
  2848. num5:    db    000h,000h,000h,000h,000h,000h,000h,0a0h
  2849.     dw    biasexp+003h
  2850.     db    000h
  2851. num6:    db    000h,000h,000h,000h,000h,000h,000h,0c0h
  2852.     dw    biasexp+003h
  2853.     db    000h
  2854. num7:    db    000h,000h,000h,000h,000h,000h,000h,0e0h
  2855.     dw    biasexp+003h
  2856.     db    000h
  2857. num8:    db    000h,000h,000h,000h,000h,000h,000h,080h
  2858.     dw    biasexp+004h
  2859.     db    000h
  2860. num9:    db    000h,000h,000h,000h,000h,000h,000h,090h
  2861.     dw    biasexp+004h
  2862.     db    000h
  2863. ;
  2864. ;
  2865. ;
  2866. pai:    db    035h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  2867.     dw    biasexp+002h
  2868.     db    000h
  2869. pai2:    db    035h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  2870.     dw    biasexp+003h
  2871.     db    000h
  2872. paid2:    db    035h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  2873.     dw    biasexp+001h
  2874.     db    000h
  2875. paid4:    db    035h,0c2h,068h,021h,0a2h,0dah,00fh,0c9h
  2876.     dw    biasexp+000h
  2877.     db    000h
  2878. ;
  2879. ;
  2880. pai180:    db    0aeh,0c8h,0e9h,094h,012h,035h,0fah,08eh
  2881.     dw    biasexp-005h
  2882.     db    000h
  2883. ee:    db    09bh,04ah,0bbh,0a2h,048h,054h,0f8h,0adh
  2884.     dw    biasexp+002h
  2885.     db    000h
  2886. log10:    db    0feh,08ah,01bh,0cdh,04bh,078h,09ah,0d4h
  2887.     dw    biasexp+002h
  2888.     db    000h
  2889. loge:    db    0bbh,0f0h,017h,05ch,029h,03bh,0aah,0b8h
  2890.     dw    biasexp+001h
  2891.     db    000h
  2892. ;
  2893. ;
  2894. ;
  2895. KK    DB    000H,05AH,05EH,043H,0A8H,0EDH,074H,09BH
  2896.     DW    BIASEXP+000H
  2897.     DB    000H
  2898. ;
  2899. ;
  2900. KKK    DB    05DH,067H,07FH,0A6H,0E5H,035H,084H,0DAH,04EH,0B7H,009H
  2901. ATN00:    DB    028H,05EH,04CH,023H,08CH,016H,022H,0AAH,0FDH,090H,00CH
  2902.     DB    022H,07FH,02BH,0DAH,0D3H,06EH,058H,0C1H,019H,06BH,007H
  2903.     DB    01EH,0B7H,055H,0ACH,01BH,090H,025H,0BFH,06EH,0EBH,003H
  2904.     DB    02FH,091H,065H,0DCH,0F6H,0C2H,0AAH,0A9H,05BH,0FDH,001H
  2905.     DB    028H,0CBH,036H,04EH,0EFH,067H,0B9H,0DDH,0AAH,0FFH,000H
  2906.     DB    0CFH,03BH,0A1H,092H,0D8H,0A5H,0EEH,056H,0F5H,07FH,000H
  2907.     DB    0E3H,0F9H,06EH,035H,0E5H,076H,0B7H,0AAH,0FEH,03FH,000H
  2908.     DB    0C4H,000H,02DH,097H,0BAH,0BBH,055H,0D5H,0FFH,01FH,000H
  2909.     DB    013H,0BBH,094H,0DBH,0DDH,0ADH,0AAH,0FAH,0FFH,00FH,000H
  2910.     DB    0A7H,05CH,0EAH,0EEH,06EH,055H,055H,0FFH,0FFH,007H,000H
  2911.     DB    053H,06EH,077H,077H,0ABH,0AAH,0EAH,0FFH,0FFH,003H,000H
  2912.     DB    0A9H,0BBH,0BBH,05BH,055H,055H,0FDH,0FFH,0FFH,001H,000H
  2913.     DB    0DEH,0DBH,0DDH,0AAH,0AAH,0AAH,0FFH,0FFH,0FFH,000H,000H
  2914.     DB    0EFH,0EEH,056H,055H,055H,0F5H,0FFH,0FFH,07FH,000H,000H
  2915.     DB    077H,0B7H,0AAH,0AAH,0AAH,0FEH,0FFH,0FFH,03FH,000H,000H
  2916.     DB    0BCH,055H,055H,055H,0D5H,0FFH,0FFH,0FFH,01FH,000H,000H
  2917.     DB    0AEH,0AAH,0AAH,0AAH,0FAH,0FFH,0FFH,0FFH,00FH,000H,000H
  2918.     DB    055H,055H,055H,055H,0FFH,0FFH,0FFH,0FFH,007H,000H,000H
  2919.     DB    0AAH,0AAH,0AAH,0EAH,0FFH,0FFH,0FFH,0FFH,003H,000H,000H
  2920.     DB    055H,055H,055H,0FDH,0FFH,0FFH,0FFH,0FFH,001H,000H,000H
  2921.     DB    0AAH,0AAH,0AAH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H
  2922.     DB    055H,055H,0F5H,0FFH,0FFH,0FFH,0FFH,07FH,000H,000H,000H
  2923.     DB    0AAH,0AAH,0FEH,0FFH,0FFH,0FFH,0FFH,03FH,000H,000H,000H
  2924.     DB    055H,0D5H,0FFH,0FFH,0FFH,0FFH,0FFH,01FH,000H,000H,000H
  2925.     DB    0AAH,0FAH,0FFH,0FFH,0FFH,0FFH,0FFH,00FH,000H,000H,000H
  2926.     DB    055H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,007H,000H,000H,000H
  2927.     DB    0EAH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,003H,000H,000H,000H
  2928.     DB    0FDH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,001H,000H,000H,000H
  2929.     DB    000H,000H,000H,000H,000H,000H,000H,001H,000H,000H,000H
  2930. ATN29:    DB    000H,000H,000H,000H,000H,000H,080H,000H,000H,000H,000H
  2931. ;
  2932. ;
  2933. LOG1:    DB    0FDH,012H,0E6H,02FH,0FBH,0C8H,07CH,006H
  2934.     DB    036H,044H,053H,0F3H,0F8H,0FEH,091H,003H
  2935.     DB    05FH,02EH,0AFH,0E2H,076H,070H,0E2H,001H
  2936.     DB    033H,015H,08BH,000H,086H,051H,0F8H,000H
  2937.     DB    001H,0CCH,0E0H,039H,06CH,00AH,07EH,000H
  2938.     DB    0C8H,007H,0F8H,061H,051H,081H,03FH,000H
  2939.     DB    089H,067H,010H,06BH,02AH,0E0H,01FH,000H
  2940.     DB    0E0H,085H,058H,051H,005H,0F8H,00FH,000H
  2941.     DB    03AH,0C4H,06AH,0AAH,000H,0FEH,007H,000H
  2942.     DB    022H,056H,051H,015H,080H,0FFH,003H,000H
  2943.     DB    0B1H,06AH,0AAH,002H,0E0H,0FFH,001H,000H
  2944.     DB    056H,051H,055H,000H,0F8H,0FFH,000H,000H
  2945.     DB    06BH,0AAH,00AH,000H,0FEH,07FH,000H,000H
  2946.     DB    051H,055H,001H,080H,0FFH,03FH,000H,000H
  2947.     DB    0AAH,02AH,000H,0E0H,0FFH,01FH,000H,000H
  2948.     DB    055H,005H,000H,0F8H,0FFH,00FH,000H,000H
  2949.     DB    0ABH,000H,000H,0FEH,0FFH,007H,000H,000H
  2950.     DB    015H,000H,080H,0FFH,0FFH,003H,000H,000H
  2951.     DB    003H,000H,0E0H,0FFH,0FFH,001H,000H,000H
  2952.     DB    000H,000H,0F8H,0FFH,0FFH,000H,000H,000H
  2953.     DB    000H,000H,0FEH,0FFH,07FH,000H,000H,000H
  2954.     DB    000H,080H,0FFH,0FFH,03FH,000H,000H,000H
  2955.     DB    000H,0E0H,0FFH,0FFH,01FH,000H,000H,000H
  2956.     DB    000H,0F8H,0FFH,0FFH,00FH,000H,000H,000H
  2957.     DB    000H,0FEH,0FFH,0FFH,007H,000H,000H,000H
  2958.     DB    080H,0FFH,0FFH,0FFH,003H,000H,000H,000H
  2959.     DB    0E0H,0FFH,0FFH,0FFH,001H,000H,000H,000H
  2960.     DB    0F8H,0FFH,0FFH,0FFH,000H,000H,000H,000H
  2961.     DB    000H,000H,000H,080H,000H,000H,000H,000H
  2962. ;
  2963.     DB    000H,000H,000H,040H,000H,000H,000H,000H
  2964.     DB    000H,000H,000H,020H,000H,000H,000H,000H
  2965.     DB    000H,000H,000H,010H,000H,000H,000H,000H
  2966. ;
  2967. ;
  2968. check2:    push    psw
  2969.     push    b
  2970.     push    d
  2971.     push    h
  2972.     mov    a,h
  2973.     call    outhex
  2974.     mov    a,l
  2975.     call    outhex
  2976.     mov    a,d
  2977.     call    outhex
  2978.     mov    a,e
  2979.     call    outhex
  2980.     mvi    a,':'
  2981.     call    outc
  2982.     jmp    check3
  2983.  
  2984. check:    push    psw
  2985.     push    b
  2986.     push    d
  2987.     push    h
  2988. check3:    lxi    h,xx
  2989.     call    hexout
  2990.     lxi    h,yy
  2991.     call    hexout
  2992.     lxi    h,ww
  2993.     call    hexout
  2994.     lxi    h,uu
  2995.     call    hexout
  2996.     mvi    a,0ah
  2997.     call    outc
  2998.     mvi    a,0dh
  2999.     call    outc
  3000.     pop    h
  3001.     pop    d
  3002.     pop    b
  3003.     pop    psw
  3004.     ret
  3005. ;
  3006. outc:    push    h
  3007.     push    d
  3008.     push    b
  3009.     push    psw
  3010.     mov    e,a
  3011.     mvi    c,2
  3012.     call    5
  3013.     pop    psw
  3014.     pop    b
  3015.     pop    d
  3016.     pop    h
  3017.     ret
  3018. ;
  3019. hexout:    lxi    d,NBYTES+2
  3020.     dad    d
  3021.     mov    a,m
  3022.     call    outhex
  3023.     dcx    h
  3024.     mov    a,m
  3025.     call    outhex
  3026.     dcx    h
  3027.     mov    a,m
  3028.     call    outhex
  3029.     dcx    h
  3030.     mov    a,m
  3031.     call    outhex
  3032.     dcx    h
  3033.     mov    a,m
  3034.     call    outhex
  3035.     dcx    h
  3036.     mov    a,m
  3037.     call    outhex
  3038.     dcx    h
  3039.     mov    a,m
  3040.     call    outhex
  3041.     dcx    h
  3042.     mov    a,m
  3043.     call    outhex
  3044.     dcx    h
  3045.     mov    a,m
  3046.     call    outhex
  3047.     dcx    h
  3048.     mov    a,m
  3049.     call    outhex
  3050.     dcx    h
  3051.     mov    a,m
  3052.     call    outhex
  3053.     mvi    a,' '
  3054.     call    outc
  3055.     ret
  3056. ;
  3057. outhex:    push    h
  3058.     push    d
  3059.     push    b
  3060.     mov    c,a
  3061.     rar
  3062.     rar
  3063.     rar
  3064.     rar
  3065.     call    outhx1
  3066.     mov    a,c
  3067.     call    outhx1
  3068.     pop    b
  3069.     pop    d
  3070.     pop    h
  3071.     ret
  3072. ;
  3073. outhx1:    ani    0fh
  3074.     adi    '0'
  3075.     cpi    '9'+1
  3076.     jc    outhx2
  3077.     adi    7
  3078. outhx2:    call    outc
  3079.     ret
  3080.     
  3081.     ENDFUNCTION
  3082.