Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

nzeemin/vilnius-basic-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

187 Commits

Repository files navigation

vilnius-basic-compiler

License: LGPL v3 Codacy Badge CodeFactor

Vilnius BASIC Compiler

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

Возможные сценарии использования компилятора:

  1. Для БК-0010. Используя vibasc, генерируем ассемблерный файл с опциями: --platform=BK0010 --turbo8 --onefile. На выходе получаем один ассемблерный файл, компилируем его на PC ассемблером BKTurbo8, получаем на выходе файл .BIN, который можем замускать в эмуляторе БК или на реальной машине.
  2. Для УКНЦ. В результате компиляции программы на BASIC с опцией --platfom=UKNC, получаем .MAC файл основного кода и VIBAS.MAC для рантайма. Далее, под операционной системой RT-11, компилируем эти .MAC файлы стандартным для RT-11 ассемблером MACRO, получатся объектные файлы с расширением .OBJ. Затем, линкуем эти файлы программой LINK. В результате, на выходе получается исполнимый файл с расширением .SAV, который может быть исполнен в среде RT-11, обычно командой вида RU MYPROG.SAV.
  3. Для УКНЦ, кросс-компиляция. То же что и в п.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, CONT
    • KEY (переназначение функциональных клавиш)
    • 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

About

Writing cross compiler from Vilnius BASIC into MACRO11. WIP 🚧

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /