PDA

Просмотр полной версии : ZX Like Pascal



Страницы : 1 [2] 3

ALKO
05.10.2019, 14:34
Чем именно Паскаль неудобен?

Объявление переменных строго в конкретном месте.
Приведение типов (хотя данному недо-пасцале с 8-ми битными переменными это не грозит).
От самого синтаксиса я ужо отвык, не помню всех заковырок.

Bolt
05.10.2019, 14:42
Про приведение типов не понял. Что в нём не так?

ALKO
05.10.2019, 15:11
А ищё вопрос.
На размеры генерируемых спрайтов есть какие-то лимиты?
А то 32х32 нормально скармливаются, а 64х64 - компилит без ошибок, а на этапе выполнения программы ресетится прога.

- - - Добавлено - - -


Про приведение типов не понял. Что в нём не так?
Для каждого типа своя функция, насколько я помню. В си-подобных же достаточно перед выражением указать в скобочках нужный тип.

Andrew771
05.10.2019, 15:15
Размеры спрайтов - не более 255 знакомест. Если нужно больше, то необходимо разбить спрайт на части.

- - - Добавлено - - -


64х64 - компилит без ошибок, а на этапе выполнения программы ресетится прога.
Это 8х8 знакомест? Тогда должен нормально работать. Проверь, правильно ли ты добавил атрибуты.

Bolt
05.10.2019, 15:52
Для каждого типа своя функция, насколько я помню. В си-подобных же достаточно перед выражением указать в скобочках нужный тип.
В Паскале можно и отдельно функцию для каждого типа, и прямым указанием типа, и даже автоматически для встроенных типов.
https://wiki.freepascal.org/Typecast/ru

ALKO
05.10.2019, 18:21
Это 8х8 знакомест? Тогда должен нормально работать. Проверь, правильно ли ты добавил атрибуты.

да, 8х8.
Атрибуты вроде бы правильно заданы.
https://sun9-39.userapi.com/c858320/v858320596/995bf/1XYNxY0Iji0.jpg

Andrew771
05.10.2019, 18:44
При компиляции флаг атрибутов для спрайтов включен?

- - - Добавлено - - -

Кстати, на скриншоте не все данные уместились, а полосы прокрутки нет. Может, не всё скопировал?

ALKO
05.10.2019, 18:45
При компиляции флаг атрибутов для спрайтов включен?

А хде он тут включается? на какую из кнопок?
https://sun9-58.userapi.com/c857424/v857424596/9a07f/R7LvWtiU81s.jpg

- - - Добавлено - - -


Может, не всё скопировал?

Копировал до конца. Причём разные спрайты... УЖе подозрение, что EbuZwin опять глючит.

Andrew771
05.10.2019, 18:50
Понял, у тебя старейшая версия Паскаля, 2015 года. Скачай новую в первом посте.

- - - Добавлено - - -

В старом еще глюки есть, так что лучше новым пользоваться.

- - - Добавлено - - -

Если у тебя графика без атрибутов, то спрайты можно без атрибутов делать, а компилировать при выключенном флаге для атрибутов спрайтов.

ALKO
05.10.2019, 18:58
Скачай новую в первом посте.


Та же борода.

Пробовал предварительно и Clear 23899: Randomize usr 23900

Andrew771
05.10.2019, 19:05
Чё за фигня... Можешь код сюда скинуть или прислать, посмотрю?

ALKO
05.10.2019, 19:30
70244

Oleg N. Cher
05.10.2019, 19:51
мне понадобился познакоместный скролл.
Я скачал Supercode с WOSa, дизассемблировал нужную мне процедурку, воткнул в этот недо-паскаль. Всего-то делов.:v2_dizzy_priest:ALKO, я удивлён, что Вы не пользуетесь ZXDev. Там и транслятор есть в виде одной exe'шки, и доки на русском, а если не доки, то уж сообщество русскоязычное. И библиотеки есть, в т.ч. из Supercode. Приходите, научим.


НО - если бы автор не отвлекался на создание очередной настолки уровня крестики-нолики, а продолжал развивать проект, то было БЫ всё максимально удобно, чем где-либо.А транслятор в ZXDev имеет вполне законченный вид. И кодогенерация - уровня SDCC.

Andrew771
05.10.2019, 20:00
То, что прислал, прекрасно компилится. Выводятся все спрайты и быстрый скролл внизу экрана.

Что может быть у тебя:
1. Если вообще не компилится, выводится ошибка - проверь кодировку файла PRG (пересохрани в ней), кодировка ANSI.
2. Иногда компиль не любит почему-то пустые конструкции begin-end, а у тебя такие есть. Либо закомменть, либо сотри.

ALKO
05.10.2019, 20:04
ALKO, я удивлён, что Вы не пользуетесь ZXDev.

Меня бессмысленно склонять на сторону тёмных сил. Из меня кодер никакой (это и по сообщенькам на форуме очевидно). Серьёзно прогингом вряд ли стану заниматься, так как не осилю, не моё это.
А ZX-паскаль ща интересует лишь для демки мини-игры, дабы показать очередной концепт вкупе с очередными тщетными попытками заманить труЪ-кодеров на свой проект.

Andrew771
05.10.2019, 20:24
А EmuZWin у тебя какой версии, 2.7? А то 2.4-2.6 подглюкивают.

ALKO
05.10.2019, 21:04
Если вообще не компилится, выводится ошибка - проверь кодировку файла PRG (пересохрани в ней), кодировка ANSI.


компилится ок.
Чёт подозрение всё же на эмуль...

- - - Добавлено - - -


А EmuZWin у тебя какой версии, 2.7? А то 2.4-2.6 подглюкивают.
2.8

- - - Добавлено - - -

https://sun9-66.userapi.com/c856020/v856020280/1113b6/n-g00f3RV1A.jpg

Andrew771
05.10.2019, 21:57
При компиляции флажки по умолчанию правильно стоят (спрайты с атрибутами).

ALKO
06.10.2019, 01:17
Да. Указывал, что есть атрибуты.

- - - Добавлено - - -

а, блин.
Я флажки "окно с атрибутами, текст с атрибутами" снимал. Типа, оно всё равно в коде не участвует.
А оказывается не надо было...

- - - Добавлено - - -

Подскажите нубчику по синхре с развёрткой.
Я впендюрил в процедуру скролла оператор HALT, рябить стало поменьше, но всё же некоторая рябь осталась
https://sun1.43222.userapi.com/c856436/u373388239/docs/d12/6a6354035b27/orig.gif

ALKO
06.10.2019, 11:55
Как конвертировать X Y значения, принимающие 32х24 в адресное пространство атрибутов?
Именно реализацию на асме.
Ну, то есть , мне нужно банально загрузить в пару регистров значения XY и цвет атрибута, чтоб оно закрасило по нужным мне координатам.
Главное шоб сама конвертация была не слишком медленной

- - - Добавлено - - -

А ещё... проверка чётности как реализуется тут?
Обычно на пасцале:

if X mod 2 = 0 then
...
else
...

Но mod-а тут нет ведь.

- - - Добавлено - - -

по идее корректнее проверять младший бит числа 0 / 1.
Но возможно ли это сразу из этого паскаля?

ZX_NOVOSIB
06.10.2019, 12:19
Подскажите нубчику по синхре с развёрткой.
Я впендюрил в процедуру скролла оператор HALT, рябить стало поменьше, но всё же некоторая рябь осталась
https://sun1.43222.userapi.com/c856436/u373388239/docs/d12/6a6354035b27/orig.gif

Картинка не кажет, ибо хотлинк с вконтакта, юзай https://imgur.com/upload хотя бы

ALKO
06.10.2019, 13:46
https://i.imgur.com/iNsoiGf.gif

форум ацке тупит.....

Bolt
06.10.2019, 14:03
Если это чисто визуальный глюк - я б пока не заморачивался.

ALKO
06.10.2019, 14:40
Не получается впихнуть трек их вортекса.
Сейвю как тапку.
Дважды Load "" code (плеер и сам модуль), затем дизасмю в массив DEFB.
копипащу в паскалевский исходник.
В нём же.


begin
...
Asm(MUSINIT);
Asm(MUSPLAY);
...
end.

MUSINIT
ORG 49800
CALL C350H
RET

MUSPLAY
ORG 49900
CALL C355H
RET
MUS
ORG 0C35FH
DEFB 21H, 0BEH, 0CBH, 18H, 3AH, 0C3H, 09H....

Компилирую - запускаю, а оно пишыт - Integer out of range.

Andrew771
06.10.2019, 15:19
Но mod-а тут нет ведь.

- - - Добавлено - - -

по идее корректнее проверять младший бит числа 0 / 1.
Но возможно ли это сразу из этого паскаля?
mod есть - знак процента:
if x%2=0 then ...

- - - Добавлено - - -


Компилирую - запускаю, а оно пишыт - Integer out of range.
разберись с адресами после ORG и CALL и длиной блоков. Либо залезают на паскалевский код, либо больше 65000. Виртуальный экран для Паскаля и таблица отзеркаливания байтов находятся перед 65000 (адреса не помню, см. в либах).

- - - Добавлено - - -


Как конвертировать X Y значения, принимающие 32х24 в адресное пространство атрибутов?
Именно реализацию на асме.
Ну, то есть , мне нужно банально загрузить в пару регистров значения XY и цвет атрибута, чтоб оно закрасило по нужным мне координатам.
Главное шоб сама конвертация была не слишком медленной



; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD E,A
AND 31
OR 88
LD D,A
LD A,E
AND 252
OR C
LD E,A

ALKO
06.10.2019, 15:21
Либо залезают на паскалевский код, либо больше 65000.

Да вот нет, оно в пределах 50000-52000

Andrew771
06.10.2019, 15:30
А конец музыки не залезает выше 65000?
Для процедур MUSINIT и MUSPLAY ORGи можешь не писать, они всё равно внутри себя вызывают нужные адреса.

ALKO
06.10.2019, 15:46
А конец музыки не залезает выше 65000?

Я вот только до конца не знаю.
Вортекс же плеер и данные модуля друг с дружкой размещает, или на каком-то расстоянии? Возможно, я просто неправильно дизасмил DEFB.
У вортекса экспорт костыльный. Нет бы сразу в ASM сохранять.

- - - Добавлено - - -

Решил сделать анимашку огонька по такой схеме.

soplo_anim:= soplo_anim+1;


if soplo_anim %2 = 0 then
SpritePutClear(soplo01,8,14)
else
SpritePutClear(soplo02,8,14);

А он не шевелится.
Почему?

Lethargeek
06.10.2019, 16:30
soplo_anim:= soplo_anim+1;

if soplo_anim %2 = 0 then
в этом пасквиле разве нет логических побитовых операций?
и хватает ли ему ума вычислять остаток в таких случаях через and?

если старшие биты soplo_anim нигде не нужны, можно обойтись без остатка
сначала "soplo_anim := 1 - soplo_anim", потом "if soplo_anim = 0"

- - - Добавлено - - -

а если кадров больше двух, то подозреваю, выгодней
"anim := anim + 1; if anim > MAX then anim := 0"
чем остаток честно считать потом

ALKO
06.10.2019, 20:44
есть какой-то способ затереть спрайт при перемещении?
Или нужно создавать спрайт пустышку и накладывать с зачисткой следа?
https://sun9-43.userapi.com/c854520/v854520039/11633a/bFGVbsr3VpQ.jpg

Andrew771
06.10.2019, 21:07
Либо спрайт-пустышку, либо, если есть фон с изображением:
- запомнить фон в памяти командой WindowGet;
- вывести спрайт;
- через некоторое время вывести обратно фон WindowPut (затереть спрайт).

Способы перемещения спрайтов тут (https://zxpress.ru/book_articles.php?id=1028), раздел "Мультипликация"

ALKO
07.10.2019, 11:02
.если старшие биты soplo_anim нигде не нужны, можно обойтись без остатка
сначала "soplo_anim := 1 - soplo_anim", потом "if soplo_anim = 0"

В том и дело, что я оптимизации ради хотел юзать одну переменную как для анимации Алисы, так и для анимации огонька. Типа они с разным интервалом кадры меняют.
Но пришлось для этого задействовать две переменных. Соответственно, два инкремента, больше условий.

- - - Добавлено - - -

А вот реально, проверка бит не помешала бы.
Допустим, для огонька 0 1 нулевого бита проверять, а для алисы 0 1 первого или второго бита.
И саму переменную можно тупо инкрементировать до бесконечности, всё равно станет 0 после 255.

- - - Добавлено - - -

Как такое сделать в данном паскале?

- - - Добавлено - - -

Ещё думаю ща над рандомной генерацией препятствий.
После джавы и плюсов с их динамическими массивами, тут уже малость непривычно. Если по несколько препятствий будет генериться одновременно на экране...

- - - Добавлено - - -

Кстати, вот ещё один случай, где 16 бит важны - таймер, по которому сперва один набор препятствий, затем второй и тд. Или события там всякие. На всяких анлимитед дистанциях, а не на фиксированной карте 256х256 тайлов.

Andrew771
07.10.2019, 12:13
А вот реально, проверка бит не помешала бы.
Тебе уже на ассемблер нужно переходить :)


Как такое сделать в данном паскале?

repeat
anim:=anim+1;
if anim>3 then anim:=0;
case anim of
0: огонек_0, алиса_0;
1: огонек_1, алиса_0;
2: огонек_0, алиса_1;
3: огонек_1, алиса_1;
end;
until...

Хотя, если огонек и алиса независимы, то лучше две переменных юзать.

- - - Добавлено - - -


Ещё думаю ща над рандомной генерацией препятствий.
После джавы и плюсов с их динамическими массивами, тут уже малость непривычно. Если по несколько препятствий будет генериться одновременно на экране...
Заведи обычный массив. Генери в нем рандомно и/или обнуляй неиспользуемые. Нулевые позиции не выводи.

- - - Добавлено - - -


Ещё думаю ща над рандомной генерацией препятствий.
После джавы и плюсов с их динамическими массивами, тут уже малость непривычно. Если по несколько препятствий будет генериться одновременно на экране...
Заведи обычный массив. Генери в нем рандомно и/или обнуляй неиспользуемые. Нулевые позиции не выводи.

ALKO
07.10.2019, 13:59
.Заведи обычный массив. Генери в нем рандомно и/или обнуляй неиспользуемые. Нулевые позиции не выводи.

Дофига проверок. А мне нужен шустрый скролл при этом.

- - - Добавлено - - -

Прост с таким подходом придётся в цикле по массиву шерудить в поисках неиспользуемого.

Andrew771
07.10.2019, 16:16
Ну если препятствий 5-10 штук, то можно и массив перебрать, недолго. А если больше, то проще завести карту. Операторы (процедуры) для карт имеются.

ALKO
07.10.2019, 22:31
Либо спрайт-пустышку

Во благо скорости не делал фон.
Ща думаю не спрайтом-пустышкой затирать, а тупа атрибутами, что намного быстрее, чем заливка пиксельного слоя нулевыми значениями.
Всё равно спрайты отрисовываются по принципу SpritePutClear.

ALKO
08.10.2019, 22:29
Ещё есть некоторые замечания по СпрайтГену.
Во-первых, он генерит инверсно. То есть чёрный цвет на BMP-шке для него будет нулевым битом, что при чёрном INK и белом Paper спектрума тождественно белому пикселю.

Во-вторых он генерит неиспользуемые знакоместа в том числе, что приходится вручную подчищать, и менять в инициализации общее количество знакомест. Тоже малость неудобно.

ALKO
09.10.2019, 01:30
Что я делаю не так по атрибутам?
Почему-то ресетится прога.

