С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спецификация этого "нового графического режима" есть?
Если нет, то для начала хотя-бы нужно привязаться к одному из стандартных видео разрешений. Взять к примеру индустриальный стандарт VGA 640х480@60Hz 24bpp, Pixel freq.=25.175 MHz(округлим под PLL до 25МГц).
Получается, что максимальное разрешение 640х480 24bpp, сюда теперь можно вложить несколько видео режимов, к примеру так:
1) 640х480
2) 320x240
3) ZX-Spectrum screen (x2 = H:32+256+32; V=24+192+24)
4) ZX-Spectrum screen (х1 = 4-ре поля H:32+256+32; V=24+192+24):
Фото режимов 3 и 4
[свернуть]
Прихожу без разрешения, сею смерть и разрушение...
Сорри, весь тред не осилил, но расскажу мнение адаптатора игр на примере Саботера 2. Мне было бы очень кайфово и быстро адаптировать Саботера, если бы можно было:
1. Сказать видеокарте, что у меня n тайловых слоев.
2. Отправить ей тайлы 8x8 для каждого слоя
3. Замапить куски ОЗУ на тайловые буфера для слоев.
4. Получить от карты момент окончания отрисовки экрана чтобы включить другую страницу с тайлмапами в момент отрисовки бордюра.
Это позволит мне отключить рендерер. А, чтобы оптимизировать вывод тайлов в тайлмапы, было бы неплохо, чтобы сами тайлмапы были размером больше, чем 32x24, желательно раза хотя бы в 3. Чтобы не париться с клиппированием.
PS Не претендую на то, что так оно будет удобно для всех игр. С Elite такое явно не прокатит, ей нужен 3D-успоритель![]()
То есть для гашения нужна команда, по которой видеокарта должна будет пройтись по всем точкам экрана: прочитать точку из буфера экрана, уменьшить число в каждом канале RGB на 1 и записать обратно в буфер экрана. За 31 цикл с паузами для обеспечения нужной скорости можно плавно погасить весь экран.
---------- Post added at 23:39 ---------- Previous post was at 23:25 ----------
INT надо подавать после отображения на телевизоре правой нижней точки экрана 256х192 ?
Т.е. каждую локацию подготовить в виде таблицы 32х24 тайла (768 на экран) и загрузить в SDRAM в буфер локаций. Дополнительные слои делать с прозрачными цветами и прозрачным спрайтам № 0. После этого для копирования из буфера локаций в буфер экрана достаточно будет указать адрес локации. После перехода в новое место скопировать в буфер экрана нижний слой, потом спрайты героев, потом верхний слой. Я правильно понял?
Это позволит мне отключить рендерер. А, чтобы оптимизировать вывод тайлов в тайлмапы, было бы неплохо, чтобы сами тайлмапы были размером больше, чем 32x24, желательно раза хотя бы в 3. Чтобы не париться с клиппированием.
PS Не претендую на то, что так оно будет удобно для всех игр. С Elite такое явно не прокатит, ей нужен 3D-успоритель![]()
Сколько примерно надо локаций?
Сколько байтов надо на номер тайла ?
Перечислите, пожалуйста, названия игр, для которых такой способ тоже подойдет.
А для каких нужен другой способ ?
Какой ?
Последний раз редактировалось zx-kit; 26.06.2015 в 22:01.
"L-256"
Кто-бы что тут не говорил... вот рабочий пример, можно попробовать в конфигурации Zet:
Взято отсюда: http://devotes.narod.ru/Books/3/ch05_10d.htmКод:; fadeout.asm ; выполняет плавное гашение экрана .model tiny .code .186 ; для команд insb/outsb org 100h ; СОМ-программа start: cld ; для команд строковой обработки mov di,offset palettes call read_palette ; сохранить текущую палитру, чтобы ; восстановить в самом конце программы, mov di,offset palettes+256*3 call read_palette ; а также записать еще одну копию ; текущей палитры, которую будем ; модифицировать mov cx,64 ; счетчик цикла изменения палитры main_loop: push cx call wait_retrace ; подождать начала обратного хода луча mov di,offset palettes+256*3 mov si,di call dec_palette ; уменьшить яркость всех цветов call wait_retrace ; подождать начала следующего mov si,offset palettes+256*3 ; обратного хода луча call write_palette ; записать новую палитру pop cx loop main_loop ; цикл выполняется 64 раза - достаточно для ; обнуления самого яркого цвета (максимальное ; значение 6-битной компоненты - 63) mov si,offset palettes call write_palette ; восстановить первоначальную палитру ret ; конец программы ; процедура read_palette ; помещает палитру VGA в строку по адресу ES:DI read_palette proc near mov dx,03C7h ; порт 03C7h - индекс DAC/режим чтения mov al,0 ; начинать с нулевого цвета out dx,al mov dl,0C9h ; порт 03C9h - данные DAC mov cx,256*3 ; прочитать 256 * 3 байта rep insb ; в строку по адресу ES:DI ret read_palette endp ; процедура write_palette ; загружает в DAC VGA палитру из строки по адресу DS:SI write_palette proc near mov dx,03C8h ; порт 03C8h - индекс DAC/режим записи mov al,0 ; начинать с нулевого цвета out dx,al mov dl,0C9h ; порт 03C9h - данные DAC mov cx,256*3 ; записать 256 * 3 байта rep outsb ; из строки в DS:SI ret write_palette endp ; процедура dec_palette ; уменьшает значение каждого байта на 1 с насыщением (то есть, после того как ; байт становится равен нулю, он больше не уменьшается из строки в DS:SI ; и записывает результат в строку в DS:SI dec_palette proc near mov cx,256*3 ; длина строки 256 * 3 байта dec_loop: lodsb ; прочитать байт, test al,al ; если он ноль, jz already_zero ; пропустить следующую команду dec ax ; уменьшить байт на 1 already_zero: stosb ; записать его обратно loop dec_loop ; повторить 256 * 3 раза ret dec_palette endp ; процедура wait_retrace ; ожидание начала следующего обратного хода луча wait_retrace proc near push dx mov dx,03DAh VRTL1: in al,dx ; порт 03DAh - регистр ISR1 test al,8 jnz VRTL1 ; подождать конца текущего обратного хода луча, VRTL2: in al,dx test al,8 jz VRTL2 ; а теперь начала следующего pop dx ret wait_retrace endp palettes: ; за концом программы мы храним две копии ; палитры - всего 1,5 Кб end start
Ну, это так для примера, чтобы понятнее было как оно в реале на пальцах по простому работает.
У меня уже написаны модули текстового и графического режимов для VGA 640x480@60Hz (ссылка).
Текстовый режим 80х30 16 цветов, под текст и атрибуты используется 4800 байт, символы с атрибутами хранятся линейно - символ 0, атрибут 0, символ 1, атрибут 1, ... символ 2399, атрибут 2399. Реализован аппаратный курсор, может принимать два вида - большой и подчеркивание.
Графический режим 640х480@60Hz 24bpp, используется 921600 байт, точки хранятся линейно - (R,G,B); (R,G,B); ...
Попробую сделать ещё палитру. У кого есть желание и FPGA платы могут уже подключаться, есть возможность попробовать свои силы и научить нас чему-то...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)