User Tag List

Показано с 1 по 10 из 26

Тема: Вопросы по программированию

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    21.02.2011
    Адрес
    Воронеж
    Сообщений
    126
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    43
    Поблагодарили
    16 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В процессе опытов с программированием таблицы LUT наткнулся на следующий нюанс.
    Во всех источниках, которые описывают устройство графического контроллера Корвета, которые я нашёл, говорится только, что LUT - это таблица соответствия логического и физического цветов.
    Младший полубайт - логический цвет, старший полубайт - физический.
    Т.е. если туда записать байт 11h, то логическому цвету с номером 1 будет соответствовать цвет из плоскости B, т.е. синий.

    Всё бы ничего, но, как оказалось, это правило работает только для логических цветов с номером больше 0.
    По этому правилу байт 10h должен бы превратить цвет с номером 0 в синий, т.е. вместо чёрного, фон должен стать синим, но этого не происходит.
    Вернее происходит, но только в эмуляторах
    На реале чёрный остаётся чёрным, а вот вместо, на пример, белого, появляется какой-то то ли желтоватый, то ли жёлто-зелёный.

    Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
    Т.е. если туда положить значение 80h, то вся палитра сразу потеряет яркостную составляющую. А если туда положить значение F0h, то перестанут отображаться вообще все цвета.
    Видимо, этот трюк сделали, чтобы реализовать возможность мгновенного гашения всего изображения путём переброски всего одного байта.

    Для тестов использовалась следующая программа на Express Pascal:

    program test;
    var i : integer;
    begin
    clrgscr;
    for i := 0 to 7 do begin
    setcolor(i);
    rectangle(64*i,0,64*(i+1),200,true);
    end;
    repeat until keypressed;
    mem[$fafb] := $10;
    end.

    Если её запустить в эмуляторах (проверял в b2m, SovietPC, эмулятор Ерохина), то чёрный фон превращается в синий, на реале поведение совсем другое.
    Если вместо $10 поставить $F0, то на реале всё изображение гаснет.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Willy Посмотреть сообщение
    Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
    Есть такое понятие, как "уровень чёрного". Я думаю, цвет бордюра был принят телевизором/монитором как этот самый уровень, отсюда и понижение яркости всех цветов.

  4. #3

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Willy Посмотреть сообщение
    Оказалось, что ячейка таблицы с номером 0 имеет особенное значение. Она содержит цвета, которые ВЫЧИТАЮТСЯ из всех остальных цветов при формировании изображения.
    Т.е. если туда положить значение 80h, то вся палитра сразу потеряет яркостную составляющую. А если туда положить значение F0h, то перестанут отображаться вообще все цвета.
    Видимо, этот трюк сделали, чтобы реализовать возможность мгновенного гашения всего изображения путём переброски всего одного байта.
    Может я что-то не понял, но получается, что на Корвете можно менять палитры. Получается 16 разных палитр... Но это совсем никак не документировано.

  5. #4

    Регистрация
    21.02.2011
    Адрес
    Воронеж
    Сообщений
    126
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    43
    Поблагодарили
    16 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от litwr Посмотреть сообщение
    Может я что-то не понял, но получается, что на Корвете можно менять палитры. Получается 16 разных палитр... Но это совсем никак не документировано.
    Да нет, это не палитры, это такой side-эффект.

  6. #5

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Willy Посмотреть сообщение
    Да нет, это не палитры, это такой side-эффект.
    Хорошо бы собрать данные с реальных Корветов. Вот программка, которая крупно рисует палитру Корвета с разными значениями LUT 0.
    Код:
    const
       b = 3;  (* block *)
    var
       i,p:byte;
       c:char;
    begin
       clrscr;
       clrgscr;
       for i:=0 to 15 do
          mem[$fafb] := i*17;
       for i:=0 to 31 do
          for p:=0 to 7 do
             mem[$fc20+p*64+i]:=b;
       for i:=0 to 7 do begin
          setcolor(i);
          rectangle(i*32, 0, i*32+31, 127, true);
          rectangle(i*32+256, 0, i*32+287, 127, true)
       end;
       p := 0;
       repeat
          gotoxy(9,9);write('   ');gotoxy(1,9);
          write('black is ', p);
          mem[$fafb] := p*16;
          p := (p+1)and 15;
          c := readkey
       until ord(c) != 27;
       clrscr
    end.
    Вот так это выглядит в emu80 для значений 0 и 7.


    Прикрепил зазипованный СОМ-файл - PALET3.zip
    Похоже, что интересный эффект возник только из-за особенностей подключения к монитору. Но если кто-то обнаружит что-то необычное, то было бы ценно получить скриншоты.

  7. #6

    Регистрация
    21.02.2011
    Адрес
    Воронеж
    Сообщений
    126
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    43
    Поблагодарили
    16 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от litwr Посмотреть сообщение
    Похоже, что интересный эффект возник только из-за особенностей подключения к монитору. Но если кто-то обнаружит что-то необычное, то было бы ценно получить скриншоты.
    Нууу, эмуляторы не в счёт. Проверять надо только на реале, а там много нюансов - способ подключения, тип монитора.
    У меня есть рабочий колокольчик, хоть и чёрно-белый, но некоторые цвета можно и на нём проверить, попробую на выходных.

  8. #7

    Регистрация
    12.05.2018
    Адрес
    с. Телешовка, Киевская обл., Украина
    Сообщений
    33
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    13
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от litwr Посмотреть сообщение
    Хорошо бы собрать данные с реальных Корветов. Вот программка, которая крупно рисует палитру Корвета с разными значениями LUT 0.
    Немного поизвращался над Вашей прогой:

    Скрытый текст

    Код:
    PROGRAM PALET3;
    CONST
      B = 3;  (* BLOCK *)
    VAR
      I,P:BYTE;
      C:CHAR;
    BEGIN
      CLRSCR;
      CLRGSCR;
      WRITE(#27'1');
      FOR I:=0 TO 15 DO
        MEM[$FAFB] := I*17;
        MEM[$FAFB] := $78;
        FOR I:=0 TO 31 DO
          FOR P:=0 TO 7 DO
            MEM[$FC20+P*64+I]:=B;
            FOR I:=0 TO 7 DO BEGIN
              SETCOLOR(I);
              RECTANGLE(I*32, 0, I*32+31, 127, TRUE);
              RECTANGLE(I*32+256, 0, I*32+287, 127, TRUE)
            END;
            WRITE(#27'6');
            FOR I:=1 TO 16 DO WRITE('Test');
            WRITE(#27'7');
            FOR I:=1 TO 16 DO WRITE('Test');
            FOR I:=1 TO 128 DO WRITE(#16#$AE);
            FOR I:=1 TO 128 DO WRITE(#16#$81);
            P :=0;
            REPEAT
              GOTOXY(9,9);WRITE(#27'6   ');GOTOXY(1,9);
              WRITE('BLACK IS ', P);
              GOTOXY(9,10);WRITE(#27'7   ');GOTOXY(1,10);
              WRITE('BLACK IS ', P);
              MEM[$FAFB] := P*16;
              P := (P+1)AND 15;
              C := READKEY
            UNTIL ORD(C) = 27;
            CLRSCR
    END.
    [свернуть]

    PALET3.zip
    Последний раз редактировалось AlexS58; 11.04.2025 в 02:07.

    Этот пользователь поблагодарил AlexS58 за это полезное сообщение:

    litwr(02.05.2025)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 31
    Последнее: 10.09.2022, 14:22
  2. Wiki по программированию
    от moroz1999 в разделе Разный софт
    Ответов: 23
    Последнее: 16.12.2010, 16:31
  3. Наиболее полная дока по программированию GS
    от Evgeny Muchkin в разделе Программирование
    Ответов: 1
    Последнее: 28.03.2007, 14:41
  4. Общедоступная wiki по программированию на Спектруме
    от valker в разделе Программирование
    Ответов: 11
    Последнее: 01.03.2007, 09:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •