[Перевод] Загрузка программы через кассетный интерфейс 5150CAXX

tdh07qaah19wuwc36aku2jjsnhy.png
5150CAXX, работающий под эмулированным 64K IBM PC rev. А. Параметры командной строки достаточно хорошо говорят сами за себя.

Самый первый персональный компьютер IBM, IBM 5150 — который был бизнес-ориентированной машиной, поставлялся со встроенным портом для кассеты. Жаль, что его можно было использовать только через кассету BASIC, содержащуюся в ПЗУ… Или напротив, слава Богу? Да, от этого интерфейса вскоре отказались по понятным причинам. Но давайте перенесёмся на 40 лет назад: возродим эту легендарную машину, и почему бы нам не попробовать кассетный интерфейс… в DOS?


Поскольку DOS сама по себе не имела какой-либо поддержки, чтобы работать с таким интерфейсом, как вы видите, эта утилита позволяет получить доступ к кассетному порту IBM непосредственно вместе с DOS, чтобы читать и записывать необработанные данные: будь то оригинальные приложения IBM BASIC или что-то ещё, используя кассетный порт в IBM PC, прямо рядом с разъёмом клавиатуры. Программа также может работать вместе с печально известным IBM PCjr… то есть если вы сможете в чужом мусоре найти (или сделать сами) кабель для их патентованного разъема с маркировкой «C». И хотя ROM BASIC был в преемниках IBM PC, порта для кассеты у PC/XT и PC/AT не было. Таким образом, программа не сможет загрузиться на чём-нибудь новее, чем IBM PC или PCjr, если на то пошло.
aysrl9zxjp-mue5ltql09z8j86e.png
Схема интерфейса кассетного порта

Так как бы вы использовали эту штуковину? Во-первых, как следует из названия, вам нужен оригинальный IBM 5150 PC или PCjr с DOS и кассетной декой. Или катушечный магнитофон, которым воспользовался я. Или вообще любое звуковое устройство, способное воспроизводить и записывать… например, современный компьютер или даже смартфон.

Ещё вам нужен подходящий кабель. В случае 5150 проблема легко решается в соответствии с DIN-распиновкой и приведённой выше схемой, аналогично дата-кабелю Tandy TRS-80. Затем вам нужно передать сигналы на звуковое устройство, либо моно, либо на левый канал. Обратите внимание, что, если ваше устройство имеет не линейный вход, а микрофонный, вам необходимо соответствующим образом установить перемычку P4 на материнской плате 5150. Или, в качестве альтернативы, используйте резистор 1k последовательно с микрофонным входом вашего рекордера (это то, что перемычка P4 делает внутренне в любом случае). Невыполнение этого требования может привести к повреждению микрофонного входа.

Контакты 1 и 3 DIN-разъёма на 5150 являются нормально разомкнутыми контактами реле. Перед любой операцией ввода-вывода это реле приводит в действие свои контакты, чтобы включить кассетный мотор. Если вы не используете эти контакты, либо прислушайтесь к щелчку реле и приведите своё устройство в действие соответствующим образом, либо используйте аргумент командной строки /A, который запрашивает и ждёт, когда вы нажмёте PLAY (или PLAY+RECORD).

Приложение можно скачать здесь. Или вы можете посмотреть исходный код в моём репозитории GitHub, однако чтобы его скомпилировать вам понадобится компилятор Turbo C; в идеале программа собирается пакетным скриптом BUILD.BAT.

Обратите внимание, что максимальный размер последовательных данных, которые могут быть загружены с ленты, всегда составляет 64 КБ. Это ограничение как для адресации в реальном режиме, так и для подпрограмм ленточного ввода-вывода BIOS. Таким образом, IBM Cassette BASIC, который находится в ПЗУ, не позволит вам писать сценарии BASIC размером более 64 килобайт. Также обратите внимание, что, если у вас недостаточно памяти (ранние материнские платы 16–64 КБ), это значение может оказаться ещё меньше.


5150CAXX на IBM 5150 с катушечным магнитофоном Tesla

Теперь легко понять параметры командной строки. Вам нужно найти ленту в нужном месте, а затем использовать команды /R, /D или /X для чтения с ленты, чтобы сохранить её в файл, вывести её на экран в виде сырого ASCII или считывать данные в виде машинного кода соответственно. Всё, что считывается с ленты, никоим образом не «разбирается» для сохранения интерфейса, поэтому нет специальной команды «LOAD» для поиска пользовательского приложения/данных/чего угодно.

Несмотря на то что указание количества байтов для чтения необязательно, рекомендуется записать его и всегда указывать после команды чтения. В противном случае 5150CAXX не знает, насколько большой поток данных будет считан с ленты, и поэтому он будет продолжать чтение до тех пор, пока не достигнет «сигнала плохой ленты» или ошибки CRC, останавливая чтение.

