dos_read(unsigned char huge *buf, unsigned long len) { union REGS regs; struct SREGS segregs; unsigned int bytes_to_read; segregs.ds = FP_SEG(buf); while(1) { regs.h.ah = 0x3f ; regs.x.bx = midf; regs.x.dx = 0; if(len >= 0x8000) bytes_to_read = 0x8000; else bytes_to_read = (unsigned int)len; regs.x.cx = bytes_to_read; intdosx(®s, ®s, &segregs); if(bytes_to_read < 0x8000) break; len -= 0x8000L; if(len == 0L) break; segregs.ds += 0x0800; } } .