Для режима 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 уникальных цветов и похоже удастся построить генератор такой палитры на резисторах и диодах, правда схема коррекции коричневого цвета добавляет хлопот...