Скрипты-86РК

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
Alikberov
Doomed
Posts: 360
Joined: 14 Oct 2019 18:10
Location: Tashkent

Скрипты-86РК

Post by Alikberov »

Этой темой я заинтересовался относительно недавно.
Оглядываясь на такие экзотические скриптовые языки, как PERL и RUBY, которые раньше всюду управляли интернет сайтами, я подумал, а не разработать ли нечто подобное и для РАДИО-86РК?
Если в Windows и Linux пакетные файлы описываются как Batch и Bash, синтаксис которых своеобразен, почему бы и на РАДИО-86РК не описывать файлы автоматизации на каком-то своём синтаксисе?

Главное условие - компактность интерпретатора/парсера/транслятора.
Если в машинный код внедрить в синтаксис скрипта, можно существенно сэкономить на размере.

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

Ниже я представляю экспериментальную среду для редактирования и запуска скрипта.
В качестве демонстрации я описал там сценарий-затравку для игры «Питон».

Синтаксис прост.
  • Каждый байт транслируется в конечный код как есть
  • Каждое слово транслируется в конечный код как есть
  • Буквы «G-Z» адресуют область переменных/меток (ячейки 7640-767F Монитора)
  • Символ «@» используеся для чтения из ячейки переменной/метки
  • Символами «[» и «]» экранируется блок
  • Символ «:» адресует текущий адрес кода для метки
  • Строчные комментарии отделяются как в ассемблере - через «;»

Code: Select all

;;;;;;;;;;;;;
; SCRIPT-86RK
;;;;;;;;;;;;;
F803K F81BI                     ; LET K=F803,I=F81B
F809S F818T                     ; LET S=F809,T=F818
F821Z                           ; LET Z=F821

:G 21                           ; LXI H,"***ПИТОН***"
[0D 0A "***ПИТОН***" 0A 00]
CD T@                           ; CALL TEXT

:W 21                           ; LXI H,"НАЖМИТЕ <ВК>"
[0D 07 "НАЖМИТЕ <ВК>" 00]
CD T@                           ; CALL TEXT
CD K@                           ; CALL KEY
FE 1B C8                        ; IF KEY==ESC THEN RETURN
FE 0D C2 W@                     ; IF KEY<>13 THEN GOTO W
You do not have the required permissions to view the files attached to this post.
User avatar
Alikberov
Doomed
Posts: 360
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re: Скрипты-86РК

Post by Alikberov »

Вложенные блоки позволяют полностью или частично отказаться от использования многочисленных меток.
Иными словами, вместо «GOTO» теперь можно использовать аналоги «BREAK» и «CONTINUE» с указанием конкретного уровня вложенности.

Для доступа к стеку блоков введена специальная операция - «точка» («.»), которая возвращает адрес стека трансляции.
  • « 0.» эквивалентно « .», «00.» или «0000.»
  • « 1.» эквивалентно « .++», «00.++» или «0000.++»
  • « 2.» эквивалентно « .++++», « 1.++» или «01.++»
Полученный адрес нужно использовать как ссылку на конкретный блок:
  • « 0.@» или « .@» возвращает адрес точки выхода из текущего блока («BREAK»)
  • « 0.@+++» или « .@+++» возвращает адрес входа в текущий блок («CONTINUE»)
  • « 1.@» или «01.@» возвращает адрес точки выхода из блока уровнем выше
  • « 1.@+++» или «01.@+++» возвращает адрес входа в блок уровнем выше
Вот иллюстрация управления иерархией:

Code: Select all

C3:[                             ; Родительский блок (безусловный)
    FE 01                        ; <---------------------------------+
    CA:[                         ; Дочерний блок (условие JZ)        |
        FE 02                    ; <-------------------------------+ |
        D2:[                     ; Внучатый блок (условие JNC)     | |
            FE 03                ; <-----------------------------+ | |
            DA                   ; По условию JC                 | | |
            .@+++                ; повторить текущий блок -------+ | |
            E2                   ; По условию JPO                  | |
            1.@+++               ; повторить дочерний блок --------+ |
            EA                   ; По условие JPE                    |
            2.@+++               ; повторить родительский блок ------+
            F2                   ; По условию JP
            2.@                  ; покинуть родительский блок -------+
            FA                   ; По условию JM                     |
            1.@                  ; покинуть дочерний блок ---------+ |
        :]                       ; Закрываем блок в стеке          | |
    :]                           ; Закрываем блок в стеке          | |
    00                           ; <-------------------------------+ |
:]                               ; Закрываем блок в стеке            |
00                               ; <---------------------------------+
P.S.: Код специально разрабатывался для интеграции с моим редактором «ПОБЕДИТ».
(Сам код парсера 0003-00FF - всего 253 байта и с лёгкостью уместится в любое ПЗУ. Например, если F86C-F98F полностью вычистить от CLI и адаптировать под вызов ПОБЕДИТа по Сбросу, вместо директив Монитора можно запускать подобные скрипты.)
You do not have the required permissions to view the files attached to this post.
DmitryMilk
Writer
Posts: 15
Joined: 12 May 2025 21:56

