Advertisement
Zeda

sqrt0.32

Oct 16th, 2017
556
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;#define DEBUG
  2. _DispHL = 4507h
  3. _NewLine = 452Eh
  4. #define bcall(x) rst 28h \ .dw x
  5. scrap = 8000h
  6. var_c = scrap
  7. var_x = scrap+8
  8. out   = scrap+8
  9. .db $BB,$6D
  10. .org $9D95
  11.     ld hl,c0
  12.     ld de,scrap
  13.     ldi
  14.     ldi
  15.     ldi
  16.     ldi
  17.     di
  18.     call +_
  19.     ret
  20. _:
  21. ;sqrt16+H_Times_E+mul16+divsub_1+divsub_0
  22. ;+513+{0,3}+{0,18+{0,1}}+{0,19}+{0,1}+{0,19+{0,42}}
  23. ;min:513+318+190+359+1066+406
  24. ;max:616+351+242+717+1306+466
  25. ;avg:553.75+334.5+216+596.34375cc+1222+448.5
  26. ;min: 2852
  27. ;max: 3698
  28. ;avg: 3371.09375cc
  29.  
  30.     ld hl,(scrap) \ ld (scrap+4),hl
  31.     ld hl,(scrap+2)
  32.     call sqrt16
  33.     ;a is the first 8 bits
  34.     ld (out+3),a
  35.     ld h,a
  36.     ld e,a
  37.     call H_Times_E
  38.     ex de,hl
  39.     ld hl,(scrap+2)
  40.     sbc hl,de
  41.     push af
  42.     srl h
  43.     rr l
  44. .echo "Maybe round here?"
  45.     pop af
  46.     push af
  47.     ld a,l
  48.     jr nc,$+4
  49.     neg
  50.     ld bc,(out+3)
  51.     ;a/c, to 8 bits prec round -> (out+2)
  52.     call divsub_0
  53.     ld a,(out+3)
  54.     ld h,a
  55.     pop af
  56.     jr nc,+_
  57.     xor a
  58.     sub l
  59.     ld l,a
  60.     jr c,$+3
  61.     dec h
  62. _:
  63.     ld (out+2),hl
  64.     ex de,hl \ ld b,d \ ld c,e
  65.     call mul16
  66.     ld b,h \ ld c,l \ ld hl,(var_c) \ or a \ sbc hl,de
  67.     ex de,hl
  68.     ld hl,(var_c+2) \ sbc hl,bc
  69.     push af ;contains overflow info
  70.     jr nc,$+8
  71.     xor a
  72.     sub e
  73.     ld e,a
  74.     sbc a,a
  75.     sub d
  76.     ld d,a
  77.     srl d
  78.     rr e
  79.     jr nc,$+3
  80.     inc de
  81.     ld hl,(var_x+2)
  82.     ex de,hl
  83.     call divsub_1
  84.     pop af
  85.     jr nc,+_
  86.     xor a
  87.     ld h,a
  88.     ld l,a
  89.     sbc hl,bc
  90.     ld (var_x),hl
  91.     ret nc
  92.     ld hl,(var_x+2)
  93.     dec hl
  94.     ld (var_x+2),hl
  95.     ret
  96. _:
  97.     ld (var_x),bc
  98.     ret
  99.  
  100. divsub_1:
  101. ;min: 1066cc
  102. ;max: 1306cc
  103. ;avg: 1222cc
  104.     call +_
  105.     rla
  106.     cpl
  107.     ld b,a
  108.     call +_
  109.     rla
  110.     cpl
  111.     ld c,a
  112.     ret
  113. _:
  114. ;min: 499
  115. ;max: 619
  116. ;avg: 577
  117.     call +_+1
  118.     call +_
  119.     call +_
  120.     call +_
  121.     call +_
  122.     call +_
  123.     call +_
  124. _:
  125. ;min: 48
  126. ;max: 63
  127. ;avg: 57.75
  128.  
  129.     rla
  130.     add hl,hl
  131.     jr c,$+7
  132.     sbc hl,de
  133.     ret nc
  134.     add hl,de
  135.     ret
  136.     or a
  137.     sbc hl,de
  138.     or a
  139.     ret
  140. mul16:
  141. ;min: 359cc
  142. ;max: 717cc
  143. ;avg: 596.34375cc
  144. ;92 bytes
  145.     ld a,c
  146.     call DE_Times_A
  147.     push hl
  148.     push af
  149.     ld a,b
  150.     call DE_Times_A+2
  151.     pop bc
  152.     pop de
  153. ;AHL
  154. ; BDE
  155.     ld c,d
  156.     add hl,bc
  157.     adc a,0
  158. ;AHLE
  159.     ld d,l
  160.     ld l,h
  161.     ld h,a
  162. ;HLDE
  163.     ret
  164. DE_Times_A:
  165. ;Input: DE,A
  166. ;Output: A:HL is the product, C=0, B,DE unaffected, z flag set if result is zero, c flag set if A is input as 1, else nc.
  167. ;A:128~255 219+6{0,10}+{0,19}    avg=258.5   *1/2
  168. ;A:64~127  203+5{0,10}+{0,19}    avg=237.5   *1/4
  169. ;A:32~63   187+4{0,10}+{0,19}    avg=216.5   *1/8
  170. ;A:16~31   171+3{0,10}+{0,19}    avg=195.5   *1/16
  171. ;A:8~15    155+2{0,10}+{0,19}    avg=174.5   *1/32
  172. ;A:4~7     139+{0,10}+{0,19}     avg=153.5   *1/64
  173. ;A:2~3     123+{0,19}            avg=132.5   *1/128
  174. ;A:1       107cc                 avg=107     *1/256
  175. ;A:0       119cc                 avg=119     *1/256
  176. ;overall avg: 237.671875cc
  177.     ld c,0
  178.     ld h,d
  179.     ld l,e
  180.     rla \ jr c,mul_07
  181.     rla \ jr c,mul_06
  182.     rla \ jr c,mul_05
  183.     rla \ jr c,mul_04
  184.     rla \ jr c,mul_03
  185.     rla \ jr c,mul_02
  186.     rla \ jr c,mul_01
  187.     rla
  188.     ret c
  189.     ld h,a
  190.     ld l,a
  191.     ret
  192. mul_07:
  193.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  194. mul_06:
  195.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  196. mul_05:
  197.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  198. mul_04:
  199.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  200. mul_03:
  201.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  202. mul_02:
  203.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,c
  204. mul_01:
  205.     add hl,hl \ rla \ ret nc \ add hl,de \ adc a,c
  206.     ret
  207. divsub_0:
  208. ;A_div_C
  209. ;min: 406
  210. ;max: 466
  211. ;min: 448.5
  212.     ld l,0
  213.     add a,a \ jr c,$+5 \ cp c \ jr c,$+5 \ sub c \ ld l,2
  214.     add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  215.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  216.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  217.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  218.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  219.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  220.     sla l \ add a,a \ jr c,$+5 \ cp c \ jr c,$+4 \ sub c \ inc l
  221.     add a,a \ jr c,$+4 \ cp c \ ret c \ inc l
  222.     ret
  223. H_Times_E:
  224. ;min: 190
  225. ;max: 242
  226. ;avg: 216c
  227.     ld d,0
  228.     ld l,d
  229.     sla h \ jr nc,$+3 \ ld l,e
  230.     add hl,hl \ jr nc,$+3 \ add hl,de
  231.     add hl,hl \ jr nc,$+3 \ add hl,de
  232.     add hl,hl \ jr nc,$+3 \ add hl,de
  233.     add hl,hl \ jr nc,$+3 \ add hl,de
  234.     add hl,hl \ jr nc,$+3 \ add hl,de
  235.     add hl,hl \ jr nc,$+3 \ add hl,de
  236.     add hl,hl \ ret nc \ add hl,de \ ret  
  237. sqrt16:
  238. ;source: John Metcalf, http://www.retroprogramming.com/2017/07/a-fast-z80-integer-square-root.html
  239. ; call with hl = number to square root
  240. ; returns    a = square root
  241. ; corrupts  hl, de
  242. ;318cc+{0,6}+{0,6}+{0,6}+{0,6}+{0,3}+{0,3}+{0,3}
  243. ;min:318cc
  244. ;max:351cc
  245. ;avg:334.5cc
  246.   ld a,h
  247.   ld de,0B0C0h
  248.   add a,e
  249.   jr c,sq7
  250.   ld a,h
  251.   ld d,0F0h
  252. sq7:
  253.  
  254. ; ----------
  255.  
  256.   add a,d
  257.   jr nc,sq6
  258.   res 5,d
  259.   .db 254
  260. sq6:
  261.   sub d
  262.   sra d
  263.  
  264. ; ----------
  265.  
  266.   set 2,d
  267.   add a,d
  268.   jr nc,sq5
  269.   res 3,d
  270.   .db 254
  271. sq5:
  272.   sub d
  273.   sra d
  274.  
  275. ; ----------
  276.  
  277.   inc d
  278.   add a,d
  279.   jr nc,sq4
  280.   res 1,d
  281.   .db 254
  282. sq4:
  283.   sub d
  284.   sra d
  285.   ld h,a
  286.  
  287. ; ----------
  288.  
  289.   add hl,de
  290.   jr nc,sq3
  291.   ld e,040h
  292.   .db 210
  293. sq3:
  294.   sbc hl,de
  295.   sra d
  296.   ld a,e
  297.   rra
  298.  
  299. ; ----------
  300.  
  301.   or 010h
  302.   ld e,a
  303.   add hl,de
  304.   jr nc,sq2
  305.   and 0DFh
  306.   .db 218
  307. sq2:
  308.   sbc hl,de
  309.   sra d
  310.   rra
  311.  
  312. ; ----------
  313.  
  314.   or 04h
  315.   ld e,a
  316.   add hl,de
  317.   jr nc,sq1
  318.   and 0F7h
  319.   .db 218
  320. sq1:
  321.   sbc hl,de
  322.   sra d
  323.   rra
  324.  
  325. ; ----------
  326.  
  327.   inc a
  328.   ld e,a
  329.   add hl,de
  330.   jr nc,sq0
  331.   and 0FDh
  332. sq0:
  333.   sra d
  334.   rra
  335.   cpl
  336.   ret
  337.  
  338. c0:
  339. ;format is:
  340. ;   1 byte for the exponent, with +128 bias
  341. ;   Next 31 bits is the exponent
  342. ;   Next bit is sign
  343.     .db $77,$77,$77,$47
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement