PERQ

«99 бутылок пива» на PERQ Pascal

Мои читатели знают, что последние несколько дней я возился с эмулятором PERQ. PERQ — это персональный компьютер, выпускавшийся в начале 1980-х годов, первый коммерчески успешный ПК с графическим интерфейсом. Такой олдскул мил моему сердцу, поэтому я потратил несколько вечеров, чтобы попробовать хоть на базовом уровне разобраться что из себя представляла операционная система тех компьютеров.

Последние пару дней я пытался написать на тамошнем «Паскале» «песню о пиве», но поскольку на моём ноутбуке потребовалась двойная эмуляция, скорость работы встроенного в систему редактора была ниже плинтуса. Писать было очень сложно, а править ошибки — ещё сложнее. Тем не менее, я справился.

79. PERQ Pascal — диалект некогда широко распространённого в учебных учреждениях языка «Паскаль». Компилируемый язык, в какой-то степени можно назвать его конкурентом Си, которому он проиграл вчистую.

Не думаю, что кто-то, кроме редких энтузиастов языка, сейчас выберет «Паскаль» для чего-то нового, но со старыми проектами на нём я иногда сталкиваюсь. Например, в начале этого года видел электронный документооборот, написанный на «Делфи» (это визуальная среда программирования и название диалекта «Турбо Паскаля»).

{$MESSAGE Written by Evgeny Stepanischev, 2024}
PROGRAM BOTTLES_OF_BEER;

const
    MAX_BOTTLES = 99;

Function BotStr(count: integer): string;
begin
    if count = 1 then
        BotStr := ' bottle of beer'
    else
        BotStr := ' bottles of beer';
end;

Procedure SingSong;
var
    i: integer;
    b: string;
begin
    for i := MAX_BOTTLES downto 1 do
    begin
        b := BotStr(i);
        writeln(i:0, b, ' on the wall,');
        writeln(i:0, b, '!');
        writeln('Take one down, pass it around,');
        if i > 1 then
        begin
            b := BotStr(i-1);
            writeln((i - 1):0, b, ' on the wall!')
        end
        else
            writeln('No more bottles of beer on the wall!');
        writeln;
    end;
    
    writeln('No more bottles of beer on the wall,');
    writeln('No more bottles of beer!');
    writeln('Go to the store and buy some more,');
    b := BotStr(MAX_BOTTLES);
    writeln(MAX_BOTTLES:0, b, ' on the wall!');
end;

begin
    SingSong;
end.

Из того, с чем мне пришлось столкнуться, когда я писал программу.

Больше всего ушло времени на ошибку Error 116: Error in type of standard procedure parameter. Речь тут, вроде, идёт о том, что я какой-то процедуре передаю параметры не того типа. Несмотря на то, что в ошибке был указан номер строки, мне всё равно не удавалось понять, что я делаю не так.

Оказалось, что вызов функции BotStr нельзя напрямую поместить во writeln, надо обязательно использовать промежуточную переменную (у меня это b). Учитывая, что скорость работы с эмулятором не позволяет быстро попробовать разные варианты, пришлось изрядно поскрипеть мозгом, чтобы дойти до сути.

Вторая вещь оказалась проще для исправления. В этом диалекте «Паскаля» вывод чисел происходит с отступом. В моём случае выглядит это неаккуратно. К счастью убрать его просто — нужно добавить параметр :0 для каждого числа, выводимого на экран.

В какой-то момент я так устал редактировать код со скоростью улитки, стал использовать обычный редактор своего ноутбука. Потом я просто запускал небольшую программу, написанную на «Пайтоне», которая печатала код за меня прямо внутрь окна с эмулятором PERQ:

import pyautogui, time

FILE_PATH = '99.pas'

time.sleep(5)

with open(FILE_PATH, 'r') as file:
    for line in file:
        for x in line.lstrip():
            pyautogui.typewrite(x)
            time.sleep(.6)

        time.sleep(1)

Вчера ночью всё наконец запустилось и я смог посмотреть как работает моя первая (и наверняка единственная) программа для PERQ.

Кстати, вот ещё одна интересная деталь.

Чтобы получить исполняемый файл, надо исходный код программы сначала скомпилировать командой COMPILE в объектный файл (.SEG), потом скомпоновать командой LINK в исполняемый (.RUN). У обеих команд есть параметр, где указывается имя файла, с которым мы работаем.

Но если мы открывали на редактирование какой-то файл, его имя указывать не надо — операционная система его где-то запоминает и команды COMPILE и LINK знают с каким файлом мы работаем. Очень удобно.

Текст песни «99 бутылок пива на стене» в терминале: от 14 до 1, затем «нет бутылок», «пойди купи ещё», снова 99. Заголовок: sys:User>Guest>, POS F.1 a-boot, 08 Aug 08 00:22:40.
Результат запуска «Песни о пиве» под эмулятором компьютера PERQ

2 комментария

Редактор в PERQ

Поскольку я всё ещё не оставил идею написать «Песню о пиве» на местном Паскале в эмуляторе персонального компьютера PERQ, осваиваю тамошний редактор. С той скоростью эмуляции, которую выдаёт мой ноутбук, редактирование выглядит очень печально, но деваться некуда, — поскольку в процессе написания кода возникли совершенно неожиданные для меня ошибки, пришлось учиться редактировать код.

Двигаюсь с черепашьей скоростью.

Скриншот программы на Паскале «BOTTLES_OF_BEER» от Евгения Степанищева (2024), реализующей песню «99 бутылок пива на стене» с циклом от 99 до 0 и функцией склонения слова «bottle».
Нерабочая программа в процессе редактирования

Редактор очень похож на знаменитый vi. Как и в vi, тут присутствуют два режима — набора текста и команд. Правда большинство команд другие, но некоторые точно такие же. Например, надо нажать Q, чтобы выйти.

