/* * Холодная часть ввода-вывода QuickSave (банк 8). * * Эти функции вызываются только банковым оркестратором pop_qsave.c, поэтому * им не место в дефицитном резидентном _CODE. Здесь только доступ через W0: * переключающие W3 DSS-операции обязаны оставаться в pop_qsave_io.c. */ #include "pop_qsave.h" #include void pop_qs_raw_put(pop_qs_io_t *io, const uint8_t *data, uint8_t size) { uint8_t *q, i; if (io->pos + size > io->limit) { io->failed=1; return; } gfx_w0_map(io->page); q=(uint8_t *)io->pos; for (i=0; ipos += size; } uint8_t pop_qs_raw_get(pop_qs_io_t *io, uint8_t *data, uint8_t size) { uint8_t *q, i; if (io->pos + size > io->limit) return 0; gfx_w0_map(io->page); q=(uint8_t *)io->pos; for (i=0; ipos += size; return 1; } /* XOR8 достаточно для обнаружения случайной порчи транзакционного файла; * размер payload проверяется отдельно, старший байт содержит инверсию XOR. */ uint16_t pop_qs_checksum_page(uint8_t page, uint16_t pos, uint16_t size) { uint8_t *p, sum=0; gfx_w0_map(page); p=(uint8_t *)pos; while(size--) sum ^= *p++; gfx_w0_unmap(); return (uint16_t)(sum | ((uint16_t)(uint8_t)~sum << 8)); }