Акселератор операций с ОЗУ
Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по за- полнению ОЗУ одним байтом. Акселератор присутствует в чисто Sprinter-овских конфигурациях и поэтому никак не мешает работе обычных Spectrum-овских программ.
Основой акселератора является быстрое внутреннее ОЗУ в ППЛМ. Операции по пересылке данных производятся путем записи блока данных в это внутреннее ОЗУ, а затем копировании его в нужное место памяти из этого ОЗУ. После одной записи копирование может производиться несколько раз и таким образом можно производить заполнение экрана текстурами.
Для заполнения экрана одним цветом используется другой режим акселератора. В нем вместо копиру- емого блока данных из внутреннего ОЗУ производится запись данных с шины процессора, которые в этот момент не изменяются.
Блок данных, записываемый в ОЗУ акселератора может иметь различную длинну из диапазона 1..256 байт.
Управление акселератором производится непосредственно из программы. Для этого изпользуются ко- манды процессора, которые фактически являются операциями типа NOP. Это команды LD A,A; LD B,B; LD C,C; LD D,D; LD E,E; LD H,H, LD L,L
Назначение команд следующее:
LD B,B - выключить акселетарор.
LD D,D - включить акселератор в режим приема байта размера блока
далее следует команда типа LD A,dat, где dat и будет новым
размером блока. Если размер блока был установлен ранее,
его можно не устанавливать.
LD C,C - Операция Fill - заполнение одним байтом. Последующая
команда типа LD (HL),A приведет к заполнению указанного
ранее количества байт значением A
LD E,E - Операция Fill для графического экрана - заполнение
вертикальных линий.
LD H,H - rezerved
LD L,L - копирование блока. Последующая команда типа LD A,(HL)
приведет к заполнению ОЗУ акселератора данными из адреса (HL),
а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ
акселератора в основное или видео-ОЗУ.
LD A,A - копирование блока для графического экрана подобна команде
LD L,L, но работает с вертикальными линиями экрана.
Пример использования акселератора:
; Считаем, что экранная страница уже открыта по адресу #C000
LD HL,#C040 ; адрес начала линии первого экрана
LD DE,#C180 ; адрес начала линии второго экрана
LD BC,#140 ; длина экрана по горизонтали
DI ; запретить прерывания для работы с акселератором
LD D,D ; включить акселератор на установку размера блока
LD A,0 ; установить размер блока - 256 байт
LD A,A ; установить акселератор на копирование
; вертикальных линий.
LDIR ; копировать !
LD B,B ; выключить акселератор
EI ; включить прерывания
Этот отрезок программы произведет копирование всего экрана с одного экрана на другой. Время его исполения составляет примерно 1.2 инта.
Дополнительные функции акселератора (AND, OR, XOR) работают подобным же образом. Для выпол- нения логических функций используются команды XOR (HL); OR (HL); AND (HL).
Пример кодирования блока в 256 байт:
LD HL,ADRES_1
LD DE,XOR_DAT
DI
LD D,D
LD A,0 ; число байт, которые надо закодировать
LD L,L
LD A,(DE) ; взять блок данных в ОЗУ акселератора
XOR (HL) ; произвести операцию XOR с данными акселератора
LD (HL),A ; запомнить в ОЗУ результат операции
LD B,B
EI
Скорость работы акселератора ограничивается только физической скоростью работы основного ОЗУ. Определить время работы команды с акселератором можно по такой примерной формуле:
Время работы = время работы команды без акселератора + время работы акселератора
Время работы акселератора = число пересылаемых байт /7000000 (секунд)
Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно меняется система команд процессора и программа на прерывании не сможет работать нормально. В данный момент применяется прошивка, в которой акселератор может работать в режиме со включенными прерываниями. В момент прихода прерывания он отключается и включается обратно по команде RETI. Использовать этот режим следует с осторожностью.