ну тут атрибуты же, их немного; а если lddr развернуть в ldd-ldd (благо размер заранее известен) - тогда всё успеет перебросить еще на бордере
Вид для печати
ещë один мега-дыбильный вопрос.
ld a,0
loop1:
inc a
jp po, loop0
; код программы, если флаг чëтный
loop0:
;продолжение кода
jp loop1
По задумке чëт/нечет должен переключаться при каждом инкременте, и соответственно перескакивать по условию. Но не перескакивает. Оно только для константных чисел работает что ли? Ну, типа, явное присвоение ld a, 228, например? Как мне щëлкать флаг в цикле, шоба пульсировало подобно мультивибратору?
даже если бы на чётность работал для арифметики (как в 8080) - всё равно не переключался бы каждый раз
потому что это чётность кол-ва единичных битов в числе, а не самого числа
если всё же для условия непременно нужен именно как флаг чётности - сделай после инкремента and/or a
что-то аномалия какая-то у меня в процедуре закраски массивом атрибутов в области ректангла.
Есть такая процедурка. С ней всё ок. Тут выводит лишь отдельно взятый атрибут по указанным 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 чтоб прокатило ))
А вообще тебе правильно сказали, из цикла лучше исключить расчет адреса, достаточно сделать один раз, а потом просто смещение добавлять.
но оно не константное жи. А обратно пропорционально ширине пикчи.
- - - Добавлено - - -
хотя да. Наверное быстрее вычислить значение вначале
LD HL, offset
LD B, (_SPR_W)
LD A, 32
SUB B
LD (HL), A
Наверное так.
- - - Добавлено - - -
Таки да. Помогло. Благодарю.