Недавняя статья на 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 тех времён!
Пользователи (и 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) спокойно загружал её.
Как это могло нам помочь? Рассмотрим такой сценарий:
Так GO.COM, которая состояла из 0 байтов кода и продавалась по 5 фунтов за копию, оказалась самой прибыльной в мире — любая другая программа принесла куда меньше фунтов на байт!
Действительно ли она была бесконечно прибыльна? Ну, если говорить о том, сколько я на ней заработал, то, разумеется, нет — я не бесконечно богат. Однако GO.COM в действительности может служить примером получения «денег из ничего». Например, цену за байт можно посчитать так:
Я припоминаю забавные телефонные звонки и письма насчёт GO.COM (емейлов тогда не было). Некоторые покупатели, которые, очевидно, «разбирались в компьютерах», звонили в Tatung и спрашивали меня, чтобы узнать, как и зачем я скрываю размер программы (DIR ведь выдавал, что в ней 0 байт). Когда я рассказывал им, что программа действительно занимает 0 байт, некоторые начинали возмущаться: «Как вы смеете брать 5 фунтов ни за что?!» Я отвечал, что они неправы: ведь они же получили полезную вещь взамен.
Жаль, что командный интерпретатор CP/M не содержал больше встроенных команд. Полезных дисковых команд было совсем немного:
Позже я портировал GO.COM на ранние версии MS-DOS — до тех пор, пока не появился формат .EXE. И там она тоже прекрасно работала!
От переводчика: спасибо KVie за редактирование перевода.
Поначалу я набирался опыта на 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 за редактирование перевода.