8e389c03f8
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
33 lines
1.2 KiB
C
33 lines
1.2 KiB
C
/*
|
||
* bank_write_page — записать диапазон EMM-страницы в УЖЕ ОТКРЫТЫЙ файл.
|
||
*
|
||
* Это симметричная операция к bank_read_page(): вызывающий владеет fd,
|
||
* позицией файла и политикой create/temp/rename, а функция только временно
|
||
* отображает физическую страницу в W3 и передаёт её диапазон ESTEX WRITE.
|
||
* W3 восстанавливается до возврата на всех путях.
|
||
*
|
||
* ABI: обычный SDCC __sdcccall(1). Возврат — записанный размер либо
|
||
* -1 с errno; допустимый диапазон страницы проверяется до переключения W3.
|
||
*/
|
||
|
||
#include <unistd.h>
|
||
#include <errno.h>
|
||
#include <sprinter.h>
|
||
#include <sprinter_mem.h>
|
||
|
||
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;
|
||
}
|