Решил попробовать сабж, это должно быть интересным проектом, увлекательной задачей для ума, да и любителям блогера Кинамана, ретроигр и эмуляторов была бы интересна подобная программа.
В идеале хотелось бы полноценный игровой конструктор уровня 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 энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Здравствуйте, 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 энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.
Да нет, выглядит вроде адекватно.
Но я бы начал таки с создания интерпретатора в современном стиле кодирования и затем уже перешёл к компилятору. Иначе по частям будет слишком путано это делать.
Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.
Видимо, не совсем ясно выразился. Имеется в виду создание кросскомпилятора (с перспективой превращения в IDE), который будет работать на Windows/Linux и выдавать при компиляции .NES файл (формат iNES Марата Файзуллина), который можно в дальнейшем запускать на эмуляторах или реальной приставке, записав на флеш-картридж.
N>Бейсик для Apple II был в двух вариантах — INT (без поддержки вещественных), влезал в его ПЗУ, и FP (с такой поддержкой), надо было уже грузить с дискеты. Я сейчас быстро не нашёл, сколько занимал тот Бейсик в ПЗУ, но по идее в 4KB должен был влезть. Набор возможностей как раз примерно такой.
N>В сети полно ресурсов по нему, даже код есть с расшифровкой.
Спасибо, буду гуглить. Интересно, как там реализованы математические операции (в частности, деление чисел) и работа с кучей (создание/удаление строк). От вещественных чисел тоже решил отказаться. Главное, чтобы можно было делать игры, а синусы-косинусы (для поворотов, например) можно при желании сделать через таблицы.
N>Но я бы начал таки с создания интерпретатора в современном стиле кодирования и затем уже перешёл к компилятору. Иначе по частям будет слишком путано это делать.
Думаю, что как раз интерпретатор и не влезет в 4 КБ. У Билла Гейтса и Пола Аллена не вышло, не считаю себя гениальнее их.
N>Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.
Вообще была версия Famicom с клавиатурой и Бейсиком. Китайский клон SUBOR завозили к нам и даже русифицировали:
Но у меня планируется запускать только конечный результат компиляции.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Здравствуйте, Философ, Вы писали:
Ф>Ищешь чем себя занять?
Надоело кажый день перекладывать JSON'ы и разбираться в настройках Spring'овых стартеров. Это техножречество, а душа жаждет творчества. Для демосцены не хватает художественных навыков, вот выбрал то, что близко и понятно.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Здравствуйте, Worminator X, Вы писали:
WX>Видимо, не совсем ясно выразился. Имеется в виду создание кросскомпилятора (с перспективой превращения в IDE), который будет работать на Windows/Linux и выдавать при компиляции .NES файл (формат iNES Марата Файзуллина), который можно в дальнейшем запускать на эмуляторах или реальной приставке, записав на флеш-картридж.
Тогда, да, у вас существенных ограничений не будет. Кроме собственно кривости процессора. Фактически в нём только и делаешь что дёргаешь память через адреса в нулевой странице.
WX>Спасибо, буду гуглить. Интересно, как там реализованы математические операции (в частности, деление чисел) и работа с кучей (создание/удаление строк).
Деление тупейшее сдвигом и вычитанием, хотя записать можно достаточно оптимально. Но для задачи типа видеоигры надо думать уровнем повыше, чтобы делений вообще было поменьше. Это не мой вывод, а сводка от читанных про разработку в те времена статей.
WX> От вещественных чисел тоже решил отказаться. Главное, чтобы можно было делать игры, а синусы-косинусы (для поворотов, например) можно при желании сделать через таблицы.
Да, где-то так и делают.
N>>Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.
Ну если компилятор извне, то эта моя реплика не к месту.
WX>Но у меня планируется запускать только конечный результат компиляции.
Здравствуйте, Worminator X, Вы писали:
WX>Думаю, что как раз интерпретатор и не влезет в 4 КБ. У Билла Гейтса и Пола Аллена не вышло, не считаю себя гениальнее их.
А зачем тебе влезать ы 4 Кб? У тебя же нет ограничений физической машины.
Сделай то же самое, только без ограничений тридцатилетней давности.
То есть, виртуальную машину с "экраном" с прямым доступом к пикселям,
и с памятью в современные 4 Гигабайта (да, регистры 32 разряда).
Без Винды, виртуальной памяти и всего остального современного маразма.
И играйся в "принца Персии", или во что ты хочешь играться.
Здравствуйте, Worminator X, Вы писали:
WX>Надоело кажый день перекладывать JSON'ы и разбираться в настройках Spring'овых стартеров. Это техножречество, а душа жаждет творчества.
Есть до хренища реальных задач под любые современные системы. Та же разумная программа ведения заметок и составления личной БД, которую многие ищут уже много лет, но находят либо что-то убогое, либо навороченное до тошноты.
Но, если главная задача — просто убедиться в собственных способностях, а не принести реальную пользу, то можно и Бейсик...
Здравствуйте, netch80, Вы писали:
N>Деление тупейшее сдвигом и вычитанием, хотя записать можно достаточно оптимально.
Можно на каком-нибудь примере? Или хотя бы название алгоритма, чтобы загуглить. С умножением все просто, заменять его на двоичные сдвиги умели еще русские крестьяне и египетские жрецы. А вот с целочисленным делением не могу сообразить. Как раз сейчас застрял на арифметических операциях.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть до хренища реальных задач под любые современные системы. Та же разумная программа ведения заметок и составления личной БД, которую многие ищут уже много лет, но находят либо что-то убогое, либо навороченное до тошноты.
С органайзерами проблема в том, что у всех к ним разные требования. Кому-то нужна возможность рисовать, кому-то календарь, кому-то синхронизация на разных устройствах и хранение данных в облаке...
Простейшая программа для текстовых заметок уровня Sticky Notes легко пишется хоть на Java, хоть на Си, у меня такая есть.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова
Здравствуйте, Worminator X, Вы писали:
WX>Здравствуйте, netch80, Вы писали:
N>>Деление тупейшее сдвигом и вычитанием, хотя записать можно достаточно оптимально.
WX>Можно на каком-нибудь примере? Или хотя бы название алгоритма, чтобы загуглить.
Просто restoring division, хотя под этим именем чаще понимают аппаратную реализацию. Или schoolbook division. Фактически там примерно такое:
Но это хорошая форма для процессора, где не нужно ужиматься в 8 бит. А то, что я имел в виду, что видел где-то очень компактный вариант именно для 6502, но уже не помню детали.