From a22006b6ea844a60dadd7ca0633ec0479d9be221 Mon Sep 17 00:00:00 2001
From: Robert Pengelly <robertapengelly@hotmail.com>
Date: Thu, 22 Aug 2024 19:35:37 +0100
Subject: [PATCH] Boot from different disks/partitions and bug fixes

---
 build/chimaera.img                | Bin 368640 -> 368640 bytes
 build/chimaera.vhd                | Bin 34120704 -> 34120704 bytes
 src/boot/freeldr/core/config.asm  | 273 ++++++++++++++++++++++++++++++
 src/boot/freeldr/core/disk.asm    |  13 +-
 src/boot/freeldr/core/freeldr.asm |  41 ++++-
 src/boot/freeldr/core/int21.asm   | 134 ++++++++++-----
 src/boot/freeldr/freeldr.cfg      |   6 +-
 src/kernel/bootstrap.asm          |  18 +-
 src/kernel/disk.asm               |  21 ++-
 src/kernel/kernel.asm             |   6 +
 10 files changed, 451 insertions(+), 61 deletions(-)

diff --git a/build/chimaera.img b/build/chimaera.img
index 4066ef5b2d0939bb27bc7d312ea185f65dc28108..d7a921cf140520799dcdb1860c2a27fad5a0c7a2 100644
GIT binary patch
delta 13078
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

delta 12610
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

diff --git a/build/chimaera.vhd b/build/chimaera.vhd
index ef100c936e1bb7a036954a953d5cde9917ad8d7e..ec4d784c6ae2af04eb6851b9b1e6460049249634 100644
GIT binary patch
delta 16171
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
ZCEj3AjGU!#AE_FXpi5HXKLxLo{SUe4lY{^O

delta 15699
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
Ax&QzG

diff --git a/src/boot/freeldr/core/config.asm b/src/boot/freeldr/core/config.asm
index 0652296..dbfcbea 100644
--- a/src/boot/freeldr/core/config.asm
+++ b/src/boot/freeldr/core/config.asm
@@ -167,6 +167,78 @@ _is_digit.check:
     stc
     ret
 
+;******************************************************************************
+; @function         _strstart
+;******************************************************************************
+_strstart:
+
+    push    bp
+    mov     bp,     sp
+    
+    push    bx
+    push    si
+    push    di
+    
+    mov     si,     word ptr [bp + 4]
+    mov     di,     word ptr [bp + 6]
+    
+    xor     ah,     ah
+    xor     bh,     bh
+
+_strstart.loop:
+
+    mov     al,     cs:[di]
+    
+    and     al,     al
+    jz      _strstart.done
+    
+    push    ax
+    
+    call    _tolower
+    add     sp,     2
+    
+    mov     bl,     al
+    
+    mov     al,     [si]
+    push    ax
+    
+    call    _tolower
+    add     sp,     2
+    
+    cmp     al,     bl
+    jne     _strstart.error
+    
+    inc     si
+    inc     di
+    
+    jmp     _strstart.loop
+
+_strstart.error:
+
+    xor     ax,     ax
+    
+    pop     di
+    pop     si
+    pop     bx
+    
+    pop     bp
+    stc
+    
+    ret
+
+_strstart.done:
+
+    mov     ax,     si
+    
+    pop     di
+    pop     si
+    pop     bx
+    
+    pop     bp
+    clc
+    
+    ret
+
 ;******************************************************************************
 ; @function         _skip_whitespace
 ;******************************************************************************
@@ -516,6 +588,202 @@ _pc_label.collision:
     call    _error
     db      "duplicate entry name found",       HEX (0D),   HEX (0A),   HEX (00)
 
