home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / OWL1.PAK / OWLMATH.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  2KB  |  114 lines

  1. // ObjectWindows - (C) Copyright 1992 by Borland International
  2.  
  3. /* --------------------------------------------------------
  4.   OWLMATH.CPP
  5.   Math support for scroller.cpp
  6.   -------------------------------------------------------- */
  7.  
  8. #include   <windows.h>
  9.  
  10. #pragma inline
  11.  
  12. struct Quadword {
  13.   WORD w0, w1, w2, w3;
  14. };
  15.  
  16. /* LongMulDiv multiplies the first two arguments and then
  17.   divides by the third.  This is used so that real number arithmetic
  18.   is not necessary.  This routine saves the possible 64-bit value in
  19.   a temp before doing the divide.  Does not do error checking like
  20.   divide by zero.  Also assumes that the result is in the 32-bit range
  21.   (Actually 31-bit, since this algorithm is for unsigned). */
  22. long LongMulDiv(long Mult1, long Mult2, long Div1)
  23. {
  24.   Quadword Temp;
  25.   WORD WTemp1, WTemp2;
  26.  
  27.   asm {
  28.     MOV DX, Mult1.w1
  29.     MOV AX, Mult1.w0
  30.     MOV CX, Mult2.w1
  31.     MOV BX, Mult2.w0
  32.  
  33.     MOV DI,DX
  34.     MOV     SI,AX
  35.     MUL     BX
  36.     MOV     Temp.w0,AX
  37.     MOV     Temp.w1,DX
  38.  
  39.     MOV     AX,DI
  40.     MUL     CX
  41.     MOV     Temp.w2,AX
  42.     MOV     Temp.w3,DX
  43.     MOV     AX,DI
  44.     MUL     BX
  45.     ADD     Temp.w1,AX
  46.     ADC     Temp.w2,DX
  47.         ADC     WORD PTR Temp.w3,0
  48.  
  49.         MOV     AX,SI
  50.         MUL     CX
  51.         ADD     Temp.w1,AX
  52.         ADC     Temp.w2,DX
  53.         ADC     WORD PTR Temp.w3,0
  54.  
  55.     MOV    DX,Temp.w3
  56.     MOV    SI,Temp.w2
  57.     MOV    BX,Temp.w1
  58.     MOV    AX,Temp.w0
  59.  
  60.     MOV    CX,Div1.w1              /* Adjust for rounding */
  61.     MOV    DI,Div1.w0
  62.     SHR    CX,1
  63.         RCR    DI,1
  64.         ADD    AX,DI
  65.     ADC    BX,CX
  66.     ADC    SI,0
  67.     ADC    DX,0
  68.  
  69.         MOV     CX,32          /* Div */
  70.         CLC
  71.   }
  72. Label1:
  73.   asm {
  74.       RCL     AX,1
  75.         RCL     BX,1
  76.         RCL     SI,1
  77.         RCL     DX,1
  78.         JNC     Label3
  79.   }
  80. Label2:
  81.   asm {
  82.         SUB    SI,Div1.w0
  83.         SBB    DX,Div1.w1
  84.         STC
  85.         LOOP    Label1
  86.         JMP     Label5
  87.   }
  88. Label3:
  89.   asm {
  90.         CMP     DX,Div1.w1
  91.         JC      Label4
  92.         JNE     Label2
  93.         CMP     SI,Div1.w0
  94.         JNC     Label2
  95.   }
  96. Label4:
  97.   asm {
  98.         CLC
  99.         LOOP    Label1
  100.   }
  101. Label5:
  102.   asm {
  103.         RCL     AX,1
  104.         RCL     BX,1
  105.  
  106.         MOV     CX,SI
  107.         MOV     DX,BX
  108.   }
  109.   WTemp1 = _AX;
  110.   WTemp2 = _DX;
  111.   return MAKELONG(WTemp1, WTemp2);
  112. }
  113.  
  114.