nedoVGA на рассыпухе

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

nedoVGA на рассыпухе

Post by Shaos »

Отпочковано от темы про nedoSprinter:

viewtopic.php?t=8869&postdays=0&postorder=asc&start=15

Пока пожалуй остановлюсь на режимах 640x350@70 и 640x400@70, через которые можно вывести:

- Graphics 320x200 with 256-color palette and 2 pages (top and bottom);
- Graphics 640x350 with 16 colors and 7 configurable zones;
- Graphics 320x350 with 256-color palette and 7 configurable zones;
- Graphics 640x400 with 16 colors;
- Graphics 320x400 with 256-color palette.

Image

Значит пока вырисовывается такая картина - Z180 работает на кварце 25.175 МГц, а выдаваемая из проца системная частота PHI будет в 2 раза меньше - 12587.5 кГц, которую мы и заюзаем как пиксельклок (в 16-цветных режимах буду использовать обе фазы этого клока). В результате экранных пикселов будет в 2 раза меньше:
4 пиксела - горизонтальный перед;
48 пикселов - горизонтальая синхра;
20 пикселов - горизонтальный зад;
4 пиксела - левый бордюр;
320 пиксела - видео;
4 пиксела - правый бордюр.
т.к. на бордюр нам наплевать, то прибавим его к переду и заду, сдвинув всё влево, чтобы строка начиналась сразу с видео (так удобнее считать):

320+8+48+24=400

по вертикалям (бордюр тоже прибавлен):

350+37+2+60=449 для 350 строк
400+12+2+35=449 для 400 строк

В отличие от Спринтера хочу несколько иначе построить работу с расширенными видеорежимами - вместо подключения отдельных строк кадра в 16K окно, мы разделим всю видеопамять на куски по 16K и будем подключать именно их в адресное пространство процессора. Одно окно в 16384 байта может охватить 51.2 строки видео (одна строка это 320 однобайтовых пикселов или 640 полубайтовых) - округлим до 50. Выходит, что режим в 350 строк потребует 7 таких областей, а в 400 строк - 8 (т.е. всего видеопамяти будет 128K). Видеопамять можно построить так, чтобы её куски были относительно независимыми друг от друга и чтобы процессор тормозился только если он лезет в тот кусок, который в данный момент отрисовывается.
Last edited by Shaos on 03 Jun 2013 18:50, edited 5 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Планирую взять 128K четырьмя блоками по 32K (CY62256 70ns) с независимым доступом - это чтобы процессор и видеоконтроллер мешали друг-другу только в 25% случаев (на самом делее меньше - ещё ведь синхросигналы всякие есть и т.д.), когда процессор читает или пишет в видеопамять.

Если одной микросхемой 128K сделать, то при этом в режиме 640x400 процент перекрытия с процессором будет 71% (при условии, что процессор подключил видеопамять в своё адресное пространство), а в 640x350 - 62% (т.е. 2/3 времени работы с видеопамятью процессор будет простаивать в ожидании видеоконтроллера). В случае же 4 корпусов с "интеллектуальной" логикой разрешения конфликтов, время простоя процессора, работающего с видеопамятью, будет в 4 раза меньше - 17.8% и 15.6% соответственно.

Потом есть мысль, что 4 микросхемы видеопамяти по 32K будут использоваться не только как хранилище пикселов, но и палитры - т.е. когда работаем с одной микросхемой, три другие выступают в роли кодировщика цвета по палитре - я прикинул, всё влазит! Но т.к. память только 70 нс, то придётся некое подобие конвейера делать - пока один пиксел декодится в RGB, следующий пиксел в тоже самое время будет считываться из видеопамяти...

Короче идея такая - каждый блок 16K в конце содержит пустое место равное 16384-320*50 = 384 байта, в которое отлично влезут 256 байт палитры для одной из цветовых составляющих (R,G или B). В каждой микросхеме 32K будут 2 таких блока - по адресу 011 1111 xxxx xxxx и по адресу 111 1111 xxxx xxxx. Соответственно пишем в них:

- первая микросхема: Red (для второй) и Red (для третьей и четвёртой);
- вторая микросхема: Red (для первой) и Green (для третьей и четвёртой);
- третья микросхема: Green (для первой и второй) и Blue (для четвёртой);
- четвёртая микросхема: Blue (для первой и второй) и Blue (для третьей).

