← На главную

Возняк превратил тупой Disk II в 140 КБ хитростью на 256 байт

29.06.2026 18:23 · hackernews

Контроллер Disk II от Apple — гениальный образец экономии на железе, построенный всего на восьми микросхемах. В отличие от всех остальных дисковых контроллеров для Apple II (Apple 3.5, Liron, SCSI, IDE), которые берут на себя всю низкоуровневую работу и дают софту простой API вроде «прочитай блок 31», Disk II был «тупым как пробка». Он просто умел читать и писать биты с частотой один бит каждые четыре микросекунды — всё остальное делал процессор.

Стив Возняк и Рэнди Уиггинтон спроектировали его за пару недель на рождественских каникулах 1977 года. Они пошли к Shugart и попросили максимально ободранную версию привода SA400 — без всякой управляющей электроники, только мотор и шаговый двигатель для головки. Так родился софтовый подход, который Возняк называет «bit-banging».

Главная проблема — байтовая синхронизация. Данные с диска идут непрерывным потоком без стартовых битов. Решение: у каждого записанного байта старший бит (MSB) обязательно единица. Схема сдвигает биты до тех пор, пока в левой позиции не появится единица — значит, байт готов. Но чтобы синхронизироваться с начала, перед каждым сектором пишут 50-битный синхропаттерн — пять повторений последовательности 1111111100.

Вторая проблема — кодирование байтов. Из-за ограничений дорожки на диск можно писать лишь 66 из 256 возможных значений (не может быть больше двух нулей подряд, и MSB обязан быть единицей). Поэтому используется GCR-кодирование 6-and-2: три логических байта упаковываются в четыре дисковых. В первой версии контроллера (DOS 3.1/3.2) применяли менее эффективный 5-and-3 — всего 13 секторов на дорожку и 114 КБ на диск. После того как Возняк исправил тайминги битов (просто перепрошив ROM в state machine), стало возможно читать два нуля подряд, и с DOS 3.3 перешли на 6-and-2: 16 секторов и 140 КБ. Никаких изменений в железе.

Секционирование тоже софтовое. Никаких индексных отверстий на диске — компьютер просто ищет последовательность D5 AA 96, которая отмечает начало сектора. Дальше читает заголовок с номером сектора и либо берёт данные, либо ждёт следующую тройку. Это чистая условность — игры вроде Prince of Persia использовали кастомную схему RWTS18 с шестью секторами по 768 байт.

С дорожками та же история. Шаговый двигатель управляется напрямую софтом — четыре электромагнита включаются и выключаются в нужной последовательности. Обычно два полушага равны одной дорожке, но копи-защита постоянно этим играла: могла писать на полушагах, использовать нестандартные расстояния или даже делить дорожку пополам по окружности — данные на полдорожки на track 2, а вторые полдорожки на track 2.5.

Загрузочный код в 256-байтном ROM — чудо инженерии. Он должен включить моторы, прижать головку к упору (тот самый rat-a-tat звук при загрузке), найти track 0, распознать D5 AA 96, на лету построить в RAM таблицу GCR-декодирования из 256 записей (всего 30 байтами кода!), распаковать сектор и прыгнуть на загруженный код. Всё это укладывается в 100 строк 6502 ассемблера с пятью байтами запаса. Нет ни проверки контрольной суммы, ни обработки ошибок — если диска нет, компьютер просто зависает.

Читать оригинал →