/* Резидентная часть QuickSave: часто вызываемые межбанковые примитивы * потока и флаг запроса. Файловый обмен с W3 теперь общий в libc. */ #include "pop_qsave.h" #include #include uint8_t pop_qsave_request; void pop_qsave_request_save(void) { pop_qsave_request=1; } void pop_qsave_request_load(void) { pop_qsave_request=2; } void pop_qsave_request_load_backup(void) { pop_qsave_request=3; } void pop_qs_bytes(pop_qs_io_t *io, void *data, uint16_t size) { uint8_t *p=(uint8_t *)data, *q; if (io->failed || io->pos + size > io->limit) { io->failed=1; return; } gfx_w0_map(io->page); q=(uint8_t *)io->pos; if (!io->reading) memcpy(q,p,size); else if (io->apply) memcpy(p,q,size); gfx_w0_unmap(); io->pos += size; io->count += size; } void pop_qs_u8(pop_qs_io_t *io, uint8_t *v) { pop_qs_bytes(io,v,1); } void pop_qs_i8(pop_qs_io_t *io, int8_t *v) { pop_qs_bytes(io,v,1); } void pop_qs_u16(pop_qs_io_t *io, uint16_t *value) { uint8_t b[2]; b[0]=(uint8_t)*value; b[1]=(uint8_t)(*value >> 8); pop_qs_bytes(io,b,2); if (io->reading && io->apply && !io->failed) *value=(uint16_t)(b[0] | ((uint16_t)b[1] << 8)); } void pop_qs_i16(pop_qs_io_t *io, int *value) { uint16_t v=(uint16_t)*value; pop_qs_u16(io,&v); if (io->reading && io->apply && !io->failed) *value=(int)v; }