
Сообщение от
ALKO
хотя да. Наверное быстрее вычислить значение вначале
LD HL, offset
LD B, (_SPR_W)
LD A, 32
SUB B
LD (HL), A
Наверное так.
Хмм... Нет такой команды 'LD B, (**)', есть 'LD A,(**)' или 'LD BC,(**)'
И много лишнего, например HL зря приплёл.
можно:
Код:
LD A,(_SPR_W)
LD B,A
LD A,32
SUB B
LD (offset),A
но лучше например
Код:
LD A,(_SPR_W)
NEG ; A=-A
ADD A,32
LD (offset),A
Оба варианта одинаковы и по тактам и по размеру, но во втором случае портится только регистр A
А можно сохранять позицию перед LDIR.
Например вот вариант изменения твоего кода для примера.
Код:
ld hl, SPR_ATTR ;указатель на массив DEFB
; Для начала если расположение ячеек координат и размера идёт друг за другом
; типо так :
;_SPR_X DB ?
;_SPR_Y DB ?
;_SPR_W DB ?
;_SPR_H DB ?
; то можно вместо конструкции
; ld a,(_SPR_Y)
; ld d,a
; ld a,(_SPR_X)
; ld e,a
; ld a,(_SPR_H)
; ld b,a
; поступить проще
ld de,(_SPR_X) ; E=(_SPR_X) , D=(_SPR_Y)
ld bc,(_SPR_W) ; C=(_SPR_W) , B=(_SPR_H)
; а теперь вместо этого
;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
; сначала найдём адрес в буфере (почти та же процедура) ))
ld a,d
rrca
rrca
rrca
ld d,a
and #E0
or e
ld e,a
ld a,d
and 3
add a,#F2 ; Для буфера в #F200
ld d,a ; в DE - адрес, никаких BC портить не надо
ld a,32 ; ну а вот и наше смещение
sub c ; теперь в A - смещение для строки
1 ; всё начинаем цикл
push bc
ld b,0
ldir
ld c,a ; теперь bc - смещение
ex de,hl
add hl,bc ; переход на новую строку
ex de,hl
pop bc
djnz 1B
ret
Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
если вылезет - будет пичалька ))