Очень удобно, что некоторые команды написаны прямо вверху окна редактирования — это I (вставка), D (удаление), F (поиск), R (замена) и S (замена выделенного).

Как видите, если знать английский, то запомнить их элементарно.

Все команды работы с текстом работают c выделенным участком. Например, чтобы удалить какой-то кусок текста, его надо сначала найти в редакторе командой F (или выделить другим способом, коих масса), а потом нажать D.

Учится всё это очень быстро, мне понравилось. Единственное, к чему пришлось привыкать дольше — ввод параметров для команд завершается клавишей Escape, а не Enter. Это, по всей видимости, сделано для того, чтобы можно было работать с многострочными участками текста.

2 комментария

Тёмная и светлая темы

Теперь, надеюсь, никто не будет говорить, что тёмная и светлая темы — это какая-то новая мода?

Разбирался немного с системой компьютеров PERQ в эмуляторе, который мне удалось запустить на днях. Как я недавно писал, хочу попробовать небольшую программу под неё написать, поэтому решил изучить её чуть поглубже.

И, читая встроенное руководство, обратил внимание, что при логине можно указать цветовую тему, с которой будет работать система — режим чёрного на белом или белого на чёрном.

Выбор происходит командой LOGIN /CursorFunction=5.Тут «5» как раз означает, что надо выбрать «тёмную». И это в 1982-м году, судя по тому что написано в верхнем правом углу!

Скриншоты интерфейса PERQ: слева — меню команд и пример логина, справа — древовидная структура каталогов sys: с папками user, boot, extra и их содержимым
Тёмная и светлая темы в операционной системе компьютера PERQ

9 комментариев

Three Rivers PERQ

Ура! Несмотря на все сложности, мне всё-таки удалось запустить эмулятор PERQ, про который я писал вчера.

Тот момент, когда я увидел наконец рабочий интерфейс этого компьютера на экране своего современного «Макбука», вызвал непередаваемые чувства. Будто я подключился к историческому континууму и снова очутился в том времени, когда компьютерные системы только начинали приобретать современные очертания.

Скриншот рабочего стола Windows с открытым редактором кода Editor 2.6, показывающим программу на Pascal для получения статуса дискеты через IOGetStatus и вывода её параметров.
Эмулятор компьютера Three Rivers PERQ в «Видоузе», запущенном в эмуляторе компьютера с процессором Intel

Что же мы имеем после запуска?

В системе доступно всего несколько команд, список которых можно посмотреть, набрав ?. Среди них есть знакомые ls, cd и понятная edit. На скриншоте как раз видно как я вызвал на редактирование программу на Паскале, которая лежит в домашней папке. Рядом лежит скомпилированный бинарник, но программу можно скомпилировать и самостоятельно.

Экран у системы вертикальный, это было заметно ещё на том снимке рабочей системы, который я публиковал вчера. Судя по спецификации, разрешение экрана — 1024×768 точек. В брошюре записано именно в таком порядке, хотя как будто бы должно быть указано наоборот, — 768×1024.

Интересно, что в системе есть графический курсор и поддерживается указательное устройство. У реальной машины это был графический планшет, похожий на те, которым сейчас пользуются иногда дизайнеры, а в эмуляторе курсор движется за указателем мыши хост-машины.

Ещё из интересного — компьютер комплектовался восьмидюймовым дисководом со скоростью передачи 62,5 килобайт в секунду. Я такие дисководы живьём не видел, но дискеты этого размера в руках держал — папа в моём детстве приносил с работы списанные, я их передал в музей техникума, где тогда учился.

Теперь хочу попробовать набрать в тамошнем Паскале «песню о пиве», если хватит терпения. Но для начала надо понять как работать в редакторе, пока я даже не понял как из него выйти.

13 комментариев

UTM

Люблю посмотреть на программы далёкого прошлого.

Недавно увидел статью, где рассказывалось об эмуляторе, позволяющем запустить операционную систему компьютеров Three Rivers PERQ, — их выпускали в начале восьмидесятых. Я их никогда не видел, даже не слышал про них ничего, поэтому взглянуть особо интересно.

Мужчина в костюме работает за ретро-компьютером PERQ: на мониторе — геометрическая фигура, рядом — графический планшет и телефон.
Внешний вид компьютера из брошюры «PERQ. The powerful, scientific, graphics computer» (декабрь 1981 года)

К сожалению, первая попытка провалилась — эмулятор не заработал на моём «Макбуке» (думаю потому, что у меня ARM). Я не сдался — попробовал виртуализировать «Винду» и запустить его там, но и тут меня ждал неуспех. Теперь я решил скачать эмулятор x86, запустить «Виндоуз» там. Это уже третий подход к снаряду.

Как это сделать я не знал, поэтому пришлось гуглить. Из того, что быстро нашлось, мне понравилась программа UTM (это обёртка над QEMU). Поставилось всё без нерешаемых проблем, единственное, в одном месте инструкцию по установке пришлось скорректировать:

brew install aria2

brew tap minacle/chntpw
brew install cabextract wimlib cdrtools minacle/chntpw/chntpw

sh uup_download_macos.sh

Я поставил chntpw из другого источника, так как версия из оригинальной статьи падала в процессе установки с ошибкой — после компиляции одной из зависимостей она не проходила тесты.

«Виндоуз» внутри UTM еле ворочается, но работает. Попробую попозже вечером запустить эмулятор в эмуляторе и посмотреть на интересующую меня операционку. Надеюсь хоть это сработает.

Интерфейс UTM с настройками виртуальной машины Windows: статус «Запущено», архитектура x86_64, машина Q35, память 8 ГБ, ISO-образы Windows и UTM Guest Tools подключены.

5 комментариев