Re: Скрипты-86РК

Post by DmitryMilk »

Не пробовал взглянуть в сторону форта? Может быть даже готовые среды есть (правда для форта "готовые" понятие растяжимое, разной степени наполненности), я в 90-х запускал какой-то форт на Специалисте побаловаться.

Наверное будет пошустрее, чем трансляторы байткода, особенно если шитый код удачно реализовать. А если без всяких плавучек, то и по памяти может получиться очень даже демократично.
User avatar
Alikberov
Doomed
Posts: 360
Joined: 14 Oct 2019 18:10
Location: Tashkent

Скрипты-86РК

Post by Alikberov »

DmitryMilk wrote: 08 Jul 2025 07:16 Не пробовал взглянуть в сторону форта?
Форт не вместится в ПЗУ с Монитором. :roll:
Отсюда и ограничение в ~256 байтов.

В принципе, этим скриптом Форт описать можно, думаю, если плотно описать на одном экране.

P.S.: Кажется, здесь Фортом уже занимались. :idea:
Интегрировать Форт в Монитор - сложнее, чем кажется.
Last edited by Alikberov on 08 Jul 2025 07:33, edited 1 time in total.
b2m
Devil
Posts: 915
Joined: 26 May 2003 06:57

Re: Скрипты-86РК

Post by b2m »

Самый маленький форт для 86РК - это форт шихова, вот тут про него: viewtopic.php?p=154475#p154475
Но даже он целых 2Кб.

Есть ещё такое esoteric forth, но оно для x86. Хотя принцип интересный.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
imsushka
Maniac
Posts: 244
Joined: 01 Jan 2022 04:34
Location: USSR, Tashkent

Re: Скрипты-86РК

Post by imsushka »

для форта надо 15 базовых команд
256 байт должно поместицца

https://habr.com/ru/articles/523348/
b2m
Devil
Posts: 915
Joined: 26 May 2003 06:57

Re: Скрипты-86РК

Post by b2m »

А зачем во второй версии теперь нужно двоеточие ставить перед "[" и "]"? Цена вопроса - 6 байт кода, но зато скрипт компактнее.

Могу предложить сэкономить 2 байта: парсер ожидает адрес скрипта в HL, потом пересылает в BC. Не лучше ли сразу передавать в BC, тем более что перед вызовом адрес вытаскивается из стека командой POP?

А вот адрес кода как раз лучше передавать в HL, не нужет будет ещё 1 байт.

Можно ещё 5 байт сэкономить, если обработку символа с кодом <0Dh сделать как DCX B и разместить это прямо перед обработкой конца блока.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
b2m
Devil
Posts: 915
Joined: 26 May 2003 06:57

Re: Скрипты-86РК

Post by b2m »

Ещё 3 байта: при проверке, нужно ли выдавать байты из HL можно выкинуть JM и CALL заменить на CP (как сделано для второго байта).
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
imsushka
Maniac
Posts: 244
Joined: 01 Jan 2022 04:34
Location: USSR, Tashkent

Re: Скрипты-86РК

Post by imsushka »

b2m wrote: 08 Jul 2025 23:07 Ещё 3 байта: при проверке, нужно ли выдавать байты из HL можно выкинуть JM и CALL заменить на CP (как сделано для второго байта).
извращенец перфекционист
User avatar
Alikberov
Doomed
Posts: 360
Joined: 14 Oct 2019 18:10
Location: Tashkent

Скрипты-86РК

Post by Alikberov »

Спасибо за критику, замечания и советы.

Да, в гонке за компактностью и функционалом, синтаксис несколько искажался.

В данной версии я исправил некоторые моменты:

Code: Select all

