Files
5150/fat12boot.c

64 lines
1.2 KiB
C

#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");
}
while (fat12_readfile("POLIO COM", kPolmonAddress)) {
asm volatile (
"mov $00, %%ah \n\t"
"int $0x16 \n\t"
::: "ax"
);
}
jump(kPolmonAddress);
}
int main() {
loadpolmon();
}