В этом случае размер выходного файла может быть немного больше, так как BIOS ROM может добавлять нули или повреждённые данные после окончания фактического потока данных. Это происходит потому, что чтение продолжается после валидного потока, и эта теперь недопустимая операция чтения в конечном счёте завершается неудачей на блоке CRC/синхронизации, останавливая ленту. В этом случае вы можете либо вырезать лишние байты с помощью HEX-редактора, либо игнорировать их вообще. Смотрите рисунок ниже.

Также обратите внимание, что, если вы используете настоящий магнитофон и получаете ошибки CRC или «сигналы плохой ленты», причём только часть данных записана (или прочитана) правильно, убедитесь, что как модуляция записи, так и уровни громкости воспроизведения достаточно высокие и не искажены, нет слышимых выпадений ленты, головки нетронуты, правильно установлено смещение записи и нет абсолютно никакого слышимого шума или вибраций, вызванных механикой или растяжением ленты. Чтобы исключить эти факторы для целей тестирования, используйте твердотельный источник звука, например другой компьютер или смартфон и т. д.

lwkekhlig8vfb-00p1tjg7jnove.png
Байты, которые могут появиться в конце потока данных, если размер в байтах не указан; Тем не менее содержимое файлов идентично. Левое окно: исходный файл, правое окно: файл, прочитанный с ленты.

Вернёмся к параметрам командной строки: команда /W используется для загрузки заданного файла с диска в память, а затем записи его на ленту в текущей позиции ленты.
Используйте /A, чтобы заставить приложение ждать вашего ответа, если вы не используете релейный ленточный привод мотора, для всех команд.
Параметр /X хорош на своём месте, поскольку он интерпретирует любые считанные данные напрямую как машинный код x86. Любые неверные инструкции, прочитанные с ленты, приведут к сбою системы, что потребует перезагрузки. Обратите внимание, что вы не можете считывать приложения BASIC таким образом: их нужно сначала сохранить в файл, а затем интерпретировать либо с помощью IBM Disk Basic, либо с помощью Microsoft GW-BASIC, поскольку они не являются валидными инструкциями x86, а представляют собой специальный формат: «токенизированный BASIC».

Пример кода «Hello world», который можно записать на ленту и считать с помощью параметра /X, можно найти здесь. Этот код должен быть «осознанным» и получать указатель инструкции для адресации, поскольку он может быть загружен практически в любом месте ОЗУ, как компьютерный вирус старой школы. Кроме того, код должен заканчиваться опкодом FAR RET (RETF), чтобы передать управление обратно операционной системе. Посмотрите приведённый выше пример, чтобы узнать подробности.

Чтение IBM Advanced Diagnostics с ленты с помощью 5150CAXX


Для IBM 5150 на кассетной ленте было выпущено не так много программного обеспечения… кроме нескольких заметных исключений, таких как IBM PC Diagnostics, а затем и IBM Advanced Diagnostics. Поскольку единственный способ запустить любое приложение для 5150, которое хранится на ленте, — это IBM ROM BASIC (ну, во всяком случае, пока не был разработан 5150CAXX), этот пакет диагностики можно использовать для быстрой проверки ПК, не требующий наличия в нём какого-либо диска или операционной системы.

Кассетная запись Advanced Diagnostics по существу состоит из трёх частей, все они могут быть сброшены с 5150CAXX в 3 файла, используя команду /R три раза. Первые две части обязательно создаются любым приложением, написанным на IBM Cassette BASIC, а затем сохраняются с помощью команды SAVE, а третья часть — немного особенная:

Первый дамп файла — это по существу 256-байтовый заголовок последующего потока данных… Он содержит восьмибайтовый идентификатор приложения (в данном случае «ldcass», имя, которое вы обычно передаёте команде BASIC LOAD), затем тип потока данных (маркированный BASIC) и место памяти, куда его следует загрузить.

Второй дамп файла — это небольшая заглушка BASIC, которая показывает информацию о загружаемой диагностической ленте. Эту программу BASIC нельзя запустить напрямую — вам нужно открыть её в GW-BASIC или IBM BASIC. Она заканчивается специальной инструкцией CALL, которая выполняет третью часть.

Третий дамп файла — это машинный код x86, который и является диагностическим приложением. Его можно загрузить напрямую с помощью параметра /X либо сохранить в файл, а затем с помощью небольшого «вспомогательного» двоичного файла DOS превратить в приложение, запускаемое из DOS.

Используя FASM и BUILD.BAT и переименовав третий дамп файла в CASSETTE.BIN, в результате получим DOS-совместимое приложение Advanced Diagnostics, которое можно скачать отсюда. Обратите внимание, что процедура выхода из этого кода — это перезагрузка, поскольку приложение не знает, что оно работает в DOS.

Работает также с кассетами — вам не нужен катушечный магнитофон.
image

image

Другие профессии и курсы
ПРОФЕССИИ

КУРСЫ

© Habrahabr.ru