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.
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΠΠ (Windows, Linux, Mac), ΠΈ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠ·ΡΠΊΠ΅ BASIC Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ (Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ .MAC), ΠΏΠ»ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» VIBAS.MAC Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ°Π½ΡΠ°ΠΉΠΌΠ° Π΄Π»Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π²Π°ΡΠΈΠ°Π½Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠΈΠΉ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΎΠ΄Π΅ΡΠΆΠΈΠ°ΡΠΈΠΉ ΠΈ ΠΊΠΎΠ΄ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠ°Π½ΡΠ°ΠΉΠΌ.
Π’Π΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°: ΠΏΡΠΎΡΠΎΡΠΈΠΏ
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
- ΠΠ»Ρ ΠΠ-0010. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ
vibasc, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ:--platform=BK0010 --turbo8 --onefile. ΠΠ° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° PC Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠΌ BKTurbo8, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΡΠ°ΠΉΠ» .BIN, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΡΡΠΊΠ°ΡΡ Π² ΡΠΌΡΠ»ΡΡΠΎΡΠ΅ ΠΠ ΠΈΠ»ΠΈ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. - ΠΠ»Ρ Π£ΠΠΠ¦. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° BASIC, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ .MAC ΡΠ°ΠΉΠ» ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ
VIBAS.MACΠ΄Π»Ρ ΡΠ°Π½ΡΠ°ΠΉΠΌΠ°. ΠΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ RT-11,.MACΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ ΡΡΠΈ ΡΠ°ΠΉΠ»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ Π΄Π»Ρ RT-11 Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠΌ MACRO, ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ.OBJ. ΠΠ°ΡΠ΅ΠΌ Π»ΠΈΠ½ΠΊΡΠ΅ΠΌ ΡΡΠΈ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ LINK. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΠΌΡΠΉ ΡΠ°ΠΉΠ» Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ.SAV, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ Π² ΡΡΠ΅Π΄Π΅ RT-11 Π½Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. - ΠΠ»Ρ Π£ΠΠΠ¦, ΠΊΡΠΎΡΡ-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ. Π’ΠΎ ΠΆΠ΅ ΡΡΠΎ ΠΈ Π² ΠΏ.2, Π½ΠΎ Π²ΡΡ Π΄Π΅Π»Π°Π΅ΠΌ Π½Π° ΠΠ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ
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:
MOV SP, SAVESP
; 10 A%=23.42
L10:
MOV #23., VARIA ; assignment
; 20 PRINT A%
L20:
MOV VARIA, R0
CALL WRINT
CALL WREOL
L65536:
SAVESP = . + 2
MOV #776, SP ; restore SP
EMT 350 ; .EXIT
; VARIABLES
.EVEN
VARIA: .WORD 0 ; A%
; RUNTIME CALLS
.GLOBL WREOL, WRINT
.END START
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π² ΠΠ΅ΠΉΡΠΈΠΊ ΠΠΈΠ»ΡΠ½ΡΡ ΠΎΠΏΠΎΠ·Π½Π°ΡΡΡΡ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΡΠΌ Π΄Π²ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌ ΠΈΠΌΠ΅Π½ΠΈ + ΡΠΈΠΏ.
ΠΠΌΠ΅Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π² ΠΊΠΎΠ΄Π΅ Π΄Π»Ρ MACRO ΠΈΠΌΠ΅ΡΡ Π²ΠΈΠ΄: VAR + ΡΠΈΠΏ (I,N,S) + ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
ΠΡΠΈΠΌΠ΅ΡΡ Π΄Π΅ΠΊΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
A% VARIA
B ΠΈΠ»ΠΈ B! VARNB
C$ VARSC
AA ΠΈΠ»ΠΈ AAA ΠΈΠ»ΠΈ AA1 VARNAA