Контоллер дисковода для MSX-2

0. Предисловие

Когда я учился в Ангарском Политехническом Лицее N2 (с 10 по 11 классы), Ямахи (MSX-2) у нас только появились (1990 год). Знакомый музыкант для своих целей приобрел японские MSX-2 с музыкальными возможностями (MIDI, синтезаторы, клавиши). Естественно, на Ямахе только писались, подвергались аранжировке и хранились композиции в формате, подобном формату MIDI на персоналках. Игралась эта музыка, конечно же, на профессиональном инструменте ENSONIQ, предварительно загнаная туда по MIDI шлангу (хотя и в realtime получалось, но не очень :-).

К чему я это рассказал? Случилось так, что я много помогал моему знакомому в области MSX (руссификация японских ямах, программное обеспечение, выдирание музыкальных программ из картриджей и т.п.), и он решил меня отблагодарить за это. Мне предлагался обычный «ученический» YIS-503III, но при условии, что ... я сделаю для себя контроллер дисковода. Теперь становится понятно, почему я сделал этот контроллер - уж очень мне тогда хотелось иметь настоящий компьютер.

1. Как это делалось

Из источников информации у меня была лишь возможность посидеть с отладчиком DBG (огромное спасибо Леониду Баразу за этот программный продукт) на «учительской» YIS-805/R (именно с контроллером дисковода этой модели и совместим мной изготовленный), да распечатка адресов для доступа к регистрам чипа FDC для различных версий контроллера дисковода.

1.1. Первая радость

В то время я, как и многие другие, занимались Спектрумом. Очень хотелось его научить читать MS-DOS'овые дискеты - по-этому пришлось детально разобраться в работе БИС контроллера дисковода (1818ВГ93), а так же попутно доработать Спектрум таким образом, чтобы его порты были доступны не только при включенном теневом ПЗУ дисковой подсистемы.

Можно представить себе мою радость, когда копаясь в потрохах ямаховского DiskROM, я обнаружил подозрительное сходство в командах, посылаемых контроллеру, с командами вышеупомянутой 1818ВГ93!

1.2. Свобода выбора

Так как ту часть схемы, которая между шиной компьютера и БИС контроллера я себе хоть как-то представлял (там цифра - все просто), то с второй частью (от БИС контроллера до дисковода) было сложнее. Просидев некоторое количество времени в библиотеке и найдя несколько вариантов решения оконечной части, я не смог выбрать не одну из них. Особенно меня смущал узел прекомпенсации - очень уж разные схемные решения предлагались. По-этому, немного по-размыслив, я решил взять за основу работающий контроллер от ZX-Spectrum и переделать его под ямаховский. Первый, который мне попался, был довольно компактен - его оконечный узел был собран на матрице 556РТ4. Хотя за компактность мне пришлось рассплачиваться - этот зверь греется и потребляет, по-видимому, столько же, сколько все остальные элементы.

1.3. Исходные данные

К этому времени мне уже было известно, что адресное пространство ПЗУ контроллера дисковода (т.н. DiskROM) расположено на 1-й странице (адреса 4000h-7FFFh). Так же, в результате исследований с отладчиком, было выясненно, что под регистры БИС контроллера отводятся адреса 7F80h-7F83h, а под регистр контроллера дисковода статус/управление - 7F84h. В окне дампа отладчика очень хорошо просматривается, что из-за упрощенной дешифрации адресов, эти регистры дублируются через восемь адресов вплоть до адреса 7FBFh (регистр статуса/управления дублируется подряд 4 раза после регистров БИС).

i

Уточню один момент: Обычно, общение процессора с неким внешним устройством производят с помощью т.н. портов ввода/вывода. Так как в Ямаху можно вставить, например, два одинаковых флопи-контроллера, то адреса портов пересекутся и дисководы не будут работать (если и будут - то синхронно :-). По-этому, разработчикам рекомендовано (в общем случае) порты отображать в адресное пространство ПЗУ с программным обеспечением для аппаратной части устройства.

