С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
ещë один мега-дыбильный вопрос.
ld a,0
loop1:
inc a
jp po, loop0
; код программы, если флаг чëтный
loop0:
;продолжение кода
jp loop1
По задумке чëт/нечет должен переключаться при каждом инкременте, и соответственно перескакивать по условию. Но не перескакивает. Оно только для константных чисел работает что ли? Ну, типа, явное присвоение ld a, 228, например? Как мне щëлкать флаг в цикле, шоба пульсировало подобно мультивибратору?
Последний раз редактировалось ALKO; 18.09.2024 в 21:34.
Прихожу без разрешения, сею смерть и разрушение...
ALKO(19.09.2024)
что-то аномалия какая-то у меня в процедуре закраски массивом атрибутов в области ректангла.
Есть такая процедурка. С ней всё ок. Тут выводит лишь отдельно взятый атрибут по указанным X|Y
Пробую то же самое уже для массива атрибутов из линейного DEFB сверху вниз/слева направо (правда тут иные регистровые пары используются, и рисуется в буфер), так почему-то при достижении позиции Y определённого значения оно перескакивает на начало экрана. Что-то не то в булевой алгебре AND ORКод:ATTR ld a,(_ATTRY) ld b,a ld a,(_ATTRX) ld c,a ; расчет адреса атрибутов знакоместа в DE, B-вертик.координата, C-гориз.координата LD A,B RRCA RRCA RRCA LD L,A AND 31 OR 88 LD H,A LD A,L AND 252 OR C LD L,A LD A,(_ATTRC) LD (HL),A RET
_SPR_H, _SPR_W - высота/ширина ректангла, соответственно.
Код:ld hl, SPR_ATTR ;указатель на массив DEFB ld a,(_SPR_Y) ld d,a ld a,(_SPR_X) ld e,a ld a,(_SPR_H) ld b,a PUTSPRITES2 push bc push de LD A,D RRCA RRCA RRCA LD C,A AND 31 OR 242 ; 61952/256 LD B,A LD A,C AND 252 OR E LD C,A ld d,b ld e,c ld bc,(_SPR_W) ld b,0 ldir pop de inc d pop bc djnz PUTSPRITES2 ret
ну мало ли, буферы бывают больше экрана, чтобы не считать отдельно обрезку спрайтов
или меньше, если на экране меньше область активная
почему "приходится"? что мешает сразу к адресу смещение прибавлять?
- - - Добавлено - - -
вообще надо бы тебе освоить трассировку в эмуле каком-нить, например xpeccy
Прихожу без разрешения, сею смерть и разрушение...
Блин... Привыкай писать значения в шестнадцатиричном формате, быстрее будешь понимать когда ерунду пишешь ))
По поводу
Код:LD A,B RRCA RRCA RRCA LD L,A AND 31 ; это #1F но нахрена если там 2 значащих бита всего , AND #03 и всё OR 88 ; это #58 LD H,A LD A,L AND 252 ;это #FC и опять нахрена -> AND #E0 OR C LD L,A LD A,(_ATTRC) LD (HL),A RET
Нет в исходном состоянии работает конечно, если позиции не выходят за рамки, но всётаки
А теперь следующее
Получается что ты к буферу по некратному адресу пытаешься применить метод адресации экрана, в результате у тебя OR #F2 затирает старший бит позиции YКод:*** LD A,D RRCA RRCA RRCA LD C,A AND 31 ;опять это #1F OR 242 ; 61952/256 ; #F2 то есть буфер по адресу #F200 - ну-ну LD B,A LD A,C AND 252 ; и опять #FC OR E LD C,A ***
- - - Добавлено - - -
Замени OR #F2 на ADD #F2 чтоб прокатило ))
А вообще тебе правильно сказали, из цикла лучше исключить расчет адреса, достаточно сделать один раз, а потом просто смещение добавлять.
ALKO(23.09.2024)
но оно не константное жи. А обратно пропорционально ширине пикчи.
- - - Добавлено - - -
хотя да. Наверное быстрее вычислить значение вначале
LD HL, offset
LD B, (_SPR_W)
LD A, 32
SUB B
LD (HL), A
Наверное так.
- - - Добавлено - - -
Таки да. Помогло. Благодарю.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)