Info Guide #12
31 декабря 2017

Системки - история операционной системы CP/M для Спектрума: ограничения (часть 2).

    32 МБ хватит на всех
Максагор/NedoPC group

   Только  когда  долго  эксплуатируешь ту
или иную ОС, можно досконально изучить все 
её  особенности, достоинства и недостатки, 
вплоть  до  глюков и ошибок. Это банальная 
истина,но именно это позволило найти такой 
недостаток  в ATM-реализации ОС CP/M v2.2, 
о котором вот так просто предположить было 
нельзя. 

                  * * *

   Чтобы  была  понятна  суть  недостатка,
кратко пробегусь  по структуре организации
дисковых устройств в данной версии ОС.

   Всего в системе может быть до8 драйве─
ров с номерами от0 до 7. При этом:
  - номера драйверов0,6и7были зарезер─
вированы под будущие расширения и не испо─ 
льзовались; 
  -5(NETdisk - сетевой диск)был заявлен
в документации, но на данный момент  неиз─ 
вестна прошивка ПЗУ,где он был бы реализо─ 
ван; 
  -1(ROM-диск)был  встречен мной только
один  раз  в специальной "увеличенной" ПЗУ 
объёмом в256 КБдля ATM-turbo 2+; 
  -4(HDD)имеется в наличии только в ПЗУ
ATM-turbo 2(+); 
  - и только драйвера под номерами2(RAM-
диск) и 3(FDD)имеются  в прошивках  для
всех типов АТМ. 

   Путём  подключения  к данным  драйверам
описателей  блочных  устройств можем полу─
чить  разные  диски или разделы на дисках.
Всего  таковых  РАЗНЫХ  описателей-каналов
в ядре системы может  быть создано10 (де─
сять).
   В  свою  очередь, эти 10 каналов можно
подключить к16 (ШЕСТНАДЦАТИ) буквам логи─
ческих дисков-устройств (A: B: C: D:... N:
O: P:). При этом,учитывая,что каналов-опи─ 
сателей меньше, чем логических дисков, то─
лько максимум10 дисков будут независимыми
друг от друга,а дополнительные диски можно
задействовать, если,например,в целях боль─
шего  удобства в копировании назначать не─
которые  каналы сразу на несколько дисков.
Например,привязать флоппи-дисковод0 сразу
к буквам  A: и C:, а  флоппик1 - к буквам
B:, D: и K:, и т.д. 
   Вот  с таким набором и приходится иметь
дело в CP/M на машинах линейки ATM. И если
при  работе на ATM-turbo 1, где из реально
существующих  дисков  есть  только  FDD  и
RAM-диск и, по факту, реально мной исполь─
зовались только буквы A: B: C: (собственно
RAM-диск  и два флопика), то  всё  измени─
лось, когда я пересел на ATM-turbo 2+, где
присутствует Его Величество Винчестер.
   В CP/M нет полноценных каталогов,поэто─
му огромное количество файлов быстро прев─
ращаются в бессвязную кашу,в которой труд─
но что-либо найти. Плюс, чем больше файлов
в каталоге,тем всё больше тормозит система
при попытке его обработать. В итоге, зача─
стую, скорость  работы  программы с винтом
может, при большом числе файлов в каталоге
упасть  почти  до  скорости работы флопа в
том же TR-DOS.
   Поэтому  в мануалах по работе с винчес─
тером в CP/M на АТМ не зря обращалось осо─
бое внимание  на нерекомендуемость  созда─
вать  слишком  объёмные разделы на винте и
слишком большие области каталога.Наоборот,
рекомендовалось делать изначальный, систе─
мный  раздел  винта  с наиболее базовыми и
часто встречающимися файлами и файлами на─
строек  не больше1-2 МБ и каталогом в 128
файлов,а остальные уж как получится, то не
более512, максимум 1024 файла в каталоге.
   При этом путём "метода проб и ошибок" я
