home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / LONG.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  3KB  |  204 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Runtime Library                    *
  5. ; *    Longint Arithmetic Routines            *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,90 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    LONG
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT    WORD PUBLIC
  16.  
  17. ; Externals
  18.  
  19.     EXTRN    Test8086:BYTE
  20.  
  21. DATA    ENDS
  22.  
  23. CODE    SEGMENT    BYTE PUBLIC
  24.  
  25.     ASSUME    CS:CODE,DS:DATA
  26.  
  27. ; Externals
  28.  
  29.     EXTRN    HaltError:NEAR
  30.  
  31. ; Publics
  32.  
  33.     PUBLIC    LongMul,LongDiv,LongShr,LongShl
  34.  
  35. ; Longint multiply
  36. ; In    DX:AX = 1st operand
  37. ;    BX:CX = 2nd operand
  38. ; Out    DX:AX = Result
  39.  
  40. LongMul:
  41.  
  42.     CMP    Test8086,2
  43.     JB    @@1
  44.     .386
  45.     SHL    EAX,16
  46.     SHRD    EAX,EDX,16
  47.     SHL    ECX,16
  48.     SHRD    ECX,EBX,16
  49.     IMUL    ECX
  50.     SHLD    EDX,EAX,16
  51.     RETF
  52.     .8086
  53. @@1:    MOV    SI,AX
  54.     MOV    DI,DX
  55.     MUL    CX
  56.     PUSH    AX
  57.     PUSH    DX
  58.     MOV    AX,SI
  59.     MUL    BX
  60.     MOV    BX,AX
  61.     MOV    AX,DI
  62.     MUL    CX
  63.     MOV    CX,AX
  64.     POP    DX
  65.     POP    AX
  66.     ADD    DX,BX
  67.     ADD    DX,CX
  68.     RETF
  69.  
  70. ; Longint division
  71. ; In    DX:AX = 1st operand
  72. ;    BX:CX = 2nd operand
  73. ; Out    DX:AX = Result
  74. ;    BX:CX = Remainder
  75.  
  76. LongDiv:
  77.  
  78.     CMP    Test8086,2
  79.     JB    @@0
  80.     .386
  81.     SHL    EAX,16
  82.     SHRD    EAX,EDX,16
  83.     SHL    ECX,16
  84.     SHRD    ECX,EBX,16
  85.     JE    SHORT @@9a
  86.     CDQ
  87.     IDIV    ECX
  88.     MOV    ECX,EDX
  89.     SHLD    EDX,EAX,16
  90.     SHLD    EBX,ECX,16
  91.     RETF
  92.     .8086
  93. @@0:    PUSH    BP
  94.     XOR    BP,BP
  95.     OR    DX,DX
  96.     JNS    @@1
  97.     INC    BP
  98.     NEG    AX
  99.     ADC    DX,0
  100.     NEG    DX
  101. @@1:    OR    BX,BX
  102.     JE    @@5
  103.     JNS    @@2
  104.     INC    BP
  105.     INC    BP
  106.     NEG    CX
  107.     ADC    BX,0
  108.     NEG    BX
  109.     JE    @@5a
  110. @@2:    PUSH    BP
  111.     MOV    SI,CX
  112.     MOV    DI,BX
  113.     XOR    BX,BX
  114.     MOV    CX,DX
  115.     MOV    DX,AX
  116.     XOR    AX,AX
  117.     MOV    BP,16
  118. @@3:    SHL    AX,1
  119.     RCL    DX,1
  120.     RCL    CX,1
  121.     RCL    BX,1
  122.     INC    AX
  123.     SUB    CX,SI
  124.     SBB    BX,DI
  125.     JNC    @@4
  126.     DEC    AX
  127.     ADD    CX,SI
  128.     ADC    BX,DI
  129. @@4:    DEC    BP
  130.     JNE    @@3
  131.     POP    BP
  132.     JMP    SHORT @@6
  133. @@9:    POP    BP
  134. @@9a:    MOV    AX,200
  135.     JMP    HaltError
  136. @@5:    JCXZ    @@9
  137. @@5a:    XCHG    AX,BX
  138.     XCHG    AX,DX
  139.     DIV    CX
  140.     XCHG    AX,BX
  141.     DIV    CX
  142.     MOV    CX,DX
  143.     MOV    DX,BX
  144.     XOR    BX,BX
  145. @@6:    SHR    BP,1
  146.     JNC    @@7
  147.     NEG    CX
  148.     ADC    BX,0
  149.     NEG    BX
  150.     INC    BP
  151. @@7:    DEC    BP
  152.     JNE    @@8
  153.     NEG    AX
  154.     ADC    DX,0
  155.     NEG    DX
  156. @@8:    POP    BP
  157.     RETF
  158.  
  159. ; Longint shift right
  160. ; In    DX:AX = Value
  161. ;    CX    = Shift count
  162. ; Out    DX:AX = Result
  163.  
  164. LongShr:
  165.  
  166.     CMP    Test8086,2
  167.     JB    @@1
  168.     .386
  169.     SHRD    AX,DX,CL
  170.     SHR    DX,CL
  171.     RETF
  172.     .8086
  173. @@1:    AND    CX,1FH
  174.     JE    @@3
  175. @@2:    SHR    DX,1
  176.     RCR    AX,1
  177.     LOOP    @@2
  178. @@3:    RETF
  179.  
  180. ; Longint shift left
  181. ; In    DX:AX = Value
  182. ;    CX    = Shift count
  183. ; Out    DX:AX = Result
  184.  
  185. LongShl:
  186.  
  187.     CMP    Test8086,2
  188.     JB    @@1
  189.     .386
  190.     SHLD    DX,AX,CL
  191.     SHL    AX,CL
  192.     RETF
  193.     .8086
  194. @@1:    AND    CX,1FH
  195.     JE    @@3
  196. @@2:    SHL    AX,1
  197.     RCL    DX,1
  198.     LOOP    @@2
  199. @@3:    RETF
  200.  
  201. CODE    ENDS
  202.  
  203.     END
  204.