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

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Runtime Library                    *
  5. ; *    Real Kernel Routines                *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,90 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    FP48
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CODE    SEGMENT    BYTE PUBLIC
  16.  
  17.     ASSUME    CS:CODE
  18.  
  19. ; Publics
  20.  
  21.     PUBLIC    RealAdd,RealSub,RealMul,RealDiv,RealCmp
  22.     PUBLIC    RealFloat,RealTrunc
  23.  
  24. ; The 6-byte real kernel routines operate on two floating point
  25. ; pseudo-registers, referred to as R1 and R2. Each pseudo-register
  26. ; is the concatenation of three 8086 registers. R1 is DX:BX:AX,
  27. ; and R2 is DI:SI:CX.
  28.  
  29. ; Real subtraction
  30. ; In    R1 = 1st operand
  31. ;    R2 = 2nd operand
  32. ; Out    R1 = Result
  33. ;    CF = 1 if overflow
  34. ; Uses    CX,SI,DI
  35.  
  36. RealSub:
  37.  
  38.     XOR    DI,8000H
  39.  
  40. ; Real addition
  41. ; In    R1 = 1st operand
  42. ;    R2 = 2nd operand
  43. ; Out    R1 = Result
  44. ;    CF = 1 if overflow
  45. ; Uses    CX,SI,DI
  46.  
  47. RealAdd:
  48.  
  49.     OR    CL,CL
  50.     JE    @@8
  51.     OR    AL,AL
  52.     JE    @@9
  53.     CMP    AL,CL
  54.     JBE    @@1
  55.     XCHG    AX,CX
  56.     XCHG    BX,SI
  57.     XCHG    DX,DI
  58. @@1:    SUB    AL,CL
  59.     NEG    AL
  60.     CMP    AL,41
  61.     JAE    @@9
  62.     XCHG    AL,CL
  63.     PUSH    BP
  64.     PUSH    AX
  65.     MOV    AH,DH
  66.     AND    AH,80H
  67.     MOV    BP,AX
  68.     XOR    AX,DI
  69.     POP    AX
  70.     PUSHF
  71.     MOV    AL,0
  72.     OR    DH,80H
  73.     OR    DI,8000H
  74. @@2:    CMP    CL,8
  75.     JB    @@3
  76.     MOV    AL,AH
  77.     MOV    AH,BL
  78.     MOV    BL,BH
  79.     MOV    BH,DL
  80.     MOV    DL,DH
  81.     XOR    DH,DH
  82.     SUB    CL,8
  83.     JMP    @@2
  84. @@3:    OR    CL,CL
  85.     JE    @@5
  86. @@4:    SHR    DX,1
  87.     RCR    BX,1
  88.     RCR    AX,1
  89.     DEC    CL
  90.     JNE    @@4
  91. @@5:    POPF
  92.     JS    @@12
  93.     ADD    AX,CX
  94.     ADC    BX,SI
  95.     ADC    DX,DI
  96.     MOV    CX,BP
  97.     POP    BP
  98.     JNC    @@6
  99.     RCR    DX,1
  100.     RCR    BX,1
  101.     RCR    AX,1
  102.     INC    CL
  103.     JE    @@11
  104. @@6:    ADD    AX,80H
  105.     ADC    BX,0
  106.     ADC    DX,0
  107.     JC    @@10
  108. @@7:    MOV    AL,CL
  109.     AND    DH,7FH
  110.     OR    DH,CH
  111. @@8:    RET
  112. @@9:    MOV    AX,CX
  113.     MOV    BX,SI
  114.     MOV    DX,DI
  115.     RET
  116. @@10:    RCR    DX,1
  117.     INC    CL
  118.     JNE    @@7
  119. @@11:    STC
  120.     RET
  121. @@12:    SUB    AX,CX
  122.     SBB    BX,SI
  123.     SBB    DX,DI
  124.     MOV    CX,BP
  125.     POP    BP
  126.     JNC    @@13
  127.     NOT    DX
  128.     NOT    BX
  129.     NEG    AX
  130.     CMC
  131.     ADC    BX,0
  132.     ADC    DX,0
  133.     XOR    CH,80H
  134. @@13:    MOV    DI,DX
  135.     OR    DI,BX
  136.     OR    DI,AX
  137.     JE    @@8
  138. @@14:    OR    DH,DH
  139.     JS    @@6
  140.     SHL    AX,1
  141.     RCL    BX,1
  142.     RCL    DX,1
  143.     DEC    CL
  144.     JNE    @@14
  145.  
  146. ; Return zero
  147.  
  148. ExitZero1:
  149.  
  150.     JMP    ExitZero
  151.  
  152. ; Real multiplication
  153. ; In    R1 = 1st operand
  154. ;    R2 = 2nd operand
  155. ; Out    R1 = Result
  156. ;    CF = 1 if overflow
  157. ; Uses    CX,SI,DI
  158.  
  159. RealMul:
  160.  
  161.     OR    AL,AL
  162.     JE    ExitZero1
  163.     OR    CL,CL
  164.     JE    ExitZero1
  165.     PUSH    BP
  166.     MOV    BP,DX
  167.     XOR    DX,DI
  168.     AND    DX,8000H
  169.     XCHG    DL,AL
  170.     ADD    DL,CL
  171.     ADC    DH,AL
  172.     MOV    CL,AL
  173.     OR    BP,8000H
  174.     OR    DI,8000H
  175.     PUSH    DX
  176.     OR    AH,AH
  177.     JNE    @@1
  178.     OR    BX,BX
  179.     JE    @@2
  180. @@1:    OR    CH,CH
  181.     JNE    @@3
  182.     OR    SI,SI
  183.     JNE    @@3
  184.     XCHG    AX,CX
  185.     XCHG    BX,SI
  186.     XCHG    BP,DI
  187. @@2:    MOV    AX,CX
  188.     MUL    BP
  189.     MOV    BX,DX
  190.     MOV    AX,SI
  191.     MUL    BP
  192.     ADD    BX,AX
  193.     ADC    DX,0
  194.     MOV    CX,DX
  195.     MOV    AX,DI
  196.     MUL    BP
  197.     ADD    AX,CX
  198.     ADC    DX,0
  199.     JMP    @@4
  200. @@3:    PUSH    DI
  201.     PUSH    SI
  202.     PUSH    CX
  203.     PUSH    BP
  204.     PUSH    BX
  205.     PUSH    AX
  206.     MOV    BP,SP
  207.     XOR    CX,CX
  208.     MOV    AL,[BP].b1        ;1
  209.     MUL    [BP+6].b1
  210.     MOV    SI,AX
  211.     MOV    DI,CX
  212.     MOV    BX,CX
  213.     MOV    AX,[BP].w0        ;2
  214.     MUL    [BP+6].w2
  215.     ADD    SI,AX
  216.     ADC    DI,DX
  217.     ADC    BX,CX
  218.     MOV    AX,[BP].w2
  219.     MUL    [BP+6].w0
  220.     ADD    SI,AX
  221.     ADC    DI,DX
  222.     ADC    BX,CX
  223.     MOV    SI,CX
  224.     MOV    AX,[BP].w0        ;3
  225.     MUL    [BP+6].w4
  226.     ADD    DI,AX
  227.     ADC    BX,DX
  228.     ADC    SI,CX
  229.     MOV    AX,[BP].w2
  230.     MUL    [BP+6].w2
  231.     ADD    DI,AX
  232.     ADC    BX,DX
  233.     ADC    SI,CX
  234.     MOV    AX,[BP].w4
  235.     MUL    [BP+6].w0
  236.     ADD    DI,AX
  237.     ADC    BX,DX
  238.     ADC    SI,CX
  239.     MOV    DI,CX
  240.     MOV    AX,[BP].w2        ;4
  241.     MUL    [BP+6].w4
  242.     ADD    BX,AX
  243.     ADC    SI,DX
  244.     ADC    DI,CX
  245.     MOV    AX,[BP].w4
  246.     MUL    [BP+6].w2
  247.     ADD    BX,AX
  248.     ADC    SI,DX
  249.     ADC    DI,CX
  250.     MOV    AX,[BP].w4        ;5
  251.     MUL    [BP+6].w4
  252.     ADD    AX,SI
  253.     ADC    DX,DI
  254.     ADD    SP,12
  255. @@4:    XCHG    AX,BX
  256.     POP    CX
  257.     POP    BP
  258.     OR    DH,DH
  259.     JS    @@5
  260.     SHL    AX,1
  261.     RCL    BX,1
  262.     RCL    DX,1
  263.     DEC    CX
  264. @@5:    SUB    CX,8081H
  265.  
  266. ; Common exit from multiply and divide
  267.  
  268. ExitMulDiv:
  269.  
  270.     ADD    AX,80H
  271.     ADC    BX,0
  272.     ADC    DX,0
  273.     JNC    @@1
  274.     RCR    DX,1
  275.     INC    CX
  276. @@1:    TEST    CH,40H
  277.     JNE    ExitZero
  278.     INC    CX
  279.     MOV    AL,CL
  280.     XOR    DH,CH
  281.     SHR    CH,1
  282.     RET
  283.  
  284. ; Return zero
  285.  
  286. ExitZero:
  287.  
  288.     XOR    AX,AX
  289.     MOV    BX,AX
  290.     MOV    DX,AX
  291.     RET
  292.  
  293. ; Real division
  294. ; In    R1 = 1st operand
  295. ;    R2 = 2nd operand
  296. ; Out    R1 = Result
  297. ;    CF = 1 if overflow
  298. ; Uses    CX,SI,DI
  299.  
  300. RealDiv:
  301.  
  302.     OR    AL,AL
  303.     JE    ExitZero
  304.     PUSH    BP
  305.     MOV    BP,DX
  306.     XOR    DX,DI
  307.     OR    DI,8000H
  308.     OR    BP,8000H
  309.     AND    DX,8000H
  310.     XCHG    AL,DL
  311.     SUB    DL,CL
  312.     SBB    DH,AL
  313.     PUSH    DX
  314.     MOV    AL,2
  315.     MOV    DX,1
  316. @@1:    CMP    BP,DI
  317.     JNE    @@2
  318.     CMP    BX,SI
  319.     JNE    @@2
  320.     CMP    AH,CH
  321. @@2:    JC    @@3
  322.     SUB    AH,CH
  323.     SBB    BX,SI
  324.     SBB    BP,DI
  325. @@3:    RCL    DX,1
  326.     JC    @@5
  327. @@4:    SHL    AH,1
  328.     RCL    BX,1
  329.     RCL    BP,1
  330.     JNC    @@1
  331.     SUB    AH,CH
  332.     SBB    BX,SI
  333.     SBB    BP,DI
  334.     CLC
  335.     JMP    @@3
  336. @@5:    DEC    AL
  337.     JS    @@6
  338.     PUSH    DX
  339.     MOV    DX,1
  340.     JNE    @@4
  341.     MOV    DL,40H
  342.     JMP    @@4
  343. @@6:    MOV    AX,DX
  344.     MOV    CL,6
  345.     SHL    AX,CL
  346.     POP    BX
  347.     POP    DX
  348.     POP    CX
  349.     POP    BP
  350.     NOT    AX
  351.     NOT    BX
  352.     XOR    DX,0FFFFH
  353.     JS    @@7
  354.     RCL    AX,1
  355.     RCL    BX,1
  356.     RCL    DX,1
  357.     DEC    CX
  358. @@7:    ADD    CX,8080H
  359.     JMP    ExitMulDiv
  360.  
  361. ; Real compare
  362. ; In    R1 = 1st operand
  363. ;    R2 = 2nd operand
  364. ; Out    ZF = Set if R1=R2
  365. ;    CF = Set if R1<R2
  366. ; Uses    None
  367.  
  368. RealCmp:
  369.  
  370.     PUSH    DX
  371.     XOR    DX,DI
  372.     POP    DX
  373.     JNS    @@1
  374.     PUSH    DX
  375.     RCL    DX,1
  376.     POP    DX
  377.     RET
  378. @@1:    TEST    DH,80H
  379.     JZ    @@2
  380.     CALL    @@2
  381.     JE    @@3
  382.     CMC
  383.     RET
  384. @@2:    CMP    AL,CL
  385.     JNE    @@3
  386.     OR    AL,AL
  387.     JZ    @@3
  388.     CMP    DX,DI
  389.     JNE    @@3
  390.     CMP    BX,SI
  391.     JNE    @@3
  392.     CMP    AH,CH
  393. @@3:    RET
  394.  
  395. ; Convert integer to real
  396. ; In    DX:AX = Integer value
  397. ; Out    R1    = Real value
  398. ; Uses    CX
  399.  
  400. RealFloat:
  401.  
  402.     MOV    BX,AX
  403.     OR    BX,DX
  404.     JE    @@5
  405.     MOV    CH,DH
  406.     OR    DX,DX
  407.     JNS    @@1
  408.     NEG    DX
  409.     NEG    AX
  410.     SBB    DX,0
  411. @@1:    MOV    BX,AX
  412.     MOV    AX,0A0H
  413.     OR    DX,DX
  414.     JNZ    @@2
  415.     XCHG    DX,BX
  416.     MOV    AL,90H
  417.     OR    DH,DH
  418.     JNZ    @@2
  419.     XCHG    DH,DL
  420.     MOV    AL,88H
  421. @@2:    OR    DX,DX
  422.     JS    @@4
  423. @@3:    DEC    AL
  424.     ADD    BX,BX
  425.     ADC    DX,DX
  426.     JNS    @@3
  427. @@4:    OR    CH,CH
  428.     JS    @@5
  429.     AND    DH,7FH
  430. @@5:    RET
  431.  
  432. ; Convert real to integer
  433. ; In    R1    = real value
  434. ;    CH    = Non-zero for round
  435. ; Out    DX:AX = Integer value
  436. ;    CF    = 1 if overflow
  437. ; Uses    BX,CX
  438.  
  439. RealTrunc:
  440.  
  441.     XCHG    AX,BX
  442.     MOV    CL,80H+32
  443.     SUB    CL,BL
  444.     JC    @@7
  445.     MOV    BL,DH
  446.     OR    DH,80H
  447.     CMP    CL,32
  448.     JAE    @@8
  449.     CMP    CL,16
  450.     JB    @@1
  451.     MOV    BH,AH
  452.     MOV    AX,DX
  453.     XOR    DX,DX
  454.     SUB    CL,16
  455. @@1:    CMP    CL,8
  456.     JB    @@2
  457.     MOV    BH,AL
  458.     MOV    AL,AH
  459.     MOV    AH,DL
  460.     MOV    DL,DH
  461.     XOR    DH,DH
  462.     SUB    CL,8
  463. @@2:    OR    CL,CL
  464.     JE    @@4
  465. @@3:    SHR    DX,1
  466.     RCR    AX,1
  467.     RCR    BH,1
  468.     DEC    CL
  469.     JNE    @@3
  470. @@4:    OR    CH,CH
  471.     JE    @@5
  472.     ADD    BH,BH
  473.     ADC    AX,0
  474.     ADC    DX,0
  475.     JC    @@7
  476. @@5:    MOV    CX,AX
  477.     OR    CX,DX
  478.     JE    @@7
  479.     OR    BL,BL
  480.     JNS    @@6
  481.     NEG    DX
  482.     NEG    AX
  483.     SBB    DX,0
  484. @@6:    XOR    BL,DH
  485.     ADD    BL,BL
  486. @@7:    RET
  487. @@8:    MOV    BH,DH
  488.     MOV    AX,0
  489.     MOV    DX,0
  490.     JE    @@4
  491.     RET
  492.  
  493. CODE    ENDS
  494.  
  495.     END
  496.