+;******************************************************************************
+; @function         _pc_root
+;******************************************************************************
+_pc_root:
+
+    push    ax
+    push    bx
+    push    cx
+    push    dx
+    push    di
+    
+    mov     bx,     si
+    
+    call    _is_name_beginner
+    jc      _pc_root.error
+
+_pc_root.loop:
+
+    call    _is_name_part
+    jc      _pc_root.check
+    
+    lodsb
+    jmp     _pc_root.loop
+
+_pc_root.check:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     2
+    jb      _pc_root.error
+    
+    mov     ax,     offset _pc_root.fd_check
+    push    ax
+    
+    push    bx
+    
+    call    _strstart
+    add     sp,     4
+    
+    and     ax,     ax
+    jz      _pc_root.check2
+    
+    xor     bx,     bx
+    jmp     _pc_root.got_disk
+
+_pc_root.check2:
+
+    mov     ax,     offset _pc_root.hd_check
+    push    ax
+    
+    push    bx
+    
+    call    _strstart
+    add     sp,     4
+    
+    and     ax,     ax
+    jz      _pc_root.error
+    
+    mov     bx,     2
+
+_pc_root.got_disk:
+
+    mov     si,     ax
+    
+    xor     ax,     ax
+    xor     dx,     dx
+    
+    mov     cx,     10
+    xor     di,     di
+
+_pc_root.convert:
+
+    call    _is_digit
+    jc      _pc_root.check3
+    
+    lodsb
+    push    ax
+    
+    mov     ax,     di
+    mul     cx
+    mov     di,     ax
+    
+    pop     ax
+    
+    test    dx,     dx
+    jnz     _pc_root.error
+    
+    sub     al,     '0'
+    add     di,     ax
+    
+    jmp     _pc_root.convert
+
+_pc_root.check3:
+
+    cmp     word ptr cs:[_curr_entry],      0
+    jne     _pc_root.set
+    
+    push    ax
+    push    bx
+    push    dx
+    push    ds
+    
+    mov     bx,     cs
+    mov     ds,     bx
+    
+    mov     bx,     cs:[_filename]
+    call    _writestr
+    
+    mov     al,     ':'
+    call    _writechr
+    
+    mov     ax,     cs:[_line_number]
+    xor     dx,     dx
+    
+    call    _writedec
+    
+    mov     al,     ':'
+    call    _writechr
+    
+    mov     al,     ' '
+    call    _writechr
+    
+    mov     bx,     offset _error_root_without_label
+    call    _writestr
+    
+    pop     ds
+    pop     dx
+    pop     bx
+    pop     ax
+    jmp     _pc_root.done
+
+_pc_root.set:
+
+    and     di,     di
+    jz      _pc_root.error
+    
+    cmp     bx,     2
+    je      _pc_root.ok
+    
+    cmp     di,     2
+    ja      _pc_root.error
+
+_pc_root.ok:
+
+    add     bx,     di
+    
+    push    di
+    push    es
+    
+    mov     di,     cs:[_curr_entry]
+    mov     es,     di
+    xor     di,     di
+    
+    mov     es:[di + 6],    bx
+    pop     es
+    pop     di
+
+_pc_root.done:
+
+    pop     di
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    ret
+
+_pc_root.error:
+
+    mov     bx,     cs
+    mov     ds,     bx
+    
+    mov     bx,     cs:[_filename]
+    call    _writestr
+    
+    mov     al,     ':'
+    call    _writechr
+    
+    mov     ax,     cs:[_line_number]
+    xor     dx,     dx
+    
+    call    _writedec
+    
+    mov     al,     ':'
+    call    _writechr
+    
+    mov     al,     ' '
+    call    _writechr
+    
+    call    _error
+    db      "invalid root provided",        HEX (0D),   HEX (0A),   HEX (00)
+
+_pc_root.fd_check:              db      "fd",       HEX (00)
+_pc_root.hd_check:              db      "hd",       HEX (00)
+
 ;******************************************************************************
 ; @function         _pc_timeout
 ;******************************************************************************
@@ -972,6 +1240,7 @@ _parse_config.got_carry:
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _error_kernel_without_label:    db      "kernel specified outside label",                   HEX (0D),   HEX (0A),   HEX (00)
 _error_title_without_label:     db      "title specified outside label",                    HEX (0D),   HEX (0A),   HEX (00)
+_error_root_without_label:      db      "root specified outside label",                    HEX (0D),   HEX (0A),   HEX (00)
 
 _error_noparam:                 db      "missing parameter",                                HEX (0D),   HEX (0A),   HEX (00)
 _error_badcfg:                  db      "unknown keyword",                                  HEX (0D),   HEX (0A),   HEX (00)
@@ -1004,6 +1273,10 @@ _pc_keywd_table:
     dw      0
     dw      _pc_label
     
+    dw      hash_root
+    dw      0
+    dw      _pc_root
+    
     dw      hash_timeout
     dw      0
     dw      _pc_timeout
diff --git a/src/boot/freeldr/core/disk.asm b/src/boot/freeldr/core/disk.asm
index 7e762ef..e849994 100644
--- a/src/boot/freeldr/core/disk.asm
+++ b/src/boot/freeldr/core/disk.asm
@@ -544,6 +544,8 @@ _get_partition_info:
 
 .L7:
 
+    inc     byte ptr cs:[_last_drive]
+    
     mov     ax,     es
     jmp     .L19
     
@@ -673,9 +675,6 @@ _get_hard_disk_partitions:
     
     add     sp,     4
     
-    and     ax,     ax
-    jz      .L15
-    
     mov     es,     ax
     xor     bx,     bx
     
@@ -694,6 +693,9 @@ _get_hard_disk_partitions:
 .L17:
 
     add     sp,     4
+    
+    and     ax,     ax
+    jz      .L15
 
 .L16:
 
