#include #include "fat12.h" #include "paracomm.h" #define kFatAddr ((void*)0x1a00) #define kRootDirAddr ((void*)0x1c00) #define kPolmonAddr ((void*)0x1000) #define kInt80Vector ((uint16_t*)(0x80 * 4)) #define kParallelDataPort 0x3bc #define kParallelStatusPort 0x3bd #define kParallelControlPort 0x3be #define kParaDelay 400 void dosdbt(); void int80h(); uint8_t* parabuf; uint8_t parasize; static void paracb(const uint8_t* buf, uint8_t size) { if (size > parasize) { return paracb(buf, parasize); } for (int i = 0; i < size; i++) { parabuf[i] = buf[i]; } parasize = 0; } static void die() { while (1) { } } static void __outb__(uint16_t port, uint8_t data) { register uint16_t p asm("dx") = port; register uint8_t d asm("al") = data; asm volatile("outb %0, %1" ::"r"(d), "r"(p)); } static uint8_t __inb__(uint16_t port) { register uint16_t p asm("dx") = port; register uint8_t d asm("al"); asm volatile("inb %1, %0" : "=r"(d) : "r"(p)); return d; } static void __delay__(int n) { for (int i = 0; i < n; i++) { asm volatile(""); } } static void paraxfer() { uint8_t mosib = paracomm_nextbyte(); __outb__(kParallelDataPort, mosib); __outb__(kParallelControlPort, 1); __delay__(kParaDelay); __outb__(kParallelControlPort, 0); __delay__(kParaDelay); uint8_t mison = __inb__(kParallelStatusPort) >> 4; paracomm_feed(mison); } void pararecv(uint8_t* addr, uint8_t size) { parabuf = addr; parasize = size; for (int i = 0; i < 1 + 2 + size * 2; i++) { if (!parasize) { break; } paraxfer(); } } void parasend(uint8_t* addr, uint8_t size) { for (int i = 0; i < size; i++) { paracomm_send(addr[i]); } for (int i = 0; i < size + 2; i++) { paraxfer(); } } int main() { dosdbt(); paracomm_init(paracb); fat12_init(kFatAddr, kRootDirAddr); uint16_t* int80v = kInt80Vector; int80v[0] = (uint16_t)int80h; int80v[1] = 0; if (fat12_readfile("POLMON COM", kPolmonAddr)) { die(); } asm volatile("jmp *%0" ::"r"(kPolmonAddr)); }