NedoPC #6 2011 г.

Программирование - Использование NeoGS в качестве акселератора.


Автор: Alone Coder Email:

dm i try. alonecoder(a),gmail. com

Если спросить программиста, чего больше всего не хватает Спектруму, он скорее всего ответит: скорости. Да, мы уже привыкли к чуть менее чем 1 MIPS и проблеме заполнить весь экран за фрейм. Но 64К интро Pimp My Spectrum от Ate Bit3 очень хорошо показывает, как изменяется восприятие графики, когда она работает действительно быстро!

И вот, у нас есть Z80, который работает на 24 MHz. Его в наше время можно купить на любом углу. Но в ZX его не поставишь -мешает видеоконтроллер. Зато его можно поставить в звуковую карту, что ребята из NedoPC с успехом и сделали - и в результате мы имеем NeoGS7.

Принципиальное отличие NeoGS от классического General Sound - наличие режима DMA для передачи данных между ZX и NeoGS. Если на классическом GS требовалось крутить цикл поллинга портов с обеих сторон, то на NeoGS достаточно установить начальный адрес, а потом читать или писать на ZX через нижнее окно памяти. NeoGS при этом может заниматься чем угодно и практически не замедляется. ZX не замедляется тем более. Это значит, что в турбо-режиме (много ли осталось живых Спектрумов с ZX-BUS, но без турбо-режима?) можно обновлять стандартный экран целиком за фрейм, и останется достаточно времени на музыку, обработку клавиатуры и чего бы там ни было ещё. Всё абсолютно плавно, и получается практически эффект игровой приставки.

Важно заметить, что адрес ячейки, которую читает ZX, не важен (NeoGS про неё даже не знает). Можно читать любую ячейку в области #0000..#3fff. NeoGS всё равно выдаст содержимое текущего адреса и автоматически передвинет указатель вперёд. Поэтому типичный цикл переброски экрана выглядит так:

ld sp,#db00 ld h,0 dup 6912/2 ld d,(hl) ld e,(hl) push de edup

(86417 тактов).

Разумеется, для этого экран, заготовленный в NeoGS, должен лежать там задом наперёд.

Поскольку остаются свободные такты на ZX, можно заготовить экран в каком-то другом формате, чтобы NeoGS было удобнее его просчитывать. Например, по столбцам (192 байта данных, 64 байта пропустить - и так 32 раза):

ld sp,0 ld l,#1f ld bc,#f920 col0 _=#c0 if0 _&7 ld h,_ endif dup 24 dup 4 pop de ld (hl),e inc h ld (hl),d inc h edup org $-1 add hl,bc _=_+1 edup dup 32 pop de edup dec l jp p,col0

(115040 тактов, не считая атрибутов).

Тут уже зависит от скорости конкретного ZX: Scorpion и Pentagon 1024SL v2.2 не вытянут такую скорость, PentEvo сможет, а KAY под вопросом. Впрочем, можно уменьшить количество столбцов или строк.

Обратите внимание, NeoGS, в принципе, не обязан использовать какие-либо прерывания,

Использование NeoGS в качестве акселератора


ведь синхронизацию нужно производить только после построения кадра — чтением признака от ZX. А это значит, что допустимо любое, даже самое безумное использование стека!

В предыдущем примере можно было бы пропускать байты не пустым чтением, а перестановкой указателя, но выигрыш сомнителен, так как для этого надо организовать обработчик NMI в NeoGS. Тогда пришлось бы отказаться в NeoGS от некоторых типов стековых процедур.

Понятно, что нужно обязательно использовать двойную буферизацию передаваемых данных. Программа в NeoGS строит один кадр, а в это время ZX через DMA читает предыдущий. После построения кадра NeoGS ждёт бит в порту, а ZX его установит по прерыванию. Потом можно обменяться какими-то данными (например, состоянием клавиатуры) и начать всё сначала.

Двойную буферизацию на NeoGS делать довольно просто благодаря наличию двух окон переключения памяти. В одном окне можно держать экран, а в другом графику. Можно оба экрана хранить в нижней памяти. В принципе, под NeoGS можно адаптировать и спектрумовские программы, если организовать вышеописанный цикл переброски экрана - синхронизации - чтения клавиатуры.

Не обязательно ограничиваться

стандартным спектрумовским экраном. Например, первый эффект в демо The Link8 использует мультиколор 4x2. Исходники The Link лежат на самом диске с демой - можете посмотреть как это работает. К сожалению, в мультиколоре доступно всего 8 цветов (15 дадут клешинг), но есть выход: можно пускать на чётных строках растра мультиколор (экран 0), а на нечётных - чанки (экран 1). Если ограничиться только чёрными, белыми и серыми чанками, то и тогда цветов будет 24. Правда, придётся передавать в два раза больше данных, но никто не мешает включать турбо-режим в нижнем бордере! По моим расчётам, тактов

8 http://www.youtube.com/watch?v=yNL2NCQGN5Q на Pentagon 1024SL v2.2 вполне хватает.

На NeoGS можно реализовать даже фреймовый 2D движок под 16col в стиле Ball Quest - скорости впритык, но хватает. Правда, с появлением спрайтов в PentEvo (http://forum.nedopc.com/viewtopic.php? f=30&t=622) это уже не так нужно. Подождём их эмуляции.

Если не заморачиваться насчёт фреймовости, то можно передавать 16col экран целиком. Это займёт 4 фрейма на Pentagon 1024SL v2.2, что оставляет достаточно времени NeoGS на всякие трёхмерные вычисления.

Можно играть и 16col видео с SD-карточки, установленной в NeoGS, пользуясь встроенным mp3-декодером для звука -собственно, такую программу у нас уже написали4. Так что проблема видеовставок в играх проблемой не является.

Поскольку в NeoGS есть ПЛИС, которая заполнена лишь частично, то можно ускорять через неё ресурсоёмкие операции типа умножений или c2p (ACNews #565). Прошивку можно менять на лету, это может делать каждая программа. Пока что таких прошивок нет, но исходники стандартной в свободном доступе - так что всё возможно. Тут опять встаёт проблема эмуляции, которую можно решить разработкой одной раз и навсегда стандартной прошивки с наворотами. В случае чего, её можно обновлять одновременно с эмулятором, но при условии совместимости со старым софтом.

Стандартный NeoGS, во всяком случае, прекрасно эмулируется.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Editorial - chasm: Кстати, вы читали правила cc04?
Тусовка - раздел,в котором каждый желающий сможет передать кому-либо привет, поздравить друзей с днем рождения и т.д.
INTRO - Что будет и чего не будет в номере.

В этот день...   29 ноября