Rev 1635 | Rev 2268 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1635 | Rev 2010 | ||
---|---|---|---|
Line 9... | Line 9... | ||
9 | ;; KolibriOS 16-bit loader, ;; |
9 | ;; KolibriOS 16-bit loader, ;; |
10 | ;; based on bootcode for MenuetOS ;; |
10 | ;; based on bootcode for MenuetOS ;; |
11 | ;; ;; |
11 | ;; ;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 13... | Line 13... | ||
13 | 13 | ||
Line 14... | Line 14... | ||
14 | $Revision: 1264 $ |
14 | $Revision: 2010 $ |
15 | 15 | ||
16 | 16 | ||
Line 89... | Line 89... | ||
89 | pop ax |
89 | pop ax |
90 | jnc @f |
90 | jnc @f |
91 | inc si |
91 | inc si |
92 | cmp si, 10 |
92 | cmp si, 10 |
93 | jb @b |
93 | jb @b |
- | 94 | sayerr_badsect: |
|
94 | mov si, badsect |
95 | mov si, badsect |
95 | sayerr_plain: |
96 | sayerr_plain: |
96 | call printplain |
97 | call printplain |
97 | jmp $ |
98 | jmp $ |
98 | @@: |
99 | @@: |
Line 143... | Line 144... | ||
143 | ; 16 BIT CODE |
144 | ; 16 BIT CODE |
144 | ; |
145 | ; |
145 | ;========================================================================= |
146 | ;========================================================================= |
Line 146... | Line 147... | ||
146 | 147 | ||
- | 148 | include 'bootvesa.inc' ;Include source for boot vesa |
|
- | 149 | if defined extended_primary_loader |
|
- | 150 | include 'parsers.inc' |
|
Line 147... | Line 151... | ||
147 | include 'bootvesa.inc' ;Include source for boot vesa |
151 | end if |
- | 152 | ||
- | 153 | start_of_code: |
|
- | 154 | ||
- | 155 | if defined extended_primary_loader |
|
- | 156 | ; save data from primary loader |
|
- | 157 | mov word [cs:bootcallback], si |
|
- | 158 | mov word [cs:bootcallback+2], ds |
|
- | 159 | push cs |
|
- | 160 | pop ds |
|
- | 161 | mov [bootdevice], ax |
|
- | 162 | mov [bootfs], bx |
|
- | 163 | ||
- | 164 | ; set up stack |
|
- | 165 | mov ax, 3000h |
|
- | 166 | mov ss, ax |
|
- | 167 | mov sp, 0EC00h |
|
- | 168 | ||
- | 169 | ; try to load configuration file |
|
- | 170 | mov ax, 1 |
|
- | 171 | mov di, config_file_struct |
|
- | 172 | call [bootcallback] |
|
- | 173 | cld |
|
- | 174 | push cs |
|
- | 175 | pop es |
|
- | 176 | ; bx=0 - ok, bx=1 - part of file loaded, assume this is ok |
|
- | 177 | cmp bx, 1 |
|
- | 178 | ja .config_bad |
|
- | 179 | ; configuration file was loaded, parse |
|
- | 180 | ; if length is too big, use first 0FFFFh bytes |
|
- | 181 | test dx, dx |
|
- | 182 | jz @f |
|
- | 183 | mov ax, 0FFFFh |
|
- | 184 | @@: |
|
- | 185 | ; ds:si will be pointer to current data, dx = limit |
|
- | 186 | xchg ax, dx |
|
- | 187 | push 4000h |
|
- | 188 | pop ds |
|
- | 189 | xor si, si |
|
- | 190 | .parse_loop: |
|
- | 191 | ; skip spaces |
|
- | 192 | cmp si, dx |
|
- | 193 | jae .parse_done |
|
- | 194 | lodsb |
|
- | 195 | cmp al, ' ' |
|
- | 196 | jbe .parse_loop |
|
- | 197 | dec si |
|
- | 198 | ; loop over all possible configuration values |
|
- | 199 | mov bx, config_file_variables |
|
- | 200 | .find_variant: |
|
- | 201 | ; get length |
|
- | 202 | mov cx, [es:bx] |
|
- | 203 | ; zero length = end of list |
|
- | 204 | jecxz .find_newline |
|
- | 205 | ; skip over length |
|
- | 206 | inc bx |
|
- | 207 | inc bx |
|
- | 208 | mov di, bx |
|
- | 209 | ; skip over string |
|
- | 210 | add bx, cx |
|
- | 211 | ; test whether we have at least cx symbols left |
|
- | 212 | mov ax, cx |
|
- | 213 | add ax, si |
|
- | 214 | jc .next_variant1 |
|
- | 215 | cmp ax, dx |
|
- | 216 | jae .next_variant1 |
|
- | 217 | ; save current position |
|
- | 218 | push si |
|
- | 219 | ; compare strings |
|
- | 220 | repz cmpsb |
|
- | 221 | jnz .next_variant2 |
|
- | 222 | ; strings are equal; look for "=" with possible spaces before and after |
|
- | 223 | @@: |
|
- | 224 | cmp si, dx |
|
- | 225 | jae .next_variant2 |
|
- | 226 | lodsb |
|
- | 227 | cmp al, ' ' |
|
- | 228 | jbe @b |
|
- | 229 | cmp al, '=' |
|
- | 230 | jnz .next_variant2 |
|
- | 231 | ; ok, we found the true variant |
|
- | 232 | ; ignore saved position on the stack |
|
- | 233 | pop ax |
|
- | 234 | ; call the parser |
|
- | 235 | call word [es:bx] |
|
- | 236 | ; line parsed, find next |
|
- | 237 | .find_newline: |
|
- | 238 | cmp si, dx |
|
- | 239 | jae .parse_done |
|
- | 240 | lodsb |
|
- | 241 | cmp al, 13 |
|
- | 242 | jz .parse_loop |
|
- | 243 | cmp al, 10 |
|
- | 244 | jz .parse_loop |
|
- | 245 | jmp .find_newline |
|
- | 246 | .next_variant2: |
|
- | 247 | ; continue to the next variant, restoring current position |
|
- | 248 | pop si |
|
- | 249 | .next_variant1: |
|
- | 250 | ; continue to the next variant |
|
- | 251 | ; skip over the parser |
|
- | 252 | inc bx |
|
- | 253 | inc bx |
|
- | 254 | jmp .find_variant |
|
- | 255 | .parse_done: |
|
- | 256 | .config_bad: |
|
- | 257 | ||
- | 258 | ; set up segment registers |
|
- | 259 | push cs |
|
148 | 260 | pop ds |
|
149 | start_of_code: |
261 | else |
150 | cld |
262 | cld |
151 | ; \begin{diamond}[02.12.2005] |
263 | ; \begin{diamond}[02.12.2005] |
152 | ; if bootloader sets ax = 'KL', then ds:si points to loader block |
264 | ; if bootloader sets ax = 'KL', then ds:si points to loader block |
Line 173... | Line 285... | ||
173 | ; set up segment registers |
285 | ; set up segment registers |
174 | push cs |
286 | push cs |
175 | pop ds |
287 | pop ds |
176 | push cs |
288 | push cs |
177 | pop es |
289 | pop es |
- | 290 | end if |
|
Line 178... | Line 291... | ||
178 | 291 | ||
179 | ; set videomode |
292 | ; set videomode |
180 | mov ax, 3 |
293 | mov ax, 3 |
Line 376... | Line 489... | ||
376 | mov [es:0x9054], dx |
489 | mov [es:0x9054], dx |
Line 377... | Line 490... | ||
377 | 490 | ||
378 | apm_end: |
491 | apm_end: |
Line -... | Line 492... | ||
- | 492 | _setcursor d80x25_top_num, 0 |
|
379 | _setcursor d80x25_top_num, 0 |
493 | |
380 | 494 | if ~ defined extended_primary_loader |
|
381 | ;CHECK current of code |
495 | ;CHECK current of code |
382 | cmp [cfgmanager.loader_block], -1 |
496 | cmp [cfgmanager.loader_block], -1 |
383 | jz noloaderblock |
497 | jz noloaderblock |
384 | les bx, [cfgmanager.loader_block] |
498 | les bx, [cfgmanager.loader_block] |
385 | cmp byte [es:bx], 1 |
499 | cmp byte [es:bx], 1 |
386 | mov si, loader_block_error |
500 | mov si, loader_block_error |
387 | jnz sayerr |
501 | jnz sayerr |
- | 502 | push 0 |
|
Line 388... | Line 503... | ||
388 | push 0 |
503 | pop es |
389 | pop es |
504 | end if |
390 | 505 | ||
391 | noloaderblock: |
506 | noloaderblock: |
Line 402... | Line 517... | ||
402 | ; b) preboot_dma = use DMA access? |
517 | ; b) preboot_dma = use DMA access? |
403 | ; c) preboot_vrrm = use VRR? |
518 | ; c) preboot_vrrm = use VRR? |
404 | ; d) preboot_device = from what boot? |
519 | ; d) preboot_device = from what boot? |
Line 405... | Line 520... | ||
405 | 520 | ||
- | 521 | ; determine default settings |
|
406 | ; determine default settings |
522 | if ~ defined extended_primary_loader |
- | 523 | mov [.bSettingsChanged], 0 |
|
Line 407... | Line 524... | ||
407 | mov [.bSettingsChanged], 0 |
524 | end if |
408 | 525 | ||
409 | ;.preboot_gr_end: |
526 | ;.preboot_gr_end: |
410 | mov di, preboot_device |
527 | mov di, preboot_device |
411 | ; if image in memory is present and [preboot_device] is uninitialized, |
528 | ; if image in memory is present and [preboot_device] is uninitialized, |
412 | ; set it to use this preloaded image |
529 | ; set it to use this preloaded image |
- | 530 | cmp byte [di], 0 |
|
- | 531 | jnz .preboot_device_inited |
|
- | 532 | if defined extended_primary_loader |
|
- | 533 | inc byte [di] |
|
- | 534 | cmp byte [bootdevice], 'f' ; floppy? |
|
- | 535 | jz .preboot_device_inited |
|
413 | cmp byte [di], 0 |
536 | inc byte [di] |
414 | jnz .preboot_device_inited |
537 | else |
415 | cmp [.loader_block], -1 |
538 | cmp [.loader_block], -1 |
416 | jz @f |
539 | jz @f |
417 | les bx, [.loader_block] |
540 | les bx, [.loader_block] |
418 | test byte [es:bx+1], 1 |
541 | test byte [es:bx+1], 1 |
419 | jz @f |
542 | jz @f |
420 | mov byte [di], 3 |
543 | mov byte [di], 3 |
421 | jmp .preboot_device_inited |
544 | jmp .preboot_device_inited |
422 | @@: |
545 | @@: |
- | 546 | ; otherwise, set [preboot_device] to 1 (default value - boot from floppy) |
|
423 | ; otherwise, set [preboot_device] to 1 (default value - boot from floppy) |
547 | mov byte [di], 1 |
424 | mov byte [di], 1 |
548 | end if |
425 | .preboot_device_inited: |
549 | .preboot_device_inited: |
426 | ; following 4 lines set variables to 1 if its current value is 0 |
550 | ; following 4 lines set variables to 1 if its current value is 0 |
427 | cmp byte [di+preboot_dma-preboot_device], 1 |
551 | cmp byte [di+preboot_dma-preboot_device], 1 |
Line 464... | Line 588... | ||
464 | cmp [preboot_vrrm], 1 |
588 | cmp [preboot_vrrm], 1 |
465 | call .say_on_off |
589 | call .say_on_off |
466 | mov si, preboot_device_msg |
590 | mov si, preboot_device_msg |
467 | call print |
591 | call print |
468 | mov al, [preboot_device] |
592 | mov al, [preboot_device] |
- | 593 | if defined extended_primary_loader |
|
- | 594 | and eax, 3 |
|
- | 595 | else |
|
469 | and eax, 7 |
596 | and eax, 7 |
- | 597 | end if |
|
470 | mov si, [preboot_device_msgs+eax*2] |
598 | mov si, [preboot_device_msgs+eax*2] |
471 | call printplain |
599 | call printplain |
472 | .show_remarks: |
600 | .show_remarks: |
473 | ; show remarks in gray color |
601 | ; show remarks in gray color |
474 | mov di, ((21-num_remarks)*80 + 2)*2 |
602 | mov di, ((21-num_remarks)*80 + 2)*2 |
Line 551... | Line 679... | ||
551 | cmp al, 'd' |
679 | cmp al, 'd' |
552 | jnz .show_remarks |
680 | jnz .show_remarks |
553 | _setcursor 15,0 |
681 | _setcursor 15,0 |
554 | mov si, bdev |
682 | mov si, bdev |
555 | call print |
683 | call print |
- | 684 | if defined extended_primary_loader |
|
- | 685 | mov bx, '12' |
|
- | 686 | else |
|
556 | mov bx, '14' |
687 | mov bx, '14' |
- | 688 | end if |
|
557 | call getkey |
689 | call getkey |
558 | mov [preboot_device], al |
690 | mov [preboot_device], al |
559 | _setcursor 13,0 |
691 | _setcursor 13,0 |
560 | .d: |
692 | .d: |
- | 693 | if ~ defined extended_primary_loader |
|
561 | mov [.bSettingsChanged], 1 |
694 | mov [.bSettingsChanged], 1 |
- | 695 | end if |
|
562 | call clear_vmodes_table ;clear vmodes_table |
696 | call clear_vmodes_table ;clear vmodes_table |
563 | jmp .printcfg |
697 | jmp .printcfg |
564 | .change_a: |
698 | .change_a: |
565 | .loops: |
699 | .loops: |
566 | call draw_vmodes_table |
700 | call draw_vmodes_table |
Line 670... | Line 804... | ||
670 | @@: jmp printplain |
804 | @@: jmp printplain |
671 | ; novesa and vervesa strings are not used at the moment of executing this code |
805 | ; novesa and vervesa strings are not used at the moment of executing this code |
672 | virtual at novesa |
806 | virtual at novesa |
673 | .oldtimer dd ? |
807 | .oldtimer dd ? |
674 | .starttime dd ? |
808 | .starttime dd ? |
- | 809 | if ~ defined extended_primary_loader |
|
675 | .bSettingsChanged db ? |
810 | .bSettingsChanged db ? |
- | 811 | end if |
|
676 | .timer dd ? |
812 | .timer dd ? |
677 | end virtual |
813 | end virtual |
- | 814 | if ~ defined extended_primary_loader |
|
678 | .loader_block dd -1 |
815 | .loader_block dd -1 |
- | 816 | end if |
|
679 | .gettime: |
817 | .gettime: |
680 | mov ah, 0 |
818 | mov ah, 0 |
681 | int 1Ah |
819 | int 1Ah |
682 | xchg ax, cx |
820 | xchg ax, cx |
683 | shl eax, 10h |
821 | shl eax, 10h |
Line 690... | Line 828... | ||
690 | pushf |
828 | pushf |
691 | call [.oldtimer] |
829 | call [.oldtimer] |
692 | pushad |
830 | pushad |
693 | call .gettime |
831 | call .gettime |
694 | sub eax, [.starttime] |
832 | sub eax, [.starttime] |
- | 833 | if defined extended_primary_loader |
|
- | 834 | sub ax, [preboot_timeout] |
|
- | 835 | else |
|
695 | sub ax, 18*5 |
836 | sub ax, 18*5 |
- | 837 | end if |
|
696 | jae .timergo |
838 | jae .timergo |
697 | neg ax |
839 | neg ax |
698 | add ax, 18-1 |
840 | add ax, 18-1 |
699 | mov bx, 18 |
841 | mov bx, 18 |
700 | xor dx, dx |
842 | xor dx, dx |
Line 746... | Line 888... | ||
746 | call printplain |
888 | call printplain |
747 | _setcursor 6,0 |
889 | _setcursor 6,0 |
748 | mov si, loading_msg |
890 | mov si, loading_msg |
749 | call print |
891 | call print |
750 | _setcursor 15,0 |
892 | _setcursor 15,0 |
- | 893 | if ~ defined extended_primary_loader |
|
751 | cmp [.bSettingsChanged], 0 |
894 | cmp [.bSettingsChanged], 0 |
752 | jz .load |
895 | jz .load |
753 | cmp [.loader_block], -1 |
896 | cmp [.loader_block], -1 |
754 | jz .load |
897 | jz .load |
755 | les bx, [.loader_block] |
898 | les bx, [.loader_block] |
Line 786... | Line 929... | ||
786 | mov byte [si+80], 0 |
929 | mov byte [si+80], 0 |
787 | _setcursor 15,0 |
930 | _setcursor 15,0 |
788 | call printplain |
931 | call printplain |
789 | _setcursor 15,0 |
932 | _setcursor 15,0 |
790 | .load: |
933 | .load: |
- | 934 | end if |
|
791 | ; \end{diamond}[02.12.2005] |
935 | ; \end{diamond}[02.12.2005] |
Line 792... | Line 936... | ||
792 | 936 | ||
Line 793... | Line 937... | ||
793 | ; ASK GRAPHICS MODE |
937 | ; ASK GRAPHICS MODE |
Line 814... | Line 958... | ||
814 | mov al, [preboot_device] |
958 | mov al, [preboot_device] |
815 | dec al |
959 | dec al |
816 | mov [boot_dev], al |
960 | mov [boot_dev], al |
Line 817... | Line 961... | ||
817 | 961 | ||
818 | ; GET MEMORY MAP |
962 | ; GET MEMORY MAP |
Line 819... | Line 963... | ||
819 | include 'detect/biosmem.inc' |
963 | include '../detect/biosmem.inc' |
Line 820... | Line 964... | ||
820 | 964 | ||
821 | ; READ DISKETTE TO MEMORY |
965 | ; READ DISKETTE TO MEMORY |
Line 965... | Line 1109... | ||
965 | jz @f |
1109 | jz @f |
966 | sayerr_floppy: |
1110 | sayerr_floppy: |
967 | mov dx, 0x3f2 |
1111 | mov dx, 0x3f2 |
968 | mov al, 0 |
1112 | mov al, 0 |
969 | out dx, al |
1113 | out dx, al |
- | 1114 | sayerr_memmove: |
|
970 | mov si, memmovefailed |
1115 | mov si, memmovefailed |
971 | jmp sayerr_plain |
1116 | jmp sayerr_plain |
972 | @@: |
1117 | @@: |
973 | pop ax ; restore from stack count of words in boot+FAT |
1118 | pop ax ; restore from stack count of words in boot+FAT |
974 | shl ax, 1 ; make bytes count from count of words |
1119 | shl ax, 1 ; make bytes count from count of words |
Line 1143... | Line 1288... | ||
1143 | int 0x13 |
1288 | int 0x13 |
1144 | mov dx, 0x3f2 ; floppy motor off |
1289 | mov dx, 0x3f2 ; floppy motor off |
1145 | mov al, 0 |
1290 | mov al, 0 |
1146 | out dx, al |
1291 | out dx, al |
Line -... | Line 1292... | ||
- | 1292 | ||
- | 1293 | if defined extended_primary_loader |
|
- | 1294 | cmp [boot_dev], 1 |
|
- | 1295 | jne no_sys_from_primary |
|
- | 1296 | ; load kolibri.img using callback from primary loader |
|
- | 1297 | and word [movedesc + 24 + 2], 0 |
|
- | 1298 | mov byte [movedesc + 24 + 4], 10h |
|
- | 1299 | ; read in blocks of 64K until file is fully loaded |
|
- | 1300 | mov ax, 1 |
|
- | 1301 | .repeat: |
|
- | 1302 | mov di, image_file_struct |
|
- | 1303 | call [bootcallback] |
|
- | 1304 | push cs |
|
- | 1305 | pop ds |
|
- | 1306 | push cs |
|
- | 1307 | pop es |
|
- | 1308 | cmp bx, 1 |
|
- | 1309 | ja sayerr_badsect |
|
- | 1310 | push bx |
|
- | 1311 | mov si, movedesc |
|
- | 1312 | and word [si + 16 + 2], 0 |
|
- | 1313 | mov byte [si + 16 + 4], 4 |
|
- | 1314 | mov ah, 87h |
|
- | 1315 | mov cx, 8000h |
|
- | 1316 | int 15h |
|
- | 1317 | pop bx |
|
- | 1318 | test ah, ah |
|
- | 1319 | jnz sayerr_memmove |
|
- | 1320 | inc byte [si + 24 + 4] |
|
- | 1321 | test bx, bx |
|
- | 1322 | jz no_sys_from_primary |
|
- | 1323 | mov ax, 2 |
|
- | 1324 | jmp .repeat |
|
- | 1325 | no_sys_from_primary: |
|
Line 1147... | Line 1326... | ||
1147 | 1326 | end if |
|
Line 1148... | Line 1327... | ||
1148 | 1327 | ||
1149 | ; SET GRAPHICS |
1328 | ; SET GRAPHICS |