пришёл к заключению, что максимальный раз─
мер раздела,с которым имеет смысл работать
-8 МБ и 512 файлов в каталоге.

   В общем, послушав  советы в мануалах, я
создал карту дисков так, как там написано.

   Сначала  сделал  так  же, как и в АТМ 1
(разве что там RAM-диск меньше на512 КБ):
  - A: -RAM-диск в944 КБ(он на этой бу─
кве изначально после запуска.Переназначить 
можно, но  по причинам, лежащим вне данной 
статьи, это нерационально); 
  - B: -FDD 0(640 КБ);
  - C: -FDD 1(640 КБ).

   А дальше я планировал следующие разделы
винта (их объём указан округлённо):
  - D: -HDD-partition 1(1 МБ, 128 файлов
в каталоге) - тот самый системный раздел;
  - E: -HDD-partition 2(4 МБ, 256 файлов
в каталоге) - тоже системный, чуть больше;
  - F: -HDD-partition 3(8 МБ, 512 файлов
в каталоге);
  - G: -HDD-partition 4(8 МБ, 512 файлов
в каталоге);
  - H: -HDD-partition 5(8 МБ, 512 файлов
в каталоге);
  - I: -HDD-partition 6(8 МБ, 512 файлов
в каталоге);
  - J: -HDD-partition 7(8 МБ, 512 файлов
в каталоге).

   И вот тут-то  я и столкнулся  с глюком.
Разделы D-H создавались и открывались нор─
мально, а вот  попытки  открыть  созданные
разделы I-J (хоть в оболочке прочитать ка─
талог,хоть просто в командной строке толь─
ко  перейти на их букву) заканчивались ви─
сяком  системы намертво. Она просто засты─
вала и переставала реагировать на всё вок─
руг, кроме  сброса. Короче, полная  "птица
обломинго".
    Даже  не  было  понятно, с чего начать
разбираться. Удалось  только выяснить, что
если, к примеру, не назначать  какую-то из
ранних букв (например, G: ), то тогда уда─
валось  назначить диск из ранее "недоступ─
ных" букв.Также без проблем удавалось наз─
начить эти буквы на уже существующие кана─
лы - когда новая буква просто означала тот
же диск, что одна из предыдущих букв.
   На  этом  когда-то  исследования и были
прекращены. И было это более 10 лет назад.

   Сегодня, когда  доступны эмуляторы АТМ,
работающие с образами винчестера, что поз─
воляет в любой момент посмотреть, что про─
исходит в памяти, я вернулся к этой давней
полузабытой  нерешённой проблеме и, создав
образ и разбив его на разделы, воспроизвёл
в точности  эту ошибку, после чего полез в
отладчик  эмулятора. До  сути  я докопался
довольно быстро.
   И ошибка оказалась не совсем ошибкой,но
достаточно банальной. Вот в чём суть.

   Ядро  CP/M(CCP+BDOS+BIOS) в АТМ распо─
лагается по следующим адресам:
  - #D400-#DC05:CCP (интерпретатор коман─
дной строки,независим от железа,на котором
запускается);
  - #DC06-#E9FF:BDOS  (диспетчер  функций
DOS, независим от железа,на котором запус─
кается);
  - #EA00-#F7FF:BIOS (стандартная керналь
низкоуровневых "железозависимых" функций).
   Сразу  за  этими частями ядра лежит ещё
область:
  - #F800-#FFFF:System  Monitor - монитор
наиболее низкоуровневых системных функций,
куда  обращаются "железозависимые" функции
BIOS. Представляет  собой  керналь функций
по  прямому доступу к низкоуровневым драй─
верам  физических  устройств ввода-вывода,
драйверу экранной консоли.

   При  этом  раздел  BIOS  только отчасти
