Changeset 60484 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Apr 14, 2016 9:25:51 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106586
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 1 added
- 1 edited
- 8 copied
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/BiosCommonCode/ASMBitLastSetU16.asm
r60406 r60484 1 1 ; $Id$ 2 2 ;; @file 3 ; IPRT - ASMBitLastSetU16().3 ; BiosCommonCode - ASMBitLastSetU16() - borrowed from IPRT. 4 4 ; 5 5 … … 29 29 ;* Header Files * 30 30 ;******************************************************************************* 31 %include "iprt/asmdefs.mac" 31 public _ASMBitLastSetU16 32 32 33 BEGINCODE 33 .8086 34 35 _TEXT segment public 'CODE' use16 36 assume cs:_TEXT 37 34 38 35 39 ;; … … 38 42 ; Bits are numbered from 1 (least significant) to 16. 39 43 ; 40 ; @returns ( xAX)index [1..16] of the last set bit.41 ; @returns ( xAX)0 if all bits are cleared.42 ; @param msc:cx gcc:di x86:stack u16Integer to search for set bits.44 ; @returns (ax) index [1..16] of the last set bit. 45 ; @returns (ax) 0 if all bits are cleared. 46 ; @param u16 Integer to search for set bits. 43 47 ; 44 48 ; @cproto DECLASM(unsigned) ASMBitLastSetU16(uint32_t u16); 45 49 ; 46 BEGINPROC_EXPORTED ASMBitLastSetU16 47 %if ARCH_BITS == 16 48 CPU 8086 50 _ASMBitLastSetU16 proc 51 .8086 49 52 push bp 50 53 mov bp, sp … … 52 55 mov cx, [bp + 2 + 2] 53 56 test cx, cx ; check if zero (eliminates checking dec ax result) 54 jz .return_zero57 jz return_zero 55 58 56 59 mov ax, 16 57 .next_bit:60 next_bit: 58 61 shl cx, 1 59 jc .return62 jc return 60 63 dec ax 61 jmp .next_bit64 jmp next_bit 62 65 63 .return_zero:66 return_zero: 64 67 xor ax, ax 65 .return:68 return: 66 69 pop bp 67 70 ret 71 _ASMBitLastSetU16 endp 68 72 69 %else 70 xor eax, eax 71 %if ARCH_BITS == 64 72 %ifdef ASM_CALL64_GCC 73 bsr ax, si 74 %else 75 bsr ax, cx 76 %endif 77 %elif ARCH_BITS == 32 78 bsr ax, word [esp + 4] 79 %else 80 %error "Missing or invalid ARCH_BITS." 81 %endif 82 jz .return_zero 83 inc eax 84 .return: 85 ret 86 .return_zero: 87 xor eax, eax 88 ret 89 %endif 90 ENDPROC ASMBitLastSetU16 73 _TEXT ends 74 end 91 75 -
trunk/src/VBox/Devices/BiosCommonCode/__I4D.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 public __U8LS25 public __U8RS26 ifndef VBOX_PC_BIOS27 22 public __I4D 28 public __I4M 23 24 if VBOX_BIOS_CPU lt 80386 25 extrn NeedToImplementOn8086__I4D:near 29 26 endif 30 public _fmemset_31 public _fmemcpy_32 27 28 .8086 33 29 34 35 .386p36 30 37 31 _TEXT segment public 'CODE' use16 38 32 assume cs:_TEXT 39 33 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 34 ;; 83 35 ; 32-bit signed division. … … 90 42 __I4D: 91 43 pushf 44 if VBOX_BIOS_CPU ge 80386 45 .386 92 46 push eax 93 47 push edx … … 115 69 pop ax 116 70 rol eax, 16 117 71 .8086 72 else 73 call NeedToImplementOn8086__I4D 74 endif 118 75 popf 119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 76 ret 298 77 -
trunk/src/VBox/Devices/BiosCommonCode/__I4M.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 public __U8LS25 public __U8RS26 ifndef VBOX_PC_BIOS27 public __I4D28 22 public __I4M 23 24 if VBOX_BIOS_CPU lt 80386 25 extrn NeedToImplementOn8086__I4M:near 29 26 endif 30 public _fmemset_31 public _fmemcpy_32 27 33 34 35 .386p 28 .8086 36 29 37 30 _TEXT segment public 'CODE' use16 38 31 assume cs:_TEXT 39 32 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 33 ;; 161 34 ; 32-bit signed multiplication. … … 168 41 __I4M: 169 42 pushf 43 if VBOX_BIOS_CPU ge 80386 44 .386 170 45 push eax 171 46 push edx … … 192 67 pop ax 193 68 rol eax, 16 69 .8086 70 else 71 call NeedToImplementOn8086__I4M 72 endif 194 73 195 74 popf 196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 75 ret 298 76 -
trunk/src/VBox/Devices/BiosCommonCode/__U4D.asm
r60406 r60484 21 21 ;******************************************************************************* 22 22 public __U4D 23 public __U4M 24 public __U8LS 25 public __U8RS 26 ifndef VBOX_PC_BIOS 27 public __I4D 28 public __I4M 23 24 .8086 25 26 if VBOX_BIOS_CPU lt 80386 27 extrn _DoUInt32Div:near 29 28 endif 30 public _fmemset_31 public _fmemcpy_32 29 33 34 35 .386p36 30 37 31 _TEXT segment public 'CODE' use16 … … 49 43 __U4D: 50 44 pushf 45 if VBOX_BIOS_CPU ge 80386 46 .386 51 47 push eax 52 48 push edx … … 74 70 pop ax 75 71 rol eax, 16 72 .8086 73 else 76 74 75 ; Call C function do this. 76 push ds 77 push es 78 79 ; 80 ; Convert to a C __cdecl call - not doing this in assembly. 81 ; 82 83 ; Set up a frame of sorts, allocating 8 bytes for the result buffer. 84 push bp 85 sub sp, 08h 86 mov bp, sp 87 88 ; Pointer to the return buffer. 89 push ss 90 push bp 91 add bp, 08h ; Correct bp. 92 93 ; The divisor. 94 push cx 95 push bx 96 97 ; The dividend. 98 push dx 99 push ax 100 101 call _DoUInt32Div 102 103 ; Load the reminder. 104 mov cx, [bp - 08h + 6] 105 mov bx, [bp - 08h + 4] 106 107 ; Load the quotient. 108 mov dx, [bp - 08h + 2] 109 mov ax, [bp - 08h] 110 111 mov sp, bp 112 pop bp 113 pop es 114 pop ds 115 endif 77 116 popf 78 117 ret 79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 ret298 299 118 300 119 _TEXT ends -
trunk/src/VBox/Devices/BiosCommonCode/__U4M.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 22 public __U4M 24 public __U8LS25 public __U8RS26 ifndef VBOX_PC_BIOS27 public __I4D28 public __I4M29 endif30 public _fmemset_31 public _fmemcpy_32 23 33 34 35 .386p 24 .8086 36 25 37 26 _TEXT segment public 'CODE' use16 38 27 assume cs:_TEXT 39 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 122 28 123 29 ;; … … 130 36 __U4M: 131 37 pushf 38 if VBOX_BIOS_CPU ge 80386 39 .386 132 40 push eax 133 41 push edx … … 152 60 pop ax 153 61 rol eax, 16 62 .8086 154 63 155 popf 156 ret 64 else 65 push bp 66 mov bp, sp 67 push si ; high result 68 push di ; low result 157 69 70 ; 71 ; dx:ax * cx:bx = 72 ;----------------------- 73 ; ax*bx 74 ; + dx*bx ; only lower 16 bits relevant. 75 ; + ax*cx ; ditto 76 ; +dx*cx ; not relevant 77 ; ------------- 78 ; = dx:ax 79 ; 158 80 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 81 push ax ; stash the low factor 1 part for the 3rd multiplication. 82 mov di, dx ; stash the high factor 1 part for the 2nd multiplication. 174 83 175 rol eax, 16176 m ov ax, dx177 ror eax, 16178 x or edx, edx84 ; multiply the two low factor "digits": ax * bx 85 mul bx 86 mov si, dx 87 xchg di, ax ; save low result and loads high factor 1 into ax for the next step 179 88 180 shr ecx, 16 181 mov cx, bx 89 ; Multiply the low right "digit" by the high left one and add it to the high result part 90 mul bx 91 add si, ax 182 92 183 imul ecx ; eax * ecx -> edx:eax 93 ; Multiply the high right "digit" by the low left on and add it ot the high result part. 94 pop ax 95 mul cx 96 add si, ax 184 97 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 98 ; Load the result. 99 mov dx, si 100 mov ax, di 264 101 265 102 pop di 266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 103 pop si 294 pop ds 295 pop di 296 leave 104 endif 105 popf 297 106 ret 298 107 -
trunk/src/VBox/Devices/BiosCommonCode/__U8LS.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 22 public __U8LS 25 public __U8RS26 ifndef VBOX_PC_BIOS27 public __I4D28 public __I4M29 endif30 public _fmemset_31 public _fmemcpy_32 23 33 24 34 35 .386p 25 .8086 36 26 37 27 _TEXT segment public 'CODE' use16 38 28 assume cs:_TEXT 39 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 199 29 200 30 ;; … … 221 51 222 52 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 ret298 299 300 53 _TEXT ends 301 54 end -
trunk/src/VBox/Devices/BiosCommonCode/__U8RS.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 public __U8LS25 22 public __U8RS 26 ifndef VBOX_PC_BIOS27 public __I4D28 public __I4M29 endif30 public _fmemset_31 public _fmemcpy_32 23 33 24 34 35 .386p 25 .8086 36 26 37 27 _TEXT segment public 'CODE' use16 38 28 assume cs:_TEXT 39 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 222 29 223 30 ;; … … 243 50 ret 244 51 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 ret298 299 300 52 _TEXT ends 301 53 end -
trunk/src/VBox/Devices/BiosCommonCode/fmemcpy.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 public __U8LS25 public __U8RS26 ifndef VBOX_PC_BIOS27 public __I4D28 public __I4M29 endif30 public _fmemset_31 22 public _fmemcpy_ 32 23 33 24 34 35 .386p 25 .8086 36 26 37 27 _TEXT segment public 'CODE' use16 38 28 assume cs:_TEXT 39 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 245 246 ;;247 ; memset taking a far pointer.248 ;249 ; cx, es may be modified; di is preserved250 ;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 di258 259 mov es, dx260 mov di, ax261 xchg al, bl262 rep stosb263 xchg al, bl264 265 pop di266 ret267 29 268 30 … … 294 56 pop ds 295 57 pop di 296 leave 58 mov sp, bp 59 pop bp 297 60 ret 298 61 -
trunk/src/VBox/Devices/BiosCommonCode/fmemset.asm
r60406 r60484 20 20 ;* Exported Symbols * 21 21 ;******************************************************************************* 22 public __U4D23 public __U4M24 public __U8LS25 public __U8RS26 ifndef VBOX_PC_BIOS27 public __I4D28 public __I4M29 endif30 22 public _fmemset_ 31 public _fmemcpy_32 23 33 24 34 35 .386p 25 .8086 36 26 37 27 _TEXT segment public 'CODE' use16 38 28 assume cs:_TEXT 39 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 pushf51 push eax52 push edx53 push ecx54 55 rol eax, 1656 mov ax, dx57 ror eax, 1658 xor edx, edx59 60 shr ecx, 1661 mov cx, bx62 63 div ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.64 65 mov bx, dx66 pop ecx67 shr edx, 1668 mov cx, dx69 70 pop edx71 ror eax, 1672 mov dx, ax73 add sp, 274 pop ax75 rol eax, 1676 77 popf78 ret79 80 81 ifndef VBOX_PC_BIOS82 ;;83 ; 32-bit signed division.84 ;85 ; @param dx:ax Dividend.86 ; @param cx:bx Divisor.87 ; @returns dx:ax Quotient.88 ; cx:bx Remainder.89 ;90 __I4D:91 pushf92 push eax93 push edx94 push ecx95 96 rol eax, 1697 mov ax, dx98 ror eax, 1699 xor edx, edx100 101 shr ecx, 16102 mov cx, bx103 104 idiv ecx ; eax:edx / ecx -> eax=quotient, edx=remainder.105 106 mov bx, dx107 pop ecx108 shr edx, 16109 mov cx, dx110 111 pop edx112 ror eax, 16113 mov dx, ax114 add sp, 2115 pop ax116 rol eax, 16117 118 popf119 ret120 endif ; VBOX_PC_BIOS121 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 pushf132 push eax133 push edx134 push ecx135 136 rol eax, 16137 mov ax, dx138 ror eax, 16139 xor edx, edx140 141 shr ecx, 16142 mov cx, bx143 144 mul ecx ; eax * ecx -> edx:eax145 146 pop ecx147 148 pop edx149 ror eax, 16150 mov dx, ax151 add sp, 2152 pop ax153 rol eax, 16154 155 popf156 ret157 158 159 ifndef VBOX_PC_BIOS160 ;;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 preserved167 ;168 __I4M:169 pushf170 push eax171 push edx172 push ecx173 push ebx174 175 rol eax, 16176 mov ax, dx177 ror eax, 16178 xor edx, edx179 180 shr ecx, 16181 mov cx, bx182 183 imul ecx ; eax * ecx -> edx:eax184 185 pop ebx186 pop ecx187 188 pop edx189 ror eax, 16190 mov dx, ax191 add sp, 2192 pop ax193 rol eax, 16194 195 popf196 ret197 endif ; VBOX_PC_BIOS198 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 zeroed207 ;208 __U8LS:209 210 test si, si211 jz u8ls_quit212 u8ls_rot:213 shl dx, 1214 rcl cx, 1215 rcl bx, 1216 rcl ax, 1217 dec si218 jnz u8ls_rot219 u8ls_quit:220 ret221 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 zeroed230 ;231 __U8RS:232 233 test si, si234 jz u8rs_quit235 u8rs_rot:236 shr ax, 1237 rcr bx, 1238 rcr cx, 1239 rcr dx, 1240 dec si241 jnz u8rs_rot242 u8rs_quit:243 ret244 29 245 30 … … 266 51 ret 267 52 268 269 ;;270 ; memcpy taking far pointers.271 ;272 ; cx, es may be modified; si, di are preserved273 ;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 bp281 mov bp, sp282 push di283 push ds284 push si285 286 mov es, dx287 mov di, ax288 mov ds, cx289 mov si, bx290 mov cx, [bp + 4]291 rep movsb292 293 pop si294 pop ds295 pop di296 leave297 ret298 299 300 53 _TEXT ends 301 54 end -
trunk/src/VBox/Devices/PC/BIOS/Makefile.kmk
r60441 r60484 69 69 pciutil.c \ 70 70 vds.c \ 71 ../../BiosCommonCode/support.asm \ 71 ../../BiosCommonCode/__U4M.asm \ 72 ../../BiosCommonCode/__U4D.asm \ 73 ../../BiosCommonCode/__U8RS.asm \ 74 ../../BiosCommonCode/__U8LS.asm \ 75 ../../BiosCommonCode/fmemset.asm \ 76 ../../BiosCommonCode/fmemcpy.asm \ 72 77 pcibio32.asm \ 73 78 apm_pm.asm \ … … 82 87 pci32.c 83 88 89 ../../BiosCommonCode/DoUInt32Div.c_CFLAGS = -mc # asm.h and uint32.h both require far data pointers by default. 90 84 91 MISCBINS += VBoxPcBios286 85 92 VBoxPcBios286_EXTENDS = VBoxPcBios386 86 93 VBoxPcBios286_CFLAGS = -2 87 94 VBoxPcBios286_DEFS = $(filter-out VBOX_BIOS_CPU=80386,$(VBoxPcBios386_DEFS)) VBOX_BIOS_CPU=80286 95 VBoxPcBios286_SOURCES = $(VBoxPcBios386_SOURCES) \ 96 ../../BiosCommonCode/DoUInt32Div.c \ 97 ../../BiosCommonCode/ASMBitLastSetU16.asm 88 98 89 99 MISCBINS += VBoxPcBios8086 … … 91 101 VBoxPcBios8086_CFLAGS = -0 92 102 VBoxPcBios8086_DEFS = $(filter-out VBOX_BIOS_CPU=80386,$(VBoxPcBios386_DEFS)) VBOX_BIOS_CPU=8086 103 VBoxPcBios8086_SOURCES = $(VBoxPcBios386_SOURCES) \ 104 ../../BiosCommonCode/DoUInt32Div.c \ 105 ../../BiosCommonCode/ASMBitLastSetU16.asm 93 106 94 107
Note:
See TracChangeset
for help on using the changeset viewer.