From 352540bd251d953b638c5c33df673cefb25c9b2d Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Mon, 31 Aug 2020 20:11:05 +0000 Subject: [PATCH] kernel: First steps of calculating drive tab data from BPB --- boot/kernel.asm | 26 +++++++- kernel/drive.asm | 9 --- kernel/fat.asm | 160 ++++++++++++++++------------------------------- 3 files changed, 77 insertions(+), 118 deletions(-) diff --git a/boot/kernel.asm b/boot/kernel.asm index a8b7cbc..8d05b5a 100644 --- a/boot/kernel.asm +++ b/boot/kernel.asm @@ -2,9 +2,28 @@ org 0x500 %include "inc/bpb.asm" -%include "inc/mbr.asm" %include "inc/dpt.asm" +; drive table entry +struc drive +.biosnum: resb 1 +.flag: resb 1 +.spc: resw 1 +.cylinders: resw 1 +.dpt: resb dpt_size +.type: resb 1 ; 12 or 16, depending on FAT type +.fat_offset: resd 1 ; offset of fat table +.fat_num: resw 1 ; number of fat tables +.fat_size: resw 1 ; sectors per fat table + +.dir_offset: resd 1 ; offset of root directory +.dir_size: resw 1 ; size of root directory in sectors + +.clus_offset: resd 1 ; offset of clusters +.clus_num: resw 1 ; number of clusters +.clus_size: resw 1 ; sectors per cluster +endstruc + ; kernel stack size in words %define stacksize 512 @@ -240,6 +259,7 @@ fputc: push ax iret %include "kernel/drive.asm" + %include "kernel/fat.asm" zero: dw 0 @@ -252,5 +272,5 @@ vects: dw int20h, int21h, retf, retf _end: dw 0x55AA, 0x55AA section .bss - ; stack to be used during init and disk i/o -stack: resw stacksize + ; stack to be used during init and disk i/o +stack: resw stacksize diff --git a/kernel/drive.asm b/kernel/drive.asm index bd8dd0a..628ecb3 100644 --- a/kernel/drive.asm +++ b/kernel/drive.asm @@ -2,15 +2,6 @@ section .bss drives: equ 16 -; drive table entry -struc drive -.biosnum: resb 1 -.flag: resb 1 -.spc: resw 1 -.cylinders: resw 1 -.dpt: resb dpt_size -endstruc - ; ptr into currently selected drive drive_ptr: resw 1 diff --git a/kernel/fat.asm b/kernel/fat.asm index a6cac28..8a1c546 100644 --- a/kernel/fat.asm +++ b/kernel/fat.asm @@ -1,112 +1,60 @@ - section .bss +section .text - ; 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 - -load_ts: ; load total number of sectors into DX:AX - xor dx, dx - mov ax, [disk_buffer+0x013] - test ax, ax - jnz .ret - mov ax, [disk_buffer+0x020] - mov dx, [disk_buffer+0x022] -.ret: ret - - ; 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] +load_bpb: mov bx, [drive_ptr] + ; read word for "sectors per fat" + mov ax, [diskbuf+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, [diskbuf+0x042] + or cl, 1 + cmp cl, 0x29 + jne .err + ; load dword + mov ax, [diskbuf+0x024] + mov dx, [diskbuf+0x026] .short_sf: - ; store local value - mov [fat_size], ax - mov [fat_size+2], dx + ; store local value + mov [bx+drive.fat_size], ax + mov [bx+drive.fat_size+2], dx - ; copy number of fat's - xor ah, ah - mov al, [disk_buffer+0x010] - mov [fat_num], ax + ; copy number of fat's + xor ah, ah + mov al, [diskbuf+0x010] + mov [bx+drive.fat_num], ax - ; copy number of root directory entries - mov ax, [disk_buffer+0x011] - mov cl, 4 - shr ax, cl - mov [rootdir_size], ax + ; copy number of root directory entries + mov ax, [diskbuf+0x011] + mov cl, 4 + shr ax, cl + mov [bx+drive.dir_size], ax - ; calculate offsets for everything - mov ax, [part_offset] - mov dx, [part_offset+2] - ; add reserved sectors - add ax, [disk_buffer+0x0B+bpb_rsc] - adc ax, 0 - ; save begin of FAT tables - mov [fat_offset], ax - mov [fat_offset+2], dx - ; add FAT size * FAT number - mov cx, [fat_num] -.floop: add ax, [fat_size] - adc dx, [fat_size+2] - loop .floop - ; save begin of root directories - mov [rootdir_offset], ax - mov [rootdir_offset+2], dx - ; add root directory size (might be zero) - add ax, [rootdir_size] - adc dx, 0 - ; save start of data area - mov [clusters_offset], ax - mov [clusters_offset+2], dx + ; calculate offsets for everything + xor ax, ax + xor dx, dx + ; add reserved sectors + add ax, [diskbuf+0x0B+bpb_rsc] + adc ax, 0 + ; save begin of FAT tables + mov [bx+drive.fat_offset], ax + mov [bx+drive.fat_offset+2], dx + ; add FAT size * FAT number + mov cx, [bx+drive.fat_num] +.floop: add ax, [bx+drive.fat_size] + adc dx, [bx+drive.fat_size+2] + loop .floop + ; save begin of root directories + mov [bx+drive.dir_offset], ax + mov [bx+drive.dir_offset+2], dx + ; add root directory size (might be zero) + add ax, [bx+drive.dir_size] + adc dx, 0 + ; save start of data area + mov [bx+drive.clus_offset], ax + mov [bx+drive.clus_offset+2], dx - call load_ts - add ax, [part_offset] - adc dx, [part_offset+2] - sub ax, [clusters_offset] - sbb dx, [clusters_offset+2] - - ; get "sectors per cluster" - mov cl, [disk_buffer+0x00D] - ; this turns dx:ax from data sectors to number of clus -.sloop: shr cl, 1 - test cl, cl - jz .send - clc - rcr dx, 1 - rcr ax, 1 - jmp .sloop -.send: mov [clusters_num], ax - mov [clusters_num+2], dx - - int 3 - - ret -.err: stc - ret + ret +.err: stc + ret