/* * bank_load_file — прочитать файл непосредственно в физическую EMM-страницу. * * ESTEX принимает файловый буфер только в W1..W3; используем W3, сохраняя и * восстанавливая его раскладку. Функция резидентна, поэтому её безопасно * вызывать из банкового кода huge: после open() указатель path больше не * читается, пока W3 временно занят целевой страницей. * * Возврат: фактически прочитанный размер либо -1 + errno. */ #include #include #include #include #include int bank_load_file(uint8_t phys_page, uint16_t off, const char *path, uint16_t max_size) { uint8_t saved; int fd, n; if (off > 0x3FFFu || max_size > (uint16_t)(0x4000u - off)) { errno=EINVAL; return -1; } fd = open(path, O_RDONLY); if (fd < 0) return -1; saved = _io_page_w3; sprinter_page_w3(phys_page); n = read(fd, (void *)(0xC000u + off), max_size); sprinter_page_w3(saved); close(fd); return n; }