Да... опять на те же грабли...
Странно что компилятор не ругается и сглатует за милую душу эту ересь.
Вопрос снят. Терь всё ок.
Вид для печати
Казалось, что всё уже, ба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
И вместо отсечения - переход на следующую строку...:v2_dizzy_sleep2:
- - - Добавлено - - -
ааа.. кажется я поооонииил.. пока не уверен наверняка, но по-моему там сорс-дестинейшн адреса блитинга спрайтов нарушены (ибо я их изначально делал под запас буфера с вертикальным скроллом)
И это всё что ты заменил ? А то, что старом варианте проги адресация была гвоздями прибита к ширине 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-ки), то арифметика адресации была бы попроще. ))
Снова атрибуты.
На сей раз пытаюсь скроллить циклически экран влево
Но получается какая-то муть.
По задумке тут через аккум первый пиксель в строке должен переноситься на последний циклично (в идеале вообще бы через теневые регистры это замутить, чтоб лишний раз не долбиться в стек).Код: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: на строку выше.
Тут нумерация строк не делается?
Наверно так?
Старайся писать аккуратно. Себе же меньше работы будет! И людЯм приятно.)Код: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