Без особых предисловий: вот краткая спецификация режима Sprites&Shifts.
1. Основной экран (со смещения 0 на странице RAM5 или со смещения 0 на странице RAM7 - как обычно) используется в качестве фона, и его можно двигать с точностью до 1 пиксела на 0..255 бит по горизонтали и на 0..191 бит по вертикали.
2. Дополнительная "экранная" область со смещения 0 на странице RAM1 содержит 32x24 = 768 = 300h байт. Если байт равен 0, то соответствующее знакоместо в основном не содержит спрайта (но может содержать частично продолжение начатого левее или выше спрайта), и в своей свободной области рисует (правильно сдвинутый по циклу) основной экран. Если это номер спрайта n=1..255, то со смещения 300h + n * 8 находится 8-байтное описание спрайта:
смщ длн значение
_0_ _2_ d0..d13 - смещение (в том же блоке памяти) к битовому изображению спрайта (за которым следует немедленно маска спрайта), 2 старших бита d14..d15 не используются. Например: если размер спрайта 3 байта х 11 пикселов, то сначала идет 33 байта изображения, потом 33 байта маски.
_2_ _1_ ширина спрайта в байтах d0..d4 (максимум 32 байт).
_3_ _1_ высота спрайта в пикселах d0..d7 (максимум 192 пиксельных линий).
_4_ _1_ атрибут спрайта (как обычно, d0..d2 - цвет бита "1", d3..d5 - цвет бита "0", d7 - мигание, d6 - яркость.
_5_ _1_ смещение спрайта в битах: d0..d5 - по горизонтали (вправо) на 0..63 пиксела; d6 - сдвиг не вправо, а влево; d7 - инверсия спрайта по горизонтали (т.е. он изображается зеркально отраженным по горизонтали).
_6_ _1_ смещение спрайта в битах: d0..d5 - по вертикали (вниз) на 0..63 пиксельных строк; d6 - сдвиг вверх, а не вниз; d7 - инверсия спрайта по вертикали (т.е. он изображается перевернутым, если d7=1).
_7_ _1_ приоритет (или Z-order) спрайта 0..255. Если несколько спрайтов пересекаются в какой-либо точке, то поверх всех показывается спрайт с бОльшим приоритетом. Вариант2: этот байт не используется, а в качестве приоритета используется номер спрайта. Вариант3: можно использовать этот байт как альфа-канал, для любителей. Вариант4 (лучше всего, его и оставить): d0..d1 - номер области ограничения вывода 1..3, см. описания областей в п.3.
Важный момент: сдвиги спрайтов не циклические, т.е. если в результате сдвига спрайт уходит за левую/правую или верхнюю/нижнюю границу экрана, он не появляется с противоположной стороны экрана. Чтобы смоделировать такое поведение, надо на противоположную сторону экрана поместить такой же спрайт, задав соответствующий сдвиг в нужную сторону. Но это все равно быстрее, чем нарисовать картинку самому.
3. Первый спрайт начинается со смещения 308h в RAM1.
Два байта в том же блоке памяти по адресам 300h и 301h задают соответственно вертикальное и горизонтальное (циклические) смещения основного экрана. Область отображения спрайтов может быть задана байтом 7 в описании спрайта (1..3). Описатели областей находятся по адресам 302h..307h (по 2 байта на область) в виде:
d0..d4 = x0 (0..31 байт)
d5..d7 = w (1..7, 0=8 1 байт)
d8..d12 = y0 (0..23 знакоместа)
d13..d15 = h (1..7 + 1 знакомест)
Т.е. можно определить до 3х (возможно, пересекающихся) прямоугольных областей - окон вывода, и приписать каждый спрайт на экране своей области. Те части спрайта, которые выпадают за свою область, автоматически обрезаются по границам знакомест.
Если задействуются все 255 спрайтов, то описания заканчиваются на смещении AFF, и со смещения B00h до 3FFFh весь остальной блок памяти могут занимать сами изображения и маски спрайтов.
4. Управление (порт).
Регистр 14 порта FFFD управляет включением режима: надо записать в него 81h, чтобы режим включился, и 80h, чтобы он выключился. При желании можно использовать любой порт, основное управление все равно идет через память.