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

Last change on this file since 241 was 241, checked in by gregli@…, 12 years ago

Space optimizations in the Boot Menu and BootInfo routines, taking advantage of nested %s. Optimization in the init of RamVars to avoid writing the signature twice. Preparing for addition of serial floppy support, starting to break the assumption that our drives are always 80h or higher.

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