License: LGPL v3 Codacy Badge CodeFactor
BASIC Vilnius is an implementation of the BASIC programming language for Soviet machines with PDP-11 architecture: DVK, BK, UKNC, Nemiga. This BASIC is a semi-compiler: it converts the program text into a so-called threaded code, which executes faster than regular interpretation.
The aim of this project is to develop a full-fledged cross-compiler from the BASIC Vilnius language to MACRO assembly code.
The compiler runs on PC (Windows, Linux, macOS) and generates a text file with assembly code (with .MAC extension) from a BASIC program, plus a text file VIBAS.MAC with runtime assembly code for this program. There is also an option to generate a single common assembly file containing both the main program code and the runtime code.
Current state of the project: prototype
Бейсик Вильнюс — это реализация языка BASIC для советских машин с архитектурой PDP-11: БК, УКНЦ, Немига. Этот Бейсик является "полу-компилятором": он преобразует текст программы в так называемый шитый код, который выполняется быстрее, чем при обычной интерпретации.
Данный проект ставит целью написание полноценного кросс-компилятора с языка Бейсик Вильнюс в код для ассемблера MACRO (для УКНЦ) либо BKTurbo8 (для БК-0010).
Компилятор работает на ПК (Windows, Linux, Mac), и из программы на языке BASIC генерирует текстовый файл с ассемблерным кодом (с расширением .MAC), плюс текстовый файл VIBAS.MAC с ассемблерным кодом рантайма для этой программы. Есть также вариант генерировать один общий ассемблерный файл, содержиащий и код основной программы и рантайм (опция --onefile).
Текущее состояние проекта: прототип
Ближайшая цель это версия 0.1, в которой:
- подмножество языка с типами Integer и Single, без массивов, строки только константные
- полноценный разбор всех конструкций языка
- вычисление Integer и Single выражений, вычисление константных String выражений
PRINTдля Integer/Single и константных строк,INPUTтолько для Integer- функции:
PI,ABS,FIX,INT,SGN,CINT,CSNG,PEEK,INP,SQR,SIN,COS,TAN,ATN,RND,ASC,LEN,INKEY$ - операторы:
LET(кромеLET MID$),GOTO,GOSUB,RETURN,IF/THEN/ELSE,FOR,NEXT,ON/GOTO/GOSUB,STOP,END,REM,PRINT(включаяAT,TAB,SPC, запятая),INPUT(только для Integer),POKE,OUT,CLS,COLOR,LOCATE,BEEP,DATA,READ,RESTORE - без работы с динамическими строками, без работы с файлами, без графики
- НЕ реализованы функции:,
CSRLIN,POS,EXP,LOG,FRE,CDBL,CHR$,MID$,STRING$,VAL,STR$,BIN$,OCT$,HEX$,LPOS,EOF,FN,USR - НЕ реализованы операторы:
LET MID$,DIM,KEY,CLEAR,DEF USR,DEF FN,PRINTдля строковых выражений,INPUTдля Single и строк,OPEN,CLOSE,SCREEN,PSET,PRESET,LINE,CIRCLE,PAINT,DRAW,TRON,TROFF,WIDTH,SYSTEM,MONIT
Возможные сценарии использования компилятора:
- Для БК-0010. Используя
vibasc, генерируем ассемблерный файл с опциями:--platform=BK0010 --turbo8 --onefile. На выходе получаем один ассемблерный файл, компилируем его на PC ассемблером BKTurbo8, получаем на выходе файл .BIN, который можем замускать в эмуляторе БК или на реальной машине. - Для УКНЦ. В результате компиляции программы на BASIC с опцией
--platfom=UKNC, получаем .MAC файл основного кода иVIBAS.MACдля рантайма. Далее, под операционной системой RT-11, компилируем эти .MAC файлы стандартным для RT-11 ассемблеромMACRO, получатся объектные файлы с расширением.OBJ. Затем, линкуем эти файлы программойLINK. В результате, на выходе получается исполнимый файл с расширением.SAV, который может быть исполнен в среде RT-11, обычно командой видаRU MYPROG.SAV. - Для УКНЦ, кросс-компиляция. То же что и в п.2, но всё делаем на ПК. После получения .MAC файлов используем ассемблер
macro11и линковщикpclink11, полученный .SAV файл запускаем в эмуляторе УКНЦ или на реальной машине.
vibasc [опции] filename.ASC [опции]
где filename.ASC — имя файла с программой на BASIC.
Опции:
--quiet,-q— не выдавать строку "о программе" в начале.--onefile— на выходе выдавать один файл, содержащий и код основной программы и код рантайма; без этой опции файл рантайма генерится отдельно под именемVIBAS.MAC.--turbo8— синтаксис выходных файлов должен соответствовать требованиям ассемблера BKTurbo8; как правило, используется для программ под БК, но может применяться и для программ под УКНЦ. Полученный через BKTurbo8 .BIN файл можно сконвертировать в .SAV файл утилитойBkBin2Sav. Без указания опции--turbo8, синтаксис выходных файлов соответствует ассемблеру MACRO.--platform={BK0010|UKNC}— указание целевой платформы, БК-0010 или УКНЦ, по умолчаниюUKNC; этот параметр влияет на выбор файла с шаблоном рантайма, с названиемruntime-{platform}.tmac. Файл шаблона рантайма должен находится там же, где и исполнимый файл компилятора.
Исходный файл на Бейсике:
10 A%=23.42 20 PRINT A%
Результат компиляции (только основной код, без рантайма):
START:
; Инициализация программы
MTPS #340 ; disable interrupts
CLR @#177560
MTPS #0 ; enable interrupts
MOV SP, SAVESP
; 10 A%=23.42
N10:
MOV #23., VARIA ; var A% assignment
; 20 PRINT A%
N20:
MOV VARIA, R0 ; var A%
CALL WRINT ; PRINT Integer
CALL WREOL
LEND:
; Завершение программы
SAVESP = . + 2
MOV #776, SP ; restore SP
EMT 350 ; .EXIT
; VARIABLES
.EVEN
VARIA: .WORD 0 ; A%
; RUNTIME CALLS
.GLOBL WREOL, WRINT
.END START
Так же, как и в оригинале Бейсик Вильнюс:
- Только один оператор на строку.
- Имена переменных опознаются по двум первым буквам + тип. Переменная без указания знака типа (например:
A) считается вещественного типа.A%,A,A$- это три разных переменных трёх разных типов.AиA!- одна и та же переменная вещественного типа. - Булевого типа нет, вместо него используется целый тип. Результат логических операторов (
=,<>,>,<и т.п.) это либо-1("истина") либо0("ложь").
Отличия от оригинала:
- Ключевые слова нужно писать полностью, сокращения НЕ допускаются.
- Для величин/переменных вещественного типа есть только тип "одинарной точности" (Single, 32 бита, 7 десятичных цифр). Числа двойной точности (например,
1234#или235.988D-7) в тексте программы НЕ распознаются. Нет функцииCDBL. ЗначениеPIиспользуется в точности Single. Все функции с вещественным результатом также отдают тип Single. - Номера строк НЕ являются обязательными, они нужны только в случаях, когда на строку нужно сослаться в
GOTO/GOSUB/ONи других операторах. - Под оператором
IFвTHEN/ELSEНЕ допускается ставить операторыFOR/NEXT/DIM/DATA - Аргумент функций
CSRLINиPOSнеобязательный, но если есть, то вычисляется (если он не константный), но результат вычисления не используется. ON .. GOTO/GOSUB: отрицательное значение выражения подONне приводит к ошибке, просто переходим на строку, следующую после этого оператора.- Добавлена функция
IIFс тремя аргументами:X=IIF(<ЛОГ.ВЫРАЖЕНИЕ>,<АРИФМ.ВЫРАЖЕНИЕ>,<АРИФМ.ВЫРАЖЕНИЕ>). Вычисляется первый аргумент; если он ненулевой (т.е. TRUE), то результатом будет значение второго выражения, иначе (для FALSE) - значение третьего выражения. Вычисляется только то выражение, результат которого будет использоваться. Тип результата зависит от типов второго и третьего аргументов: если они оба Integer, то и результат Integer; если хотя бы один из них Single, то и результат Single. CALL <МЕТКА>генерирует вызов подпрограммы в машинных кодах с указанной меткой. Предполагается, что эти подпрограммы будут оформляться в виде отдельного модуля на MACRO/BKTurbo8 и подключаться к программе на этапе линковки.- Команды/операторы, которые НЕ реализованы и НЕ БУДУТ реализованы в будущем:
RUN,CONTKEY(переназначение функциональных клавиш)LOAD,SAVE,CLOAD,CSAVE(загрузка и сохранение текста программы)LIST,MERGE,DELETE,RENUM,AUTO,NEW(работа с текстом программы)TRON,TROFF(трассировка при выполнении)SYSTEM,MONIT(выход из Бейсика)
- Нет пошагового выполнения программы. Вместо этого, можно использовать любой доступный отладчик на уровне готового бинарного кода.
Переменные в Бейсик Вильнюс опознаются по первым двум символам имени + тип.
Имена переменных в ассемблерном коде имеют вид: VAR + тип (I,F,S) + первые два символа имени переменной.
Примеры декорирования:
A% VARIA
B или B! VARFB
C$ VARSC
AA или AAA или AA1 VARNAA