Когда на экран выводится содержимое первой или второй микросхемы, то мы обращаемся к первым 256 байтам палитры трёх остальных микросхем (011 1111 xxxx xxxx), а когда с третьей и четвёртой, то ко вторым 256 байтам палитры (111 1111 xxxx xxxx). Кроме того есть интересная возможность для хакеров и демомейкеров положить разные таблички в одноимённые области (например может быть три разных блока R и три разных B, а также два разных блока G). Как минимум можно иметь 2 разные палитры для верхней половины экрана и для нижней половины экрана. Четверти экрана в половинках также могут друг от друга отличаться, но не полностью, а частично - например первая и вторая четвертинки могут иметь разные составляющие R, а третья и четвёртая - разные составляющие B - т.е. общее количество различных цветов в пределах экрана будет уже не 256, а 1024 :o (правда вторые 512 будут отличаться от первых только в одной цветовой составляющей, что тоже не мало).

P.S. Вышеописанные половины и четвертины имеют отношение к режиму 640x400, в случае же режима 640x350 половинки четвертинок (восьмушки?) могут свободно переставляться в пределах экранных 7 зон, таская за собой палитры из своих половинок :roll:
Last edited by Shaos on 03 Jun 2013 18:40, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вот по-быстрому накидал в фотошопе 1-палитра vs 2-палитры в картинке 320x400 (и потом растянул до 640x480). Оригинал:

Image

Одна палитра:

Image

Две разные палитры для верха и низа:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ещё один пример - оригинал 640x480:

Image

Одна палитра:

Image

Две разные палитры для верха и низа:

Image

P.S. Вот на всякий случай 320x400 картинка, которая использовалась для генерации:

http://www.nedopc.org/nedopc/upload/ZpT ... ig-big.jpg
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Последний пример - оригинал 640x480:

Image

Одна палитра:

Image

Две разные палитры для верха и низа:

Image

Понимаю, что разница небольшая, но её явно видно :)

И чем больше разница между верхом и низом (сверху - облака, снизу - земля и т.д.) тем больше будет выигрышь в качестве...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Всё думал в каком же формате можно такие картинки хранить и наконец меня осенило - хранить их надо в виде ДВУХ GIF-ФАЙЛОВ 320x200 :o
Один GIF для верхней половинки, а второй - для нижней. Скажем NAME_1.GIF и NAME_2.GIF, которые просмотрщик будет открывать как одну картинку...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:
Shaos wrote:Интересно, что в стандартной EGA-шной 16-цветной палитре путём хитрого размещения точек можно получить иллюзию более чем 16 цветов :)

Image

Слева кроме основных 16 цветов видно ещё 120 (цвета замешиваются в равных пропорциях в шахматном порядке), а справа - ещё 240 (один цвет замешан более сильно) - т.е. уже 376 цветов выходит :o
А вот так оно же будет выглдяеть в автоматически сгенерированной 256-цветной палитре, когда пара EGA-точек превращается в одну VGA-точку :o

Image

Так можно "размазывать" EGA-шные картинки при просмотре для пущей плавности :)
А вот интересно, можно ли эту палитру затолкать в галку или вообще на резисторах построить? Тогда можно сделать её палитрой по умолчанию для 256-цветных режимов и проц будет в 4 раза быстрее работать, пока программа не начнёт свою палитру использовать через 3 другие микросхемы видеопамяти...
Last edited by Shaos on 03 Jun 2013 18:16, edited 2 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Для режима 640x350 мы имеем возможность подключать любой сегмент из 8 в любую из 7 областей экрана. Тогда нам нужно будет 4 порта, каждый из которых будет управлять двумя экранными местами (четверть экрана), куда можно будет подключать любой из 8 сегментов или вообще отключать эту часть экрана:
bit 7 - управление нечётным экранным местом (1-запрещено, 0-разрешено);
bits 4,5,6 - номер сегмента в нечётном экранном месте (0...7);
bit 3 - управление чётным экранным местом (1-запрещено, 0-разрешено);
bits 0,1,2 - номер сегмента в чётном экранном месте (0...7).
Запрещённое экранное место закрашивается чёрным цветом, а в будущем три бита у запрещённого сегмента можно считать цветом заливки...

P.S. Можно использовать оставшиеся в четвёртом порту 4 бита чтобы устанавливать видеорежим - два младших бита на цветность:

00 - 16-цветный режим без палитры;
01 - 256-цветный режим с палитрой "EGA2VGA";
10 - 256-цветный режим "Grayscale" (градации серого);
11 - 256-цветный режим с пользовательской палитрой (палитрами).

И оставшиеся 2 бита (старших) на кол-во строк:

00 - 200 строк первая страница (верхняя половинка видеопамяти);
01 - 200 строк вторая страница (нижняя половинка видеопамяти);
10 - 350 строк с настройками 7 окон видеопамяти;
11 - 400 строк с фиксированными окнами видеопамяти.

Режим 16-цветов 200 строк бессмысленен (потому что 640x200), поэтому комбинации 0000 и 0100 будут иметь иной смысл - отключение видео совсем (0000) и расширение на будущее (0100) - например аппаратный текстовый режим...

P.P.S. Режимы 0001 и 0101 тоже не сильно осмысленные на самом деле, но пусть будут - мало ли...

P.P.P.S. Вот полная линейка видеорежимов:

0000 - отключение видео совсем;
0001 - 320x200 первая страница с палитрой EGA2VGA;
0010 - 320x200 первая страница с палитрой GRAYSCALE;
0011 - 320x200 первая страница с пользовательской палитрой;
0100 - расширение на будущее (аппаратный текст?);
0101 - 320x200 вторая страница с палитрой EGA2VGA;
0110 - 320x200 вторая страница с палитрой GRAYSCALE;
0111 - 320x200 вторая страница с пользовательской палитрой;
1000 - 640x350 с настройками 7 окон видеопамяти;
1001 - 320x350 с настройками 7 окон видеопамяти и палитрой EGA2VGA;
1010 - 320x350 с настройками 7 окон видеопамяти и палитрой GRAYSCALE;
1011 - 320x350 с настройками 7 окон видеопамяти и пользовательскими палитрами;
1100 - 640x400 с фиксированными окнами видеопамяти;
1101 - 320x400 с фиксированными окнами видеопамяти и палитрой EGA2VGA;
1110 - 320x400 с фиксированными окнами видеопамяти и палитрой GRAYSCALE;
1111 - 320x400 с фиксированными окнами видеопамяти и пользовательскими палитрами.

P.P.P.P.S. Вот эта палитра EGA2VGA:

Code: Select all

