/* * p3dir.c — изолированная диагностика большого FAT-каталога DSS. * * Проба ничего не изменяет: входит в BIGDIR, полностью исчерпывает * F_FIRST/F_NEXT, печатает фактический предел и проверяет возврат в корень. */ #include #include #include #include #include #include #include #define FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) static ffblk_t find_buf; static char cwd[256]; static char last_name[13]; static char name_511[13]; static char name_512[13]; static char name_513[13]; static uint16_t enum_count; static int enum_errno; static void save_name(char *dst) { strncpy(dst, find_buf.found_name, 12u); dst[12] = '\0'; } int main(void) { int rc; (void)settextmode(TEXT_MODE_80x32); clrscr_attr(0x17); gotoxy(0, 0); textattr(0x1Fu); cputs("P3 BIGDIR diagnostic\r\n\r\n"); textattr(0x17u); errno = 0; rc = chdir("\\BIGDIR"); printf("1 chdir BIGDIR: rc=%d errno=%d\n", rc, errno); if (rc != 0) goto done; errno = 0; if (getcwd(cwd, (uint16_t)sizeof(cwd))) printf("2 cwd: %s\n", cwd); else printf("2 getcwd failed: errno=%d\n", errno); errno = 0; rc = ffirst("*.*", &find_buf, FIND_ATTRS); printf("3 ffirst: rc=%d errno=%d\n", rc, errno); enum_count = 0u; if (rc == 0) { for (;;) { enum_count++; save_name(last_name); if (enum_count == 511u) save_name(name_511); if (enum_count == 512u) save_name(name_512); if (enum_count == 513u) save_name(name_513); errno = 0; if (fnext(&find_buf) != 0) break; if (enum_count == 2000u) { puts("Loop guard reached."); break; } } } enum_errno = errno; printf("4 enum: count=%u errno=%d last=%s\n", (unsigned)enum_count, enum_errno, last_name); printf("5 boundary: 511=%s 512=%s 513=%s\n", name_511, name_512, name_513); errno = 0; rc = chdir("\\"); printf("6 chdir root: rc=%d errno=%d\n", rc, errno); errno = 0; if (getcwd(cwd, (uint16_t)sizeof(cwd))) printf("7 cwd: %s\n", cwd); else printf("7 getcwd failed: errno=%d\n", errno); done: textattr(0x1Eu); cputs("\r\nProbe stopped; MAME test will take a snapshot."); for (;;) (void)getkey(); }