VirtualBox

Ignore:
Timestamp:
Apr 14, 2016 9:25:51 AM (9 years ago)
Author:
vboxsync
Message:

PCBIOS: split up the support.asm file and implemented 32-bit division for pre-386 targets in C using uint32.h (derived from uint128.h via uint64.h).

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/BiosCommonCode/__I4D.asm

    r60406 r60484  
    2020;*  Exported Symbols                                                           *
    2121;*******************************************************************************
    22 public          __U4D
    23 public          __U4M
    24 public          __U8LS
    25 public          __U8RS
    26 ifndef          VBOX_PC_BIOS
    2722public          __I4D
    28 public          __I4M
     23
     24if VBOX_BIOS_CPU lt 80386
     25extrn NeedToImplementOn8086__I4D:near
    2926endif
    30 public          _fmemset_
    31 public          _fmemcpy_
    3227
     28                .8086
    3329
    34 
    35                 .386p
    3630
    3731_TEXT           segment public 'CODE' use16
    3832                assume cs:_TEXT
    3933
    40 
    41 ;;
    42 ; 32-bit unsigned division.
    43 ;
    44 ; @param    dx:ax   Dividend.
    45 ; @param    cx:bx   Divisor.
    46 ; @returns  dx:ax   Quotient.
    47 ;           cx:bx   Remainder.
    48 ;
    49 __U4D:
    50                 pushf
    51                 push    eax
    52                 push    edx
    53                 push    ecx
    54 
    55                 rol     eax, 16
    56                 mov     ax, dx
    57                 ror     eax, 16
    58                 xor     edx, edx
    59 
    60                 shr     ecx, 16
    61                 mov     cx, bx
    62 
    63                 div     ecx                 ; eax:edx / ecx -> eax=quotient, edx=remainder.
    64 
    65                 mov     bx, dx
    66                 pop     ecx
    67                 shr     edx, 16
    68                 mov     cx, dx
    69 
    70                 pop     edx
    71                 ror     eax, 16
    72                 mov     dx, ax
    73                 add     sp, 2
    74                 pop     ax
    75                 rol     eax, 16
    76 
    77                 popf
    78                 ret
    79 
    80 
    81 ifndef          VBOX_PC_BIOS
    8234;;
    8335; 32-bit signed division.
     
    9042__I4D:
    9143                pushf
     44if VBOX_BIOS_CPU ge 80386
     45                .386
    9246                push    eax
    9347                push    edx
     
    11569                pop     ax
    11670                rol     eax, 16
    117 
     71                .8086
     72else
     73                call    NeedToImplementOn8086__I4D
     74endif
    11875                popf
    119                 ret
    120 endif           ; VBOX_PC_BIOS
    121 
    122 
    123 ;;
    124 ; 32-bit unsigned multiplication.
    125 ;
    126 ; @param    dx:ax   Factor 1.
    127 ; @param    cx:bx   Factor 2.
    128 ; @returns  dx:ax   Result.
    129 ;
    130 __U4M:
    131                 pushf
    132                 push    eax
    133                 push    edx
    134                 push    ecx
    135 
    136                 rol     eax, 16
    137                 mov     ax, dx
    138                 ror     eax, 16
    139                 xor     edx, edx
    140 
    141                 shr     ecx, 16
    142                 mov     cx, bx
    143 
    144                 mul     ecx                 ; eax * ecx -> edx:eax
    145 
    146                 pop     ecx
    147 
    148                 pop     edx
    149                 ror     eax, 16
    150                 mov     dx, ax
    151                 add     sp, 2
    152                 pop     ax
    153                 rol     eax, 16
    154 
    155                 popf
    156                 ret
    157 
    158 
    159 ifndef          VBOX_PC_BIOS
    160 ;;
    161 ; 32-bit signed multiplication.
    162 ;
    163 ; @param    dx:ax   Factor 1.
    164 ; @param    cx:bx   Factor 2.
    165 ; @returns  dx:ax   Result.
    166 ; cx, es may be modified; di is preserved
    167 ;
    168 __I4M:
    169                 pushf
    170                 push    eax
    171                 push    edx
    172                 push    ecx
    173                 push    ebx
    174 
    175                 rol     eax, 16
    176                 mov     ax, dx
    177                 ror     eax, 16
    178                 xor     edx, edx
    179 
    180                 shr     ecx, 16
    181                 mov     cx, bx
    182 
    183                 imul    ecx                 ; eax * ecx -> edx:eax
    184 
    185                 pop     ebx
    186                 pop     ecx
    187 
    188                 pop     edx
    189                 ror     eax, 16
    190                 mov     dx, ax
    191                 add     sp, 2
    192                 pop     ax
    193                 rol     eax, 16
    194 
    195                 popf
    196                 ret
    197 endif           ; VBOX_PC_BIOS
    198 
    199 
    200 ;;
    201 ; 64-bit left shift.
    202 ;
    203 ; @param    ax:bx:cx:dx Value.
    204 ; @param    si          Shift count.
    205 ; @returns  ax:bx:cx:dx Shifted value.
    206 ; si is zeroed
    207 ;
    208 __U8LS:
    209 
    210                 test    si, si
    211                 jz      u8ls_quit
    212 u8ls_rot:
    213                 shl     dx, 1
    214                 rcl     cx, 1
    215                 rcl     bx, 1
    216                 rcl     ax, 1
    217                 dec     si
    218                 jnz     u8ls_rot
    219 u8ls_quit:
    220                 ret
    221 
    222 
    223 ;;
    224 ; 64-bit unsigned right shift.
    225 ;
    226 ; @param    ax:bx:cx:dx Value.
    227 ; @param    si          Shift count.
    228 ; @returns  ax:bx:cx:dx Shifted value.
    229 ; si is zeroed
    230 ;
    231 __U8RS:
    232 
    233                 test    si, si
    234                 jz      u8rs_quit
    235 u8rs_rot:
    236                 shr     ax, 1
    237                 rcr     bx, 1
    238                 rcr     cx, 1
    239                 rcr     dx, 1
    240                 dec     si
    241                 jnz     u8rs_rot
    242 u8rs_quit:
    243                 ret
    244 
    245 
    246 ;;
    247 ; memset taking a far pointer.
    248 ;
    249 ; cx, es may be modified; di is preserved
    250 ;
    251 ; @returns  dx:ax unchanged.
    252 ; @param    dx:ax   Pointer to the memory.
    253 ; @param    bl      The fill value.
    254 ; @param    cx      The number of bytes to fill.
    255 ;
    256 _fmemset_:
    257                 push    di
    258 
    259                 mov     es, dx
    260                 mov     di, ax
    261                 xchg    al, bl
    262                 rep stosb
    263                 xchg    al, bl
    264 
    265                 pop     di
    266                 ret
    267 
    268 
    269 ;;
    270 ; memcpy taking far pointers.
    271 ;
    272 ; cx, es may be modified; si, di are preserved
    273 ;
    274 ; @returns  dx:ax unchanged.
    275 ; @param    dx:ax   Pointer to the destination memory.
    276 ; @param    cx:bx   Pointer to the source memory.
    277 ; @param    sp+2    The number of bytes to copy (dw).
    278 ;
    279 _fmemcpy_:
    280                 push    bp
    281                 mov     bp, sp
    282                 push    di
    283                 push    ds
    284                 push    si
    285 
    286                 mov     es, dx
    287                 mov     di, ax
    288                 mov     ds, cx
    289                 mov     si, bx
    290                 mov     cx, [bp + 4]
    291                 rep     movsb
    292 
    293                 pop     si
    294                 pop     ds
    295                 pop     di
    296                 leave
    29776                ret
    29877
Note: See TracChangeset for help on using the changeset viewer.

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