home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / grafik / vifs / mul4f.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-19  |  1.9 KB  |  85 lines

  1. /*
  2.  *    mul4f.c  -- fixed point multiply, 2 byte fraction
  3.  *
  4.  *    15 june 1989  Olle
  5.  */
  6.  
  7. #pragma inline
  8.  
  9. /* There is no way to get half a parameter into a register, do it by hand */
  10. #define lswa bp+4
  11. #define mswa bp+6
  12. #define lswb bp+8
  13. #define mswb bp+10
  14.  
  15. /*long mul4f( long a, long b );*/
  16.  
  17. /* You can't return (ax:dx) so pretend it is a void function */
  18. void mul4f( long a, long b );
  19.  
  20. void mul4f( long a, long b )
  21. {
  22.                     /* cx accumulates msw, bx lsw */
  23. asm    mov    ax, word ptr [mswa]    /* msw a */
  24. asm    cmp    ax, 0
  25. asm    jz    mua0            /* 0 * b = 0 */
  26.  
  27. asm    cmp    word ptr [mswb], 0    /* msw b */
  28. asm    jz    mub0
  29.  
  30. asm    mul    word ptr [mswb]        /* msw b */
  31. asm    mov    cx, ax            /* lsw of mul */
  32.  
  33. asm    mov    ax, word ptr [lswa]    /* lsw a */
  34. asm    mul    word ptr [lswb]        /* lsw b */
  35. asm    mov    bx, dx            /* msw of mul */
  36.  
  37. asm    mov    ax, word ptr [mswa]    /* msw a */
  38. asm    mul    word ptr [lswb]        /* lsw b */
  39. asm    add    bx, ax            /* add partial result */
  40. asm    adc    cx, dx
  41.  
  42. asm    mov    ax, word ptr [mswb]    /* msw b */
  43. asm    mul    word ptr [lswa]        /* lsw a */
  44. asm    add    ax, bx            /* add partial result */
  45. asm    adc    dx, cx            /* result in dx:ax */
  46.  
  47. return;
  48.     
  49. mua0:                    /* msw a is zero */
  50.  
  51. asm    mov    ax, word ptr [lswa]    /* lsw a */
  52. asm    mul    word ptr [lswb]        /* lsw b */
  53. asm    mov    bx, dx            /* msw of mul */
  54.  
  55. asm    mov    ax, word ptr [mswb]    /* msw b */
  56. asm    cmp    ax, 0
  57. asm    jz    mua1            /* msw b is also zero */
  58.  
  59. asm    mul    word ptr [lswa]        /* lsw a */
  60. asm    add    ax, bx            /* add partial result */
  61. asm    adc    dx, 0            /* result in dx:ax */
  62.  
  63. return;
  64.     
  65. mua1:
  66. asm    mov    ax, bx            /* both msws are zero */
  67. asm    xor    dx, dx            /* result in dx:ax */
  68.  
  69. return;
  70.  
  71. mub0:                    /* msw b is zero, but not msw a */
  72.  
  73. asm    mov    ax, word ptr [lswa]    /* lsw a */
  74. asm    mul    word ptr [lswb]        /* lsw b */
  75. asm    mov    bx, dx            /* msw of mul */
  76.  
  77. asm    mov    ax, word ptr [mswa]    /* msw a */
  78. asm    mul    word ptr [lswb]        /* lsw b */
  79.  
  80. asm    add    ax, bx            /* add partial result */
  81. asm    adc    dx, 0            /* result in dx:ax */
  82.  
  83. return;
  84. }
  85.