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

Автор оригинала: 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 за редактирование перевода.
Поделиться публикацией

Комментарии 15

    +17
    Остроумная штука.
      +14
      Прям-таки не знаю, что круче — GO.COM или /bin/true.
        +6
        Учитывая размерчик /bin/true — ответ очевиден

        ls -l /bin/true
        -rwxr-xr-x 1 root root 25120 Дек  8  2011 /bin/true
        
        +1
        CP/M работала и на Yamaha MSX. Именно на CP/M я впверыв увидел Турбо паскаль. Это была версия 2, кажется — еще без синего экрана. Год 1988, наверное
          +3
          Мы, будучи школьниками на занятиях в компьютерном классе, работали на Robotron-1715, подробно изучали его систему SCP (аналог CP/M) и про этот трюк знали. Сами (командой SAVE 0 0.COM) создавали подобную программу, назвав её, как нетрудно догадаться, 0.COM, и тоже активно ею пользовались.
            +4
            … а ваше некапиталистическое воспитание не позволяло вам продавать «ничего» за деньги:)
              0
              Ну это не совсем «ничего», скорее готовый к использованию воркэраунд для обхода ограничения системы.
              Практическая ценность ведь не в LOC измеряется.
                +1
                Просто потребителя не было. Кому её продавать-то? Если каждый и так её одной командой создать мог. Это как пытаться продать эскимосам снег зимой.
              0
              Гениально!
                +1
                Даже настроение поднялось.
                Не перестаю удивляться насколько простые и поистине гениальные решения возникают на пути человеческого ума через «тернии к звездам».
                Коллегу ввел в ступор представив изложенное в статье как задачку, он продолжительно и напряженно думал, спустя некоторое время вломился в кабинет с решением, весь сияя: «В голове не укладывается, это ведь ничто! а ведь работает, ты где это надыбал ?»
                Интересно как автор прореагировал когда ему в голову пришла эта идея?
                +6
                В наших реалиях бесконечно выгодная программа это 1С…
                  0
                  Спасибо! Огромное спасибо!

                  Отличнейший пример для школоты, часто утверждающей, что делить на ноль можно, а в результате получается бесконечность.
                    0
                    Так ведь делить на ноль можно же! Никто не запрещает. Разделить нельзя. :(

                    Оу, да это же некропост, внезапно понял я, но было уже поздно.
                      –1
                      Во-во, и я хотел коментнуть, потом понял древность поста, потом увидел ваш коментарий и таки оставил свои пять копеек ))))
                    +1
                    «Портировал на MS-DOS» — это шикарно!

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое