Rev 1952 | Rev 2047 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1952 | Rev 2014 | ||
---|---|---|---|
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: 1952 $ |
14 | $Revision: 2014 $ |
15 | 15 | ||
16 | 16 | ||
17 | ;========================================================================== |
17 | ;========================================================================== |
18 | ; |
18 | ; |
Line 19... | Line -... | ||
19 | ; 16 BIT FUNCTIONS |
- | |
20 | ; |
- | |
21 | ;========================================================================== |
- | |
22 | - | ||
23 | if 0 |
- | |
24 | putchar: |
- | |
25 | ; in: al=character |
- | |
26 | mov ah, 0Eh |
- | |
27 | mov bh, 0 |
- | |
28 | int 10h |
- | |
29 | ret |
- | |
30 | - | ||
31 | print: |
- | |
32 | ; in: si->string |
- | |
33 | mov al, 186 |
- | |
34 | call putchar |
- | |
35 | mov al, ' ' |
- | |
36 | call putchar |
- | |
37 | - | ||
38 | printplain: |
- | |
39 | ; in: si->string |
- | |
40 | pusha |
- | |
41 | lodsb |
- | |
42 | @@: |
- | |
43 | call putchar |
- | |
44 | lodsb |
- | |
45 | test al,al |
- | |
46 | jnz @b |
- | |
47 | popa |
- | |
48 | ret |
- | |
49 | - | ||
50 | - | ||
51 | setcursor: |
- | |
52 | ; in: dl=column, dh=row |
- | |
53 | mov ah, 2 |
- | |
54 | mov bh, 0 |
- | |
55 | int 10h |
- | |
56 | ret |
- | |
57 | - | ||
58 | macro _setcursor row,column |
- | |
59 | { |
- | |
60 | mov dx, row*256 + column |
- | |
Line 61... | Line 19... | ||
61 | call setcursor |
19 | ; 16 BIT FUNCTIONS |
62 | } |
20 | ; |
63 | 21 | ;========================================================================== |
|
64 | end if |
22 | |
Line 78... | Line 36... | ||
78 | @@: |
36 | @@: |
79 | pop si |
37 | pop si |
80 | ret |
38 | ret |
Line 81... | Line 39... | ||
81 | 39 | ||
82 | sayerr_plain: |
- | |
83 | jmp $ |
- | |
84 | 40 | sayerr_plain: |
|
85 | sayerr: |
41 | sayerr: |
Line 86... | Line 42... | ||
86 | jmp $ |
42 | jmp $ |
Line 161... | Line 117... | ||
161 | push cs |
117 | push cs |
162 | pop ds |
118 | pop ds |
163 | push cs |
119 | push cs |
164 | pop es |
120 | pop es |
Line -... | Line 121... | ||
- | 121 | ||
165 | 122 | if 0 |
|
166 | ; set videomode |
123 | ; set videomode |
167 | mov ax, 3 |
124 | mov ax, 3 |
Line 168... | Line 125... | ||
168 | int 0x10 |
125 | int 0x10 |
169 | 126 | ||
170 | ; draw frames |
127 | ; draw frames |
171 | push 0xb800 |
128 | push 0xb800 |
172 | pop es |
129 | pop es |
- | 130 | xor di, di |
|
Line 173... | Line 131... | ||
173 | xor di, di |
131 | mov ah, 1*16+15 |
Line 174... | Line 132... | ||
174 | mov ah, 1*16+15 |
132 | end if |
175 | 133 | ||
Line 300... | Line 258... | ||
300 | cmp byte [di+preboot_biosdisk-preboot_device], 1 |
258 | cmp byte [di+preboot_biosdisk-preboot_device], 1 |
301 | adc byte [di+preboot_biosdisk-preboot_device], 0 |
259 | adc byte [di+preboot_biosdisk-preboot_device], 0 |
Line 302... | Line 260... | ||
302 | 260 | ||
303 | ; pop ax ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ?? |
261 | ; pop ax ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ?? |
- | 262 | jmp .continue |
|
304 | jmp .continue |
263 | |
305 | .loader_block dd -1 |
264 | .loader_block dd -1 |
306 | .continue: |
265 | .continue: |
307 | sti |
266 | sti |
Line 342... | Line 301... | ||
342 | ; GET MEMORY MAP |
301 | ; GET MEMORY MAP |
343 | include 'detect/biosmem.inc' |
302 | include 'detect/biosmem.inc' |
Line 344... | Line 303... | ||
344 | 303 | ||
Line 345... | Line -... | ||
345 | ; READ DISKETTE TO MEMORY |
- | |
346 | - | ||
347 | if 0 |
- | |
348 | ---- |
- | |
349 | cmp [boot_dev],0 |
- | |
350 | jne no_sys_on_floppy |
- | |
351 | xor ax, ax ; reset drive |
- | |
352 | xor dx, dx |
- | |
353 | int 0x13 |
- | |
354 | ; do we boot from CD-ROM? |
- | |
355 | mov ah, 41h |
- | |
356 | mov bx, 55AAh |
- | |
357 | xor dx, dx |
- | |
358 | int 0x13 |
- | |
359 | jc .nocd |
- | |
360 | cmp bx, 0AA55h |
- | |
361 | jnz .nocd |
- | |
362 | mov ah, 48h |
- | |
363 | push ds |
- | |
364 | push es |
- | |
365 | pop ds |
- | |
366 | mov si, 0xa000 |
- | |
367 | mov word [si], 30 |
- | |
368 | int 0x13 |
- | |
369 | pop ds |
- | |
370 | jc .nocd |
- | |
371 | push ds |
- | |
372 | lds si, [es:si+26] |
- | |
373 | test byte [ds:si+10], 40h |
- | |
374 | pop ds |
- | |
375 | jz .nocd |
- | |
376 | ; yes - read all floppy by 18 sectors |
- | |
377 | - | ||
378 | ; TODO: !!!! read only first sector and set variables !!!!! |
- | |
379 | ; ... |
- | |
380 | ; TODO: !!! then read flippy image track by track |
- | |
381 | - | ||
382 | mov cx, 0x0001 ; startcyl,startsector |
- | |
383 | .a1: |
- | |
384 | push cx dx |
- | |
385 | mov al, 18 |
- | |
386 | mov bx, 0xa000 |
- | |
387 | call boot_read_floppy |
- | |
388 | mov si, movedesc |
- | |
389 | push es |
- | |
390 | push ds |
- | |
391 | pop es |
- | |
392 | mov cx, 256*18 |
- | |
393 | mov ah, 0x87 |
- | |
394 | int 0x15 |
- | |
395 | pop es |
- | |
396 | pop dx cx |
- | |
397 | test ah, ah |
- | |
398 | jnz sayerr_floppy |
- | |
399 | add dword [si+8*3+2], 512*18 |
- | |
400 | inc dh |
- | |
401 | cmp dh, 2 |
- | |
402 | jnz .a1 |
- | |
403 | mov dh, 0 |
- | |
404 | inc ch |
- | |
405 | cmp ch, 80 |
- | |
406 | jae ok_sys_on_floppy |
- | |
407 | mov al, ch |
- | |
408 | shr ch, 2 |
- | |
409 | jmp .a1 |
- | |
410 | .nocd: |
- | |
411 | ; no - read only used sectors from floppy |
- | |
412 | ; now load floppy image to memory |
- | |
413 | ; at first load boot sector and first FAT table |
- | |
414 | - | ||
415 | ; read only first sector and fill variables |
- | |
416 | mov cx, 0x0001 ; first logical sector |
- | |
417 | xor dx, dx ; head = 0, drive = 0 (a:) |
- | |
418 | mov al, 1 ; read one sector |
- | |
419 | mov bx, 0xB000 ; es:bx -> data area |
- | |
420 | call boot_read_floppy |
- | |
421 | ; fill the necessary parameters to work with a floppy |
- | |
422 | mov ax, word [es:bx+24] |
- | |
423 | mov word [BPB_SecPerTrk], ax |
- | |
424 | mov ax, word [es:bx+26] |
- | |
425 | mov word [BPB_NumHeads], ax |
- | |
426 | mov ax, word [es:bx+17] |
- | |
427 | mov word [BPB_RootEntCnt], ax |
- | |
428 | mov ax, word [es:bx+14] |
- | |
429 | mov word [BPB_RsvdSecCnt], ax |
- | |
430 | mov ax, word [es:bx+19] |
- | |
431 | mov word [BPB_TotSec16], ax |
- | |
432 | mov al, byte [es:bx+13] |
- | |
433 | mov byte [BPB_SecPerClus], al |
- | |
434 | mov al, byte [es:bx+16] |
- | |
435 | mov byte [BPB_NumFATs], al |
- | |
436 | ; |
- | |
437 | mov ax, word [es:bx+22] |
- | |
438 | mov word [BPB_FATSz16], ax |
- | |
439 | mov cx, word [es:bx+11] |
- | |
440 | mov word [BPB_BytsPerSec], cx |
- | |
441 | - | ||
442 | ; count of clusters in FAT12 ((size_of_FAT*2)/3) |
- | |
443 | ; mov ax, word [BPB_FATSz16] |
- | |
444 | ; mov cx, word [BPB_BytsPerSec] |
- | |
445 | ;end |
- | |
446 | xor dx, dx |
- | |
447 | mul cx |
- | |
448 | shl ax, 1 |
- | |
449 | mov cx, 3 |
- | |
450 | div cx ; now ax - number of clusters in FAT12 |
- | |
451 | mov word [end_of_FAT], ax |
- | |
452 | - | ||
453 | ; load first FAT table |
- | |
454 | mov cx, 0x0002 ; startcyl,startsector ; TODO!!!!! |
- | |
455 | xor dx, dx ; starthead,drive |
- | |
456 | mov al, byte [BPB_FATSz16] ; no of sectors to read |
- | |
457 | add bx, word [BPB_BytsPerSec] ; es:bx -> data area |
- | |
458 | call boot_read_floppy |
- | |
459 | mov bx, 0xB000 |
- | |
460 | - | ||
461 | ; and copy them to extended memory |
- | |
462 | mov si, movedesc |
- | |
463 | mov [si+8*2+3], bh ; from |
- | |
464 | - | ||
465 | mov ax, word [BPB_BytsPerSec] |
- | |
466 | shr ax, 1 ; words per sector |
- | |
467 | mov cx, word [BPB_RsvdSecCnt] |
- | |
468 | add cx, word [BPB_FATSz16] |
- | |
469 | mul cx |
- | |
470 | push ax ; save to stack count of words in boot+FAT |
- | |
471 | xchg ax, cx |
- | |
472 | - | ||
473 | push es |
- | |
474 | push ds |
- | |
475 | pop es |
- | |
476 | mov ah, 0x87 |
- | |
477 | int 0x15 |
- | |
478 | pop es |
- | |
479 | test ah, ah |
- | |
480 | jz @f |
- | |
481 | sayerr_floppy: |
- | |
482 | mov dx, 0x3f2 |
- | |
483 | mov al, 0 |
- | |
484 | out dx, al |
- | |
485 | ; mov si, memmovefailed |
- | |
486 | jmp $ |
- | |
487 | @@: |
- | |
488 | pop ax ; restore from stack count of words in boot+FAT |
- | |
489 | shl ax, 1 ; make bytes count from count of words |
- | |
490 | and eax, 0ffffh |
- | |
491 | add dword [si+8*3+2], eax |
- | |
492 | - | ||
493 | ; copy first FAT to second copy |
- | |
494 | ; TODO: BPB_NumFATs !!!!! |
- | |
495 | add bx, word [BPB_BytsPerSec] ; !!! TODO: may be need multiply by BPB_RsvdSecCnt !!! |
- | |
496 | mov byte [si+8*2+3], bh ; bx - begin of FAT |
- | |
497 | - | ||
498 | mov ax, word [BPB_BytsPerSec] |
- | |
499 | shr ax, 1 ; words per sector |
- | |
500 | mov cx, word [BPB_FATSz16] |
- | |
501 | mul cx |
- | |
502 | mov cx, ax ; cx - count of words in FAT |
- | |
503 | - | ||
504 | push es |
- | |
505 | push ds |
- | |
506 | pop es |
- | |
507 | mov ah, 0x87 |
- | |
508 | int 0x15 |
- | |
509 | pop es |
- | |
510 | test ah, ah |
- | |
511 | jnz sayerr_floppy |
- | |
512 | - | ||
513 | mov ax, cx |
- | |
514 | shl ax, 1 |
- | |
515 | and eax, 0ffffh ; ax - count of bytes in FAT |
- | |
516 | add dword [si+8*3+2], eax |
- | |
517 | - | ||
518 | ; reading RootDir |
- | |
519 | ; TODO: BPB_NumFATs |
- | |
520 | add bx, ax |
- | |
521 | add bx, 100h |
- | |
522 | and bx, 0ff00h ; bx - place in buffer to write RootDir |
- | |
523 | push bx |
- | |
524 | - | ||
525 | mov bx, word [BPB_BytsPerSec] |
- | |
526 | shr bx, 5 ; divide bx by 32 |
- | |
527 | mov ax, word [BPB_RootEntCnt] |
- | |
528 | xor dx, dx |
- | |
529 | div bx |
- | |
530 | push ax ; ax - count of RootDir sectors |
- | |
531 | - | ||
532 | mov ax, word [BPB_FATSz16] |
- | |
533 | xor cx, cx |
- | |
534 | mov cl, byte [BPB_NumFATs] |
- | |
535 | mul cx |
- | |
536 | add ax, word [BPB_RsvdSecCnt] ; ax - first sector of RootDir |
- | |
537 | - | ||
538 | mov word [FirstDataSector], ax |
- | |
539 | pop bx |
- | |
540 | push bx |
- | |
541 | add word [FirstDataSector], bx ; Begin of data region of floppy |
- | |
542 | - | ||
543 | ; read RootDir |
- | |
544 | call conv_abs_to_THS |
- | |
545 | pop ax |
- | |
546 | pop bx ; place in buffer to write |
- | |
547 | push ax |
- | |
548 | call boot_read_floppy ; read RootDir into buffer |
- | |
549 | ; copy RootDir |
- | |
550 | mov byte [si+8*2+3], bh ; from buffer |
- | |
551 | pop ax ; ax = count of RootDir sectors |
- | |
552 | mov cx, word [BPB_BytsPerSec] |
- | |
553 | mul cx |
- | |
554 | shr ax, 1 |
- | |
555 | mov cx, ax ; count of words to copy |
- | |
556 | push es |
- | |
557 | push ds |
- | |
558 | pop es |
- | |
559 | mov ah, 0x87 |
- | |
560 | int 0x15 |
- | |
561 | pop es |
- | |
562 | - | ||
563 | mov ax, cx |
- | |
564 | shl ax, 1 |
- | |
565 | and eax, 0ffffh ; ax - count of bytes in RootDir |
- | |
566 | add dword [si+8*3+2], eax ; add count of bytes copied |
- | |
567 | - | ||
568 | ; Reading data clusters from floppy |
- | |
569 | mov byte [si+8*2+3], bh |
- | |
570 | push bx |
- | |
571 | - | ||
572 | mov di, 2 ; First data cluster |
- | |
573 | .read_loop: |
- | |
574 | mov bx, di |
- | |
575 | shr bx, 1 ; bx+di = di*1.5 |
- | |
576 | jnc .even |
- | |
577 | test word [es:bx+di+0xB200], 0xFFF0 ; TODO: may not be 0xB200 !!! |
- | |
578 | jmp @f |
- | |
579 | .even: |
- | |
580 | test word [es:bx+di+0xB200], 0xFFF ; TODO: may not be 0xB200 !!! |
- | |
581 | - | ||
582 | @@: |
- | |
583 | jz .skip |
- | |
584 | ; read cluster di |
- | |
585 | ;.read: |
- | |
586 | ;conv cluster di to abs. sector ax |
- | |
587 | ; ax = (N-2) * BPB_SecPerClus + FirstDataSector |
- | |
588 | mov ax, di |
- | |
589 | sub ax, 2 |
- | |
590 | xor bx, bx |
- | |
591 | mov bl, byte [BPB_SecPerClus] |
- | |
592 | mul bx |
- | |
593 | add ax, word [FirstDataSector] |
- | |
594 | call conv_abs_to_THS |
- | |
595 | pop bx |
- | |
596 | push bx |
- | |
597 | mov al, byte [BPB_SecPerClus] ; number of sectors in cluster |
- | |
598 | call boot_read_floppy |
- | |
599 | push es |
- | |
600 | push ds |
- | |
601 | pop es |
- | |
602 | pusha |
- | |
603 | ; |
- | |
604 | mov ax, word [BPB_BytsPerSec] |
- | |
605 | xor cx, cx |
- | |
606 | mov cl, byte [BPB_SecPerClus] |
- | |
607 | mul cx |
- | |
608 | shr ax, 1 ; ax = (BPB_BytsPerSec * BPB_SecPerClus)/2 |
- | |
609 | mov cx, ax ; number of words to copy (count words in cluster) |
- | |
610 | ; |
- | |
611 | mov ah, 0x87 |
- | |
612 | int 0x15 ; copy data |
- | |
613 | test ah, ah |
- | |
614 | popa |
- | |
615 | pop es |
- | |
616 | jnz sayerr_floppy |
- | |
617 | ; skip cluster di |
- | |
618 | .skip: |
- | |
619 | mov ax, word [BPB_BytsPerSec] |
- | |
620 | xor cx, cx |
- | |
621 | mov cl, byte [BPB_SecPerClus] |
- | |
622 | mul cx |
- | |
623 | and eax, 0ffffh ; ax - count of bytes in cluster |
- | |
624 | add dword [si+8*3+2], eax |
- | |
625 | - | ||
626 | mov ax, word [end_of_FAT] ; max cluster number |
- | |
627 | pusha |
- | |
628 | ; draw percentage |
- | |
629 | ; total clusters: ax |
- | |
630 | ; read clusters: di |
- | |
631 | xchg ax, di |
- | |
632 | mov cx, 100 |
- | |
633 | mul cx |
- | |
634 | div di |
- | |
635 | aam |
- | |
636 | xchg al, ah |
- | |
637 | add ax, '00' |
- | |
638 | @@: |
- | |
639 | popa |
- | |
640 | inc di |
- | |
641 | cmp di, word [end_of_FAT] ; max number of cluster |
- | |
642 | jnz .read_loop |
- | |
643 | pop bx ; clear stack |
- | |
644 | - | ||
645 | ok_sys_on_floppy: |
- | |
646 | no_sys_on_floppy: |
- | |
647 | xor ax, ax ; reset drive |
- | |
648 | xor dx, dx |
- | |
649 | int 0x13 |
- | |
650 | mov dx, 0x3f2 ; floppy motor off |
- | |
651 | mov al, 0 |
- | |
652 | out dx, al |
- | |
Line 653... | Line 304... | ||
653 | --- |
304 | ; READ DISKETTE TO MEMORY |
Line 654... | Line 305... | ||
654 | end if |
305 |