94 lines
2.0 KiB
C
94 lines
2.0 KiB
C
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.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
|
|
#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));
|
|
}
|