Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user