#include #include #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(); }