@@ -704,8 +706,6 @@ _get_hard_disk_partitions:
     
     call    _vec_push
     add     sp,     4
-    
-    jmp     .L15
 
 .L15:
 
@@ -963,6 +963,9 @@ _read_sectors.done:
 global      _drive_no
 _drive_no:                      db      HEX (00)
 
+global      _last_drive
+_last_drive:                    db      HEX (00)
+
 global      _edd_available
 _edd_available:                 dw      HEX (0000)
 
diff --git a/src/boot/freeldr/core/freeldr.asm b/src/boot/freeldr/core/freeldr.asm
index 5b3cc46..3894fe7 100644
--- a/src/boot/freeldr/core/freeldr.asm
+++ b/src/boot/freeldr/core/freeldr.asm
@@ -1010,6 +1010,27 @@ _config_ok:
     mov     es,     ax
     xor     bx,     bx
     
+    mov     dx,     es:[bx + 6]
+    
+    and     dx,     dx
+    jz      .L18
+    
+    dec     dx
+    
+    mov     ah,     HEX (0E)
+    int     HEX (21)
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    cmp     al,     dl
+    je      .L18
+    
+    call    _error
+    db      "panic: the root for the selected kernel is not ready",     HEX (0D),   HEX (0A),   HEX (00)
+
+.L18:
+
     mov     ax,     es:[bx + 4]
     mov     ds,     ax
     xor     di,     di
@@ -1331,6 +1352,24 @@ _segment_ok2:
     mov     es,     bx
     push    es
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Check if we're FAT32.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     di,     cs:[_sectors_per_fat32]
+    or      di,     cs:[_sectors_per_fat32 + 2]
+    
+    and     di,     di
+    jnz     .L16
+    
+    mov     byte ptr cs:[_fat_jump + 1],    HEX (3C)
+    jmp     .L17
+
+.L16:
+
+    mov     byte ptr cs:[_fat_jump + 1],    HEX (58)
+
+.L17:
+
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Zero out the di register.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1374,7 +1413,7 @@ _segment_ok2:
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; If we're not FAT32 then jump passed the next couple of copies.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    cmp     byte ptr [_fat_jump + 1],   HEX (58)
+    cmp     byte ptr cs:[_fat_jump + 1],        HEX (58)
     jne     .L13
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/src/boot/freeldr/core/int21.asm b/src/boot/freeldr/core/int21.asm
index 4259003..c14edae 100644
--- a/src/boot/freeldr/core/int21.asm
+++ b/src/boot/freeldr/core/int21.asm
@@ -26,60 +26,18 @@ _get_disk_info:
     mov     ax,     cs:[_selected_disk]
     mov     word ptr [bp - 2],      ax
 
-_get_disk_info.check:
+_get_disk_info.got_disk:
 
-    push    si
-    
-    call    _strlen
-    add     sp,     2
-    
-    cmp     ax,     2
-    jb      _get_disk_info.got_disk
-    
-    cmp     byte ptr [si + 1],      ':'
-    jne     _get_disk_info.got_disk
-    
-    xor     ah,     ah
-    mov     al,     [si]
-    
-    push    ax
-    
-    call    _isalpha
-    mov     cx,     ax
-    
-    pop     ax
-    
-    and     cx,     cx
-    jz      _get_disk_info.got_disk
-    
-    add     si,     2
-    push    ax
-    
-    call    _toupper
-    add     sp,     2
-    
-    sub     al,     HEX (41)
-    
-    cmp     ax,     cs:[_selected_disk]
-    je      _get_disk_info.got_disk
-    
-    mov     word ptr [bp - 2],      ax
-    inc     ax
-    
-    cmp     cs:[_vec_parts + 4],    ax
-    jb      _get_disk_info.error
-    
-    dec     ax
+    mov     ax,     word ptr [bp - 2]
     
     cmp     ax,     2
-    jae     _get_disk_info.got_disk
+    jae     _get_disk_info.ok
     
     call    _probe_disk
     jc      _get_disk_info.error
 
-_get_disk_info.got_disk:
+_get_disk_info.ok:
 
-    mov     ax,     word ptr [bp - 2]
     xor     dx,     dx
     
     mov     cx,     2
@@ -551,6 +509,18 @@ _int21_dispatch.err:
 
 _int21_dispatch.list:
 
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Select Disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    db      HEX (0E)
+    dw      _int21_0E
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Get Current Default Drive.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    db      HEX (19)
+    dw      _int21_19
+    
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Open File Using Handle.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -594,6 +564,78 @@ iretc.ret:
     iret
 
 
