diff --git a/diskwrite b/diskwrite new file mode 100755 index 0000000..62f92ba Binary files /dev/null and b/diskwrite differ diff --git a/makefile b/makefile index 8b74f57..e0f4675 100644 --- a/makefile +++ b/makefile @@ -2,10 +2,13 @@ CC := gcc AS := nasm BL_ASFLAGS := -f bin -all: bootloader +all: bootloader tools cp bin/bootloader.bin image.bin qemu-img resize -f raw image.bin 512M qemu-system-i386 -hda bin/bootloader.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio + +tools: + $(CC) tools/diskwrite.c -o diskwrite bootloader: $(AS) src/bootloader/main.s $(BL_ASFLAGS) -o bin/bootloader.bin @@ -15,6 +18,9 @@ init: @mkdir bin/boot @mkdir bin/kernel +.PHONY: tools + clean: + @rm diskwrite @rm -rf bin/ @rm -rf mount/ \ No newline at end of file diff --git a/src/bootloader/main.s b/src/bootloader/main.s index fc4705b..98a1627 100644 --- a/src/bootloader/main.s +++ b/src/bootloader/main.s @@ -181,6 +181,7 @@ load_gdt: mov cr0, eax jmp 0x0:.real .real:;no actual code here, just label for readability and organization + pop ds load_part2: mov ah, 0x42 xor edx, edx @@ -201,6 +202,7 @@ load_part2: push 0 pop ds mov si, DAP + jmp $ int 0x13 jc load_fail jmp part_2 @@ -298,6 +300,7 @@ times 1024-($-$$) db 0 part_2: call get_mmap call paging_en + call open_file jmp $ load_kernel: get_mmap: @@ -360,6 +363,46 @@ paging_en: ret open_file: ;only looks in the root directory + xor esi, esi + xor ecx, ecx + xor edx, edx + mov esi, [fat_bpb.part_start]; + add si, [fat_bpb.reserved_sectors] + mov cl, [fat_bpb.fat_count] + mov dx, [fat_ebpb32.sectors_per_fat] + .addlp: + add esi, edx + dec ecx + or ecx, ecx + jnz .addlp + xor dx, dx + mov ecx, [fat_ebpb32.root_dir_cluster] + mov dl, [fat_bpb.sectors_per_cluster] + .addlp1: + add esi, edx + dec ecx + or ecx, ecx + jnz .addlp1 + mov [DAP.sector_start], esi + mov [DAP.read_count], dx + mov [DAP.offset], word 0xd000 + mov [DAP.segment], word 0x0000 + + mov eax, [DAP.sector_start] + mov ebx, [DAP.sector_start + 4] + mov ecx, [DAP.offset] + mov dx, [DAP.read_count] + push 0 + pop ds + push 0 + pop es + ;sector start now contains the sector number of the first data sector of the root directory + mov ah, 0x42 + mov dl, byte [data.boot_disc] + mov si, DAP + int 0x13 + jc load_fail + debug read_file: ;reads all data from file load_elf: @@ -369,7 +412,7 @@ k_info: .memory_map_ptr: dd 0x2000 .memory_map_count: dw 0 .padding: db 0 - .bpp: db 0 + .bpp: db 0;if depth == 0 then video is text mode .xres: dw 0 .yres: dw 0 .framebuffer_ptr: dd 0 diff --git a/tools/diskwrite.c b/tools/diskwrite.c new file mode 100644 index 0000000..a53c3df --- /dev/null +++ b/tools/diskwrite.c @@ -0,0 +1,8 @@ +#include +#include +#include + +int main(int argc, char **argv){ + printf("Hello, World!\n"); + return 0; +} \ No newline at end of file