Просмотр полной версии : ZX Like Pascal
Не пойму что на счёт указателя на стэк в коде, сформировавшемся через паскаль.
Или у него дефолтное значение. Или в каждой процедурке задаётся своё.
Эндрю мож чё подскажет по этому поводу.
- - - Добавлено - - -
Достаточно ли будет в самом начале программы влепить ld SP, допустим 45000?
Пробовал ld sp,32768 в начале программы влепить, тоже не помогло.
- - - Добавлено - - -
:v2_dizzy_messed: видимо, придётся остаться на нищебродских 48к
- - - Добавлено - - -
Может ли быть так, что в компилятор EmuZwin лажает по части порта #7FFD ?
- - - Добавлено - - -
Проблема была вот в чём
virt_screen_high указывал 192
Но банка же начинается с нуля, а в процедуре спрайтов был оффсет на #4000 реального экрана.
Так что virt_screen_high = 192-64 надо было. Воть.
Ещё бы определиться, куда зеркальные спрайты запихать. В 128к ещё более тесно, чем в 48к :p
Andrew771
05.06.2020, 22:43
После компиляции ЯВУ подправил addr_virt_screen
Код:
...
virt_screen_high equ 160
addr_virt_screen equ #C000
table_mirror_high equ 251
...
В итоге чёрный экран, и через мгновение прога ресетится.
Все три значения нужно поменять (пересчитать) для #C000. Третье значение - старший байт для таблицы зеркальных байтов. Эта таблица 256 байт - идет сразу после виртуального экрана, если используются зеркальные спрайты. Если зеркальные спрайты не используются, то таблица не компилируется, не нужна.
Не пойму что на счёт указателя на стэк в коде, сформировавшемся через паскаль.
Или у него дефолтное значение. Или в каждой процедурке задаётся своё.
Эндрю мож чё подскажет по этому поводу.
- - - Добавлено - - -
Достаточно ли будет в самом начале программы влепить ld SP, допустим 45000?
У SP дефолтное значение.
Как я понимаю, достаточно. Только опять же в 128к нужно смотреть, чтоб банк не переключался со стеком, или отслеживать внимательно.
- - - Добавлено - - -
После каждой компиляции редактировать придётся.
Это можно как-то перенастроить, не пересобирая утилиту на делфях?
в Дельфи лезть не обязательно.Достаточно подредактировать файл библиотек libasm.lib - это обычный текстовый файл с ассемблерными процедурами.
Кодо-генерация на уровне бейсика походу.
Добавил пару условий - килобайта как не бывало.
А условий ещё нужно втулить огромное количество. Сначала переживал, что для заставки места не хватит. Терь переживаю, что даже для банальных скриптов маловато будет
Andrew771
08.06.2020, 22:24
можь текст добавил первый, шрифт подгрузился?
Так-то нормально должно быть, не килобайт точно :)
Почему-то XOR в виртуальном экране оставляет мусор если дважды в одном и том же месте рисовать спрайт (тогда как по логике он должен его полностью очищать).
Также мусор вылазит, когда богоподобный старославянский и богомерзкий пиндосянский текст находятся в одном сообщении. Это можно как-то побороть?
https://sun2.43222.userapi.com/E5MB_P3UFvv1q9kCYgLbjG57UnoQgnCTJi5hnA/MGEpqatW1l0.jpg
Andrew771
14.06.2020, 22:45
Про текст не понял, что не так.
XOR посмотрю.
Про текст не понял, что не так.
В первом окошке интерфейса на скрине каракуля появляется когда в одной строке находится инглиш и русишь.
Хотя не исключено, что это где-то мой локальный косяк.
Andrew771
23.06.2020, 14:52
В первом окошке интерфейса на скрине каракуля появляется когда в одной строке находится инглиш и русишь.
Я не вижу там каракуль. Шрифт 4х8, так что особо не порисуешь изгибы, некоторые буквы касаются друг друга.
А такая конструкция точно должна работать?
Я про остаток от деления.
aliceframe:=aliceframe+1;
if aliceframe%2=0 then
SpritePutClear(DMG,0,alice_x,alice_y)
else SpritePutClear(DMG,1,alice_x,alice_y);
Я конечно в курсе, что в других ЯП пашет. Но конкретно в ЗХ-паскале чего-то не выходит.
- - - Добавлено - - -
почему-то aliceframe%2 никогда не равно 0.
- - - Добавлено - - -
Я не вижу там каракуль. Шрифт 4х8, так что особо не порисуешь изгибы, некоторые буквы касаются друг друга.
к шрифту претензий у меня и не было.
почему-то aliceframe%2 никогда не равно 0.
А если в скобки взять? Может там приоритет у операции взятия остатка неправильный и работает как aliceframe%(2=0)
Хотел разъяснить ещё такую вещь.
Я жахнул заставку тупо в лоб в org 4000H, к примеру. Массив данных картинки находится в
как указать компилятору точку входа в рабочую программу?
А то выходит так, что после компиляции пикча на экране появляется на мгновение, а затем комп ресетится.
- - - Добавлено - - -
или это надо после компиляции паскаля добавлять отдельно, как в случае с музыкой...
- - - Добавлено - - -
А, всё. Не досмотрел. После данных пикчи оставалось пару меток основной программы.
Надо было таки швырнуть пикчу в самый конец листинга.
Andrew771
16.08.2020, 22:13
Заставку лучше делать отдельно и сохранять отдельным файлом.
Я в EmuZWin делаю тапок игры так:
1. Выбираешь в меню File/Record and Save Tape as..., это запуск виртуального магнитофона. Выбираешь имя файла TAP. Магнитофон запущен, постоянно в ожидании, и при запуске команд Save из Бейсика пишет в себя, пока не выберешь команду меню File/Stop recording/playing. На магнитофон нужно записать Бейсик-загрузчик, загрузочный экран и кодовый блок с игрой, как на реальный магнитофон.
2. Пишешь Бейсик-загрузчик на Бейсике типа 10 LOAD""SCREEN$: LOAD""CODE: RANDOMIZE USR XXX и сохраняешь командой из Бейсика SAVE"name"LINE10
3. Нужно как-то в память по какому-либо адресу XXX загнать загрузочную картинку. Потом сохранить ее командой SAVE"name"CODE XXX,6912
4. Компилируешь асм в ассемлере EmuZWin, но не запускаешь. Сохраняешь кодовый блок командой SAVE"name"CODE XXX,YYY (XXX - адрес начала блока, YYY - длина блока)
5. Выключаешь магнитофон командой File/Stop recording/playing.
Файл TAP готов.
nimdasys_inbox_ru
19.08.2020, 17:59
Andrew771, скажите пожалуйста... имеется ли уже какая-либо игрушка созданная с помощью Вашего SDK ?!
Вроде "Железнодорожный магнат" на этой СДК.
nimdasys_inbox_ru
19.08.2020, 20:38
Вроде "Железнодорожный магнат" на этой СДК.
А есть ли ссылочка ?!
А есть ли ссылочка ?!
https://zx-pk.ru/threads/27906-russian-railway-magnat-(demo).html
Andrew771
19.08.2020, 23:18
А есть ли ссылочка ?!
Готовая игра здесь: https://zx-pk.ru/threads/31770-russian-railway-magnate.html
Еще есть демо игры Z: https://zx-pk.ru/threads/262-strategii-realnogo-vremeni-na-zx-spectrum.html?p=963214&viewfull=1#post963214
Ее я сейчас пишу.
Исходники их обеих есть в дистрибутиве Паскаля.
Dart Alver
23.08.2020, 11:19
ZX Like Pascal – кросс-компилятор языка программирования Паскаль для компьютера ZX Spectrum. Имеет усеченную версию по сравнению с классическим Паскалем
Э... настолько усечённую что нельзя даже библиотеки подгружать или я просто не понял как это делать ? Если да, то эт нонсенс требующий исправления.
После последнего END программы на Паскале в файле PRG могут записываться процедуры на Ассемблере, коды спрайтов, карт и другая информация. Она без изменения копируется в файл ASM.
Если без изменения копируется, то что мешает вставить оператор подгрузки ассемблерного кода внутри процедуры или описания (например include из файла, хотя прямой ассемблерный код был бы предпочтительнее ) ? Для библиотек очень даже было бы неплохо.
Andrew771
23.08.2020, 21:54
В любом месте Паскаль-программы можешь вызывать оператор asm(имя_процедуры), который вызовет процедуру на ассемблере. Процедура пишется после последнего END программы на Паскале. После выполнения asm-овской процедуры управление переходит к следующему оператору Паскаля.
В процедуре на асме можешь творить всё, что угодно, оно без изменения перенесется в файл asm.
Dart Alver
23.08.2020, 23:31
Процедура пишется после последнего END программы на Паскале. После выполнения asm-овской процедуры управление переходит к следующему оператору Паскаля.
Иногда ассемблерный код нужен не в конце программы, которая перевалит за #C000 а например вначале.
И как насчет подгрузки текстов для самого паскаля, аля библиотеки процедур, а то всё в одном файле, как-то ...
И как насчет подгрузки текстов для самого паскаля, аля библиотеки процедур, а то всё в одном файле, как-то ...
Андрев771 ведь с самого начала дал понять, что модернизацией СДК заниматься не намерен, если хочется доработок - есть исходник на Делфях.
Andrew771
24.08.2020, 17:38
Андрев771 ведь с самого начала дал понять, что модернизацией СДК заниматься не намерен, если хочется доработок - есть исходник на Делфях.
Почему это? Паскаль я периодически дорабатываю, все предложения принимаются и рассматриваются. Это ты с законченными нашими играми перепутал :)
Иногда ассемблерный код нужен не в конце программы, которая перевалит за #C000 а например вначале.
И как насчет подгрузки текстов для самого паскаля, аля библиотеки процедур, а то всё в одном файле, как-то ...
Для асмовских процедур в файле PRG можешь расставлять любое количество ORG-ов с любыми адресами, в том числе меньше, чем у Паскаль-программы (только тогда рассчитай, чтобы они не заехали на Паскаль). Они все без изменения перенесутся в файл ASM.
Или тебе надо саму Паскаль-программу дробить по разным адресам?
- - - Добавлено - - -
В одном файле PRG удобнее и экономичнее держать Паскаль+Асм, лишнего не подцепишь, а также искать легко :)
Dart Alver
25.08.2020, 01:02
Для асмовских процедур в файле PRG можешь расставлять любое количество ORG-ов с любыми адресами, в том числе меньше, чем у Паскаль-программы (только тогда рассчитай, чтобы они не заехали на Паскаль)
А, ну да, точно про такой костыль не подумал. Но всё же возможность встраивать asm непосредственно в тело паскаля думаю было бы полезно. Даже подозреваю что это не особо сложно сделать, достаточно обработки пары тегов - для начала ассемблерного кода и для окончания. А чтобы не спутать тег окончания с командами для ассемблера лучше заточить его под asm-комент типа ;endasm или похожее.
Или тебе надо саму Паскаль-программу дробить по разным адресам?
Об этом не думал, но в принципе достаточно интересная идея. Вообще идеально было бы выделять области памяти которые будут обходить мимо процедуры и данные паскаля, но сомневаюсь что на данный момент это реально.
В одном файле PRG удобнее и экономичнее держать Паскаль+Асм, лишнего не подцепишь, а также искать легко
Не согласен. Дело конечно предпочтений, но когда программа насчитывает хренову кучу процедур, чтобы дотянуться до которых надо перелистать туда-сюда кучу десятков (а то и сотни) строк это уже не легко )) Я бы предпочёл создавать некое количество небольших файлов подключаемых в основную программу в которых легче ориентироваться.
Разбивка на модули нужна. А то на ctrl+F уже мозоли натëр.
Ещë бы добавить флаг выбора рендеринга в виртуальный / реальный экран. Именно не перед компиляцией, а чтоб была такая возможность во время исполнения программы.
+ наличие spr_lib процедур было бы весьма кстати.
Andrew771
25.08.2020, 21:45
А, ну да, точно про такой костыль не подумал. Но всё же возможность встраивать asm непосредственно в тело паскаля думаю было бы полезно.
Ну это всё ж не костыль. Ты же в файле исходника PRG всё-равно пишешь асмовские процедуры и коды спрайтов, заодно и ORG-и вставляешь.
Команду asm с кодом внутри Паскаля вставлю, я тоже о ней думал, удобно. Можно заодно читать сразу паскалевские переменные (это и сейчас можно), вставляешь знак подчеркивания и заглавными буквами имя переменной или константы (например, если в Паскале задана переменная zx123, то ее можно вызвать в своей процедуре по имени _ZX123).
Об этом не думал, но в принципе достаточно интересная идея. Вообще идеально было бы выделять области памяти которые будут обходить мимо процедуры и данные паскаля, но сомневаюсь что на данный момент это реально.
Это реально, достаточно придумать оператор Паскаля ORG address, который можно вставлять в любом месте Паскаля. Впрочем, можно его вставлять и внутри asm/endasm.
Не согласен. Дело конечно предпочтений, но когда программа насчитывает хренову кучу процедур, чтобы дотянуться до которых надо перелистать туда-сюда кучу десятков (а то и сотни) строк это уже не легко )) Я бы предпочёл создавать некое количество небольших файлов подключаемых в основную программу в которых легче ориентироваться.
Разбивка на модули нужна. А то на ctrl+F уже мозоли натëр.
Ещë бы добавить флаг выбора рендеринга в виртуальный / реальный экран. Именно не перед компиляцией, а чтоб была такая возможность во время исполнения программы.
+ наличие spr_lib процедур было бы весьма кстати.
возьму на карандаш :)
Dart Alver
25.08.2020, 23:43
Вообще идеально было бы выделять области памяти которые будут обходить мимо процедуры и данные паскаля, но сомневаюсь что на данный момент это реально.
Это реально, достаточно придумать оператор Паскаля ORG address, который можно вставлять в любом месте Паскаля. Впрочем, можно его вставлять и внутри asm/endasm.
Нет это немного другое, но то о чём я говорил это действительно малореально и чезчур геморно )) Смысл в выделении областей запрещенных для компиляции кодов/переменных паскаля. Т.е. транслятор при достижении адреса начала области ставит переход на адрес за её пределами. Проблема реализации такой фичи в том, что паскаль всего-лишь транслирует коды в ассемблер и если для трансляции паскалевских процедур ещё с грехом пополам можно использовать счетчик использованной памяти, хотя тоже повозится надо, то при ассемблерных вставках (тем более если ассемблер со своими изворотами) всё летит нафиг.
Но ORG-шки для паскаля это тоже очень даже неплохая вещь.
Ну если уж наглеть, то пока Andrew771 карандаш не положил )) Мысль насчёт того чтоб создать возможность обьявляя переменную/массив при необходимости задавать её/его физический адрес. Хотя может оно уже есть, только я не вкурил ?
Ещё одна рекомендация по дальнейшему апгрейду касаемо спрайтов - зеркальные спрайты указывать не отдельной ф-цией, а передавать в качестве флага одного из аргументов ф-ции.
Почему так? Вот на данный момент мне на каждую фазу анимации надо выполнять проверку if dir = 1 then SpritePutClear () else SpritePutMirrorClear ()
Код получается громоздким. Тогда как при передаче через аргумент достаточно SpritePutClear (...,1/0). Ну и такой подход обычно во всех адекватных SDK.
Andrew771
06.09.2020, 00:07
Меня это тоже бесит на реальных проектах. Это первое, что я сделаю, как будет время - одна команда sprite для всех видов и типов спрайтов. А также думаю над единой адресацией всех спрайтов, чтобы не делать под каждый спрайт свою команду.
SlashNet
26.09.2021, 14:37
ZX Like Pascal венгры портировали на Videoton TVC: https://github.com/nacsasoft/Lazarus---TVC
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot