Фон просто фон. Проскроллить и дорисовать, это значит прочитать графику там где она хранится, проскроллить в регистрах и положить на экран?
Ещё вопрос к тебе. В одной из тем ты пишешь про табличный скроллинг. Но я, честно говоря, так и не смог понять как он устроен.
https://zx-pk.ru/threads/22125-kak-b...l=1#post642038
Можешь поподробнее объяснить?
Есть картинка шириной 400 пикселей и высотой 112 строк, это фон. Фон должен выводиться на всю ширину экрана начиная с 32-й (если считать с нуля) строки экрана и скроллиться влево-вправо на любое количество пикселей.
Фон занимает 5600 байт.
У меня 8 процедур вывода. Каждая выводит с определённым смещением (от 0 до 7). Получается не очень шустро: 67, 113, 188, 192, 192, 194, 187, 112 килотактов (Кт) соответственно. Скроллю "на лету" т.е., беру байт из места хранения фона, сдвигаю в регистре, кладу на экран. И так всю строку. Там где нужно использовать сдвиг тетрады, делаю второй проход уже по экрану.
Так вот хотел узнать про табличный скроллинг, может с ним быстрее будет?
там в ветке ниже было посчитано что гдето 42 байта на байт.
200к быстрее не сделаешь
хочешь быстро - делаешь 8 копий фона со скроллом
qsave.zip примерно так.
и потом быстро быстро кидаешь их на экран
если в анриле посмотришь код
то увидишь как делать это быстро
С уважением,
Jerri / Red Triangle.
А кто-нибудь работал с SpectNet IDE или знает о ней? Стоит ли заводить новую тему, есть ли подобные аналоги?
Фон просто последовательность байтов, 112 строк, длиной по 50 байт.
Код:;-------------------------------------------------------------------- ; ; Подпрограмма вывода фона ; Префикс для меток: bg ; В этой версии будем выводить и скроллить одновременно ; ;-------------------------------------------------------------------- ; ;include vars.asm ; Общие переменные (для локальной компиляции) bg ld a,(vars_bgofs_r) ; Берём смещение фона (в пикселях) из игровой переменной ld b,a ; Сохраняем and %00000111 ; Определяем на сколько скроллить add a,a ; Умножаем на 4 чтобы сделать табличный переход add a,a ld (bg_ag),a ; Готовим переход на нужную подрограмму вывода ld a,b ; Восстанавливаем srl a ; Делим новое смещение на 8 srl a ; Получаем смещение в знакоместах srl a ld ix,#0040 ; Адрес экранной таблицы. Выводим на 32-ю строку экрана. bg_ast equ $-1 ; Старший байт таблицы будет подставлен сюда извне. jr $ ; Переходим к нужному варианту вывода bg_ag equ $-1 jp bg0 nop jp bg1 nop jp bg2 nop jp bg3 nop jp bg4 nop jp bg5 nop jp bg6 nop jp bg7 nop ;----------------------------------------------------------------------------------------- ; Подпрограммы вывода фона ; Вх: a - смещение от начала графики в знакоместах ; ix - адрес строки экранной таблицы с которой начинать вывод фона ;----------------------------------------------------------------------------------------- ; Вывод фона без смещения bg0 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld bc,#d90 ; 112 * 31 bg0_loop ld e,(ix) ; Определяем адрес экрана ld d,(ix+1) dup 31 ldi edup ld a,(hl) ld (de),a ret po ; Если bc==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,19 ; Следующая строка фона add a,l ld l,a jr nc,bg0_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jr bg0_loop ; Вывод со сдвигом на 1 пиксель влево bg1 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld bc,32 ; Начинаем вывод с конца строки add hl,bc ld c,112 ; 112 строк bg1_loop ld a,(ix) ; Определяем адрес экрана ld d,(ix+1) add a,31 ; Выводим с конца строки справа налево ld e,a ld a,(hl) ; Берём скрытый байт графики и пыжим его в CY dec hl rla dup 31 ld a,(hl) rla ld (de),a dec e dec hl edup ld a,(hl) rla ld (de),a dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,82 ; Конец следующей строки фона add a,l ld l,a jp nc,bg1_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg1_loop ; Вывод со сдвигом на 2 пикселя влево bg2 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld bc,32 ; Начинаем вывод с конца строки add hl,bc ld c,112 ; 112 строк bg2_loop ld a,(ix) ; Определяем адрес экрана ld d,(ix+1) add a,31 ; Выводим с конца строки справа налево ld e,a ld a,(hl) rla rl b rla rr b dec hl dup 31 ld a,(hl) rla rl b rla rr b ld (de),a dec e dec hl edup ld a,(hl) rla rl b rla rr b ld (de),a dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,82 ; Конец следующей строки фона add a,l ld l,a jp nc,bg2_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg2_loop ; Вывод со сдвигом на 3 пикселя влево ; Вывод строки со сдвигом на пиксель вправо, потом в обратную сторону двигаем ; строку на экране влево на 4 пихаря bg3 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld c,112 ; 112 строк bg3_loop ld e,(ix) ; Определяем адрес экрана ld d,(ix+1) ; Выводим строку со сдвигом на пиксель вправо dup 31 ld a,(hl) rra ld (de),a inc e inc hl edup ld a,(hl) rra ld (de),a inc hl ; Читаем крайний справа для выдвигания влево ld a,(hl) rra ex de,hl dup 31 rld dec l edup rld ex de,hl dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,18 ; Начало следующей строки фона add a,l ld l,a jp nc,bg3_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg3_loop ; Вывод со сдвигом на 4 пикселя влево bg4 ld d,bggfx_ah ; Вычисляем начало графики ld e,a ld c,112 ; 112 строк bg4_loop ld l,(ix) ; Определяем адрес экрана ld h,(ix+1) ex af,af' ld a,(de) ex af,af' inc de dup 31 ld a,(de) ld (hl),a ex af,af' rrd ex af,af' inc l inc de edup ld a,(de) ld (hl),a ex af,af' rrd ex af,af' dec c ; Если c==0, то выходим ret z inc ix ; Следующая экранная строка inc ix ld a,18 ; Следующая строка фона add a,e ld e,a jp nc,bg4_loop ; Если не было переполнения, то уходим на круг inc d ; Иначе прибавляем старший байт и тоже на круг jp bg4_loop ; Вывод со сдвигом на 5 пикселей влево ; Читаем, сдвигаем влево на пиксель, потом вправо на 4 bg5 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld bc,32 ; Начинаем вывод с конца строки add hl,bc ld c,112 ; 112 строк bg5_loop ld a,(ix) ; Определяем адрес экрана ld d,(ix+1) add a,31 ; Выводим с конца строки справа налево ld e,a ; Делаем сначала сдвиг влево на пихарь с выводом dup 31 ld a,(hl) rla ld (de),a dec e dec hl edup ld a,(hl) ; Вывели первый байт строки rla ld (de),a dec hl ; Читаем предыдущий слева ld a,(hl) rla ex de,hl dup 31 rrd inc l edup rrd ex de,hl dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,82 ; Конец следующей строки фона add a,l ld l,a jp nc,bg5_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg5_loop ; Вывод со сдвигом на 7 пикселей влево ; Смещаемся на байт влево, сдвигаем строку вправо на 1 пихарь bg6 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld c,112 ; 112 строк bg6_loop ld e,(ix) ; Определяем адрес экрана ld d,(ix+1) ld a,(hl) rra rr b rra rl b inc hl dup 31 ld a,(hl) rra rr b rra rl b ld (de),a inc e inc hl edup ld a,(hl) rra rr b rra rl b ld (de),a dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,18 ; На начало следующей строки фона add a,l ld l,a jp nc,bg6_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg6_loop ; Вывод со сдвигом на 6 пикселей влево ; Смещаемся на байт влево, сдвигаем строку вправо на 1 пихарь bg7 ld h,bggfx_ah ; Вычисляем начало графики ld l,a ld c,112 ; 112 строк bg7_loop ld e,(ix) ; Определяем адрес экрана ld d,(ix+1) ld a,(hl) ; Берём скрытый байт графики и пыжим его в CY inc hl rra dup 31 ld a,(hl) rra ld (de),a inc e inc hl edup ld a,(hl) rra ld (de),a dec c ret z ; Если c==0, то выходим inc ix ; Следующая экранная строка inc ix ld a,18 ; На начало следующей строки фона add a,l ld l,a jp nc,bg7_loop ; Если не было переполнения, то уходим на круг inc h ; Иначе прибавляем старший байт и тоже на круг jp bg7_loop
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)