Как написать компилятор Бейсика для Dendy?
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 19.10.24 11:42
Оценка:
Решил попробовать сабж, это должно быть интересным проектом, увлекательной задачей для ума, да и любителям блогера Кинамана, ретроигр и эмуляторов была бы интересна подобная программа.
В идеале хотелось бы полноценный игровой конструктор уровня Game Maker, с редактором спрайтов, тайлов и музыки и конструированием уровней мышкой, но для начала ограничился просто Бейсиком.
Сам Бейсик будет максимально приближен к Sinclair Basic (на ZX Spectrum), MSX BASIC и QBASIC, планируются встроенные команды для спрайтов и тайлов, циклы, модули, процедуры и функции, но не будет записей/структур (только массивы, строки и целые числа, последние и для логических операций как в Си).

Для лучшего понимания — архитектура компьютера NES/Famicom и его клонов.

Процессор: 8-битный Ricoh 2A03, совместимый с MOS 6502 (не поддерживаются двоично-десятичные числа), содержит также контроллер DMA в кристалле
ОЗУ: 2 КБ (на картриджах может быть дополнительно до 48 КБ)
ПЗУ: 8 КБ на картриджах (с маппингом может быть более 64 КБ)
Видеокарта: PPU с поддержкой до 256 тайлов (символов 8x8 цветного шрифта с пикселями из 3 цветов), 64 цветными спрайтами (8x8 или 8x16) и палитрой 48 цветов (по 3 цвета на каждый спрайт или тайл)
Видеопамять: 2/4 КБ (с аппаратным скроллингом 4-экранной тайловой карты 64x56)
Разрешение экрана: 256x224 (NTSC) или 256x240 (PAL/SECAM)

Как архитектурно может быть устроен подобный компилятор? Я выбрал такую схему:
1) лексический анализатор читает исходники, пропускает комментарии, разбивает текст на токены — ключевые слова, строки, числа (читается файл главного модуля и другие модули, импортируемые в нем);
2) семантический анализатор получает наборы токенов (для каждого файла модуля), строит по ним единое AST;
3) дерево AST обрабатывается препроцессором, основанным на мини-Лиспе для оптимизации, выкидывания ненужных имен и конструкций, замены деления на 2 сдвигами, хвостовой рекурсии циклами и т.д.;
4) результатом прероцессора будет шитый код как на Форте, где все данные кладутся в стек и вызываются функции для их обработки (вроде программы на Форте особо не тормозили, по быстродействию были сравнимы с Си и Фортраном);
5) далее уже шитый код можно преобразовать в нативный, т.е. инструкции процессора 6502 для Донди.

Или слишком избыточно, и можно что-то упростить? За годы Java энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Отредактировано 19.10.2024 12:42 Worminator X . Предыдущая версия .
Re: Как написать компилятор Бейсика для Dendy?
От: Философ Ад http://vk.com/id10256428
Дата: 19.10.24 12:50
Оценка: +1
Здравствуйте, Worminator X, Вы писали:

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


Ищешь чем себя занять?
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Как написать компилятор Бейсика для Dendy?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 19.10.24 16:18
Оценка: +1
Здравствуйте, Worminator X, Вы писали:

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


Неужто всё, где еще можно было бы применить ум, уже сделано?
Re: Как написать компилятор Бейсика для Dendy?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 20.10.24 07:02
Оценка:
Здравствуйте, Worminator X, Вы писали:

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


Я ещё помню свой опыт с Агатами. Там тот же 6502. Ну, очень занудно, если посмотреть с современной точки зрения.

Главное — процессор очень дешёвый (почему и получил офигенное распространение), зато очень неблагодарный. Три 8-битных регистра плюс "нулевая страница", не использовать которую нельзя, если хочешь получить хотя бы косвенную адресацию, но при этом её половина использована не как регистры, а как глобальные переменные и постоянно боишься, что наступишь на чьё-то уже занятое место.

В общем, я лично бы не стал это повторять. Но это таки последствия того, что я с этим возился и всё помню.

WX>Сам Бейсик будет максимально приближен к Sinclair Basic (на ZX Spectrum), MSX BASIC и QBASIC, планируются встроенные команды для спрайтов и тайлов, циклы, модули, процедуры и функции, но не будет записей/структур (только массивы, строки и целые числа, последние и для логических операций как в Си).