pal[0]=0x000000;	// 00000000 => 000 000 000
pal[1]=0x000055;	// 00000001 => 000 000 010
pal[2]=0x005500;	// 00000010 => 000 010 000
pal[3]=0x005555;	// 00000011 => 000 010 010
pal[4]=0x550000;	// 00000100 => 010 000 000
pal[5]=0x550055;	// 00000101 => 010 000 010
pal[6]=0x552A00;	// 00000110 => 010 001 000
pal[7]=0x555555;	// 00000111 => 010 010 010
pal[8]=0x2A2A2A;	// 00001000 => 001 001 001
pal[9]=0x2A2A7F;	// 00001001 => 001 001 011
pal[10]=0x2A7F2A;	// 00001010 => 001 011 001
pal[11]=0x2A7F7F;	// 00001011 => 001 011 011
pal[12]=0x7F2A2A;	// 00001100 => 011 001 001
pal[13]=0x7F2A7F;	// 00001101 => 011 001 011
pal[14]=0x7F7F2A;	// 00001110 => 011 011 001
pal[15]=0x7F7F7F;	// 00001111 => 011 011 011
pal[16]=0x000055;	// 00010000 => 000 000 010
pal[17]=0x0000AA;	// 00010001 => 000 000 100
pal[18]=0x005555;	// 00010010 => 000 010 010
pal[19]=0x0055AA;	// 00010011 => 000 010 100
pal[20]=0x550055;	// 00010100 => 010 000 010
pal[21]=0x5500AA;	// 00010101 => 010 000 100
pal[22]=0x552A55;	// 00010110 => 010 001 010
pal[23]=0x5555AA;	// 00010111 => 010 010 100
pal[24]=0x2A2A7F;	// 00011000 => 001 001 011
pal[25]=0x2A2AD4;	// 00011001 => 001 001 101
pal[26]=0x2A7F7F;	// 00011010 => 001 011 011
pal[27]=0x2A7FD4;	// 00011011 => 001 011 101
pal[28]=0x7F2A7F;	// 00011100 => 011 001 011
pal[29]=0x7F2AD4;	// 00011101 => 011 001 101
pal[30]=0x7F7F7F;	// 00011110 => 011 011 011
pal[31]=0x7F7FD4;	// 00011111 => 011 011 101
pal[32]=0x005500;	// 00100000 => 000 010 000
pal[33]=0x005555;	// 00100001 => 000 010 010
pal[34]=0x00AA00;	// 00100010 => 000 100 000
pal[35]=0x00AA55;	// 00100011 => 000 100 010
pal[36]=0x555500;	// 00100100 => 010 010 000
pal[37]=0x555555;	// 00100101 => 010 010 010
pal[38]=0x557F00;	// 00100110 => 010 011 000
pal[39]=0x55AA55;	// 00100111 => 010 100 010
pal[40]=0x2A7F2A;	// 00101000 => 001 011 001
pal[41]=0x2A7F7F;	// 00101001 => 001 011 011
pal[42]=0x2AD42A;	// 00101010 => 001 101 001
pal[43]=0x2AD47F;	// 00101011 => 001 101 011
pal[44]=0x7F7F2A;	// 00101100 => 011 011 001
pal[45]=0x7F7F7F;	// 00101101 => 011 011 011
pal[46]=0x7FD42A;	// 00101110 => 011 101 001
pal[47]=0x7FD47F;	// 00101111 => 011 101 011
pal[48]=0x005555;	// 00110000 => 000 010 010
pal[49]=0x0055AA;	// 00110001 => 000 010 100
pal[50]=0x00AA55;	// 00110010 => 000 100 010
pal[51]=0x00AAAA;	// 00110011 => 000 100 100
pal[52]=0x555555;	// 00110100 => 010 010 010
pal[53]=0x5555AA;	// 00110101 => 010 010 100
pal[54]=0x557F55;	// 00110110 => 010 011 010
pal[55]=0x55AAAA;	// 00110111 => 010 100 100
pal[56]=0x2A7F7F;	// 00111000 => 001 011 011
pal[57]=0x2A7FD4;	// 00111001 => 001 011 101
pal[58]=0x2AD47F;	// 00111010 => 001 101 011
pal[59]=0x2AD4D4;	// 00111011 => 001 101 101
pal[60]=0x7F7F7F;	// 00111100 => 011 011 011
pal[61]=0x7F7FD4;	// 00111101 => 011 011 101
pal[62]=0x7FD47F;	// 00111110 => 011 101 011
pal[63]=0x7FD4D4;	// 00111111 => 011 101 101
pal[64]=0x550000;	// 01000000 => 010 000 000
pal[65]=0x550055;	// 01000001 => 010 000 010
pal[66]=0x555500;	// 01000010 => 010 010 000
pal[67]=0x555555;	// 01000011 => 010 010 010
pal[68]=0xAA0000;	// 01000100 => 100 000 000
pal[69]=0xAA0055;	// 01000101 => 100 000 010
pal[70]=0xAA2A00;	// 01000110 => 100 001 000
pal[71]=0xAA5555;	// 01000111 => 100 010 010
pal[72]=0x7F2A2A;	// 01001000 => 011 001 001
pal[73]=0x7F2A7F;	// 01001001 => 011 001 011
pal[74]=0x7F7F2A;	// 01001010 => 011 011 001
pal[75]=0x7F7F7F;	// 01001011 => 011 011 011
pal[76]=0xD42A2A;	// 01001100 => 101 001 001
pal[77]=0xD42A7F;	// 01001101 => 101 001 011
pal[78]=0xD47F2A;	// 01001110 => 101 011 001
pal[79]=0xD47F7F;	// 01001111 => 101 011 011
pal[80]=0x550055;	// 01010000 => 010 000 010
pal[81]=0x5500AA;	// 01010001 => 010 000 100
pal[82]=0x555555;	// 01010010 => 010 010 010
pal[83]=0x5555AA;	// 01010011 => 010 010 100
pal[84]=0xAA0055;	// 01010100 => 100 000 010
pal[85]=0xAA00AA;	// 01010101 => 100 000 100
pal[86]=0xAA2A55;	// 01010110 => 100 001 010
pal[87]=0xAA55AA;	// 01010111 => 100 010 100
pal[88]=0x7F2A7F;	// 01011000 => 011 001 011
pal[89]=0x7F2AD4;	// 01011001 => 011 001 101
pal[90]=0x7F7F7F;	// 01011010 => 011 011 011
pal[91]=0x7F7FD4;	// 01011011 => 011 011 101
pal[92]=0xD42A7F;	// 01011100 => 101 001 011
pal[93]=0xD42AD4;	// 01011101 => 101 001 101
pal[94]=0xD47F7F;	// 01011110 => 101 011 011
pal[95]=0xD47FD4;	// 01011111 => 101 011 101
pal[96]=0x552A00;	// 01100000 => 010 001 000
pal[97]=0x552A55;	// 01100001 => 010 001 010
pal[98]=0x557F00;	// 01100010 => 010 011 000
pal[99]=0x557F55;	// 01100011 => 010 011 010
pal[100]=0xAA2A00;	// 01100100 => 100 001 000
pal[101]=0xAA2A55;	// 01100101 => 100 001 010
pal[102]=0xAA5400;	// 01100110 => 100 010 000
pal[103]=0xAA7F55;	// 01100111 => 100 011 010
pal[104]=0x7F542A;	// 01101000 => 011 010 001
pal[105]=0x7F547F;	// 01101001 => 011 010 011
pal[106]=0x7FA92A;	// 01101010 => 011 100 001
pal[107]=0x7FA97F;	// 01101011 => 011 100 011
pal[108]=0xD4542A;	// 01101100 => 101 010 001
pal[109]=0xD4547F;	// 01101101 => 101 010 011
pal[110]=0xD4A92A;	// 01101110 => 101 100 001
pal[111]=0xD4A97F;	// 01101111 => 101 100 011
pal[112]=0x555555;	// 01110000 => 010 010 010
pal[113]=0x5555AA;	// 01110001 => 010 010 100
pal[114]=0x55AA55;	// 01110010 => 010 100 010
pal[115]=0x55AAAA;	// 01110011 => 010 100 100
pal[116]=0xAA5555;	// 01110100 => 100 010 010
pal[117]=0xAA55AA;	// 01110101 => 100 010 100
pal[118]=0xAA7F55;	// 01110110 => 100 011 010
pal[119]=0xAAAAAA;	// 01110111 => 100 100 100
pal[120]=0x7F7F7F;	// 01111000 => 011 011 011
pal[121]=0x7F7FD4;	// 01111001 => 011 011 101
pal[122]=0x7FD47F;	// 01111010 => 011 101 011
pal[123]=0x7FD4D4;	// 01111011 => 011 101 101
pal[124]=0xD47F7F;	// 01111100 => 101 011 011
pal[125]=0xD47FD4;	// 01111101 => 101 011 101
pal[126]=0xD4D47F;	// 01111110 => 101 101 011
pal[127]=0xD4D4D4;	// 01111111 => 101 101 101
pal[128]=0x2A2A2A;	// 10000000 => 001 001 001
pal[129]=0x2A2A7F;	// 10000001 => 001 001 011
pal[130]=0x2A7F2A;	// 10000010 => 001 011 001
pal[131]=0x2A7F7F;	// 10000011 => 001 011 011
pal[132]=0x7F2A2A;	// 10000100 => 011 001 001
pal[133]=0x7F2A7F;	// 10000101 => 011 001 011
pal[134]=0x7F542A;	// 10000110 => 011 010 001
pal[135]=0x7F7F7F;	// 10000111 => 011 011 011
pal[136]=0x545454;	// 10001000 => 010 010 010
pal[137]=0x5454A9;	// 10001001 => 010 010 100
pal[138]=0x54A954;	// 10001010 => 010 100 010
pal[139]=0x54A9A9;	// 10001011 => 010 100 100
pal[140]=0xA95454;	// 10001100 => 100 010 010
pal[141]=0xA954A9;	// 10001101 => 100 010 100
pal[142]=0xA9A954;	// 10001110 => 100 100 010
pal[143]=0xA9A9A9;	// 10001111 => 100 100 100
pal[144]=0x2A2A7F;	// 10010000 => 001 001 011
pal[145]=0x2A2AD4;	// 10010001 => 001 001 101
pal[146]=0x2A7F7F;	// 10010010 => 001 011 011
pal[147]=0x2A7FD4;	// 10010011 => 001 011 101
pal[148]=0x7F2A7F;	// 10010100 => 011 001 011
pal[149]=0x7F2AD4;	// 10010101 => 011 001 101
pal[150]=0x7F547F;	// 10010110 => 011 010 011
pal[151]=0x7F7FD4;	// 10010111 => 011 011 101
pal[152]=0x5454A9;	// 10011000 => 010 010 100
pal[153]=0x5454FE;	// 10011001 => 010 010 110
pal[154]=0x54A9A9;	// 10011010 => 010 100 100
pal[155]=0x54A9FE;	// 10011011 => 010 100 110
pal[156]=0xA954A9;	// 10011100 => 100 010 100
pal[157]=0xA954FE;	// 10011101 => 100 010 110
pal[158]=0xA9A9A9;	// 10011110 => 100 100 100
pal[159]=0xA9A9FE;	// 10011111 => 100 100 110
pal[160]=0x2A7F2A;	// 10100000 => 001 011 001
pal[161]=0x2A7F7F;	// 10100001 => 001 011 011
pal[162]=0x2AD42A;	// 10100010 => 001 101 001
pal[163]=0x2AD47F;	// 10100011 => 001 101 011
pal[164]=0x7F7F2A;	// 10100100 => 011 011 001
pal[165]=0x7F7F7F;	// 10100101 => 011 011 011
pal[166]=0x7FA92A;	// 10100110 => 011 100 001
pal[167]=0x7FD47F;	// 10100111 => 011 101 011
pal[168]=0x54A954;	// 10101000 => 010 100 010
pal[169]=0x54A9A9;	// 10101001 => 010 100 100
pal[170]=0x54FE54;	// 10101010 => 010 110 010
pal[171]=0x54FEA9;	// 10101011 => 010 110 100
pal[172]=0xA9A954;	// 10101100 => 100 100 010
pal[173]=0xA9A9A9;	// 10101101 => 100 100 100
pal[174]=0xA9FE54;	// 10101110 => 100 110 010
pal[175]=0xA9FEA9;	// 10101111 => 100 110 100
pal[176]=0x2A7F7F;	// 10110000 => 001 011 011
pal[177]=0x2A7FD4;	// 10110001 => 001 011 101
pal[178]=0x2AD47F;	// 10110010 => 001 101 011
pal[179]=0x2AD4D4;	// 10110011 => 001 101 101
pal[180]=0x7F7F7F;	// 10110100 => 011 011 011
pal[181]=0x7F7FD4;	// 10110101 => 011 011 101
pal[182]=0x7FA97F;	// 10110110 => 011 100 011
pal[183]=0x7FD4D4;	// 10110111 => 011 101 101
pal[184]=0x54A9A9;	// 10111000 => 010 100 100
pal[185]=0x54A9FE;	// 10111001 => 010 100 110
pal[186]=0x54FEA9;	// 10111010 => 010 110 100
pal[187]=0x54FEFE;	// 10111011 => 010 110 110
pal[188]=0xA9A9A9;	// 10111100 => 100 100 100
pal[189]=0xA9A9FE;	// 10111101 => 100 100 110
pal[190]=0xA9FEA9;	// 10111110 => 100 110 100
pal[191]=0xA9FEFE;	// 10111111 => 100 110 110
pal[192]=0x7F2A2A;	// 11000000 => 011 001 001
pal[193]=0x7F2A7F;	// 11000001 => 011 001 011
pal[194]=0x7F7F2A;	// 11000010 => 011 011 001
pal[195]=0x7F7F7F;	// 11000011 => 011 011 011
pal[196]=0xD42A2A;	// 11000100 => 101 001 001
pal[197]=0xD42A7F;	// 11000101 => 101 001 011
pal[198]=0xD4542A;	// 11000110 => 101 010 001
pal[199]=0xD47F7F;	// 11000111 => 101 011 011
pal[200]=0xA95454;	// 11001000 => 100 010 010
pal[201]=0xA954A9;	// 11001001 => 100 010 100
pal[202]=0xA9A954;	// 11001010 => 100 100 010
pal[203]=0xA9A9A9;	// 11001011 => 100 100 100
pal[204]=0xFE5454;	// 11001100 => 110 010 010
pal[205]=0xFE54A9;	// 11001101 => 110 010 100
pal[206]=0xFEA954;	// 11001110 => 110 100 010
pal[207]=0xFEA9A9;	// 11001111 => 110 100 100
pal[208]=0x7F2A7F;	// 11010000 => 011 001 011
pal[209]=0x7F2AD4;	// 11010001 => 011 001 101
pal[210]=0x7F7F7F;	// 11010010 => 011 011 011
pal[211]=0x7F7FD4;	// 11010011 => 011 011 101
pal[212]=0xD42A7F;	// 11010100 => 101 001 011
pal[213]=0xD42AD4;	// 11010101 => 101 001 101
pal[214]=0xD4547F;	// 11010110 => 101 010 011
pal[215]=0xD47FD4;	// 11010111 => 101 011 101
pal[216]=0xA954A9;	// 11011000 => 100 010 100
pal[217]=0xA954FE;	// 11011001 => 100 010 110
pal[218]=0xA9A9A9;	// 11011010 => 100 100 100
pal[219]=0xA9A9FE;	// 11011011 => 100 100 110
pal[220]=0xFE54A9;	// 11011100 => 110 010 100
pal[221]=0xFE54FE;	// 11011101 => 110 010 110
pal[222]=0xFEA9A9;	// 11011110 => 110 100 100
pal[223]=0xFEA9FE;	// 11011111 => 110 100 110
pal[224]=0x7F7F2A;	// 11100000 => 011 011 001
pal[225]=0x7F7F7F;	// 11100001 => 011 011 011
pal[226]=0x7FD42A;	// 11100010 => 011 101 001
pal[227]=0x7FD47F;	// 11100011 => 011 101 011
pal[228]=0xD47F2A;	// 11100100 => 101 011 001
pal[229]=0xD47F7F;	// 11100101 => 101 011 011
pal[230]=0xD4A92A;	// 11100110 => 101 100 001
pal[231]=0xD4D47F;	// 11100111 => 101 101 011
pal[232]=0xA9A954;	// 11101000 => 100 100 010
pal[233]=0xA9A9A9;	// 11101001 => 100 100 100
pal[234]=0xA9FE54;	// 11101010 => 100 110 010
pal[235]=0xA9FEA9;	// 11101011 => 100 110 100
pal[236]=0xFEA954;	// 11101100 => 110 100 010
pal[237]=0xFEA9A9;	// 11101101 => 110 100 100
pal[238]=0xFEFE54;	// 11101110 => 110 110 010
pal[239]=0xFEFEA9;	// 11101111 => 110 110 100
pal[240]=0x7F7F7F;	// 11110000 => 011 011 011
pal[241]=0x7F7FD4;	// 11110001 => 011 011 101
pal[242]=0x7FD47F;	// 11110010 => 011 101 011
pal[243]=0x7FD4D4;	// 11110011 => 011 101 101
pal[244]=0xD47F7F;	// 11110100 => 101 011 011
pal[245]=0xD47FD4;	// 11110101 => 101 011 101
pal[246]=0xD4A97F;	// 11110110 => 101 100 011
pal[247]=0xD4D4D4;	// 11110111 => 101 101 101
pal[248]=0xA9A9A9;	// 11111000 => 100 100 100
pal[249]=0xA9A9FE;	// 11111001 => 100 100 110
pal[250]=0xA9FEA9;	// 11111010 => 100 110 100
pal[251]=0xA9FEFE;	// 11111011 => 100 110 110
pal[252]=0xFEA9A9;	// 11111100 => 110 100 100
pal[253]=0xFEA9FE;	// 11111101 => 110 100 110
pal[254]=0xFEFEA9;	// 11111110 => 110 110 100
pal[255]=0xFEFEFE;	// 11111111 => 110 110 110
Частоты появления цветовых градаций:

