Files
Sprinter-SDCC/applications/Volkov/tests/p1_platform/p1probe.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

118 lines
2.9 KiB
C

/*
* p1probe.c — интерактивный набор платформенных проб Sprinter Commander.
*
* Программа ничего не удаляет и не изменяет в текущем каталоге. EMM-тест
* пишет исключительно в выделенный блок памяти, дочерняя программа также
* не выполняет дисковых записей.
*/
#include <stdio.h>
#include <stdint.h>
#include <conio.h>
#include "p1_platform.h"
void p1_heading(const char *title)
{
clrscr_attr(0x17);
gotoxy(0, 0);
textattr(0x1F);
cprintf("Sprinter Commander - P1 platform probe\r\n");
textattr(0x17);
cprintf("%s\r\n\r\n", title);
}
void p1_pause(void)
{
textattr(0x1E);
cputs("\r\nPress any key to return to menu...");
(void)getkey();
}
static void show_menu(void)
{
p1_heading("Main menu");
cputs("1 Directory and F_FIRST/F_NEXT\r\n");
cputs("2 EMM allocation and page access\r\n");
cputs("3 WINREST full/partial screen\r\n");
cputs("4 Keyboard event codes\r\n");
cputs("5 EXEC child and return\r\n");
cputs("6 DSKINFO current disk\r\n");
cputs("A Automatic non-visual probes (1, 2, 6)\r\n");
cputs("0 Exit\r\n\r\n");
textattr(0x1E);
cputs("Select: ");
}
static void report_result(int rc)
{
if (rc == 0) {
textattr(0x2F);
cputs("\r\nRESULT: PASS\r\n");
} else {
textattr(0x4F);
cputs("\r\nRESULT: FAIL\r\n");
}
}
static void run_automatic(void)
{
int failed = 0;
p1_heading("Automatic non-visual probes");
cputs("[1/3] Directory\r\n");
if (p1_test_directory() != 0) failed++;
cputs("\r\n[2/3] EMM\r\n");
if (p1_test_emm() != 0) failed++;
cputs("\r\n[3/3] DSKINFO\r\n");
if (p1_test_disk_info() != 0) failed++;
textattr(failed ? 0x4F : 0x2F);
cprintf("\r\nAutomatic result: %u failed\r\n", (unsigned)failed);
p1_pause();
}
int main(void)
{
uint16_t key;
uint8_t ch;
int rc;
if (settextmode(TEXT_MODE_80x32) != 0) {
puts("Cannot set 80x32 text mode.");
return 1;
}
for (;;) {
show_menu();
key = getkey();
ch = (uint8_t)key;
if (ch >= 'a' && ch <= 'z') ch = (uint8_t)(ch - 'a' + 'A');
if (ch == '0' || ch == 0x1B) break;
if (ch == 'A') {
run_automatic();
continue;
}
rc = -1;
switch (ch) {
case '1': rc = p1_test_directory(); break;
case '2': rc = p1_test_emm(); break;
case '3': rc = p1_test_screen(); break;
case '4': rc = p1_test_keyboard(); break;
case '5': rc = p1_test_exec(); break;
case '6': rc = p1_test_disk_info(); break;
default: continue;
}
report_result(rc);
p1_pause();
}
textattr(0x0F);
clrscr();
return 0;
}