?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1.  ifndef included_mul32
  2.  define included_mul32
  3.  include "../../common/mul16.asm"
  4. var_z=xOP3+16
  5. z0_64=var_z
  6. z2_64=z0_64+8
  7. z0_32=z2_64+8
  8. z2_32=z0_32+4
  9.  
  10. mul32:
  11. ;max: 703cc  + 3*mul16
  12. ;     2704cc
  13. ;min: 655cc  + 3*mul16
  14. ;     1297cc
  15. ;avg: 673.25cc+3*mul16
  16. ;     2307.911cc
  17. ;DEHL * BCIX
  18.   push de
  19.   push bc
  20.   push hl
  21.   push ix
  22.   call mul16  ;DEHL
  23.   ld (z2_32),hl
  24.   ld (z2_32+2),de
  25.  
  26.   pop de
  27.   pop bc
  28. ;  push bc
  29.   push de
  30.   call mul16  ;DEHL
  31.   ld (z0_32),hl
  32.   ld (z0_32+2),de
  33.  
  34.   pop de    ;low word
  35. ;  pop bc    ;low word
  36.   pop hl
  37.   xor a
  38.   sbc hl,de
  39.   jr nc,mul32_p1;+_
  40.   sub l
  41.   ld l,a
  42.   sbc a,a
  43.   sub h
  44.   ld h,a
  45.   xor a
  46.   inc a
  47. mul32_p1;_:
  48.   ex de,hl
  49.   pop hl
  50.   sbc hl,bc
  51.   jr nc,mul32_p2;+_
  52.   ld b,a
  53.   xor a
  54.   sub l
  55.   ld l,a
  56.   sbc a,a
  57.   sub h
  58.   ld h,a
  59.   ld a,b
  60.   inc a
  61. mul32_p2;_:
  62.   ld b,h
  63.   ld c,l
  64.   push af
  65.   call mul16
  66.   pop af    ;holds the sign in the low bit
  67.   rra
  68.   jr c,mul32_add
  69. ;need to perform z0+z2-result
  70.   push de
  71.   push hl
  72.   xor a
  73.   ld hl,(z0_32)
  74.   ld bc,(z2_32)
  75.   add hl,bc
  76.   ex de,hl
  77.   ld hl,(z0_32+2)
  78.   ld bc,(z2_32+2)
  79.   adc hl,bc
  80.   rla
  81. ;now need to subtract
  82.   ex de,hl
  83.   pop bc
  84.   sbc hl,bc
  85.   ex de,hl
  86.   pop bc
  87.   sbc hl,bc
  88.   sbc a,0
  89. ;A:HL:DE is the result, need to add to z0_32+2
  90. mul32_final:
  91.   ld bc,(z0_32+2)
  92.   ex de,hl
  93.   add hl,bc
  94.   ld (z0_32+2),hl
  95.   ld hl,(z2_32)
  96.   adc hl,de
  97.   ld (z2_32),hl
  98.   ld hl,z2_32+2
  99.   adc a,(hl)
  100.   ld (hl),a
  101.   ret nc
  102.   inc hl
  103.   inc (hl)
  104.   ret
  105. mul32_add:
  106. ;add to the current result
  107.   xor a
  108.   ld bc,(z0_32)
  109.   add hl,bc
  110.   ex de,hl
  111.   ld bc,(z0_32+2)
  112.   adc hl,bc
  113.   rla
  114.   ex de,hl
  115.   ld bc,(z2_32)
  116.   add hl,bc
  117.   ex de,hl
  118.   ld bc,(z2_32+2)
  119.   adc hl,bc
  120.   adc a,0
  121.   jp mul32_final
  122.  endif
  123.