54 lines
1.2 KiB
C
54 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(); }
|