PDA

Просмотр полной версии : Компилирование кода MSX Basic в COM-файл



yevrowl
08.09.2025, 15:03
При помощи компилятора MSX Basic от Егора Глебовича Вознесенского (https://zx-pk.ru/threads/23622-umer-egor-voznesenskij-(solid).html) — SOLiD VBasic — попытался собрать в командный файл MSX-DOS свой исходник (bt.bas).

Инструкция — https://sysadminmosaic.ru/msx/vbc/vbc

Затем попытался собрать штатным компилятором Microsoft Basic Compiler.

Инструкция — http://sysadminmosaic.ru/msx/basic_compiler/basic_compiler

В обоих случаях не получилось:

https://i.postimg.cc/0QnmxdTF/error.png

Посоветовали компилировать бразильским компилятором Mozart Basic от Cibertron Software (https://download.file-hunter.com/Program%20language/Mozart%20-%20Compilador%20BASIC%20para%20MSX%20(1990)(Cibert ron%20Software)(br).zip) — однако результат компиляции отличается от запуска в среде MSX Basic.

Исходник (bt.bas) прилагается:

82765

Можно ли собрать COM-файл, который будет функционировать как исходник после команды RUN?

Wierzbowsky
08.09.2025, 17:13
Существует несколько компиляторов для Бейсик программ, но ни один не доведён до ума, насколько я знаю. Мы в институте пользовались псевдокомпилятором BASCOM, он действительно компилировал BAS в COM, но этот COM файл должен был всегда иметь файл BASLIB.REL рядом. Если память не изменяет.

Последний вопрос меня поставил в тупик. COM файл работает только с среде MSX-DOS, командой RUN его уж никак запустить нельзя. Так что либо BAS, запускаемый командой "run", либо COM, запускаемый из системы. Есть утилита BRUN от Микрософта, по идее она должна запускать BAS файлы из системы. Но тут смысла нет, так как команда basic имя.bas из командной строки MSX-DOS запустит нужый файл без всяких примочек.

yevrowl
08.09.2025, 18:14
Мы в институте пользовались псевдокомпилятором BASCOM, он действительно компилировал BAS в COM, но этот COM файл должен был всегда иметь файл BASLIB.REL рядом.
При компилировании с опцией /O упомянутого файла уже не требует.


Последний вопрос меня поставил в тупик.
Видимо, неправильно составил фразу. Имею в виду, как в интерпретаторе, после ввода RUN.

Вот собранный при помощи Mozart Basic исходник работает несколько иначе: 82769

Вот как пашет оригинал на MSX Basic — https://webmsx.org/?MACHINE=MSX1&disk=http://truechess.org/bt.dsk

axe_chita
09.09.2025, 20:05
А с расширением NestorBasic не пытались запускать?

yevrowl
10.09.2025, 03:05
А с расширением NestorBasic не пытались запускать?

Не пытался, ведь это интерпретатор, а не компилятор.

axe_chita
10.09.2025, 19:45
NestorBASIC не интерпретатор, это компилятор который позволяет "на лету" откомпилировать в память программу на MSX Basic. Компилируемые блоки программы находятся между командами _turbo on и _turbo off. Также можно сразу откомпилировать программу целиком и сразу запустить её на исполнение командой _run. Кроме компилятор,а в нем есть ещё много полезных функций.
https://sysadminmosaic.ru/msx/nestor_basic/nestor_basic
Из минусов, он не умеет создавать standalone приложения (COM программы СР/М и MSXDOS)

yevrowl
10.09.2025, 20:03
Из минусов, он не умеет создавать standalone приложения (COM программы СР/М и MSXDOS)

Так ведь мне и нужен standalone исполняемый файл. :smile:

yevrowl
14.09.2025, 23:37
Есть ещё вариант MSXBas2Asm (https://launchpad.net/msxbas2asm) + Pasmo (https://pasmo.speccy.org/) (portable Z80 cross assembler).
Попробовал эту связку — результаты ни в виде COM-файлов, ни в виде картриджей ROM не запускаются.

axe_chita
19.09.2025, 19:27
Так ведь мне и нужен standalone исполняемый файл. :smile:
А варианты с кросс-компиляцией не рассматриваются? Если рассматриваются, то тогда можно посмотреть на "великий и ужасный" ACK Amsterdam Compiler Kit, вроде там есть компилятор BASIC и есть целевая платформа СР/М

Oleg N. Cher
19.09.2025, 22:38
Так ведь мне и нужен standalone исполняемый файл. :smile:Зачем Вам компилировать BASIC? Берите TinyContext (https://www.avhohlov.narod.ru/p1820ru.htm). Генерит код для CP/M. И даже сам компиль работает под CP/M. Есть и кросс-компилятор под Win32.

Единственная сложность - сделать обвязку, т.е. набор базовых процедур. Но если владеете платформой, это не проблема.

yevrowl
21.09.2025, 00:10
А варианты с кросс-компиляцией не рассматриваются? Если рассматриваются, то тогда можно посмотреть на "великий и ужасный" ACK Amsterdam Compiler Kit, вроде там есть компилятор BASIC и есть целевая платформа СР/М
Насколько понял, там некий собственный вариант Бейсика, не совместимый с MSX Basic.


Зачем Вам компилировать BASIC? Берите TinyContext (https://www.avhohlov.narod.ru/p1820ru.htm). Генерит код для CP/M. И даже сам компиль работает под CP/M. Есть и кросс-компилятор под Win32.
Очевидно, ввиду того что написанный мною код — на MSX Basic:

82816

А предложенный компилятор, похоже, для другого ЯП с ассемблерными вставками.

Oleg N. Cher
23.09.2025, 22:14
Видите ли. Бейсик это целое семейство несовместимых друг с другом языков. Тот компилятор, который Вы используете - не факт, что он съест Ваш код.

Но если исходить из идеи "я хочу получить максимум, но без глубокого изучения ассемблера", тут Бейсик будет всегда неэффективен.

yevrowl
24.09.2025, 00:01
Видите ли. Бейсик это целое семейство несовместимых друг с другом языков. Тот компилятор, который Вы используете - не факт, что он съест Ваш код.
Программы написаны для MSX, на родном ей диалекте MSX Basic, а не каких-то «семейно несовместимых». Компиляторы есть, разные, и некоторые даже частично компилируют, но хотелось бы понимания, можно ли добиться полного результата.


Но если исходить из идеи "я хочу получить максимум, но без глубокого изучения ассемблера", тут Бейсик будет всегда неэффективен.
При чём тут «максимум» и глубокое изучение ассемблера? Те же GW-Basic, Turbo Basic, Q(uick)Basic обычно компилируются без каких-либо дополнительных трудностей.

Oleg N. Cher
24.09.2025, 00:56
Компилируются да, но они несовместимы друг с другом.
А что, MSX Basic только один? И в полном объёме поддерживается компиляторами?

P. S. Вижу, что Вы любитель Бейсика, устраняюсь.

yevrowl
24.09.2025, 11:14
Компилируются да, но они несовместимы друг с другом.
По большей части совместимы, особенно для несложного кода. Есть программы, которые компилируются любым компилятором для этих диалектов Бейсика.


А что, MSX Basic только один? И в полном объёме поддерживается компиляторами?
Да, один-единственный, с добавляемыми возможностями (в основном зависящими от аппаратной части) к каждой версии — https://ru.wikipedia.org/wiki/MSX_BASIC


P. S. Вижу, что Вы любитель Бейсика, устраняюсь.
Если вопрос про Бейсик, в котором не разбираетесь, для платформы, с который похоже тоже не знакомы, то в чём состояла смысловая нагрузка «рекомендаций»?

Oleg N. Cher
24.09.2025, 15:54
В том, чтобы переключить Вас на более лучшее по качеству средство разработки. Но раз не надо - значит не надо.
С чего Вы взяли, что я не разбираюсь в Бейсике? Я сделал игру (https://worldofspectrum.org/archive/software/games/tiny-tetris-oleg-n-cher) на нём ещё в 1995-м.
Но да, унизить собеседника, упрекнув в некомпетентности, это отличительная черта многих здешних форумчан.

yevrowl
24.09.2025, 19:50
С чего Вы взяли, что я не разбираюсь в Бейсике?
1. Из-за вопроса об MSX Basic'е, код из которого, после некоторой рихтовки, можно перенести как на Sinclair Basic, так и на GW-Basic.
2. Исходя из утверждения о несовместимости GW-Basic, Turbo Basic, Q(uick)Basic между собой.


Я сделал игру (https://worldofspectrum.org/archive/software/games/tiny-tetris-oleg-n-cher) на нём ещё в 1995-м.
Для ZX с памятью 16 килобайт — впечатляет! Извините, ошибся с мнением.

Oleg N. Cher
24.09.2025, 23:15
Спасибо.

1. Я же спросил: все ли Бейсики для MSX совместимы между собой? Иными словами: MSX Basic всегда только один или их есть много? Если один, то все ли компиляторы совместимы с ним и между собой? Потому что даже для Спектрума без ОС были различные: BLAST, Tobos FP, MCoder'ы, компилятор LaserBasic и прочее, и всё несовместимо между собой.

2. А что, они совместимы между собой? На уровне GOTO, INPUT и PRINT? Притом GOTO где-то обозначается как GO TO, а кое-где можно писать IF a THEN номер_строки и без ELSE. А INPUT на ZX при вводе строк требует кавычек. А PRINT имеет разные размеры табуляции. И где-то переносит на новую строку, а где-то нет. Даже такие, казалось бы, одинаковые вещи всё равно разные в разных Бейсиках. Я поэтому и сказал, что Бейсики это целое семейство.

Да, если Вам надо писать для CP/M чисто расчётную программу, то может её и удастся относительно легко перенести на другой Бейсик, да и то не факт, потому что разная точность вещественных вычислений и прочее.

Но мощь начинается там, где можно из Бейсика вызывать разные аппаратные фишечки, которых на MSX больше, чем на ZX Spectrum. Поэтому перенести что-то этакое с MSX Basic на ZX Basic будет практически невозможно.

yevrowl
25.09.2025, 00:35
1. Я же спросил: все ли Бейсики для MSX совместимы между собой? Иными словами: MSX Basic всегда только один или их есть много?
MSX Basic по сути один, но выпущено множество модификаций и надстроек:

VBC — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105514
MBC — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105515
WB-ASS2 — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105516
Mozart — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105517
Advanced Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105518
Artisan Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105519
Delta Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105520
MCBC — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105521
MS Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=1391
Nevada Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105577
Gradius Basic — http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105574

Использую только встроенный.


Если один, то все ли компиляторы совместимы с ним и между собой?

Компиляторы между собой не совместимы, при том что ЯП один.


Потому что даже для Спектрума без ОС были различные: BLAST, Tobos FP, MCoder'ы, компилятор LaserBasic и прочее, и всё несовместимо между собой.

Может подскажете в той теме, чем и как компилировать? https://zx-pk.ru/threads/36358-brain-teaser.html
Встроенный Sinclair Basic с ленты, кажется, тормозит даже на таком примитивном коде.


2. А что, они совместимы между собой? На уровне GOTO, INPUT и PRINT? Притом GOTO где-то обозначается как GO TO, а кое-где можно писать IF a THEN номер_строки и без ELSE. А INPUT на ZX при вводе строк требует кавычек. А PRINT имеет разные размеры табуляции. И где-то переносит на новую строку, а где-то нет. Даже такие, казалось бы, одинаковые вещи всё равно разные в разных Бейсиках. Я поэтому и сказал, что Бейсики это целое семейство.

GO TO и GO SUB — это к Sinclair Basic относится, у этих же Бейсиков (GW, QB, TB) синтаксис почти весь общий, и пашет одинаково.

Oleg N. Cher
25.09.2025, 15:13
Может подскажете в той теме, чем и как компилировать? https://zx-pk.ru/threads/36358-brain-teaser.htmlИзвините, я не понял о чём идёт разговор в той теме. А исходник скачивать и смотреть лениво.

Если работать с Бейсик-компилятором, то надо писать программу сразу под него. Например, относительно неплох целочисленный MCoder2. Но там все переменные целые [-32768..32767]. И есть ещё некоторые ограничения.

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

Когда-то видел Тетрис, написанный на Бейсике и скомпилированный кажется при помощи MCoder. Но это из эпохи кассет и моих ковыряний в играх. Сейчас я его вряд ли найду.

Подобным образом вроде даже написаны неплохие игры для Спектрума. На ум приходит HeartBroken, но она, кажется, с машкодовыми вставками.

Компилятор BLAST просто игрушка. Tobos FP можно попробовать использовать для большей совместимости с Sinclair Basic, но он тоже имеет некоторые ограничения.

axe_chita
16.10.2025, 20:56
При помощи компилятора MSX Basic от Егора Глебовича Вознесенского (https://zx-pk.ru/threads/23622-umer-egor-voznesenskij-(solid).html) — SOLiD VBasic — попытался собрать в командный файл MSX-DOS свой исходник (bt.bas).

Инструкция — https://sysadminmosaic.ru/msx/vbc/vbc

Затем попытался собрать штатным компилятором Microsoft Basic Compiler.

Инструкция — http://sysadminmosaic.ru/msx/basic_compiler/basic_compiler

В обоих случаях не получилось:

https://i.postimg.cc/0QnmxdTF/error.png

Посоветовали компилировать бразильским компилятором Mozart Basic от Cibertron Software (https://download.file-hunter.com/Program%20language/Mozart%20-%20Compilador%20BASIC%20para%20MSX%20(1990)(Cibert ron%20Software)(br).zip) — однако результат компиляции отличается от запуска в среде MSX Basic.

Исходник (bt.bas) прилагается:

82765

Можно ли собрать COM-файл, который будет функционировать как исходник после команды RUN?
Давайте пройдемся по вашим проблемам по мере их возникновения.
Первое, о VBasic Егора Вознесенского: К сожалению та версия компилятора что доступна в интернете, или недописана, или повреждена, либо то и другое одновременно. По крайней мере у меня он сыпал мусором в ассемблерный файл при компиляции вполне тривиальной программы.
По тексту ошибки при компиляции вашей программы, на этапе линковки с библиотекой линковщик не может найти в ней функцию/подпрограмму BEEPX которая является реализацией оператора BEEP. Что бы понять точнее надо посмотреть ассемблерный листинг и просмотреть библиотеку с которой линкуется программа.
Далее: В документации к компилятору прямо сказано следующее: "Типы переменных жёстко связаны с именами. Нельзя, например использовать в одной программе A и A$, а также массив с именем, совпадающим с именем простой переменной. Подробнее об этом в главе 3."
В третей главе говорится следующее:"В отличие от MSX BASIC по умолчанию все переменные определены как целые, поэтому следует в программах первой строкой вставить DEFDBL A-Z. Напротив, конструкцию типа DEFINT A-Z можно опустить."
Далее "Тип переменной устанавливается компилятором один раз при первой встрече согласно правилам, описанным выше, и остаётся неизменным на протяжении всей программы, поэтому символ точности можно указывать только один раз, что экономит текст программы и избавляет пользователя от возможных ошибок в результате пропуска такого символа в программе."
Далее "Функция RND - если аргумент плавающий, работает стандартно в отличие от случая с целым аргументом, который описан ниже.
Если функция вызвана как RND(M), где М - целое выражение, она возвращает строго случайное, равномерно распределенное целое число в интервале от 0 (включительно) до M (исключительно), положительное или отрицательное в зависимости от знака М."

Теперь по поводу Microsoft BASIC Compiler, это НЕ компилятор MSX BASIC. Это (как ни удивительно прозвучит) компилятор Microsoft BASIC который имеет некоторые отличия от MSX Basic в поведении, к примеру оператора FOR. Далее данный компилятор не курсах о расширенных аппаратных возможностях MSX (Screen, Width, CLS, Locate и т.д.), и соответственно буде пугаться при их виде.
Почему Мелкомягкие таки не удосужились создать полноценный компилятор для MSX Basic? Сделаю спекулятивное предположение, что это произошло из-за ссоры Кея Ниши и Билла Гейтса, когда Гейтс попытался подмять стандарт MSX под себя, а Ниши резко воспротивился этому. После этого Microsoft резко вышла из проекта хлопнув дверью, и далее ASCII corp самостоятельно возилась со стандартом MSX.
ПыСы. Я посмотрел исходный текст вашей программы, и у меня сложилось впечатление что вы отлаживали эту программу на GWBasic. По крайней мере псевдографику в вашей программе я смог увидеть только в досовской 866 кодовой таблице, а не в КОИ-8

yevrowl
16.10.2025, 22:57
Давайте пройдемся по вашим проблемам по мере их возникновения.

Спасибо за детальный разбор!


К сожалению та версия компилятора что доступна в интернете, или недописана, или повреждена, либо то и другое одновременно.

Читал подобные комментарии и при попытке компилировать разные исходники пришёл к такому же заключению. Весьма жаль, потому что, насколько мог убедиться, генерирует оптимизированный по размеру и быстрый код исполняемый файлов, в сравнении с тем же бразильским Mozart (http://old-dos.ru/index.php?page=files&mode=files&do=show&id=105517). Другой версии этого компилятора, случайно, нигде не пробегало?


По тексту ошибки при компиляции вашей программы, на этапе линковки с библиотекой линковщик не может найти в ней функцию/подпрограмму BEEPX которая является реализацией оператора BEEP.

Убрал бы BEEP, заменив на PLAY/SOUND, или даже вовсе убрав звук, если бы полагал что остальной код будет компилирован правильно.


Это (как ни удивительно прозвучит) компилятор Microsoft BASIC который имеет некоторые отличия от MSX Basic в поведении, к примеру оператора FOR. Далее данный компилятор не курсах о расширенных аппаратных возможностях MSX (Screen, Width, CLS, Locate и т.д.), и соответственно буде пугаться при их виде.

Заметил:

https://i126.fastpic.org/big/2025/1016/bf/41674290500c8853371be5d5960d35bf.png

В принципе, можно постараться переделать исходник под такой вариант Бейсика, но смысла в этом при наличии работающей логической игры в виде картриджа и дискеты с автозагрузкой (https://www.msxdev.org/2025/09/19/msxdev25-02-brain-teaser/) — не наблюдаю.


отлаживали эту программу на GWBasic

Вообще в QBasic, а к GWBasic обращаюсь за RENUM.


По крайней мере псевдографику в вашей программе я смог увидеть только в досовской 866 кодовой таблице, а не в КОИ-8

Кодовая страница CP437 (https://ru.wikipedia.org/wiki/CP437), соответствует раскладке в зарубежных MSX1. В русской MSX1 символы псевдографики смещены:

https://i126.fastpic.org/big/2025/1016/86/edfae7a7a81a3d5bd1fafff22fae0986.png

axe_chita
17.10.2025, 19:58
Другой версии этого компилятора, случайно, нигде не пробегало?

Если бы тут были спички! Увы и ах, другой версии я не наблюдал. Конечно, чисто теоретически, можно задизасмить Vbasic, тем более Егор дал разрешение на такие действия, но не факт что из этого чтото получится.


Убрал бы BEEP, заменив на PLAY/SOUND, или даже вовсе убрав звук, если бы полагал что остальной код будет компилирован правильно.
Play/Sound тем более работать не будут. Но прекрасно сработает Print CHR$(7); Эмуляция VT52 прекрасно работает.


В принципе, можно постараться переделать исходник под такой вариант Бейсика, но смысла в этом при наличии работающей логической игры в виде картриджа и дискеты с автозагрузкой (https://www.msxdev.org/2025/09/19/msxdev25-02-brain-teaser/) — не наблюдаю.
А что тут переделывать?
Добавляем две пользовательские функции
DEF FNL$(X,Y)=CHR$(27)+"Y"+CHR$(32+Y)+CHR$(32+X) - как определение LOCATE и DEF FNCL$=chr$(12) - как определение CLS
используем их с ведущим оператором PRINT. Т.е PRINT FNL$(X,Y); вместо LOCATE, а PRINT FNСL$ вместо CLS


Вообще в QBasic, а к GWBasic обращаюсь за RENUM.Вообще Renum есть и MSX Basic
Кстати совет, обратите внимание на https://msxpen.com/ возможно там вам будет более удобно писать и отлаживать программу.

Кодовая страница CP437 (https://ru.wikipedia.org/wiki/CP437), соответствует раскладке в зарубежных MSX1. В русской MSX1 символы псевдографики смещены:

https://i126.fastpic.org/big/2025/1016/86/edfae7a7a81a3d5bd1fafff22fae0986.png
Так вроде на MSX официальная раскладка почти полностью совпадает с КОИ-8, имеются небольшие отличия в начертании символов псевдографики
https://www.msx.org/wiki/images/f/fb/MSX_font-RU.png
https://image3.slideserve.com/5829068/slide22-l.jpg

- - - Добавлено - - -

Кстати, маленькое правка вашей программы с целью её упрощения

1890 K$ = INKEY$
1891 IF K$ = "" THEN 1890 ELSE K=asc(K$)
1892 IF K = 27 THEN CLS: END
1893 IF (K>=49 and K<=57) THEN ON (K-49) GOTO 2010,2050,2090,2130,2170,2210,2250,2290,2330
1990 '
2000 GOTO 1890

yevrowl
18.10.2025, 13:55
Но прекрасно сработает Print CHR$(7); Эмуляция VT52 прекрасно работает.
Спасибо, заменил.


А что тут переделывать?
Добавляем две пользовательские функции
DEF FNL$(X,Y)=CHR$(27)+"Y"+CHR$(32+Y)+CHR$(32+X) - как определение LOCATE и DEF FNCL$=chr$(12) - как определение CLS
используем их с ведущим оператором PRINT. Т.е PRINT FNL$(X,Y); вместо LOCATE, а PRINT FNСL$ вместо CLS
Заменил и здесь, теперь компилируется, но пашет не ахти:

https://i126.fastpic.org/thumb/2025/1018/8d/7f050e6c2039f265dec9a00dfb7f668d.jpeg (https://fastpic.org/view/126/2025/1018/7f050e6c2039f265dec9a00dfb7f668d.png.html) https://i126.fastpic.org/thumb/2025/1018/34/743b06861bf3a2745639fa0cf1b23334.jpeg (https://fastpic.org/view/126/2025/1018/743b06861bf3a2745639fa0cf1b23334.png.html) https://i126.fastpic.org/thumb/2025/1018/34/d6c3ed7930e11d188aad95cfdec73234.jpeg (https://fastpic.org/view/126/2025/1018/d6c3ed7930e11d188aad95cfdec73234.png.html) https://i126.fastpic.org/thumb/2025/1018/6a/7ddd63fe699debf50f629a0019d0936a.jpeg (https://fastpic.org/view/126/2025/1018/7ddd63fe699debf50f629a0019d0936a.png.html)


Вообще Renum есть и MSX Basic
Знаю, только благодаря NTVDM можно запускать GW-Basic в Windows 10 без эмуляции и перебрасывания исходников через образы дискет. =)


Кстати, маленькое правка вашей программы с целью её упрощения
Спасибо, код рабочий, заменил также.


Так вроде на MSX официальная раскладка почти полностью совпадает с КОИ-8, имеются небольшие отличия в начертании символов псевдографики
Сейчас займусь подстановкой символов псевдографики и попробую ещё раз компилировать.

yevrowl
18.10.2025, 17:59
В общем, вот BAS и COM файлы.

82979

Исполняемый файл в CP/M запускается, однако, к сожалению, цифры из псевдографики рисует мимо ячеек...

axe_chita
18.10.2025, 18:45
Спасибо, заменил.
Пожалуйста


Заменил и здесь, теперь компилируется, но пашет не ахти:
В чистом MSXBasic всё работает без проблем


Знаю, только благодаря NTVDM можно запускать GW-Basic в Windows 10 без эмуляции и перебрасывания исходников через образы дискет. =)
DOSBox с примонтированной папкой как диск С не проще будет?


Спасибо, код рабочий, заменил также.
Пожалуйста


Сейчас займусь подстановкой символов псевдографики и попробую ещё раз компилировать.
Вот вариант программы в PURE ASCII

7 DEF FNL$(X,Y)=CHR$(27)+"Y"+CHR$(32+Y)+CHR$(32+X)
8 DEF FNCL$=chr$(12)
1000 KEY OFF
1010 DEFINT A-Z
1020 REM RANDOMIZE TIMER
1030 SCREEN 0
1040 WIDTH 40
1050 COLOR 15, 13
1060 PRINT FNCL$
1070 PRINT
1080 PRINT " ######################################"
1090 PRINT " # #"
1100 PRINT " # BRAIN TEASER #"
1110 PRINT " # #"
1120 PRINT " # for MSXdev25 #"
1130 PRINT " # #"
1140 PRINT " # by Y. R. Sova #"
1150 PRINT " # #"
1160 PRINT " ######################################"
1170 PRINT " # #"
1180 PRINT " # This computer game is based on #"
1190 PRINT " # BrainTeaser by Wim Nijland. #"
1200 PRINT " # #"
1210 PRINT " # Choose digits from 1 to 9, split #"
1220 PRINT " # by reaction method into three #"
1230 PRINT " # groups (1-3-7-9, 2-4-6-8, and 5). #"
1240 PRINT " # #"
1250 PRINT " # The goal is to display all digits #"
1260 PRINT " # except 5, without letting the #"
1270 PRINT " # field be cleared. #"
1280 PRINT " # #"
1290 PRINT " ######################################"
1300 K$ = INKEY$
1310 IF K$ = "" THEN GOTO 1300
1320 PRINT FNCL$
1330 Z = 0
1340 PRINT
1350 PRINT " ###############################"
1360 PRINT " # # # #"
1370 PRINT " # # # #"
1380 PRINT " # # # #"
1390 PRINT " # # # #"
1400 PRINT " # # # #"
1410 PRINT " # # # #"
1420 PRINT " ###############################"
1430 PRINT " # # # #"
1440 PRINT " # # # #"
1450 PRINT " # # # #"
1460 PRINT " # # # #"
1470 PRINT " # # # #"
1480 PRINT " # # # #"
1490 PRINT " ###############################"
1500 PRINT " # # # #"
1510 PRINT " # # # #"
1520 PRINT " # # # #"
1530 PRINT " # # # #"
1540 PRINT " # # # #"
1550 PRINT " # # # #"
1560 PRINT " ###############################"
1570 REM PRINT
1580 S1 = INT(RND(1) * 2) + 1
1590 S2 = INT(RND(1) * 2) + 1
1600 S3 = INT(RND(1) * 2) + 1
1610 S4 = INT(RND(1) * 2) + 1
1620 S5 = INT(RND(1) * 2) + 1
1630 S6 = INT(RND(1) * 2) + 1
1640 S7 = INT(RND(1) * 2) + 1
1650 S8 = INT(RND(1) * 2) + 1
1660 S9 = INT(RND(1) * 2) + 1
1670 IF S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8 + S9 = 18 THEN GOTO 1580
1680 X = 6
1690 Y = 3
1700 IF S1 = 1 THEN GOSUB 4190 ELSE GOSUB 4640
1710 X = 16
1720 IF S2 = 1 THEN GOSUB 4240 ELSE GOSUB 4640
1730 X = 26
1740 IF S3 = 1 THEN GOSUB 4290 ELSE GOSUB 4640
1750 X = 6
1760 Y = 10
1770 IF S4 = 1 THEN GOSUB 4340 ELSE GOSUB 4640
1780 X = 16
1790 IF S5 = 1 THEN GOSUB 4390 ELSE GOSUB 4640
1800 X = 26
1810 IF S6 = 1 THEN GOSUB 4440 ELSE GOSUB 4640
1820 X = 6
1830 Y = 17
1840 IF S7 = 1 THEN GOSUB 4490 ELSE GOSUB 4640
1850 X = 16
1860 IF S8 = 1 THEN GOSUB 4540 ELSE GOSUB 4640
1870 X = 26
1880 IF S9 = 1 THEN GOSUB 4590 ELSE GOSUB 4640
1890 K$ = INKEY$
1891 IF K$ = "" THEN 1890 ELSE K=asc(K$)
1892 IF K = 27 THEN PRINT FNCL$: END
1893 IF (K>=49 and K<=57) THEN ON (K-49) GOTO 2010,2050,2090,2130,2170,2210,2250,2290,2330
1990 '
2000 GOTO 1890
2000 GOTO 1890
2010 IF S1 = 2 THEN PRINT CHR$(7); ELSE GOSUB 2370
2020 GOSUB 3570
2030 IF Z <> 0 THEN GOTO 3600
2040 GOTO 1890
2050 IF S2 = 2 THEN PRINT CHR$(7); ELSE GOSUB 2520
2060 GOSUB 3570
2070 IF Z <> 0 THEN GOTO 3600
2080 GOTO 1890
2090 IF S3 = 2 THEN PRINT CHR$(7); ELSE GOSUB 2630
2100 GOSUB 3570
2110 IF Z <> 0 THEN GOTO 3600
2120 GOTO 1890
2130 IF S4 = 2 THEN PRINT CHR$(7); ELSE GOSUB 2780
2140 GOSUB 3570
2150 IF Z <> 0 THEN GOTO 3600
2160 GOTO 1890
2170 IF S5 = 2 THEN PRINT CHR$(7); ELSE GOSUB 2890
2180 GOSUB 3570
2190 IF Z <> 0 THEN GOTO 3600
2200 GOTO 1890
2210 IF S6 = 2 THEN PRINT CHR$(7); ELSE GOSUB 3070
2220 GOSUB 3570
2230 IF Z <> 0 THEN GOTO 3600
2240 GOTO 1890
2250 IF S7 = 2 THEN PRINT CHR$(7); ELSE GOSUB 3180
2260 GOSUB 3570
2270 IF Z <> 0 THEN GOTO 3600
2280 GOTO 1890
2290 IF S8 = 2 THEN PRINT CHR$(7); ELSE GOSUB 3320
2300 GOSUB 3570
2310 IF Z <> 0 THEN GOTO 3600
2320 GOTO 1890
2330 IF S9 = 2 THEN PRINT CHR$(7); ELSE GOSUB 3430
2340 GOSUB 3570
2350 IF Z <> 0 THEN GOTO 3600
2360 GOTO 1890
2370 S1 = 2
2380 IF S2 = 1 THEN S2 = 2 ELSE S2 = 1
2390 IF S4 = 1 THEN S4 = 2 ELSE S4 = 1
2400 IF S5 = 1 THEN S5 = 2 ELSE S5 = 1
2410 X = 6
2420 Y = 3
2430 GOSUB 4640
2440 X = 16
2450 IF S2 = 1 THEN GOSUB 4240 ELSE GOSUB 4640
2460 X = 6
2470 Y = 10
2480 IF S4 = 1 THEN GOSUB 4340 ELSE GOSUB 4640
2490 X = 16
2500 IF S5 = 1 THEN GOSUB 4390 ELSE GOSUB 4640
2510 RETURN
2520 S2 = 2
2530 IF S1 = 1 THEN S1 = 2 ELSE S1 = 1
2540 IF S3 = 1 THEN S3 = 2 ELSE S3 = 1
2550 X = 16
2560 Y = 3
2570 GOSUB 4640
2580 X = 6
2590 IF S1 = 1 THEN GOSUB 4190 ELSE GOSUB 4640
2600 X = 26
2610 IF S3 = 1 THEN GOSUB 4290 ELSE GOSUB 4640
2620 RETURN
2630 S3 = 2
2640 IF S2 = 1 THEN S2 = 2 ELSE S2 = 1
2650 IF S5 = 1 THEN S5 = 2 ELSE S5 = 1
2660 IF S6 = 1 THEN S6 = 2 ELSE S6 = 1
2670 X = 26
2680 Y = 3
2690 GOSUB 4640
2700 X = 16
2710 IF S2 = 1 THEN GOSUB 4240 ELSE GOSUB 4640
2720 X = 16
2730 Y = 10
2740 IF S5 = 1 THEN GOSUB 4390 ELSE GOSUB 4640
2750 X = 26
2760 IF S6 = 1 THEN GOSUB 4440 ELSE GOSUB 4640
2770 RETURN
2780 S4 = 2
2790 IF S1 = 1 THEN S1 = 2 ELSE S1 = 1
2800 IF S7 = 1 THEN S7 = 2 ELSE S7 = 1
2810 X = 6
2820 Y = 10
2830 GOSUB 4640
2840 Y = 3
2850 IF S1 = 1 THEN GOSUB 4190 ELSE GOSUB 4640
2860 Y = 17
2870 IF S7 = 1 THEN GOSUB 4490 ELSE GOSUB 4640
2880 RETURN
2890 S5 = 2
2900 IF S2 = 1 THEN S2 = 2 ELSE S2 = 1
2910 IF S4 = 1 THEN S4 = 2 ELSE S4 = 1
2920 IF S6 = 1 THEN S6 = 2 ELSE S6 = 1
2930 IF S8 = 1 THEN S8 = 2 ELSE S8 = 1
2940 X = 16
2950 Y = 10
2960 GOSUB 4640
2970 Y = 3
2980 IF S2 = 1 THEN GOSUB 4240 ELSE GOSUB 4640
2990 Y = 17
3000 IF S8 = 1 THEN GOSUB 4540 ELSE GOSUB 4640
3010 X = 6
3020 Y = 10
3030 IF S4 = 1 THEN GOSUB 4340 ELSE GOSUB 4640
3040 X = 26
3050 IF S6 = 1 THEN GOSUB 4440 ELSE GOSUB 4640
3060 RETURN
3070 S6 = 2
3080 IF S3 = 1 THEN S3 = 2 ELSE S3 = 1
3090 IF S9 = 1 THEN S9 = 2 ELSE S9 = 1
3100 X = 26
3110 Y = 10
3120 GOSUB 4640
3130 Y = 3
3140 IF S3 = 1 THEN GOSUB 4290 ELSE GOSUB 4640
3150 Y = 17
3160 IF S9 = 1 THEN GOSUB 4590 ELSE GOSUB 4640
3170 RETURN
3180 S7 = 2
3190 IF S4 = 1 THEN S4 = 2 ELSE S4 = 1
3200 IF S5 = 1 THEN S5 = 2 ELSE S5 = 1
3210 IF S8 = 1 THEN S8 = 2 ELSE S8 = 1
3220 X = 6
3230 Y = 17
3240 GOSUB 4640
3250 Y = 10
3260 IF S4 = 1 THEN GOSUB 4340 ELSE GOSUB 4640
3270 X = 16
3280 IF S5 = 1 THEN GOSUB 4390 ELSE GOSUB 4640
3290 Y = 17
3300 IF S8 = 1 THEN GOSUB 4540 ELSE GOSUB 4640
3310 RETURN
3320 S8 = 2
3330 IF S7 = 1 THEN S7 = 2 ELSE S7 = 1
3340 IF S9 = 1 THEN S9 = 2 ELSE S9 = 1
3350 X = 16
3360 Y = 17
3370 GOSUB 4640
3380 X = 6
3390 IF S7 = 1 THEN GOSUB 4490 ELSE GOSUB 4640
3400 X = 26
3410 IF S9 = 1 THEN GOSUB 4590 ELSE GOSUB 4640
3420 RETURN
3430 S9 = 2
3440 IF S5 = 1 THEN S5 = 2 ELSE S5 = 1
3450 IF S6 = 1 THEN S6 = 2 ELSE S6 = 1
3460 IF S8 = 1 THEN S8 = 2 ELSE S8 = 1
3470 X = 26
3480 Y = 17
3490 GOSUB 4640
3500 Y = 10
3510 IF S6 = 1 THEN GOSUB 4440 ELSE GOSUB 4640
3520 X = 16
3530 IF S5 = 1 THEN GOSUB 4390 ELSE GOSUB 4640
3540 Y = 17
3550 IF S8 = 1 THEN GOSUB 4540 ELSE GOSUB 4640
3560 RETURN
3570 IF S1 + S2 + S3 + S4 + S6 + S7 + S8 + S9 = 8 AND S5 = 2 THEN Z = 1
3580 IF S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8 + S9 = 18 THEN Z = 2
3590 RETURN
3600 K$ = INKEY$
3610 IF K$ = "" THEN GOTO 3600
3620 PRINT FNCL$
3630 PRINT
3640 PRINT
3650 PRINT
3660 PRINT
3670 PRINT
3680 PRINT
3690 PRINT
3700 PRINT " ##############################"
3710 PRINT " # #"
3720 PRINT " # #"
3730 PRINT " # #"
3740 PRINT " # #"
3750 PRINT " # #"
3760 PRINT " # #"
3770 PRINT " # #"
3780 PRINT " # #"
3790 PRINT " ##############################"
3800 IF Z = 1 THEN GOSUB 3910
3810 IF Z = 2 THEN GOSUB 3980
3820 K$ = INKEY$
3830 IF K$ = "" THEN GOTO 3820
3840 GOSUB 4050
3850 K$ = INKEY$
3860 IF K$ = CHR$(89) THEN GOTO 1320
3870 IF K$ = CHR$(121) THEN GOTO 1320
3880 IF K$ = CHR$(78) THEN PRINT FNCL$: END
3890 IF K$ = CHR$(110) THEN PRINT FNCL$: END
3900 GOTO 3850
3910 X = 7
3920 Y = 10
3930 PRINT FNL$(X,Y+0);" ## ## ## _##/ _####_ "
3940 PRINT FNL$(X,Y+1);" ## ## ## ## ## ## "
3950 PRINT FNL$(X,Y+2);" ## ## ## ## ## ## "
3960 PRINT FNL$(X,Y+3);" '######' _##/ ## ## "
3970 RETURN
3980 X = 7
3990 Y = 10
4000 PRINT FNL$(X,Y+0);"## _####_ _####_ _####"
4010 PRINT FNL$(X,Y+1);"## ## ## ##___ ##___"
4020 PRINT FNL$(X,Y+2);"## ## ## '''## ##'''"
4030 PRINT FNL$(X,Y+3);"###### '####' '####' '####"
4040 RETURN
4050 X = 7
4060 Y = 9
4070 PRINT FNL$(X,Y+0);"___ _ ___ _ _ _____ ___"
4080 PRINT FNL$(X,Y+1);"# # # #_ '#_#' # _#"
4090 PRINT FNL$(X,Y+2);"# #_# #__ #' '# # _ "
4100 PRINT FNL$(X,Y+3);"_ _ ___ ___ _ ___ _ ___"
4110 PRINT FNL$(X,Y+4);"#__# #_ #__ # # # # # #"
4120 PRINT FNL$(X,Y+5);" _/ #__ __# # # #_# #_#"
4130 RETURN
4140 PRINT FNL$(X,Y+0);"_#####_"
4150 PRINT FNL$(X,Y+1);"## _##"
4160 PRINT FNL$(X,Y+2);"##_' ##"
4170 PRINT FNL$(X,Y+3);"'#####'"
4180 RETURN
4190 PRINT FNL$(X,Y+0);" _## "
4200 PRINT FNL$(X,Y+1);"_#'## "
4210 PRINT FNL$(X,Y+2);"' ## "
4220 PRINT FNL$(X,Y+3);" ######"
4230 RETURN
4240 PRINT FNL$(X,Y+0);"_#####_"
4250 PRINT FNL$(X,Y+1);" __##'"
4260 PRINT FNL$(X,Y+2);"_##'' "
4270 PRINT FNL$(X,Y+3);"#######"
4280 RETURN
4290 PRINT FNL$(X,Y+0);"######_"
4300 PRINT FNL$(X,Y+1);" ___##"
4310 PRINT FNL$(X,Y+2);" '''##"
4320 PRINT FNL$(X,Y+3);"######'"
4330 RETURN
4340 PRINT FNL$(X,Y+0);"_# ## "
4350 PRINT FNL$(X,Y+1);"##__##_"
4360 PRINT FNL$(X,Y+2);"''''##'"
4370 PRINT FNL$(X,Y+3);" ## "
4380 RETURN
4390 PRINT FNL$(X,Y+0);"#######"
4400 PRINT FNL$(X,Y+1);"##____ "
4410 PRINT FNL$(X,Y+2);" ''''##"
4420 PRINT FNL$(X,Y+3);"######'"
4430 RETURN
4440 PRINT FNL$(X,Y+0);"_#####_"
4450 PRINT FNL$(X,Y+1);"##____ "
4460 PRINT FNL$(X,Y+2);"##'''##"
4470 PRINT FNL$(X,Y+3);"'#####'"
4480 RETURN
4490 PRINT FNL$(X,Y+0);"######_"
4500 PRINT FNL$(X,Y+1);" _##'"
4510 PRINT FNL$(X,Y+2);" ##' "
4520 PRINT FNL$(X,Y+3);" ## "
4530 RETURN
4540 PRINT FNL$(X,Y+0);"_#####_"
4550 PRINT FNL$(X,Y+1);"'#___#'"
4560 PRINT FNL$(X,Y+2);"##'''##"
4570 PRINT FNL$(X,Y+3);"'#####'"
4580 RETURN
4590 PRINT FNL$(X,Y+0);"_#####_"
4600 PRINT FNL$(X,Y+1);"##___##"
4610 PRINT FNL$(X,Y+2);" '''###"
4620 PRINT FNL$(X,Y+3);" ####' "
4630 RETURN
4640 PRINT FNL$(X,Y+0);" "
4650 PRINT FNL$(X,Y+1);" "
4660 PRINT FNL$(X,Y+2);" "
4670 PRINT FNL$(X,Y+3);" "
4680 RETURN

yevrowl
19.10.2025, 04:59
axe_chita, ещё раз спасибо за помощь!
Проблема оказалась в «;», которые не расставил где требуется.
Ещё дополнил пользовательскую функцию очистки экрана:


DEF FNCL$ = CHR$(27) + "E" + CHR$(12)

Всё получилось, компилируется под CP/M.

axe_chita
19.10.2025, 15:34
axe_chita, ещё раз спасибо за помощь!
Пожалуйста, рад был помочь.

Проблема оказалась в «;», которые не расставил где требуется.
Бывает

Ещё дополнил пользовательскую функцию очистки экрана:


DEF FNCL$ = CHR$(27) + "E" + CHR$(12)[/QUOTE]
Для MSX это уже излишне, там один единственный CHR$(12) работает без ведущего ESC-кейпа
пруф https://www.msx.org/wiki/MSX_Characters_and_Control_Codes


Всё получилось, компилируется под CP/M.
Если есть желание, могу поделиться компилятором Basic/Z под СР/М, прародителем Борландовского Turbo Basic

yevrowl
20.10.2025, 05:31
Если есть желание, могу поделиться компилятором Basic/Z под СР/М, прародителем Борландовского Turbo Basic

Спасибо, пригодится, особенно если версия новей, чем 1.11 — https://github.com/davidly/cpm_compilers/tree/main/SystemZ%20BASICZ%20v111

Вот каталог компиляторов для CP/M под многие ЯП — https://github.com/davidly/cpm_compilers