source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/RamVars.asm@ 147

Last change on this file since 147 was 145, checked in by krille_n_@…, 13 years ago

Minor size optimizations to all parts of the project (even the old Configurator).
Also added a new 'release' option to the makefiles of both versions of the Configurator. It invokes UPX and makes the Configurator programs ridiculously tiny.

File size: 6.8 KB
RevLine 
[90]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for accessings RAMVARS.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Initializes RAMVARS.
9; Drive detection can be started after this function returns.
10;
11; RamVars_Initialize
12; Parameters:
13; Nothing
14; Returns:
[97]15; DS: RAMVARS segment
[3]16; Corrupts registers:
[97]17; AX, CX, DI
[3]18;--------------------------------------------------------------------
19RamVars_Initialize:
[90]20 push es
[97]21 ; Fall to .StealMemoryForRAMVARS
[3]22
23;--------------------------------------------------------------------
[33]24; .StealMemoryForRAMVARS
[3]25; Parameters:
26; Nothing
27; Returns:
28; DS: RAMVARS segment
29; Corrupts registers:
30; AX
31;--------------------------------------------------------------------
[33]32.StealMemoryForRAMVARS:
[3]33 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
[97]34 jz SHORT .InitializeRamvars ; No need to steal RAM
[3]35
[116]36 LOAD_BDA_SEGMENT_TO ds, ax, ! ; Zero AX
[3]37 mov al, [cs:ROMVARS.bStealSize]
[33]38 sub [BDA.wBaseMem], ax
39 mov ax, [BDA.wBaseMem]
[97]40 eSHL_IM ax, 6 ; Segment to first stolen kB (*=40h)
[33]41 mov ds, ax
[97]42 mov WORD [FULLRAMVARS.wSign], W_SIGN_FULLRAMVARS
43 ; Fall to .InitializeRamvarsFromDS
[3]44
[33]45;--------------------------------------------------------------------
[97]46; .InitializeRamvars
[33]47; Parameters:
[97]48; Nothing
49; Returns:
[33]50; DS: RAMVARS segment
51; Corrupts registers:
52; AX, CX, DI, ES
53;--------------------------------------------------------------------
[97]54.InitializeRamvars:
55 call RamVars_GetSegmentToDS
56 mov cx, RAMVARS_size
57 xor di, di
[33]58 push ds
59 pop es
[97]60 call Memory_ZeroESDIwithSizeInCX
61 ; Fall to .InitializeDriveTranslationAndReturn
[3]62
[97]63;--------------------------------------------------------------------
64; .InitializeDriveTranslationAndReturn
65; Parameters:
66; DS: RAMVARS segment
67; Returns:
68; Nothing
69; Corrupts registers:
70; AX
71;--------------------------------------------------------------------
72.InitializeDriveTranslationAndReturn:
73 pop es
74 jmp DriveXlate_Reset
[33]75
[97]76
[3]77;--------------------------------------------------------------------
78; Returns segment to RAMVARS.
79; RAMVARS might be located at the top of interrupt vectors (0030:0000h)
80; or at the top of system base RAM.
81;
82; RamVars_GetSegmentToDS
83; Parameters:
84; Nothing
85; Returns:
86; DS: RAMVARS segment
87; Corrupts registers:
88; DI
89;--------------------------------------------------------------------
90ALIGN JUMP_ALIGN
91RamVars_GetSegmentToDS:
92 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
[33]93 jnz SHORT .GetStolenSegmentToDS
[3]94 mov di, SEGMENT_RAMVARS_TOP_OF_INTERRUPT_VECTORS
95 mov ds, di
96 ret
97
98ALIGN JUMP_ALIGN
[33]99.GetStolenSegmentToDS:
[3]100 LOAD_BDA_SEGMENT_TO ds, di
101 mov di, [BDA.wBaseMem] ; Load available base memory size in kB
[33]102 eSHL_IM di, 6 ; Segment to first stolen kB (*=40h)
[3]103ALIGN JUMP_ALIGN
104.LoopStolenKBs:
105 mov ds, di ; EBDA segment to DS
106 add di, BYTE 64 ; DI to next stolen kB
107 cmp WORD [FULLRAMVARS.wSign], W_SIGN_FULLRAMVARS
108 jne SHORT .LoopStolenKBs ; Loop until sign found (always found eventually)
109 ret
110
111
112;--------------------------------------------------------------------
113; Checks if INT 13h function is handled by this BIOS.
114;
115; RamVars_IsFunctionHandledByThisBIOS
116; Parameters:
117; AH: INT 13h function number
118; DL: Drive number
119; DS: RAMVARS segment
120; Returns:
121; CF: Set if function is handled by this BIOS
122; Cleared if function belongs to some other BIOS
123; Corrupts registers:
124; DI
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
127RamVars_IsFunctionHandledByThisBIOS:
128 test ah, ah ; Reset for all floppy and hard disk drives?
[32]129 jz SHORT .FunctionIsHandledByOurBIOS
130 cmp ah, 08h ; Read Disk Drive Parameters?
131 jne SHORT RamVars_IsDriveHandledByThisBIOS
[128]132 test dl, dl ; We do not handle floppy drives
133 jns SHORT .FunctionIsNotHandledByOurBIOS
[32]134ALIGN JUMP_ALIGN
135.FunctionIsHandledByOurBIOS:
[3]136 stc
[32]137.FunctionIsNotHandledByOurBIOS:
[3]138 ret
139
140;--------------------------------------------------------------------
141; Checks if drive is handled by this BIOS.
142;
143; RamVars_IsDriveHandledByThisBIOS
144; Parameters:
145; DL: Drive number
146; DS: RAMVARS segment
147; Returns:
148; CF: Set if drive is handled by this BIOS
149; Cleared if drive belongs to some other BIOS
150; Corrupts registers:
151; DI
152;--------------------------------------------------------------------
153ALIGN JUMP_ALIGN
154RamVars_IsDriveHandledByThisBIOS:
155 xchg di, ax ; Backup AX
156 mov ax, [RAMVARS.wDrvCntAndFirst] ; Drive count to AL, First number to AH
157 add al, ah ; One past last drive to AL
158 cmp dl, al ; Above last supported?
159 jae SHORT .DriveNotHandledByThisBIOS
[145]160 cmp ah, dl ; Below first supported?
161 ja SHORT .DriveNotHandledByThisBIOS
[3]162 stc
163ALIGN JUMP_ALIGN
164.DriveNotHandledByThisBIOS:
165 xchg ax, di
166 ret
167
168
169;--------------------------------------------------------------------
170; RamVars_IncrementHardDiskCount
171; Parameters:
172; DL: Drive number for new drive
173; DS: RAMVARS segment
174; Returns:
175; Nothing
176; Corrupts registers:
177; Nothing
178;--------------------------------------------------------------------
179RamVars_IncrementHardDiskCount:
180 inc BYTE [RAMVARS.bDrvCnt] ; Increment drive count to RAMVARS
181 cmp BYTE [RAMVARS.bFirstDrv], 0 ; First drive set?
182 ja SHORT .Return ; If so, return
183 mov [RAMVARS.bFirstDrv], dl ; Store first drive number
184.Return:
185 ret
186
187
188;--------------------------------------------------------------------
[32]189; RamVars_GetHardDiskCountFromBDAtoCX
[3]190; Parameters:
191; DS: RAMVARS segment
192; Returns:
[32]193; CX: Total hard disk count
[3]194; Corrupts registers:
[32]195; Nothing
[116]196;--------------------------------------------------------------------
[3]197ALIGN JUMP_ALIGN
[32]198RamVars_GetHardDiskCountFromBDAtoCX:
[3]199 push es
[32]200 push dx
201
[116]202 LOAD_BDA_SEGMENT_TO es, cx, ! ; Zero CX
[32]203 call RamVars_GetCountOfKnownDrivesToDL
204 MAX_U dl, [es:BDA.bHDCount]
205 mov cl, dl
206
207 pop dx
[3]208 pop es
209 ret
[32]210
211;--------------------------------------------------------------------
212; RamVars_GetCountOfKnownDrivesToDL
213; Parameters:
214; DS: RAMVARS segment
215; Returns:
216; DL: Total hard disk count
217; Corrupts registers:
218; Nothing
[116]219;--------------------------------------------------------------------
[32]220ALIGN JUMP_ALIGN
221RamVars_GetCountOfKnownDrivesToDL:
222 mov dl, [RAMVARS.bFirstDrv] ; Number for our first drive
223 add dl, [RAMVARS.bDrvCnt] ; Our drives
224 and dl, 7Fh ; Clear HD bit for drive count
225 ret
[33]226
227
228;--------------------------------------------------------------------
229; RamVars_GetIdeControllerCountToCX
230; Parameters:
231; Nothing
232; Returns:
233; CX: Number of IDE controllers to handle
234; Corrupts registers:
235; Nothing
[116]236;--------------------------------------------------------------------
[33]237RamVars_GetIdeControllerCountToCX:
[99]238 eMOVZX cx, BYTE [cs:ROMVARS.bIdeCnt]
[33]239 ret
Note: See TracBrowser for help on using the repository browser.