С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Казалось, что всё уже, баZа для движка имеется. Ан нет. Всё никак не отстану.
Вот в том блоке, где мы прибавляем смещение к hl, как мне выполнить проверку, что атрибуты находятся в диапазоне от 0 до 31 ? Чтоб отсекало, а не лезло на след. строку.
- - - Добавлено - - -
Прост не хотелось бы переделывать ширину буфера.
- - - Добавлено - - -
но, видимо, таки придётся...
Стал переделывать шырину буфера (на 40 байт на строку вместо 32-ух)
Заменил в этой строке на ld a,40
Затем процедура переброски буфера на экран:
Но почему-то позиция XY атрибутов начинается с косяком. То, что должно быть 0 по X, равняется 32-8.Код:VIRT_WIDE_ATTR_TO_SCR halt di ld de,REAL_SCREEN ld hl,MAIN_BUFF ; главный буфер ; ldir LD B,24 WIDE_LOOP push bc ld bc,32 ldir ld bc,8 ; 40 ширина буфера минус 32 область реального экрана - остаток add hl,bc pop bc DJNZ WIDE_LOOP ei RET
И вместо отсечения - переход на следующую строку...
- - - Добавлено - - -
ааа.. кажется я поооонииил.. пока не уверен наверняка, но по-моему там сорс-дестинейшн адреса блитинга спрайтов нарушены (ибо я их изначально делал под запас буфера с вертикальным скроллом)
И это всё что ты заменил ? А то, что старом варианте проги адресация была гвоздями прибита к ширине 32 байта ты учёл ? ))
- - - Добавлено - - -
Вот очень простенький и медленный вариант адресации для 40 байтной ширины буфера.
Пытаться оптимизировать дальше влом. ))Код:; адрес в буфере шириной 40 байт E-x , D-y ; 40 не кратен степеням 2-ки ; ADR= Y*40+X = Y*32+Y*8+X ; максимальный Y=23 ; 256/23=11,13... ; в нашем случае можно умножение на 8 использовать байтовое ; а уже дальше придётся переходить на слова push hl ld a,d ; Y ld d,#F2 ; старший байт буфера add a,a ; *2 add a,a ; *4 add a,a ; *8 ld l,a ld h,0 add hl,hl ; *16 add hl,hl ; *32 add a,l ; \ ld l,a ; | *32 + *8 jp nc,1F ; | inc h ; / 1 add hl,de ; +x +буфер ex de,hl pop hl
Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))
ALKO(06.10.2024)
Снова атрибуты.
На сей раз пытаюсь скроллить циклически экран влево
Но получается какая-то муть.
По задумке тут через аккум первый пиксель в строке должен переноситься на последний циклично (в идеале вообще бы через теневые регистры это замутить, чтоб лишний раз не долбиться в стек).Код:SCROLL_PLANE_L di ld hl,22528 ld de,22528-1 ld b,24 ; строки ld a,(hl); берём первый пиксель push af SCROLL_PLANE_L1: push bc ld bc,31 ; столбцы ldir pop bc pop af ld (hl),a; переносим на последний столбец inc hl ; следующая строка djnz SCROLL_PLANE_L1 ei ret
В общем, сыпется оно не так, как задумывалось.
Убери push af / pop af и подыми SCROLL_PLANE_L1: на строку выше.
Тут нумерация строк не делается?
ALKO(30.10.2024)
Наверно так?
Старайся писать аккуратно. Себе же меньше работы будет! И людЯм приятно.)Код:SCROLL_PLANE_L
- di
- ld de,22527 ; начало экрана
- ld hl,22527 + 1 ; начало экрана + 1
- ld b,24 ; строк
- SCROLL_PLANE_L1:
- ld a,(de) ; сохраним первый столбец
- push bc
- ld bc,32 - 1 ; всего столбцов - первый
- ldir ; переместим все влево
- pop bc
- ; DE - указатель на последний в текущей строке
- ; HL - на первый на следующей строке
- ld (de),a ; переносим сохранённый первый на последний столбец в строке
- inc de ; следующая строка
- inc hl ; следующая строка + 1
- djnz SCROLL_PLANE_L1
- ei
- ret
Что то LIST этот свернул всё.(
Код:SCROLL_PLANE_L di ld de,22527 ; начало экрана ld hl,22527 + 1 ; начало экрана + 1 ld b,24 ; строк SCROLL_PLANE_L1: ld a,(de) ; сохраним первый столбец push bc ld bc,32 - 1 ; всего столбцов - первый ldir ; переместим все влево pop bc ; DE - указатель на последний в текущей строке ; HL - на первый на следующей строке ld (de),a ; переносим сохранённый первый на последний столбец в строке inc de ; следующая строка inc hl ; следующая строка + 1 djnz SCROLL_PLANE_L1 ei ret
Последний раз редактировалось M80; 31.10.2024 в 11:43.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)