From 1b42f1a4807c5b3ec92aebdd5a59dc9b9e5afc96 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Sun, 10 May 2020 16:47:48 +0000 Subject: [PATCH] Implement calculation for FAT position --- boot/kernel.asm | 4 ++- kernel/fat.asm | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 kernel/fat.asm diff --git a/boot/kernel.asm b/boot/kernel.asm index 0f205bc..bc529c9 100644 --- a/boot/kernel.asm +++ b/boot/kernel.asm @@ -18,7 +18,7 @@ ; stack size %define stacks 512 -banner: db "rdos", 0xA, 0xD, '$' +banner: db "rdos loaded", 0xA, 0xD, '$' ; Alias for Int 21h,AH=0h int20h: xor ah, ah @@ -194,6 +194,7 @@ fputc: push ax iret %include "kernel/diskio.asm" + %include "kernel/fat.asm" vects: dw int20h, int21h, retf, retf dw retf, retf, retf, int20h @@ -224,6 +225,7 @@ intlp: movsw call dnconv mov al, dl call select + call load_bpb loop: int 0x28 jmp loop diff --git a/kernel/fat.asm b/kernel/fat.asm new file mode 100644 index 0000000..3c97438 --- /dev/null +++ b/kernel/fat.asm @@ -0,0 +1,68 @@ + section .bss + + ; the sector numbers have the partition offset already included + +fat_offset: + resd 1 +fat_size: + resd 1 +fat_num: ; a byte would be enough, but i want to work with cx + resw 1 + +rootdir_offset: + resd 1 +rootdir_size: + resw 1 + +clusters_offset: + resd 1 +clusters_num: + resd 1 + + section .text + + ; invoked after disk select +load_bpb: + ; read word for "sectors per fat" + mov ax, [disk_buffer+0x016] + xor dx, dx + ; if zero, we need to check dword in BPB 7.1 + test ax, ax + jnz .short_sf + ; fail if BPB 7.1 signature is not present + mov cl, [disk_buffer+0x042] + or cl, 1 + cmp cl, 0x29 + jne .err + ; load dword + mov ax, [disk_buffer+0x024] + mov dx, [disk_buffer+0x026] +.short_sf: + ; store local value + mov [fat_size], ax + mov [fat_size+2], dx + + ; copy number of fat's + xor ah, ah + mov al, [disk_buffer+0x010] + mov [fat_num], ax + + mov ax, [part_offset] + mov dx, [part_offset+2] + add ax, [disk_buffer+0x0B+bpb_rsc] + adc ax, 0 + mov [fat_offset], ax + mov [fat_offset+2], dx + + int 3 + + ; add FAT size * FAT number + mov cx, [fat_num] +.floop: add ax, [fat_size] + adc dx, [fat_size+2] + loop .floop + + int 3 + ret +.err: stc + ret