код в писькале


attrx:=1;
attry:=1;
asm(ATTR);


код в блоке асма


ATTR
LD B, _ATTRY
LD C, _ATTRX
; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD E,A
AND 31
OR 88
LD D,A
LD A,E
AND 252
OR C
LD E,A
LD (DE),0
RET


- - - Добавлено - - -

хмм... ща ищу доки по Z80... кажись LD (DE) берёт значения только с аккумулятора.
Или я чёто путаю...

- - - Добавлено - - -

Наверное всё-таки надо присвоить в аккум. значение цвета

LD A, 0
LD (DE), A

Так ведь? Ща прост не за компом, не могу проверить.

ALKO
09.10.2019, 09:06
Либо спрайт-пустышку, либо, если есть фон с изображением:
- запомнить фон в памяти командой WindowGet;
- вывести спрайт;
- через некоторое время вывести обратно фон WindowPut (затереть спрайт).



Горбатыш и так шпарит слишком много данных ради примитивной графики уровня "Тамагочи".
Так что было бы правильнее не ректанглом копировать фон в память, а по контуру знакомест спрайта.
Вот такую фитчу тоже на будущее в зх-паскаль не помешало бы, если чё.
Ну, это для тех, чьи спрайты превышают квадратик 16х16 пикселей. Как, например, в Savage.

Andrew771
09.10.2019, 10:23
Ещё есть некоторые замечания по СпрайтГену.
Во-первых, он генерит инверсно. То есть чёрный цвет на BMP-шке для него будет нулевым битом, что при чёрном INK и белом Paper спектрума тождественно белому пикселю.
Во-вторых он генерит неиспользуемые знакоместа в том числе, что приходится вручную подчищать, и менять в инициализации общее количество знакомест. Тоже малость неудобно.
Это фигово, AzAtom не учел. Пользуйся тогда моим конвертером (https://zx-pk.ru/threads/24967-zx-like-pascal.html?p=794106&viewfull=1#post794106), там правильно.



Что я делаю не так по атрибутам?
Почему-то ресетится прога.
В тексте программы на асме Ттолько метки в начале строки должны быть, а команды не в начале строки, иначе они воспринимаются как метки.
Команды ld (de),0 не существует, так что ты правильно написал:
ld a,0
ld (de),a
Правда, принято у продвинутых перцев вместо ld a,0 писать xor a, команда занимает 1 байт и выполняется быстрее.
А в данной процедуре можно заменить во всех командах de на hl (т.е. d на h, e на l), тогда можно будет написать одной командой ld (hl),0, такая команда есть.

- - - Добавлено - - -


Так что было бы правильнее не ректанглом копировать фон в память, а по контуру знакомест спрайта.
Не факт, что будет быстрее копировать. Т.к. нужно бегать по всему спрайту, вычислять координаты каждого знакоместа. А так прямоугольная область копируется ldir-ами. Вычисляются только адреса начала строк.

ALKO
09.10.2019, 11:00
Не факт, что будет быстрее копировать. Т.к. нужно бегать по всему спрайту, вычислять координаты каждого знакоместа.

При рисовании спрайта так или иначе придётся вычислять адреса. Почему бы не сделать копирование прямо в цикле рисования спрайта?
То бишь - копируем байт фона (полосочку пикселей 8х1), затем сразу же шлёпаем полосочку спрайта 8х1 на экран. И так до конца знакоместа....
А впрочем, вам виднее. Я ж вообще нубасик в таких вещах.

Andrew771
09.10.2019, 15:53
При рисовании спрайта так или иначе придётся вычислять адреса. Почему бы не сделать копирование прямо в цикле рисования спрайта?
То бишь - копируем байт фона (полосочку пикселей 8х1), затем сразу же шлёпаем полосочку спрайта 8х1 на экран. И так до конца знакоместа....
А впрочем, вам виднее. Я ж вообще нубасик в таких вещах.
Это уже выходит за рамки Паскаля. :) Либо надо плодить новый нестандартный оператор для спрайтов.

ALKO
09.10.2019, 16:26
Либо надо плодить новый нестандартный оператор для спрайтов

Ну вот я про это и говорю, что для СДК надо бы функционал расширить, тогда был бы спрос, и все бы резко отвыкли от AGD и MK2

haywire
09.10.2019, 19:27
Серьёзного спроса на подобные продукты уже не будет никогда. Кое-какой спрос (среди любителей ретро) был бы, если бы реализация Паскаля была не настолько "урезанной". В первую очередь это касается обещанной нормальной работы с процедурами - локальные переменные, аргументы, работа со стеком. А спрайты в Паскале на 8-и битах - интересно как эксперимент, конечно, но они тут не нужны, вообще. Их и на 16-и то битах никто никогда не делал, потому что не нужно это тут, а если и нужно, то только после нормальной реализации языка.

ALKO
09.10.2019, 19:56
Итак, вернёмся к нашым атрибутам.

Паскаль:

For attrx:=0 to 23 do begin
attry:=attrx;
asm(ATTR);

end;

Асм:

ATTR
LD B, _ATTRX
LD C, _ATTRY
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A
LD (HL),0
RET


Теоретически должна появиться диагональная полосочка из квадратиков.
Но ничего так и не появилось. Компилится без ошибок, и сама прога стартует, а вот эта процедура никак себя не проявляет.

blackmirror
09.10.2019, 20:09
LD B, _ATTRX
LD C, _ATTRY
Есть подозрение, что здесь загружаются не значения, а младшие части адресов данных переменных.

Andrew771
09.10.2019, 21:39
должно быть:
ld a,(_ATTRX)
ld b,a
ld a,(_ATTRY)
ld c,a

читать не адрес (метку) переменной, а значение в ней.

- - - Добавлено - - -

и, кстати, в регистре b - вертик.координата, c - гориз.координата

- - - Добавлено - - -


В первую очередь это касается обещанной нормальной работы с процедурами - локальные переменные, аргументы, работа со стеком
в планах стоит.


А спрайты в Паскале на 8-и битах - интересно как эксперимент, конечно, но они тут не нужны, вообще. Их и на 16-и то битах никто никогда не делал, потому что не нужно это тут, а если и нужно, то только после нормальной реализации языка.
что имеется в виду, не понял.

ALKO
10.10.2019, 22:28
А ещё... :v2_dizzy_vodka: иииккк... я же щас на миг ощутил себя владыкой атрибутов.
И уже подумываю над реализацией движка для рогалика в 32х24 и 53 цвета на пиксел.

В качестве скетча я выбрал свою недавнюю демку, которую пилил для пентиума ммх и Voodoo2 (парился я там тоже изрядно, ведь это надо было запустить под шин9х да ещё и с лимитами текстур 256х256, да ещё и с лимитами на форматы текстур ARGB 16bit)

https://sun9-49.userapi.com/c857616/v857616389/82696/O4IOyaMJw2E.jpg


И вот что получилось в итоге на ZX.

https://sun9-43.userapi.com/c855624/v855624416/12152c/yyMdikQKrGI.jpg

Формат карт и спрайтов надо конечно изобретать самому.

ALKO
12.10.2019, 20:37
Ищё вопрос. Тут есть побитовый сдвиг для быстрых умножений-делений на 2 ? (типа сишного << >> или асмовых RRA RLA ) ?
Или оно по-дефолту так и будет билдить в асм при x:=x*2 ?

Andrew771
12.10.2019, 21:44
Есть. Быстрые расчеты не только для 2, но и для 3,4,5,10,20,50,100...

ALKO
12.10.2019, 22:47
То есть я могу не заморачиваясь городить явные деления-умножения?

Andrew771
12.10.2019, 22:48
Да. Всё автоматически преобразовывается.

ALKO
13.10.2019, 21:51
С музоном бяда.
дизасмю с вортекса отдельно плеер, и модуль.
Втыкаю в паскалевский сорс, а оно проигрывает лишь первый паттерн, после чего начинает таращить. Независимо от того, в какие адреса воткну как сам модуль, так и плеер. Независимо от того, какой трек скомпилирую.

Bolt
14.10.2019, 00:53
ALKO, а сколько сейчас строк написано на Паскале (без ассемблерных вставок, спрайтов и прочего), и сколько занимает итоговый бинарник?

ALKO
14.10.2019, 18:31
а сколько сейчас строк написано на Паскале

Да там совсем фигня. Я через дебаггер смотрел, куда собирался впендюривать музон, место есть. С 30000 по 40000 точно свободно было. И тем не менее - глючит именно после первого паттерна (хотя Init плеера перед воспроизведением вызывал)


и сколько занимает итоговый бинарник?
Оно же не в бинарь компилит. В ассемблер.

Bolt
14.10.2019, 20:27
Вопросы не применительно к плееру, а вообще. Мне просто интересен размер именно исходника, в строках, и вообще весь бинарник, со всеми спрайтами.

Andrew771
14.10.2019, 21:36
Да там совсем фигня. Я через дебаггер смотрел, куда собирался впендюривать музон, место есть. С 30000 по 40000 точно свободно было. И тем не менее - глючит именно после первого паттерна (хотя Init плеера перед воспроизведением вызывал)
Если используешь команды виртуального экрана или команды WindowGet, WindowPut, то область памяти начиная с адреса 57344 занята под вирт.экран. Но у тебя 30000-40000, должно быть всё ок. Может, всё-таки глючит скомпилированный vortex? Проверь без Паскаля, просто вызови процедуры из Бейсика.

Reobne
15.10.2019, 09:03
ALKO, проверь, когда ты вставлял SCROLL, из сторонней библиотеки, не прихватил-ли ты случайно ORG
Оператор ORG устанавливает, куда дальше, будет компилироваться ассемблер. Как правило ORG нужен только один, в начале программы. И только в особых случаях он нужен ещё где-то.
Просто сотри лишний. Пусть всё компилируется по порядку.

- - - Добавлено - - -

Andrew771, Ассемблер из паскаля получается слеповат. То есть, он хорошо оформлен для компиляции, но не для просмотра человеком. Можно было-бы предусмотреть такую галочку, чтобы в ассемблерный код вставлялись прямо строчки из паскалевского кода. Закоменченные, естественно.
Взялся изучать твой Паскаль. Если ещё у меня будут замечания, то говорить или заткнуться?

Andrew771
15.10.2019, 09:42
Andrew771, Ассемблер из паскаля получается слеповат. То есть, он хорошо оформлен для компиляции, но не для просмотра человеком. Можно было-бы предусмотреть такую галочку, чтобы в ассемблерный код вставлялись прямо строчки из паскалевского кода. Закоменченные, естественно.
Хорошее предложение! Вношу в свой список доработок.
Правда, нужно будет мне подумать, чтоб при оптимизации не стирались комменты. :)


Взялся изучать твой Паскаль. Если ещё у меня будут замечания, то говорить или заткнуться?
Пиши конечно, любая информация ценна. Я веду список доработок, что сделать/исправить в следующих версиях. Черпаю и конспектирую от вас информацию тут.

Reobne
15.10.2019, 18:13
любая информация ценна
О, это очень радует! Такое отношение это по нашему! :)
Ну тогда такие мыслишки; конечно не настаиваю, просто мне так кажется:
Есть галочки, которые имеют определённое значение для конкретного проекта, поэтому можно разгрузить человеческую память и внимание, вписав эти опции в текст программы. Например первая строка имеет коментарий: {$options -a -b}

Bolt
15.10.2019, 18:26
Ага, а ещё процедуры с параметрами, локальные переменные, структуры-записи (record), типы longint/longword...

Reobne
15.10.2019, 18:28
Встроеная процедура Asm. У полного Паскаля уже есть такое зарезервированное слово.
Да и по смыслу тоже как-то название не подходит. Может заменить, пока не поздно, на USR или CALL... или ещё что-то такое. CALL_USR ASM_CALL.

Оно-же сразу четыре выгоды даст.
1 Человек не спутается.
2 Парсер расцветки синтаксиса не спутается.
3 ЛайкПаскаль можно развивать до такой степени, что таки будет реализован правитьный ASM...END/
4 Код написаный в ЛайкПаскале проще будет адаптировать для полноценного Паскаля. (Например, если автор игры захочет повторить её на ПиСи)

ALKO
15.10.2019, 21:12
ALKO, проверь, когда ты вставлял SCROLL, из сторонней библиотеки, не прихватил-ли ты случайно ORG
Оператор ORG устанавливает, куда дальше, будет компилироваться ассемблер. Как правило ORG нужен только один, в начале программы. И только в особых случаях он нужен ещё где-то.
Просто сотри лишний. Пусть всё компилируется по порядку.

Я этот самый ORG специально и прописал, чтоб данная процедура находилась по адресу 40000. Да и оно не пересекалось с музоном.

- - - Добавлено - - -

Reobne, я там в письме указал, не знаю, дошло ли, или может в спам попало. Карочь, Ваша процедурка скролла работает с моей программой, но видимо стек засирается c каждым новым вызовом, из-за чего на тайлах пола с каждым циклом всё больше и больше каши образуется.
Как побороть сей баг?

- - - Добавлено - - -

ПАРДОН! Отбой!
Проблема решилась командой Halt перед вызовом функции. Терь всё ч0тка.

- - - Добавлено - - -

капееетссс :v2_dizzy_tired2:
https://media.giphy.com/media/lRwC15zkEv2YuM7tLy/giphy.gif

В Горбатого вселилась сега. Это уже контра-хард-корпс какой-то.

Andrew771
15.10.2019, 21:48
Есть галочки, которые имеют определённое значение для конкретного проекта, поэтому можно разгрузить человеческую память и внимание, вписав эти опции в текст программы. Например первая строка имеет коментарий: {$options -a -b}
Сейчас реализовано в bat-нике. Можешь свой bat-файл написать с флагами. Подробности в справочном файле.
А вообще, да, лучше бы в код паскалевский вставить.
Я думаю сократить флаги - сделать только "атрибуты да/нет" и "виртуальный экран да/нет". А то много флагов может путать, хоть и тонкая настройка.

- - - Добавлено - - -


Ага, а ещё процедуры с параметрами, локальные переменные, структуры-записи (record), типы longint/longword...
longint сейчас использую в своей пишущейся игре Russian Railway Magnate в виде асмовских процедур. А в Паскаль встроить думаю как, чтобы не перейти на 32 бит :)
Процедуры с параметрами и локальные переменные в планах есть, т.к. хочу сделать нативный Паскаль, а без них никак.

- - - Добавлено - - -


ЛайкПаскаль можно развивать до такой степени, что таки будет реализован правитьный ASM...END/
вот это, ИМХО, самое правильное. Оттуда и процедурку можно будет вызвать обычным асмовским call.

- - - Добавлено - - -


ПАРДОН! Отбой!
Проблема решилась командой Halt перед вызовом функции. Терь всё ч0тка.
ALKO, музыка появилась? :)

ALKO
15.10.2019, 21:53
ALKO, музыка появилась?

С этим пока странности... А может тоже надо HALT впендюрить в цикл PLAY? хмм.. Ну, потом буду маяться. Ща надо игровую логику пилить. Проверки на столкновения. Благо теперь скоростей хватает на гомна-код в виде набора IF-ов.

Andrew771
15.10.2019, 21:57
Я кажись понял. Твоя процедура скроллинга использует прерывания, и музыка тоже. Нужно что-то с этим делать.

ALKO
15.10.2019, 21:58
Нужно что-то с этим делать.

EI
CALL MUZ
DI
RET
???

Andrew771
15.10.2019, 22:00
halt - это ожидание прерывания. Не поможет.

- - - Добавлено - - -

