у тебя фон из тайлов? или фон просто фон?
если выбирать из вариантов скроллить на лету или перерисовывать тайлы
то вариант - проскроллить и дорисовать - быстрее
Вид для печати
Фон просто фон. Проскроллить и дорисовать, это значит прочитать графику там где она хранится, проскроллить в регистрах и положить на экран?
Ещё вопрос к тебе. В одной из тем ты пишешь про табличный скроллинг. Но я, честно говоря, так и не смог понять как он устроен.
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 копий фона со скроллом
Вложение 74235 примерно так.
и потом быстро быстро кидаешь их на экран
если в анриле посмотришь код
то увидишь как делать это быстро
А кто-нибудь работал с 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