1100\                            ; Аналог ORG 1100H
1100^                            ; Адрес пуска программы
C3[                              ; Родительский блок (безусловный)
    FE 01                        ; <---------------------------------+
    CA[                          ; Дочерний блок (условие JZ)        |
        FE 02                    ; <-------------------------------+ |
        D2[                      ; Внучатый блок (условие JNC)     | |
            FE 03                ; <-----------------------------+ | |
            DA                   ; По условию JC                 | | |
            1$...                ; повторить текущий блок -------+ | |
            E2                   ; По условию JPO                  | |
            2$...                ; повторить дочерний блок --------+ |
            EA                   ; По условие JPE                    |
            3$...                ; повторить родительский блок ------+
            F2                   ; По условию JP
            3$                   ; покинуть родительский блок -------+
            FA                   ; По условию JM                     |
            2$                   ; покинуть дочерний блок ---------+ |
        ]                        ; Закрываем блок в стеке          | |
    ]                            ; Закрываем блок в стеке          | |
    00                           ; <-------------------------------+ |
]                                ; Закрываем блок в стеке            |
00                               ; <---------------------------------+
Можно заметить, теперь символизм более логичен и интуитивен.
  • Символ «$» предоставляет доступ к стеку блоков
  • Многоточие «...» корректирует указатель на продолжение работы блока
  • Переменная «\» определяет адрес посадки кода - аналогична псевдооператору «ORG»
  • Переменная «^» определяет стартоаый адрес
Код парсера перенёс в 0100-01FF, а редактор чуточку доработал.
  • Комбинация «Забой»+«F2» - удаляет помеченный символ
  • Комбинация «ТАБ»+«F2» может помочь зарезервировать позиции под вставку символов
You do not have the required permissions to view the files attached to this post.
b2m
Devil
Posts: 915
Joined: 26 May 2003 06:57

Re: Скрипты-86РК

Post by b2m »

Надо бы ещё "else" добавить, например символ "|". Типа: CA [ 21 1111 | 21 2222 ]
Реализация аналогична концу блока (определяем ссылку вперёд из стека как текущий адрес +3, плюс генерируем новый jmp, адрес параметра опять кладём в стек).

Code: Select all

op_else:
call <текущий адрес>
pop d
mov a,d
ora e
rz
mvi m,0C3h
push h
inx h
inx h
inx h
shld <адрес>
xchg
jmp <конец блока, где сохраняем DE>
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
b2m
Devil
Posts: 915
Joined: 26 May 2003 06:57

Re: Скрипты-86РК

Post by b2m »

Code: Select all

sui 40h
add a
adi 30h
эквивалентно

Code: Select all

sui 28h
add a
Ещё 2 байта.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Alikberov
Doomed
Posts: 360
Joined: 14 Oct 2019 18:10
Location: Tashkent

Скрипты-86РК

Post by Alikberov »

b2m wrote: 09 Jul 2025 06:53Надо бы ещё "else" добавить, например символ "|". Типа: CA [ 21 1111 | 21 2222 ]
Интересное замечание.
Если Вы мой Sensor отладчиком откроете, точно такие же конструкции найдёте, так как я весь код описал там своим транслятором. :rotate:
(Хотя то - под MS-DOS было, для внутренних разработок. Сейчас просто под i8080/ВМ80 РАДИО-86РК решил идейку применить.)

А если "о i8080/ВМ80": Есть ли смысл дальше усложнять синтаксис и раздувать код транслятора, когда вся идея была о том, чтобы...
  1. Дать РАДИО-86РК обновлённый интерфейс
  2. Вычистить из ПЗУ Монитора большиство директив («C»/«D»/«G»/«L»/«M»/«S»/«T»)
  3. После Сброса запускать «ПОБЕДИТ» для редактирования скриптов
  4. Клавишами F1 и F2 выбирать «скрипт 1» и «скрипт 2»
  5. По F3 загружать «R,7F» и запускать «SD-DOS»
  6. По F4 запускать текущий скрипт на исполнение
В таком плане, избыточный функционал скрипта будет излишним, так как, при необходимости, скриптом быстренько набросать «код своей директивы» всего лишь может понадобится. :idea:

Спасибо за участие и рекомендации. Я попробую реализовать функционал.

P.S.: Парсер в 256 байтов, интегрированный в Монитор - всё равно мой внутренний эксперимент.
Mondx
Doomed
Posts: 532
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Скрипты-86РК

Post by Mondx »

Да уж...) Когда то и я этим страдал. И даже привычка экономить осталась. Вот только заради чего! Если только тренировка мозгов. Но лучше бы что то новое осваивал.(