Pull to refresh

Бесконечно выгодная программа

Reading time 4 min
Views 31K
Original author: Peet Morris
Недавняя статья на Slashdot о программировании игр на ассемблере для Атари (Donkey Kong и я) напомнила об ассемблерных приложениях, которые я писал по молодости, и о компьютерах, которые у нас тогда были.

Поначалу я набирался опыта на DEC PDP-8, но самый кайф начался, когда появилась CP/M. CP/M изначально была «операционной системой для бизнеса», но ещё это была система, которую можно было позволить себе иметь дома, — серьёзная вещь для молодого подающего надежды гика.

Тогда я работал в компании Tatung. Они собирали компьютеры, и поэтому мне довелось поразвлечься с весьма дорогостоящей штукой: два пятидюймовых дисковода и всё такое! В основном я работал над отладкой ERSO BIOS. Случалось посидеть и за компьютером Tatung Einstein, который использовал совместимую, но более навороченную версию CP/M под названием Xtal DOS.

Некоторое время Einstein действительно была замечательной машинкой (пока компьютеры с MS-DOS не взяли своё). На ней запускались всякие программы CP/M типа VisiCalc, WordStar и др.

А ещё там были встроены звук и графика (цвета и спрайты!), так что можно было и игрушками побаловаться. И всё за 499 фунтов (напоминаю, это был 1984-й год). По тогдашним меркам немало!

Утилиты Пита

Я писал статьи в журналы Einstein для Tatung'а (они до сих пор где-то валяются). И ещё писал коммерческие программы. Наиболее успешным стал пакет программ, который я весьма творчески назвал «Утилитами Пита» (1986 год).

Утилиты были написаны на ассемблере Z80 (тогда я ещё не знал про Си) и включали undelete, хексовый редактор, программу для навешивания команд на функциональные клавиши (резидент!), автозагрузчик программ, контроллер принтера, эмулятор пишущей машинки (да, я на самом деле использовал слово
'typewriter') и кучу других штук. Иногда я задумываюсь о том, что если бы я портировал это всё под MS-DOS, то мог бы стать Питером Нортоном (полагаю, он заработал на Norton's Utilities кучу денег, а я — нет)! Недавно нашёл контракт на Утилиты Пита: за одну копию я получал целый фунт.

Для полноты картины стоит рассказать, как были написаны Утилиты Пита. Это довольно интересно и к тому же передаёт дух того времени.

Я писал их на коммерческой машине с CP/M — ещё одном детище Tatung'а (TPC-2000 — самый правый компьютер на картинке).

Молодой Пит!

Слева на картинке Tatung Einstein'ы.

TPC-2000 был быстрее, чем Einstein, и имел больше памяти, поэтому мой макро-ассемблер работал на нём гораздо эффективнее. Кроме того, там был «чистый» CP/M, поэтому я мог быть уверен, что при разработке не воспользуюсь какой-либо фичей, специфичной для Einstein. Собрав программу на TPC-2000, я портировал её на Einstein используя специальную программу Kermit. Там я мог её как следует протестировать и отладить! Прямо-таки полный цикл code/build/test тех времён!

GO.COM

Пользователи (и TPC-2000 и Einstein) часто жаловались, что им приходится закрывать текущее приложение (VisiCalc, WordStar и т. д.), чтобы выполнить простую дисковую операцию, например, найти файл на одной из n дискет. Это действительно раздражало. Представьте, что у вас запущен популярный текстовый процессор WordStar и вы хотите отредактировать существующий файл. Предположим, вы не знаете, на какой из десятка дискет он находится, то есть, чтобы найти его вам требуется выполнить встроенную команду CP/M — DIR. Но для этого сперва нужно выйти из WordStar. Разумеется, когда вы найдёте файл, вам придётся снова запустить WordStar с дискеты, что само по себе ужасно, учитывая черепашью скорость дисководов («чанк-чанк-чанк», кто помнит — поймёт)!

Чтобы решить эту проблему, я придумал GO.COM — возможно, самую успешную и бесконечно выгодную программу из когда-либо написанных.

Когда программа для CP/M загружается в память, она всегда располагается начиная с одного и того же адреса, 0100h — начало так называемой «Области для временных программ» (‘Transient Program Area’, TPA). Собственные программы CP/M, такие как DIR, загружаются в другом месте.

Я понял, что раз WordStar всё ещё в памяти (хотя пользователь вышел из него, область TPA осталась неизменной), было бы весьма полезно как-нибудь перезапустить его прямо из TPA вместо того, чтобы перезагружать с дискеты. В самом деле, зачем загружать то, что уже в памяти? Для перезапуска WordStar после выполнения DIR или чего-то ещё надо лишь выполнить тот код, который расположен с адреса 0100h. Но как это осуществить? Нельзя же написать обычную программу, содержащую, скажем, инструкцию «перейти к адресу 0100h», потому что эта программа будет загружена в TPA с адреса 0100h и затрёт то, что там было.

Тут и появилась GO.COM.

GO.COM не содержала ни единой инструкции, она была абсолютно пуста. Однако, хоть и пустая, с точки зрения CP/M это всё же была полноценная программа, поэтому загрузчик CP/M (часть системы, которая считывает программу с диска и помещает в TPA) спокойно загружал её.

Как это могло нам помочь? Рассмотрим такой сценарий:

  • Пользователь выходит из WordStar.
  • Пользователь запускает DIR и находит свой документ.
  • Пользователь запускает GO.COM.
  • Загрузчик загружает с диска 0 байт, помещая их в TPA по адресу 0100h, и
    затем переходит на 0100h, чтобы запустить только что загруженную
    программу (GO.COM).
  • В результате он мгновенно перезапускает то, что было в TPA в тот момент, когда пользователь
    последний раз выходил в «DOS» (в нашем случае — WordStar)!

Так GO.COM, которая состояла из 0 байтов кода и продавалась по 5 фунтов за копию, оказалась самой прибыльной в мире — любая другая программа принесла куда меньше фунтов на байт!

Действительно ли она была бесконечно прибыльна? Ну, если говорить о том, сколько я на ней заработал, то, разумеется, нет — я не бесконечно богат. Однако GO.COM в действительности может служить примером получения «денег из ничего». Например, цену за байт можно посчитать так:



Я припоминаю забавные телефонные звонки и письма насчёт GO.COM (емейлов тогда не было). Некоторые покупатели, которые, очевидно, «разбирались в компьютерах», звонили в Tatung и спрашивали меня, чтобы узнать, как и зачем я скрываю размер программы (DIR ведь выдавал, что в ней 0 байт). Когда я рассказывал им, что программа действительно занимает 0 байт, некоторые начинали возмущаться: «Как вы смеете брать 5 фунтов ни за что?!» Я отвечал, что они неправы: ведь они же получили полезную вещь взамен.

Жаль, что командный интерпретатор CP/M не содержал больше встроенных команд. Полезных дисковых команд было совсем немного:

  • ERA удаляет указанный файл.
  • DIR выводит список файлов в каталоге.
  • REN переименовывает указанный файл.
  • SAVE сохраняет содержимое памяти в файл.
  • TYPE выводит содержимое файла.

Позже я портировал GO.COM на ранние версии MS-DOS — до тех пор, пока не появился формат .EXE. И там она тоже прекрасно работала!

От переводчика: спасибо KVie за редактирование перевода.
Tags:
Hubs:
+103
Comments 18
Comments Comments 18

Articles