Code: Select all

freq[0x00]=48
freq[0x2A]=104
freq[0x54]=57
freq[0x55]=88
freq[0x7F]=190
freq[0xA9]=104
freq[0xAA]=41
freq[0xD4]=88
freq[0xFE]=48
0x54 очень близко к 0x55, 0xA9 очень близко к 0xAA, а 0xFE может быть заменено на 0xFF:

Code: Select all

freq[0x00]=48
freq[0x2A]=104
freq[0x55]=145
freq[0x7F]=190
freq[0xAA]=145
freq[0xD4]=88
freq[0xFF]=48
т.е. всего 7 уровней для каждой цветовой составляющей. Значит это должна быть комбинационная схема с 8 входами и 3*3=9 выходами (см.выше).

P.P.P.P.S. Поприкидывал на логике - палитра EGA2VGA тяжеловатой получается, т.е. видимо придётся аналоговые смесители на резисторах и транзисторах городить...

Единственное, что при аналоговом смешении коричневый будет не совсем коричневый, а скорее грязно-жёлтый: http://avga.prometheus4.com/index.php?p=2-3

Наверное можно подмухлевать с аналоговым ключом, чтобы коричневый был исключением - у него надо зелёную составляющую в 2 раза уменьшать при аналоговом смешении:
red := 2/3×(colorNumber & 4)/4 + 1/3×(colorNumber & 8)/8
green := 2/3×(colorNumber & 2)/2 + 1/3×(colorNumber & 8)/8
blue := 2/3×(colorNumber & 1)/1 + 1/3×(colorNumber & 8)/8