скорее всего, после скроллинга сразу же вызывать музон в этой же процедуре. DI, EI не трогать.

Reobne
16.10.2019, 09:35
ALKO, Письмо дошло, я просто торможу. Изучаю ЛайкПаскаль. Подожди маленько, я изучу и перепишу POP-PUSH-SCROLL, чтобы был ещё немного побыстрее, и без лишнего кода, как сейчас.
Так вот, про прерывания. Посмотрел.
Программа твоя не трогает прерывания, и всё работает в бейсиковском IM 0. Так что Andrew771 тебе правильно написал, DI EI лучше не писать. Скроллер использует стек нестандартно, поэтому во время его работы прерывание не должно происходить. Это обеспечивается вызовом скроллера сразу после очередного прерывания. (HALT - дождаться прерывания, а потом CALL POPPUSHSCROLL)

Вообще прерывания это простая штука, но очень важная. И её не особо обговаривают в рамках классического Паскаля, это особенность конкретной архитектуры, в нашем случае ZX.
Если ты медленно рисуешь на экране какой-нить фрактал, то тебе можно и не знать про прерывания, и про кадровую развёртку.
Но для динамичных игр, а ЛайкПаскаль ориентирован на игры, понимание кадров и прерываний важно.

В самом начале кадра, когда электронный луч подскакивает в самый верх, на нужную ножку процессора подаётся сигнал. Процессор-же, без суматохи, заканчивает очередную инструкцию основной программы. И готовится уже выполнять следующую инструкцию. И вот в этот момент, когда наш Z80 только готов выполнять очередную инструкцию, он спохватывается и смотрит: "ой, а ведь прерывание у меня на ножке! И прерывания разрешены!(Флаг включён инструкцией EI, и не выключен инструкцией DI) Пора отвлечься от основной программы." Чтобы не забыть к какой инструкции апосля вернуться, процессор заботливо заталкивает её адрес в стек.
Вот тут и начинаются проблемы, если указатель стека используется нестандартно. Приходится выкручиваться. По разному.
Так а где же лежит подпрограмма обработки прерывания? Если включен IM 2, то по адресу лежащему в регистре I как старший байт, а младший байт - 255(стабильная шина), этим адресом программист может управлять, записывая командой LD I,A нужный старший адрес. В других режимах прерывания IM 0 и IM 1 выполняется бейсиковский обработчик по адресу в ПЗУ 0038H. Тут пользовательские прерывания возможны, только извращением в виде держания стека в зоне ПЗУ. (или аппаратно, переписать ПЗУ.. включить в нулевую страницу вмето ПЗУ ОЗУ...) Это всё извращения ради извращения, так как проще использовать IM 2.
Режим IM 2 хорош для нас тем, что мы можем сами написать что делать при прерываниях (например, играть музыку), и при этом не делается то, что нам не нужно, бейсиковское сканирование клавиш. У ЛайкПаскаля свой сканер клавиш есть, а бейсиковский только зря процессор занимает.

- - - Добавлено - - -


Я кажись понял. Твоя процедура скроллинга использует прерывания
Я ему прислал Скроллинг, который стек использует. HALT нужен, чтобы прерывание не случилось, пока идёт скролл. Чуть больше чем полкадра.

Andrew771
16.10.2019, 12:47
Я ему прислал Скроллинг, который стек использует. HALT нужен, чтобы прерывание не случилось, пока идёт скролл. Чуть больше чем полкадра.
Так может, тогда перед вызовом скроллинга поставить DI, а после EI и HALT? А музыка в прерывании, обычные вызовы.

Reobne
16.10.2019, 13:45
Так может, тогда перед вызовом скроллинга поставить DI, а после EI и HALT?
Тогда синхронизации с кадрами не будет. И некоторые прерывания будут пропадать. Если музыка на прерываниях, то звук поганый будет.

А музыка в прерывании, обычные вызовы.
В режиме IM 2?

ALKO
16.10.2019, 21:54
Мелкий шрифт 64х24 меня не устраивает, тем более в интернетике валом исходников его реализации.

А вот как быть с кириллицей хотя бы 8х8 ? Не все клоны оснащены русификацией.

Подкиньте, пожалуйста, процедурок вывода русифицированного текста, с нарисованными в DEFB символами.
А если будет 8х16 или 16х16 то ваще суперово.

Главное чтоб простота использования. Ну, то есть в регистровую пару координаты текста. В отдельный массив DEFB сам текст.

Reobne
17.10.2019, 06:22
Andrew771, я заметил, что процедуру умножения можно подсакротить.
Сейчас
***
mul_n50 add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret

mul_n64 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret

mul_n100 add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret

mul_n128 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret
Убирая повторы получим
***
mul_n100 add hl,hl
mul_n50 add hl,hl
mul_n25 ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret

mul_n128 add hl,hl
mul_n64 add hl,hl
mul_n32 add hl,hl
mul_n16 add hl,hl
mul_n8 add hl,hl
mul_n4 add hl,hl
mul_n2 add hl,hl
ret

И это только для образца, там выше тоже сокращается.

ZX_NOVOSIB
17.10.2019, 07:57
А если будет 8х16 или 16х16 то ваще суперово.
Самый кайфовый шрифт это када 42 символа в строке :-)

ALKO
17.10.2019, 08:28
Самый кайфовый шрифт это када 42 символа в строке :-)

Мне бы и из "Президента" подошёл вполне.
Хотя стильный типа KrakOut смотрелся бы кошернее.

Andrew771
17.10.2019, 10:01
Подкиньте, пожалуйста, процедурок вывода русифицированного текста, с нарисованными в DEFB символами.
есть здесь (https://zxpress.ru/book_articles.php?id=1025)



Andrew771, я заметил, что процедуру умножения можно подсакротить.
В библиотеке много чего можно пооптимизировать, т.к. писалось иногда второпях и на первом попавшемся образце :)


Так может, тогда перед вызовом скроллинга поставить DI, а после EI и HALT?
Тогда синхронизации с кадрами не будет. И некоторые прерывания будут пропадать. Если музыка на прерываниях, то звук поганый будет.
Сообщение от Andrew771
А музыка в прерывании, обычные вызовы.
В режиме IM 2?
да, в режиме IM 2.

ALKO
17.10.2019, 10:52
Вырезку из этой книги про использование RST16 я знаю

Но там архаичный способ. Графика символов заносятся через DATA.
Я прост думал, может за столько лет появились готовые опубликованные решения, где достаточно просто асм-процедурку воткнуть ctrl-c, ctrl-v.

Andrew771
17.10.2019, 14:40
В исходнике ZXOOM (https://zx-pk.ru/threads/54-podderzhim-sajt-iskhodnikov!.html?p=434945&viewfull=1#post434945) есть печать символов 8х8 (и 4х8 тоже), но там по-моему только заглавные буквы, цифры и некоторые знаки препинания. В инструментах разработки там же конвертер текста на русском в коды для асма.

Reobne
17.10.2019, 15:25
В библиотеке много чего можно пооптимизировать, т.к. писалось иногда второпях и на первом попавшемся образце
Ну только не оправдывайся, я не для этого сигнализирую. :)
Просто занеси в свою тайную базу, "что нужно сделать". :)

Bolt
17.10.2019, 16:32
Я в свою уже занёс :)

ALKO
19.10.2019, 21:50
как нарисовать линию?
Не обязательно быструю процедуру.
Можно и вызовом из ПЗУ.
Вроде по адресу CALL 9146 расположена команда DRAW. Но пока не понял, как задать начало линии (PLOT) да и в принципе какими регистрами передаются параметры.

Reobne
20.10.2019, 07:23
Как написать игру на ассемблере для ZX Spectrum (https://zxpress.ru/book_articles.php?id=1025)


Прямые линии
Продвинемся еще на один шаг вперед и научимся проводить прямые линии. Для этого потребуется сперва указать начальные координаты, поставив точку, от которой протянется линия, а затем задать величины смещения по горизонтали и вертикали до конечной точки линии. В Бейсике это должно выглядеть примерно так:

PLOT 120,80: DRAW 35,-60

Оператор DRAW реализует подпрограмма ПЗУ, находящаяся по адресу 9402. Перед обращением к ней в регистры C и B необходимо последовательно занести значения параметров, взятые по абсолютной величине, то есть в C в нашем примере помещается число 35, а в B нужно загрузить не -60, а 60. Но чтобы не потерять знаки, их следует разместить на регистрах E и D. Это значит, что в регистр E заносится единица, а в D - минус единица (или, что то же самое, 255). Таким образом, приведенная выше строка Бейсика на ассемблере запишется так:


LD BC,#5078 ;C = 120 (#78), B = 80 (#50)
CALL 8933
LD BC,#3C23 ;C = 35 (#23), B = 60 (#3C)
LD DE,#FF01 ;E = 1 (#01), D = -1 = 255 (#FF)
CALL 9402
RET

ALKO
20.10.2019, 12:25
По поводу музла.
Может надо push-ами сохранять состояния всех регистров, флагов перед вызовом процедуры плеера.
Или Asm команда пасцаля сама фигачит такой набор?

ALKO
20.10.2019, 15:56
П.С. с линиями понятно.
А вот с их атрибутами сложновато.
Так и не понял как их изменить. Всё время рисуется чёрный инк, белый пэйпер.

ZX_NOVOSIB
20.10.2019, 17:22
ALKO, в той же книге есть про атрибуты ;-)

ALKO
20.10.2019, 17:59
Я попробовал вот эту комбинацию прямо перед вызовом рисовалки.


LD A,70 ;байт атрибутов
LD (23693),A ;помещаем в системную переменную ATTR_P

Ничё не поменялось.

ALKO
21.10.2019, 00:38
В принципе, уже не нужно. Я заливку сделал отдельной процедурой.
Да и те линии мне нужны были лишь для менюшки, я её полностью процедурно решил рисовать. Рамки в цикле, заливка тоже.
И текст скейлится. Ещё думаю, может и сам спрайт Алисы отскейлить процедурно вдвое. У Эндрю вроде были процедурки в ZXoom. Или нет, уже не помню.

https://sun9-38.userapi.com/c850424/v850424009/1e49e7/QzZIQAIJT3I.jpg

- - - Добавлено - - -

Музон пашет, но порой подлагивает, когда обрабатывает перемещения спрайта с клавиатуры.

- - - Добавлено - - -

Может его можно как-то высоко-приоритетными прерываниями синхронизировать?

Andrew771
21.10.2019, 10:16
Музон пашет, но порой подлагивает, когда обрабатывает перемещения спрайта с клавиатуры.
Может его можно как-то высоко-приоритетными прерываниями синхронизировать?
В процедуре опроса клавы имеется восьмикратное чтение портов. Я не знаю, влияет ли чтение портов на прерывания, задам вопрос в разделе "Программирование".

ALKO
21.10.2019, 10:32
Таким образом сгладил темп музона. Но оно, естественно, жрёт драгоценные фпс-ы.

MUSPLAY

call 88BDh
call 88BDh
HALT
ret

Andrew771
21.10.2019, 11:04
ответ по прерываниям (https://zx-pk.ru/threads/30986-vliyanie-chteniya-portov-na-preryvaniya.html?p=1030720#post1030720)

ALKO
21.10.2019, 15:33
Перед вызовом процедуры плей пробовал и запрещать прерывания, и разрешать.
В цикле опроса клавы такты сжыраются, видимо.

И это... Reobne, вижу в замедленном действии процедура скролла нижний ряд скипает с шагом не то 16, не то 32 пикселя.
А можно её переделать так, шоба нижний ряд скроллился 8 пикселей, а верхний ряд смещался на 8 лишь на каждый второй тик нижнего ряда?
А то в замедленном действии эта дёрганность не комильфо.

Andrew771
21.10.2019, 17:23
Перед вызовом процедуры плей пробовал и запрещать прерывания, и разрешать.
В цикле опроса клавы такты сжыраются, видимо.
Уже ответили (https://zx-pk.ru/threads/30986-vliyanie-chteniya-portov-na-preryvaniya.html), что не сжираются. У тебя, скорее всего, где-то кто-то запрещает прерывания на какое-то время. Найди и уничтожь. У лайк-Паскаля только одна процедура запрещает прерывания - SoundEffect, если ее используешь. Процедура чтения клавиш прерывания не запрещает. Значит, кто-то еще у тебя запрещает.

ALKO
21.10.2019, 18:32
да тут мне кажется, что не в прерываниях дело вовсе. А в излишнем израсходовании тактов на процедуру, где срабатывает проверка клавиатуры.

Reobne
21.10.2019, 19:14
И это... Reobne, вижу в замедленном действии процедура скролла нижний ряд скипает с шагом не то 16, не то 32 пикселя.
А можно её переделать так, шоба нижний ряд скроллился 8 пикселей, а верхний ряд смещался на 8 лишь на каждый второй тик нижнего ряда?
А то в замедленном действии эта дёрганность не комильфо.
Хорошо, сейчас сделаю и пришлю на почту.
Ты автор, как скажешь, так и будет.
А то что верх скроллируется на 8 пикселей, а низ на 16 пикселей, это я специально сделал, когда ты попросил параллакс.
А так, как ты просишь, я бы никогда сам не догадался сделать. Это-ж как получиться, верх будет скроллироваться с одним fps, а низ с удвоенным fps. В моём понимании, это как раз и есть дёрганность вверху. Я себе не представляю, чтобы разные части сцены с разным fps были. :)

Ты вот честно скажи, ты IM 2 включил или нет? А то Andrew771 уже пошёл за тебя спрашивать вопросы, как будто уверен, что у тебя IM 2 работает. А я что-то не уверен.

ALKO
21.10.2019, 20:17
Это-ж как получиться, верх будет скроллироваться с одним fps, а низ с удвоенным fps. В моём понимании, это как раз и есть дёрганность вверху.

Но это таки классический метод параллаксов.
Техническая Алиса же будет постепенно разгоняться. А в медленном режиме как раз дёрганность будет именно внизу. Всё-таки скип в 16 пикселей куда более рвано выглядят, чем 8. Однако почему-то большинство разрабов любят именно по 16 скипать.
К тому же у меня далее по плану после этой аркадки приступить к квесту-предисловию (а-ля Буратина), раз уж на метроидванию никто не отзывается. А там всё время будет камера медленно ездить.

IM2 я не трогал. А на каком этапе его надо врубить?

Reobne
21.10.2019, 20:28
IM2 я не трогал. А на каком этапе его надо врубить?
А музыку ты постоянно вызываешь в главном цикле? Я так и думал.
Инициализировать IM 2 нужно в начале работы программы, один раз. И не просто командой IM 2, а подготовить регистр I и таблицу.

Сейчас накидаю процедурку для старта.

CodeMaster
21.10.2019, 21:17
С любовью к вам
Чё происходит???

Reobne
21.10.2019, 21:25
Вот добавь это


Im2Init
xor a
ld l,a
ld a,0+((LastAddr+255)>>8)
ld i,a
ld h,a
ld d,a
ld e,l
inc e
ld bc,256
inc a
ld (hl),a
ldir
ld h,a
ld l,a
ld (hl),0c3h
ld de,Im2Go
inc hl
ld (hl),e
inc hl
ld (hl),d
im 2
ei
ret
Im2Go
push af
push hl
push de
push bc
ex af,af'
exx
push af
push hl
push de
push bc
push ix
push iy
call MusicPlay
ld hl,FrameCounter
inc (hl)
pop iy
pop ix
pop bc
pop de
pop hl
pop af
ex af,af'
exx
pop bc
pop de
pop hl
pop af
ei
ret
FrameCounter
defb 0c9h


call MusicPlay - это вызов музыкального игруна.
В самом конце файла вставь метку "LastAddr"
А в начале, когда уже можно будет играть музыку(после её инициализации(ты как-то писал, что инициализируешь её)), вызови Im2Init. А из основного цикла программы всю музыку убери. Она сама будет играться, от прерываний.

На первых порах тебе пойдёт. Потом, на финишной обработке можно будет уплотнить. Убрать пустоты. А пока что - лишь бы правильно работала, памяти хватает.

- - - Добавлено - - -


Чё происходит???
Нажал редактировать - увидел своё сообщение. Сохранил.

Andrew771
21.10.2019, 21:50
Насколько я знаю, программы создания музыки выдают для вставки в свои проги две процедуры. Первая - инициализация (как раз устанавливает режим IM2), вторая - сама музыка. Обе нужно по одному разу вызвать в начале программы, дальше музыка сама играет в прерываниях. Прерывания автоматически вызываются сами 50 раз в секунду, если не запрещены (это ликбез такой :) ).

