Акселератор операций с ОЗУ

Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по за- полнению ОЗУ одним байтом. Акселератор присутствует в чисто 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. Использовать этот режим следует с осторожностью.