blackmirror, пытаюсь осмыслить как применить эту хитрую таблицу на практике.
Возьмём какой-нибудь байт из исходного спрайта, например такие 4 точки:
◼︎◼︎◼︎◼︎
В таблице ему должно соответствовать несколько слов:
◼︎◼︎◼︎◼︎◻︎◻︎◻︎◻︎
◻︎◼︎◼︎◼︎◼︎◻︎◻︎◻︎
◻︎◻︎◼︎◼︎◼︎◼︎◻︎◻︎
◻︎◻︎◻︎◼︎◼︎◼︎◼︎◻︎
Значком ◻︎ я обозначил точки произвольного цвета, конкретные значения нас не интересуют.
В исходном спрайте рассматриваемые 4 точки должны храниться не в виде цветов (11001001), а в виде порядкового номера в таблице.
Чтобы нарисовать наши 4 точки, мы достаём число из данных спрайта, умножаем его на 2 (потому что таблица состоит из слов, а не из байтов), берём значение из этой таблицы, сделав отступ в таблице, если надо. И ещё применяем маску.
Код:
MOVB (R1)+,R2 ; взяли данные из спрайта
BIC #177400,R2 ; сбросили старшие биты, можно маску сброса хранить в каком-нибудь регистре
ASL R2 ; умножили на два, получили индекс в таблице
Дальше если надо вывести точки без сдвига, делаем так:
Код:
MOV TABL(R2),R2 ; забрали 8 точек из таблицы
BIC #377,R2 ; сбросили ненужные 4 точки, маску опять же можно хранить в регистре
BIS R2,(R3) ; вывели оставшиеся 4 точки на экран
Если надо вывести точки со сдвигом на одну, делаем так:
Код:
MOV TABL+2(R2),R2 ; забрали 8 точек из таблицы
BIC #140077,R2 ; сбросили ненужные 4 точки по маске
BIS R2,(R3) ; вывели оставшиеся 4 точки на экран
Сдвиг на две точки:
Код:
MOV TABL+4(R2),R2 ; забрали 8 точек из таблицы
BIC #170017,R2 ; сбросили ненужные 4 точки по маске
BIS R2,(R3) ; вывели оставшиеся 4 точки на экран
Сдвиг на три точки:
Код:
MOV TABL+6(R2),R2 ; забрали 8 точек из таблицы
BIC #176003,R2 ; сбросили ненужные 4 точки по маске
BIS R2,(R3) ; вывели оставшиеся 4 точки на экран
Довольно изящно. Да ещё и организация таблицы умная: точки ◻︎ - не абы что, а цвета для других входных данных.
Но изящно оно пока мы выводим изображение в чётные адреса экрана.
Как только надо вывести 4 точки по нечётному адресу, появляются костыли:
Код:
MOVB (R1)+,R2 ; взяли данные из спрайта
BIC #177400,R2 ; сбросили старшие биты
ASL R2 ; умножили на два, получили индекс в таблице
MOV TABL+6(R2),R2 ; забрали 8 точек из таблицы
BIC #176003,R2 ; сбросили ненужные 4 точки по маске
BISB R2,(R3)+ ; вывели часть точек на экран
SWAB R2 ; переключились на оставшиеся точки
BISB R2,(R3) ; вывели оставшуюся часть точек на экран
А это уже довольно долго.
P.S. На самом деле порядок точек на экране слева направо соответствует порядку битов справа налево, но это детали. Просто изображённые мной цветные квадратике будут выводиться на экран БК в обратном порядке.