nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 21 Nov 2017 18:39



Reply to topic  [ 25 posts ]  Go to page 1, 2  Next
nedoVGA на рассыпухе 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Отпочковано от темы про nedoSprinter:

http://www.nedopc.org/forum/viewtopic.p ... c&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). Видеопамять можно построить так, чтобы её куски были относительно независимыми друг от друга и чтобы процессор тормозился только если он лезет в тот кусок, который в данный момент отрисовывается.

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 03 Jun 2013 21:50, edited 5 times in total.



18 May 2013 14:08
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Планирую взять 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:

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 03 Jun 2013 21:40, edited 1 time in total.



19 May 2013 14:34
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Вот по-быстрому накидал в фотошопе 1-палитра vs 2-палитры в картинке 320x400 (и потом растянул до 640x480). Оригинал:

Image

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

Image

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

Image

_________________
:eugeek: https://twitter.com/Shaos1973


22 May 2013 17:47
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Ещё один пример - оригинал 640x480:

Image

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

Image

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

Image

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

http://www.nedopc.org/nedopc/upload/ZpT ... ig-big.jpg

_________________
:eugeek: https://twitter.com/Shaos1973


22 May 2013 18:03
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Последний пример - оригинал 640x480:

Image

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

Image

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

Image

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

И чем больше разница между верхом и низом (сверху - облака, снизу - земля и т.д.) тем больше будет выигрышь в качестве...

_________________
:eugeek: https://twitter.com/Shaos1973


22 May 2013 18:20
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Всё думал в каком же формате можно такие картинки хранить и наконец меня осенило - хранить их надо в виде ДВУХ GIF-ФАЙЛОВ 320x200 :o
Один GIF для верхней половинки, а второй - для нижней. Скажем NAME_1.GIF и NAME_2.GIF, которые просмотрщик будет открывать как одну картинку...

_________________
:eugeek: https://twitter.com/Shaos1973


22 May 2013 21:35
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Интересно, что в стандартной EGA-шной 16-цветной палитре путём хитрого размещения точек можно получить иллюзию более чем 16 цветов :)

Image

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


А вот так оно же будет выглдяеть в автоматически сгенерированной 256-цветной палитре, когда пара EGA-точек превращается в одну VGA-точку :o

Image

Так можно "размазывать" EGA-шные картинки при просмотре для пущей плавности :)


А вот интересно, можно ли эту палитру затолкать в галку или вообще на резисторах построить? Тогда можно сделать её палитрой по умолчанию для 256-цветных режимов и проц будет в 4 раза быстрее работать, пока программа не начнёт свою палитру использовать через 3 другие микросхемы видеопамяти...

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 03 Jun 2013 21:16, edited 2 times in total.



24 May 2013 22:23
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Для режима 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:
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:
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:
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 раза уменьшать при аналоговом смешении:
Quote:
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 уникальных цветов и похоже удастся построить генератор такой палитры на резисторах и диодах, правда схема коррекции коричневого цвета добавляет хлопот...

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 09 Feb 2014 23:33, edited 4 times in total.



25 May 2013 00:45
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Ещё картинок в вышеописанных режимах. Оригинал взят отсюда - это "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

_________________
:eugeek: https://twitter.com/Shaos1973


25 May 2013 11:52
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?

Image

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

P.P.S. На самом деле имея две страницы 320x200 с независимыми 256-цветными палитрами можно замечательно программно сымитировать многоцветный режим - просто часто переключая эти две страницы по кадровому прерыванию 70 Гц...

_________________
:eugeek: https://twitter.com/Shaos1973


27 May 2013 10:43
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Shaos wrote:
P.P.S. На самом деле имея две страницы 320x200 с независимыми 256-цветными палитрами можно замечательно программно сымитировать многоцветный режим - просто часто переключая эти две страницы по кадровому прерыванию 70 Гц...


И действительно - даже если мерцать палитрой EGA2VGA уже не так страшно выходит (чуть менее 1000 цветов):

Image

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

Image

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

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

Image

_________________
:eugeek: https://twitter.com/Shaos1973


27 May 2013 13:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Shaos wrote:
Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?...

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

Железа уже и так немало получается (я имею непреодолимое желание собрать эту видяху сначала на мелкой логике) - одних только 8-битных буферов я насчитал 32 штуки...

_________________
:eugeek: https://twitter.com/Shaos1973


27 May 2013 20:44
Profile WWW
Retired
User avatar

Joined: 25 Jul 2011 03:14
Posts: 1342
Location: WWW
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Теоретически есть возможность достаточно малыми средствами поддержать ещё и режим 160x200 с полноцветными 24-битными пикселами RGB по 8 бит на цвет - стоит?...

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

Железа уже и так немало получается (я имею непреодолимое желание собрать эту видяху сначала на мелкой логике) - одних только 8-битных буферов я насчитал 32 штуки...
куда столько? как подключены?


28 May 2013 00:31
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
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 слоя двойных мультиплексоров).

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 29 May 2013 00:39, edited 3 times in total.



28 May 2013 10:25
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15717
Location: Colorado
Reply with quote
Post 
Интересный момент обнаружился - разрешение 640x350 очень близко к соотношению сторон 16:9 (при условии квадратных пикселов) :o

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

_________________
:eugeek: https://twitter.com/Shaos1973


28 May 2013 12:01
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 25 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.