Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
# Полный scan/store/sort большого каталога теми же модулями, что Commander.
|
||||
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../../../..)
|
||||
EXAMPLE := p3scan
|
||||
MEMORY := big
|
||||
ALLOCS ?= 3000
|
||||
EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -I ../../include \
|
||||
--bank 1=../../src/sc_source_fs.c \
|
||||
--bank 1=../../src/sc_sort.c
|
||||
EXTRA_SRCS := ../../src/sc_panel.c ../../src/sc_store.c
|
||||
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
|
||||
$(EXE): Makefile ../../src/sc_source_fs.c ../../src/sc_sort.c
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* p3scan.c — диагностика полного пути scan/store/sort большого каталога.
|
||||
*
|
||||
* Использует те же банковые модули P3, но не делает panel change/rollback,
|
||||
* поэтому сохраняет точные rc, errno и состояние панели в точке отказа.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <conio.h>
|
||||
#include <sprinter_mem.h>
|
||||
#include "sc_panel.h"
|
||||
#include "sc_source.h"
|
||||
#include "sc_store.h"
|
||||
|
||||
static ScPanel panel;
|
||||
static ScDirEntry entry;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uint8_t block;
|
||||
uint8_t page;
|
||||
int rc;
|
||||
int saved_errno;
|
||||
|
||||
(void)settextmode(TEXT_MODE_80x32);
|
||||
clrscr_attr(0x17);
|
||||
gotoxy(0, 0);
|
||||
textattr(0x1Fu);
|
||||
cputs("P3 scan/store/sort diagnostic\r\n\r\n");
|
||||
textattr(0x17u);
|
||||
|
||||
block = mem_alloc_pages(1u);
|
||||
page = block ? mem_get_page(block, 0u) : 0u;
|
||||
printf("EMM: block=%u page=%02X errno=%d\n",
|
||||
(unsigned)block, (unsigned)page, errno);
|
||||
if (!block || !page) goto done;
|
||||
|
||||
memset(&panel, 0, sizeof(panel));
|
||||
strcpy(panel.path, "\\BIGDIR");
|
||||
panel.phys_page = page;
|
||||
|
||||
puts("Calling sc_source_fs_scan...");
|
||||
errno = 0;
|
||||
rc = sc_source_fs_scan(&panel);
|
||||
saved_errno = errno;
|
||||
printf("scan: rc=%d errno=%d count=%u trunc=%u\n",
|
||||
rc, saved_errno, (unsigned)panel.count,
|
||||
(unsigned)panel.truncated);
|
||||
printf("view: cursor=%u top=%u total=%lu\n",
|
||||
(unsigned)panel.cursor, (unsigned)panel.top,
|
||||
(unsigned long)panel.total_size);
|
||||
|
||||
if (panel.count != 0u && sc_store_get(&panel, 0u, &entry) == 0)
|
||||
printf("first: %s attr=%02X flags=%02X\n", entry.name,
|
||||
(unsigned)entry.attr, (unsigned)entry.flags);
|
||||
if (panel.count != 0u &&
|
||||
sc_store_get(&panel, (uint16_t)(panel.count - 1u), &entry) == 0)
|
||||
printf("last : %s attr=%02X flags=%02X\n", entry.name,
|
||||
(unsigned)entry.attr, (unsigned)entry.flags);
|
||||
|
||||
mem_free_block(block);
|
||||
|
||||
done:
|
||||
textattr(0x1Eu);
|
||||
cputs("\r\nProbe stopped; MAME test will take snapshots.");
|
||||
for (;;) (void)getkey();
|
||||
}
|
||||
Reference in New Issue
Block a user