Уважаемым собеседникам удалось возбудить во мне интерес так, что я задумал и запилил свой собственный Бейсик!
За основу взял Altair BASIC 3.2 4K - прародителя почти всех классических бейсиков (Бейсик Агат, РК-86, "Микрон", Микроша, Специалист, Вектор и т.д. - но не Синклер!). Опираясь на дизассемблер (http://altairbasic.org/), реализовал алгоритмы на C99.
- Портируемо. Можно запускать как на PC, так и на почти любом микроконтроллере.
- Компактно. Около 12К кода на STM32F4.
- Быстро. На частоте STM32F412 @ 1MHz дает в тестах Rugg/Feldman лучшие результаты, чем большинство классических бейсиков.
- Нет привязки к железу или ОС. Интегрируется в проекты - доступна функция исполнения команды. Ввод-вывод также перенаправляется куда угодно - хоть на консоль, хоть в последовательный порт, хоть в TCP/IP, хоть в файл.
- Объектно-ориентировано. Состояние интерпретатора и его память могут выделяться пользователем хоть на стеке, хоть статически, хоть динамически. Можно иметь и исполнять несколько бейсиков одновременно.
- Ограниченное использование машинного стека. Не используется рекурсия.
- Ограниченное использование ОЗУ. Используется только область, выделенная пользователем. В любой ситуации переполнение ОЗУ обрабатывается путем останова программы по ошибке.
- Не используется malloc. Нет проблем с неожиданной нехваткой памяти, фрагментацией кучи, блокировками, связанными с кучей.
- Не требует блокировок (Mutex и т.п.). Может использоваться в системах реального времени. При исполнении тестов воспроизводимость результатов до 1мс.
- Протестировано. В проект входит набор разнообразных тестов на ~1600 строк кода.
- Старался делать код высокого качества. Варнингов от компилятора GCC при стандартных настройках нет.
Набор функций на данный момент довольно ограничен (нет строк, нет двумерных массивов), но есть потенциал для расширения, конечно. И главное - "минимальный стандарт" реализован полностью.
Исходники на https://github.com/mborisov1/uc-basic
Conan (05.01.2024), creator (05.01.2024), parallelno (06.01.2024)
Ну чё. Бармалей крут!
Barmaley_m (05.01.2024)
Спасибо. В общем, желающие могут пользоваться проектом. Конкретно здесь хочу выразить благодарность всем участникам обсуждения в этой ветке. Именно здесь подсказали про тесты Rugg/Feldman, и вообще было высказано много хороших идей, которые легли в этот проект.
Куда двигать его дальше - пока думаю. Исходно в планах было довести функционал до Altair BASIC 8K (а там строковые переменные, LEFT$, RIGHT$, многомерные массивы, больше свободы с именами переменных и др.). Но комментированный дизассемблер 8К-бейсика найти не удалось. Можно было бы продизассемблировать Бейсик "Микрон" с РК-86, например. По структуре он должен во многом повторять оригинал (Altair 4K), там даже баги одни и те же, я проверял по ходу разработки.
Так что, если у кого-нибудь есть желание помочь с дизассемблированием и попутно изучить один из самых компактных и мощных классических бейсиков эры 70-80х - буду благодарен!
Кстати. В Altair BASIC используются ассемблерные трюки, которых я никогда не встречал в мире ZX Spectrum. Подучился у Билла Гейтса, что называется! Вот один пример.
Допустим, есть 2 точки входа в процедуру, для одной из них регистр A должен быть равен 0, а для другой - не нулю. Билл Гейтс и Пол Аллен делают это так:
Что получается: при вызове точки entry исполняется команда OR с ненулевым агрументом - после ее исполнения в аккумуляторе окажется ненулевое число; кроме того, будет сброшен флаг Z. Если же вызвать entry+1 - то аргумент двухбайтовой команды OR исполнится как команда - в данном случае AF = XOR A. То есть в аккумулятор будет загружен нуль, и установится флаг Z.Код:entry: or 0AFh ;do something ret use_entry_1: call entry ;... use_entry_2: call entry+1 ;...
И подобных мест в Altair BASIC много. Там часто используются трехбайтовые команды вида LD BC, nnnn, для пропуска последующих двух байт кода, если значение регистра BC впоследствии неважно. Еще для пропуска двух байт используются команды условного перехода вида JP M, nnnn, если условие перехода заведомо не соблюдается.
Conan (05.01.2024)
Barmaley_m (05.01.2024)
Очень интересный проект. Причем не только с технической точки зрения. Мало кто догадывается о том, что вы начали делать то, что почти случилось более сорока лет назад на ZX-ах. И наш спектрумовский мир был бы чуток другим. Нельзя сказать хуже или лучше, но точно другим. Спойлерить не буду, когда доделаю 1981 год истории - узнаете.
Думаю, что спектрумистам было бы интересно потестировать ваш бейсик на эмуляторах или реалах. Поэтому ожидаю (надеюсь) на .tap или .trd с небольшим readme. В идеале конечно же .bin увидеть, вместо оригинального)))
И пара вопросов: размеры 12Кбайт это только для STM-ки? Можно ли ожидать уменьшения объема на простых 8-ми битных платформах?
Сколько часов (дней/ночей) ушло на текущую версию?
Наверно, кто-то задумывал портировать на них Microsoft BASIC?
Мой бейсик не предназначен для исполнения на Z80 (иначе было бы больше смысла запрограммировать его на ассемблере, а не Си). К тому же, C-версия где-то заточена под 32-битную архитектуру процессора. Даже если удастся скомпилировать под Z80 - то скорость вряд ли будет приемлемой.
Но на любом компе с виндой или линуксом тестировать - без проблем. В проект включены файлы проекта Eclipse CDT. Скачиваете и ставите Eclipse, открываете проект, выбираете конфигурацию Debug или Release - и в путь! Для винды может потребоваться в конфигурации проекта заменить Builder с Linux GCC на MinGW GCC.
Это для STM-ки, и очень приблизительно. Это разность размеров проекта с вызовом функции basic_main_interactive_prompt() и без него. Но подтягивается не только сам бейсик. Подтягивается еще и printf() с выводом дробных чисел, а она сама по себе тяжелая.
Вообще преобразование чисел с плавающей запятой между двоичной и десятичной формами - трудная задача. Та функция преобразования из текста в float, что включена в интерпретатор - я ее поставил, скрепя сердце, переведя оригинальную процедуру Altair BASIC с ассемблера на Си. По крайней мере, удалось сохранить ту точность, что была. Но так вообще преобразование неточное. Я пытался сделать лучше, но понял, что точное преобразование (до ближайшего представимого float-числа) можно реализовать только с применением длинной арифметики (MPI). Хотя у меня и есть соответствующая библиотека (https://github.com/mborisov1/rsa_embedded), решил пока не заморачиваться, чтобы выпустить проект быстрее.
Ну и обратное преобразование для печати на экран - там те же проблемы, точный алгоритм сложен и громоздок. Пока применяю стандартную библиотеку Си, а там видно будет. Вот уж кто их придумал, эти десятичные числа...
Не знаю. С одной стороны, плотность кода у Z80 выше. Но требуется хороший компилятор, а с ними на Z80 напряженка, как я слышал. Кроме того, Си-код бейсика рассчитан на 32-битную архитектуру процессора. На 8 битах будет неэффективно. Если требуется компактный бейсик на Z80 - то проще портировать Altair или Microsoft BASIC прямо, не уходя от ассемблера. Тем более, что процессор совместимый.
Первый коммит в свой (неопубликованный) репозиторий я сделал 19 ноября 2023. Где-то 3-4 вечера в неделю уделял проекту. Всего сделано 110 коммитов. Под новогодние каникулы - каждый день помногу. Сколько часов... Ну, по грубым прикидкам, полмесяца полной занятости. Может, 3/4. И плюс еще время фоновых размышлений, когда за компом непосредственно не сидел.
В общем, нормальный такой проект, не слишком большой, но и не слишком маленький. Может быть, дойдут руки допилить его до функционала 8K BASIC. Или даже расширения сделать для возможности управления железом. Может получиться неплохой "старт-пакет" для начинающих программистов на микроконтроллерах. Ведь чем хорош бейсик - можно исполнять команды в интерактивном режиме, чередуя их с кусками программы. И нет опасности, что система завалится - по ошибке вылетит, и все. Если программа зависнет - есть кнопка Break. В "железном" проекте на Nucleo-F412 как раз задействовал для этого кнопку на плате.
Последний раз редактировалось Barmaley_m; 05.01.2024 в 18:06.
да уж явно проще, хоть потому, что их тупо меньше в несколько раз, чем токенов
- - - Добавлено - - -
а что, "совсем одинаковые"?
нет, "на порядки" - это значит, "больше, чем на один порядок"
"на один порядок" - это в десять раз, итого "на порядки" = "не менее, чем в сто раз"
сделал заявление - докажи, остальное - пустословие и юление
а вот вывод, что главная причина - встроенный форт, из этой ссылки совершенно неочевиден
как будто бы производство аппаратов со встроенным бейсиком так не сворачивали
только вот "не урывками" мало прочитать, надо бы еще и понять... а теперь внимание, вопрос на понимание:
о чем нам может говорить крупным шрифтом "SPECIAL DEAL" по распродаже неликвидов "WHILE STOCKS LAST"?
неужто о том, что цены из него можно сравнивать с официальными ценами на старте спека-16?
или всё же было бы честно поискать такой же SPECIAL для него?
угу, столь же очевидное, как и то, что огурцы смертельно опасны, потому что все, кто их ел в 19 веке - умерли!
простите, то есть любитель наставительно устраивать тут ЛИКБЕЗЫ - слыхом не слыхал про PCjr?
Прихожу без разрешения, сею смерть и разрушение...
Адекватные люди уже давно назвали вещи своими именами, и на английском и на русском: "TS1000 был по сути слегка модифицированной версией Sinclair ZX81", поэтому софистика:не интересна от слова совсем.
ваше личноенепонимание выражения "на порядок" это к школьному учителю или словарю. Число произведенных ZX81 на октябрь 1982 года уже приводилось по ссылке. Вычесть 100 тыс. ZX80 сможете самостоятельно (надеюсь не запутаетесь).
вам может и не очевиден, а разработчикам Jupiter Ace и авторам статьи очевиден. Нужно лишь дочитать буквы по вашей же ссылке до конца:
Викерс попытался переключить внимание компании с компьютерных энтузиастов на образовательный рынок. Но дети хотели изучать Basic, а не Forth со своеобразным синтаксисом "Обратной польской нотации", в котором операнды ставились первыми, операторы - после.
"Ричард и я оба инженеры, и мы подумали, что Forth - правильное решение для того, что мы пытались создать. И, выражаясь инженерным языком, мы достигли этого. Но с точки зрения маркетинга, я думаю, мы, вероятно, были немного наивны. Оглядываясь назад, мы продали компьютеры нескольким сотням энтузиастов Forth, и все ".
Вот это особо улыбнуло:То есть, когда вы пишете про обмен на Commodore, то распродажные цены Timex вас устраивают, а в случае с Jupiter Ace: "неужто можно сравнивать"
Ставить в один ряд компьютеры начала 80-х (ZX81 - 1981 год) и середины 80-х (IBM PCjr - 1984 год), да еще находящиеся в разных ценовых категориях (ZX81 - $90 против PCjr - $1269) - натягивание тульского кренделя. Но допустим, что это "почти одинаковые" недорогие домашние компьютеры начала 80-х
И снова ЛИКБЕЗ:
IBM PCjr поставлялась с IBM PC DOS 2.10:Даже в IBM PCjr (компьютере другого класса и сегмента рынка) Бейсик не "выкинули из ПЗУ", а лишь перенесли в состав дисковой операционной системы. Кстати, не подскажете по какой причине?DOS версии 2.1 для персонального компьютера IBM размещена на двух дискетах. Дискеты также содержат интерпретатор BASIC для Disk BASIC и Advanced BASIC
"адекватные люди" + ссыль на строчку в педивикии (без источников)
не говоря уж о том, что "слегка" - субъективное нечёткое оценочное суждение
как по мне, так изменение одной из ключевых характеристик вдвое - это "значительно"
мде, с логикой проблема - если "к школьному учителю", то не личное
да и с арифметикой далее (что неудивительно после логики)
Мало ли кому тоам что "очевидно". Мне вот очевиднее, что большинство детишек играть хотело, и потому на первом месте для них были аппаратные характеристики, а не языки в пзу. В мое детство мы и вовсе на безрыбье были рады и ПМК (чсх с обратной польской записью, никого она тогда не пугала) - тоже, в основном, поиграть. Вышел бы юпитер пораньше, как ZX8x - и намного популярнее оказался бы.
А вот тут надо бы не улыбаться без причины, а морщить лоб - чтоб понять, что эти цены приведены как пример, чего реально стоил комп с такими характеристиками на один, вполне определённый период. В который примерно период, по совпадению, вышел также аналогично слабый аппаратно юпитер - и совсем не по распродажной таймексовской цене.
Во-первых, в ряд вообще "домашних компьютеров", во-вторых, не я туда поставил, а IBM, а в-третьих, кое-кто тут ставит в один ряд компы почти одинаковой цены, но совсем неравных характеристик, вот уж где натягивание кондитерских изделий-то настоящее
нет, "и снова ФЕЙЛ" а вот теперь с моей стороны ЛИКБЕЗ никуда Бейсик из пзу в pcjr не "переносили", он как был в пзу прошитым, так и остался. Более того, к нему выпущен был уникальный специальный бейсик на картридже с учётом особенностей компа и доступом к расширенным возможностям аппаратным. А вот бейсик на дискете был стандартным писишным, ничего о тех особенностях не знавшим. Не говоря уж о том, что на внешних свободно копируемых носителях любой комп мог обзаводиться любым яву.
Но вот только почему-то за коротким периодом первоначального успеха фирменные айбиэмовские компики с бейсиками в пзу не взлетели. А клоны несмотря на отсутствие встроенного бейсика - взлетели. И притом взлетели даже в домашней нише, для которой, вроде, были не предназначены. Подсказать, по какой причине? Потому что были надёжнее, дешевле и/или мощнее за те же деньги. А не потому что "дети очевидно хотели бейсик"
Прихожу без разрешения, сею смерть и разрушение...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)