Rev 1952 | Rev 2047 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
1508 | art_zh | 3 | ;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
431 | serge | 4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
||
6 | ;; ;; |
||
7 | ;; BOOTCODE.INC ;; |
||
8 | ;; ;; |
||
9 | ;; KolibriOS 16-bit loader, ;; |
||
10 | ;; based on bootcode for MenuetOS ;; |
||
11 | ;; ;; |
||
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1 | ha | 13 | |
593 | mikedld | 14 | $Revision: 2014 $ |
1 | ha | 15 | |
16 | |||
17 | ;========================================================================== |
||
18 | ; |
||
19 | ; 16 BIT FUNCTIONS |
||
20 | ; |
||
21 | ;========================================================================== |
||
22 | |||
23 | |||
134 | diamond | 24 | boot_read_floppy: |
1683 | art_zh | 25 | push si |
26 | xor si, si |
||
27 | mov ah, 2 ; read |
||
134 | diamond | 28 | @@: |
1683 | art_zh | 29 | push ax |
30 | int 0x13 |
||
31 | pop ax |
||
32 | jnc @f |
||
33 | inc si |
||
34 | cmp si, 10 |
||
1703 | art_zh | 35 | jnb $ |
134 | diamond | 36 | @@: |
1683 | art_zh | 37 | pop si |
38 | ret |
||
134 | diamond | 39 | |
1703 | art_zh | 40 | sayerr_plain: |
41 | sayerr: |
||
42 | jmp $ |
||
43 | |||
44 | |||
795 | shurf | 45 | ; convert abs. sector number (AX) to BIOS T:H:S |
46 | ; sector number = (abs.sector%BPB_SecPerTrk)+1 |
||
47 | ; pre.track number = (abs.sector/BPB_SecPerTrk) |
||
48 | ; head number = pre.track number%BPB_NumHeads |
||
49 | ; track number = pre.track number/BPB_NumHeads |
||
50 | ; Return: cl - sector number |
||
51 | ; ch - track number |
||
52 | ; dl - drive number (0 = a:) |
||
53 | ; dh - head number |
||
54 | conv_abs_to_THS: |
||
1683 | art_zh | 55 | push bx |
56 | mov bx,word [BPB_SecPerTrk] |
||
57 | xor dx,dx |
||
58 | div bx |
||
59 | inc dx |
||
60 | mov cl, dl ; cl = sector number |
||
61 | mov bx,word [BPB_NumHeads] |
||
62 | xor dx,dx |
||
63 | div bx |
||
64 | ; !!!!!!! ax = track number, dx = head number |
||
65 | mov ch,al ; ch=track number |
||
66 | xchg dh,dl ; dh=head number |
||
67 | mov dl,0 ; dl=0 (drive 0 (a:)) |
||
68 | pop bx |
||
69 | retn |
||
795 | shurf | 70 | ; needed variables |
1683 | art_zh | 71 | BPB_SecPerTrk dw 0 ; sectors per track |
72 | BPB_NumHeads dw 0 ; number of heads |
||
73 | BPB_FATSz16 dw 0 ; size of FAT |
||
74 | BPB_RootEntCnt dw 0 ; count of root dir. entries |
||
75 | BPB_BytsPerSec dw 0 ; bytes per sector |
||
76 | BPB_RsvdSecCnt dw 0 ; number of reserved sectors |
||
77 | BPB_TotSec16 dw 0 ; count of the sectors on the volume |
||
78 | BPB_SecPerClus db 0 ; number of sectors per cluster |
||
79 | BPB_NumFATs db 0 ; number of FAT tables |
||
80 | abs_sector_adj dw 0 ; adjustment to make abs. sector number |
||
81 | end_of_FAT dw 0 ; end of FAT table |
||
82 | FirstDataSector dw 0 ; begin of data |
||
795 | shurf | 83 | |
1 | ha | 84 | ;========================================================================= |
85 | ; |
||
86 | ; 16 BIT CODE |
||
87 | ; |
||
88 | ;========================================================================= |
||
89 | |||
1683 | art_zh | 90 | include 'bootvesa.inc' ;Include source for boot vesa |
1 | ha | 91 | |
92 | start_of_code: |
||
1683 | art_zh | 93 | cld |
29 | halyavin | 94 | ; \begin{diamond}[02.12.2005] |
514 | diamond | 95 | ; if bootloader sets ax = 'KL', then ds:si points to loader block |
1683 | art_zh | 96 | cmp ax, 'KL' |
97 | jnz @f |
||
98 | mov word [cs:cfgmanager.loader_block], si |
||
99 | mov word [cs:cfgmanager.loader_block+2], ds |
||
29 | halyavin | 100 | @@: |
101 | ; \end{diamond}[02.12.2005] |
||
1 | ha | 102 | |
514 | diamond | 103 | ; if bootloader sets cx = 'HA' and dx = 'RD', then bx contains identifier of source hard disk |
104 | ; (see comment to bx_from_load) |
||
1683 | art_zh | 105 | cmp cx, 'HA' |
106 | jnz no_hd_load |
||
107 | cmp dx,'RD' |
||
108 | jnz no_hd_load |
||
109 | mov word [cs:bx_from_load], bx ; {SPraid}[13.03.2007] |
||
488 | spraid | 110 | no_hd_load: |
111 | |||
29 | halyavin | 112 | ; set up stack |
1683 | art_zh | 113 | mov ax, 3000h |
114 | mov ss, ax |
||
115 | mov sp, 0EC00h |
||
29 | halyavin | 116 | ; set up segment registers |
1683 | art_zh | 117 | push cs |
118 | pop ds |
||
119 | push cs |
||
120 | pop es |
||
1 | ha | 121 | |
2014 | art_zh | 122 | if 0 |
29 | halyavin | 123 | ; set videomode |
1683 | art_zh | 124 | mov ax, 3 |
125 | int 0x10 |
||
1 | ha | 126 | |
29 | halyavin | 127 | ; draw frames |
1683 | art_zh | 128 | push 0xb800 |
129 | pop es |
||
130 | xor di, di |
||
131 | mov ah, 1*16+15 |
||
2014 | art_zh | 132 | end if |
465 | serge | 133 | |
1703 | art_zh | 134 | cpugood: |
1 | ha | 135 | |
1683 | art_zh | 136 | push 0 |
137 | popf |
||
138 | sti |
||
465 | serge | 139 | |
29 | halyavin | 140 | ; set up esp |
1683 | art_zh | 141 | movzx esp, sp |
1 | ha | 142 | |
1683 | art_zh | 143 | push 0 |
144 | pop es |
||
145 | and word [es:0x9031], 0 |
||
164 | serge | 146 | ; \begin{Mario79} |
147 | ; find HDD IDE DMA PCI device |
||
160 | diamond | 148 | ; check for PCI BIOS |
1683 | art_zh | 149 | mov ax, 0xB101 |
150 | int 0x1A |
||
151 | jc .nopci |
||
152 | cmp edx, 'PCI ' |
||
153 | jnz .nopci |
||
160 | diamond | 154 | ; find PCI class code |
155 | ; class 1 = mass storage |
||
156 | ; subclass 1 = IDE controller |
||
157 | ; a) class 1, subclass 1, programming interface 0x80 |
||
1683 | art_zh | 158 | mov ax, 0xB103 |
159 | mov ecx, 1*10000h + 1*100h + 0x80 |
||
160 | xor si, si ; device index = 0 |
||
161 | int 0x1A |
||
162 | jnc .found |
||
187 | diamond | 163 | ; b) class 1, subclass 1, programming interface 0x8A |
1683 | art_zh | 164 | mov ax, 0xB103 |
165 | mov ecx, 1*10000h + 1*100h + 0x8A |
||
166 | xor si, si ; device index = 0 |
||
167 | int 0x1A |
||
168 | jnc .found |
||
187 | diamond | 169 | ; c) class 1, subclass 1, programming interface 0x85 |
1683 | art_zh | 170 | mov ax, 0xB103 |
171 | mov ecx, 1*10000h + 1*100h + 0x85 |
||
172 | xor si, si |
||
173 | int 0x1A |
||
174 | jc .nopci |
||
160 | diamond | 175 | .found: |
176 | ; get memory base |
||
1683 | art_zh | 177 | mov ax, 0xB10A |
178 | mov di, 0x20 ; memory base is config register at 0x20 |
||
179 | int 0x1A |
||
180 | jc .nopci |
||
181 | and cx, 0xFFF0 ; clear address decode type |
||
182 | mov [es:0x9031], cx |
||
160 | diamond | 183 | .nopci: |
164 | serge | 184 | ; \end{Mario79} |
160 | diamond | 185 | |
76 | mario79 | 186 | ; --------------- APM --------------------- |
1683 | art_zh | 187 | and word [es:0x9044], 0 ; ver = 0.0 (APM not found) |
188 | mov ax, 0x5300 |
||
189 | xor bx, bx |
||
190 | int 0x15 |
||
191 | jc apm_end ; APM not found |
||
192 | test cx, 2 |
||
193 | jz apm_end ; APM 32-bit protected-mode interface not supported |
||
194 | mov [es:0x9044], ax ; Save APM Version |
||
195 | mov [es:0x9046], cx ; Save APM flags |
||
164 | serge | 196 | |
1683 | art_zh | 197 | mov ax, 0x5304 ; Disconnect interface |
198 | xor bx, bx |
||
199 | int 0x15 |
||
200 | mov ax, 0x5303 ; Connect 32 bit mode interface |
||
201 | xor bx, bx |
||
202 | int 0x15 |
||
465 | serge | 203 | |
1683 | art_zh | 204 | mov [es:0x9040], ebx |
205 | mov [es:0x9050], ax |
||
206 | mov [es:0x9052], cx |
||
207 | mov [es:0x9054], dx |
||
465 | serge | 208 | |
76 | mario79 | 209 | apm_end: |
210 | |||
713 | Lrz | 211 | ;CHECK current of code |
1683 | art_zh | 212 | cmp [cfgmanager.loader_block], -1 |
213 | jz noloaderblock |
||
214 | les bx, [cfgmanager.loader_block] |
||
215 | cmp byte [es:bx], 1 |
||
216 | jnz sayerr |
||
217 | push 0 |
||
218 | pop es |
||
713 | Lrz | 219 | |
220 | noloaderblock: |
||
1 | ha | 221 | ; DISPLAY VESA INFORMATION |
1683 | art_zh | 222 | call print_vesa_info |
223 | call calc_vmodes_table |
||
224 | call check_first_parm ;check and enable cursor_pos |
||
1 | ha | 225 | |
29 | halyavin | 226 | ; \begin{diamond}[30.11.2005] |
227 | cfgmanager: |
||
228 | ; settings: |
||
229 | ; a) preboot_graph = graphical mode |
||
230 | ; preboot_gprobe = probe this mode? |
||
713 | Lrz | 231 | ; b) preboot_dma = use DMA access? |
29 | halyavin | 232 | ; c) preboot_vrrm = use VRR? |
233 | ; d) preboot_device = from what boot? |
||
713 | Lrz | 234 | |
29 | halyavin | 235 | ; determine default settings |
1703 | art_zh | 236 | ; mov [.bSettingsChanged], 0 |
713 | Lrz | 237 | |
238 | ;.preboot_gr_end: |
||
1683 | art_zh | 239 | mov di, preboot_device |
726 | diamond | 240 | ; if image in memory is present and [preboot_device] is uninitialized, |
241 | ; set it to use this preloaded image |
||
1683 | art_zh | 242 | cmp byte [di], 0 |
243 | jnz .preboot_device_inited |
||
244 | cmp [.loader_block], -1 |
||
245 | jz @f |
||
246 | les bx, [.loader_block] |
||
247 | test byte [es:bx+1], 1 |
||
248 | jz @f |
||
249 | mov byte [di], 3 |
||
250 | jmp .preboot_device_inited |
||
726 | diamond | 251 | @@: |
252 | ; otherwise, set [preboot_device] to 1 (default value - boot from floppy) |
||
1683 | art_zh | 253 | mov byte [di], 1 |
726 | diamond | 254 | .preboot_device_inited: |
1018 | diamond | 255 | ; following 4 lines set variables to 1 if its current value is 0 |
1683 | art_zh | 256 | cmp byte [di+preboot_dma-preboot_device], 1 |
257 | adc byte [di+preboot_dma-preboot_device], 0 |
||
258 | cmp byte [di+preboot_biosdisk-preboot_device], 1 |
||
259 | adc byte [di+preboot_biosdisk-preboot_device], 0 |
||
713 | Lrz | 260 | |
1703 | art_zh | 261 | ; pop ax ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ?? |
262 | jmp .continue |
||
2014 | art_zh | 263 | |
143 | diamond | 264 | .loader_block dd -1 |
29 | halyavin | 265 | .continue: |
1683 | art_zh | 266 | sti |
1703 | art_zh | 267 | jmp .load |
946 | lrz | 268 | |
29 | halyavin | 269 | .loadc: |
1683 | art_zh | 270 | pop eax |
29 | halyavin | 271 | .cont: |
1683 | art_zh | 272 | push cs |
273 | pop ds |
||
29 | halyavin | 274 | .load: |
1 | ha | 275 | |
276 | ; ASK GRAPHICS MODE |
||
277 | |||
1683 | art_zh | 278 | call set_vmode |
1 | ha | 279 | |
280 | ; GRAPHICS ACCELERATION |
||
346 | diamond | 281 | ; force yes |
1683 | art_zh | 282 | mov [es:0x901C], byte 1 |
1 | ha | 283 | |
514 | diamond | 284 | ; DMA ACCESS TO HD |
1 | ha | 285 | |
1683 | art_zh | 286 | mov al, [preboot_dma] |
287 | mov [es:0x901F], al |
||
346 | diamond | 288 | |
1 | ha | 289 | ; VRR_M USE |
290 | |||
1683 | art_zh | 291 | mov al,[preboot_vrrm] |
292 | mov [es:0x9030], al |
||
293 | mov [es:0x901E], byte 1 |
||
1 | ha | 294 | |
295 | ; BOOT DEVICE |
||
296 | |||
1683 | art_zh | 297 | mov al, [preboot_device] |
298 | dec al |
||
299 | mov [boot_dev], al |
||
1 | ha | 300 | |
1103 | diamond | 301 | ; GET MEMORY MAP |
302 | include 'detect/biosmem.inc' |
||
303 | |||
1 | ha | 304 | ; READ DISKETTE TO MEMORY |
305 | |||
795 | shurf | 306 | |
1683 | art_zh | 307 | |
1 | ha | 308 | ; SET GRAPHICS |
309 | |||
1683 | art_zh | 310 | xor ax, ax |
311 | mov es, ax |
||
164 | serge | 312 | |
1683 | art_zh | 313 | mov bx, [es:0x9008] ; vga & 320x200 |
314 | mov ax, 0x4f02 ; Vesa |
||
412 | serge | 315 | setgr: |
1683 | art_zh | 316 | int 0x10 |
317 | test ah, ah |
||
1703 | art_zh | 318 | jnz $ |
412 | serge | 319 | gmok2: |
1683 | art_zh | 320 | push ds |
321 | pop es><><<><<<><<<<><<<<<><<<<<<><<<<<<<><<<<<<<<><<<<<<<<<><<<<<<<<<<><<<<<<<<<<<><<<<<<<<<<<<><<<<<<<<<<<<<><<<<<<<<<<<<<<><<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<> |