User Tag List

Страница 6 из 9 ПерваяПервая ... 23456789 ПоследняяПоследняя
Показано с 51 по 60 из 87

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

  1. #51

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

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Это все может улететь куда-нибудь в другую страницу, чтобы освободить целиком память с #4000 до #8000?
    Надо думать. Загрузчик то можно потереть будет. Остальное пока выключить. А потом уже, если заработает вывод фона, то решим куда запихнуть.
    Кстати, почитал старые статьи Зонова про гомикс, там написано, что экраны подключаются взамен основных, с #4000. Нипанятна (с)
    Видимо взамен тех, что были на #4000. Видео жёстко привязано к страницам 39, 3b,79,7b. Главное в них писать что надо. А в слоте они могут быть и не включены ни в каком.

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


    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. #52

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

    По умолчанию

    Набросал примерный код вывода через стек. Задействованы абсолютно все регистры, зато максимальная скорость.
    Выводим группами по 16 байт, 5 групп (последняя - 14 байт, т.к. ширина окна 78).
    И выводим линию целиком, а не лево+право, т.к. вставка затычек в код при таком способе сожрет всю экономию.
    Код:
    _SPAD1		LD		SP,IY		;первый адрес в линии (откуда берем данные), IY задается перед выводом
    		POP		AF,DE,HL,IX
    		EXX,EXA
    		POP		AF,BC,DE,HL
    		LD		(_SPAD2+1),SP
    		LD		SP,#C010	;все адреса назначения задаются в явном виде (при развертывании кода)
    		PUSH	HL,DE,BC,AF
    		EXX,EXA
    		PUSH	IX,HL,DE,AF
    _SPAD2		LD		SP,NN
    		POP		AF,DE,HL,IX
    		EXX,EXA
    		POP		AF,BC,DE,HL
    		LD		(_SPAD3+1),SP
    		LD		SP,#C020		
    		PUSH	HL,DE,BC,AF
    		EXX,EXA
    		PUSH	IX,HL,DE,AF
    _SPAD3		LD		SP,NN
    		POP		AF,DE,HL,IX
    		EXX,EXA
    		POP		AF,BC,DE,HL
    		LD		(_SPAD4+1),SP
    		LD		SP,#C030		
    		PUSH	HL,DE,BC,AF
    		EXX,EXA
    		PUSH	IX,HL,DE,AF
    _SPAD4		LD		SP,NN
    		POP		AF,DE,HL,IX
    		EXX,EXA
    		POP		AF,BC,DE,HL
    		LD		(_SPAD5+1),SP
    		LD		SP,#C040		
    		PUSH	HL,DE,BC,AF
    		EXX,EXA
    		PUSH	IX,HL,DE,AF
    _SPAD5		LD		SP,NN
    		POP		DE,HL,IX
    		EXX
    		POP		AF,BC,DE,HL
    		LD		SP,#C04E		
    		PUSH	HL,DE,BC,AF
    		EXX
    		PUSH	IX,HL,DE
    
    		ADD		IY,BC	;перебросили линию, пересчитываем адрес данных карты
    По времени: каждая группа, кроме последней, жрет 232Т, последняя + ADD IY,BC еще 196 (если без Wait).
    Перемножаем: 4х232+196=1124/1164 (с Wait) на линию, 160 линий = 179840/186240 на экран.
    Сравниваем с LDI (тоже переделанным): 16х80=1280,+перевод строки еще 22=1232, х160=197120.
    Причем LDI команда четная, без Wait. В итоге выигрыш от стека на машине с Wait заметно хуже.
    Если точнее (но все равно примерно): разница LDI/стек без Wait около 17 тыс, с Wait около 11 тыс.

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


    upd: 1280+22=1302, а не 1232. Считал другой пример, вот и ошибся. Итого 1302х160=208320
    Последний раз редактировалось reddie; 05.08.2021 в 22:51. Причина: математик хренов =)

    Этот пользователь поблагодарил reddie за это полезное сообщение:

    izzx(05.08.2021)

  3. #53

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

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    16х80=1280,+перевод строки еще 22=1232, х160=197120.
    Вот тут я насчитал 203200. И умножал на 78.

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

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


    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
    [свернуть]

  4. #54

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

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    Вот тут я насчитал 203200. И умножал на 78.
    Перевод строки 22 такта это LD BC,NN:ADD HL,BC (т.к. копируем 80 байт - DE не трогаем, оно всегда правильное)
    При таком варианте и получается указанное у меня число =) Проще копировать 80, чем 78.

    Формат примерно тот же, но с нюансами. Сейчас у нас карта разложена экранами по страницам, от края до края экрана.
    А можно сделать с перекрытием экранов. Что увеличит расход памяти, но избавит от вывода по половинкам.
    То есть в первой странице лежит (пока пишу условно) карта с 1 по 200 столбик, а во второй не с 201, а со 122 (201-ширина)
    Получается что: когда в 1-й странице доходим до столбика 121 - "упираемся" в край страницы.
    Дальше вместо склеивания страниц просто переключаемся на следующую и выводим со 122 столбика.
    Надеюсь, суть понятна: края экранов перекрывают друг друга в соседних страницах.
    Проблема в том, что нужно "удлинять" экраны путем дробления их по горизонтали на 2 или даже 4 части.
    Потому что при полной высоте экрана (160) получаем в странице 16384/160=102 столбца. А у нас ширина окна 80.
    То бишь при таком хранении будет огромный расход памяти на перекрытие краев.
    Можно разбить карту на горизонтальные куски, скажем, 4. Тогда в страницу влезет уже 16384/40=409 столбцов.
    Соответственно, распухание карты составит примерно 1/5 от исходного размера (409/80 будет 5 если грубо).
    Это уже вполне терпимо, и даже при удвоенном расходе памяти на "попиксельный" скролл ее хватит.
    Надеюсь, суть понятна. Остается переписать генерацию карты под такой формат выкладки =)

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

    Да, там при подсчете с LDIR обсчитался по запаре, получается больше моих 197 тысяч. Бывает...

  5. #55

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

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Можно разбить карту на горизонтальные куски, скажем, 4.
    Это хорошо. Вывести сначала 3 куска, а потом ждать прерывания. Иначе же оно попортит часть карты.
    Выводящий код достаточно хранить для одного куска, как я понимаю. Иначе код не влезет в одну страницу.

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


    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
    [свернуть]

  6. #56

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

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    Вывести сначала 3 куска, а потом ждать прерывания. Иначе же оно попортит часть карты
    Да, про этот нюанс и хотел сказать. Что при выводе через стек придется мудрить с прерываниями.
    Цитата Сообщение от izzx Посмотреть сообщение
    достаточно хранить для одного куска, как я понимаю. Иначе код не влезет в одну страницу
    Нет, если адреса задаются в явном виде - разворачивается код целиком для всего экрана (окна вывода).
    Вроде должен влазить в 16к, если через push-pop, там же на 2 байта данных 2 байта (push+pop) и немного обвязки.

  7. #57

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

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Нет, если адреса задаются в явном виде - разворачивается код целиком для всего экрана (окна вывода).
    Да, точно.
    Вроде должен влазить в 16к, если через push-pop, там же на 2 байта данных 2 байта (push+pop) и немного обвязки.
    Да. Там же и не весь экран надо выводить. Должно влезть.

    upd. Эмуль у меня такты делит на два ). Может я опять что-то не донастроил. Но про команду ldi говорит 8 тактов. И все какие посмотрел делит на 2. Получается вывод фона сейчас 115*2=230к тактов. Можно попытаться выиграть заветные 20. Но если всего 123*2=246к тактов, то надо сильно постараться. У меня пока вся игра укладывалась в эмуляторные 286 тактов, так что на самом деле надо выжать 40к...
    Последний раз редактировалось izzx; 06.08.2021 в 14:24.

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


    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
    [свернуть]

  8. #58

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

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    Получается вывод фона сейчас 115*2=230к тактов
    Ну это и так вполне было понятно =) умножаем 78х160х16 получаем уже 200 тысяч, плюс обвязка двух циклов.
    Вывод по стеку, кстати, никак не влазит в 16Кб, хоть push-pop, хоть pop-ld (nn). У первого много обвязки, у второго размер данных х2.
    Окно вывода 78х160=12480х2 = почти 25 тысяч через второй способ. Через первый мм чуть поменьше.
    Можно сделать оба адреса пересчитываемыми в коде (откуда + куда), но жрать станет больше по времени, по сути, сравняется с LDI.
    Остается хардкорный вариант раскидать музу и весь остальной код по страницам, оставив в нулевой лишь блок управления =)

  9. #59

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

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Остается хардкорный вариант раскидать музу и весь остальной код по страницам, оставив в нулевой лишь блок управления =)
    Музыку не просто перенести. Она скомпилирована с кучей абсолютных адресов. Хотя тут есть спецы по музыке с амстрад, они наверно что хошь перенесут. Можно пока что музыку тоже выключить. Посмотреть что получится. Я прикинул что надо делить на 5 частей, потому что фон состоит из пяти тайлов. Легче будет растянуть в полоски. И 3/5 вывода должно почти ровно в прерывание влезать.

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


    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
    [свернуть]

  10. #60

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

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    Музыку не просто перенести. Она скомпилирована с кучей абсолютных адресов
    Там даже не в амстраде суть, а в перелопачивании всех адресов вручную, на крайняк.
    Если в коде нет вычисляемых выражениями адресов - это муторно, но вполне осуществимо.

    Цитата Сообщение от izzx Посмотреть сообщение
    3/5 вывода должно почти ровно в прерывание влезать
    Ну, если смириться с двухкратным размером кода переброса экрана, можно и с прерываниями выводить.
    Конструкциями вида POP HL:LD (NN),HL - так и код проще развернуть будет, и стек обработать.
    Процедура обработки прерывания сверяет адрес стека (или кода), если идет переброс -
    достаточно восстановить всего 2 байта под стеком, причем мы знаем, каких - это HL.
    Примерно так оно будет выглядеть:
    Код:
    INTERR	LD	(CURRSP+1),SP
    	LD	SP,INTBUF+100
    	PUSH	AF,BC,DE,HL...	;сохраняем все изменяемые регистры
    	BLABLA			;процедуры на прерываниях
    	......
    	POP	...HL,DE,BC	;восстанавливаем, кроме AF
    	LD	A,(CURRSP+2)	;старший байт стека
    	RLA			;если SP>=#8000 - идет переброс
    	JR	C,CURRSP-1
    	POP	AF		;иначе нормальный выход
    	LD	SP,(CURRSP+1)
    	EI
    	RET
    
    	POP	AF
    CURRSP	LD	SP,0
    	POP	HL		;адрес возврата в процедуру вывода
    	LD	(RET_JP+1),HL
    	LD	HL,(INTBUF+92)	;адрес хранения пары HL
    	PUSH	HL		;востанавливаем затертых 2 байта
    	POP	HL
    	EI
    RET_JP	JP	0
    
    INTBUF	DEFS	100		;буфер с запасом под временный стек
    Буфер должен быть именно с запасом, т.к. музыка, переключение страниц и прочее.

    Этот пользователь поблагодарил reddie за это полезное сообщение:

    izzx(07.08.2021)

Страница 6 из 9 ПерваяПервая ... 23456789 ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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