Бейсик для Apple II был в двух вариантах — INT (без поддержки вещественных), влезал в его ПЗУ, и FP (с такой поддержкой), надо было уже грузить с дискеты. Я сейчас быстро не нашёл, сколько занимал тот Бейсик в ПЗУ, но по идее в 4KB должен был влезть. Набор возможностей как раз примерно такой.

В сети полно ресурсов по нему, даже код есть с расшифровкой.

Разумеется, это всё интерпретаторы.

WX>Как архитектурно может быть устроен подобный компилятор? Я выбрал такую схему:

WX>1) лексический анализатор читает исходники, пропускает комментарии, разбивает текст на токены — ключевые слова, строки, числа (читается файл главного модуля и другие модули, импортируемые в нем);
WX>2) семантический анализатор получает наборы токенов (для каждого файла модуля), строит по ним единое AST;
WX>3) дерево AST обрабатывается препроцессором, основанным на мини-Лиспе для оптимизации, выкидывания ненужных имен и конструкций, замены деления на 2 сдвигами, хвостовой рекурсии циклами и т.д.;
WX>4) результатом прероцессора будет шитый код как на Форте, где все данные кладутся в стек и вызываются функции для их обработки

Не уверен, что влезет в доступное ПЗУ. Но можете попробовать, конечно.

WX> (вроде программы на Форте особо не тормозили, по быстродействию были сравнимы с Си и Фортраном);


Ну да — потому что

1) Уровень оптимизации в компиляторах в те времена был ничтожно малым по сравнению с сейчас, можно было и на Форте обогнать.
2) Отсутствие out-of-order execution и прочего ну очень современного в процессорах не давало коду, сделанному в оптимальном стиле, разогнаться.

WX>5) далее уже шитый код можно преобразовать в нативный, т.е. инструкции процессора 6502 для Донди.

WX>Или слишком избыточно, и можно что-то упростить? За годы Java энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.

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

Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.
The God is real, unless declared integer.
Re[2]: Как написать компилятор Бейсика для Dendy?
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 20.10.24 21:24
Оценка:
Здравствуйте, netch80, Вы писали:

Видимо, не совсем ясно выразился. Имеется в виду создание кросскомпилятора (с перспективой превращения в IDE), который будет работать на Windows/Linux и выдавать при компиляции .NES файл (формат iNES Марата Файзуллина), который можно в дальнейшем запускать на эмуляторах или реальной приставке, записав на флеш-картридж.

N>Бейсик для Apple II был в двух вариантах — INT (без поддержки вещественных), влезал в его ПЗУ, и FP (с такой поддержкой), надо было уже грузить с дискеты. Я сейчас быстро не нашёл, сколько занимал тот Бейсик в ПЗУ, но по идее в 4KB должен был влезть. Набор возможностей как раз примерно такой.


N>В сети полно ресурсов по нему, даже код есть с расшифровкой.


Спасибо, буду гуглить. Интересно, как там реализованы математические операции (в частности, деление чисел) и работа с кучей (создание/удаление строк). От вещественных чисел тоже решил отказаться. Главное, чтобы можно было делать игры, а синусы-косинусы (для поворотов, например) можно при желании сделать через таблицы.

N>Но я бы начал таки с создания интерпретатора в современном стиле кодирования и затем уже перешёл к компилятору. Иначе по частям будет слишком путано это делать.


Думаю, что как раз интерпретатор и не влезет в 4 КБ. У Билла Гейтса и Пола Аллена не вышло, не считаю себя гениальнее их.

N>Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.


Вообще была версия Famicom с клавиатурой и Бейсиком. Китайский клон SUBOR завозили к нам и даже русифицировали:



Но у меня планируется запускать только конечный результат компиляции.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Re[2]: Как написать компилятор Бейсика для Dendy?
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 20.10.24 21:31
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Ищешь чем себя занять?


Надоело кажый день перекладывать JSON'ы и разбираться в настройках Spring'овых стартеров. Это техножречество, а душа жаждет творчества. Для демосцены не хватает художественных навыков, вот выбрал то, что близко и понятно.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Re[3]: Как написать компилятор Бейсика для Dendy?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 21.10.24 07:35
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Видимо, не совсем ясно выразился. Имеется в виду создание кросскомпилятора (с перспективой превращения в IDE), который будет работать на Windows/Linux и выдавать при компиляции .NES файл (формат iNES Марата Файзуллина), который можно в дальнейшем запускать на эмуляторах или реальной приставке, записав на флеш-картридж.


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

