Retrolang
Retrolang — это мой собственный SDK для PlayStation 1 и одноименный язык программирования, разработанные с полного нуля без зависимости от стороннего ПО. Комплект включает компилятор, ассемблер, дизассемблер, систему автоматизации сборки, небольшую стандартную библиотеку и набор демонстраций ее использования. Проект является результатом 10 с лишним лет изучения системного программирования.
https://github.com/gecko0307/retrolang
Язык
Retrolang — очень простой C-подобный процедурный язык, специально разработанный для выполнения программ в условиях крайне ограниченного объема памяти. Поддерживает базовые целочисленные типы int, short, char, uint, ushort, uchar, void, а также указатели на них. Поддерживается приведение типов. Поддерживаются статические массивы, строки, структуры. Реализованы все основные арифметические, логические и побитовые операторы, кроме тернарного. Операторы потока управления: if/else, while, do—while, for, break, continue, return.
Пример программы:
void main()
{
bios_a(0x3F, "Hello, World!\n");
}
В отличие от C, Retrolang реализует некоторые низкоуровневые возможности PlayStation в виде интринсиков — встроенных инструкций компилятора, которые разворачиваются не в обычные вызовы, а специальные блоки машинного кода. Это позволяет использовать функции BIOS и команды GTE без необходимости написания частей программы на языке ассемблера. Например, следующий код загружает в контрольные регистры GTE вектор смещения:
gte_ctc2(GTE_TRX, tx);
gte_ctc2(GTE_TRY, ty);
gte_ctc2(GTE_TRZ, tz);
См. также раздел PlayStation с полезной информацией по разработке для консоли.