LACE-РЕЖИМ
Многие из вас наверняка уже видели демо или игры, которые используют так называемый Interlace-режим для достижения большего количества цветов, оттенков или (при вертикальном скроллинге) удвоенного вертикального разрешения. Эта техника аппаратно используется, например, в Amiga, где она также удваивает разрешение. Минусом, конечно, является мерцание, степень которого зависит от используемых цветов. Чем темнее цвета, тем меньше заметно мерцание; то же самое, если цвета близки друг к другу, например, маджента и зеленый.
Jaxon Hollis когда-то написал программу под названием INT.XE (или что-то в этом роде), с помощью которой такие изображения можно создавать на Spectrum. У меня, к сожалению, этой программы нет, и я ее никогда не видел. Но мне нравится идея закодить в Lace-режиме, скажем, просмотрщик текста, чтобы сделать буквы более читабельными. К сожалению, такой просмотрщик был бы не только медленнее, но и не работал бы на Spectrum 48K, так как Interlace использует второй экран Spectrum — только так можно достаточно быстро переключаться между ними.
Существует два вида Interlace:
- Настоящий Interlace, как на Amiga. Spectrum может использовать этот режим только при скроллинге экрана, так как нет регистра, который заставил бы электронный луч работать в чересстрочном режиме так, чтобы при втором проходе луч рисовал что-то точно между строками предыдущего прохода.
- Простой LACE, при котором цвета обоих экранов смешиваются (работает и на SAM!). На Speccy это позволяет симулировать промежуточный цветовой оттенок в каждом знакоместе, если нужно. Этот LACE дает абсолютно стабильную картинку, если содержимое обоих экранов одинаково.
На BASIC переключение между экранами выглядело бы так:
10 LET Bank=16: REM Ursprungsbank
20 POKE 23388,Bank: OUT 32765,Bank
...
90 LET Bank=PEEK 23388
91 IF Bank>23 THEN LET Bank=Bank-8: GO TO 93
92 IF Bank<24 THEN LET Bank=Bank+8
93 POKE 23388,Bank
94 OUT 32765,Bank
Второй экран находится в банке 23, поэтому, если вы хотите что-то там нарисовать, нужно переключиться на этот банк. Проблема лишь в том, что невозможно напрямую использовать команды BASIC, такие как PLOT, DRAW, CIRCLE, PRINT и т.д., так как они написаны для нормального экрана с адреса 16384, а экран 2 находится на 32768 ячеек дальше, начиная с адреса 49152.
Однако с небольшой хитростью рисовать там возможно. Вы рисуете на обычном экране, затем подключается экран 2, и содержимое экрана 1 копируется на экран 2 (для тех, кто пострадал от ассемблера: LD HL,16384 / LD DE,49152 / LD BC,6912 / LDIR). Да, но кто будет использовать BASIC для такой маленькой Lace-процедуры, если это можно сделать на машинном коде, причем быстрее?
Я написал то же самое на ассемблере, чтобы использовать это со своим Interruptmaker. Следует учитывать, что все процедуры, управляемые прерываниями, которые используют переключение банков, должны находиться в области ниже адреса 49152, и адрес CLEAR (стек) также должен быть ниже 49152. Эту процедуру с некоторой удачей можно сделать исключением, но у меня нет желания этим заниматься (совет: перед вызовом процедуры загрузите в 23388 значение банка, в котором она находится, иначе она выкинет сама себя из памяти).
Interruptmaker 1.2
На этом диске находится мой Interruptmaker 1.2. Улучшения:
- Благодаря пушу IX и IY можно обращаться к дискам без краха системы.
- Добавлена возможность переключения банков (текущий банк всегда должен быть в 23388).
- Дополнительный CALL перед переключением банка (вектор перехода длиннее на 3 байта), если кто-то хочет встроить Lace-процедуру.
- Исправлена ошибка с черным экраном: добавлен третий бит (Screen) для переключения, если он установлен в 23388.
Lace-процедура работает как в режиме USR (покать адрес 23388 текущим банком), так и в режиме 128K, но не при использовании прерываний.
; Lace Assembler Routine
ORG 40000
LD BC,32765 ; Порт памяти
LD A,(23388)
BIT 3,A ; Проверка бита 3 (экран)
JR Z,setz ; Если 0, прыжок к setz
RES 3,A ; Сброс бита 3
JR last
setz:
SET 3,A ; Установка бита 3
last:
OUT (C),A ; Переключение банка
LD (23388),A
RET
Есть способ гораздо проще, короче и быстрее:
ORG 40000
LD BC,32765
LD A,(23388)
XOR 8 ; Инверсия бита 3
OUT (C),A
LD (23388),A
RET
При XOR 8 происходит следующее: текущий номер банка (например, 16) загружается в A. XOR 8 инвертирует значение. При втором вызове мы получаем исходный банк обратно. Это работает так же, как PLOT OVER 1. Эта команда длиной в два байта заменила 10 байт других команд, а время выполнения сократилось с 91/96 до 65 тактов.
Итог
Я думаю, что Lace-режим при определенных условиях подходит и для игр — не для экшенов, но для стратегий, головоломок, приключений или RPG, где скорость не так важна. Например, можно снабдить "Поле чудес" оцифрованной графикой из телепередачи. Если кто-то хочет получить конвертер Amiga-to-Spectrum-Lace, пришлите мне диск + 5 DM.
Совет для пользователей Spectrum 128 и MB02
MB02 — превосходный интерфейс, но так как он должен был быть совместим с 48K, он всегда работает в режиме "USR 0". Из-за этого некоторые программы с ним не работают (помогают нажатие BREAK в меню загрузки и загрузка с кассеты). В частности, это касается приключений 128K, написанных на PAW, и приложений вроде HiSoft Basic.
Решение для запуска моего "INDIAN PATIENCE": с помощью OUT 32765,48 вы заставляете Spectrum игнорировать переключение банков. Только после полного RESET (не просто NMI+E!) переключение банков снова становится доступным.
больше не имеет этой ошибки, что также необходимо, поскольку как минимум одна из моих будущих игр будет только для Spectrum 128. Я опробовал этот трюк на обоих своих MB02 (ранняя модель 128K и более новая 512K+Clock), и всё работало без проблем на обоих, как и без MB02 в режиме USR0 Mode. В 128K Basic компьютер, однако, завис бы! В общем, для игр, которые работают только в режиме 48K, перед последней командой USR просто введите OUT 32765,48, и проблема решена.
Ваш
Поделитесь вашим мнением о статье