Color 6 is treated differently; when using the formula above, color 6 would become dark yellow, as seen to the left, but in order to achieve a more pleasing brown tone, special circuitry in most RGBI monitors, including the IBM 5153 color display, makes an exception for color 6 and changes its hue from dark yellow to brown by halving the analogue green signal's amplitude.
http://en.wikipedia.org/wiki/Color_Graphics_Adapter

P.P.P.P.P.S. В палитре EGA2VGA я насчитал только 85 уникальных цветов и похоже удастся построить генератор такой палитры на резисторах и диодах, правда схема коррекции коричневого цвета добавляет хлопот...
Last edited by Shaos on 09 Feb 2014 20:33, edited 4 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ещё картинок в вышеописанных режимах. Оригинал взят отсюда - это "Spectrum Girl" ;)

Image

256-цветный вариант 320x200 с одной палитрой:

Image

256-цветный вариант 320x350 с одной палитрой:

Image

256-цветный вариант 320x400 с одной палитрой:

Image

256-цветный вариант 320x400 с двумя палитрами:

Image

16-цветный вариант 640x350 (EGA):

Image

256-цветный вариант 320x350 с палитрой EGA2VGA:

Image

256-цветный вариант 320x350 с палитрой GRAYSCALE:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?

Image

P.S. Вариант 320x200 с RGB565 тоже влезает, однако для его поддержки надо больше железа (цапы надо будет переподключать иначе) - поэтому нехочу...

