fix ftpget
This commit is contained in:
@@ -28,7 +28,7 @@ stdlib.o: CFLAGS := $(filter-out -flto, $(CFLAGS))
|
|||||||
polmon.elf: LDFLAGS += -T flat1000.ld
|
polmon.elf: LDFLAGS += -T flat1000.ld
|
||||||
polmon.elf: polmon.o stdlib.o
|
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
|
polio.elf: polio-main.o polio.s fat12.o paracomm.o stdlib.o
|
||||||
|
|
||||||
paracli.elf: LDFLAGS += -T doscom.ld
|
paracli.elf: LDFLAGS += -T doscom.ld
|
||||||
|
29
src/ftpget.c
29
src/ftpget.c
@@ -5,6 +5,16 @@
|
|||||||
|
|
||||||
#define kDefaultChunkSize 0x20
|
#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[]) {
|
int main(int argc, uint16_t argv[]) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -17,17 +27,26 @@ int main(int argc, uint16_t argv[]) {
|
|||||||
chunksize = argv[2];
|
chunksize = argv[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t ok = 0x42;
|
uint8_t ack = 0x42;
|
||||||
|
int i;
|
||||||
|
|
||||||
for (int i = 0; i < size;) {
|
for (i = 0; i < size;) {
|
||||||
runcomms(kUntilIdle);
|
|
||||||
// delay?
|
// 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) {
|
if (len <= 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
write(kLpt1, &ok, 1);
|
write(kLpt1, &ack, 1);
|
||||||
i += len;
|
i += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
@@ -18,13 +18,15 @@
|
|||||||
void dosdbt();
|
void dosdbt();
|
||||||
void int80h();
|
void int80h();
|
||||||
|
|
||||||
uint8_t parabuf[kRecvBufferSize];
|
static uint8_t parabuf[kRecvBufferSize];
|
||||||
uint8_t parasize;
|
static uint8_t parasize;
|
||||||
|
|
||||||
static void paracb(const uint8_t* buf, uint8_t size) {
|
static void paracb(const uint8_t* buf, uint8_t size) {
|
||||||
// we'll mercilessly erase old data with new data
|
if (parasize + size > sizeof(parabuf)) {
|
||||||
memcpy(parabuf, buf, size);
|
size = sizeof(parabuf) - parasize;
|
||||||
parasize = size;
|
}
|
||||||
|
memcpy(parabuf + parasize, buf, size);
|
||||||
|
parasize += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void die() {
|
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 {
|
do {
|
||||||
uint8_t mosib = paracomm_nextbyte();
|
uint8_t mosib = paracomm_nextbyte();
|
||||||
__outb__(kParallelDataPort, mosib);
|
__outb__(kParallelDataPort, mosib);
|
||||||
@@ -65,7 +67,7 @@ uint8_t xferpara(uint8_t until_idle) {
|
|||||||
return paracomm_busy();
|
return paracomm_busy();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t parasend(uint8_t* addr, uint8_t size) {
|
uint16_t parasend(uint8_t* addr, uint8_t size) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
if (paracomm_send(addr[i])) {
|
if (paracomm_send(addr[i])) {
|
||||||
@@ -75,7 +77,7 @@ uint8_t parasend(uint8_t* addr, uint8_t size) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pararecv(uint8_t* buf, uint8_t size) {
|
uint16_t pararecv(uint8_t* buf, uint8_t size) {
|
||||||
if (parasize == 0) {
|
if (parasize == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -69,7 +69,7 @@ int runcomms(char until_idle) {
|
|||||||
asm volatile("mov $0x07, %%ah \n\t"
|
asm volatile("mov $0x07, %%ah \n\t"
|
||||||
"int $0x80 \n\t"
|
"int $0x80 \n\t"
|
||||||
: "=r"(ret)
|
: "=r"(ret)
|
||||||
: "r"(until_idle)
|
: "r"(ui)
|
||||||
: "bx", "cx", "dx", "cc", "memory");
|
: "bx", "cx", "dx", "cc", "memory");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user