Вообщем-то я этот код и использовал. У меня он выглядит так - был притянут за уши к принципу формирования цвета Вектора и 16 разрядам цвета Динги. Цветам других эмуляторов соответствует, все вроде работает. Можно оптимизировать, но это сейчас неважно.
Code:
// Calculates color value from palette port
word COL(byte color)
{
byte BLACK = 0;
byte RED = 0x07;
byte GREEN = 0x38;
byte BLUE = 0xC0;
byte Result = BLACK;
byte port = PPI[0].Rout[1];
if ((port & 0x40) != 0) Result ^= BLUE;
if ((port & 0x20) != 0) Result ^= GREEN;
if ((port & 0x10) != 0) Result ^= RED;
switch (color)
{
case 0:
if ((port & 0x08) == 0) Result ^= RED;
if ((port & 0x04) == 0) Result ^= BLUE;
break;
case 1:
Result ^= BLUE;
if ((port & 0x01) == 0) Result ^= RED;
break;
case 2:
Result ^= GREEN;
break;
case 3:
Result ^= RED;
if ((port & 0x02) == 0) Result ^= GREEN;
break;
}
return ((Result & 0x07) << 13) | ((Result & 0x38) << 5) | ((Result & 0xC0) >> 3);
}
Вопрос в другом... Вообщем-то реализация понятна. Но меня больше интересовал несколько другой аспект. Ну вот дают программисту "Львов ПК-01", ставят задачу написать софт. И сообщают, дескать, есть некий порт, куда записываешь некий байт и получаешь некую палитру. Но какой байт писать? Что его биты означают? Как палитра формируется? Какие цвета ты получишь? Ответов нет. Разработчики компьютера о чем-то же думали, когда это реализовывали, значит должен быть какой-то замысел.
Обычно программисту не предлагается заглядывать в схему и в исходники эмуляторов, а имеется какое-то внятное описание. А здесь его не дают. В описании бейсика есть команда COLOR и таблица, где можно выбрать 7 палитр, но ведь некоторые же в кодах пишут - им как быть? Вот как получена симпатичная палитра в игре Арктика
http://lvovpc.ho.ua/games/page.php?name=arctic ? Неужели тупым перебором? В бейсике это палитра №5, но что записать в порт, чтобы ее получить, когда ты программируешь в кодах? Выходит каждый программист решал эту задачу сам для себя. Кто-то решал, а кто-то нет. И возможно поэтому львиная доля игр, что я видел, так и остались в этих жутких кислотных RGB-шных тонах, потому что на палитры просто "забивали" и оставляли все "по-умолчанию".
Ну це таке... Эмулятор и так работает. Но просто интересно...
P.S. Вот у Вектора все было четко - есть палитра, есть соответствие физических и математических цветов, вес каждого цвета в байте и все понятно со слов.