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

Last change on this file since 526 was 526, checked in by krille_n_@…, 11 years ago

Changes:

  • Update of the copyright notices to include the year 2013.
File size: 6.2 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for accessings RAMVARS.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Initializes RAMVARS.
25; Drive detection can be started after this function returns.
26;
27; RamVars_Initialize
28;   Parameters:
29;       Nothing
30;   Returns:
31;       DS:     RAMVARS segment
32;   Corrupts registers:
33;       AX, CX, DI
34;--------------------------------------------------------------------
35RamVars_Initialize:
36    push    es
37    ; Fall to .StealMemoryForRAMVARS
38
39;--------------------------------------------------------------------
40; .StealMemoryForRAMVARS
41;   Parameters:
42;       Nothing
43;   Returns:
44;       DS:     RAMVARS segment
45;   Corrupts registers:
46;       AX
47;--------------------------------------------------------------------
48.StealMemoryForRAMVARS:
49%ifndef USE_AT
50    mov     ax, LITE_MODE_RAMVARS_SEGMENT
51    test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
52    jz      SHORT .InitializeRamvars    ; No need to steal RAM
53%endif
54
55    LOAD_BDA_SEGMENT_TO ds, ax, !       ; Zero AX
56    mov     al, [cs:ROMVARS.bStealSize]
57    sub     [BDA.wBaseMem], ax
58    mov     ax, [BDA.wBaseMem]
59    eSHL_IM ax, 6                       ; Segment to first stolen kB (*=40h)
60    ; Fall to .InitializeRamvars
61
62;--------------------------------------------------------------------
63; .InitializeRamvars
64;   Parameters:
65;       AX:     RAMVARS segment
66;   Returns:
67;       DS:     RAMVARS segment
68;   Corrupts registers:
69;       AX, CX, DI, ES
70;--------------------------------------------------------------------
71.InitializeRamvars:
72    mov     ds, ax
73    mov     es, ax
74    mov     cx, RAMVARS_size
75    xor     di, di
76    call    Memory_ZeroESDIwithSizeInCX
77    mov     WORD [RAMVARS.wDrvDetectSignature], RAMVARS_DRV_DETECT_SIGNATURE
78    mov     WORD [RAMVARS.wSignature], RAMVARS_RAM_SIGNATURE
79;; There used to be a DriveXlate_Reset call here.  It isn't necessary, as we reset
80;; when entering the boot menu and also before transferring control at boot time and
81;; for ROM boots (in int19h.asm).
82
83    pop     es
84    ret
85
86;--------------------------------------------------------------------
87; Returns segment to RAMVARS.
88; RAMVARS might be located at the top of interrupt vectors (0030:0000h)
89; or at the top of system base RAM.
90;
91; RamVars_GetSegmentToDS
92;   Parameters:
93;       Nothing
94;   Returns:
95;       DS:     RAMVARS segment
96;   Corrupts registers:
97;       DI
98;--------------------------------------------------------------------
99ALIGN JUMP_ALIGN
100RamVars_GetSegmentToDS:
101
102%ifndef USE_AT  ; Always in Full Mode for AT builds
103    test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
104    jnz     SHORT .GetStolenSegmentToDS
105    %ifndef USE_186
106        mov     di, LITE_MODE_RAMVARS_SEGMENT
107        mov     ds, di
108    %else
109        push    LITE_MODE_RAMVARS_SEGMENT
110        pop     ds
111    %endif
112    ret
113%endif
114
115ALIGN JUMP_ALIGN
116.GetStolenSegmentToDS:
117    LOAD_BDA_SEGMENT_TO ds, di
118    mov     di, [BDA.wBaseMem]      ; Load available base memory size in kB
119    eSHL_IM di, 6                   ; Segment to first stolen kB (*=40h)
120ALIGN JUMP_ALIGN
121.LoopStolenKBs:
122    mov     ds, di                  ; EBDA segment to DS
123    add     di, BYTE 64             ; DI to next stolen kB
124    cmp     WORD [RAMVARS.wSignature], RAMVARS_RAM_SIGNATURE
125    jne     SHORT .LoopStolenKBs    ; Loop until sign found (always found eventually)
126    ret
127
128
129;--------------------------------------------------------------------
130; RamVars_GetHardDiskCountFromBDAtoAX
131;   Parameters:
132;       DS:     RAMVARS segment
133;   Returns:
134;       AX:     Total hard disk count
135;   Corrupts registers:
136;       BX
137;--------------------------------------------------------------------
138%ifdef MODULE_BOOT_MENU
139RamVars_GetHardDiskCountFromBDAtoAX:
140    call    RamVars_GetCountOfKnownDrivesToAX
141    push    ds
142    LOAD_BDA_SEGMENT_TO ds, bx
143    mov     bl, [BDA.bHDCount]
144    MAX_U   al, bl
145    pop     ds
146    ret
147%endif
148
149
150;--------------------------------------------------------------------
151; RamVars_GetCountOfKnownDrivesToAX
152;   Parameters:
153;       DS:     RAMVARS segment
154;   Returns:
155;       AX:     Total hard disk count
156;   Corrupts registers:
157;       None
158;--------------------------------------------------------------------
159ALIGN JUMP_ALIGN
160RamVars_GetCountOfKnownDrivesToAX:
161    mov     ax, [RAMVARS.wFirstDrvAndCount]
162    add     al, ah
163    and     ax, BYTE 7fh
164    ret
165
166;--------------------------------------------------------------------
167; RamVars_GetIdeControllerCountToCX
168;   Parameters:
169;       Nothing
170;   Returns:
171;       CX:     Number of IDE controllers to handle
172;   Corrupts registers:
173;       Nothing
174;--------------------------------------------------------------------
175ALIGN JUMP_ALIGN
176RamVars_GetIdeControllerCountToCX:
177    eMOVZX  cx, [cs:ROMVARS.bIdeCnt]
178    ret
179
180
181%ifdef MODULE_SERIAL_FLOPPY
182;--------------------------------------------------------------------
183; RamVars_UnpackFlopCntAndFirstToAL
184;   Parameters:
185;       DS:     RAMVARS segment
186;   Returns:
187;       AL:     First floppy drive number supported
188;       CF:     Number of floppy drives supported (clear = 1, set = 2)
189;       SF:     Emulating drives (clear = yes, set = no)
190;   Corrupts registers:
191;       Nothing
192;--------------------------------------------------------------------
193ALIGN JUMP_ALIGN
194RamVars_UnpackFlopCntAndFirstToAL:
195    mov     al, [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst]
196    sar     al, 1
197    ret
198%endif
199
200
201%if 0                           ; unused...
202;--------------------------------------------------------------------
203; RamVars_IsDriveDetectionInProgress
204;   Parameters:
205;       DS:     RAMVARS segment
206;   Returns:
207;       ZF:     Set if drive detection is in progress (ROM initialization)
208;   Corrupts registers:
209;       None
210;--------------------------------------------------------------------
211RamVars_IsDriveDetectionInProgress:
212    cmp     WORD [RAMVARS.wSignature], RAMVARS_DRV_DETECT_SIGNATURE
213    ret
214%endif
Note: See TracBrowser for help on using the repository browser.