- PVSM.RU - https://www.pvsm.ru -
Недавняя статья на Slashdot о программировании игр [1] на ассемблере для Атари (Donkey Kong и я [2]) напомнила об ассемблерных приложениях, которые я писал по молодости, и о компьютерах, которые у нас тогда были.
Поначалу я набирался опыта на DEC PDP-8 [3], но самый кайф начался, когда появилась CP/M [4]. CP/M изначально была «операционной системой для бизнеса», но ещё это была система, которую можно было позволить себе иметь дома, — серьёзная вещь для молодого подающего надежды гика.
Тогда я работал в компании Tatung [5]. Они собирали компьютеры, и поэтому мне довелось поразвлечься с весьма дорогостоящей штукой: два пятидюймовых дисковода и всё такое! В основном я работал над отладкой ERSO BIOS. Случалось посидеть и за компьютером Tatung Einstein [6], который использовал совместимую, но более навороченную версию CP/M под названием Xtal DOS.

Некоторое время Einstein действительно была замечательной машинкой (пока компьютеры с MS-DOS не взяли своё). На ней запускались всякие программы CP/M типа VisiCalc, WordStar и др.
А ещё там были встроены звук и графика (цвета и спрайты!), так что можно было и игрушками побаловаться. И всё за 499 фунтов (напоминаю, это был 1984-й год). По тогдашним меркам немало!
Я писал статьи в журналы Einstein для Tatung'а (они до сих пор где-то валяются). И ещё писал коммерческие программы. Наиболее успешным стал пакет программ, который я весьма творчески назвал «Утилитами Пита» (1986 год).
Утилиты были написаны на ассемблере Z80 (тогда я ещё не знал про Си) и включали undelete, хексовый редактор, программу для навешивания команд на функциональные клавиши (резидент!), автозагрузчик программ, контроллер принтера, эмулятор пишущей машинки (да, я на самом деле использовал слово
'typewriter') и кучу других штук. Иногда я задумываюсь о том, что если бы я портировал это всё под MS-DOS, то мог бы стать Питером Нортоном [7] (полагаю, он заработал на Norton's Utilities [8] кучу денег, а я — нет)! Недавно нашёл контракт на Утилиты Пита: за одну копию я получал целый фунт.
Для полноты картины стоит рассказать, как были написаны Утилиты Пита. Это довольно интересно и к тому же передаёт дух того времени.
Я писал их на коммерческой машине с CP/M — ещё одном детище Tatung'а (TPC-2000 — самый правый компьютер на картинке).

Слева на картинке Tatung Einstein'ы.
TPC-2000 был быстрее, чем Einstein, и имел больше памяти, поэтому мой макро-ассемблер работал на нём гораздо эффективнее. Кроме того, там был «чистый» CP/M, поэтому я мог быть уверен, что при разработке не воспользуюсь какой-либо фичей, специфичной для Einstein. Собрав программу на TPC-2000, я портировал её на Einstein используя специальную программу Kermit. Там я мог её как следует протестировать и отладить! Прямо-таки полный цикл code/build/test тех времён!
Пользователи (и TPC-2000 и Einstein) часто жаловались, что им приходится закрывать текущее приложение (VisiCalc, WordStar и т. д.), чтобы выполнить простую дисковую операцию, например, найти файл на одной из n дискет. Это действительно раздражало. Представьте, что у вас запущен популярный текстовый процессор WordStar [9] и вы хотите отредактировать существующий файл. Предположим, вы не знаете, на какой из десятка дискет он находится, то есть, чтобы найти его вам требуется выполнить встроенную команду 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) спокойно загружал её.
Как это могло нам помочь? Рассмотрим такой сценарий:
Так GO.COM, которая состояла из 0 байтов кода и продавалась по 5 фунтов за копию, оказалась самой прибыльной в мире — любая другая программа принесла куда меньше фунтов на байт!
Действительно ли она была бесконечно прибыльна? Ну, если говорить о том, сколько я на ней заработал, то, разумеется, нет — я не бесконечно богат. Однако GO.COM в действительности может служить примером получения «денег из ничего». Например, цену за байт можно посчитать так:

Я припоминаю забавные телефонные звонки и письма насчёт GO.COM (емейлов тогда не было). Некоторые покупатели, которые, очевидно, «разбирались в компьютерах», звонили в Tatung и спрашивали меня, чтобы узнать, как и зачем я скрываю размер программы (DIR ведь выдавал, что в ней 0 байт). Когда я рассказывал им, что программа действительно занимает 0 байт, некоторые начинали возмущаться: «Как вы смеете брать 5 фунтов ни за что?!» Я отвечал, что они неправы: ведь они же получили полезную вещь взамен.
Жаль, что командный интерпретатор CP/M не содержал больше встроенных команд. Полезных дисковых команд было совсем немного:
Позже я портировал GO.COM на ранние версии MS-DOS — до тех пор, пока не появился формат .EXE. И там она тоже прекрасно работала!
От переводчика: спасибо KVie [10] за редактирование перевода.
Автор: lany
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/10752
Ссылки в тексте:
[1] программировании игр: http://games.slashdot.org/article.pl?sid=08/03/08/194249
[2] Donkey Kong и я: http://www.dadhacker.com/blog/?p=987
[3] DEC PDP-8: http://en.wikipedia.org/wiki/PDP-8
[4] CP/M: http://en.wikipedia.org/wiki/CP/M
[5] Tatung: http://en.wikipedia.org/wiki/Tatung_Company
[6] Tatung Einstein: http://en.wikipedia.org/wiki/Tatung_Einstein
[7] Питером Нортоном: http://en.wikipedia.org/wiki/Peter_Norton
[8] Norton's Utilities: http://en.wikipedia.org/wiki/Norton_Utilities
[9] WordStar: http://en.wikipedia.org/wiki/WordStar
[10] KVie: http://habrahabr.ru/users/kvie/
Нажмите здесь для печати.