User Tag List

Показано с 1 по 10 из 87

Тема: Edge Grinder для ZS GMX

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    23.04.2020
    Адрес
    г. Тотьма
    Сообщений
    909
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    343
    Поблагодарили
    182 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отловил глюк со счётчиком. Выложил текущую версию. На железе выдаёт 25 кадров, иногда сваливается в 16, когда на границе экрана 2 и более спрайта. Потому что вывод целых спрайтов идёт быстрым способом, а на границе экрана, когда видна часть спрайта, медленным.
    Думаю, есть ещё резервы для оптимизации.
    Используется примерно 89 страниц памяти из 128.
    Последний раз редактировалось izzx; 25.08.2021 в 20:43.

    Скрытый текст


    https://drive.google.com/drive/folde...xZ83juCuaBe32I

    Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
    Leningrad 1/Sega Joy Adapter
    DivGMX
    ZX Spectrum +2A
    ZX Evolution rev. C

    TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
    [свернуть]

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    а на границе экрана, когда видна часть спрайта, медленным способом
    Вот тут стоит покопаться =)) По идее, наоборот, кусок спрайта должен выводиться быстрее, чем целый.
    Бегло порыл список файлов в исходниках, вроде как вывод частичного спрайта - файл EG_Sprites_Partial.asm только это уже Спектрум или еще Амстрад? =)
    Толком не разбирался, но параметры такие: высота спрайта, кажись, 10 "пикселей", если байт нулевой - пропускаем. Иначе затираем байт атрибутов целиком, а не половинки по маске (как я думал).
    Далее, после каждого впечатанного байта идет конструкция ex de,hl: and a: sbc hl,bc: ex de,hl - при таком пересчете, естественно, вывод будет жрать кучу времени.
    Если правильно понял - спрайты выводятся вертикально, по столбцам. Хуже может быть только вывод крест-накрест =)) Желательно переделать на нормальный, построчный, вместе с форматом спрайтов.
    После каждой линии пара DE загружается из адресуемой через IX таблицы - тоже прожорливо. Точнее, это получаются не линии, а столбцы, раз выводим вертикально, а 10 - это ширина.

    Код:
    PrnSprLoopL5
    	push bc
    	ld bc,80
    	
        ld e,(ix+0)
        inc ixl
        ld d,(ix+0)
        inc ixl
    Но если выводим вертикально - зачем брать следующий адрес из таблицы? Достаточно сохранить-восстановить DE из стека и увеличить на 1.
    Сам вывод можно развернуть в коде, благо, свободная память имеется. Конструкциями вида LD (HL),NN:INC L, либо сразу INC L, если байт пустой.
    Потребуется свой кусок кода для каждой "частичной" фазы, как и для целого спрайта, но вывод будет пошустрее.
    И намного пошустрее, если выводить линиями (горизонтально), ибо для перехода на следующую будет достаточно сделать ADD HL,BC (ВС=80-ширина спрайта, что-то типа того)

  4. #3

    Регистрация
    23.04.2020
    Адрес
    г. Тотьма
    Сообщений
    909
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    343
    Поблагодарили
    182 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    вывод частичного спрайта - файл EG_Sprites_Partial.asm
    Да. Там для каждого случая свой раздел. Вывод слева по 1,2,3,4,5 столбиков, то же для правой части. И сверху-снизу тоже часть умеет выводить. Адреса хранятся для каждой пары строк. Высота 21 строка - значит 11 адресов на спрайт.
    Вот так я писал:
    Спрайт занимает 126 байт, 6 байт ширина, 21 высота, занимаемое место округляется до 128
    Выводится в таком порядке байт:
    01 03 05 07 09 11
    00 02 04 06 08 10
    13 15 17
    12 14 16 18...
    А последняя строчка по порядку 120 121 122 123 124 125.
    Причём нули пропускаются, не выводятся. Поэтому не надо маски.

    Вот переделывать формат спрайтов мне меньше всего охота было )
    При быстром выводе через ld (NN),hl хитрый формат спрайта почти не влияет на скорость. Там по строчкам выводится всё равно.
    А тут да, очень криво выходит.

    Скрытый текст


    https://drive.google.com/drive/folde...xZ83juCuaBe32I

    Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
    Leningrad 1/Sega Joy Adapter
    DivGMX
    ZX Spectrum +2A
    ZX Evolution rev. C

    TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
    [свернуть]

  5. #4

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    Причём нули пропускаются, не выводятся. Поэтому не надо маски.
    Но тогда получается, что затираем сразу два "пикселя" экрана (карты), даже если один из них пустой в спрайте. Или там у спрайтов все "пиксели" по два шириной?
    Цитата Сообщение от izzx Посмотреть сообщение
    Вот переделывать формат спрайтов мне меньше всего охота было )
    А надо бы =)) Ибо вертикальный вывод плюс еще пересчет адресов строк сжирают кучу времени.
    Цитата Сообщение от izzx Посмотреть сообщение
    При быстром выводе через ld (NN),hl хитрый формат спрайта почти не влияет на скорость
    Не, это другие команды. LD (NN),HL подходит для переброса карты через стек по 2 байта сразу, а вот спрайты без стека и побайтово, через LD (HL),N - стек не трогается.
    То бишь каждый спрайт развертывается в кусок кода. Например, спрайт (условно) 4х4 пикселя, пустой байт - ноль, заполненный (1) - FF. Сам спрайт такой:

    0110
    1111
    1001
    0110

    Код вывода для него развертывается вот в такой кусок:

    Код:
    	INC	L		;0
    	LD	(HL),#FF	;1
    	INC	L
    	LD	(HL),#FF	;1
    	INC	L		;0, INC для корректного пересчета HL
    	ADD	HL,BC
    
    	LD	(HL),#FF	;1
    	INC	L
    	LD	(HL),#FF	;1
    	INC	L
    	LD	(HL),#FF	;1
    	INC	L
    	LD	(HL),#FF	;1
    	ADD	HL,BC
    
    	LD	(HL),#FF	;1
    	INC	L
    	INC	L		;0
    	INC	L		;0
    	LD	(HL),#FF	;1
    	ADD	HL,BC
    
    	INC	L		;0
    	LD	(HL),#FF	;1
    	INC	L
    	LD	(HL),#FF	;1
    	RET			; последний INC уже не нужен,
    				; если код развертки это обработает
    Для перехода вниз на строку достаточно одной команды ADD HL,BC. Усеченные спрайты (по ширине) будут выводиться еще быстрее.
    В данном конкретном примере #FF можно было бы заменить на регистр, но в реальности там будут разные значения, потому - числами.
    Согласен, переделывать формат и вывод - занятие не на полчаса, но если уж делать, то делать =))

  6. #5

    Регистрация
    23.04.2020
    Адрес
    г. Тотьма
    Сообщений
    909
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    343
    Поблагодарили
    182 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Но тогда получается, что затираем сразу два "пикселя" экрана (карты), даже если один из них пустой в спрайте. Или там у спрайтов все "пиксели" по два шириной?
    Да, сразу по два пикселя. Может спрайты нарисованы с учётом этого, не заметно.

    Не, это другие команды. LD (NN),HL подходит для переброса карты через стек по 2 байта сразу, а вот спрайты без стека и побайтово, через LD (HL),N - стек не трогается.
    Да, перепутал команды. Для спрайтов LD (HL),N.

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

    зы. Попробую переформатировать спрайты, чтобы выводить по линиям. За счёт переходов хотя бы ускоримся.
    Последний раз редактировалось izzx; 26.08.2021 в 14:16.

    Скрытый текст


    https://drive.google.com/drive/folde...xZ83juCuaBe32I

    Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
    Leningrad 1/Sega Joy Adapter
    DivGMX
    ZX Spectrum +2A
    ZX Evolution rev. C

    TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
    [свернуть]

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. EYEACHE2 и Across The Edge на GMX
    от Evgeny Muchkin в разделе Демо
    Ответов: 1
    Последнее: 12.08.2019, 21:23
  2. Ответов: 0
    Последнее: 24.11.2017, 03:24
  3. ZX BUS EDGE!
    от ZXFanat в разделе Устройства ввода
    Ответов: 10
    Последнее: 15.07.2013, 19:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •