?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.         macro SQDELOOP
  2. ;+de*+de
  3.         ld hl,0
  4.         ld d,l;0
  5. ;полное умножение требует 16(15) проходов, а мы сделаем по частям в 8(7) проходов
  6. ;0de0 * 0de0 = de0*d + de*e = (d*d<<16) + (d*e<<9) + (e*e)
  7. ;(d*e<<9) -> hl0
  8.         rlca ;"d"
  9.         jr nc,$+4
  10.         ld l,e ;"0e"
  11.         add hl,hl
  12.         dup 6
  13.         rlca ;"d"
  14.         jr nc,$+3
  15.         add hl,de ;"0e"
  16.         add hl,hl
  17.         edup
  18. ;hl0 = (d*e<<9)
  19.        
  20.         if 1==0 ;don't use bc (невыгодно по сравнению с sqde:ld iy,de:...:sqde:add iy,de:...:sqde:add iy,de
  21.         ex de,hl
  22.         ld h,tsqr/256+1
  23.         ld h,(hl) ;(e*e)
  24.          ld l,a
  25.          ld a,h
  26.         ld h,tsqr/256
  27.         ld h,(hl) ;(d*d<<16)
  28.         ld l,a
  29.         add hl,de
  30.         ex de,hl
  31.         else
  32.        
  33.          ld c,a
  34.         ld d,tsqr/256+1
  35.         ld a,(de) ;(e*e)
  36.         add a,l
  37.         ld e,a
  38.         ld b,tsqr/256
  39.         ld a,(bc) ;(d*d<<16)
  40.         adc a,h
  41.         ld d,a
  42.         endif
  43. ;out: 0de0
  44.         endm
  45.  
  46.         macro SQDE
  47.         ld a,d
  48.         rlca
  49.         jr nc,$+2+3+3
  50.          xor a
  51.          sub e
  52.          ld e,a
  53.          sbc a,d
  54.          sub e
  55.          rlca ;"d"
  56.         if SQUARESQR
  57.         scf
  58.         rra
  59.         ld d,a
  60.         res 0,e
  61.         ex de,hl
  62.         ld e,(hl)
  63.         inc l
  64.         ld d,(hl)
  65.         ld a,l
  66.         cp 8 ;костыль для младшего бита
  67.         rl e;sla e
  68.         rl d
  69.         ;ld a,(hl)
  70.         ;inc l
  71.         ;ld h,(hl)
  72.         ;ld l,a
  73.         ;add hl,hl ;выигрыш 1 байт по сравнению с оптимизированным
  74.         ;ex de,hl
  75.         else
  76.          
  77.         SQDELOOP
  78.         endif
  79.         endm
  80.        
  81.         macro SQHL
  82.         ld a,h
  83.         rlca
  84.         jr nc,$+2+3+3
  85.          xor a
  86.          sub l
  87.          ld l,a
  88.          sbc a,h
  89.          sub l
  90.          rlca ;"h"
  91.         if SQUARESQR
  92.         scf
  93.         rra
  94.         ld h,a
  95.         res 0,l
  96.         ;ex de,hl
  97.         ld e,(hl)
  98.         inc l
  99.         ld d,(hl)
  100.         ;ld a,l
  101.         ;cp 8 ;костыль для младшего бита
  102.         rl e;sla e
  103.         rl d
  104.         ;ld a,(hl)
  105.         ;inc l
  106.         ;ld h,(hl)
  107.         ;ld l,a
  108.         ;add hl,hl ;выигрыш 1 байт по сравнению с оптимизированным
  109.         ;ex de,hl
  110.         else
  111.          
  112.         ex de,hl
  113.         SQDE
  114.         endif
  115.         endm
  116.        
  117.         macro DIVLOOP
  118. ;(keep bc)
  119. ;hla = "0de"
  120. ;a = hla/bc0
  121. ;do 7 bits
  122. ;shift left hla, try sub, keep carry (inverted bit of result)
  123.         rla;add a,a
  124.         adc hl,hl ;no carry ;rl l нельзя
  125.         sbc hl,bc
  126.         jr nc,$+3
  127.         add hl,bc
  128.         rla
  129.         dup 7
  130.         adc hl,hl ;no carry
  131.         sbc hl,bc
  132.         jr nc,$+3
  133.         add hl,bc
  134.         rla
  135.         edup
  136.         cpl
  137.         ld d,a ;"res_l"
  138. ;hl = "de"
  139. ;a = hla/bc0
  140. ;do 7 bits
  141. ;shift left hla, try sub, keep carry (inverted bit of result)
  142.         dup 7
  143.         add hl,hl ;no carry
  144.         sbc hl,bc
  145.         jr nc,$+3
  146.         add hl,bc
  147.         rla
  148.         edup
  149.  
  150.         add hl,hl ;no carry
  151.         sbc hl,bc
  152.         ;jr nc,$+3
  153.         ;add hl,bc
  154.         rla
  155.         cpl
  156.         ld e,a
  157. ;out: de
  158.         endm
  159.  
  160.         macro DIVDEBC_POSITIVE
  161. ;(keep bc)
  162.         ld h,0
  163.         ld l,d
  164.         ld a,e
  165. ;hla = "0de"
  166.         DIVLOOP
  167. ;out: de
  168.         endm
  169.  
  170.         macro DIVDEBC_AXSIGN_NONEGBC
  171. ;(keep bc)
  172.         ld a,d
  173.         rla
  174.         jr nc,$+2+6;idivnonegde
  175.         xor a
  176.         sub e
  177.         ld e,a
  178.         sbc a,d
  179.         sub e
  180.         ld d,a
  181. ;idivnonegde
  182. ;out: de
  183. ;idiv_0de0_00bc
  184.         DIVDEBC_POSITIVE
  185.         ex af,af' ;M=разные знаки ;'
  186.         jp p,$+3+6;ret p
  187.         xor a
  188.         sub e
  189.         ld e,a
  190.         sbc a,d
  191.         sub e
  192.         ld d,a
  193.         ;ret
  194.         endm
  195.  
  196.         macro DIVDEBC_ASIGN
  197.         ex af,af' ;M=разные знаки ;'
  198.         ld a,b
  199.         rla
  200.         jr nc,$+2+6;idivnonegbc
  201.         xor a
  202.         sub c
  203.         ld c,a
  204.         sbc a,b
  205.         sub c
  206.         ld b,a
  207. ;idivnonegbc
  208.         DIVDEBC_AXSIGN_NONEGBC
  209.         endm
  210.  
  211.         macro ROOTHL
  212.         if 1==1
  213.     xor a
  214.     ld b,a
  215.  
  216.     ld e,l
  217.     ld l,h
  218.     ld h,a
  219.  
  220.     sla l;add hl,hl
  221.     sla l;add hl,hl
  222.     ;cp h
  223.     ;jr nc,$+5
  224.     ;dec h
  225.     ;ld a,4
  226.  
  227.     add hl,hl
  228.     add hl,hl
  229.     ld c,a
  230.     sub h
  231.     jr nc,$+6
  232.     cpl
  233.     ld h,a
  234.     inc c
  235.     inc c
  236.  
  237.     ld a,c
  238.     add hl,hl
  239.     add hl,hl
  240.     add a,a
  241.     ld c,a
  242.     sub h
  243.     jr nc,$+6
  244.     cpl
  245.     ld h,a
  246.     inc c
  247.     inc c
  248.  
  249.     ld a,c
  250.     add hl,hl
  251.     add hl,hl
  252.     add a,a
  253.     ld c,a
  254.     sub h
  255.     jr nc,$+6
  256.     cpl
  257.     ld h,a
  258.     inc c
  259.     inc c
  260.  
  261.     ld a,c
  262.     ld l,e
  263.  
  264.     add hl,hl
  265.     add hl,hl
  266.     add a,a
  267.     ld c,a
  268.     sub h
  269.     jr nc,$+6
  270.     cpl
  271.     ld h,a
  272.     inc c
  273.     inc c
  274.  
  275.     ld a,c
  276.     add hl,hl
  277.     add hl,hl
  278.     add a,a
  279.     ld c,a
  280.     sub h
  281.     jr nc,$+6
  282.     cpl
  283.     ld h,a
  284.     inc c
  285.     inc c
  286.  
  287.     ld a,c
  288.     add a,a
  289.     ld c,a
  290.     add hl,hl
  291.     add hl,hl
  292.     jr nc,$+6
  293.     sub h
  294.     jp $+6
  295.     sub h
  296.     jr nc,$+6
  297.     inc c
  298.     inc c
  299.     cpl
  300.     ld h,a
  301.  
  302.      ld e,1
  303.      
  304.     ld a,l
  305.     ld l,h
  306.     add a,a
  307.     ld h,a
  308.     adc hl,hl
  309.     adc hl,hl
  310.     sll c
  311.     rl b
  312.     sbc hl,bc
  313.     jr nc,$+3
  314.     add hl,bc
  315.     sbc a,a
  316.     ;add a,a
  317.     ;inc a
  318.      or e;1
  319.     add a,c
  320.     ld c,a
  321.  
  322. ;iteration 9
  323.     add hl,hl
  324.     add hl,hl
  325.     sll c
  326.     rl b
  327.     sbc hl,bc
  328.     jr nc,$+3
  329.     add hl,bc
  330.     sbc a,a
  331.     ;add a,a
  332.     ;inc a
  333.      or e;1
  334.     add a,c
  335.     ld c,a
  336.  
  337.     add hl,hl
  338.     add hl,hl
  339.     sll c
  340.     rl b
  341.     sbc hl,bc
  342.     jr nc,$+3
  343.     add hl,bc
  344.     sbc a,a
  345.     ;add a,a
  346.     ;inc a
  347.      or e;1
  348.     add a,c
  349.     ld c,a
  350.  
  351.     add hl,hl
  352.     add hl,hl
  353.     sll c
  354.     rl b
  355.     sbc hl,bc
  356.     jr nc,$+3
  357.     add hl,bc
  358.     sbc a,a ;0/-1
  359.     ;add a,a ;0/-2
  360.     ;inc a ;+1/-1
  361.      or e;1
  362.     add a,c
  363.     ;ld c,a
  364.  
  365.     ;add hl,hl
  366.     ;add hl,hl
  367.     ;sll c
  368.     ;rl b
  369.     ;sbc hl,bc
  370.     ;jr nc,$+3
  371.     ;add hl,bc
  372.     ;sbc a,a
  373.     ;add a,a
  374.     ;inc a
  375.     ;add a,c
  376.     ;ld c,a
  377. ;12th iteration completed
  378. ; output in BC
  379.     ;srl b
  380.     ;rr c
  381.     ld h,b
  382.     ld l,a;c
  383.        
  384.         else
  385.        
  386. ;root0hl0
  387.         or a ;NC
  388.         ld bc,64 ;c=64 (const), eb будет результат
  389.         ld a,l
  390.         ld l,h
  391.         ld h,b;0
  392.         ld e,b;0
  393.        
  394. ;0hla=00NN
  395.         dup 4
  396.         sbc hl,bc
  397.         jr nc,$+3
  398.         add hl,bc
  399.         ccf
  400.         rl b
  401.         rla
  402.         adc hl,hl
  403.         rla
  404.         adc hl,hl
  405.         edup
  406.        
  407. ;ahl0=0??0
  408.         sbc hl,bc
  409.         jr nc,$+3
  410.         add hl,bc
  411.         ccf
  412.         rl b
  413.         rl e
  414.         add hl,hl
  415.         rla
  416.         add hl,hl
  417.         rla
  418.         dup 3
  419.         sbc hl,bc
  420.         sbc a,e
  421.         jr nc,$+4
  422.         add hl,bc
  423.         adc a,e
  424.         ccf
  425.         rl b
  426.         rl e
  427.         add hl,hl
  428.         rla
  429.         add hl,hl
  430.         rla
  431.         edup
  432.        
  433. ;ahl0=???0
  434.         dup 3
  435.         sbc hl,bc
  436.         sbc a,e
  437.         jr nc,$+4
  438.         add hl,bc
  439.         adc a,e
  440.         ccf
  441.         rl b
  442.         rl e
  443.         add hl,hl
  444.         rla
  445.         add hl,hl
  446.         rla
  447.         edup
  448.         sbc hl,bc
  449.         sbc a,e
  450.         jr nc,$+4
  451.         add hl,bc
  452.         adc a,e
  453.         ccf
  454.         ;rl b
  455.         ;rl e
  456. ;eb=результат q=[sqrt N]
  457.         ld l,b
  458.         ld h,e
  459.         adc hl,hl
  460. ;out: hl ;NC
  461.         endif
  462.         endm
  463.  
  464.         macro MULDEBCLOOP
  465. ;0de * 0bc = (de * b)<<8 + (de * c) => ah
  466. ;a=b<<1
  467. ;keep de! (можно портить биты 0,15)
  468.         if SQUAREMUL
  469. ;d.e * b.c = 0.5*(d.e+b.c)^2 - 0.5*d.e^2 - 0.5*b.c^2
  470.         rra
  471.         ld b,a
  472.         res 0,c
  473.         ;set 7,d
  474.         ;res 0,e
  475.  
  476. ;адрес в таблице: %1hhhhhhh.lllllll0
  477.         if 1==1
  478.         ld h,d
  479.         ld l,e
  480.         add hl,bc ;d.e+b.c
  481.         ;ld ($+4),hl
  482.         ;ld hl,(0)
  483.         ;set 7,b
  484.         ;ld ($+6),bc
  485.         ;ld bc,(0)
  486.         ;sbc hl,bc
  487.         ;ld ($+6),de
  488.         ;ld bc,(0)
  489.         ;sbc hl,bc
  490.          set 7,b
  491.          ex de,hl
  492.          ld a,(bc)
  493.          inc c
  494.          add a,(hl)
  495.          inc l
  496.          ld lx,a
  497.          ld a,(bc)
  498.          adc a,(hl)
  499.          ld b,a ;0.5*d.e^2 + 0.5*b.c^2
  500.          ex de,hl
  501.         ld a,(hl) ;0.5*(d.e+b.c)^2
  502.         sub lx
  503.         inc l
  504.          ld c,a
  505.         ld a,(hl)
  506.         sbc a,b
  507.          ;ld h,c
  508.          ;add hl,hl ;11t = 1 s
  509. ;out: ah = 0.5*(d.e+b.c)^2 - 0.5*d.e^2 - 0.5*b.c^2
  510.         else
  511.        
  512.         ld h,d
  513.         ld l,e
  514.         add hl,bc ;d.e+b.c
  515.         ex de,hl
  516.         ld a,(de) ;0.5*(d.e+b.c)^2
  517.         inc e
  518.         sub (hl) ;0.5*d.e^2
  519.         inc l
  520.          ld lx,a
  521.         ld a,(de)
  522.         sbc a,(hl)
  523.          ld hx,a
  524.         ex de,hl
  525.         ;ix = 0.5*(d.e+b.c)^2 - 0.5*d.e^2
  526.         ld h,b
  527.         ld l,c
  528.         set 7,h
  529.         ld a,lx
  530.         sub (hl)
  531.         inc l
  532.          ld c,a
  533.         ld a,hx
  534.         sbc a,(hl)
  535.          ;ld h,c
  536. ;out: ac = 0.5*(d.e+b.c)^2 - 0.5*d.e^2 - 0.5*b.c^2
  537.         endif
  538.          
  539.         else
  540. ;hl=0
  541.         add a,a
  542.         add a,a
  543.         add a,a
  544.         jr nc,$+5;4
  545.          ld h,d
  546.          ld l,e
  547.          add hl,hl
  548.         add a,a
  549.         jr nc,$+3
  550.         add hl,de
  551.         dup 3;4
  552.         add hl,hl
  553.         add a,a
  554.         jr nc,$+3
  555.         add hl,de
  556.         edup
  557.         ld b,h ;b = hsb(de * b)
  558.         ld h,a;0 ;l = lsb(de * b)
  559. ;c*de => ahl
  560.          ld a,c
  561.          ld c,h;0
  562.         dup 7
  563.         add hl,hl
  564.         rla
  565.         jr nc,$+4
  566.         add hl,de
  567.         adc a,c;0
  568.         edup
  569.         add hl,hl
  570.         rla
  571.         jr nc,$+3;4
  572.         add hl,de
  573.         ;adc a,c;0
  574. ;ahl = (de * c) + lsb(de * b)<<8
  575.         adc a,b ;b = hsb(de * b)
  576.         endif
  577. ;out: ah
  578.         endm
  579.  
  580.         macro MULDEBC_SIGNED
  581. ;+de0 * +bc0 -> .de.
  582.         ld a,d
  583.         xor b
  584.         ex af,af' ;M=разные знаки '
  585.         ld a,d
  586.         rla
  587.         jr nc,$+2+6;mul_noneghld0
  588.         xor a
  589.         sub e
  590.         ld e,a
  591.         sbc a,d
  592.         sub e
  593.         ld d,a
  594. ;mul_noneghld0
  595.         ld a,b
  596.         add a,a
  597.         jr nc,$+2+6;mul_nonegbcx0
  598.         xor a
  599.         sub c
  600.         ld c,a
  601.         sbc a,b
  602.         sub c
  603.         ;ld b,a
  604.         add a,a
  605. ;mul_nonegbcx0
  606.         if SQUAREMUL
  607.         set 7,d
  608.         res 0,e
  609.         else
  610.         ld hl,0
  611.         endif
  612. ;0de * 0bc = (de * b)<<8 + (de * c) => de
  613. ;a=b<<1
  614.          ;ld a,b
  615.          ;add a,a
  616.         MULDEBCLOOP
  617.         if SQUAREMUL
  618.          ld e,c
  619.         else
  620.          ld e,h
  621.         endif
  622.          ld d,a
  623. ;out: de
  624.         ex af,af' ;M=разные знаки '
  625.         jp p,$+3+6;ret p
  626.         xor a
  627.         sub e
  628.         ld e,a
  629.         sbc a,d
  630.         sub e
  631.         ld d,a
  632.         endm
  633.  
  634.         macro MULDEBC
  635.         if fastest
  636.         MULDEBC_SIGNED
  637.         else
  638.         call muldebc
  639.         endif
  640.         endm
  641.  
  642.         macro MULDEBC_TOIY
  643.         if 1==0
  644.         MULDEBC
  645.         ld hy,d
  646.         ld ly,e
  647.         else
  648. ;+de0 * +bc0 -> .iy.
  649.         ld a,d
  650.         xor b
  651.         ex af,af' ;M=разные знаки '
  652.         ld a,d
  653.         rla
  654.         jr nc,$+2+6;mul_noneghld0
  655.         xor a
  656.         sub e
  657.         ld e,a
  658.         sbc a,d
  659.         sub e
  660.         ld d,a
  661. ;mul_noneghld0
  662.         ld a,b
  663.         add a,a
  664.         jr nc,$+2+6;mul_nonegbcx0
  665.         xor a
  666.         sub c
  667.         ld c,a
  668.         sbc a,b
  669.         sub c
  670.         ;ld b,a
  671.         add a,a
  672. ;mul_nonegbcx0
  673.         if SQUAREMUL
  674.         set 7,d
  675.         res 0,e
  676.         else
  677.         ld hl,0
  678.         endif
  679. ;0de * 0bc = (de * b)<<8 + (de * c)
  680. ;b*de => hl
  681.          ;ld a,b
  682.          ;add a,a
  683.         MULDEBCLOOP
  684.         if SQUAREMUL
  685.          ld b,a;hy,a
  686. ;out: iy
  687.         ex af,af' ;M=разные знаки '
  688.         jp p,$+3+6;8;ret p
  689.         xor a
  690.         sub c
  691.         ld c,a
  692.         sbc a,b;hy
  693.         sub c
  694.         ld b,a;hy,a
  695.         ld hy,b
  696.         ld ly,c
  697.         else
  698.          ld e,h
  699.          ld hy,a
  700. ;out: iy
  701.         ex af,af' ;M=разные знаки '
  702.         jp p,$+3+8;ret p
  703.         xor a
  704.         sub e
  705.         ld e,a
  706.         sbc a,hy
  707.         sub e
  708.         ld hy,a
  709.         ld ly,e
  710.         endif
  711.         endif
  712.         endm
  713.  
  714.         macro MULDEBC_POSITIVE
  715.         if SQUAREMUL
  716.         set 7,d
  717.         res 0,e
  718.         else
  719.         ld hl,0
  720.         endif
  721. ;0de * 0bc = (de * b)<<8 + (de * c)
  722. ;b*de => hl
  723.         ld a,b
  724.         add a,a
  725.         MULDEBCLOOP
  726.         if SQUAREMUL
  727.          ld e,c
  728.         else
  729.          ld e,h
  730.         endif
  731.          ld d,a
  732. ;out: de
  733.         endm
  734.  
  735.         macro MULDEBC_TOHL_POSITIVE
  736.         if SQUAREMUL
  737.         set 7,d
  738.         res 0,e
  739.         else
  740.         ld hl,0
  741.         endif
  742. ;0de * 0bc = (de * b)<<8 + (de * c)
  743. ;b*de => hl
  744.         ld a,b
  745.         add a,a
  746.         MULDEBCLOOP
  747.         if SQUAREMUL
  748.          ld l,c
  749.         else
  750.          ld l,h
  751.         endif
  752.          ld h,a
  753. ;out: hl
  754.         endm
  755.  
  756.         macro MULDEBC_TOHL_DEPOSITIVE
  757.         if SQUAREMUL
  758.         set 7,d
  759.         res 0,e
  760.         endif
  761. ;+de0 * +bc0 -> .hl. (keeps de)
  762.         xor a
  763.         if !SQUAREMUL
  764.         ld l,a
  765.         ld h,a
  766.         endif
  767.         xor b
  768.         ex af,af' ;M=разные знаки '
  769.         ld a,b
  770.         add a,a
  771.         jr nc,$+2+6;mul_nonegbcx0
  772.         xor a
  773.         sub c
  774.         ld c,a
  775.         sbc a,b
  776.         sub c
  777.         ;ld b,a
  778.         add a,a
  779. ;mul_nonegbcx0
  780. ;0de * 0bc = (de * b)<<8 + (de * c)
  781. ;b*de => hl
  782.          ;ld a,b
  783.          ;add a,a
  784.         MULDEBCLOOP
  785.         if SQUAREMUL
  786.          ld l,c
  787.         else
  788.          ld l,h
  789.         endif
  790.          ld h,a
  791. ;out: HL
  792.         ex af,af' ;M=разные знаки '
  793.         jp p,$+3+6;ret p
  794.         xor a
  795.         sub l
  796.         ld l,a
  797.         sbc a,h
  798.         sub l
  799.         ld h,a
  800.         endm
  801.