WX>Спасибо, буду гуглить. Интересно, как там реализованы математические операции (в частности, деление чисел) и работа с кучей (создание/удаление строк).


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

WX> От вещественных чисел тоже решил отказаться. Главное, чтобы можно было делать игры, а синусы-косинусы (для поворотов, например) можно при желании сделать через таблицы.


Да, где-то так и делают.

N>>Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.


Ну если компилятор извне, то эта моя реплика не к месту.

WX>Но у меня планируется запускать только конечный результат компиляции.


Ага.
The God is real, unless declared integer.
Re[3]: Как написать компилятор Бейсика для Dendy?
От: alpha21264 СССР  
Дата: 22.10.24 11:04
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Думаю, что как раз интерпретатор и не влезет в 4 КБ. У Билла Гейтса и Пола Аллена не вышло, не считаю себя гениальнее их.


А зачем тебе влезать ы 4 Кб? У тебя же нет ограничений физической машины.
Сделай то же самое, только без ограничений тридцатилетней давности.
То есть, виртуальную машину с "экраном" с прямым доступом к пикселям,
и с памятью в современные 4 Гигабайта (да, регистры 32 разряда).
Без Винды, виртуальной памяти и всего остального современного маразма.
И играйся в "принца Персии", или во что ты хочешь играться.

Течёт вода Кубань-реки куда велят большевики.
Re[3]: Как написать компилятор Бейсика для Dendy?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 22.10.24 11:14
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Надоело кажый день перекладывать JSON'ы и разбираться в настройках Spring'овых стартеров. Это техножречество, а душа жаждет творчества.


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

Но, если главная задача — просто убедиться в собственных способностях, а не принести реальную пользу, то можно и Бейсик...
Re[4]: Как написать компилятор Бейсика для Dendy?
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 27.10.24 16:11
Оценка:
Здравствуйте, netch80, Вы писали:

N>Деление тупейшее сдвигом и вычитанием, хотя записать можно достаточно оптимально.


Можно на каком-нибудь примере? Или хотя бы название алгоритма, чтобы загуглить. С умножением все просто, заменять его на двоичные сдвиги умели еще русские крестьяне и египетские жрецы. А вот с целочисленным делением не могу сообразить. Как раз сейчас застрял на арифметических операциях.

Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Re[4]: Как написать компилятор Бейсика для Dendy?
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 27.10.24 16:19
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть до хренища реальных задач под любые современные системы. Та же разумная программа ведения заметок и составления личной БД, которую многие ищут уже много лет, но находят либо что-то убогое, либо навороченное до тошноты.


С органайзерами проблема в том, что у всех к ним разные требования. Кому-то нужна возможность рисовать, кому-то календарь, кому-то синхронизация на разных устройствах и хранение данных в облаке...
Простейшая программа для текстовых заметок уровня Sticky Notes легко пишется хоть на Java, хоть на Си, у меня такая есть.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Re: Как написать компилятор Бейсика для Dendy?
От: sergey2b ЮАР  
Дата: 27.10.24 16:42
Оценка:
Здравствуйте, Worminator X, Вы писали:

you can find listing of Apple II plus ROM
Re[5]: Как написать компилятор Бейсика для Dendy?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 29.10.24 12:33
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Здравствуйте, netch80, Вы писали:


N>>Деление тупейшее сдвигом и вычитанием, хотя записать можно достаточно оптимально.


WX>Можно на каком-нибудь примере? Или хотя бы название алгоритма, чтобы загуглить.


Просто restoring division, хотя под этим именем чаще понимают аппаратную реализацию. Или schoolbook division. Фактически там примерно такое:

unsigned remainder = dividend;
unsigned quotient = 0;
unsigned temp_divisor = divisor << MAX_SHIFT;
for (step = 0; step < MAX_SHIFT; ++step) {
  quotient <<= 1;
  if (remainder >= temp_divisor) { remainder -= temp_divisor; ++quotient; }
  temp_divisor >>= 1;
}


Но это хорошая форма для процессора, где не нужно ужиматься в 8 бит. А то, что я имел в виду, что видел где-то очень компактный вариант именно для 6502, но уже не помню детали.
The God is real, unless declared integer.
Отредактировано 29.10.2024 19:26 netch80 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.