Hello, PDP-11! part2

 

После публикации предыдущего поста я вернулся к вопросу эмуляции графики. Если бы я вел журнал действий "дата-действие-результат/облом", то выросла бы депрессивная и скучная статья, поэтому будет лучше, если опишу пытки как есть. Игру landing можно найти на Github и запустить в эмуляторе Simh, хотя можно запустить сразу, почитав документацию. Я запустил файлы, поиграл, разбил пепелац и вернулся к кодингу. Основная беда - ассемблер MACRO11, который выблевает только файл .obj, над которым уже можно проделать нужные действия, используя LINK11, который толком не портирован под венду. Зато есть скрипт obj2bin.pl, который я не смог запустить на разных версиях Perl.

Первая задача - компиляция программы, выдающей Hello, world!, принесла кучу обломов. Я стал искать разные варианты и получил утилиту obj2bin. Использовал для simh предложенный файл test.ini:

LOAD hello.bin

На этой команде simh выдал ошибку загрузки.Стал разбираться, в чем причина: нужен файл формата .lda. Нашел и скомпилировал на Сигавне утилиты конверсии и получил массу ошибок - либо ошибка чтения либо неверная контрольная сумма при загрузке. Толком не разобравшись, я написал свою утилиту, которая формирует нужные поля правильно и после правок кода подсчета контрольной суммы, получил результат:

Осталось разобраться, почему файл не запускается командой run. "Я подумаю об этом завтра"(с).

Поиски информации на Яндексе привели к диалогу с Алиса AI, которая была настолько мила, что привела пример печати фразы с использованием VT-11.И эти примеры не заработали. Я взял фрагмент кода из lunar.mac, скомпилировал, запустил и увидел фрагмент на экране. Остатки дня были потрачены на попытки запустить программу. Вечером стал разбираться с форматом .lda и нашел причину: я взял код программы, которая записывает  финальный блок формата, в котором хранится адрес запуска программы и считает неверную контрольную сумму.

Утром, после прогулки, в голову пришла другая идея: попробовать расположить Display List по адресу 2000o. Написал код и стал изучать файл DEC-11-HVTGA-A-D VT11 Graphic Display Processor.pdf, нашел пример программы, вбил слова и увидел на экране прямоугольник. Остался текст, который никак не появлялся. Снова обратился к Алисе и получил ответ и другой пример программы:

Я решил облегчить жизнь и задал вопрос создания программы, которая бы кодировала или декодировала текст в слова или обратно. Программа сработала, как нужно.

Войдя во вкус я озадачил Алису еще одним вопросом : нужна утилита, которая бы декодировала слова из Display List для VT-11 и расшифровывала значения по битам. Вот так занудно это выглядит:

100000₈ = 1 000 000 000 000 000₂ = 0x8000 — это инструкция Set Graphic Mode, устанавливающая символьный режим (Character Mode) без изменения параметров отображения.

  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0

  ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐

  │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │

  └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

   └─┬─┘ └─────┬─────┘ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ └───┬───┘

     │     Mode(13:11)   │     │     │     │     │     │    LINE(1:0)

     │   000 = Character │     │     │     │     │     │

   Inst               I=0  INT=000 LPEN=0 LP=0 BLKEN=0 BLK=0 LINEN=0 LINE=00

  (15=1)           (no load)        (no load)  (no load)  (no load)

Расшифровка полей

Бит(ы) Значение Поле Расшифровка

15 1 Instruction Это команда (не данные)

14 0 Set Graphic Mode Установка графического режима

13:11 000 Data Mode Character Mode — символьный режим

10 0 I (intensity enable) Яркость не загружать (сохранить прежнюю)

9:7 000 INT (не загружается, т.к. бит 10 = 0)

6 0 LPEN Флаг светового пера не загружать

5 0 LP (не загружается, т.к. бит 6 = 0)

4 0 BLKEN Мигание не загружать

3 0 BLK (не загружается, т.к. бит 4 = 0)

2 0 LINEN Тип линии не загружать

1:0 00 LINE (не загружается, т.к. бит 2 = 0)

Сводка режимов данных (биты 13:11)

Код Режим

000 Character (символьный)

001 Short Vector (короткий вектор)

010 Long Vector (длинный вектор)

011 Point (точка)

100 Relative Point (относительная точка)

101 Graphplot X/Y (графопостроение)

110 Spare (резерв)

Итог

SET CHARACTER MODE — переключить VT-11 в символьный режим, оставив все параметры отображения (яркость, световое перо, мигание, тип линии) без изменений. После этой команды дисплей ожидает слова данных, содержащие пары 7-битных ASCII-кодов символов — по два символа на слово. 

Это «минимальная» команда смены режима: только смена типа данных, без настройки сопутствующих параметров.


Получил исходник и помаялся с компиляцией - мне хотелось, чтобы UTF-8 печатался в командной строке. Хрен там, пришлос
ь перевести текстовые сообщения на инглезе.

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

Бонус - скриншотик диалога:


Комментарии