
Сообщение от
reddie
Проверить бы всю строку, если она пустая - зачем щелкать HL, можно сразу переходить на следующую.
Вот это правильная мысль, конечно. У меня в генераторе на C# код стругается, теоретически можно бы сделать что угодно.
Получается, что на каждую вертикальную координату экрана своя таблица адресов?
SpriteAddrHigh ds 170 ;адреса спрайтов по 2 байта для каждых 10 пар строчек и одной последней = 22 байт на спрайт *7 штук и 16 на лазер
То есть рассчитывается адрес начала каждой второй строчки. 1,3,5,..21.
Потом при печати берём адрес второй строчки, рисуем её, поднимаемся на строку выше, рисуем её. Так перешло от версии амстрад.
Я выше говорил, что это нужно для частичной печати спрайта на верхней и нижней границе экрана.
Саму процедуру можно ускорить, для начала заменив IX и работу с ним на DE:
Наверное тоже можно бы, но тогда надо хранить-восстанавливать DE. А так адрес таблицы для спрайта всегда в IX, никто его не трогает. Все спрайты один за другим печатаются по таблице из IX.
То бишь пишем в память не числа, а регистры. Получится строка типа такой (заменив 45 на аккум):
Идею понял, но это хитро надо генератор на C продумывать ). Чтобы он такой умный код выдал.
ps. Да, если смотреть исходники с подсветкой синтаксиса, то закомментированное не так бросается в глаза. Я вот в Notepad++ редактирую.
ps2. Вот тут в прошлый раз так оптимизировал расчёт координат спрайтов, в случае когда регистры, кроме IY и IX, заняты и запись через стек. Нужно сдвинуть DE на 80 вниз.
Было:
Код:
;---
ld (TempHL),hl ;16 на строку вниз
ld hl,80 ;10
add hl,de ;11
ex de,hl ;4
ld hl,(TempHL) ;16
; ;---
push de ;11 ; place address into address list pointed to by sp
;68
Стало:
Код:
ld iy,80 ;14
add iy,de ;15
push iy ;15
;44