Reobne
22.10.2019, 07:59
Насколько я знаю, программы создания музыки выдают для вставки в свои проги две процедуры. Первая - инициализация (как раз устанавливает режим IM2), вторая - сама музыка. Обе нужно по одному разу вызвать в начале программы, дальше музыка сама играет в прерываниях. Прерывания автоматически вызываются сами 50 раз в секунду, если не запрещены (это ликбез такой :)).
Хм. Это как музыкант пишет конституцию страны. Это государственное дело, и должно решаться на государственном уровне, а не музыкантишкой.
Так и в программе, программист должен решать когда включить IM 2, когда выключить. И что у него там будет обрабатываться. Не только музыка, но и подсчёт времени, клавиатура/джойстик, фактор случайности, отображение минирадара, переключение страниц экрана для мультиколора, игра на атрибутах, рисование на бордере, и прочее, прочее, прочее. Так что если музыкальный модуль самостоятельно делает таблицу вектора прерываний, включает IM 2, и обрабатывает прерывания играя музыку, то это какой-то режим для новичков, которые пишут в бейсике.
Я даже помню, что в бейсике приходилось писать:
100 PAUSE 1:RANDOMIZE USR MusPlay: GOTO 100
Чтобы послушать музыку.

А вообще, может ты и прав, только не надо так однозначно. Надо посмотреть конкретно, что за музыкальный редактор использует ALKO и там уже всё увидим.


ALKO, Напомни, в каком редакторе музыку пишешь.

ALKO
22.10.2019, 09:29
Vortex tracker.

У него на выходе получаются две функции (инит, и плэй, причём плэй надо самому каждый раз вызывать через CALL с частотой 50 герц). А шоб оно само по себе за счёт тактов прерываний играло, даж не знаю как это делается :\
Выше описанный код я ещё не пробовал переварить.
LastAddr - это уже где массив данных самого модуля заканчивается? И надо ставить эту метку аккурат на последний байт данных? Или где начинается уже первый NOP ? Сложновато.. ух и сложновато.

Reobne
22.10.2019, 12:15
У него на выходе получаются две функции (инит, и плэй, причём плэй надо самому каждый раз вызывать через CALL с частотой 50 герц). А шоб оно само по себе за счёт тактов прерываний играло, даж не знаю как это делается :\
Вот, я так и думал!
То что я тебе прислал, оно как раз и будет вызывать плэй.

LastAddr - это уже где массив данных самого модуля заканчивается? И надо ставить эту метку аккурат на последний байт данных?
В самом конце текста, уже после всех данных и кода.
При инициализации IM 2, по классике, нужно сделать таблицу в 257 байт. Вот это как раз для этой таблицы. Она заведётся в свободной памяти, после кода и данных. Так же нужно код поместить по адресу с одинаковым старшим и младшим байтами. Сейчас я просто ставлю JP в следующем секторе памяти, считая и его свободным. Если памяти будет не хватать, а код более менее устаканится, то можно будет переписать, приспособив к существующему коду, менее расточительно.

- - - Добавлено - - -


call MusicPlay
Вот тут не забудь вставить адрес игруна музыки.
Таво самого про которого ты писал:

причём плэй надо самому каждый раз вызывать через CALL с частотой 50 герц

ALKO
22.10.2019, 23:38
Тээк-с.
Всё сделал согласно ваших указаний по шаманству над interrupt-музоном.
Работает, но как и прежде - проседает фпс/темп музла именно при обработке клавы.
Наглядно на реале (он у меня даже чутка быстрее эмуля, но даже на нём появляются такие просадки)
https://vk.com/wall-145919754_676

Dart Alver
23.10.2019, 22:09
Всё сделал согласно ваших указаний по шаманству над interrupt-музоном.
Работает, но как и прежде - проседает фпс/темп музла именно при обработке клавы.
Наглядно на реале (он у меня даже чутка быстрее эмуля, но даже на нём появляются такие просадки)
Забавно !!! Похожая хрень была у меня на профике. Там был контроллер PC-клавы, который выдавал сигнал wait на шину процессора при обработке нажатия клавиш. Однако твоя клава на писюшную вроде как совсем не похожа... Забавно )))

ALKO
23.10.2019, 23:25
Да, странная лабуда. Вряд ли именно графика просаживает. Потому что алиса даже будучи на одном месте анимируется, да и столбики разной высоты должны вызывать ощутимые скачки. Но ощутимо почему-то именно при нажатии...

- - - Добавлено - - -

Подскажите по пресетам ZX-paintbrush. Из него же можно в нужном виде для ZX-паскаля экспортнуть массив данных под спрайты?
https://sun9-69.userapi.com/c851028/v851028508/1f9ff1/pS308kKdo8s.jpg

- - - Добавлено - - -

можно же как-то выделить даже нужный ректангл для экспорта?

Dart Alver
24.10.2019, 00:33
Вряд ли именно графика просаживает. Не я не про графику говорил. Тут интересно как работает контроллер клавиатуры (если он есть) на твоём реале и как эмулируется на эмуляторе. Тормозит при нажатии любой клавиши или только тех которые используются ? Если есть правый синклер джойстиком, попробуй завести через него [98760] и сравнить через джойстик и клаву.
Если джойстик не тормозит а клава тормозит, значит проблема аппаратная - тормозится сам процессор на момент работы контроллера.

ALKO
24.10.2019, 01:20
Контроллер клавиатуры? На Горбатом? Нонсенс.
У меня не АТМ турбо, и не пент-евы. Обычный ленин. Да и эмулятор в режиме обычного 48к.
По-моему там просто крест-накрест линии ввода-вывода Z80 на клавиатуре сидят (грубо говоря. Если не учитывать всякие регистры-буферы для развязки).

ALKO
24.10.2019, 20:03
Reobne,

Значит ещё раз, что нужно сделать:
1. Убрать все вызовы музыкального плейера, кроме как в
функции Im2Go
2. Сделать вызов Im2Init после инициализации музыки.


Именно так я и сделал. (фигурные скобочки - это "комментарии" на паскале, если чё).



{Главный цикл}
begin
asm(MUSINIT);
asm(Im2Init);
Color(41);
ClrScr;

game_state:=0;
init_menu_f:=0;

while 1<2 do {бесконечный цикл, условие всегда выполняется}
begin

case game_state of
0 : menu;
1 : init_game;
2 : begin
drawAlice;
enemyMove;
Asm(SCROLL3);
Asm(SCROLL3);
drawBarrier;
{Asm(MUSPLAY);}

end;
end;


end;
end.

Andrew771
24.10.2019, 21:52
asm(MUSINIT);
asm(Im2Init);
Нафига эти оба? Второе только нужно.

ALKO
24.10.2019, 23:44
Нафига эти оба? Второе только нужно.


Блен. Там ща такая путаница возникла.
Асм-компилятор EmuZwin не перезатирал старый снапшот, когда я пастил туда обновлённый код.
То что я скинул по мылу Reobne получается это старая версия.

А c Im2Init оно вообще ресетится, оказывается. :v2_dizzy_roll:
Странненько...

Reobne
25.10.2019, 06:46
ALKO, Жду очередную версию, которая сбрасывается. Пока что почта пуста.
И лучше ASM файл тоже. Да и PRJ изначальный файл тоже поможет.
Пока что версия только одна, что таблица прерываний перекрывает программу. (Надо глянуть, куда ты метку LastAddr поставил, куда она ложится, и не перекрывается-ли с музыкальной программой.)

Да, и почему ты в эту тему форума пишешь? Тут обсуждаются вопросы по ZX-LikePascal-ю. А у тебя твои частные разработки.
Или ты хочешь, чтобы в новых версиях была кнопка "добавить музыку", и всё само вставлялось в программу. :)
На самом деле это может ещё больше запутать. Ничто не заменит _понимания_. Когда понимаешь, как всё работает. Когда несколько раз уже делал, и всё получалось. Тогда рождается уверенность, и всё становится простым. :)
А волшебные кнопки и всякие визарды, только мешают выйти на реальный уровень понимания. Кнопки должны помогать справиться с рутиной, а не с недомыслием.

Andrew771
25.10.2019, 09:13
Блен. Там ща такая путаница возникла.
Асм-компилятор EmuZwin не перезатирал старый снапшот, когда я пастил туда обновлённый код.
А зачем что-то копипастить? Компилируешь файл PRG в ASM, потом ресетишь EmuZWin, потом в окне асма EmuZWin открываешь файл ASM (вверху слева вторая иконка) и его компилируешь.

ALKO
25.10.2019, 14:53
А зачем что-то копипастить? Компилируешь файл PRG в ASM, потом ресетишь EmuZWin, потом в окне асма EmuZWin открываешь файл ASM (вверху слева вторая иконка) и его компилируешь.

Слишком много телодвижений.
Я просто копипастили из асм-файла в асм-компилятор эмуля для оперативности. Но вот ресетнуть оперативу не удосужился.

ALKO
25.10.2019, 19:58
ALKO, Жду очередную версию, которая сбрасывается. Пока что почта пуста.

Reobne, сорс отправил (паскалевский исходник, ну и асм, в который оно собирается).

ZX_NOVOSIB
25.10.2019, 20:07
Да, и почему ты в эту тему форума пишешь? Тут обсуждаются вопросы по ZX-LikePascal-ю. А у тебя твои частные разработки.
Прально. Гнать надо, в шею.


Кнопки должны помогать справиться с рутиной, а не с недомыслием.
В гранитъ!

Andrew771
25.10.2019, 20:54
Прально. Гнать надо, в шею.
Ну, часть вопросов касается непосредственно Паскаля.
Впрочем, можь ты саркастически. Выпил в пятницу вечером, как я, по традиции, сейчас. Фсё, я пошел кино смотреть под пивко, обращайтесь, можь отвечу сегодня :)

Reobne
26.10.2019, 13:09
Reobne, сорс отправил (паскалевский исходник, ну и асм, в который оно собирается).
Принял, смотрю. :)
Музыкальный файл ты дизассемблировал полностью, чтобы без запарки иметь его в исходном файле. :)
Это рациональная идея. Только в следующий раз, когда будешь дизассемблировать, поставь галочку "в виде DEFB" (в EmulZWin "As Data Block"). Так будет надёжнее. Ибо кто его знает, вдруг попадётся код, синонимичный другому коду, и после туда-сюда-ассемблера, код изменится. Или недокументированная команда какая нибудь попадётся, которую дизассемблер не прожуёт...

Оказывается я ошибся, когда решил, что поставив метку LastAddr в конец кода, мы получим действительно конец кода. Дело в том что LikePascal после этой метки запишет свои внутренние подпрограммы. Так что метка LastAddr не будет нам показывать место, за которым свободная память. Сейчас я собираюсь переписать свой Im2Init, чтобы таблица прерываний лежала внутри тела программы.

И ты зря закомментировал asm(MUSINIT);. Он нужен конечно! Andrew771 тебе не глядя посоветовал, у него опыт работы с другим музыкальным редактором, так что в этом вопросе не полагайся на него. :)



- - - Добавлено - - -

Andrew771, В будущих версиях можно было-бы предусмотреть особую метку в конце программы, чтобы после неё выделять свободную память.

ALKO
26.10.2019, 14:29
когда будешь дизассемблировать, поставь галочку "в виде DEFB" (в EmulZWin "As Data Block"). Так будет надёжнее.
Ваще-та модуль так и сделан в виде DEFB
Асмом там сделан лишь плеер. Они же в разных адресах раскиданы.

- - - Добавлено - - -

Код всё больше разрастается, всё сложнее навигация в нём. Вспоминаю времена, когда фигачил свои ранние проекты в один main.cpp, при этом не юзая разделения на классы, после чего благополучно забрасывал проект, так как в нём чёрт ногу сломит. Щас уже исправился чутка. Стараюсь хоть как-то структурировать, в меру своих скудных возможностей.

Ещё и notepad++ с подсветкой синтаксиса лажает, когда в Паскале вдруг видит записи вроде ASM(Label);. Это ему ломает моск.

Сложно выискивать наименование той или иной процедуры (хорошо, когда помнишь название и через ctrl+f), обычно в IDE можно переключаться в выпадающем списке. А тут только ctrl+f выручает.
Наверное надо бы кейворды поиска прописать в самом начале файла.

Reobne
26.10.2019, 15:50
Ещё и notepad++ с подсветкой синтаксиса лажает, когда в Паскале вдруг видит записи вроде ASM(Label);.
Я уже писал Andrew771, что он в наглую использовал ранее зарезервированное ключевое слово паскаля. Надеюсь в следующей версии он исправит название, например на CallAsm. Тогда подсветка синтаксиса будет правильной.

Написал я новую Im2INIT, но хотел проверить и не смог. Музыка играет, IM 2 включён, а игра не фурычит. Подозреваю что дело в галочках. Опять-же Andrew771-ю я уже писал. Если-бы специфичные ключи проекта были-бы в тексте PRG, ты бы их мне не забыл прислать.

Ладно, пока что публикую IM2INIT без проверки.


IM2INIT
ld a,Im2TabHi
ld i,a
im 2
ei
ret

Im2TabHi EQU ($+255)/256
Im2Tab EQU Im2TabHi*256
defs 257+(Im2Tab-$),Im2GoByte

Im2GoByte EQU ($+256)/257
Im2Go EQU Im2GoByte*257
defs Im2Go-$
push af
push hl
push de
push bc
ex af,af'
exx
push af
push hl
push de
push bc
push ix
push iy
call MUSPLAY
ld hl,FrameCounter
inc (hl)
pop iy
pop ix
pop bc
pop de
pop hl
pop af
ex af,af'
exx
pop bc
pop de
pop hl
pop af
ei
ret




Ваще-та модуль так и сделан в виде DEFB
Асмом там сделан лишь плеер. Они же в разных адресах раскиданы.
Если так, то я ляпнул не изучивши. :)

- - - Добавлено - - -

Написал BAT-ник с ключами -a -b -c -d -e, лучше стало. Но нажав "A", спрайт Алисы уехал влево. Думаю таково текущее состояние проекта.


Andrew771, Спасибо за исходники LikePascal!!! Перекомпилировал с небольшими изменениями, ибо он не мог найти файл "libasm.lib"
Добавил путь ExtractFilePath(Application.ExeName)+'libasm.lib', чтобы искал в той-же папке, что и exe-шник.
Да ещё-же, пока в отладку не вошёл, не понимал какой файл он не может найти.
Над обработкой исключений надо-бы тоже поработать.

