Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
Последний раз редактировалось MacBuster; 26.01.2019 в 00:39. Причина: Удаление в знак протеста против действий MM
При портировании с Z80 несколько проблем:
1) неоптимальный доступ к памяти, потому что на исходном процессоре адресация в основном байтовая или словная невыровненному адресу. Особенно это печально при байтовой записи в память: разработчики процессора ВМ2 решили не делать цикл DATAOB и MOVB вместо одного цикла доступа к шине делает два (DATAI - modify byte - DATAO). Накладные расходы при загрузке байта в регистр (знаковое расширение, что решается, например, комбинацией CLR Rn/BISB src, Rn). Тут же чтение/запись слова по невырвненному адресу (MOVB ea -> SWAB -> MOVB ea+1): особенно печальна запись -- из-за отсутствия DATAOB на шине будет четыре цикла вместо двух + плюс фетчинг и декодинг трёх-четырёх команд вместо одной.
2) косвенная адресация при обращении к видеобуферу и такие же проблемы с байтовой адресацией.
3) команды блочного копирования LDIR сотоварищи
Z80 реально фетчит и декодирует каждый раз (пока BC != 0) LDIR и затем выполняет два шинных цикла, то есть LDIR выглядит для исполнительно устройства как (READ BUS <fetch LDIR>, <decode/exec LDIR>, READ BUS, WRITE BUS) x N.
если заменять это просто на
то это будет неоптимально и с точки зрения доступа к памяти (отстутствие цикла DATAOB) и с точки зрения выполнения: каждый раз выполняется ещё и SOB, который по времени составляет приблизительно треть от MOVB. Тут поможет аккуратный loop unrolling и, если заведомо известно выравнивание адресов или возможность его изменить, замена MOVB на MOV.Код:MOVB (Rs)+, (Rd)+ SOB Rc, . - 2
Например, тупое
Даст прирост процентов на 20 (в зависимости от ситуации). Если ещё на x2 unroll'ить, то ещё 10-15% можно отыграть, x8 unroll даст почти 1.5 раза прироста по сравнению с x1. А если есть возможность заменить на MOV (Rs)+, (Rd)+ то почти в два раза сразу.Код:; Rc = Rc / 2 1$: MOVB (Rs)+, (Rd)+ MOVB (Rs)+, (Rd)+ SOB Rc, 1$
Никита проделал офигительный объём работы, стоит ему отлить памятник только потому, что оно вообще работает. Дело то за малым: берём исходники и модифицируем код, чтобы логика осталась прежней, а код был оптимален с точки зрения целевого процессора. =)
Нельзя не привязываться к архитектуре, если речь идет о конкретно эмуляции Z80 на PDP11.
И она будет как минимум в 5-10 раз медленнее, чем реальный Z80.
Если же делать рекомпиляцию, причем грамотную, то там можно добиться где-то 1/2 скорости Z80.
Ну а потом если пройтись по этому ручками, то для некоторых игр можно и получить скорость аналогичную Z80.
Никита, а вот демка демонстрирует кучу цветов (визуально даже больше 8). Она использует ПП?
По поводу деревьев другого цвета. Где-то тут на форуме встречал высказывание hobot'а в таком духе, что 90% УКНЦ-шек имеют вывод GRB, около 3% RGB, остальные монохром (у нас в школе как раз были монохром). Думаю, хорошо было бы сделать в меню игры выбор GRB/RGB, притом GRB по умолчанию, как более часто встречающийся. Ну и цветные деревья. А ещё - стилизовать под Спектрум цвета в игровой статистике POWER/SCORE, TIME/HIGH. Думаю, 3-х цветов (жёлтый, красный, зелёный) для этого вполне достаточно, можно не выходить на ПП.
(там не только деревья другим цветом, всё обстоит несколько сложнее, чем я думал)
Ещё мечтаю, что когда-нить Никита выключит надпись ЛАТ на экране =) Ну, чтобы уж совсем!
Если память мне не отказывает (укоризненно смотрю в ТО), то добраться до плана 0 из ЦП напрямую невозможно.
Вообще на УКНЦ ограничение -- 8 цветов на одну строку, полный набор цветов намного больше, см. соответствующую тему.
Реально же, во многих машинах даже 8 основных цветов сделаны неправильно, в значительной части перепутаны красный и зелёный.
(И опять же, задать свой набор цветов в каждой строке можно только через ПП -- в его памяти лежит display list.)
По этим причинам я принёс в жертву ту цветовую схему которая мне лично казалась красивой (зелёное игровое поле), чтобы на всех трёх вариантах машин (RGB, GRB, BW) смотрелось более-менее ОК.
Это значит, что при выборе схемы нужно патчить код примерно в 5-6 местах.Думаю, хорошо было бы сделать в меню игры выбор GRB/RGB, притом GRB по умолчанию, как более часто встречающийся. Ну и цветные деревья.
Можно, но не особо интересно.
В целом, я уже потратил на этот проект времени минимум в 1,5 раза больше чем собирался, время кончилось.
Код открыт, где лежит известно, любой может взять и доработать как хочется.
- - - Updated - - -
Анализ очень правильный.
Проблема скорости игры во многом это проблема байтовых обращений к памяти. Например:
- Первый и второй "теневые" экраны разнесены друг от друга на нечётное количество байт. Поэтому копировать первый во второй пословно не получится.
- Несколько словных значений в записях объектов выровнены по нечётному адресу -- запись и чтение вместо одной команды делаются за 4-5 команд.
Также лучшей оптимизации можно достичь за счёт индексного доступа к полям объектов. Например, при анализе столкновений обращение к одной записи делается через IX+nn, а ко второй через HL -- и переведено на MACRO11 также, чтобы сделать нормально нужно ооочень аккуратно всё порефакторить.
Удаление в знак протеста против действий MM
Последний раз редактировалось MacBuster; 26.01.2019 в 00:39. Причина: Удаление в знак протеста против действий MM
Мы в общем тоже так думали. Тут на форуме есть утилита TSPAL.SAV от Titus.
Но опять же, нельзя полагаться что на всех экземплярах УКНЦ это правильно распаяно, скорее всего нет.
http://zx-pk.ru/threads/20686-mnogo-...na-uknts!.html -- тема про цвета
http://zx-pk.ru/threads/20686-mnogo-...l=1#post570009 -- всего 53 уникальных цвета
Последний раз редактировалось nzeemin; 24.01.2018 в 22:16.
Удаление в знак протеста против действий MM
Последний раз редактировалось MacBuster; 26.01.2019 в 00:39. Причина: Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
Последний раз редактировалось MacBuster; 26.01.2019 в 00:39. Причина: Удаление в знак протеста против действий MM
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)