/* * bank_write_page — записать диапазон EMM-страницы в УЖЕ ОТКРЫТЫЙ файл. * * Это симметричная операция к bank_read_page(): вызывающий владеет fd, * позицией файла и политикой create/temp/rename, а функция только временно * отображает физическую страницу в W3 и передаёт её диапазон ESTEX WRITE. * W3 восстанавливается до возврата на всех путях. * * ABI: обычный SDCC __sdcccall(1). Возврат — записанный размер либо * -1 с errno; допустимый диапазон страницы проверяется до переключения W3. */ #include #include #include #include int bank_write_page(int fd, uint8_t phys_page, uint16_t off, uint16_t size) { uint8_t saved; int n; if (off > 0x3FFFu || size > (uint16_t)(0x4000u - off)) { errno = EINVAL; return -1; } saved = _io_page_w3; sprinter_page_w3(phys_page); n = write(fd, (const void *)(0xC000u + off), size); sprinter_page_w3(saved); return n; }