Важная информация

User Tag List

Показано с 1 по 4 из 4

Тема: Трактат о X-Basic'е

  1. #1
    Member
    Регистрация
    29.01.2019
    Адрес
    г. Владивосток
    Сообщений
    83
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    14
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Cool Трактат о X-Basic'е

    ASCII X-Basic (он же Kun Basic)

    Стандартный MSX-Basic, имеет очень богатый функционал возможностей, и тем более, позволяет напрямую обращаться к видеопроцессору, для вызова аппаратных функций.
    Тем не менее, он очень медленно интерпретируется, что является его самым главным недостатком.
    Поэтому компания ASCII, решила устранить этот недостаток практически сразу, а именно: в 1986 году, вместе с выходом стандарта MSX2.
    Они не стали изобретать велосипед, и переписывать MSX-Basic (который к слову и так претерпел кардинальные изменения), и решили поступить проще:
    создали реалтаймовый компилятор кода, и расширили стандартный набор команд MSX-Basic'а, командами и опциями управления компилятором.

    Команд всего три:
    Код:
    	_RUN (CALL RUN)
    	_TURBO ON (CALL TURBO ON)
    	_TURBO OFF (CALL TURBO OFF)
    Первая команда, предназначена для запуска всей программы, в режиме компиляции. И если в коде нет не поддерживаемых функций (об этом чуть позже), то программа перед стартом компилируется и запускается. При этом производительность увеличивается на порядки (от 140%-10000%, по оценкам NYYRIKKI)!
    Необходимо сразу отметить, что CTRL-STOP, в этом режиме не обрабатывается, поэтому при отладке, необходимо модифицировать программу так, чтобы она содержала обработчик условного перехода по заранее подготовленным условиям, на выход из программы, в противном случае, программа будет выполнена от начала и до конца.
    И если программа зациклена в бесконечном цикле, то вы из нее никогда не выйдите.

    Вторая и третья команды, предназначены для определения блока в теле программы, который будет компилироваться при выполнении.
    Таким образом, вся программа будет работать в штатном режиме интерпретации, а выделенный блок будет откомпилирован для ускорения вычислений или вывода графики.

    Здесь сразу возникает первое и фундаментальное соглашение синтаксиса:
    Вместе с этими командами ЗАПРЕЩЕНО использовать другие в одной строке программы.
    то есть если используется определение блока компиляции, то блок может быть описан только следующим образом:
    Код:
    	10 _TURBO ON
    	20 ...
    	30 ...
    	90 _TURBO OFF
    	100 END
    Никаких комментариев, операторов через двоеточие, с этими командами использоваться не могут.

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

    Итак:
    1. Переменные внутри блока компиляции имеют внутреннюю область определения.
    Это значит, что они не доступны основной программе и наоборот.
    Например:
    Код:
    	10 A=10: ? A
    	20 _TURBO ON
    	30 ? A
    	40 _TURBO OFF
    	
    Выведет на экран следующий результат:
    Код:
    	10
    	0
    	Ok

    Здесь очевидны несколько вариантов решения проблемы: можно передавать параметры через память или видеопамять, используя POKE/VPOKE (PEEK/VPEEK), не использовать общие пространства определений, либо прибегнуть к способу передачи параметров, которые непосредственно поддерживает сам оператор _TURBO ON
    Код:
    	10 A=10: ? A
    	20 _TURBO ON (A)
    	30 ? A
    	40 _TURBO OFF
    	
    Выведет на экран следующий результат:
    Код:
    	10
    	10
    	Ok
    
    Да, все вот так просто, переменные можно передавать внутрь блока, разделяя имена переменных запятыми,
    а самое главное, что изменение, переданных таким образов переменных, внутри блока компиляции будет происходить глобально.
    Передаваемые переменные должны иметь тип INT, можно так же передавать строковые переменные.
    А еще, точно так же можно передавать и массивы, но здесь вступает в силу еще одно ограничение и соглашение:
    2. Передаваемые массивы внутрь блока компиляции, должны быть определены как Array of Int
    То есть такой код:
    Код:
    	10 DIM A(10)
    	20 _TURBO ON (A())
    	30 ...
    	40 _TURBO OFF

    Выдаст сообщение об ошибке.

    Чтобы правильно определить тип, нужно добавить строку:
    Код:
    	10 DEFINTA
    	20 DIM A(10)
    	30 _TURBO ON (A())
    	40 ...
    	50 _TURBO OFF
    И массив будет передан корректно.

    Ну и теперь, самая смачная ложка дёгтя в этом компоте:
    Не все стандартные операторы MSX-Basic могут быть включены в блок компиляции.

    Вот перечень не поддерживаемых:
    Код:
    AUTO, BASE, BLOAD, BSAVE, CALL, CDBL, CINT, CLEAR, CLOAD, CLOAD?, CLOSE, 
    CONT, CSAVE, CSNG, CVD, CVI, CVS, DEFFN, DELETE, DRAW, DSKF, EOF, ERASE, ERL, 
    ERR, ERROR, EQV, FIELD, FILES, FPOS, FRE, GET, IMP, INPUT#, KEY LIST, LFILES, 
    LINEINPUT#, LIST, LLIST, LOAD, LOC, LOF, LPRINT USING, LSET, MAXFILES, MERGE, 
    MOTOR, MKD$, MKI$, MKS$, NAME, NEW, ON ERROR GOTO, ON INTERVAL GOSUB (due to 
    a bug), OPEN, PLAY, PRINT#, PRINT USING, PUT KANJI, RENUM, RESUME, RSET, 
    SAVE, SPC, TAB, TRON, TROFF, WIDTH.

    Это справедливо для версии X-Basic от 1989 года (Kun-Basic 2.0)
    Как можно заметить, это все операции дискового ввода/вывода, и частично экранного I/O.
    А так же все операторы, которые используют строковый парсер.

    В добавок к этому, следующие команды могут быть использованы с частичными ограничениями:
    Код:
    CIRCLE: Только окружности, никаких дуг или эллипсов.
    COPY: Только пересылки в видеопамяти.
    DEFDBL: То же что и DEFSNG.
    DIM: Должен определяться только вначале программы либо внутри блока компиляции.
    INPUT: Может принимать только одну переменную.
    KEY: Только для ON KEY GOSUB, KEY(n) ON/OFF.
    LOCATE: Обе координаты должны быть определены. Параметр переключения курсора недоступен.
    NEXT: Имя переменной цикла после NEXT не может быть опущено.
    ON: ON STOP GOSUB, ON INTERVAL GOSUB не доступны.
    PRINT: Разделители обрабатываются иначе. Нет выравнивания для цифр.
    PUT: Только PUT SPRITE.
    RUN: Переменные не инициализируются.
    SCREEN: Только номер режима и размер спрайтов.
    SET: Только SET PAGE.
    STOP: Такое же поведение как у END.
    USR: Параметром может быть только Int.
    VARPTR: Дескриптор файла не может быть передан в качестве параметра.

    На первый взгляд, никакой пользы от такой компиляции. Тем не менее, это только первое впечатление от прочитанного!
    К тому же, все эти команды, и команды из первого списка, остаются доступными за пределами блока компиляции.

    В дополнении, с версии 2.0, доступны еще несколько нововведений:
    Код:
    #I - Команда включения INLINE машинного кода в тело программы:
    	100 DEFINT A-Z
    	110 K=1
    	120 '#I &H2A,K
    	130 '#I &HF3,&HCD,@150,&HFB
    	140 END
    	150 'SUB
    	160 RETURN
    Здесь, строки 120 и 130, означают следующее:
    Код:
    LD HL,(K); (где переменная K должна быть типа INT)
    DI  
    CALL @150; (Здесь указан вызов подпрограммы бейсика по адресу строки 150. 
    Строка вызова должна входить в блок компиляции!)
    EI

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

    В качестве полезного примера, приведу такой:
    Так как в графических режимах запрещен вывод текста в блоке компиляции, я написал простой код:
    Код:
    	10 DEFINTA-Z
    	20 SCREEN 7,0,0:COLOR 15,0,0:CLS:PSET(0,0),0,TPSET
    	30 _TURBO ON
    	40 CN=500:TIME=0:A$="New String Here (Нoвая строка хере)"
    	50 X=RND(1)*(512-LEN(A$)*8):Y=RND(1)*200:C=RND(1)*8+8:GOSUB 70
    	60 IF STRIG(0) OR CN=0 GOTO 120 ELSE CN=CN-1:GOTO 50
    	70 ' SUB Put_String(a$,x,y,c)
    	80 COLOR C:PRESET(X,Y):FOR I=1 TO LEN(A$):K=ASC(MID$(A$,I,1))
    	90 '#I &h3A,K
    	100 '#I &HCD,&H8D,&H00
    	110 NEXT I:RETURN
    	120 SCREEN 0:PRINTTIME/60;" Seconds"
    	130 _TURBO OFF
    	140 END
    Подпрограмма вывода строк находится по адресам: 70-110 (Выделено зеленым цветом).
    Код выводит в рандомных координатах (с учетом длины строки), 500 строк рандомным цветом на экран,
    с логической операцией TPSET (вывод только ненулевых пикселей),и считает время вывода.
    Ярким синим выделен оператор PSET вначале, чтобы показать, что переопределение логики вывода, так же должно находиться за блоком компиляции, ввиду того, что переменная MSX-Basic'a, которая хранит логику вывода, изменяется только в своей области видимости.
    Очевидно, что можно писать в эту переменную напрямую по адресу, но я не помню ее адрес

    Аналогичная программа в штатном бейсике выглядит так:
    Код:
    	10 DEFINTA-Z:SCREEN 7,0,0:COLOR 15,0,0:CLS:CN=500:TIME=0
    	20 OPEN"grp:" FOR OUTPUT AS#1:A$="New String Here (Нoвая строка хере)"
    	30 X=RND(1)*(512-LEN(A$)*8):Y=RND(1)*200:C=RND(1)*8+8:GOSUB 50
    	40 IF STRIG(0) OR CN=0 GOTO 80 ELSE CN=CN-1:GOTO 30
    	50 ' SUB Put_String(a$,x,y,c)
    	60 COLOR C,0:PRESET(X,Y),0,TPSET
    	70 PRINT#1, A$:RETURN
    	80 SCREEN 0:PRINT INT(TIME/60);" Seconds"
    	90 END
    Здесь подпрограмма находится по адресам 50-70, красным выделены запрещенные операторы в X-Basic.

    Сравним время вывода 500 строк на экран?
    Вывод штатными графическими средствами MSX-Basic 2.1: 128.66 секунд
    Вывод машинным кодом в блоке компиляции X-Basic 2.1: 84.17 секунд
    (ради эксперимента, проверил так же подпрограмму, где весь цикл вывода строки написан в кодах, получил доп.выигрыш +3 секунды)

    Ну и как вам такое? При этом код на X-Basic'е занял меньше памяти!

    Оставшиеся две опции управления блоком компиляции такие:
    Код:
    #C - Опция включает/отключает графический клипер.
    Доступно в режимах 5-8 (кроме операторов PAINT, и CIRCLE).
    
    	10 SCREEN 8
    	20 '#C-
    	30 LINE(0,0)-(255,255) 'Y CLIPPED
    	40 IF INKEY$="" THEN 40
    	50 '#C+
    	60 LINE(0,0)-(255,255) 'NOT CLIPPED
    	70 IF INKEY$="" THEN 70
    Код:
    #N - Опция включает/отключает проверку переполнения переменной условия:
    
    	10 FOR I%=0 TO &H7FFF
    	20 NEXT I%


    В штатном MSX-Basic, такой цикл выдаст ошибку переполнения. И если включить его в блок компиляции, то такой цикл становится бесконечным.
    Если указана опция #N+, то проверка будет выполнена, и цикл отработает корректно.
    Это несомненно снижает эффективность кода, и поэтому лучше не использовать эту опцию, кроме тех случаев, когда это действительно необходимо.
    Опция #N-, отключает проверку.

    Взять ROM Kun-Basic-2.1 можно на http://www.planetemu.net
    Существует BIN - версия, но я ее не держу в арсенале, и 2.1 в таком виде не видел.

    Меня самого, шокировало прежде всего то, что я ничего не знал о таком великолепном инструменте в свое время,
    а когда проверил быстродействие то и вовсе был сражен наповал!

    В заключении, хочу добавить, что если внутри блока компиляции стоит переход на несуществующую строку, то при запуске вы получите сообщение об ошибке, что какая-то строка не найдена, но вот где, и какая конкретно - придется искать, потому что компилятор не видит номера строк.
    И последнее: при использовании компилятора, объем используемой памяти сильно расходуется.
    Так например передача параметров, увеличивает требуемую область данных, а в среднем доступно около 10кб для кода.

    Эти недостатки были устранены в следующем, еще более мощном инструменте, созданном Нестором Сориано (Nestor Soriano),
    который тотально расширил возможности X-Basic'а, просто взгляните на них:
    Access to all the mapped memory available on the computer (all the free memory when using DOS 2), up to 4 Mb.
    Full access to VRAM, including data blocks exchange between RAM and VRAM.
    BASIC programs storage in mapped memory, it is possible to switch from one to another without losing the existing variables.
    Disk files and sectors access, it is possible to directly read/write to/from mapped memory and VRAM. File searching, directories management.
    Graphic compression/decompresion.
    MoonBlaster music replay. Samplekit and wavekit load.
    PSG sound effects replay.
    Machine code routines execution; routines placed in BIOS, in a mapped memory segment or in BASIC main memory (including system work area) can be executed directly or using interrupts.
    NestorMan functions, InterNestor Suite and InterNestor Lite routines execution.
    Nestor-Basic from Nestor Soriano
    Таким образом Nestor-Basic, это развитие Kun-Basic'a, в котором появилась возможность создавать программы, не ограниченные объемом штатного MSX-Basic'а, а код можно вызывать из других слотов и даже видеопамяти!
    Плейеры MoonBlaster и PSG, полноценные низкоуровневые дисковые операции, компрессор/декомпрессор графики, и многое другое!

    Надеюсь у вас уже зачесались руки, проверить все описанное выше в действии.
    А если нет, добавлю сюда еще примеров моих извращений над бейсиком, которые красноречиво показывают, насколько X-Basic, делает MSX-Basic круче:

    1. Standart MSX2 Basic v2.1



    2. MSX2 Basic v2.1 + X-Basic-2.1 extention:



    На обоих видео один и тот же код, только во втором, добавлены команды определения блока компиляции.

    И последний показательный пример:


    В котором я взял файл PSG, запихуил его в видеопамять, и проиграл, тем самым оценив всю непревзойденную мощь X-Basic-2.1.

    Успешных начинаний, всех с наступившей весной!
    Вложения Вложения
    Последний раз редактировалось Dolphin101546015; 04.03.2021 в 15:06. Причина: Обновление ссылок
    Yamaha YIS-503-IIIR КУВТ2 (MSX2 + MSX2+ / X-Basic 2.1 MOD)
    MSX-Basic, z80 Assembler, C/C++ samples on YouTube, created by Dolphin_Soft

  2. Этот пользователь поблагодарил Dolphin101546015 за это полезное сообщение:

    GreyWolf (10.04.2020)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Member
    Регистрация
    15.06.2010
    Адрес
    г. Чита
    Сообщений
    48
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    8
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А еще есть компилятор SOLiD Basic от Егора Вознесенского, светлой ему памяти, который вообще генерировал COM файлы для MSXDOS.

    SOLiD VBasic, version 2.7
    =========================

    Here it goes, a BASIC compiler for MSXDOS.
    This version must be considered a wide public beta,
    and it contains some bugs that are listed below.

    RUNNING
    --------------------------------------
    To use the compiler you must have:
    a) compiler itself;
    b) library files: bk.rel, basend.rel and ilib.irl
    c) AS assembler and LD linker
    All the stuff can be downloaded from SOLiD home page
    at http://www.glasnet.ru/~msxegor/msx.html

    To compile your program, save it in ASCII format
    as a <filename>.BAS (note BAS extension) and then
    type the following command:

    BAS <filename>

    (note NO extension)
    If no errors occur, you will get <filename>.COM
    MSDOS executive.


    LANGUAGE
    --------------------------------------
    Supported features:
    + MSX-2 BASIC, file in ASCII format.
    + Some of MSX-2+ BASIC features like set scroll
    + WHILE/WEND extension
    + LOOP WHILE/UNTIL extension

    Unsupported features:
    + LOAD/SAVE,CLOAD/CSAVE,MERGE and BLOAD/BSAVE (except for BLOAD,S) commands
    + ERASE not supported and causes error
    + Arrays must be defined once, with constant length.
    + CLEAR works differently; only string variables cleared
    + X commands of play and draw macro languages not supported
    + Maximum two-dimensioned arrays supported (sorry for this one)
    + RESUSME without parametres may cause errors (or may not, this depends)
    + Vaiables of same names and different types not supported

    Other differences
    + RUN executes DOS COM file
    + DEFINT A-Z by default!
    + Lines may NOT be numbered
    + (maybe something else, I don't remember)


    KNOWN BUGS
    ---------------------------------
    This version of compiler and libraries was written for a very
    tignt configuration. This is not portable, I know, but it was
    written in the times when the very single MSX architecture in
    Russia (USSR back then) was Yamaha MSX.
    The programs are written to be fast, using direct hardware
    access where possible. This mapy cause troubles when running
    on systems much different from Yamaha. In opposite, most
    Philips MSX users will probably NOT face any troubles at all.

    Bug list follows:
    + RST30 used to call BIOS in libraries. May cause troubles
    on MSXes with RAM in extended slot 0 (Daewoo)
    + Direct slot switching in float point routines. May cause
    problems on computers with SUB-ROM in extended slot 0
    + Some library routines may occasionaly cause trouble with
    DOS 2.


    DISCLAIMER
    ----------------------------------
    This program is PUBLIC DOMAIN BETA.
    Feel free to report bugs and suggestions to Egor VOZNESSENSKI,
    the autor, at msxegor@glasnet.ru
    If I get enough responce, I shall produce a new, enhanced
    version, as well as good documentation in english.

    Home page:
    http://www.glasnet.ru/~msxegor
    
    И мне кажется что я видел руководство программиста по SOLiD Basic, когда искал документацию по MISIX. Надо будет поискать её.

  5. #3
    Member Аватар для John Warner
    Регистрация
    02.10.2017
    Адрес
    с. Усть-Камышта, Хакасия
    Сообщений
    40
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ССылки из поста про SOLiD Basic дохлые.
    Сибиряк безгранично любит свою угрюмую природу; он черпает в ней силу. ©М.Б.Аксѣльродъ
    Моя машина - YAMAHA MSX2 YIS503III КУВТ2 full stock

  6. #4
    Member
    Регистрация
    15.06.2010
    Адрес
    г. Чита
    Сообщений
    48
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    8
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от John Warner Посмотреть сообщение
    ССылки из поста про SOLiD Basic дохлые.
    Ссылки из оригинальной документации. Конечно уже нет ни домашней страницы, ни даже самого провайдера, но Solid Basic жив https://www.msx.org/downloads/solid-vbasic

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Mega Basic
    от Smalovsky в разделе Программирование
    Ответов: 121
    Последнее: 05.04.2021, 17:03
  2. Basic прерывания
    от Bedazzle в разделе Программирование
    Ответов: 14
    Последнее: 22.08.2016, 21:27
  3. MCS-52 BASIC
    от alm604 в разделе Для начинающих
    Ответов: 0
    Последнее: 25.01.2016, 10:01
  4. laser basic
    от johnny в разделе Программирование
    Ответов: 32
    Последнее: 17.02.2014, 22:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •