diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-06 03:01:46 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-06 03:01:46 +0000 |
commit | f8fe689a81f906d1b91bb3220acde2a4ecb14c5b (patch) | |
tree | 26484e9d7e2c67806c2d1760196ff01aaa858e8c /src/VBox/Devices/BiosCommonCode/__U4D.asm | |
parent | Initial commit. (diff) | |
download | virtualbox-upstream.tar.xz virtualbox-upstream.zip |
Adding upstream version 6.0.4-dfsg.upstream/6.0.4-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/BiosCommonCode/__U4D.asm')
-rw-r--r-- | src/VBox/Devices/BiosCommonCode/__U4D.asm | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/VBox/Devices/BiosCommonCode/__U4D.asm b/src/VBox/Devices/BiosCommonCode/__U4D.asm new file mode 100644 index 00000000..b9a91b7d --- /dev/null +++ b/src/VBox/Devices/BiosCommonCode/__U4D.asm @@ -0,0 +1,134 @@ +; $Id: __U4D.asm $ +;; @file +; Compiler support routines. +; + +; +; Copyright (C) 2012-2019 Oracle Corporation +; +; This file is part of VirtualBox Open Source Edition (OSE), as +; available from http://www.virtualbox.org. This file is free software; +; you can redistribute it and/or modify it under the terms of the GNU +; General Public License (GPL) as published by the Free Software +; Foundation, in version 2 as it comes in the "COPYING" file of the +; VirtualBox OSE distribution. VirtualBox OSE is distributed in the +; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. +; + + +;******************************************************************************* +;* Exported Symbols * +;******************************************************************************* +public __U4D + + .8086 + +if VBOX_BIOS_CPU lt 80386 +extrn _DoUInt32Div:near +endif + + +_TEXT segment public 'CODE' use16 + assume cs:_TEXT + + +;; +; 32-bit unsigned division. +; +; @param dx:ax Dividend. +; @param cx:bx Divisor. +; @returns dx:ax Quotient. +; cx:bx Remainder. +; +__U4D: + pushf +if VBOX_BIOS_CPU ge 80386 + .386 + push eax + push edx + push ecx + + rol eax, 16 + mov ax, dx + ror eax, 16 + xor edx, edx + + shr ecx, 16 + mov cx, bx + + div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder. + + mov bx, dx + pop ecx + shr edx, 16 + mov cx, dx + + pop edx + ror eax, 16 + mov dx, ax + add sp, 2 + pop ax + rol eax, 16 + .8086 +else + ; + ; If the divisor is only 16-bit, use a fast path + ; + test cx, cx + jnz do_it_the_hard_way + + div bx ; dx:ax / bx -> ax=quotient, dx=remainder + + mov bx, dx ; remainder in cx:bx, and we know cx=0 + + xor dx, dx ; quotient in dx:ax, dx must be zero + + popf + ret + +do_it_the_hard_way: + ; Call C function do this. + push ds + push es + + ; + ; Convert to a C __cdecl call - not doing this in assembly. + ; + + ; Set up a frame of sorts, allocating 4 bytes for the result buffer. + push bp + sub sp, 04h + mov bp, sp + + ; Pointer to the return buffer. + push ss + push bp + add bp, 04h ; Correct bp. + + ; The divisor. + push cx + push bx + + ; The dividend. + push dx + push ax + + call _DoUInt32Div + + ; Load the remainder. + mov cx, [bp - 02h] + mov bx, [bp - 04h] + + ; The quotient is already in dx:ax + + mov sp, bp + pop bp + pop es + pop ds +endif + popf + ret + +_TEXT ends + end + |