-
Было
Код:
packClusterSize = ImageData.BlkGetWord(1, "0722".Octal());
firstDirectoryBlockN = ImageData.BlkGetWord(1, "0724".Octal());
string systemVersion = ImageData.BlkGetWord(1, "0726".Octal()).Rad50Decode();
Стало
Код:
RADImage? homeBlock = ImageData[1];
packClusterSize = homeBlock.Words["0722".Octal()];
firstDirectoryBlockN = homeBlock.Words["0724".Octal()];
systemVersion = homeBlock.Words["0726".Octal()].Rad50Decode();
- - - Добавлено - - -
А потом станет совсем просто
Код:
HomeBlock homeBlock = new HomeBlock(ImageData[1]);
:)
- - - Добавлено - - -
В общем, пока сам программой и кодом не поиграешься - хороших идей в голову не придёт :)
Постепенная переделка кода под новый подход.
В ближайшей перспективе - переделка работы с RT-11 ФС на использование маппера (последняя строка в предыдущем сообщении)
Потом попытка сделать обратный маппер - то есть пишем в homeBlock, а оно пишется на нужное место в общем образе :)
-
Добрался до более-менее полноценного тестирование - как потрошения образов, так и собрания.
На удивление мало ошибок и некоторая часть связана не с новым подходом работы с образами и некоторая часть не связана с моим кодом вообще - условно говоря - пара ошибок автора и ошибка (при способе автора - не проявлявшаяся) документации :)
- - - Добавлено - - -
А, да :)
С RT-11 новый подход - это конечно - круто (хотя на самом деле не всегда), а вот с XXDP/DOS-11 и RSX не совсем - так как там есть и ненепрерывные файлы :)
Думаю :)
-
Начал переделку работы с ФС RT-11 под испольвание маппера. Можно сравнить куски кода работы с описателем файла:
Было
Код:
F_ESTAT deStatus = (F_ESTAT)currSegment.Words[de + 0 * 2];
if (deStatus.Has(F_ESTAT.E_PERM | F_ESTAT.E_TENT | F_ESTAT.E_MPTY))
{
RT11File f = new(); // new file, read dir entry
f.Status = deStatus;
f.FileName =( currSegment.Words[de + 1 * 2].Rad50Decode()
+ currSegment.Words[de + 2 * 2].Rad50Decode()).TrimEnd(); // filnam: 6 chars
f.Extension = currSegment.Words[de + 3 * 2].Rad50Decode().TrimEnd(); // extension: 3 chars
f.BlkNum = startBlockN; // startblock on disk
f.BlkCount = currSegment.Words[de + 4 * 2]; // blocks in data stream
if (deStatus.Has(F_ESTAT.E_MPTY))
freeBlocks += f.BlkCount;
else
usedFileBlocks += f.BlkCount;
// currSegment.Words[de + 5 * 2]; // ignore job/channel
UInt16 id = currSegment.Words[de + 6 * 2];
f.CreationDate = RT11Date.Decode(informator, id); // creation date
...
Стало
Код:
DirectoryEntry dirEntry = new(currSegment.Bytes, de);
if (dirEntry.Status.Has(F_ESTAT.E_PERM | F_ESTAT.E_TENT | F_ESTAT.E_MPTY))
{
RT11File f = new(); // new file! read dir entry
f.Status = dirEntry.Status;
f.FileName = dirEntry.Name.TrimEnd();
f.Extension = dirEntry.Extension.TrimEnd();
f.BlkNum = startBlockN; // startblock on disk
f.BlkCount = dirEntry.Length; // blocks in data stream
if (dirEntry.Status.Has(F_ESTAT.E_MPTY))
freeBlocks += f.BlkCount;
else
usedFileBlocks += f.BlkCount;
// dirEntry.JobNum dirEntry.Channel dirEntry.Time // ignore job/channel, but dirEntry.Time (in future)
f.CreationDate = dirEntry.Date.RDateTime; // creation date
...
Какие такие жёстко закодированные смещения? :):)
Ну и флаги статуса записи о файле уже были доделаны, но имена ещё не были сменены на более юзерфрендли :)
-
ImageUtils была доработана для поддержки двухсторонних дисков МС0515.
По крайне мере тот образ, который ко мне попал, выглядел как – одна сторона (головка) – один диск, другая сторона (головка) – второй диск.
-
Улучшена поддержка дисков с МС0515 (добавлен ещё один вариант образа), поправлена и дополнена информация о занятости блоков, добавлена поддержка для польского вундер-устройства - аналог PDP-11 с флопповодами от Apple (35 цилиндров по 16 секторов по 256 байт с интерливом)
-
Активное использование и, как следствие, активное исправление ошибок и шерховатостей
-
Видимо, устал от FPGA - желанию возиться как-то уменьшилось.
Не помню уже с чего - начал наводить порядок среди файлов для Э85/DEC Pro.
Ну и плавно опять начал возиться с ImageUtils.
Задача номер 1 - навести порядок среди образов для тестирования.
Задача номер 2 - поправить одну или две обнаруженные ошибки-неточности.
Задача номер 3 - подсовывать битые образы и постараться выправить реакцию - не вылет, а логирование ошибок :)
Дальше будет видно.
Пока - задача номер 1.
-
Хм.. Странно, что никто ещё не наткнулся на ошибку в ситуации, когда размер логического и физического блока не совпадают - по крайне мере у меня на первом и втором встретившихся образах программа весело слетела :)
Допилил - собственно, так ничего сложного - но для полноценной проверки надо найти битый образ (с логом ошибок). Пока держу в памяти и смотрю остальные образы
-
Процесс идёт - задача 3 :)
Но что бы не выгореть на ней - периодически отвлекаюсь (стараюсь фифти-фифти) на параллельную задачу :) Пока о ней говорить рано, но связана она с переписыванием (опять :) ) одной (в принципе - достаточно известной проги) с Си на C#. Причина примерно та же, как и с переписыванием TU58fs c Си на C# - потребность допилить функционал и невозможность собрать (Си, я, конечно, не люблю, но допилить прогу мог бы) под VS для Windows.
Чую, скоро стану мастером в этом деле :D
-
ImageUtil у меня достаточно тесно связана с другими делами - в частности - приведением в порядок файло-помойки.
А с этим делом тесно связаны другие программы, кои писались с очень давним времён - где-то так примерно с VS2010, а одна (xcomp - сравнение и, если надо - удаление одинаковых файлов с заходом в подкаталоги) - вообще первоначально была написана под Delphi, причём - под второй версией - та, которая уже 32-ух битная. К сожалению, этот исходник был утерен, так что какое-то время я ей пользовался как есть - без разных возникавших в голове вариантов доработки :)
Но потом решил всё таки переписать на C#, что бы добавить функционал. Для ускорения поиска одинаковых файлов было написано ещё две программы - одна вычисляла разные контрольные суммы и записывала их в метафайл в каталоге, а вторая (графическая) - ориентируясь на КС из метафайла - предлагала список возможных кандидатов-дублей, в котором выбранные пары можно было сравить и при совпадении - один из них удалить или заменить на своеобразный файл-указатель - в котором запоминалась информация об имени, размере, датах создания и изменения и КС файла.
Но поскольку люблю я работать из командной строки - не хватало мне аналога последний программы, но работающей из командной строки. Плюс - было известно, что в некоторых ситуациях - файлы в каталоге были удалены, но при прогоне программы, которая собирала информацию о файлах - сей факт в метафайле не отображался. Ну и развлекаясь с образами дисков и поисков файлов-дубликатов из них - налетел я на вторую ошибку - при каких-то условиях программа поиска дубликатов неожиданно завершала свою работу.
И вот в конце прошлой недели меня эти ошибки наконец достали :) Сначала хотел просто прогнать их под отладчиком. Оппа - а установленной VS2010 нет :) Плюс в .NET 4.x есть проблема с длинными путями (и как я не старался - так мне и не удалось заставить её с ними адекватно работать).
Так что достал я исходники и решил все три программы перенести под VS2022 и .NET 7.x (в том числе - вариант под .NET 4.x собирается тоже). Но в тот день было уже два часа - и не дня, а ночи :) Поэтому побрёл я спать - и как часто - уже засыпая - прокручивал в голове разные варианты доработок.
Сейчас уже сложно вспомнить всё блуждание мыслей, но с утра я проснулся с мыслью - вместо трёх программ сделать одну :) И простое сравнение (с удалением или заменой на указатели) и поиск дубликатов с помощью КС - с последующим удалением или заменой на указатели. Как из графики, так и из командной строки.
Так что все выходные и начало недели шёл этот процесс. В том числе - и рефакторинг. В том числе - пофиксил ошибки.
И весьма занятно было посмотреть на свой код, написанный тогда :)
В целом, ещё не все задумки реализованы - но основной функционал уже нарисован. Так что дальше (внутреннее) тестирование, отладка и (потихоньку) допиливание.
Ещё бродит мысль - в принципе - можно использовать и возможности NTFS по созданию указателей - то есть, когда файл один, но ссылки на него идут из разных каталогов. Правда, более-менее нормально это работает только в пределах одного тома. Когда ссылка сделана между томами - она становится (фактически) неработоспособной, если тома, куда она ведёт - нет в системе. Ну и - копирование естественно создаёт копии файлов, а не - один файл со ссылками. Так что эти мысли - пока не будут реализованы.
Но всё хорошее (в смысле - допиливание этой программы и ImageUtils и перепиливание с Си ещё одной проги) скоро закончится - примерно с середины февраля был у меня своеобразный отпуск (и я слегка поотрывался, в том числе на программировании), а с понедельника выхожу на новую работу. Где этого программирования будет вагон и маленькая ОГРОМНАЯ тележка, так что ещё программировать и для себя - будет не сильно в кайф. И переключусь опять на FPGA - как на сильно отличающееся хобби :)