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