#include #include #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; }