Регистры БИС контроллера дисковода подробно описывать не буду, так как это не поможет построить контроллер дисковода. Скажу лишь, что БИС имеет четыре регистра: регистр команд/состояния, регистр номера дорожки, регистр номера сектора и регистр данных. Более подробно можно почитать, например, в журнале «Микропроцессорные средства и системы» N3 за 1986 год.

На регистре статуса/управления контроллера дисковода остановлюсь подробнее, так как это имеет непосредственное отношение к изготовлению контроллера. Если рассматривать по-битно, то это выглядит так:

7 6 5 4 3 2 1 0
· · x x · · · ·
| |     | | | |
| |     | | | +---<- Drive 0
| |     | | +-----<- Drive 1
| |     | +-------<- Side Select
| |     +---------<- Motor
| +--------------->- IRQ
+----------------->- /DRQ
		
Drive 0
Drive 1
Сигнал выбора первого/второго накопителя (или обоих сразу - что можно было иногда наблюдать при зависании YIS-805/R :-).
Только запись.
Side Select Сигнал выбора стороны накопителя.
Только запись.
Motor Сигнал запуска мотора дисковода:
=0 - мотор выключен
=1 - мотор включен.
Только запись.
IRQ
/DRQ
Сюда заведены соответствующие сигналы с БИС контроллера - сигнал прерывания текущей операции и сигнал запроса данных. Обращаю внимание, что сигнал DRQ инвертирован.
Только чтение.

Подведем маленький итог. Со стороны процессора контроллер дисковода должен выглядеть как ПЗУ с адреса 4000h-7FFFh в соответствующем слоте. Причем, адреса с 7F80h-7FBF используются как область обмена данными с контроллером дисковода:

7F80h Регистр команд/статуса БИС
7F81h Регистр дорожки БИС
7F82h Регистр сектора БИС
7F83h Регистр данных БИС
7F84h Регистр статуса/управления контроллера

1.4. Подводные камни

После изготовления контроллера дисковода, основываясь на вышесказанном, выяснились две детали из-за которых он все еще был не работоспособен.

  1. Выше я обратил внимание на то, что сигнал DRQ инвертирован. Это я выяснил уже только после изготовления контроллера. После этого контроллер заработал, но частично. В BASIC'е все работает, но при попытки загрузить MSX-DOS с дискеты - читается только BOOT-сектор, а затем вываливается BASIC. При подробном исследовании процесса загрузки под DBG, выяснилась вторая деталь:
  2. Регистры контроллера 7F8xh дополнительно маппируются в адреса BF8xh. Объсняется довольно просто - это сделано для того, чтобы была возможность читать/записывать данные в/из адресов диапазона 4000h-7FFFh (на самом деле эти регистры используются в операциях ввода/вывода для диапазона адресов 0000h-7FFFh). То, что в BASIC'е все работало, объясняется тем, что в этом режиме ОЗУ находится только в диапазоне адресов 8000h-0FFFFh. А то, что читается только BOOT - тем, что BOOT-сектор читается куда-то в буфер (на самом деле есть переменная, хранящая адрес этого буфера) в системной области (адреса 0Fxxxh).

После исправления этих огрех, контроллер в своей функциональности ничем не отличался от исходного.

2. Как это сделать

2.1. Сама схема

Схема оптимизирована так, чтобы все, по-возможности, логические элементы микросхем были использованы.



[качественная картинка (2055 x 3190, 75Kb)]

К сожалению, у меня нет времени для завершения данного описания в полном объеме. По-этому, привожу часть схемы между системной шиной и ВГ93 в таком виде и без описания, кому нужно - разберется.

3. Напоследок

3.1. Некоторые сведения

3.1. От автора

Если кто-нибудь хочет дополнить данную описаловку или дать ценные рекомендации - присылайте все в более-менее готовом виде на maw@null.ru или на 2:6070/148 (2:5070/948).


Alexandr Murin
16/01/2000 [018Permission denied]