Files
Sprinter-SDCC/applications/Volkov/tests/p1_platform/p1_emm.c
T
snark13 8e389c03f8 Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
2026-09-10 10:45:30 +03:00

97 lines
2.7 KiB
C

/*
* p1_emm.c — проверка выделения трёх EMM-страниц и доступа через W3.
*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <sprinter_mem.h>
#include "p1_platform.h"
#define P1_PAGE_SIZE 0x4000u
#define P1_BLOCK 64u
static uint8_t write_buf[P1_BLOCK];
static uint8_t read_buf[P1_BLOCK];
static void make_pattern(uint8_t page_index, uint8_t salt)
{
uint8_t i;
for (i = 0; i < P1_BLOCK; i++) {
write_buf[i] = (uint8_t)(salt ^ (uint8_t)(page_index * 0x41u + i));
read_buf[i] = 0;
}
}
static int check_region(uint8_t page, uint8_t page_index,
uint16_t offset, uint8_t salt)
{
make_pattern(page_index, salt);
bank_write(page, offset, write_buf, P1_BLOCK);
bank_read(page, offset, read_buf, P1_BLOCK);
if (memcmp(write_buf, read_buf, P1_BLOCK) != 0) {
printf("Mismatch: logical=%u phys=%02X offset=%04X\n",
(unsigned)page_index, (unsigned)page, (unsigned)offset);
return -1;
}
return 0;
}
int p1_test_emm(void)
{
uint16_t total_before, free_before;
uint16_t total_after, free_after;
uint8_t block;
uint8_t page[3];
uint8_t i;
int failed = 0;
p1_heading("EMM: 3-page allocation and W3 access");
errno = 0;
mem_info(&total_before, &free_before);
printf("Before: total=%u free=%u pages\n",
(unsigned)total_before, (unsigned)free_before);
block = mem_alloc_pages(3);
if (block == 0) {
printf("mem_alloc_pages(3) failed: errno=%d\n", errno);
return -1;
}
printf("Block id: %u\n", (unsigned)block);
for (i = 0; i < 3; i++) {
page[i] = mem_get_page(block, i);
printf(" logical %u -> physical %02X\n",
(unsigned)i, (unsigned)page[i]);
if (page[i] == 0) failed++;
}
if (page[0] == page[1] || page[0] == page[2] || page[1] == page[2]) {
puts("Physical page numbers are not distinct.");
failed++;
}
for (i = 0; i < 3; i++) {
if (page[i] == 0) continue;
if (check_region(page[i], i, 0, 0x5A) != 0) failed++;
if (check_region(page[i], i,
(uint16_t)(P1_PAGE_SIZE - P1_BLOCK), 0xA5) != 0) {
failed++;
}
}
mem_free_block(block);
mem_info(&total_after, &free_after);
printf("After : total=%u free=%u pages\n",
(unsigned)total_after, (unsigned)free_after);
if (total_before != total_after || free_before != free_after) {
puts("EMM counters were not restored after free.");
failed++;
}
printf("EMM checks failed: %u\n", (unsigned)failed);
return failed ? -1 : 0;
}