ALKO
26.10.2019, 16:51
Но нажав "A", спрайт Алисы уехал влево. Думаю таково текущее состояние проекта.
Да, всё верно. Управление ещё в процессе. Но я её уже научил вправо перемещаться. Только вот диагонали ещё не работают.
Надо городить дополнительные IF-ы. А ведь это нет ещё IF-ов на определение коллизии с объектами, как и на их генерацию.
Вот почему мне и нужен был ультра-быстрый скролл. Навесив игровую логику он будет уже не таким быстрым.

Reobne
26.10.2019, 19:39
Да, встроенная функция, дающая два кода клавиш, как-то не очень подходит для игр. Нажав диагональ и огонь - это уже три кнопки. Да и опрашивать каждый раз каждую клавишу клавиатуры, шифровка в две позиции. Потом расшифровка этих позиций... слишком много траты проц времени. Сейчас напишу альтернативный клавиатурный опросник.

- - - Добавлено - - -


KEY_1 EQU 0FEF7H
KEY_2 EQU 0FDF7H
KEY_3 EQU 0FBF7H
KEY_4 EQU 0F7F7H
KEY_5 EQU 0EFF7H
KEY_0 EQU 0FEEFH
KEY_9 EQU 0FDEFH
KEY_8 EQU 0FBEFH
KEY_7 EQU 0F7EFH
KEY_6 EQU 0EFEFH
KEY_Q EQU 0FEFBH
KEY_W EQU 0FDFBH
KEY_E EQU 0FBFBH
KEY_R EQU 0F7FBH
KEY_T EQU 0EFFBH
KEY_P EQU 0FEDFH
KEY_O EQU 0FDDFH
KEY_I EQU 0FBDFH
KEY_U EQU 0F7DFH
KEY_Y EQU 0EFDFH
KEY_A EQU 0FEFDH
KEY_S EQU 0FDFDH
KEY_D EQU 0FBFDH
KEY_F EQU 0F7FDH
KEY_G EQU 0EFFDH
KEY_EN EQU 0FEBFH
KEY_L EQU 0FDBFH
KEY_K EQU 0FBBFH
KEY_J EQU 0F7BFH
KEY_H EQU 0EFBFH
KEY_CS EQU 0FEFEH
KEY_Z EQU 0FDFEH
KEY_X EQU 0FBFEH
KEY_C EQU 0F7FEH
KEY_V EQU 0EFFEH
KEY_SP EQU 0FE7FH
KEY_SS EQU 0FD7FH
KEY_M EQU 0FB7FH
KEY_N EQU 0F77FH
KEY_B EQU 0EF7FH

KEYTEST
pop hl
inc hl
ld a,(hl)
inc hl
in a,(0feh)
or (hl)
inc hl
inc a
RLCA
AND 1
ld (_KEYPRESSED),a
jp (hl)

_KEYPRESSED defw 0

использовать нужно так(проверка пробела):
asm(keytest)
asm(key_sp);
if keypressed<>0 then game_state:=1;

Именно два вызова подряд. Второй вызов это не вызов, а передача константы.
Переменная keypressed возвращает 0-не нажато или 1-нажато.

- - - Добавлено - - -

На счёт проверки коллизий, тоже есть идея, как сделать это проще. Завести матрицу 32 на 16, и там хранить номер объекта, и нужно-ли очистить это знакоместо. Две проблемы сразу решатся.

Завтра попробую написать.

ALKO
26.10.2019, 23:14
Неплохо. Но для диагональных перемещений высокоуровневые IF-ы всё равно нужны.
Проверить клавишу то я проверю, но ведь там отличается затирание следа атрибутами при том или ином направлении.
А если делать выше указанным методом, то персонаж будет летать ступеньками, а не диагоналями. То бишь вложенные IF-ы таки нужны.

- - - Добавлено - - -

Процедура затирания следа от персонажа усложняется ещё тем, что сам персонаж не все знакоместа отведённого ректангла использует (в виду экономии памяти и скорости обновления).

Reobne
27.10.2019, 10:09
Писал-писал, но не дописал.
Написал процентов 80. Конец уже виден. :)
Вечером постараюсь выкроить ещё время.

Стараюсь добавлять комментарии. Патчу встроенные процедуры. (Возможности написать свою библиотеку, аналогичную встроенной, сильно не хватает.) Процесс идёт... :)

Reobne
27.10.2019, 20:30
Закончил писать, начал отлаживать.
И сразу заметил, что клавиатурный проверятель работает не совсем удобно, ноль правильно выдаёт, когда не нажато, а когда нажато - всякий разный неноль. А хотелось-бы чтобы именно 1. Исправил (https://zx-pk.ru/threads/24967-zx-like-pascal.html?p=1031484&viewfull=1#post1031484)

Reobne
28.10.2019, 08:00
ALKO, Доотлаживал, добился что прога запустилась. Прислал по почте.

Andrew771, Пока отлаживал, заметил, что иногда оптимизатор LikePascal-я влияет на логику. Когда результат работы с однобайтовой переменной остаётся двубайтовый в HL. При переполнении старший байт изменяется, естественно не сохраняется в ячейке переменной, но используется в следующих операциях.

Как илюстрация, иногда этот IF сработает:
byte1:=byte1-dby;
if byte1=65535 then

Когда команды идут сподряд. А если их разбить, вставив между ними что нибудь, то уже не сработает. Так как произойдёт повторная загрузка из ячейки byte1, с обнулением старшего байта. И тут уже нужно сравнивать с 255.

Andrew771
28.10.2019, 09:26
Если переменная однобайтовая, то зачем ее сравнивать с 65535? Я в инструкции к Паскалю написал, что за типами переменных следит программист. Проверки на типы и выходы из диапазона не стал делать, чтобы не замедлять и не разрастать код.

Reobne
28.10.2019, 10:08
Если переменная однобайтовая, то зачем ее сравнивать с 65535?
Для илюстрации.
Переменная равна 255, но сравнивать её с 255 бесполезно.
Перечитай моё сообщение внимательнее.
За переполнением мы прекрасно следим, и знаем что у нас, при отнимании 1 от нуля должно получиться 255.

Andrew771
28.10.2019, 15:40
Переменная равна 255, но сравнивать её с 255 бесполезно.
Ты писал про 65535, а не 255. С 255 нормально сравнится.


За переполнением мы прекрасно следим, и знаем что у нас, при отнимании 1 от нуля должно получиться 255.
Отрицательные числа этим Паскалем сейчас не поддерживаются, так что лучше не получать заведомо отрицательные числа. Про переполнение думаю в будущей версии, чтоб было, как правильно (0-1=255).

Bolt
28.10.2019, 16:14
Andrew771, он вот про что:


byte1:=byte1-dby;

переменная типа byte, в ней значение 0...255, даже если ушли в минус


if byte1=65535 then

значение типа byte никогда не будет равно 65535, но результат сравнения при определённых условиях всё-таки true из-за оптимизаций в компиляторе.

- - - Добавлено - - -

Reobne, может и мою поделку потестируешь? :)

- - - Добавлено - - -


Отрицательные числа этим Паскалем сейчас не поддерживаются, так что лучше не получать заведомо отрицательные числа.
Поделюсь проблемой, с которой можешь столкнуться в отрицательных числах.


var x,y:longword;
begin
x:=0;
if (x-1)=$FFFFFFFF then ...
y:=$FFFFFFFF;
if (y-1)=$FFFFFFFE then ...
end.

Попробуй представить ассемблерный код, который учтёт, что X-1=-1 и это -1 не равно $FFFFFFFF, а вот Y-1 всё-таки равно $FFFFFFFE.

Reobne
28.10.2019, 17:42
Попробуй представить ассемблерный код, который учтёт, что X-1=-1 и это -1 не равно $FFFFFFFF, а вот Y-1 всё-таки равно $FFFFFFFE
Это будет уже больше чем Паскаль. В обычном Паскале к этому относились проще. Хотя это позорная неоднозначность, заставляет программиста делать эксперименты, чтобы проверить как именно работает конкретный компилятор. Если он будет вычислять в 32битной арифметике, то результат один, а если приведёт всё к 64-битным числам, то другой.
А ты хочешь сделать действительно математический Паскаль. Такой Паскаль должен решать эту проблему на этапе компиляции. Он должен действительно понимать, что такое типы, и каковы их интервалы с математической точки зрения. По идее он должен воспринимать какие угодно большие константы. byte должен быть интервальным типом 0..255, shortint = (-128..127), и так далее.
Такой компилятор, на этапе компиляции поймёт, что в результате вычисления (x-1) получатся числа в интервале -1..$fffffffe, и это число будет заведомо не равно $ffffffff, а значит, такой IF вообще можно не кодировать.
Такой компилятор, также в принципе правильно обработает условие x<83465834856289346582364852634895632846589364856348 . Хотя нет фиксированного типа, в котором можно было-бы сохранить такую константу, но на этапе компиляции видно, что условие будет выполнено всегда.

ALKO
29.10.2019, 11:45
Как бы впендюрить AY-озвучку эффектов?
Биперные эффекты встроенные в паскаль, это конечно круто, но на дворе 21ый век, нужно идти в ногу со временем, использовать самые современные технологии.

Качал когда-то какой-то кросс-редактор AY-FX что-то такое. Но так и не разобрался в нём.
Опять же, проблема ещё и с многозадачностью, чтоб и графон успевало обновлять, и музон играть, и звуки.

Reobne
29.10.2019, 12:38
Да не думай, эффекты на AY много процессора не занимают.
Попробуй ещё раз разобраться в AY-FX редакторе. Треккеры-же ты осилил, а тут даже немного проще.
А вставить эффекты в прогу, в которой уже есть IM 2, это дело техники. Тут тебе многие смогут помочь, хоть и я. Нужно только потом решить сколько и каких каналов музыки приглушать, на время эффекта. Для начала по простому, выделить канал, и гнать в него эффект до конца, если придёт другой эффект, то прекращать текущий и начинать новый. Как эффект доиграет до конца, возвращать музыку с этого канала.
А потом можно улучшать. Добавить правил приоритетов. Разрешить иногда ещё один канал использовать. Возможно за громкостями следить, и играть самые громкие.

- - - Добавлено - - -

Есть ещё заморочка с огибающей. Она только одна на все каналы. Поэтому либо её пользует музыка, либо эффекты. Надо решить.

ALKO
29.10.2019, 13:29
.А вставить эффекты в прогу, в которой уже есть IM 2, это дело техники.

Вот это как раз для меня и проблема.
Как мутятся сами эффекты я разобрался. А вот инъектировать да ещё с многозадачностью в асм, это уже сложновато.

Reobne
29.10.2019, 20:05
А вот инъектировать да ещё с многозадачностью в асм, это уже сложновато.
На сколько я понимаю - универсального готового решения нет, а сам ты ассемблер не знаешь и знать не хочешь. Для того кто знает ассемблер и AY это дело техники. Просто найди такого человека, дай ему музыку и эффекты, и по возможности расскажи что ты хочешь, на уровне "...А когда я вызову Boom1 пусть на канале B проиграется третий эффект, а если MegaBoom, то на трёх каналах сразу..." Ну, или если и так не сможешь, тогда он сам пускай послушает каналы музыки, громкости и продолжительности эффектов, и сам сообразит как это лучше запрограммировать.

Reobne
30.10.2019, 05:54
а сам ты ассемблер не знаешь и знать не хочешь.
Прости, я может грубовато выразился. Я имел ввиду, что ты ассемблер не до такой степени знаешь, и изучать его не планируешь. А значит всего-лишь надо найти программера. Для которого это будет рядовая работа с гарантированным результатом. Если что - пиши мне, я сделаю. Если я тебе надоел, пиши другому. Может кому-то в личку надо написать, тогда только он ответит.

А вообще можно было-бы сделать, хотя-бы несколько вариантов AY плееров, которые бы играли музыку и эффекты. Я вот сейчас глянул, в комплекте с AYFX идёт только один пример, в котором предлагается играть музыку на втором AY. :v2_dizzy_facepalm:
Надо как-то подумать о нескольких стандартных вариантах. Первый с тупым обрыванием, второй с приоритетами, третий с сравнением по громкостям.

ALKO
30.10.2019, 13:25
. второй с приоритетами, третий с сравнением по громкостям.

Это лишнее.
Хватит и наглого заимствования фиксированного канала.

