source: xtideuniversalbios/trunk/Assembly_Library/Src/Util/Size.asm@ 322

Last change on this file since 322 was 142, checked in by Tomi Tilli, 14 years ago

Changes to Assembly Library:

  • Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX now returns right value on 8086/8088 build.
  • Debug macros again work on XTIDE Universal BIOS.
File size: 3.2 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for size calculations.
3
4struc BYTE_MULTIPLES
5 .B resb 1
6 .kiB resb 1
7 .MiB resb 1
8 .GiB resb 1
9 .TiB resb 1
10endstruc
11
12; Section containing code
13SECTION .text
14
15;--------------------------------------------------------------------
16; Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
17; Parameters:
18; BX:DX:AX: Size in magnitude
19; CX: Magnitude in BYTE_MULTIPLES
20; Returns:
21; AX: Size in magnitude
22; CX: Tenths
23; DL: Magnitude character:
24; 'k' = *1024 B = kiB
25; 'M' = *1024 kiB = MiB
26; 'G' = *1024 MiB = GiB
27; 'T' = *1024 GiB = TiB
28; 'P' = *1024 TiB = PiB
29; Corrupts registers:
30; BX, DH
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX:
34%ifndef USE_186 ; If 8086/8088
35 push di
36%endif
37 push si
38
39ALIGN JUMP_ALIGN
40.MagnitudeConversionLoop:
41 ePUSH_T di, .MagnitudeConversionLoop; DI corrupted only on 8086/8088 build
42 test bx, bx ; Bits 32...47 in use?
43 jnz SHORT Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
44 test dx, dx ; Bits 16...31 in use?
45 jnz SHORT Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
46 cmp ax, 10000 ; 5 digits needed?
47 jae SHORT Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
48 add sp, BYTE 2 ; Clean return address from stack
49 xchg si, cx ; CX = Remainder (0...1023), SI = Magnitude
50
51 ; Convert remainder to tenths
52 xchg bx, ax ; Store AX
53 mov ax, 10
54 mul cx ; DX:AX = remainder * 10
55 eSHR_IM ax, 10 ; Divide AX by 1024
56 xchg cx, ax ; CX = tenths
57 xchg ax, bx
58
59 ; Convert magnitude to character
60 mov dl, [cs:si+.rgbMagnitudeToChar]
61
62 pop si
63%ifndef USE_186
64 pop di
65%endif
66 ret
67.rgbMagnitudeToChar: db " kMGTP"
68
69
70;--------------------------------------------------------------------
71; Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
72; Parameters:
73; BX:DX:AX: Size
74; CX: Magnitude in BYTE_MULTIPLES
75; Returns:
76; BX:DX:AX: Size in magnitude
77; SI: Remainder (0...1023)
78; CX: Magnitude in BYTE_MULTIPLES
79; Corrupts registers:
80; Nothing
81;--------------------------------------------------------------------
82ALIGN JUMP_ALIGN
83Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX:
84 push cx
85 xor si, si ; Zero remainder
86 mov cl, 10 ; Divide by 1024
87ALIGN JUMP_ALIGN
88.ShiftLoop:
89 call Size_DivideBXDXAXbyTwo
90 rcr si, 1 ; Update remainder
91 loop .ShiftLoop
92 eSHR_IM si, 6 ; Remainder to SI beginning
93 pop cx
94 inc cx ; Increment magnitude
95 ret
96
97
98;--------------------------------------------------------------------
99; Size_ConvertSectorCountInBXDXAXtoKiB
100; Size_DivideBXDXAXbyTwo
101; Parameters:
102; BX:DX:AX: Total sector count
103; Returns:
104; BX:DX:AX: Total size in kiB
105; CF: Remainder from division
106; Corrupts registers:
107; Nothing
108;--------------------------------------------------------------------
109ALIGN JUMP_ALIGN
110Size_ConvertSectorCountInBXDXAXtoKiB:
111Size_DivideBXDXAXbyTwo:
112 shr bx, 1 ; Divide sector count by 2...
113 rcr dx, 1 ; ...to get disk size in...
114 rcr ax, 1 ; ...kiB
115 ret
Note: See TracBrowser for help on using the repository browser.