53 lines
1.0 KiB
C
53 lines
1.0 KiB
C
#include <stdint.h>
|
|
#include <unistd.h>
|
|
|
|
#include "polos.h"
|
|
|
|
#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;
|
|
}
|
|
|
|
uint8_t* dest = (uint8_t*)argv[0];
|
|
uint16_t size = argv[1];
|
|
uint8_t chunksize = kDefaultChunkSize;
|
|
if (argc > 2) {
|
|
chunksize = argv[2];
|
|
}
|
|
|
|
uint8_t ack = 0x42;
|
|
int i;
|
|
|
|
for (i = 0; i < size;) {
|
|
// delay?
|
|
|
|
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, &ack, 1);
|
|
i += len;
|
|
}
|
|
|
|
return i;
|
|
}
|