Files
5150/polio-main.c

102 lines
2.1 KiB
C

#include <stdint.h>
#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));
}