#include #include #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 #define kRecvBufferSize 256 void dosdbt(); void int80h(); uint8_t parabuf[kRecvBufferSize]; uint8_t parasize; static void paracb(const uint8_t* buf, uint8_t size) { // we'll mercilessly erase old data with new data memcpy(parabuf, buf, size); parasize = size; } 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(""); } } uint8_t xferpara() { 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); return paracomm_busy(); } uint8_t parasend(uint8_t* addr, uint8_t size) { uint8_t i; for (i = 0; i < size; i++) { if (paracomm_send(addr[i])) { break; } } return i; } int main() { dosdbt(); parasize = 0; 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)); }