дык та же фигня что и у меня с источником плюс вывод перекошенный на 1 байтСообщение от crushers[4ePT
дык та же фигня что и у меня с источником плюс вывод перекошенный на 1 байтСообщение от crushers[4ePT
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
процедура очень классическая - через push-pop. 65000 - засчет того. что размер копируемого пространства не 32/24, а 32/20.
Самой процедуры в чистом виде у меня нет, она генерится и занимает около восьми килобайт. Вот генератор, в комментах (справа, форум их визуально режет, надо курсором поскролить чтоб увидеть) есть перечень комманд, которые пишутся в память:
Код:INITCOPYFRAME LD BC,COPYFRAME_GENERATED LD DE,SP_STORAGE LD A,#ED ;LD (NN), LD (BC),A INC BC LD A,#73 ;SP LD (BC),A INC BC LD A,E ;N LD (BC),A INC BC LD A,D ;N LD (BC),A INC BC LD HL,#C000+SCREEN_WIDTH/2 LD (COPYFRAME_HL),HL LD DE,FRAMEBUFFER+(FRAMEBUFFERLINE-SCREEN_WIDTH)/2 LD (COPYFRAME_DE),DE LD A,SCREEN_HEIGHT COPYROW PUSH AF LD A,2 COPYHALFROW LD HL,(COPYFRAME_HL) LD DE,(COPYFRAME_DE) PUSH AF LD A,#31 ;LD SP, LD (BC),A INC BC LD A,E ;N LD (BC),A INC BC LD A,D ;N LD (BC),A INC BC LD A,#E1 ;POP HL LD (BC),A INC BC LD A,#C1 ;POP BC LD (BC),A INC BC LD A,#D1 ;POP DE LD (BC),A INC BC LD A,#F1 ;POP AF LD (BC),A INC BC LD A,#D9 ;EXX LD (BC),A INC BC LD A,#08 ;EX AF,AF' LD (BC),A INC BC LD A,#E1 ;POP HL LD (BC),A INC BC LD A,#C1 ;POP BC LD (BC),A INC BC LD A,#D1 ;POP DE LD (BC),A INC BC LD A,#F1 ;POP AF LD (BC),A INC BC LD A,#31 ;LD SP, LD (BC),A INC BC LD A,L ;N LD (BC),A INC BC LD A,H ;N LD (BC),A INC BC LD A,#F5 ;PUSH AF LD (BC),A INC BC LD A,#D5 ;PUSH DE LD (BC),A INC BC LD A,#C5 ;PUSH BC LD (BC),A INC BC LD A,#E5 ;PUSH HL LD (BC),A INC BC LD A,#D9 ;EXX LD (BC),A INC BC LD A,#08 ;EX AF,AF' LD (BC),A INC BC LD A,#F5 ;PUSH AF LD (BC),A INC BC LD A,#D5 ;PUSH DE LD (BC),A INC BC LD A,#C5 ;PUSH BC LD (BC),A INC BC LD A,#E5 ;PUSH HL LD (BC),A INC BC LD HL,(COPYFRAME_HL) LD DE,SCREEN_WIDTH/2 ADD HL,DE LD (COPYFRAME_HL),HL LD DE,(COPYFRAME_DE) LD HL,SCREEN_WIDTH/2 ADD HL,DE LD (COPYFRAME_DE),HL POP AF DEC A JP NZ,COPYHALFROW LD HL,(COPYFRAME_HL) LD DE,SCREEN_WIDTH AND A SBC HL,DE CALL DOWNHL LD (COPYFRAME_HL),HL LD HL,(COPYFRAME_DE) LD DE,SCREEN_WIDTH AND A SBC HL,DE LD DE,FRAMEBUFFERLINE ADD HL,DE LD (COPYFRAME_DE),HL POP AF DEC A JP NZ,COPYROW LD DE,SP_STORAGE LD A,#ED ;LD SP, LD (BC),A INC BC LD A,#7B ;(NN) LD (BC),A INC BC LD A,E ;N LD (BC),A INC BC LD A,D ;N LD (BC),A INC BC LD A,#C9 LD (BC),A INC BC RET
Перераспредели регистры. Буфер назначения храни в HL, тогда не надо будет приседать с пересылкой через промежуточные регистры. В два раза сократишь исходник
огого, я кажется понял, о чем ты, но совершенно не представлял, что такие возможности вообще есть.
Стесняюсь спросить, а что такое "тайловая"? Погуглил - ссылок не густо, из обрывочных упоминаний понял что это "состоящая из кусочков". Ну это как из знакомест что ли?
я не рискну давать определение слову "тайл", но в этой теме говорится об отрисовке заднего фона из квадратных спрайтов равной ширины и высоты.
принцип таков, что картинка заднего фона делится на повторяющиеся пронумерованные кусочки, и хранится именно в виде набора номеров этих кусочков, а сами куски хранятся отдельно.
основной плюс этого подхода - огромная экономия памяти, основной минус - довольно терпимая потеря скорости.
вот здесь, например, фон (земля) явно сделан по этому принципу:
ftp://ftp.worldofspectrum.org/pub/si.../StarFarce.gif
Да и вообще, технология, наверное, в каждой второй аркадной игре встречается.
Если не ошибаюсь, то на первых приставках тайлы обычно занимали одно знакоместо и выводились аппаратными средствами, так что потери скорости там не было.
Добавлено через 1 минуту
да я всю жизнь асм на коленке учил, я и dup-то недавно только использовать начал, встретив где-то в текстах на zxdn, так что я совсем зелёный кодер пока
Добавлено через 17 минут
вот результат генерации, абсолютно классическая процедура - назначили sp, считали 16 байт. назначили sp - положили 16 байт.
сейчас посидел слегка с калькулятором, и высчитал, что если задействовать еще IX и IY, то получится чуть-чуть быстрее.
У меня получилось без них - 12,75 такта на байт
С использованием IX и IY получится - 12,4 такта на байт (что даст почти 1500 тактов выигрыша в сумме в моём случае, при том же размере пересыльщика)
Сейчас еще посмотрю в ZX-Review, там был какой-то заинтересовавший меня способ, на который по какой-то причине у меня чуть-чуть не хватало памяти.
Последний раз редактировалось moroz1999; 07.04.2008 в 23:38. Причина: Добавлено сообщение
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)