Так гораздо оптимальнее)
Надо бы замерить на реале, отличается ли по тактам ASH от ASHC.
И я бы заменил циклические сдвиги, на сдвиг по таблице (8 таблиц по 512 байт).
Но это надо опять же замерять, что быстрее будет.
Вид для печати
Если ASHC выполняется за такое же время, как и ASH, то я бы сделал что-то типа того:
Код:R0, R1 - рабочие регистры
R2 - какой-то буфер для спрайтов
R3 - счетчик столбцов
R4 - сдвиг
R5 - указатель на спрайт
22$: MOV R3,-(SP) ; Сохранить R3 на стеке
MOV @#176640,-(SP) ; Сохранить регистр адреса планов 1,2 на стеке
11$:
CLR R0 ; R0 = 0
MOV (R5)+,R1 ; (R5)+ -> R1
ASCH R4,R0 ; R0.R1 << R4
BIS R0,R1 ; R1 = (R5)+ rol R4
MOV R1,R0 ;
mask: BIC 0x0F0F,R0 ; Оставить старшие части сдвинутых байт
; (слово маски писать прям в код самомодификацией)
BIS R0,@#176642 ; (план 1,2) = (план 1,2) | R0
MOV R0,(R2)+ ; R0 -> (R2)+
INC @#176640 ; Прирастить регистр адреса планов 1,2
XOR R0,R1 ; Оставить младшие части сдвинутых байт
BIS R1,@#176642 ; (план 1,2) = (план 1,2) | R1
MOV R1,(R2)+ ; R1 -> (R2)+
SOB R3,11$ ; Цикл на R3 итераций
MOV (SP)+,@#176640
ADD #80.,@#176640
MOV (SP)+,R3
3$: DEC #0
BNE 22$
Так было такое количество лишнего кода, что не удивлюсь, если даже при большем времени выполнения ASHC - новый код выиграет у старого
Были жалобы на нехватку памяти. Правда, если вместо 25 слов использовать 31 - то таки да, никакой памяти не хватит
- - - Добавлено - - -
BIC 0x0F0F,R0 => BIC #^B<0000111100001111>, R0
Твои же собственные тесты с этими командами протухли)
https://zx-pk.ru/threads/14702-rasch...l=1#post590216
Titus, но там сами тесты остались или нет? Что бы @S_V_B у себя мог прогнать?
если надо образ и все тесты Патрона выложу повторно
Не будет работать, поэтому так много лишнего кода.Код:11$:
CLR R0 ; R0 = 0
MOV (R5)+,R1 ; (R5)+ -> R1
ASCH R4,R0 ; R0.R1 << R4
BIS R0,R1 ; R1 = (R5)+ rol R4
MOV R1,R0 ;
mask: BIC 0x0F0F,R0 ; Оставить старшие части сдвинутых байт
; (слово маски писать прям в код самомодификацией)
BIS R0,@#176642
В вашем примере байт не расширяется до слова.. а сдвигаются два последовательных байта спрайта.
И в памяти планы чередуются через байт 1,2,1,2..
Смысл в чем, взяли байт - сдвинули его в слове, а потом наложили BISом следующее слово со смещением в байт, тогда все склеится правильно.