P.P.S. На самом деле имея две страницы 320x200 с независимыми 256-цветными палитрами можно замечательно программно сымитировать многоцветный режим - просто часто переключая эти две страницы по кадровому прерыванию 70 Гц...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:P.P.S. На самом деле имея две страницы 320x200 с независимыми 256-цветными палитрами можно замечательно программно сымитировать многоцветный режим - просто часто переключая эти две страницы по кадровому прерыванию 70 Гц...
И действительно - даже если мерцать палитрой EGA2VGA уже не так страшно выходит (чуть менее 1000 цветов):

Image

А если мерцать оптимальной палитрой, где цветовые составляющие идут с некоторым шагом, охватывая весь диапазон, то комбинированное кол-во цветов будет порядка 3 тысяч:

Image

Качество будет ещё лучше, если научиться генерировать комбинированную оптимальную палитру для каждого выводимого изображения, разделяя её правильно на две РАЗНЫЕ мерцающие палитры...

P.S. Вот для сравнения одиночная картинка с оптимально-универсальной палитрой 256 цветов:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?...

P.S. Вариант 320x200 с RGB565 тоже влезает, однако для его поддержки надо больше железа (цапы надо будет переподключать иначе) - поэтому нехочу...
Железа уже и так немало получается (я имею непреодолимое желание собрать эту видяху сначала на мелкой логике) - одних только 8-битных буферов я насчитал 32 штуки...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

