Add a fat12-enabled boot sector
This commit is contained in:
59
fat12boot.c
Normal file
59
fat12boot.c
Normal file
@@ -0,0 +1,59 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "fat12.h"
|
||||
|
||||
#define kPolmonAddress ((void*)0x0600)
|
||||
#define kFatAddress ((void*)0x1000)
|
||||
#define kRootDirAddress ((void*)0x1200)
|
||||
|
||||
|
||||
static int putchar(int c) {
|
||||
register uint8_t khar asm ("al") = c;
|
||||
register uint8_t func asm ("ah") = 0x0e;
|
||||
register uint8_t page asm ("bh") = 0;
|
||||
|
||||
asm volatile ("int $0x10"
|
||||
:: "r" (khar), "r" (func), "r" (page)
|
||||
: "bp");
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static int puts(const char* msg) {
|
||||
while (*msg) {
|
||||
putchar(*msg++);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void die(const char* msg) {
|
||||
puts(msg);
|
||||
while (1) {
|
||||
}
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void jump(void* addr) {
|
||||
asm volatile ("ljmp $0,%0" :: "i"(addr));
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void loadpolmon() {
|
||||
if (fat12_init(kFatAddress, kRootDirAddress)) {
|
||||
die("fi");
|
||||
}
|
||||
|
||||
if (fat12_readfile("POLMON COM", kPolmonAddress)) {
|
||||
die("pnf");
|
||||
}
|
||||
|
||||
jump(kPolmonAddress);
|
||||
}
|
||||
|
||||
int main() {
|
||||
loadpolmon();
|
||||
}
|
Reference in New Issue
Block a user