Updated: May 3
At this stage of my homebrew 286 system build, I have an IDE interface to a compact flash (CF) card. I have begun implementing disk services (INT 13h) in my BIOS. I also have a build environment that is successfully building FreeDOS. Now, I need to close the gap of raw disk access and getting the FreeDOS kernel and FreeCOM loaded and running. I have not yet figured out all the details to close this gap, but I will use this running post to capture my learning.
What I Think I Understand So Far
I expect some/much of this is inaccurate. If you have suggestions to improve the accuracy and clarity, please let me know (thank you!).
In my boot sector (sector zero of the CF card), or volume boot record (VBR), I need to include a BIOS parameter block (BPB) to describe the volume partition. Looking at the source code for boot loader, I see %defines for disk info. From what I can tell, I need to have specific disk information at certain offsets from BP (which is at 0x7C00).
YouTube user @pvc mentioned that this information is populated as part of the format utility. I am currently reviewing the source for format. I am also reading through the Microsoft Extensible Firmware Initiative File System Specification (fatgen103).
I will need to format my CF card with a FAT file system.
As part of this, the format utility will place drive information (e.g., geometry) in the boot sector.
The first sector of my CF card will need to contain a boot loader. The last two bytes of this sector should contain 0xAA55. I plan to use this boot loader: kernel/boot at master · FDOS/kernel · GitHub.
The boot loader can be placed on the CF card with sys.com from FreeDOS running on another system.
The kernel and command interpreter should also be copied to the CF card, using FAT[12/16/32]. Sys can also do this, along with the boot loader above.
When my system powers on, my BIOS will need to initialize the CF card and provide INT 13h disk services, along with INT services for video, keyboard, etc.
From BIOS, I need to load the boot drive number into the DL register.
My BIOS will need to load the boot loader from the first sector of the CF card into RAM and jump to it.
I need to make sure that the boot loader does not step on RAM that supports my BIOS (e.g., interrupt vector table and variables in RAM).
The boot loader will load the FreeDOS kernel into memory at 0x7C00 and jump to it. This may require that the boot loader is first moved in memory to an alternate address. I expect the FreeDOS boot loader already does this.
I have compiled a debug version of the kernel. Output on startup:
This is where the process gets hungs up. I will need to dig into the FreeDOS code to better understand what code is being processed when it stops here.