ALKO
03.11.2019, 13:19
Как думаете, почему такое (https://zx-pk.ru/threads/30330-ishchu-zhelayushchikh-vystupit-v-roli-programmista.html?p=1032623&viewfull=1#post1032623) происходит при ниже указанном коде?
Со стеком чё-то пересекается?


procedure GameOver;
begin
if gameover_flash>0 then
begin
Color(0);
ClrScr;
gameover_flash:=0
end
else
begin
Color(20);
ClrScr;
gameover_flash:=1;
gameover_flash_count:= gameover_flash_count+1;
if gameover_flash_count=10 then game_state:=0;
end;

end;

- - - Добавлено - - -

А вообще ClrScr много лишних операций. Ведь мне всего-то достаточно массив атрибутов перебрать, а пиксельный слой не трогать.
Ща переделаю значит.

Andrew771
03.11.2019, 16:24
Процедуру GameOver наверно много раз запускаешь, вот она туда-сюда и переключает экран, gameover_flash туда-сюда переключается.

ALKO
03.11.2019, 16:33
Процедуру GameOver наверно много раз запускаешь, вот она туда-сюда и переключает экран, gameover_flash туда-сюда переключается.

Так это ж для имитации взрыва моргаю экраном.
Нэ.
Тут проблема в другом.
Нынешняя процедура вывода спрайтов предложенная Reobne требует особый подход.
Я хоть и переделал мерцание на сугубо атрибутное, но при последовательности игра-гамовер-меню-игра на последнем этапе висняк с гличами.
Что-то где-то происходит с таблицей затирания спрайтов, по всей видимости.

Reobne
04.11.2019, 05:36
ALKO, Шли мне прогу, и напиши в двух словах, что ты планируешь получить.

ALKO
04.11.2019, 14:22
ALKO, Шли мне прогу, и напиши в двух словах, что ты планируешь получить.

С обновлёнными процедурами вывода спрайтов/колижн-детекшона выше упомянутый цикл работает теперь без трабл.
А почему я дважды скроллил пол, и лишь на каждую вторую итерацию сдвигал препятствия - для синхронизации оных с верхней частью пола.

ALKO
17.11.2019, 22:21
Ну а всё-таки?
Как сделать проверку чётности числа?
Или придётся городить очередной асм-костыль, и там проверять младший бит?

Bedazzle
17.11.2019, 23:04
Ну а всё-таки?
Как сделать проверку чётности числа?
Или придётся городить очередной асм-костыль, и там проверять младший бит?

Разделить на два, округлить, умножить на два, найти разницу.

ALKO
18.11.2019, 12:27
Разделить на два, округлить, умножить на два, найти разницу.

Не слишком ли много лишних операций для бедолаги Горбатого?
Да и округлённые значения там так или иначе будут. Ведь переменная 8 бит - 0..255.

- - - Добавлено - - -

Видимо, придётся через асм.
Грузить переменную в аккумулятор.
Прямо в нём должен быть флаг чётности.
Только уже запамятовал, каким образом его проверить... У меня и шпаргалки по мнемокомандам Z80 не сохранилось

Bolt
18.11.2019, 13:36
Нужна чётность в смысле "2, 4, 6..." или проверка на чётное количество бит?

Andrew771
18.11.2019, 14:14
Как сделать проверку чётности числа?
if x%2=0 then <число четное>

Т.е. разделить на два и проверить остаток.

Error404
18.11.2019, 21:52
Четность это же 0 в младшем разряде числа, не? Тогда проверить
if x and 1 = 0 then <число четное>
Всяко быстрее делений

ALKO
18.11.2019, 23:42
if x and 1 = 0 then <число четное>
Всяко быстрее делений

Не знал, что в этом пасцале есть булевые ф-ции.
Ща попробую.

Andrew771
19.11.2019, 10:10
Не знал, что в этом пасцале есть булевые ф-ции.
Побитовых функций нет. Так что, что написал Error404, не сработает.
Булевы and и or есть только для логических операций типа: if x=0 and y=1 then...

ALKO
08.12.2019, 15:14
Reobne, я вот ща сижу над кодом, и чешу репу... Как мне модифицировать CLEAR_OLD_SPRITES, чтоб он в следующем этапе выполнял очистку и в той области, где на данный момент скроллится пол?
Дело в том, что там у меня пол не бесконечный. С плавными переходами. И вот я сейчас пол убрал, а оказывается спрайты в том месте не очищаются.

ALKO
04.02.2020, 22:31
ATTR
ld a,(_ATTRY)
ld b,a
ld a,(_ATTRX)
ld c,a
; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A
LD A,(_ATTRC)
LD (HL),A
RET

Что сюда добавить, чтоб работала проверка _ATTRX / _ATTRY -> RET когда значения выходят за пределы экрана?

blackmirror
04.02.2020, 22:34
cp a,31/ret c/cp a,23/ret c

ALKO
04.02.2020, 22:41
Так будет работать?



ld a,(_ATTRY)
CP 24
JR C, CONTINUE1
RET

CONTINUE1
ld b,a
ld a,(_ATTRX)
CP 24
JR C, CONTINUE2
RET

CONTINUE2
ld c,a
LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A
LD A,(_ATTRC)
LD (HL),A
RET



- - - Добавлено - - -


cp a,31/ret c/cp a,23/ret c

Оуу... даже так...

Спасибо.

Dart Alver
04.02.2020, 22:49
ATTR
ld a,(_ATTRY)
ld b,a
ld a,(_ATTRX)
ld c,a


cp a,31/ret c/cp a,23/ret c
Наверно всётаки nc и 32/24


ld a,(_ATTRY)
cp 24
ret nc
ld b,a
ld a,(_ATTRX)
cp 32
ret nc
ld c,a

ALKO
04.04.2020, 19:05
АХТУНГ
БАГРЕПОРТ!

Возникла необходимость с копированием изображений.

Набросал тестовую прогу на паскале (кстати, по какому адресу происходит WindowGet. То есть куда сохраняет?)

Program EX4;
var
i: word;
begin

textbackground(4);
textcolor(2);
WindowSet(0,0,9,9);


WindowGet;

WindowSet(10,10,9,9);

WindowPut;

end.


Так вот, полученный асм сурс закидываю в Эму Зэт Вин, но соответствующие процедурки в исходник не добавляются
https://sun1.43222.userapi.com/Lpghv-uOKUTNK7iQESI-xknWy6997qt1DwyUNw/y2aSBkX4fOw.jpg

Andrew771
05.04.2020, 14:27
Проверил, всё работает. У тебя точно версия Паскаля 0.909?
Я такой код вводил:


Program EX4;
var
i,zwet: word;
begin
write('aaa');
WindowSet(0,0,9,9);
WindowGet;
clrscr;
write('нажмите любую клавишу');
readln;
clrscr;
WindowSet(0,0,9,9);
WindowPut;

end.

- - - Добавлено - - -


Набросал тестовую прогу на паскале (кстати, по какому адресу происходит WindowGet. То есть куда сохраняет?)
Твой код тоже нормально компилируется в версии 0.909.
Изображение сохраняется в область для виртуального экрана. Так что, использовать виртуальный экран и WindowGet/Put в одной программе не рекомендуется.

ALKO
05.04.2020, 14:32
У тебя точно версия Паскаля 0.909?
Экзешник zxlikepascal0909
Вроде он...

Andrew771
05.04.2020, 14:35
Да, всё правильно. libasm.lib надеюсь тоже родной от 0.909.
Должно работать.

ALKO
05.04.2020, 17:35
libasm.lib надеюсь тоже родной от 0.909.

Вот и причина. Либа была от старого билда.

- - - Добавлено - - -

По-дефолту оно копирует в 57344 ?

- - - Добавлено - - -

Пытаюсь продумать алгоритм действий. Мне каждый раз надо будет драконить адрес виртуального экрана, так как надо накопировать кучу изображений по разным адресам. Ещё и оффсет одной пикчи относительно другой вычислять, ибо размеры картинок разные.

Andrew771
05.04.2020, 21:29
Ты бы взял процедуру putimage из файла libasm.lib и немного скорректировал под свою задачу, а потом вставил бы в качестве ассемблерной вставки в свою паскалевскую программу. Процедура выводит прямоугольную область на экран. Формат там нужно реинжинирить.

- - - Добавлено - - -


По-дефолту оно копирует в 57344 ?
да

- - - Добавлено - - -

Сейчас глянул процедуру putimage. Там всё просто. До вызова процедуры в ячейках col_window, row_window, width_window, height_window задается левый верхний столбец, левая верхняя строка, ширина и высота окна в знакоместах на экране, а также адрес addr_virt_screen, где лежит изображение. Процедура копирует изображение на экран.
Формат изображения:
все байты первой пиксельной строки
все байты второй пиксельной строки
...
все байты последней пиксельной строки
все атрибуты для всех знакомест подряд от левого верхнего до правого нижнего (если есть)

- - - Добавлено - - -

Т.е. изображение разбито не по знакоместам, а по пиксельным строкам

ALKO
05.04.2020, 21:51
Т.е. изображение разбито не по знакоместам, а по пиксельным строкам

Это и плохо, с пэинтбрашем напрямую подружить не получится, так как у него байты идут по 8 на каждое знакоместо, а не построчно.

Andrew771
05.04.2020, 21:55
Это и плохо, с пэинтбрашем напрямую подружить не получится, так как у него байты идут по 8 на каждое знакоместо, а не построчно.
Зато намного быстрее, чем познакоместно.
Придется тебе вручную перековыривать байты от пэинтбраша. Ну либо использовать спрайты в Паскале, там познакоместно.

LW
05.04.2020, 22:40
ZX-Paintbrush сохраняет выделенную область в формате ASM data file как раз построчно. Сначала данные, потом атрибуты.

ALKO
06.04.2020, 00:17
скопипастил процедурку putimage из либы.


Экспортнул из пэинтбраша регион 9х9 знакомест (по методу сперва пиксели (таки да, они линиями выстроены) затем массив атрибутов)

Но получившаяся программа ресетится.
Можете глянуть, что я не так делаю опять?
Исходник в приложении

Andrew771
06.04.2020, 15:51
Исправил твой исходник, переименовал все переменные, чтобы не пересекались с Паскалевскими.
Картинка выводится, только изображение неверное, проверь последовательность байтов.

Файл заменил в 17:21, если скачал раньше, перекачай :)

ALKO
06.04.2020, 17:47
Картинка выводится, только изображение неверное, проверь последовательность байтов.
чёт непонятно вообще какой участок вывелся. Его ещё и многократно размазало.
Видимо, придётся велосипедить свою процедурку.

А последовательность байтов указана же в комментариях. Там Y строк меняется после каждого прохода.

Andrew771
06.04.2020, 17:55
Это вывелся кусок моего тестового спрайта.
А твой не хочет. Может строки перепутаны?

- - - Добавлено - - -

У тебя первая строка должна быть 9 байтов, вторая 9 байтов и так всего 72 раза. А в файле другое.
Мой спрайт 5х5 знакомест, поэтому в каждой строке по 5 байт, а всего 40 строк.

ALKO
06.04.2020, 18:17
. Может строки перепутаны?
судя по той каше, что он выводит, складывается ощущение, что перепутан вообще адрес, ссылающийся на картинку.

- - - Добавлено - - -


Это вывелся кусок моего тестового спрайта.
А твой не хочет. Может строки перепутаны?

- - - Добавлено - - -

У тебя первая строка должна быть 9 байтов, вторая 9 байтов и так всего 72 раза. А в файле другое.

Пробовал задавать 8 знакомест ширину/высоту окна

- - - Добавлено - - -



Пробовал задавать 8 знакомест ширину/высоту окна

хотя это странно. Ведь я же выделял 9х9 знакомест область в редакторе. Почему он экспортит по 8 байт, непонятно.

- - - Добавлено - - -


Что ещё более странно, атрибутов он генерит как раз 9 на ряд.

Andrew771
06.04.2020, 18:19
да, скорей всего, дело в конвертации. Можь, там опция какая?

ALKO
06.04.2020, 18:20
не. По-моему там всё-таки не линиями.
Ибо в каждом ряду по 8 байт (что и составляет одно знакоместо из 8-ми полосочек). А рядов как раз ровно столько, сколько знакомест. Значит там всё-таки по-знакоместная генерация.

Andrew771
06.04.2020, 18:22
А у тебя в проге таких спрайтов много? Можь всё-таки делать обычные спрайты в Паскале?

ALKO
06.04.2020, 18:41
А у тебя в проге таких спрайтов много? Можь всё-таки делать обычные спрайты в Паскале?

даже для обычных спрайтов там надо вручную координаты каждого знакоместа указывать. Это мало того что муторная работа, так ещё и лишняя инфа.
Тем более пикчи есть и довольно массивные.

