Ага, а ещё процедуры с параметрами, локальные переменные, структуры-записи (record), типы longint/longword...
Ага, а ещё процедуры с параметрами, локальные переменные, структуры-записи (record), типы longint/longword...
Встроеная процедура Asm. У полного Паскаля уже есть такое зарезервированное слово.
Да и по смыслу тоже как-то название не подходит. Может заменить, пока не поздно, на USR или CALL... или ещё что-то такое. CALL_USR ASM_CALL.
Оно-же сразу четыре выгоды даст.
1 Человек не спутается.
2 Парсер расцветки синтаксиса не спутается.
3 ЛайкПаскаль можно развивать до такой степени, что таки будет реализован правитьный ASM...END/
4 Код написаный в ЛайкПаскале проще будет адаптировать для полноценного Паскаля. (Например, если автор игры захочет повторить её на ПиСи)
Bolt(15.10.2019)
Я этот самый ORG специально и прописал, чтоб данная процедура находилась по адресу 40000. Да и оно не пересекалось с музоном.ALKO, проверь, когда ты вставлял SCROLL, из сторонней библиотеки, не прихватил-ли ты случайно ORG
Оператор ORG устанавливает, куда дальше, будет компилироваться ассемблер. Как правило ORG нужен только один, в начале программы. И только в особых случаях он нужен ещё где-то.
Просто сотри лишний. Пусть всё компилируется по порядку.
- - - Добавлено - - -
Reobne, я там в письме указал, не знаю, дошло ли, или может в спам попало. Карочь, Ваша процедурка скролла работает с моей программой, но видимо стек засирается c каждым новым вызовом, из-за чего на тайлах пола с каждым циклом всё больше и больше каши образуется.
Как побороть сей баг?
- - - Добавлено - - -
ПАРДОН! Отбой!
Проблема решилась командой Halt перед вызовом функции. Терь всё ч0тка.
- - - Добавлено - - -
капееетссс![]()
В Горбатого вселилась сега. Это уже контра-хард-корпс какой-то.
Последний раз редактировалось ALKO; 15.10.2019 в 20:51.
Andrew771(15.10.2019), Oleg N. Cher(15.10.2019), ZX_NOVOSIB(15.10.2019)
Сейчас реализовано в bat-нике. Можешь свой bat-файл написать с флагами. Подробности в справочном файле.
А вообще, да, лучше бы в код паскалевский вставить.
Я думаю сократить флаги - сделать только "атрибуты да/нет" и "виртуальный экран да/нет". А то много флагов может путать, хоть и тонкая настройка.
- - - Добавлено - - -
longint сейчас использую в своей пишущейся игре Russian Railway Magnate в виде асмовских процедур. А в Паскаль встроить думаю как, чтобы не перейти на 32 бит
Процедуры с параметрами и локальные переменные в планах есть, т.к. хочу сделать нативный Паскаль, а без них никак.
- - - Добавлено - - -
вот это, ИМХО, самое правильное. Оттуда и процедурку можно будет вызвать обычным асмовским call.
- - - Добавлено - - -
ALKO, музыка появилась?![]()
Я кажись понял. Твоя процедура скроллинга использует прерывания, и музыка тоже. Нужно что-то с этим делать.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
halt - это ожидание прерывания. Не поможет.
- - - Добавлено - - -
скорее всего, после скроллинга сразу же вызывать музон в этой же процедуре. DI, EI не трогать.
ALKO, Письмо дошло, я просто торможу. Изучаю ЛайкПаскаль. Подожди маленько, я изучу и перепишу POP-PUSH-SCROLL, чтобы был ещё немного побыстрее, и без лишнего кода, как сейчас.
Так вот, про прерывания. Посмотрел.
Программа твоя не трогает прерывания, и всё работает в бейсиковском IM 0. Так что Andrew771 тебе правильно написал, DI EI лучше не писать. Скроллер использует стек нестандартно, поэтому во время его работы прерывание не должно происходить. Это обеспечивается вызовом скроллера сразу после очередного прерывания. (HALT - дождаться прерывания, а потом CALL POPPUSHSCROLL)
Вообще прерывания это простая штука, но очень важная. И её не особо обговаривают в рамках классического Паскаля, это особенность конкретной архитектуры, в нашем случае ZX.
Если ты медленно рисуешь на экране какой-нить фрактал, то тебе можно и не знать про прерывания, и про кадровую развёртку.
Но для динамичных игр, а ЛайкПаскаль ориентирован на игры, понимание кадров и прерываний важно.
Немного расскажу про 50-тигерцовые прерывания на ZX.
В самом начале кадра, когда электронный луч подскакивает в самый верх, на нужную ножку процессора подаётся сигнал. Процессор-же, без суматохи, заканчивает очередную инструкцию основной программы. И готовится уже выполнять следующую инструкцию. И вот в этот момент, когда наш Z80 только готов выполнять очередную инструкцию, он спохватывается и смотрит: "ой, а ведь прерывание у меня на ножке! И прерывания разрешены!(Флаг включён инструкцией EI, и не выключен инструкцией DI) Пора отвлечься от основной программы." Чтобы не забыть к какой инструкции апосля вернуться, процессор заботливо заталкивает её адрес в стек.
Вот тут и начинаются проблемы, если указатель стека используется нестандартно. Приходится выкручиваться. По разному.
Так а где же лежит подпрограмма обработки прерывания? Если включен IM 2, то по адресу лежащему в регистре I как старший байт, а младший байт - 255(стабильная шина), этим адресом программист может управлять, записывая командой LD I,A нужный старший адрес. В других режимах прерывания IM 0 и IM 1 выполняется бейсиковский обработчик по адресу в ПЗУ 0038H. Тут пользовательские прерывания возможны, только извращением в виде держания стека в зоне ПЗУ. (или аппаратно, переписать ПЗУ.. включить в нулевую страницу вмето ПЗУ ОЗУ...) Это всё извращения ради извращения, так как проще использовать IM 2.
Режим IM 2 хорош для нас тем, что мы можем сами написать что делать при прерываниях (например, играть музыку), и при этом не делается то, что нам не нужно, бейсиковское сканирование клавиш. У ЛайкПаскаля свой сканер клавиш есть, а бейсиковский только зря процессор занимает.[свернуть]
- - - Добавлено - - -
Я ему прислал Скроллинг, который стек использует. HALT нужен, чтобы прерывание не случилось, пока идёт скролл. Чуть больше чем полкадра.
Последний раз редактировалось Reobne; 16.10.2019 в 09:31.
ZX_NOVOSIB(16.10.2019)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)