Если спросить программиста, чего больше всего не хватает Спектруму, он скорее всего ответит: скорости. Да, мы уже привыкли к чуть менее чем 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 в качестве акселератора |