diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 24a101d..abd9954 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -19,7 +19,7 @@ jobs: - name: Run shellcheck run: | - shellcheck ./releasetools/cdimage.sh ./releasetools/floppyimage.sh ./releasetools/hdimages.sh ./releasetools/image.defaults ./releasetools/image.functions + shellcheck ./releasetools/cdimage.sh ./releasetools/floppyimage.sh ./releasetools/hdimage.sh ./releasetools/image.defaults ./releasetools/image.functions - name: Run CppCheck run: | diff --git a/boot/efi/bootia32.asm b/boot/efi/bootia32.asm index ca3b984..efab030 100644 --- a/boot/efi/bootia32.asm +++ b/boot/efi/bootia32.asm @@ -65,7 +65,6 @@ efimain: call [fnOutputStr] add esp, 8 - ; #=======================# ; search and load kernel ; openVolume() diff --git a/boot/loader/disk.inc b/boot/loader/disk.inc index c55e76b..f86195c 100644 --- a/boot/loader/disk.inc +++ b/boot/loader/disk.inc @@ -1,7 +1,7 @@ disk_read_sectors: - test byte [bDriveLBA], TRUE - je .lba_read +; test byte [bDriveLBA], TRUE +; je .lba_read push ax push bx push cx @@ -61,11 +61,11 @@ disk_packet: dd 0 -sectors_per_track dw 0 -heads_per_cylinder dw 0 -bytes_per_sector dw 0 -sectors_per_FAT dw 0 -FAT_count db 0 -reserved_sectors dw 0 -root_dir_entries dw 0 -sectors_per_cluster db 0 +sectors_per_track dw 18 +heads_per_cylinder dw 2 +bytes_per_sector dw 512 +sectors_per_FAT dw 9 +FAT_count db 2 +reserved_sectors dw 1 +root_dir_entries dw 224 +sectors_per_cluster db 1 diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index 1982fff..2226896 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -36,8 +36,6 @@ _start: call a20_enable jc .error_a20 - xchg bx, bx - ; check drive type ; dl <= 0x7F == floppy ; dl >= 0x80 == hard drive @@ -70,7 +68,27 @@ _start: call fat_search_root jc .error_not_found + mov [pKernelStartFat], ax + ; load fat + xor ax, ax + mov al, [FAT_count] + mul word [sectors_per_FAT] + mov cx, ax + mov ax, [reserved_sectors] + + xor bx, bx + + call disk_read_sectors + + ; load stage 2 + mov ax, KERNEL_PRELOAD/0x10 + mov es, ax + mov ax, [pKernelStartFat] + xor bx, bx + call fat_load_binary + + xchg bx, bx ; fetch memory map from bios call memory_get_map jc .error_memory @@ -122,11 +140,13 @@ _start: uDrive rb 1 bDriveLBA db FALSE -szMsgStage2 db "StupidOS Loader %x", 0 +pKernelStartFat dw 0 + +szMsgStage2 db "StupidOS Loader", 0 szKernelFile db "VMSTUPIDSYS", 0 szMsgErrorA20 db "ERROR: can't enable a20 line", 0 szMsgErrorMemory db "ERROR: can't detect available memory", 0 -szMsgErrorSector db "ERROR: reading sector", CR, LF, 0 +szMsgErrorSector db "ERROR: reading sector", CR, LF, 0 szMsgErrorNotFound db "ERROR: kernel not found", 0 use32 diff --git a/boot/loader/logger.inc b/boot/loader/logger.inc index b9f833f..0170de0 100644 --- a/boot/loader/logger.inc +++ b/boot/loader/logger.inc @@ -62,7 +62,6 @@ bios_log_hex: mov si, szHexBuffer xor cl, cl .loop: - xchg bx, bx cmp cl, 8 je .print_number rol edi, 4 diff --git a/boot/loader/memory.inc b/boot/loader/memory.inc index 4b96300..42343db 100644 --- a/boot/loader/memory.inc +++ b/boot/loader/memory.inc @@ -66,8 +66,19 @@ memory_e820_get_map: ;; CX - Configured 1 ;; DX - Configured 2 memory_get_for_large_conf: + clc mov ax, 0xE801 int 0x15 + jc @f + xor ecx, ecx + mov cx, ax + push ecx + mov cx, bx + push ecx + mov si, szMsgLarge + call bios_log +@@: + ret ;; Function: memory_get_extended_memory_size ;; @@ -78,5 +89,30 @@ memory_get_for_large_conf: ;; CF - Non-Carry - indicates no error ;; AX - Number of contiguous KB above 1MB memory_get_map: + call memory_get_for_large_conf + jnc .end clc + mov ah, 0x88 + int 0x15 + + jc .end + + xor ebx, ebx + mov bx, ax + push ebx + mov si, szMsgMaxMemKB + call bios_log + + shr ebx, 2 + + push ebx + mov si, szMsgMaxPage + call bios_log + +.end: ret + + +szMsgMaxMemKB db "%x KB above 1MB", 0 +szMsgMaxPage db "%x pages", 0 +szMsgLarge db "%x KB above 1MB - %x * 64 KB above 16MB", 0