"забит"  кодом. В  конце его располагаются
области различных переменных - прежде все─
го  описатели  структуры подключенных дис─
ков, а область размером в2048 байт, непо─
средственно  прилегающая  к областиSystem
Monitor  (#F000-#F7FF)  отведена под т. н.
"вектора  размещения  блоков" подключенных
дисков.
   Другими словами,здесь размещаются карты
заполнения  дисков, которые не хранятся на
самих дискетах (вродеFAT в MS-DOS ),а вы─
числяются системой посредством анализа ка─
талога  вновь выбираемого диска - при этом
под  каждый  логический  блок выделяется1
бит. Если  блок свободен -бит=0, если за─
нят - равен1. Один логический блок может,
теоретически,изменяться программно при со─
здании дисковых описателей,но по умолчанию
всегда  системой  выставляется равным2048
байт или2 КБ.
   При этом существующими утилитами, зани─
мающимися подключением новых дисков и опи─
сателей к дисковым каналам (@.COM, AS.COM,
ASS.COM,ASSIGN.COM,FDISK.COM) можно менять 
только такие параметры, как число головок,
секторов, дорожек и размер физических сек─
торов, да количество файлов в каталоге, но
не  размер  логического блока.
   Таким  образом, на текущий момент можно
считать  размер  такого  блока в2048 байт
как данность. В карте диска такой блок за─
нимает1 бит. Значит, на 8 блоков (16 КБ в
сумме) придётся1 байт битовой карты.

   По мере подключения новых и новых кана─
лов  дисков  в рамках общей области #F000-
#F7FF одному  каналу  за другим выделяется 
пропорциональное размеру дисков место.Так,
битовая  карта  флоппи-дискеты  размером в
640 КБ займёт40 байт. Начало  битовой об─ 
ласти каждого из подключенных дисков запо─
минается и может быть получено программис─
том по функцииBDOS27.
   Нетрудно подсчитать,что вся эта область
в2048  байт  в сумме  позволит адресовать
16384 блока или32768 килобайт (32 мегаба─ 
йта) для всех подключенных  дисковых кана─
лов В СУММЕ.
   А что будет, если попытаться  превысить
этот объём?
   В моем случае,когда я подключал (см.та─
бличку выше) дискиA(RAM),B, C(FDD),D,
E, F,G, H(HDD) общий объём составил30896 
КБ, т.е. почти приблизился к заветной гра─
нице.Подключение ещё одного раздела винче─
стера, объёмом 8 МБ (8192 КБ)  однозначно
превышалo оставшийся незанятым объём выде─
ленной под вектора размещения блоков обла─
сти - заканчивающейся, как уже говорилось,
на  байте  #F7FF. Как оказалось, в системе
нет контроля за переполнением данной обла─
сти.
   В результате,когда такое дополнительное
устройство  подключалось, при  попытке его
выбрать система,добросовестно обнуляя свою
часть  области  перед считыванием каталога
для анализа занятости диска,просто затира─
ла  начинающийся с #F800 системный монитор
низкоуровневых функций,намертво вешая сис─
тему. Вот и всё.

   Остаётся  только  вопрос - почему  была
выделена  такая  маленькая область, учиты─
вая, что нумерация блоков  основана на 16-
битной адресации, т. е. максимальное число
блоков на логическом устройстве может дос─
тигать65536, что только при размере блока
в2 КБ даёт максимальный размер одного ус─
тройства  в128 МБ. И это если не увеличи─
вать размер самих логических блоков!
   У меня  есть  предположение, что в своё
время, при создании системы,никто не мог и
представить таких объемов дисков, и посчи─
тали, что32 мегабайт под все подключенные
диски будет выше крыши.
   Таким образом, перед нами очередное во─
площение  классической "ошибки Билла Гейт─
са", который, рассуждая  про  объёмы  ОЗУ, 
якобы  заявил, что"640 КБ хватит всем". А
вот  не  хватило - ни ОЗУ, ни зарезервиро─
ванного объёма в32 МБ для дисков.

                  * * *

   Я ещё  планирую  в будущем  поиграться-
таки  размером логических блоков, для чего 
придётся написать утилиту-настройщик. 
   А пока  уважаемым читателям - пользова─
телям CP/M на АТМ настоятельная рекоменда─ 
ция тщательно считать общий объём создава─ 
емых  дисков, и при этом самим решать, что 
лучше - меньше разделов винта, но пообъём─ 
нее,или больше,но меньшего размера - лично 
я предпочитаю теперь  второе. Меньшие раз─ 
делы работают шустрее. 
   А если их не хватает,то никто не мешает
создать на винте какое угодно их количест─ 
во, только подключать их к конкретным бук─ 
вам дисков поочерёдно, по мере необходимо─ 
сти. 
   Всем успехов!



Другие статьи номера:

Помощь - об оболочке: произошли некоторые изменения в кнопках.

Предисловие - от авторов: Прошедшие два года были очень насыщенными.

Комьюнити - ZX Spectrum: Как это было в Рязани (1980-е).

Комьюнити - ZX Spectrum: Как это было в Рязани (1991-1993).

Комьюнити - ZX Spectrum: Как это было в Рязани (1993-1995).

Комьюнити - ZX Spectrum: Как это было в Рязани (1995-1997).

Комьюнити - сценеры шутят.

Код - этюды: вызов процедур по списку адресов.

Код - 3D демы на ZX Spectrum: история развития 3д движков.

Код - 3D движок: оптимизация на прообразе 3D Construction Kit.

Код - 3D движок: фрагменты.

Код - Посекторный движок для 3D-шутера от Destr.

Код - 3D скролл на ZX Spectrum (часть 1).

Код - 3D скролл на ZX Spectrum: реализация (часть 2).

Графика - графические редакторы: Старый софт от Alone Coder'а.

Графика - палитра: Палитровые эффекты в играх.

Музыка - биперные движки: Двоичная модуляция (часть 1).

Музыка - биперные движки: Двоичная модуляция (часть 1).

Системки - история операционной системы CP/M для Спектрума (часть 1).

Системки - история операционной системы CP/M для Спектрума: ограничения (часть 2).

Системки - NedoLang: Начало - самый простой процедурный язык (часть 1).

Системки - NedoLang: Путь к самокомпиляции (часть 2).

Системки - NedoLang: Проклятие языка Си (часть 3).

Системки - NedoLang: Памяти под самокомпиляцию не хватало (часть 4).

Системки - NedoLang: ускорение (часть 5).

Системки - NedoLang: Куда плыть дальше (часть 6).

Металлолом - Знакомьтесь, ATM-turbo 3! ATM-turbo 3 (v8.0) - что это такое и с чем его едят.

Металлолом - Из истории Betadisk'а: Дисковый интерфейс от Technology Research был.

Дикий ум - Компрессия: Первые компрессоры графики на Speccy (часть 1).

Дикий ум - Компрессия: Фичи с эвристикой, Потоковая декомпрессия, Сжатие музыки (часть 2).

Игрушки - От редакции: 2017-й год вышел очень богатым на события.

Игрушки - интервью с автором игры Mickey the Basic game (Sergio).

Игрушки - квест "Неожиданное Путешествие" - взгляд изнутри.

Игрушки - Nomad: интервью с автором скролл-шутера Nomad (Hippiman).

Игрушки - Скроллинг в Evo SDK.

Игрушки - Hints & Tips: Mickey, Nomad.

Мыльница - Errata: ошибки в Info Guide #11, ACNews #65.

Письма - отзывы о журнале от: raver, destr, sirx, survivor, Ellvis, Utz и Николая Амосова.

Об авторах - Авторы журнала.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
ZXNet - О секретных файлах для пользователей сети ZXNet.
Въедем - Описание-проходилка игры : Dizzy 5: Spelbound Dizzy.
ACB Stereo - A New Sound Experience

В этот день...   21 июля