Shaos wrote:
Shaos wrote:Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?...

P.S. Вариант 320x200 с RGB565 тоже влезает, однако для его поддержки надо больше железа (цапы надо будет переподключать иначе) - поэтому нехочу...
Железа уже и так немало получается (я имею непреодолимое желание собрать эту видяху сначала на мелкой логике) - одних только 8-битных буферов я насчитал 32 штуки...
куда столько? как подключены?
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

MC68k wrote:
Shaos wrote:
Shaos wrote:Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?...

P.S. Вариант 320x200 с RGB565 тоже влезает, однако для его поддержки надо больше железа (цапы надо будет переподключать иначе) - поэтому нехочу...
Железа уже и так немало получается (я имею непреодолимое желание собрать эту видяху сначала на мелкой логике) - одних только 8-битных буферов я насчитал 32 штуки...
куда столько? как подключены?
занимаются внутренними переподключениями - там где в CPLD будут обычные мультиплекосры - просто на мультиплексорах в мелкой логике было бы ещё больше корпусов...

P.S. Например мне надо подвести три канала на одну внутреннюю шину адреса каждой из микросхем памяти и переключаться между ними - в случае буферов это будет 3 корпуса 74xx244 (АП5) на каждые 8 бит (либо 3 корпуса 74xx245/АП6 подключенных только в одну сторону), а если мы возьмём мультиплексоры 74xx257 (КП11), то это уже будет 4 корпуса на каждые 8 бит (т.к. они 4-битные и для мультиплексирования трёх каналов нужно иметь 2 слоя двойных мультиплексоров).
Last edited by Shaos on 28 May 2013 21:39, edited 3 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Интересный момент обнаружился - разрешение 640x350 очень близко к соотношению сторон 16:9 (при условии квадратных пикселов) :o

P.S. Это я к тому, что мониторов 4:3 сейчас почти нету - большинство widescreen...
Я тут за главного - если что шлите мыло на me собака shaos точка net