Andrew771
06.04.2020, 18:48
Есть моя утилитка для спрайтов, тут (https://zx-pk.ru/threads/24967-zx-like-pascal.html?p=794106&viewfull=1#post794106)
Она координаты рассчитывает автоматически.

Посмотрю ZX-Paintbrush, почему он не может перевести, как надо в пиксельные строки.

ALKO
06.04.2020, 19:00
Есть моя утилитка для спрайтов, тут
Она координаты рассчитывает автоматически.
Но атрибуты надо вручную всё равно вбивать

Andrew771
06.04.2020, 19:40
Нашел, как в ZX-Paintbrush правильно экспортировать в Асм. Для примера - спрайт 5х6 знакомест, см. скриншот, что надо выставить. Тогда правильно сконвертируется.

- - - Добавлено - - -

Т.е., для твоего спрайта нужно ставить 9 в обоих местах.

ALKO
06.04.2020, 19:41
Я пробовал шаманить с теми опциями. Но почему-то всё равно по-знакоместно выстраивается :\

Andrew771
06.04.2020, 19:50
Свою картинку можешь прислать? Я попробую.

ALKO
06.04.2020, 19:56
Воть.

Кстати. А какая версия браша?

У меня 2.6.1, если что.

Andrew771
06.04.2020, 20:11
Версия 2.6.4. Поставил девятки, всё прекрасно конвертанулось, см.файл.

ALKO
06.04.2020, 21:55
СТРАННО


скачал 2.6.4.
Нажимаю экспорт файл селекшн
Ставлю макс байтс пер лайн для пикселей и атрибутов по 9 - и всё равно оно раскидывает по знакоместам. Што за

- - - Добавлено - - -

Также пробовал выделять экспортируемую область, и без выделения.

- - - Добавлено - - -

Тю блин. Я невнимательный.
У меня стояла опция блок бэйзед по-умолчанию. Это я не доглядел.

Andrew771
06.04.2020, 21:58
ALKO, получилось?

ALKO
06.04.2020, 22:00
А ещё такой глупый вопрос.

col_window1
row_window1
width_window1
height_window1
_
всё это числовые переменные, и их можно задавать из паскаля.

А как быть с ld hl,sprite1 ?
Или тут только вручную придётся рассчитывать адреса ? По лейблам из паскаля обращаться никак нельзя?

- - - Добавлено - - -


ALKO, получилось?

да. Прост упустил момент со вкладкой лайн-бэйзед

Andrew771
06.04.2020, 22:02
Не, их уже нельзя задавать из Паскаля, т.к. я единичку на конце поставил. Ну можешь обратно вернуть.
А sprite1 да, только ассемблерной вставкой.

- - - Добавлено - - -


Ну можешь обратно вернуть.
точнее, их самих удалить, а задавать всё через команду WindowSet

ALKO
06.04.2020, 22:03
Не, их уже нельзя задавать из Паскаля, т.к. я единичку на конце поставил.

Я имею ввиду Asm() вызов с соответствующим присвоением переменных.

Andrew771
06.04.2020, 22:04
Я имею ввиду Asm() вызов с соответствующим присвоением переменных.
да, теперь только так

ALKO
07.04.2020, 13:27
А как бы эту процедурку использовать в связке с декомпрессорами?
Ведь в том же bmp2scr декомпрессия происходит в растр screen$ (хоть сам адрес можно задавать кастомный). А нужна лишь отдельная область распакованного screen'a.

Или может есть такие компрессоры, которые распаковывают в таком же формате - по линиям n-ширины?

Есть идеи на сей счет?

Andrew771
07.04.2020, 15:45
Про компрессию ничего не знаю, пусть ответят знающие люди, можно спросить в другой теме.

Я вот что подумал про переменные col_window1 и др. Наверняка тебе понадобится их расчет координат в программе. Так чтобы не делать его на ассемблере, а в Паскале, лучше использовать паскалевский оператор WindowSet, и в процедуре вывода использовать стандартные col_window и др. (без единиц). Инициализировать их на ассемблере не надо, это делает Паскаль.

ALKO
07.04.2020, 16:58
с координатами под асмом проблем нет.
Уже спокойно орудую ими.
Другое дело что за оффсетом адресуемых картинок, раскиданных по памяти надо следить. И подозрение, что 40кб для всех пикч и музла может попросту не хватить, если не воспользоваться хотя бы банальным RLE.

Andrew771
07.04.2020, 17:29
У меня такие же проблемы с памятью в двух последних разрабатываемых играх, в 48к никак не хотят умещаться все хотелки, подумываю о нехорошем - 128к.

ALKO
08.04.2020, 22:40
Почему-то при попытке добавить воспроизводилку музыки через IM2 прога виснет.

А когда я пробую Im2 процедурку скопировать отсюда:
https://arcadegamedesigner.proboards.com/thread/282/ay-background-music

ZX паскаль не добавляет ряд своих процедур при компиляции.

ALKO
09.04.2020, 00:55
Всё, пашыт. Я просто старую версию Im2 процедурки Reobne брал.

Andrew771
09.04.2020, 14:48
Музыку лучше добавлять в уже скомпилированный файл asm, т.к. Паскаль библиотеку добавляет в самый конец - моя недодумка.

ALKO
10.04.2020, 01:33
Какой-то заскок у паскаля
Сперва всё шло норм.

А в какой-то момент он перестал добавлять процедурки вывода спрайтов. Хотя пишет, что компиляция успешна, ошибок нет.
Дублирующихся лейблов старался не делать

https://sun1.43222.userapi.com/qXnN9datztuwzmCNmqpqxWCmfYok5wdNiReGoQ/sBYOBJJ2W9s.jpg

- - - Добавлено - - -


Паскаль библиотеку добавляет в самый конец - моя недодумка.
А по каким конкретно адресам он добавляет либы?

- - - Добавлено - - -

У меня музыка как раз расположена в самом конце.
Но с ней компилилось норм.
А потом вот такая борода произошла.
Пробовал вернуть всё взад - бестолку.
Пробовал музыку вообще убрать. Те же эрроры.

Пасцал не генерит никаких TEMP файлов, где эта чача могла бы засесть ? non_opt_code.txt и error.prg удалял, всё равно те же ошибки.

- - - Добавлено - - -

Сама процедурка put_spr_put добавляется в сурс.
И внутри неё метки put_spr_put_03 put_spr_put_04
а 02 нет.
Чё это такое? :(((((((((((((((((((((((

- - - Добавлено - - -

как мне кажется, какая-то байда с кодировками полученного ASM-а и компилятора EmuZwin.
Часть кода уехало в комментарии, там же оказался и put_spr_put_02

Но когда я раскомментил то, что обнаружил, частично заработало, однако процедура вывода спрайтов бажит сильно, чё-то где-то поехало...

- - - Добавлено - - -

Ага. Преобразовал ASM в ANSI, всё заработало. Хух. Аж отлегло.

Andrew771
10.04.2020, 21:50
А по каким конкретно адресам он добавляет либы?
Просто в конце асма добавляет, после пользовательских асмовых вставок (а надо бы до).


Ага. Преобразовал ASM в ANSI, всё заработало. Хух. Аж отлегло.
я уж подумал, покоцал файл libasm.lib.
Ну ладна, хорошо, что всё хорошо закончилось.

ALKO
10.04.2020, 22:03
Просто в конце асма добавляет, после пользовательских асмовых вставок (а надо бы до).
У меня часть асмовых вставок задана железно (процедура плеера, хз как его дизассемблировать из вортекса с сохранением всех лейблов, поэтому там строго прописаны адреса в call jr jp и тд)

И вот я щас как раз столкнулся с проблемой такой.

У меня ещё 9 кб пустует до плеера+модуля. А паскаль жахает свои либы после него. Особенно прожорливое вышел Random(). Стоит мне его добавить в прогу - висняк, ибо под самое FFFF лезет, грубо говоря. Ну, стек коцается, возможно.

Andrew771
10.04.2020, 22:27
Random() - короткая процедура.
Ты музыку добавляй уже в откомпилированный асм.

ALKO
11.04.2020, 01:20
Ты музыку добавляй уже в откомпилированный асм.

Да, так заработало.

Неудобно правда каждый раз тыкаться. Но придётся с этим смириться.

ALKO
17.05.2020, 21:06
Можно ли как-то объявить процедуру на строки до её вызова, а само тело прописать уже ниже?

Блин, отсутствие модульности это жесть как неудобно.

Andrew771
18.05.2020, 09:03
Т.е. forward? Нет. Тело процедуры должно быть раньше ее вызова.
На днях выпускаю новую версию, где пользовательский код идет в самом конце после всех библиотек. Плюс изменения по выводу спрайтов. Теперь единый формат будет, вне зависимости от флага атрибутов. А цвет спрайта задается в операторе вывода.

ALKO
18.05.2020, 09:53
Круто!
А per-pixel позиционирование спрайтов будет? Хотя бы OR без маски
Или подскажите, где откопать хороших asm процедурок.

- - - Добавлено - - -


А цвет спрайта задается в операторе вывода.

Т.е. в одном коде можно будет как одноцветные спрайты использовать, так и предварительно разукрашенные массивом в DEFB?

Как одноцветные спрайты будут взаимодействовать с уже имеющимся paper-ом фона? Будут затирать своим? Или ink свой, а paper берется из области размещения? Тут бы тоже флаг на выбор не помешал.

Andrew771
18.05.2020, 10:27
Пиксел-позиционирования пока не будет, но подумываю. Т.к. мне писать игру Z, где возможно сделаю попиксельный скроллинг.
Процедуры я обычно выискиваю здесь (http://zxdn.narod.ru/coding.htm#gfxsprs)


Т.е. в одном коде можно будет как одноцветные спрайты использовать, так и предварительно разукрашенные массивом в DEFB?
Теперь в массиве DEFB вообще не будет атрибутов. Формат спрайтов всегда один и тот же будет, во всех программах. Цвет FLASH+BRIGHT+PAPER+INK задается только в операторах SpritePut, новый однобайтовый параметр. Правда, из-за этого спрайт может быть только одноцветным (один ink и один paper). Цвет спрайта можно менять в операторе SpritePut - это арифметическое выражение, можно подставлять переменные, константы, выражения. Раньше можно было только жестко задавать в DEFB.



Как одноцветные спрайты будут взаимодействовать с уже имеющимся paper-ом фона? Будут затирать своим? Или ink свой, а paper берется из области размещения? Тут бы тоже флаг на выбор не помешал.

Будут затирать своими атрибутами. Но это не печально, т.к. цвет можно рассчитывать в параметре SpritePut, обычное арифметическое выражение.
А также, если не используются атрибуты в программе (выключен флаг атрибутов), то цвета спрайтов игнорируются.

ALKO
18.05.2020, 11:01
. Правда, из-за этого спрайт может быть только одноцветным

Карочь, решили свести универсальность среды на минимум.


.А также, если не используются атрибуты в программе (выключен флаг атрибутов), то цвета спрайтов игнорируются.

AGD стиль тоже ни к чему.
Фишка с "цвет (ink) спрайта, пейпер фона" куда полезнее.
Так как поверх одного и того же фона бегают спрайты разной окраски, зачастую.

Andrew771
18.05.2020, 11:34
Карочь, решили свести универсальность среды на минимум.
Да. Но тоже есть сомнения, нужно ли это. На днях сделал универсальность еще большую - оставил атрибуты в DEFB, как было, а также добавил задание цвета в SpritePut. Если в SpritePut задан 0, то цвет спрайта берется из DEFB (можно делать разноцветные знакоместа спрайта). Если не 0, то берется цвет из оператора. Но посчитал это сложным для программиста. Может всё-таки оставить?

Еще я сократил количество флагов компиляции с 8 до 3 для упрощения:
- атрибуты (вся программа либо цветная, либо монохромная. Раньше можно было отдельно задавать цветность для текста, окон, спрайтов и карт);
- проверка краев спрайтов (оставил, как было. Но подумывал снести и жестко проверять всегда. Но ухудшилось бы быстродействие для программ, где проверка краев спрайтов не нужна);
- виртуальный экран (теперь действует на всех сразу, а не по отдельности для текстов, спрайтов и карт).

Andrew771
18.05.2020, 16:03
Фишка с "цвет (ink) спрайта, пейпер фона" куда полезнее.
Так как поверх одного и того же фона бегают спрайты разной окраски, зачастую.
А как восстанавливать изображение фона и цвет фона после прохождения спрайта? Для этого в Паскале имеются операторы WindowGet, WindowPut (запомнить окно экрана до вывода спрайта; вывести обратно окно после прохождения спрайта). Либо, если много движущихся спрайтов, использовать виртуальный экран с полной перестройкой изображения экрана.

Andrew771
20.05.2020, 17:25
Свершилось! Наконец спустя более 5 лет после начала разработки я выпускаю официальную версию 1.0, можно скачать в первом посте.

По сравнению с версией 0.909 изменения:

- сокращение флагов компиляции с 8 до 3 для упрощения: флаг использования атрибутов, флаг отслеживания краев спрайтов, флаг вывода на виртуальный экран;
- цвет спрайта задается теперь только в операторах вывода спрайта новым параметром, формат кодов спрайтов теперь един и для монохромных, и для цветных спрайтов;
- компиляция пользовательского кода в PRG после последнего "end" программы на Паскале в самом конце файла ASM.

Исправлены обнаруженные баги:

- сложение с константой;
- вывод констант на экран;
- вывод ячейки строкового массива;
- 8-я пиксельная строка зеркальных спрайтов.

ALKO
24.05.2020, 14:25
Что тут поменять, чтоб оно выплёскивало не в 16384, а в виртуальный экран?

Проверка границ не помешала бы



PUTIMAGE1

ld de,(_WINX) ; e=col_win, d=row_window
ld a,(_WINH)
ld b,a

putimage_011 push bc

push de

LD A,D
RRCA
RRCA
RRCA
AND A,224
ADD A,E
LD E,A
LD A,D
AND 24
OR 64
LD D,A

dup 8
push de
ld bc,(_WINW)
ld b,0
ldir
pop de
inc d
edup

pop de
inc d
pop bc
djnz putimage_011

; +++++ _flag_attr_window +++++

ld de,(_WINX) ; e=col_win, d=row_window
ld a,(_WINH)
ld b,a

putimage_021 push bc
push de

LD A,D
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR E
LD C,A

ld d,b
ld e,c
ld bc,(_WINH)
ld b,0
ldir

pop de

inc d

pop bc
djnz putimage_021


ret

goodboy
24.05.2020, 14:35
вроде OR 64/ OR 88 , pixel/attr

ALKO
24.05.2020, 14:46
Ещё по схожему принципу пытаюсь копировать заданную область виртуалки на экран
Но в итоге получаю мусор

По дефолту лайк паскаль переносит фулл-скрин.

а мне надо бы с отступом 5 знакомест сверху, и 6 знакомест снизу.






row_win equ 5
col_win equ 0
height_win equ 12
width_win equ 31



PIMAGE ld hl,addr_virt_screen+2
ld de,col_win+2
ldi
ldi

ld d,(col_win)
ld e, (row_win) ; e=col_win, d=row_window
ld a,(height_win)
ld b,a

pimage_01 push bc
push de

LD A,D
RRCA
RRCA
RRCA
AND A,224
ADD A,E
LD E,A
LD A,D
AND 24
OR 64
LD D,A

dup 8
push de
ld bc,(width_win)
ld b,0
ldir
pop de
inc d
edup

pop de

inc d

pop bc
djnz pimage_01

; +++++ _flag_attr_window +++++

ld de,(col_win) ; e=col_win, d=row_window
ld a,(height_win)
ld b,a

pimage_02 push bc
push de

LD A,D
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR E
LD C,A

ld d,b
ld e,c
ld bc,(width_win)
ld b,0
ldir

pop de

inc d

pop bc
djnz pimage_02



ret

Andrew771
24.05.2020, 15:32
Процедуры сохранения окна в виртуальном экране и вывода окна из виртуального экрана на экран ниже.
Перед вызовом задать параметры: col_window (столбец окна), row_window (строка окна), width_window (ширина окна), height_window (высота окна).
Если же это нужно в программе на ZX Like Pascal, то эти процедуры вызывать операторами WindowSet (установка параметров), WindowGet (вывод окна в память), WindowPut (вывод окна из памяти на экран), свои писать не надо.





virt_screen_high equ 160 ; старший байт смещения вирт.экрана
addr_virt_screen equ 57344 ; адрес вирт.экрана
col_window defb 0 ; столбец окна
row_window defb 0 ; строка окна
width_window defb 0 ; ширина окна
height_window defb 0 ; высота окна


; сохранение окна в памяти
; вход: нет
; выход: нет

getimage ld de,addr_virt_screen
ld hl,col_window
ldi
ldi
ldi
ldi

ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a

getimage_01 push bc
push hl

LD A,H ; расчет адреса первого байта знакоместа в HL
RRCA
RRCA
RRCA
AND A,224
ADD A,L
LD L,A
LD A,H
AND 24
OR 64
LD H,A

dup 8
push hl
ld bc,(width_window)
ld b,0
ldir
pop hl
inc h
edup

pop hl

inc h

pop bc
djnz getimage_01

; +++++ _flag_attr_window +++++

ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a

getimage_02 push bc
push hl

LD A,H ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR L
LD C,A

ld h,b
ld l,c
ld bc,(width_window)
ld b,0
ldir

pop hl

inc h

pop bc
djnz getimage_02

; ----- _flag_attr_window -----

ret


; вывод окна из памяти
; вход: нет
; выход: нет

putimage ld hl,addr_virt_screen+2
ld de,col_window+2
ldi
ldi

ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a

putimage_01 push bc
push de

LD A,D ; расчет адреса первого байта знакоместа в DE
RRCA
RRCA
RRCA
AND A,224
ADD A,E
LD E,A
LD A,D
AND 24
OR 64
LD D,A

dup 8
push de
ld bc,(width_window)
ld b,0
ldir
pop de
inc d
edup

pop de

inc d

pop bc
djnz putimage_01

; +++++ _flag_attr_window +++++

ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a

putimage_02 push bc
push de

LD A,D ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR E
LD C,A

ld d,b
ld e,c
ld bc,(width_window)
ld b,0
ldir

pop de

inc d

pop bc
djnz putimage_02

; ----- _flag_attr_window -----

ret

- - - Добавлено - - -

ALKO, тебе что конкретно надо? Из целого виртуального экрана вырезать область и вывести на экран?

ALKO
24.05.2020, 15:37
вроде OR 64/ OR 88 , pixel/attr
да, оно. Только без проверки границ по краям возникают артефакты при перемещении, и заодно таблицу зеркальных спрайтов кромсает.

- - - Добавлено - - -


тебе что конкретно надо? Из целого виртуального экрана вырезать область и вывести на экран?
Именно.
При условии если будет выигрыш в тактах.
Просто в фуллскрине монолитный цикл, а при разбивке на области если будет ущерб производительности, то лучше тогда не надо...

- - - Добавлено - - -


WindowGet (вывод окна в память), WindowPut (вывод окна из памяти на экран), свои писать не надо.

WindowGet копирует адрес #4000 в виртуалку, а у меня же напротив, всё сразу в виртуалке рендерится, а оттуда уже готовое надо выплёскивать.

Andrew771
24.05.2020, 15:38
Именно.
При условии если будет выигрыш в тактах.
Просто в фуллскрине монолитный цикл, а при разбивке на области если будет ущерб производительности, то лучше тогда не надо...
Тебе именно всегда срезать 5 знакомест сверху и 6 снизу или могут изменяться? Можно конкретно для этих цифр написать жесткую быструю процедуру.

ALKO
24.05.2020, 15:39
Вообще процедура PUTIMAGE1 c проверкой намного ли быстрее спрайтовой с проверкой ?
Прост у меня большинство тайлов квадратные, и было бы рациональнее их выводить не спрайтами, а PUTIMAGE-ми. Но вот насколько будет выигрыш в скорости.

- - - Добавлено - - -


Тебе именно всегда срезать 5 знакомест сверху и 6 снизу или могут изменяться? Можно конкретно для этих цифр написать жесткую быструю процедуру.

Да, в основном именно такая область рабочая.

Andrew771
24.05.2020, 16:16
Вообще процедура PUTIMAGE1 c проверкой намного ли быстрее спрайтовой с проверкой ?
Быстрее намного, потому что вычисляется только первое знакоместо в каждой линии и далее ldir всей линии, а в выводе спрайтов - каждое знакоместо вычисляется и выводится.

- - - Добавлено - - -

Таблица адресов всех пиксельных строк экрана ниже, можешь нужные строки отлдирить тупо :)



table_addr_scr defw #4000,#4100,#4200,#4300,#4400,#4500,#4600,#4700
defw #4020,#4120,#4220,#4320,#4420,#4520,#4620,#4720
defw #4040,#4140,#4240,#4340,#4440,#4540,#4640,#4740
defw #4060,#4160,#4260,#4360,#4460,#4560,#4660,#4760
defw #4080,#4180,#4280,#4380,#4480,#4580,#4680,#4780
defw #40a0,#41a0,#42a0,#43a0,#44a0,#45a0,#46a0,#47a0
defw #40c0,#41c0,#42c0,#43c0,#44c0,#45c0,#46c0,#47c0
defw #40e0,#41e0,#42e0,#43e0,#44e0,#45e0,#46e0,#47e0

defw #4800,#4900,#4a00,#4b00,#4c00,#4d00,#4e00,#4f00
defw #4820,#4920,#4a20,#4b20,#4c20,#4d20,#4e20,#4f20
defw #4840,#4940,#4a40,#4b40,#4c40,#4d40,#4e40,#4f40
defw #4860,#4960,#4a60,#4b60,#4c60,#4d60,#4e60,#4f60
defw #4880,#4980,#4a80,#4b80,#4c80,#4d80,#4e80,#4f80
defw #48a0,#49a0,#4aa0,#4ba0,#4ca0,#4da0,#4ea0,#4fa0
defw #48c0,#49c0,#4ac0,#4bc0,#4cc0,#4dc0,#4ec0,#4fc0
defw #48e0,#49e0,#4ae0,#4be0,#4ce0,#4de0,#4ee0,#4fe0

defw #5000,#5100,#5200,#5300,#5400,#5500,#5600,#5700
defw #5020,#5120,#5220,#5320,#5420,#5520,#5620,#5720
defw #5040,#5140,#5240,#5340,#5440,#5540,#5640,#5740
defw #5060,#5160,#5260,#5360,#5460,#5560,#5660,#5760
defw #5080,#5180,#5280,#5380,#5480,#5580,#5680,#5780
defw #50a0,#51a0,#52a0,#53a0,#54a0,#55a0,#56a0,#57a0
defw #50c0,#51c0,#52c0,#53c0,#54c0,#55c0,#56c0,#57c0
defw #50e0,#51e0,#52e0,#53e0,#54e0,#55e0,#56e0,#57e0

ALKO
24.05.2020, 16:59
можешь нужные строки отлдирить тупо
Яжламер :v2_dizzy_coder:
Так-то я в курсе, что такое LDIR и что он гоняет блоки данных.
Но как сделать так, чтоб он опирался именно на таблицу в качестве входных параметров, этого я пока не умею.

- - - Добавлено - - -

Что касается логики ЯВУ, что быстрее работает последовательность if else или switch case ?

Andrew771
24.05.2020, 17:22
Что касается логики ЯВУ, что быстрее работает последовательность if else или switch case ?
case



Но как сделать так, чтоб он опирался именно на таблицу в качестве входных параметров, этого я пока не умею.
Можно тупо в лоб, если не жалко нескольких сотен байтов, зато быстродействие будет максимальное:



copy_virt_to_scr ld hl,#4080+addr_virt_scr-#4000 ; остаток первой трети экрана с 5-й строки
ld de,#4080
ld bc,32
ldir

ld hl,#4180+addr_virt_scr-#4000
ld de,#4180
ld bc,32
ldir

...

ld hl,#4800+addr_virt_scr-#4000 ; вся вторая треть
ld de,#4800
ld bc,2048
ldir

ld hl,#5000+addr_virt_scr-#4000 ; часть третьей трети до 6-й строки снизу
ld de,#5000
ld bc,32
ldir

ld hl,#5100+addr_virt_scr-#4000
ld de,#5100
ld bc,32
ldir

...

ld hl,#5740+addr_virt_scr-#4000
ld de,#5740
ld bc,32
ldir

ret

ALKO
24.05.2020, 17:28
Быстрее намного, потому что вычисляется только первое знакоместо в каждой линии и далее ldir всей линии, а в выводе спрайтов - каждое знакоместо вычисляется и выводится.

В общем, переписал всё под PUTIMAGE.
Но по краям экрана возникает дитчь, ибо отсутствует проверка границ.

Andrew771
24.05.2020, 17:29
Но по краям экрана возникает дитчь, ибо отсутствует проверка границ.
А какая проверка границ, если всё в пределах экрана?

ALKO
24.05.2020, 17:39
А какая проверка границ, если всё в пределах экрана?

Не... На данный момент putimage у меня касается вывода тайлов (как альтернатива спрайтам), а не в качестве переброски виртуального экрана на реальный.
Переброску я пока ещё не трогал. Пока ещё она фуллскриновая, тормозная.

- - - Добавлено - - -

Хотя можно как вариант отрисовывать тайлы в более узком диапазоне, не заходя за края. А сами края захайдить атрибутами. Но не хочется урезать обзор.

Andrew771
24.05.2020, 17:43
Не... На данный момент putimage у меня касается вывода тайлов (как альтернатива спрайтам), а не в качестве переброски виртуального экрана на реальный.
А вот это не оно (https://zx-pk.ru/threads/24967-zx-like-pascal.html?p=1055285&viewfull=1#post1055285)? Уже обсуждали

- - - Добавлено - - -

Края не получится проверять в выводах линий. Нужно сначала вычислять длину линии тогда.

ALKO
24.05.2020, 17:44
А вот это не оно (https://zx-pk.ru/threads/24967-zx-like-pascal.html?p=1055285&viewfull=1#post1055285)? Уже обсуждали

- - - Добавлено - - -

Края не получится проверять в выводах линий. Нужно сначала вычислять длину линии тогда.

Ну да, я эту процедуру и использую. Она не проверяет выход за пределы экрана.

Andrew771
24.05.2020, 17:46
А для вывода фона из тайлов 1х1 или 2х2 можно использовать карты в ZX Like Pascal

- - - Добавлено - - -


А для вывода фона из тайлов 1х1 или 2х2 можно использовать карты в ZX Like Pascal
Могу еще подбросить 4х4, но без атрибутов. Она в demo_Z используется.

ALKO
24.05.2020, 19:48
А для вывода фона из тайлов 1х1 или 2х2 можно использовать карты в ZX Like Pascal

- - - Добавлено - - -


Могу еще подбросить 4х4, но без атрибутов. Она в demo_Z используется.

Только у меня тайлы 3х3, и цветные.
Да и формат карты свой (через одномерный массив).

Andrew771
24.05.2020, 22:00
3х3 нету, но можно переделать из 4х4 (сократить). А одномерный массив - это двумерный с одной стороной равной 1 :)

ALKO
24.05.2020, 22:40
неужели никак нельзя сделать проверку границ PUTIMAGE... :v2_wacko:

Видимо, придётся вернуть всё обратно на спрайты.


А одномерный массив - это двумерный с одной стороной равной 1

У меня там самодельные специфические костыли, меня они устраивают. (карта хранится не в виде тайлового набора, долго объяснять)

Andrew771
24.05.2020, 23:11
неужели никак нельзя сделать проверку границ PUTIMAGE...

Видимо, придётся вернуть всё обратно на спрайты.
Там нужно будет вычислять длину строки до ldir, что может убить всю выгоду от ldir-а. Я пытался так сделать, хотел сделать спрайты в Паскале только прямоугольные для экономии места и ускорения процедур, но ускорения не получается, отказался из-за этого. Так что, лучше на спрайты вернуться.

ALKO
25.05.2020, 22:32
Ищё такой вопрос, если спрайт 8х8 он по скорости же будет тождественен линейной процедуре Putimage?


И ищё такой вопрос. В паскале этой выводилка спрайтов максимально быстрая? Или возможны варианты ещё быстрее ?(с использованием стека (наличие проверки границ экрана обязательно, разумеется))
Памяти пока не жалко, поэтому готов пожертвовать во благо скорости.
В текущей демке фпс в принципе устраивает, но я опасаюсь жоской просадки, когда будет дофига логики в ЯВУ.(к тому же тут пока ещё нет хальта для верт. синхры)
https://media.giphy.com/media/ZBzp09v76FH5q5Hj72/giphy.gif

Andrew771
26.05.2020, 00:28
если спрайт 8х8 он по скорости же будет тождественен линейной процедуре Putimage?
да.


В паскале этой выводилка спрайтов максимально быстрая? Или возможны варианты ещё быстрее ?(с использованием стека (наличие проверки границ экрана обязательно, разумеется))
П
С использованием стека быстрее, но опять же, проверки границ притормаживают. И процедуры сложнее по кодированию. У меня таких нету.
Еще есть промежуточный вариант - вместо ldir (21 такт на байт) использовать в цикле много ldi (16 тактов на байт). Это используется в процедуре копирования вирт.экрана на реальный.

ALKO
26.05.2020, 00:56
я уже думаю про вирт. экран 128к, но я совсем не умею им пользоваться.

Andrew771
26.05.2020, 09:09
я уже думаю про вирт. экран 128к, но я совсем не умею им пользоваться.
Я вообще под 128к ничего не писал никогда, знаю, что нужно щелкать какой-то определенной банкой туда-сюда. В книге Родионова вроде понятно описано.

ALKO
26.05.2020, 13:04
Почему



for i:=campos/3 to 10+campos/3 do
begin
...
работает как положено.

А это:

kampos:=campos/3;
for i:=kampos to 10+kampos do
begin
...

ведёт себя так, будто i всегда равно нулю?

kampos объявлял как word и byte.

- - - Добавлено - - -

вообще у меня там часто встречается campos/3.
Было бы неплохо её единожды за фрейм вычислить максимально быстро.

Andrew771
26.05.2020, 13:53
ведёт себя так, будто i всегда равно нулю?
Возможные причины:
1. Если ты до сих пор на версии 0.909, то лучше уходи оттуда. Там глюк при сложении с константами был. В 1.0 устранил.
2. Может campos меньше 3? Тогда при делении получается 0.

Сейчас проверил на твоем примере, да, это глюк версии 0.909. В 1.0 устранен.

ALKO
29.05.2020, 19:18
Быстрая память начинается с 32768, так ведь? То есть и компилировать желательно с этого адреса?
А какую инфу после компиляции можно заталкивать до него (помимо графики под статичные заставки)?

Andrew771
29.05.2020, 23:32
Быстрая память начинается с 32768, так ведь? То есть и компилировать желательно с этого адреса?
А
Это к 48к не относится. Ты пишешь под 128к? В 128к я не спец, я фундаменталист :)

Black Cat / Era CG
30.05.2020, 00:52
Это к 48к не относится
В оригинальном ZX Spectrum 48K было реализовано ОЗУ с раздельными полями
Вот

Oleg N. Cher
30.05.2020, 01:47
Быстрая память начинается с 32768, так ведь? То есть и компилировать желательно с этого адреса?
А какую инфу после компиляции можно заталкивать до него (помимо графики под статичные заставки)?Да любые данные. Массивы, переменные. И даже процедуры, не требующие точных тактовок и не работающие с бипером, иначе он может издавать грязный звук (я этого долго не знал, т.к. моя Орель БК-08 такой особенностью не обладала).

ALKO
30.05.2020, 07:38
Это к 48к не относится.

Ещё как относится. Не стоит забывать, что Горбач - машынка кривая до мозга костей. Всё из-за видео-памяти, которую помимо проца ещё и дискретная логика долбит.

- - - Добавлено - - -


Массивы, переменные.

Но ведь если эти самые массивы нужны для быстрых процедур, то обращение к ним будет тормозным.

ALKO
30.05.2020, 13:22
Не нравится мне, что кадр рвётся.
А halt просаживает фпс в полтора-два раза.
Есть менее затратный вариант?

ALKO
30.05.2020, 16:59
Хмм... А на реале кадр не рвётся. Причем бегает быстрее, чем в эмуле.
Порой мне кажется, что в моём самопале проц шустрее оригинала.

https://youtu.be/FZZ6cuMZ3Z8

ALKO
02.06.2020, 09:32
Велик соблазн использовать возможности 128k
В паскале по-дефолту адрес вирт. экрана #4000, в 128к 5ая банка второго экрана расположена по тому же адресу.
То есть в движке мне достаточно вместо кучи LDIRов, добавить OUT #7FFD, 8 (третий бит, отвечающий за переключение).
Затем после рендеринга следующего кадра в виртуальную область, жахаю OUT #7FFD, 0.
И так по кругу. Таким образом адрес вирт. экрана вообще не трогаю.

Я правильно понимаю алгоритм? Поправьте, если ошибаюсь.

ALKO
02.06.2020, 12:01
Ой... #4000 это жы реальный экран :))))(((
Туплю.

Ну а всё-таки, как незримо рисовать во второй экран 128к ?

Eltaron
02.06.2020, 13:11
Ой... #4000 это жы реальный экран :))))(((
Туплю.

Ну а всё-таки, как незримо рисовать во второй экран 128к ?
Работай с обоими экранами через #С000. Когда включена страница 5 - там будет основной экран. Когда страница 7 - второй.

На асме типа такого


DRAW_LOOP:
LD A, 7 ; банка со вторым экраном, но бит второго экрана выключен
LD BC, #7ffd
OUT (C), A
... незримо рисуешь в #C000 (второй экран)...
LD A, 8 + 5 ; переключаемся на второй экран, подключаем к адресу C000 первый
LD BC, #7ffd
OUT (C), A
... незримо рисуешь в #C000 (первый экран)...
JP DRAW_LOOP

ALKO
02.06.2020, 13:59
C000, значит.
В паскале вирт. экран по дефолту E000.
После каждой компиляции редактировать придётся.
Это можно как-то перенастроить, не пересобирая утилиту на делфях?

ALKO
02.06.2020, 21:17
Не, видимо, этого недостаточно.


На асме типа такого

Пока что сделал частично на ЯВУ



while 1<2 do {бесконечный цикл}
begin

if hide_draw_f=0 then Asm(DRAW_LOOP1)
else begin
hide_draw_f:=0;
Asm(DRAW_LOOP2);
end;
hide_draw_f:=1;

... рендеринг
end.



DRAW_LOOP1:
LD A, 7 ; банка со вторым экраном, но бит второго экрана выключен
LD BC, #7ffd
OUT (C), A
ret


DRAW_LOOP2:
LD A, 8 + 5 ; переключаемся на второй экран, подключаем к адресу C000 первый
LD BC, #7ffd
OUT (C), A
ret


После компиляции ЯВУ подправил addr_virt_screen


...
virt_screen_high equ 160
addr_virt_screen equ #C000
table_mirror_high equ 251
...


В итоге чёрный экран, и через мгновение прога ресетится.

ALKO
02.06.2020, 23:34
Может всё-таки какие-то другие значения в порт надо посылать?
https://sun1.43222.userapi.com/hdHwTW25t3MMLprdUZkswCib2iHwOMhD_KpFCw/UAjW26o0uno.jpg

Eltaron
02.06.2020, 23:45
Может всё-таки какие-то другие значения в порт надо посылать?

А ROM используется? Если да, то нужно ещё 4-й бит включить в значениях, а то ROM128 подключится.

ALKO
03.06.2020, 00:29
то нужно ещё 4-й бит включить в значениях,


Попробовал хотя бы на оба лупа задать LD A, 15, но экран остаётся пустым, ничего не мелькает (слой атрибутов чёрный, слой пикселей чистый).

ALKO
03.06.2020, 10:50
Нашёл статейку, тут в порт посылают #17 #18 (00010111, 00011000)

Вечером буду пробувать.

https://zxpress.ru/article.php?id=4423

Eltaron
03.06.2020, 11:21
Попробовал хотя бы на оба лупа задать LD A, 15, но экран остаётся пустым, ничего не мелькает (слой атрибутов чёрный, слой пикселей чистый).
15 - это 1111, четвертый бит так и остался нулевой. Надо #17 и #1D

- - - Добавлено - - -

Ну и надо убедиться, что ничего нужного не расположено в самом верху памяти (стек, например). При переключении страницы эта область заменится на что-то другое и будут глюки

ALKO
03.06.2020, 20:46
Надо #17 и #1D
тоже не дало результата.
Может и вправду стек задевает. Но коль так, то хотя бы содержимое стека должно было перебросить на экран, но нет - кромешная пустота.

- - - Добавлено - - -

Установил константу virt_screen_high equ 192 (судя по всему, именно на неё опираются все вычислялки знакомест).
Тоже бестолку..

Eltaron
03.06.2020, 21:52
тоже не дало результата.
Может и вправду стек задевает. Но коль так, то хотя бы содержимое стека должно было перебросить на экран, но нет - кромешная пустота.

Не факт, экран всего-то С000...DB00 занимает, а стек обычно в самой верхотуре лежит, в районе #FFxx