Advertisement
Guest User

Untitled

a guest
Aug 12th, 2013
676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Not sure what to do about these numerics
  2. ;Constants
  3. PI       db 00h,80h,31h,41h,59h,26h,53h,58h,98h
  4. SQRTPI   db 00h,80h,17h,72h,45h,38h,50h,90h,55h
  5. EULER    db 00h,80h,27h,18h,28h,18h,28h,45h,90h
  6. PHI      db 00h,80h,16h,18h,03h,39h,88h,74h,99h
  7. SQRT2    db 00h,80h,14h,14h,21h,35h,62h,37h,31h
  8. InitRandomSeed db 89h,86h,53h,48h,94h,49h
  9.  
  10. ;#include "FPEx.z80"
  11. FPOP3ExOP4:
  12.    ld hl,OP3
  13.    ld de,OP4
  14.    jr FPDEExHL
  15.  
  16. FPOP2ExOP6:
  17.    ld hl,OP2
  18.    ld de,OP6
  19.    jr FPDEExHL
  20.  
  21. FPOP2ExOP5:
  22.    ld hl,OP2
  23.    ld de,OP5
  24.    jr FPDEExHL
  25.  
  26. FPOP2ExOP4:
  27.    ld hl,OP2
  28.    ld de,OP4
  29.    jr FPDEExHL
  30.  
  31. FPOP2ExOP3:
  32.    ld hl,OP2
  33.    ld de,OP3
  34.    jr FPDEExHL
  35.  
  36. FPOP1ExOP2:
  37.    ld hl,OP2
  38. FPOP1ExHL:
  39.    ld de,OP1
  40. FPDEExHL:
  41.    ld b,9
  42. FPOP1ExOP2_loop:
  43.    ld c,(hl)
  44.    ld a,(de)
  45.    ld (hl),a
  46.    ld a,c
  47.    ld (de),a
  48.    inc hl
  49.    inc de
  50.    djnz FPOP1ExOP2_loop
  51.    ret
  52.  
  53. FPOP1ExOP3:
  54.    ld hl,OP3
  55.    jr FPOP1ExHL
  56. FPOP1ExOP4:
  57.    ld hl,OP4
  58.    jr FPOP1ExHL
  59. FPOP1ExOP5
  60.    ld hl,OP5
  61.    jr FPOP1ExHL
  62. FPOP1ExOP6
  63.    ld hl,OP6
  64.    jr FPOP1ExHL
  65. ;#end "FPEx.z80
  66. ;#include "FPMov.z80"
  67. FPOP3ToOP6:
  68.    ld hl,OP3
  69.    ld de,OP6
  70.    jr FPMov9dehl
  71.  
  72. FPOP4ToOP2:
  73.    ld hl,OP4
  74.    ld de,OP2
  75.    jr FPMov9dehl
  76.  
  77. FPOP4ToOP3:
  78.    ld hl,OP4
  79.    ld de,OP3
  80.    jr FPMov9dehl
  81.  
  82. FPOP4ToOP1:
  83.    ld hl,OP4
  84.    ld de,OP1
  85.    jr FPMov9dehl
  86.  
  87. FPOP4ToOP5:
  88.    ld hl,OP4
  89.    ld de,OP5
  90.    jr FPMov9dehl
  91.  
  92. FPOP4ToOP6:
  93.    ld hl,OP4
  94.    ld de,OP6
  95.    jr FPMov9dehl
  96.  
  97. FPOP5ToOP2:
  98.    ld hl,OP5
  99.    ld de,OP2
  100.    jr FPMov9dehl
  101.  
  102. FPOP5ToOP3:
  103.    ld hl,OP5
  104.    ld de,OP3
  105.    jr FPMov9dehl
  106.  
  107. FPOP5ToOP4:
  108.    ld hl,OP5
  109.    ld de,OP4
  110.    jr FPMov9dehl
  111.  
  112. FPOP5ToOP1:
  113.    ld hl,OP5
  114.    ld de,OP1
  115.    jr FPMov9dehl
  116.  
  117. FPOP5ToOP6:
  118.    ld hl,OP5
  119.    ld de,OP6
  120.    jr FPMov9dehl
  121.  
  122. FPOP6ToOP2:
  123.    ld hl,OP6
  124.    ld de,OP2
  125.    jr FPMov9dehl
  126.  
  127. FPOP6ToOP3:
  128.    ld hl,OP6
  129.    ld de,OP3
  130.    jr FPMov9dehl
  131.  
  132. FPOP6ToOP4:
  133.    ld hl,OP6
  134.    ld de,OP4
  135.    jr FPMov9dehl
  136.  
  137. FPOP6ToOP5:
  138.    ld hl,OP6
  139.    ld de,OP5
  140.    jr FPMov9dehl
  141.  
  142. FPOP6ToOP1:
  143.    ld hl,OP6
  144.    ld de,OP1
  145.    jr FPMov9dehl
  146.  
  147. FPOP1ToOP2:
  148.    ld hl,OP1
  149.    ld de,OP2
  150. FPMov9dehl: ;I am aware of Mov9B... I want speed!
  151.    ldi
  152.    ldi
  153.    ldi
  154.    ldi
  155.    ldi
  156.    ldi
  157.    ldi
  158.    ldi
  159.    ldi
  160.    ret
  161.  
  162. FPMov9ToOP1:
  163.    ld de,OP1
  164.    jr FPMov9dehl
  165.  
  166. FPOP1ToOP3:
  167.    ld hl,OP1
  168.    ld de,OP3
  169.    jr FPMov9dehl
  170.  
  171.  
  172. FPOP1ToOP4:
  173.    ld hl,OP1
  174.    ld de,OP4
  175.    jr FPMov9dehl
  176.  
  177. FPOP1ToOP5:
  178.    ld hl,OP1
  179.    ld de,OP5
  180.    jr FPMov9dehl
  181.  
  182. FPOP1ToOP6:
  183.    ld hl,OP1
  184.    ld de,OP6
  185.    jr FPMov9dehl
  186.  
  187. FPOP2ToOP1:
  188.    ld hl,OP2
  189.    ld de,OP1
  190.    jr FPMov9dehl
  191.  
  192. FPOP2ToOP3:
  193.    ld hl,OP2
  194.    ld de,OP3
  195.    jr FPMov9dehl
  196.  
  197. FPOP2ToOP4:
  198.    ld hl,OP2
  199.    ld de,OP4
  200.    jr FPMov9dehl
  201.  
  202. FPOP2ToOP5:
  203.    ld hl,OP2
  204.    ld de,OP5
  205.    jr FPMov9dehl
  206.  
  207. FPOP2ToOP6:
  208.    ld hl,OP2
  209.    ld de,OP6
  210.    jr FPMov9dehl
  211.  
  212. FPOP3ToOP2:
  213.    ld hl,OP3
  214.    ld de,OP2
  215.    jr FPMov9dehl
  216.  
  217. FPOP3ToOP1:
  218.    ld hl,OP3
  219.    ld de,OP1
  220.    jr FPMov9dehl
  221.  
  222. FPOP3ToOP4:
  223.    ld hl,OP3
  224.    ld de,OP4
  225.    jr FPMov9dehl
  226.  
  227. FPOP3ToOP5:
  228.    ld hl,OP3
  229.    ld de,OP5
  230.    jr FPMov9dehl
  231.  
  232. FPMov9ToOP2:
  233.    ld de,OP2
  234. ;   jr FPMov9dehl_
  235.  
  236. FPFPMov9dehl_:
  237.    ldi
  238.    ldi
  239.    ldi
  240.    ldi
  241.    ldi
  242.    ldi
  243.    ldi
  244.    ldi
  245.    ldi
  246.    ret
  247. ;#end "FPMov.z80"
  248. ;#include "FPSet.z80"
  249. FPSetOP4To1:
  250.    ld a,10h
  251.    jr FPSetOP4ToA
  252.  
  253. FPSetOP3To2:
  254.    ld a,20h
  255.    jr FPSetOP3ToA
  256.  
  257. FPSetOP3To1:
  258.    ld a,10h
  259.    jr FPSetOP3ToA
  260.  
  261. FPSetOP3To0:
  262.    xor a
  263. FPSetOP3ToA:
  264.    ld hl,OP3
  265.    jr FPSetOPToA
  266.  
  267. FPSetOP4To0:
  268.    xor a
  269. FPSetOP4ToA:
  270.    ld hl,OP4
  271.    jr FPSetOPToA
  272.  
  273. FPSetOP5To0:
  274.    ld hl,OP5
  275.    jr FPSetOPTo0
  276.  
  277. FPSetOP6To0:
  278.    ld hl,OP6
  279.    jr FPSetOPTo0
  280.  
  281. FPSetOP2To8:
  282.    ld hl,OP2
  283.    ld a,80h
  284.    jr FPSetOPToA
  285.  
  286. FPSetOP2To60: ;I assume this is a useful value?
  287.    call FPSetOP2To6
  288.    ld hl,(OP2+1)
  289.    inc (hl)
  290.    ret
  291.    
  292. FPSetOP1To6:
  293.    ld hl,OP1
  294.    jr FPSetOP1To6_
  295. FPSetOP2To6:
  296.    ld hl,OP2
  297. FPSetOP1To6_:
  298.    ld a,60h
  299.    jr FPSetOPToA
  300.  
  301. FPSetOP1To5:
  302.    ld hl,OP1
  303.    jr FPSetOP1To5_
  304. FPSetOP2To5:
  305.    ld hl,OP2
  306. FPSetOP1To5_:
  307.    ld a,50h
  308.    jr FPSetOPToA
  309.  
  310. FPSetOP1To4:
  311.    ld hl,OP1
  312.    jr FPSetOP1To4_
  313. FPSetOP2To4:
  314.    ld hl,OP2
  315. FPSetOP1To4_:
  316.    ld a,40h
  317.    jr FPSetOPToA
  318.  
  319. FPSetOP1To3:
  320.    ld hl,OP1
  321.    jr FPSetOP1To3_
  322. FPSetOP2To3:
  323.    ld hl,OP2
  324. FPSetOP1To3_:
  325.    ld a,30h
  326.    jr FPSetOPToA
  327.  
  328. FPSetOP1To2:
  329.    ld hl,OP1
  330.    jr FPSetOP1To2_
  331. FPSetOP2To2:
  332.    ld hl,OP2
  333. FPSetOP1To2_:
  334.    ld a,20h
  335.    jr FPSetOPToA
  336.  
  337. FPSetOP1To1:
  338.    ld hl,OP1
  339.    jr FPSetOP1To1_
  340. FPSetOP2To1:
  341.    ld hl,OP2
  342. FPSetOP1To1_:
  343.    ld a,10h
  344.    jr FPSetOPToA
  345.  
  346. FPSetOP1To0:
  347.    ld hl,OP1
  348.    jr FPSetOPTo0
  349. FPSetOP2To0:
  350.    ld hl,OP2
  351. FPSetOPTo0:
  352.    xor a
  353.  
  354. FPSetOPToA:
  355.    ld (hl),0
  356.    inc hl
  357.    ld (hl),80h
  358.    inc hl
  359.    ld (hl),a
  360.    jr FPclearOP_6
  361.  
  362. FPclearOP:
  363.    xor a
  364.    ld (hl),a
  365.    inc hl
  366.    ld (hl),a
  367.    inc hl
  368.    ld (hl),a
  369. FPclearOP_6:
  370.    xor a
  371.    inc hl
  372.    ld (hl),a
  373.    inc hl
  374.    ld (hl),a
  375.    inc hl
  376.    ld (hl),a
  377.    inc hl
  378.    ld (hl),a
  379.    inc hl
  380.    ld (hl),a
  381.    inc hl
  382.    ld (hl),a
  383.    ret
  384. ;#end "FPSet.z80
  385. ;#include "FPmisc.z80"
  386. FPAbs:
  387.    xor a
  388.    ld a,(OP1)
  389.    ret
  390.  
  391. FPRand: ;holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff
  392.    call FPSetOP1To0
  393.    ld hl,RandSeed
  394.    ld de,OP1+1
  395.    ldi
  396.     ldi
  397.     ldi
  398.     ldi
  399.     ldi
  400.     ldi
  401.  
  402.    ld hl,FPrand_a  
  403.    call FPMov9ToOP2
  404.  
  405.    call FPMult
  406.  
  407.    ld hl,FPrand_c
  408.    call FPMov9ToOP2
  409.  
  410.    call FPAdd
  411.  
  412.    ld hl,FPrand_m
  413.    call FPMov9ToOP2
  414.  
  415.    call FPMod
  416.  
  417.    ld hl,OP1+1
  418.    ld de,RandSeed
  419.    ldi
  420.     ldi
  421.     ldi
  422.     ldi
  423.     ldi
  424.     ldi
  425.    
  426.    ld a,7Fh
  427.    ld (OP1+1),a   ;Makes our random number a decimal...
  428.    ret
  429.  
  430. FPrand_a:
  431.    db 00h,85h,21h,40h,13h,00h,00h,00h,00h
  432. FPrand_c:
  433.    db 00h,86h,25h,31h,01h,10h,00h,00h,00h
  434. FPrand_m:
  435.    db 00h,84h,65h,53h,50h,00h,00h,00h,00h
  436.  
  437. ;Float Compares
  438.  
  439. FPchkHalfINT:
  440.    call FPOP1ToOP3
  441.  
  442.    ld hl,OP2
  443.    xor a
  444.    ld (hl),a
  445.    ld de,507Fh
  446.    ld (OP1+1),de
  447.    inc hl
  448.    call FPclearOP_6
  449.  
  450.    call FPAdd
  451.    call FPchkINT
  452.    push af
  453.    call FPOP3ToOP1
  454.    pop af
  455.    ret
  456.  
  457. FPchkINT:
  458.    ld a,(OP1+1)
  459.    sub 80h
  460.    inc a
  461.    ld c,a
  462.    sla a
  463.    ld d,0
  464.     ld e,a
  465.    ld hl,OP1+2
  466.    add hl,de
  467.    ld a,c
  468.    bit 0,a
  469.    ld a,(hl)
  470.    jr z,chkINTL
  471.  
  472.    and 0Fh
  473.    ret
  474.  
  475. chkINTL:
  476.    and 240;F0h
  477.    ret
  478.  
  479. ;Floating Point - Compare OP1 To OP2
  480. FPCpOP1ToOP2:
  481.    ld a,(OP2+1)
  482.    ld b,a
  483.    ld a,(OP1+1)
  484.    cp b
  485.    ret nz
  486.  
  487.    ld hl,OP1+2
  488.    ld de,OP2+2
  489.    ld b,7
  490. FPCpOP1ToOP2_loop:
  491.    ld a,(de)
  492.    ld b,(hl)
  493.    cp b
  494.    ret nz
  495.    inc hl
  496.    inc de
  497.    djnz FPCpOP1ToOP2_loop
  498.    ret
  499.  
  500. ;Floating Point - Compare OP1 To zero
  501. FPCpOP1To0:
  502.    ld a,(OP1+1)
  503.    cp 80h
  504.    ret nz
  505.  
  506.    ld hl,OP1+2
  507. FPCpOPTo0:
  508.    ld b,7
  509. FPCpOP1To0_loop:
  510.    ld a,(hl)
  511.    or a
  512.    ret nz
  513.    inc hl
  514.    djnz FPCpOP1To0_loop
  515.    ret
  516.  
  517. FPCpOP2To0:
  518.    ld a,(OP2+1)
  519.    cp 80h
  520.    ret nz
  521.  
  522.    ld hl,OP2+2
  523.    jr FPCpOPTo0
  524.  
  525. FPCpOP3To0:
  526.    ld a,(OP3+1)
  527.    cp 80h
  528.    ret nz
  529.  
  530.    ld hl,OP3+2
  531.    jr FPCpOPTo0
  532.  
  533. FPCpOP4To0:
  534.    ld a,(OP4+1)
  535.    cp 80h
  536.    ret nz
  537.  
  538.    ld hl,OP4+2
  539.    jr FPCpOPTo0
  540.  
  541. ;Float Shifting by Nibbles
  542.  
  543. FPsrOP1_1:
  544.    ld a,1
  545. FPsrOP1:
  546.    ld b,a
  547.    ld de,OP1+2
  548. FPsr_l:
  549.    ld h,d
  550.     ld l,e
  551.    xor a
  552.    rrd
  553.    inc hl
  554.    rrd
  555.    inc hl
  556.    rrd
  557.    inc hl
  558.    rrd
  559.    inc hl
  560.    rrd
  561.    inc hl
  562.    rrd
  563.    inc hl
  564.    rrd
  565.    inc hl
  566.    rrd
  567.    djnz FPsr_l
  568.    ret
  569.  
  570. FPsrOP2_1:
  571.    ld a,1
  572. FPsrOP2:
  573.    ld b,a
  574.    ld de,OP2+2
  575.    jr FPsr_l
  576.  
  577. FPsrOP3_1:
  578.    ld a,1
  579. FPsrOP3:
  580.    ld b,a
  581.    ld de,OP3+2
  582.    jr FPsr_l
  583.  
  584. FPsrOP4_1:
  585.    ld a,1
  586. FPsrOP4:
  587.    ld b,a
  588.    ld de,OP4+2
  589.    jr FPsr_l
  590.  
  591. FPslOP1_1:
  592.    ld a,1
  593. ;Floating Point - Shift OP1 Left a digits
  594. FPslOP1:
  595.    or a
  596.    sla a
  597.    sla a
  598.    ld b,a
  599. FPslOP1_o:
  600.    ld d,b
  601.    ld hl,OP1+9
  602.    or a
  603.    ld b,8
  604. FPslOP1_i:
  605.    rl (hl)
  606.    dec hl
  607.    djnz FPslOP1_i
  608.    ld b,d
  609.    djnz FPslOP1_o
  610.    ret
  611.  
  612. FPslOP3_1:
  613.    ld a,1
  614. ;Floating Point - Shift OP3 Left a digits
  615. FPslOP3:
  616.    or a
  617.    sla a
  618.    sla a
  619.    ld b,a
  620. FPslOP3_o:
  621.    ld d,b
  622.    ld hl,OP3+9
  623.    or a
  624.    ld b,8
  625. FPslOP3_i:
  626.    rl (hl)
  627.    dec hl
  628.    djnz FPslOP3_i
  629.    ld b,d
  630.    djnz FPslOP3_o
  631.    ret
  632.  
  633. ;Truely Misc.
  634.  
  635. FPsum_digitsOP2: ;Multiplication Run-Time Optimization
  636.    ld hl,OP2+2
  637.    jr FPsum_digitsOP2_
  638. FPsum_digitsOP1:
  639.    ld hl,OP1+2
  640. FPsum_digitsOP2_:
  641.    ld b,7
  642.    xor a
  643.    ld c,a
  644. FPsum_digits_l:
  645.    rrd
  646.    ld e,a
  647.    add a,c
  648.    ld c,a
  649.    ld a,e
  650.    rrd
  651.    ld e,a
  652.    add a,c
  653.    ld c,a
  654.    ld a,e
  655.    rrd
  656.    inc hl
  657.    djnz FPsum_digits_l
  658.    ret
  659.  
  660. FPNormalize_OP1:
  661.    ld hl,OP1+2
  662.    ld b,14
  663. FPnormalize_OP1_loop:
  664.    ld a,(hl)
  665.    and 240;F0h
  666.    ret nz
  667.    push hl
  668.    call FPslOP1_1
  669.    pop hl
  670.    ld a,(OP1+1)
  671.    dec a
  672.    ld (OP1+1),a
  673.    djnz FPnormalize_OP1_loop
  674.    
  675.    jp FPSetOP1To0
  676.  
  677. FPNormalize_OP3:
  678.    ld hl,OP3+2
  679.    ld b,14
  680. FPnormalize_OP3_loop:
  681.    ld a,(hl)
  682.    and 240;$F0
  683.    ret nz
  684.    push hl
  685.    push bc
  686.    call FPslOP3_1
  687.    pop bc
  688.    pop hl
  689.    ld a,(OP3+1)
  690.    dec a
  691.    ld (OP3+1),a
  692.    djnz FPnormalize_OP3_loop
  693.    
  694.    jp FPSetOP3To0
  695.  
  696. FPDecOP3:
  697.    call FPSetOP4To1
  698.    call FPSubOP3OP4
  699.    jp FPCpOP3To0
  700. FPDecOP4:
  701.    call FPOP4ToOP3
  702.    call FPSetOP4To1
  703.    call FPSubOP3OP4
  704.    call FPOP3ToOP4
  705.    jp FPCpOP4To0
  706.  
  707. FPIncOP3:
  708.    call FPSetOP4To1
  709.    call FPAddOP3OP4
  710.    jp FPCpOP3To0
  711. FPIncOP4:
  712.    call FPOP4ToOP3
  713.    call FPSetOP4To1
  714.    call FPAddOP3OP4
  715.    call FPOP3ToOP4
  716.    jp FPCpOP4To0
  717.  
  718. ;#end "FPmisc.z80"
  719. ;#include "FPadd.z80"
  720. FPAdd:
  721.    call FPCpOP1To0 ;Check for either being zero
  722.    jp z,FPOP2ToOP1
  723.    call FPCpOP2To0
  724.    ret z
  725.  
  726.    xor a
  727.    ld (OP1+9),a
  728.    ld (OP2+9),a
  729.  
  730.    ld a,(OP1)
  731.    ld b,a
  732.    ld a,(OP2)
  733.    cp b
  734.    jr z,FPadd_same_sign
  735.  
  736. ;signs are different -- put the one with the
  737. ;  minus sign in the subtrahend position,
  738. ;  reMove its sign, and use FPsub
  739.    
  740.    jr nc,FPadd_no_swap
  741.    call FPOP1ExOP2
  742. FPadd_no_swap:
  743.    xor 1 ;change sign
  744.    ld (OP2),a
  745.    jp FPSub
  746.  
  747. FPadd_same_sign:
  748.    ld a,(OP2+1)
  749.    ld c,a
  750.    ld a,(OP1+1)
  751.    cp c
  752.    jr z,FPadd_same_Exp
  753.  
  754.    jr nc,FPadd_adjust
  755.  
  756.    ld b,a
  757.    push bc
  758.    call FPOP1ExOP2 ;Make the larger one in OP1
  759.    pop bc
  760.    ld a,c
  761.    ld c,b
  762.  
  763. FPadd_adjust:
  764.    sub c
  765.    cp 15       ;If the Exponent is so much smaller that it doesn't make a difference don't bother
  766.    ret nc
  767.  
  768. ;a = difference in Exponent
  769.    call FPsrOP2
  770.  
  771. FPadd_same_Exp:
  772.    call FPsrOP2_1 ;Room for a carry
  773.    call FPsrOP1_1
  774.  
  775. ;Now they both have the same Exponent
  776.    ld hl,OP1+9
  777.    ld de,OP2+9
  778.  
  779.    ld a,(de)
  780.    adc a,(hl)
  781.    daa
  782.    ld (hl),a
  783.    dec de
  784.    dec hl
  785.    srl a
  786.    srl a
  787.    srl a
  788.    srl a
  789.    cp 5               ;Rounding Rule... 5 > on the dropped digit rounds up otherwise it is just dropped
  790.    ccf
  791.    ld a,(de)
  792.    adc a,(hl)
  793.    daa
  794.    ld (hl),a
  795.    dec hl
  796.    dec de
  797.    ld a,(de)
  798.    adc a,(hl)
  799.    daa
  800.    ld (hl),a
  801.    dec hl
  802.    dec de
  803.    ld a,(de)
  804.    adc a,(hl)
  805.    daa
  806.    ld (hl),a
  807.    dec hl
  808.    dec de
  809.    ld a,(de)
  810.    adc a,(hl)
  811.    daa
  812.    ld (hl),a
  813.    dec hl
  814.    dec de
  815.    ld a,(de)
  816.    adc a,(hl)
  817.    daa
  818.    ld (hl),a
  819.    dec hl
  820.    dec de
  821.    ld a,(de)
  822.    adc a,(hl)
  823.    daa
  824.    ld (hl),a
  825.    dec hl
  826.    dec de
  827.    ld a,(de)
  828.    adc a,(hl)
  829.    daa
  830.    ld (hl),a
  831.  
  832. ;Now the numbers are added Together
  833.  
  834.    ld a,(OP1+2)
  835.    and 240;$F0
  836.    jr nz,FPadd_no_shiftback ;Did we carry over
  837.  
  838.    call FPslOP1_1
  839.    ret ;No chance To overflow
  840.  
  841. FPadd_no_shiftback:
  842.    ld a,(OP1+1) ;Get Exponent
  843.    inc a
  844.    ld (OP1+1),a
  845.    or a ; If it is zero than we overflowed
  846.    RCALLZ Err_Overflow
  847.    ret ;Done adding them OP2 is de-normalized
  848.  
  849. ;Other additions
  850.  
  851. FPAddOP3OP4:
  852.    call FPCpOP3To0 ;Check for either being zero
  853.    jp z,FPOP4ToOP3
  854.    call FPCpOP4To0
  855.    ret z
  856.  
  857.    xor a
  858.    ld (OP3+9),a
  859.    ld (OP4+9),a
  860.  
  861.    ld a,(OP3)
  862.    ld b,a
  863.    ld a,(OP4)
  864.    cp b
  865.    jr z,FPaddOP3OP4_same_sign
  866.  
  867. ;signs are different -- put the one with the
  868. ;  minus sign in the subtrahend position,
  869. ;  reMove its sign, and use FPsub
  870.    
  871.    jr nc,FPaddOP3OP4_no_swap
  872.    call FPOP3ExOP4
  873. FPaddOP3OP4_no_swap:
  874.    xor 1 ;change sign
  875.    ld (OP4),a
  876.    jp FPSubOP3OP4
  877.  
  878. FPaddOP3OP4_same_sign:
  879.    ld a,(OP4+1)
  880.    ld c,a
  881.    ld a,(OP3+1)
  882.    cp c
  883.    jr z,FPaddOP3OP4_same_Exp
  884.  
  885.    jr nc,FPaddOP3OP4_adjust
  886.  
  887.    ld b,a
  888.    push bc
  889.    call FPOP3ExOP4 ;Make the larger one in OP3
  890.    pop bc
  891.    ld a,c
  892.    ld c,b
  893.  
  894. FPaddOP3OP4_adjust:
  895.    sub c
  896.    cp 15       ;If the Exponent is so much smaller that it doesn't make a difference don't bother
  897.    ret nc
  898.  
  899. ;a = difference in Exponent
  900.    call FPsrOP4
  901.  
  902. FPaddOP3OP4_same_Exp:
  903.    call FPsrOP4_1 ;Room for a carry
  904.    call FPsrOP3_1
  905.  
  906. ;Now they both have the same Exponent
  907.    ld hl,OP3+9
  908.    ld de,OP4+9
  909.  
  910.    ld a,(de)
  911.    adc a,(hl)
  912.    daa
  913.    ld (hl),a
  914.    dec de
  915.    dec hl
  916.    srl a
  917.    srl a
  918.    srl a
  919.    srl a
  920.    cp 5               ;Rounding Rule... 5 > on the dropped digit rounds up otherwise it is just dropped
  921.    ccf
  922.    ld a,(de)
  923.    adc a,(hl)
  924.    daa
  925.    ld (hl),a
  926.    dec hl
  927.    dec de
  928.    ld a,(de)
  929.    adc a,(hl)
  930.    daa
  931.    ld (hl),a
  932.    dec hl
  933.    dec de
  934.    ld a,(de)
  935.    adc a,(hl)
  936.    daa
  937.    ld (hl),a
  938.    dec hl
  939.    dec de
  940.    ld a,(de)
  941.    adc a,(hl)
  942.    daa
  943.    ld (hl),a
  944.    dec hl
  945.    dec de
  946.    ld a,(de)
  947.    adc a,(hl)
  948.    daa
  949.    ld (hl),a
  950.    dec hl
  951.    dec de
  952.    ld a,(de)
  953.    adc a,(hl)
  954.    daa
  955.    ld (hl),a
  956.    dec hl
  957.    dec de
  958.    ld a,(de)
  959.    adc a,(hl)
  960.    daa
  961.    ld (hl),a
  962.  
  963. ;Now the numbers are added Together
  964.  
  965.    ld a,(OP3+2)
  966.    and 240;$F0
  967.    jr nz,FPaddOP3OP4_no_shiftback ;Did we carry over
  968.  
  969.    call FPslOP3_1
  970.    ret ;No chance To overflow
  971.  
  972. FPaddOP3OP4_no_shiftback:
  973.    ld a,(OP3+1) ;Get Exponent
  974.    inc a
  975.    ld (OP3+1),a
  976.    or a ; If it is zero than we overflowed
  977.    RCALLZ Err_Overflow
  978.    ret ;Done adding them OP4 is de-normalized
  979. ;#end "FPadd.z80"
  980. ;#include "FPsub.z80"
  981. FPSub:
  982.    call FPCpOP1To0 ;Check for either being zero
  983.    jp z,FPOP2ToOP1
  984.    call FPCpOP2To0
  985.    ret z
  986.  
  987.    xor a
  988.    ld (OP1+9),a
  989.    ld (OP2+9),a
  990.  
  991.    ld a,(OP1)
  992.    ld b,a
  993.    ld a,(OP2)
  994.    cp b
  995.    jr z,FPsub_same_sign
  996.  
  997. ; signs are different -- change sign of subtrahend
  998. ;   and use FPadd
  999.    xor 1
  1000.    ld (OP2),a
  1001.    jp FPAdd
  1002.  
  1003. FPsub_same_sign:
  1004.    ld a,(OP2+1)
  1005.    ld c,a
  1006.    ld a,(OP1+1)
  1007.    cp c
  1008.    jr z,FPsub_same_Exp
  1009.  
  1010.    jr nc,FPsub_adjust
  1011.  
  1012.    ld b,a
  1013.    push bc
  1014.    call FPOP1ExOP2 ;Make the larger one in OP1 and swap the sign on the resultant
  1015.    ld a,(OP1)
  1016.    xor 1
  1017.    ld (OP1),a
  1018.    pop bc
  1019.    ld a,c
  1020.    ld c,b
  1021.  
  1022. FPsub_adjust:
  1023.    sub c
  1024.    cp 15       ;If the Exponent is so much smaller that it doesn't make a difference don't bother
  1025.    ret nc
  1026.  
  1027. ;a = difference in Exponent
  1028.    call FPsrOP2
  1029.  
  1030. FPsub_same_Exp:
  1031.    call FPsrOP2_1 ;Room for a carry
  1032.    call FPsrOP1_1
  1033.  
  1034. ;Now they both have the same Exponent
  1035.    ld hl,OP2+9
  1036.    ld de,OP1+9
  1037.  
  1038.    ld a,(de)
  1039.    sbc a,(hl)
  1040.    daa
  1041.    ld (de),a
  1042.    dec de
  1043.    dec hl
  1044.    srl a
  1045.    srl a
  1046.    srl a
  1047.    srl a
  1048.    cp 5               ;Rounding Rule... 5 > on the dropped digit rounds up otherwise it is just dropped
  1049.    ccf
  1050.    ld a,(de)
  1051.    sbc a,(hl)
  1052.    daa
  1053.    ld (de),a
  1054.    dec hl
  1055.    dec de
  1056.    ld a,(de)
  1057.    sbc a,(hl)
  1058.    daa
  1059.    ld (de),a
  1060.    dec hl
  1061.    dec de
  1062.    ld a,(de)
  1063.    sbc a,(hl)
  1064.    daa
  1065.    ld (de),a
  1066.    dec hl
  1067.    dec de
  1068.    ld a,(de)
  1069.    sbc a,(hl)
  1070.    daa
  1071.    ld (de),a
  1072.    dec hl
  1073.    dec de
  1074.    ld a,(de)
  1075.    sbc a,(hl)
  1076.    daa
  1077.    ld (de),a
  1078.    dec hl
  1079.    dec de
  1080.    ld a,(de)
  1081.    sbc a,(hl)
  1082.    daa
  1083.    ld (de),a
  1084.    dec hl
  1085.    dec de
  1086.    ld a,(de)
  1087.    sbc a,(hl)
  1088.    daa
  1089.    ld (de),a
  1090.    dec hl
  1091.    dec de
  1092.  
  1093.  
  1094. ;Now the numbers are added Together
  1095.  
  1096.    ld a,(OP1+2)
  1097.    and 240;$F0
  1098.    jr nz,FPsub_no_shiftback ;Did we carry over
  1099.  
  1100.    ld hl,(OP1+2)
  1101.    ld a,(hl)
  1102.    and 0Fh
  1103.    
  1104.    call FPslOP1_1
  1105.    
  1106.    call FPNormalize_OP1
  1107.    ret ;No chance To overflow
  1108.  
  1109. FPsub_no_shiftback:
  1110.    ld a,(OP1+1) ;Get Exponent
  1111.    inc a
  1112.    ld (OP1+1),a
  1113.    or a ; If it is zero than we overflowed
  1114.    RCALLZ Err_Overflow
  1115.    ret ;Done adding them OP2 is de-normalized
  1116.  
  1117.  
  1118. ;Other subtractions
  1119. FPSubOP3OP4:
  1120.    call FPCpOP3To0 ;Check for either being zero
  1121.    jp z,FPOP4ToOP3
  1122.    call FPCpOP4To0
  1123.    ret z
  1124.  
  1125.    xor a
  1126.    ld (OP3+9),a
  1127.    ld (OP4+9),a
  1128.  
  1129.    ld a,(OP3)
  1130.    ld b,a
  1131.    ld a,(OP4)
  1132.    cp b
  1133.    jr z,FPsubOP3OP4_same_sign
  1134.  
  1135. ; signs are different -- change sign of subtrahend
  1136. ;   and use FPadd
  1137.    xor 1
  1138.    ld (OP4),a
  1139.    jp FPAddOP3OP4
  1140.  
  1141. FPsubOP3OP4_same_sign:
  1142.    ld a,(OP4+1)
  1143.    ld c,a
  1144.    ld a,(OP3+1)
  1145.    cp c
  1146.    jr z,FPsubOP3OP4_same_Exp
  1147.  
  1148.    jr nc,FPsubOP3OP4_adjust
  1149.  
  1150.    ld b,a
  1151.    push bc
  1152.    call FPOP3ExOP4 ;Make the larger one in OP3 and swap the sign on the resultant
  1153.    ld a,(OP3)
  1154.    xor 1
  1155.    ld (OP3),a
  1156.    pop bc
  1157.    ld a,c
  1158.    ld c,b
  1159.  
  1160. FPsubOP3OP4_adjust:
  1161.    sub c
  1162.    cp 15       ;If the Exponent is so much smaller that it doesn't make a difference don't bother
  1163.    ret nc
  1164.  
  1165. ;a = difference in Exponent
  1166.    call FPsrOP4
  1167.  
  1168. FPsubOP3OP4_same_Exp:
  1169.    call FPsrOP4_1 ;Room for a carry
  1170.    call FPsrOP3_1
  1171.  
  1172. ;Now they both have the same Exponent
  1173.    ld hl,OP4+9
  1174.    ld de,OP3+9
  1175.  
  1176.    ld a,(de)
  1177.    sbc a,(hl)
  1178.    daa
  1179.    ld (de),a
  1180.    dec de
  1181.    dec hl
  1182.    srl a
  1183.    srl a
  1184.    srl a
  1185.    srl a
  1186.    cp 5               ;Rounding Rule... 5 > on the dropped digit rounds up otherwise it is just dropped
  1187.    ccf
  1188.    ld a,(de)
  1189.    sbc a,(hl)
  1190.    daa
  1191.    ld (de),a
  1192.    dec hl
  1193.    dec de
  1194.    ld a,(de)
  1195.    sbc a,(hl)
  1196.    daa
  1197.    ld (de),a
  1198.    dec hl
  1199.    dec de
  1200.    ld a,(de)
  1201.    sbc a,(hl)
  1202.    daa
  1203.    ld (de),a
  1204.    dec hl
  1205.    dec de
  1206.    ld a,(de)
  1207.    sbc a,(hl)
  1208.    daa
  1209.    ld (de),a
  1210.    dec hl
  1211.    dec de
  1212.    ld a,(de)
  1213.    sbc a,(hl)
  1214.    daa
  1215.    ld (de),a
  1216.    dec hl
  1217.    dec de
  1218.    ld a,(de)
  1219.    sbc a,(hl)
  1220.    daa
  1221.    ld (de),a
  1222.    dec hl
  1223.    dec de
  1224.    ld a,(de)
  1225.    sbc a,(hl)
  1226.    daa
  1227.    ld (de),a
  1228.    dec hl
  1229.    dec de
  1230.  
  1231.  
  1232. ;Now the numbers are added Together
  1233.  
  1234.    ld a,(OP3+2)
  1235.    and 240;F0
  1236.    jr nz,FPsubOP3OP4_no_shiftback ;Did we carry over
  1237.  
  1238.    call FPslOP3_1
  1239.    call FPNormalize_OP3
  1240.    ret ;No chance To overflow
  1241.  
  1242. FPsubOP3OP4_no_shiftback:
  1243.    ld a,(OP3+1) ;Get Exponent
  1244.    inc a
  1245.    ld (OP3+1),a
  1246.    or a ; If it is zero than we overflowed
  1247.    RCALLZ Err_Overflow
  1248.    ret ;Done adding them OP4 is de-normalized
  1249. ;#end "FPsub.z80"
  1250. ;#include "FPmult.z80"
  1251. op1plusop3 .macro
  1252.     ld hl,OP1+8
  1253.     ld de,OP3+8
  1254.     loopchunk
  1255.     loopchunk
  1256.     loopchunk
  1257.     loopchunk
  1258.     loopchunk
  1259.     loopchunk
  1260.     ld a,(de)
  1261.     adc a,(hl)
  1262.     daa
  1263.     ld (hl),a
  1264.     .endm
  1265. loopchunk .macro
  1266.     ld a,(de)
  1267.     adc a,(hl)
  1268.     daa
  1269.     ld (hl),a
  1270.     dec hl
  1271.     dec de
  1272.     .endm
  1273.  
  1274. FPMult:
  1275.    call FPCpOP1To0 ;Check for either being zero
  1276.    ret z
  1277.    call FPCpOP2To0
  1278.    jp z,FPSetOP1To0
  1279.  
  1280.    xor a
  1281.    ld (OP1+9),a
  1282.    ld (OP2+9),a
  1283.  
  1284.    call FPsum_digitsOP1
  1285.    ld d,c
  1286.    call FPsum_digitsOP2
  1287.    ld a,d
  1288.    cp c
  1289.    jr nc,FPmult_dont_swap    ;With this we optimize the multiplication To take the least sums
  1290.  
  1291.    call FPOP1ExOP2
  1292.  
  1293. FPmult_dont_swap:
  1294.    ld a,(OP1+1)
  1295. ;   sub $80      ;Convienant that you don't have To fix the skew (carries over and is dropped)
  1296.    ld c,a
  1297.    ld a,(OP2+1)
  1298. ;   sub $80
  1299.    add a,c
  1300.    add a,80h     ;But you still do here
  1301.    or a
  1302.    RCALLZ Err_Overflow
  1303.    ld (OP1+1),a    ;Addition of Exponent yields the products Exponent (with the possibility of a carry)
  1304.  
  1305.    ld a,(OP1)
  1306.    ld c,a
  1307.    ld a,(OP2)
  1308.    xor c
  1309.    ld (OP1),a   ;Set the sign of our product
  1310.  
  1311.    call FPSetOP3To0 ;clear or holder
  1312.  
  1313.    call FPsrOP1_1   ;Room To catch a carries
  1314.  
  1315.    ld de,OP2+8  
  1316.    ld b,6
  1317. FPmult_o:
  1318.    push bc
  1319.    ld a,(de)
  1320.    and 0Fh
  1321.    jr z,FPmult_empty_l
  1322.  
  1323.    push de  
  1324.    ld b,a
  1325. FPmult_i_l:
  1326. ;op1plusop3
  1327.    ld hl,OP3+9
  1328.    ld de,OP1+9
  1329.    ld a,(de)
  1330.    adc a,(hl)
  1331.    daa
  1332.    ld (hl),a
  1333.    dec de
  1334.    dec hl
  1335.    srl a
  1336.    srl a
  1337.    srl a
  1338.    srl a
  1339.    cp 5
  1340.    ccf
  1341.    loopchunk
  1342.    loopchunk
  1343.    loopchunk
  1344.    loopchunk
  1345.    loopchunk
  1346.    loopchunk
  1347.    ld a,(de)
  1348.     adc a,(hl)
  1349.     daa
  1350.     ld (hl),a
  1351.  
  1352.    djnz FPmult_i_l
  1353.  
  1354.    call FPsrOP3_1
  1355.  
  1356.    pop de
  1357. FPmult_empty_l
  1358.    ld a,(de)
  1359.    and 0F0h
  1360.    jr z,FPmult_empty_r
  1361.  
  1362.    push de  
  1363.    srl a
  1364.     srl a
  1365.     srl a
  1366.     srl a
  1367.    ld b,a
  1368. FPmult_i_r:
  1369. ;op1plusop3
  1370.    ld hl,OP3+9
  1371.    ld de,OP1+9
  1372.    ld a,(de)
  1373.    adc a,(hl)
  1374.    daa
  1375.    ld (hl),a
  1376.    dec de
  1377.    dec hl
  1378.    srl a
  1379.    srl a
  1380.    srl a
  1381.    srl a
  1382.    cp 5
  1383.    ccf
  1384.    loopchunk
  1385.    loopchunk
  1386.    loopchunk
  1387.    loopchunk
  1388.    loopchunk
  1389.    loopchunk
  1390.    ld a,(de)
  1391.     adc a,(hl)
  1392.     daa
  1393.     ld (hl),a
  1394.  
  1395.    djnz FPmult_i_r
  1396.  
  1397.    call FPsrOP3_1
  1398.  
  1399.    pop de
  1400. FPmult_empty_r:
  1401.    dec de
  1402.    pop bc
  1403.    dec b
  1404.    jp nz,FPmult_o
  1405.  
  1406. ;Last digits...
  1407.    ld a,(de)
  1408.    and 0Fh
  1409.    jr z,FPmult_empty_l_
  1410.  
  1411.    push de
  1412.    ld b,a
  1413. FPmult_i_l_:
  1414. ;op1plusop3
  1415.    ld hl,OP3+9
  1416.    ld de,OP1+9
  1417.    ld a,(de)
  1418.    adc a,(hl)
  1419.    daa
  1420.    ld (hl),a
  1421.    dec de
  1422.    dec hl
  1423.    srl a
  1424.    srl a
  1425.    srl a
  1426.    srl a
  1427.    cp 5
  1428.    ccf
  1429.    loopchunk
  1430.    loopchunk
  1431.    loopchunk
  1432.    loopchunk
  1433.    loopchunk
  1434.    loopchunk
  1435.    ld a,(de)
  1436.     adc a,(hl)
  1437.     daa
  1438.     ld (hl),a
  1439.  
  1440.    djnz FPmult_i_l_
  1441.  
  1442.    call FPsrOP3_1
  1443.  
  1444.    pop de
  1445. FPmult_empty_l_:
  1446.    ld a,(de)
  1447.    and 0F0h
  1448.    jr z,FPmult_empty_r_  ;Impossible on normalized numbers... but leave it
  1449.  
  1450.    srl a
  1451.     srl a
  1452.     srl a
  1453.     srl a
  1454.    ld b,a
  1455. FPmult_i_r_:
  1456. ;op1plusop3
  1457.    ld hl,OP3+9
  1458.    ld de,OP1+9
  1459.    ld a,(de)
  1460.    adc a,(hl)
  1461.    daa
  1462.    ld (hl),a
  1463.    dec de
  1464.    dec hl
  1465.    srl a
  1466.    srl a
  1467.    srl a
  1468.    srl a
  1469.    cp 5
  1470.    ccf
  1471.    loopchunk
  1472.    loopchunk
  1473.    loopchunk
  1474.    loopchunk
  1475.    loopchunk
  1476.    loopchunk
  1477.    ld a,(de)
  1478.     adc a,(hl)
  1479.     daa
  1480.     ld (hl),a
  1481.  
  1482.    djnz FPmult_i_r_
  1483.  
  1484. FPmult_empty_r_:
  1485.  
  1486.    ld hl,OP3+2
  1487.    ld de,OP1+2
  1488.    ldi
  1489.     ldi
  1490.     ldi
  1491.     ldi
  1492.     ldi
  1493.     ldi
  1494.     ldi
  1495.  
  1496.    ld a,(OP1+2)
  1497.    and 0F0h
  1498.    jr z,FPmult_no_carry
  1499.  
  1500.    ld hl,OP1+1
  1501.    ld a,(hl)
  1502.    inc a
  1503.    or a
  1504.    RCALLZ Err_Overflow
  1505.    ld (hl),a  
  1506.    ret
  1507.  
  1508. FPmult_no_carry:
  1509.    call FPslOP1_1
  1510.    ret
  1511. ;#end "FPmult.z80
  1512. ;#include "FPdiv.z80"
  1513. FPDiv:
  1514.    ret
  1515. ;#end "FPdiv.z80"
  1516. ;#include "FPmod.z80"
  1517. FPMod:  
  1518.    ;Note output uses sign of OP1
  1519.  
  1520.    xor a
  1521.    ld (OP2),a ;Clear the sign on OP2 no matter what
  1522.    
  1523.    call FPOP2ToOP3
  1524. FPmod_l:
  1525.    call FPOP3ToOP2
  1526.    call FPCpOP1ToOP2
  1527.    ret c                ;If OP2 > OP1
  1528.  
  1529.    call FPOP3ToOP2
  1530.    call FPSub
  1531.    jp FPmod_l
  1532. ;#end "FPmod.z80"
  1533. ;#include "FPfacTorial.z80"
  1534. FPFactorial:
  1535.    call FPCpOP1To0
  1536.    jp z,FPSetOP1To1
  1537.    
  1538.  
  1539.    call FPSetOP2To0
  1540.    call FPCpOP1ToOP2
  1541. ;   RCALLC Err_Domain
  1542.  
  1543.    call FPOP1ToOP4
  1544.    call FPSetOP1To1
  1545. FPfacTorial_loop:
  1546.    call FPOP4ToOP2
  1547.    call FPMult
  1548.  
  1549.    call FPDecOP4
  1550.    jr nz,FPfacTorial_loop
  1551.  
  1552.    ret
  1553. ;#end "FPfacTorial.z80"
  1554. ;#include "FPconv.z80"
  1555. ;Through a string inTo HL of OP1
  1556. FPOP1ToStr:
  1557.    ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement