PDA

Просмотр полной версии : Переброска ЧБ картинки...



newart
27.06.2005, 22:44
Подскажите как быстрее перекинуть ЧБ картинку на экран, с учетом того
что память очень ограничена. Размер и формат картнки стандартный 6144
байт. Всего есть пять картинок, в каждой из них есть некоторое кол-во
повторяющихся байтов. (0, 255, и %01010101)
Изначально я использовал процедуру вида:

ld af,#ffff
ld bc,#0
ld hl,#%0101010101010101
ld de,10
push de
ld de,14
push de
push bc
push bc
push bc

За счет повтора байтов удавалось перекинуть
картнку за фрейм и сэкономить память.
Но 48-я память кончилась, и я решил отказаться
от фрейма в пользу памяти.

Однако пока кроме банального LDI в голову ничего не
приходит.
От процедуры зависит судьба игры. :o

lvd
27.06.2005, 23:10
Подскажите как быстрее перекинуть ЧБ картинку на экран, с учетом того
что память очень ограничена. Размер и формат картнки стандартный 6144
байт. Всего есть пять картинок, в каждой из них есть некоторое кол-во
повторяющихся байтов. (0, 255, и %01010101)
Изначально я использовал процедуру вида:

ld af,#ffff
ld bc,#0
ld hl,#%0101010101010101
ld de,10
push de
ld de,14
push de
push bc
push bc
push bc

Найти ещё несколько частых вордов и запхнуть их в hl'/bc'/af'/ix/iy ?

newart
28.06.2005, 00:12
Найти ещё несколько частых вордов и запхнуть их в hl'/bc'/af'/ix/iy ?
Я же говорю страый метод уже не приемлем, слишком много места занимает.
Уже решил, буду юзать ldi, тормозно, но других вариантов не вижу.
Резка экран на спайты (чтобы исключить залитые знакоместа) выйгрышь дает смехотворный.

lvd
28.06.2005, 00:23
Я же говорю страый метод уже не приемлем, слишком много места занимает.
Уже решил, буду юзать ldi, тормозно, но других вариантов не вижу.
Резка экран на спайты (чтобы исключить залитые знакоместа) выйгрышь дает смехотворный.

А ещё можно повторяющиеся последовательности типа dup N:push hl: edup и любые другие загонять в лупы и 'процедуры' (ld ix,$+7:jp proc .... proc: ... :jp (ix) ).

Shadow Maker
28.06.2005, 01:11
И в чем тогда будет выйгрыш? В скорости не будет, примерно как тот же ldi... В общем похож оставь ldi либо почему бы не сделать один раз декранч этой хрени предварительно, поюзать, потом убить? Или она тебе постоянно нужна в памяти? Или игра сугубо 48k и не больше?

newart
28.06.2005, 02:03
В общем похож оставь ldi либо почему бы не сделать один раз декранч этой хрени предварительно, поюзать, потом убить? Или она тебе постоянно нужна в памяти? Или игра сугубо 48k и не больше?
Картинка каждый игровой цикл заново выводится, игра 128к.

newart
28.06.2005, 02:59
Кто-нибудь знает во сколько фреймов укладывался ЧВ? (в среднем)
У меня получается порядка 4-7, и это без всяких алгоритмов поиска
пути. :(
Да и в турбо режиме у меня скорость игры не увеличивается.

Shiru
28.06.2005, 03:55
Картинка, которую ты перекидываешь - она статична? Т.е., её исходные данные никогда не изменяются?

Alex/AT
28.06.2005, 10:10
Стоп... а почему "классический" подход типа LDSP/POP HL/DE/BC/AF/EX/EXA/POP HL/DE/BC/AF/LDSP/PUSH ... не катит?

Robus
28.06.2005, 17:24
Подскажите как быстрее перекинуть ЧБ картинку на экран, с учетом того
что память очень ограничена. Размер и формат картнки стандартный 6144
байт. Всего есть пять картинок, в каждой из них есть некоторое кол-во
повторяющихся байтов. (0, 255, и %01010101)
Изначально я использовал процедуру вида:

ld af,#ffff
ld bc,#0
ld hl,#%0101010101010101
ld de,10
push de
ld de,14
push de
push bc
push bc
push bc

За счет повтора байтов удавалось перекинуть
картнку за фрейм и сэкономить память.
Но 48-я память кончилась, и я решил отказаться
от фрейма в пользу памяти.

Однако пока кроме банального LDI в голову ничего не
приходит.
От процедуры зависит судьба игры. :o

Опиши более точно задачу, картинка статическая ? Может это спрайтовая картинка ?

newart
28.06.2005, 17:58
Стоп... а почему "классический" подход типа LDSP/POP HL/DE/BC/AF/EX/EXA/POP HL/DE/BC/AF/LDSP/PUSH ... не катит?
Тем что кушает много памяти.
Текущий вариант (ld de,data:push de) занимает 8500-10800байт (на разных картинках). При размере процедуры 9500 байт, свободно в 48-й памяти остается 500 байт, чего явно не хватает для дописания игры. Максимум что могу выделить это 6144 байт на картинку и примерно 1кб на прцедурк печати.

newart
28.06.2005, 18:00
Картинка, которую ты перекидываешь - она статична? Т.е., её исходные данные никогда не изменяются?
Да, просто картинка (игровое поле). В ходе игры не меняется.

Shiru
28.06.2005, 18:06
Тем что кушает много памяти.
Ну так не разворачивай цикл полностью. Есть килобайт - вот в него и разверни, сколько получится. Будет немного медленнее, зато в память уложишься.

Robus
28.06.2005, 18:35
Тем что кушает много памяти.
Текущий вариант (ld de,data:push de) занимает 8500-10800байт (на разных картинках). При размере процедуры 9500 байт, свободно в 48-й памяти остается 500 байт, чего явно не хватает для дописания игры. Максимум что могу выделить это 6144 байт на картинку и примерно 1кб на прцедурк печати.

Выложи картинку, или пришли её на меил RobusAsmCoder(ne kotik)ukr.net, может в итоге получится ещё меньше чем 6144, кстати, а важно в один кадр вместиться, или можно немного больше ?

captain cobalt
28.06.2005, 20:02
А если хранить картинки в компрессированном виде? ;)
Распаковывать нужную и генерировать мегакод?