сделал.
сделал.
Обновил версию до 0.907 в первом посте.
Исходник 0.907 выложил тут.
сделал.
сделал.
Обновил версию до 0.907 в первом посте.
Исходник 0.907 выложил тут.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спасибо за наводку! Проверю. Официально команда должна быть sub n, посмотрю в исходнике, так ли она генерируется.
- - - Добавлено - - -
Сделаю, как написал. Я еще так не делал никогда.
- - - Добавлено - - -
Исходник забыл обновить на сайте, исправлюсь
- - - Добавлено - - -
ЗдОрово. Я тоже на нем начал писать игру а-ля Z.
Не могу обещать пока, т.к. занят написанием игры сейчас. Собстно, и хочу проверить, реально ли написать серьезную игру на подобно-Паскале.![]()
Andrew771, интересный проект.
Почему вы решили компилировать в ассемблерный текст, который затем ещё раз надо компилировать? Не проще ли сразу генерировать исполняемый код?
Ваш подход может помочь только в одном случае, если программист захочет доработать ваши процедуры или заменить их на свои.
Компромиссный вариант: В зависимости от флага (галка/параметр командной строки либо директива компилятора) генерировать ассемблерный код как сейчас, или сразу исполняемый код.
И ещё предложение ввести директиву компилятора {$ORG xxxxx}, указывающую по какому адресу компилировать исполняемый код.
- - - Добавлено - - -
И думаете ли об оптимизации? Например, в циклах вставлять тело процедур вместо вызовов процедур. Это полезно, если вызываемые процедуры небольшие, а сам цикл выполняется много раз, тогда программа будет гораздо быстрее исполняться.
Уважаемые,
хотя я не пользуюсь данным компилятором, я за развитие в сторону канонического Borland Turbo Pascal, поэтому в своё время и советовал Андрею взять в исходниках компилятор Turbo Pascal v3.0 для Z80 и начать его развивать, но он пошёл по своему пути. Что же, это его решение и выбор. Но вообще молодец, здорово, что проект продвигается, респект.
Можно было бы. Только тогда надо забыть о пользовательских процедурах на ассемблере, иначе мне придется еще писать и кросс-ассемблер.В принципе, насколько я знаю, можно сделать BAT-ник, в котором две команды:
- кросс-компиляция Паскаля в Асм (это ZX Like Pascal умеет);
- запуск кросс-ассемблера (например, sjasm) и подсовывание ему асмовского файла.
Знающие люди, надеюсь, напишут тут, как это сделать.
В отдаленном будущем планируется сделать родной (не кросс) Паскаль для Спектрума. Причем да, более приближенный к оригинальному Паскалю. Тем более, это позволит компилировать исходник компилятора самим компилятором, как учит Н.Вирт. Не на ассемблере же его писать.
Оптимизации многие есть. А вот раскрытие циклов не стал делать, т.к. посчитал, что для вывода спрайтов достаточно встроенных моих процедур (там раскрытие циклов сделано уже в асмовском коде), а для остального вроде и не надо + отжирает память.
По-видимому, придется. Т.к. изобретать велосипед - неблагодарное дело. Просто, это мой первый блин COM-ом, хотел сам написать, чтоб прочувствовать. На самом деле, это нелегко написать полноценный компилятор, подтверждение тому - постоянно всплывающие баги, так что лучше пользоваться наработками опытных. Я до сих пор не могу сделать поддержку хотя бы параметров процедур - головоломка. Кстати, пробовал брать полный исходник Оберона из книги Вирта "Построение компиляторов" и переделать на Паскаль, но пока тоже не осилил.
- - - Добавлено - - -
Моя статья по генерации кода и оптимизациям ZX Like Pascal есть тут или тут
Andrew771, а что с ORG? Если его надо менять, то батником не обойтись. Хочется одну вещь попробовать сделать, но адрес мне другой нужен. Удобно, если в паскалевском исходнике уже указано куда компилировать, а не менять в ASM каждый раз.
- - - Добавлено - - -
И ещё пожелание менять расширение. Т.е., из "program.prg" делать "program.asm".
- - - Добавлено - - -
Ну там гораздо легче - одна строка преобразуется в одну команду.![]()
Ты имеешь в виду первоначальный адрес паскалевской программы или чтобы можно было в любом месте вставить ORG несколько раз? Если хочешь вставить в свои асмовские процедуры после последнего END Паскаля, то смело можешь вставлять, кросс-ассемблер правильно скомпилирует. А если внутри паскалевского кода, то зачем? Сделать мне не трудно.
- - - Добавлено - - -
Это - пережиток от первой версии, когда быстро набросал, всё руки не доходят.
- - - Добавлено - - -
Это уже не буду делать, т.к. ухудшит быстродействие. Пусть будет на совести программиста ошибочный счетчик. У меня много где нет "защиты от дурака" - например, проверки выхода за границы массивов, строк. Проверка границ спрайтов - опционально по флагу. Просто, если делать проверки, ухудшит быстродействие.
- - - Добавлено - - -
Больше второе - поиграться. Особенно хочется создать самокомпилируемый компилятор. В ZX Like Pascal для этого не хватает всего лишь малость - процедуры с параметрами и локальными переменными. Тогда можно будет сделать нативный ZX Like Pascal на ZX Like Pascalе.![]()
После твоего компилятора получается ASM с первой командой "org 23900", вот чтобы его менять можно было из исходного PRG файла. Например, чтобы до первого begin поставить директиву {$ORG xxxxx} и чтобы это потом оказалось в ASM файле. А в середине паскалевской программы даже не знаю, надо ли это...
Есть ещё третий вариант - выводить не ассемблерный код, а уже скомпилированный, но в виде релоцируемого объектного модуля. Разумней всего в формате .rel от SDCC.
Тогда к нему можно будет прилинковывать ассемблерные вставки, собранные SDCC-шным же ассемблером.
Но вообще нет ничего странного в том, чтобы получать на выходе компилятора асмовый исходник. Более того, практически все компиляторы, которые я встречал, работали именно так. Вот прямо начиная с HITech C для CP/M и заканчивая gcc и clang. Просто у современных компиляторов этап ассемблирования скрыт.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)