VirtualBox

source: vbox/trunk/src/VBox/Devices/BiosCommonCode/__U4M.asm@ 103914

Last change on this file since 103914 was 98103, checked in by vboxsync, 21 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.6 KB
Line 
1; $Id: __U4M.asm 98103 2023-01-17 14:15:46Z vboxsync $
2;; @file
3; Compiler support routines.
4;
5
6;
7; Copyright (C) 2012-2023 Oracle and/or its affiliates.
8;
9; This file is part of VirtualBox base platform packages, as
10; available from https://www.virtualbox.org.
11;
12; This program is free software; you can redistribute it and/or
13; modify it under the terms of the GNU General Public License
14; as published by the Free Software Foundation, in version 3 of the
15; License.
16;
17; This program is distributed in the hope that it will be useful, but
18; WITHOUT ANY WARRANTY; without even the implied warranty of
19; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20; General Public License for more details.
21;
22; You should have received a copy of the GNU General Public License
23; along with this program; if not, see <https://www.gnu.org/licenses>.
24;
25; SPDX-License-Identifier: GPL-3.0-only
26;
27
28
29;*******************************************************************************
30;* Exported Symbols *
31;*******************************************************************************
32public __U4M
33
34; MASM (ML.EXE) is used for PXE and no longer understands the .8086 directive.
35; WASM is used for the BIOS and understands it just fine.
36ifdef __WASM__
37 .8086
38endif
39
40_TEXT segment public 'CODE' use16
41 assume cs:_TEXT
42
43;;
44; 32-bit unsigned multiplication.
45;
46; @param dx:ax Factor 1.
47; @param cx:bx Factor 2.
48; @returns dx:ax Result.
49;
50__U4M:
51 pushf
52if VBOX_BIOS_CPU ge 80386
53 .386
54 push eax
55 push edx
56 push ecx
57
58 rol eax, 16
59 mov ax, dx
60 ror eax, 16
61 xor edx, edx
62
63 shr ecx, 16
64 mov cx, bx
65
66 mul ecx ; eax * ecx -> edx:eax
67
68 pop ecx
69
70 pop edx
71 ror eax, 16
72 mov dx, ax
73 add sp, 2
74 pop ax
75 rol eax, 16
76ifdef __WASM__
77 .8086
78endif
79
80else
81 push si ; high result
82 push di ; low result
83
84 ;
85 ; dx:ax * cx:bx =
86 ;-----------------------
87 ; ax*bx
88 ; + dx*bx ; only lower 16 bits relevant.
89 ; + ax*cx ; ditto
90 ; +dx*cx ; not relevant
91 ; -------------
92 ; = dx:ax
93 ;
94
95 push ax ; stash the low factor 1 part for the 3rd multiplication.
96 mov di, dx ; stash the high factor 1 part for the 2nd multiplication.
97
98 ; multiply the two low factor "digits": ax * bx
99 mul bx
100 mov si, dx
101 xchg di, ax ; save low result and loads high factor 1 into ax for the next step
102
103 ; Multiply the low right "digit" by the high left one and add it to the high result part
104 mul bx
105 add si, ax
106
107 ; Multiply the high right "digit" by the low left on and add it ot the high result part.
108 pop ax
109 mul cx
110 add si, ax
111
112 ; Load the result.
113 mov dx, si
114 mov ax, di
115
116 pop di
117 pop si
118endif
119 popf
120 ret
121
122
123_TEXT ends
124 end
125
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette