Copper

Copper (Медный сопроцессор) - это простая программируемая система, позволяющая автоматически изменять определенные Next Registers (Регистры Next) в определенных позициях развертки.

“Copper” (Медный сопроцессор) - это сокращение от “co-processor” (сопроцессор) и термин, взятый у Amiga, которая имела аналогичную функцию. Copper на Spectrum Next не связан с сопроцессором Raspberry Pi.

Программа загружается в Copper путем отправки ее, байт за байтом, в Copper Data ($60). Каждая инструкция Copper имеет ширину 16 бит, и есть 2 опкода, где один бит в инструкции определяет операцию, и два специальных опкода. Всего существует четыре операции:

Опкод Битовый шаблон Эффект
WAIT (ОЖИДАНИЕ)%1hhhhhhv %vvvvvvvvОжидание растровой строки v (0-311) и горизонтальной позиции h*8 (h - 0-55) (длительность 1 ТАКТ)
MOVE (ПЕРЕМЕЩЕНИЕ)%0rrrrrrr %vvvvvvvvЗапись значения v в регистр Next r (длительность 2 ТАКТА)
NOOP (НЕТ ОПЕРАЦИИ)%00000000 %00000000Специальный случай “значение 0 в порт 0” работает как “нет операции” (длительность 1 ТАКТ)
HALT (ОСТАНОВКА)%11111111 %11111111Специальный случай “WAIT 63,511” работает как инструкция “остановки”

Объем памяти для программ Copper составляет 2k; поскольку каждая инструкция занимает 2 байта, она может хранить ровно 1024 инструкции, пронумерованные от 0 до 1023. Copper управляется словом, доступным через регистры Next Copper Control Low Byte ($61) и Copper Control High Byte ($62). Внутренний “счетчик команд” (CPC) имеет 10 бит (0-1023), автоматически увеличивая его после каждой инструкции, переходя после последней обратно к первой.

Управляющее слово copper имеет структуру: %cc000iii %iiiiiiii. I - это позиция хранения (0-2047) (для записи инструкций с помощью Copper Data ($60)), а c используется для установки режима работы copper, как показано ниже:

C битыЭффект
%00STOP (СТОП), copper ничего не делает (CPC сохраняет свое текущее значение)
%01сброс CPC в 0, затем START (СТАРТ)
%10START (СТАРТ) (возобновляет работу с текущего CPC)
%11сброс CPC в 0, затем START (СТАРТ); также VBLANK сбрасывает CPC в 0

Когда биты c идентичны ранее записанному значению, режим управления игнорируется и изменяется только индекс записи I.

Если вы не хотите, чтобы программа copper зацикливалась бесконечно, вы можете отметить “конец” программы copper, ожидая строку выше 311 (инструкция “HALT”). Поскольку эти строки никогда не будут достигнуты, copper по сути остановится до сброса.

Точное время и многие другие детали в настоящее время задокументированы в файле распространения “/docs/extra-hw/copper/COPPER-v0.1c.TXT”.

(core 2.0) код copper выполняется на частоте 14 МГц, и документ COPPER-v0.1c.TXT, указанный выше, описывает тайминги core2.0. (core 3.0) код copper выполняется на частоте 28 МГц, точные тайминги пока не задокументированы.

Из практических испытаний (с тестом copper “шведские флаги”) координаты для WAIT идентичны, MOVE в два раза быстрее (флаги составляют половину исходной ширины, потому что каждый пиксель создается одной инструкцией MOVE).

Важные значения, влияющие на отображение пикселей, теперь считываются в тот же момент, когда рисуется пиксель (пока нет тестов, описывающих, что это означает с точки зрения субпиксельной точности и в каком порядке следует выполнять MOVE copper с каким опережением, если вы хотите установить, например, 6 различных регистров, влияющих на отображение. Теоретически, если одно перемещение занимает половину ширины пикселя, вы должны начать точно на 3 пикселя впереди края, где все значения должны быть установлены, но YMMV (результаты могут отличаться)) (в целом, вероятно, гораздо разумнее избегать ситуаций, когда вам нужна субпиксельная точность, или тщательно тестировать на реальной плате).