+;******************************************************************************
+; @function         _int21_OE
+; @brief            Select Disk
+;******************************************************************************
+_int21_0E:
+
+    push    ax
+    push    bx
+    push    cx
+    push    dx
+    push    si
+    push    di
+    push    es
+    push    ds
+    
+    mov     cx,     cs:[_selected_disk] 
+
+_int21_0E.check:
+
+    xor     dh,     dh
+    
+    cmp     dx,     cs:[_selected_disk]
+    je      _int21_0E.get_info
+    
+    inc     dx
+    
+    cmp     cs:[_vec_parts + 4],    dx
+    jb      _int21_0E.done
+    
+    mov     cs:[_selected_disk],    dx
+    dec     word ptr cs:[_selected_disk]
+
+_int21_0E.get_info:
+
+    call    _get_disk_info
+    
+    jnc     _int21_0E.done
+    mov     cs:[_selected_disk],    cx
+
+_int21_0E.done:
+
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    mov     al,     cs:[_last_drive]
+    
+    cmp     al,     5
+    jae     _int21_0E.ret
+    
+    mov     al,     5
+
+_int21_0E.ret:
+
+    iret
+
+;******************************************************************************
+; @function         _int21_19
+; @brief            Get Current Default Drive
+;
+; @out              AL -> Current default drive.
+;******************************************************************************
+_int21_19:
+
+    mov     al,     cs:[_selected_disk]
+    iret
+
 ;******************************************************************************
 ; @function         _int21_3D
 ; @brief            Open File Using Handle
diff --git a/src/boot/freeldr/freeldr.cfg b/src/boot/freeldr/freeldr.cfg
index ee79cff..290601e 100644
--- a/src/boot/freeldr/freeldr.cfg
+++ b/src/boot/freeldr/freeldr.cfg
@@ -1,6 +1,10 @@
 default     chimaera
-timeout     10
+#timeout     10
+timeout     0
 
 label chimaera
+
     title   Chimaera OS
+
+#    root    hd2                         # Second parition that's found for hard disks.
     kernel  /kernel.sys
diff --git a/src/kernel/bootstrap.asm b/src/kernel/bootstrap.asm
index 3dad07f..14dbde9 100644
--- a/src/kernel/bootstrap.asm
+++ b/src/kernel/bootstrap.asm
@@ -397,9 +397,14 @@ _after_copy:
     mov     dl,     [_drive_no]
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    ;; Zero out the bx register.
+    ;; Move the hidden sectors into BX:CX.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     bx,     [_hidden_sectors]
+    mov     cx,     [_hidden_sectors + 2]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Clear the carry flag.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    xor     bx,     bx
     clc
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -584,9 +589,14 @@ _not_fat32:
     mov     dl,     [_drive_no]
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    ;; Zero out the bx register.
+    ;; Move the hidden sectors into BX:CX.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     bx,     [_hidden_sectors]
+    mov     cx,     [_hidden_sectors + 2]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Clear the carry flag.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    xor     bx,     bx
     clc
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/src/kernel/disk.asm b/src/kernel/disk.asm
index 56ab33c..7c42816 100644
--- a/src/kernel/disk.asm
+++ b/src/kernel/disk.asm
@@ -235,7 +235,14 @@ _get_partition_info:
     cmp     word ptr [bp + 4],      cx
     jne     .L23
     
-    cmp     byte ptr es:[si],       128
+    mov     bx,     es:[si + 10]
+    
+    cmp     bx,     cs:[_part_start + 2]
+    jne     .L23
+    
+    mov     bx,     es:[si + 8]
+    
+    cmp     bx,     cs:[_part_start]
     jne     .L23
     
     mov     word ptr [bp - 2],      1
@@ -640,9 +647,6 @@ _get_hard_disk_partitions:
     
     add     sp,     4
     
-    and     ax,     ax
-    jz      .L15
-    
     mov     es,     ax
     xor     bx,     bx
     
@@ -664,6 +668,9 @@ _get_hard_disk_partitions:
 .L20:
 
     add     sp,     4
+    
+    and     ax,     ax
+    jz      .L15
 
 .L16:
 
@@ -1209,3 +1216,9 @@ _disk_transfer_addr:
 
     dw      HEX (0000)
     dw      HEX (0000)
+
+global      _part_start
+_part_start:
+
+    dw      HEX (0000)
+    dw      HEX (0000)
diff --git a/src/kernel/kernel.asm b/src/kernel/kernel.asm
index 2f8689b..8f21869 100644
--- a/src/kernel/kernel.asm
+++ b/src/kernel/kernel.asm
@@ -32,6 +32,12 @@ _all_read:
     cli
     cld
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Save the hidden sectors.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     cs:[_part_start],       bx
+    mov     cs:[_part_start + 2],   cx
+    
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Save the value that's in the extra segment.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-- 
2.34.1