diff --git a/src/Makefile b/src/Makefile index 5438e33..83e2e81 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,7 +28,7 @@ stdlib.o: CFLAGS := $(filter-out -flto, $(CFLAGS)) polmon.elf: LDFLAGS += -T flat1000.ld polmon.elf: polmon.o stdlib.o -polio.elf: LDFLAGS += -T flat0600.ld +polio.elf: LDFLAGS += -T flat0600.ld -mprotected-mode polio.elf: polio-main.o polio.s fat12.o paracomm.o stdlib.o paracli.elf: LDFLAGS += -T doscom.ld diff --git a/src/ftpget.c b/src/ftpget.c index 4c7ac5c..ca66481 100644 --- a/src/ftpget.c +++ b/src/ftpget.c @@ -5,6 +5,16 @@ #define kDefaultChunkSize 0x20 +static int recv(uint8_t* buf, uint8_t size) { + uint16_t ds = 0; + asm volatile ("push %%ds \n\t" + "mov %0, %%ds \n\t" + "pop %0 \n" : "+r"(ds)); + int len = read(kLpt1, buf, size); + asm volatile ("mov %0, %%ds" :: "r"(ds)); + return len; +} + int main(int argc, uint16_t argv[]) { if (argc < 2) { return -1; @@ -17,17 +27,26 @@ int main(int argc, uint16_t argv[]) { chunksize = argv[2]; } - uint8_t ok = 0x42; + uint8_t ack = 0x42; + int i; - for (int i = 0; i < size;) { - runcomms(kUntilIdle); + for (i = 0; i < size;) { // delay? - int len = read(kLpt1, dest + i, chunksize); + int len; + for (int j = 0; j < 3; j++) { + int r = runcomms(kUntilIdle); + len = recv(dest + i, chunksize); + if (len > 0) { + break; + } + } if (len <= 0) { break; } - write(kLpt1, &ok, 1); + write(kLpt1, &ack, 1); i += len; } + + return i; } diff --git a/src/polio-main.c b/src/polio-main.c index 4a3cc39..d59217b 100644 --- a/src/polio-main.c +++ b/src/polio-main.c @@ -18,13 +18,15 @@ void dosdbt(); void int80h(); -uint8_t parabuf[kRecvBufferSize]; -uint8_t parasize; +static uint8_t parabuf[kRecvBufferSize]; +static 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; + if (parasize + size > sizeof(parabuf)) { + size = sizeof(parabuf) - parasize; + } + memcpy(parabuf + parasize, buf, size); + parasize += size; } static void die() { @@ -51,7 +53,7 @@ static void __delay__(int n) { } } -uint8_t xferpara(uint8_t until_idle) { +uint16_t xferpara(uint8_t until_idle) { do { uint8_t mosib = paracomm_nextbyte(); __outb__(kParallelDataPort, mosib); @@ -65,7 +67,7 @@ uint8_t xferpara(uint8_t until_idle) { return paracomm_busy(); } -uint8_t parasend(uint8_t* addr, uint8_t size) { +uint16_t parasend(uint8_t* addr, uint8_t size) { uint8_t i; for (i = 0; i < size; i++) { if (paracomm_send(addr[i])) { @@ -75,7 +77,7 @@ uint8_t parasend(uint8_t* addr, uint8_t size) { return i; } -uint8_t pararecv(uint8_t* buf, uint8_t size) { +uint16_t pararecv(uint8_t* buf, uint8_t size) { if (parasize == 0) { return 0; } diff --git a/src/stdlib.c b/src/stdlib.c index eb58918..71e80a9 100644 --- a/src/stdlib.c +++ b/src/stdlib.c @@ -69,7 +69,7 @@ int runcomms(char until_idle) { asm volatile("mov $0x07, %%ah \n\t" "int $0x80 \n\t" : "=r"(ret) - : "r"(until_idle) + : "r"(ui) : "bx", "cx", "dx", "cc", "memory"); return ret;