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