Важная информация

User Tag List

Показано с 1 по 5 из 5

Тема: Мыcли о видео-режимах Апогея.

  1. #1
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Мыcли о видео-режимах Апогея.

    Как таковых видеорежимов у Апогея нет. Есть несколько изменяемых параметров видеоадаптера (микросхем КР580ВГ75/i8275 и КР580ВТ57/i8257) и специальные символы обозначающие конец строки и конец кадра. Но в итоге вариантов настройки видеоадаптера очень-очень много. Это всё позволяет реализовать плавную прокрутку, гигаскрин, складывать экран из двух различных областей памяти.

    Если каждое сочетание выделить в видеорежим, то получится несчетное количество вариантов. Но я все таки попробовал выделить основные и написал простую библиотеку под это дело. Я долго искал, что же оставить. Хотелось с одной стороны быть последовательным, а с другой показать наиболее интересные режимы.

    И я начал с самого простого.

    Текстовые режимы 64x25 (совместимые с BIOS)

    apogeyScreen0() Стандартный режим 64x25 символов, шрифт с межстрочным отступом, то есть графика будет распадаться на линии, атрибуты рассматриваются как пробелы.

    apogeyScreen0b() Аналогичен прошлому, но в нем используются скрытые атрибуты. Что бы из за скрытых атрибутов не съезжала графика, конец каждой строки содержит значение EOL. В этом режиме каждая строка имеет запас в 5 байт. То есть допускается 0..5 изменений цвета на строку.

    apogeyScreen1() Аналогичен apogeyScreen0, но отключен межстрочный интервал. Частота кадров увеличилась с ~50Гц до ~60Гц. Этот режим для ленивых людей, которые хотят получить слитную псевдографику.

    apogeyScreen1b() Аналогичен прошлому, но в нем используются скрытые атрибуты и используется EOL. Так же допускается 0..5 изменений цвета на строку.

    Текстовые режимы 64x31 (не совместимые с BIOS)

    Все режимы ниже используют технологию экономии памяти. Изображение генерируемое видеоадаптером Апогея не может целиком отображено на экране монитора или телевизора. Края изображения находятся за краями экрана. Поэтому программисты используют только центральную часть экрана. А остальная видеопамять пропадает.

    Но видеоадаптер позволяет частично сэкономить на невидимых участках. Длина строки может быть сокращена до 1 байта, если в конце строки будет находится символ КОНЕЦ СТРОКИ (EOL). Таким же образом можно сэкономить на правой невидимой части экрана, используя EOL. А вместо нижних строк можно вообще указать символ КОНЕЦ КАДРА (реально он называется СТОП ПДП).

    Но эти режимы не совместимы с BIOS.

    Режим экономии сильно мешает реализовать плавную прокрутку.

    Во всех режимах ниже межстрочный интервал отключен.

    apogeyScreen2a() Режим 64x31 символов. Атрибуты рассматриваются как пробелы. Используется стандартная видеопамять.

    Во всех режимах ниже в качестве видеопамяти используется верхушка основного ОЗУ.

    apogeyScreen2b() Режим 64x31 символов. Используются скрытые атрибуты и EOL. Допускается 0..5 изменений цвета на строку.

    apogeyScreen2с() Режим 64x31 символов. Используются скрытые атрибуты. Строка всегда должна содержать 16 атрибутов. То есть допускается 16 изменений цвета на строку и атрибуты необходимо размещать даже если смена цвета не нужна. Для удобства программирования можно разместить 16 атрибут равномерно по экрану, то есть управлять цветом 4-ок символов.

    16 атрибут на строку - это максимум видеоадаптера, включая символ EOL. Но даже если бы мы использовали 15 атрибут на строку, то разместить EOL было бы все равно не возможно. Строка изображения должна быть 69 видимых символов (с учетом EOL и 8 невидимых символов слева). То есть строка без атрибутов не может быть больше 69 байт. Когда мы добавляем в эту строку 15 атрибутов, то получаем всего 54 видимых символа. То есть справа у нас будет 10 пробелов.

    Поэтому и рождается 2 основных варианта функций B и C. Переменное кол-во атрибутов, максимум атрибутов. Но пользователь может создать свой режим. Как это сделать описано ниже.

    Псевдографические режимы 192x102 (не совместимые с BIOS)

    Во всех режимах ниже используется альтернативный знакогенератор, который позволяет реализовать псевдографический режим 192x102. Букв этот знакогенератор не содержит. Но зато содержит некоторые варианты символов, позволяющих получить псевдографическое разрешение 384x204.

    apogeyScreen3a() Режим 64x51 символов. Атрибуты рассматриваются как пробелы.

    apogeyScreen3b() Режим 64x51 символов. Используется скрытые атрибуты и EOL. Допускается 0..5 изменений цвета на строку.

    apogeyScreen3с() Режим 64x51 символов. Используются скрытые атрибуты. Строка всегда должна содержать 16 атрибутов. То есть допускается 16 изменений цвета на строку и атрибуты необходимо размещать даже если смена цвета не нужна. Для удобства программирования можно разместить 16 атрибут равномерно по экрану, то есть управлять цветом 4-ок символов.

    Собственные режимы

    Все эти режимы закодированы двумя функциями (макросами) с 9-ю параметрами. Пользователь может настроить свой режим:

    Код:
    void apogeyScreen0() {
      // MEM_ADDR, FULL_HEIGHT, HEIGHT, TOP_INVISIBLE, FONT, BPL, FILL_EOL, HIDDEN_ATTRIB, CHAR_GEN
      APOGEY_SCREEN_STD(0xE1D0, 30, 25, 3, 0x99, 78, 0, 0, 0);
    }
    
    ... 
    
    void apogeyScreen2a() {
      // MEM_ADDR, FULL_HEIGHT, HEIGHT, TOP_INVISIBLE, FONT, BPL, FILL_EOL, HIDDEN_ATTRIB, CHAR_GEN
      APOGEY_SCREEN_ECONOMY(0xE1D0, 37, 31, 3, 0x77, 75, 1, 0, 0);
    }
    
    ...
    
    void apogeyScreen3c() {
      // MEM_ADDR, FULL_HEIGHT, HEIGHT, TOP_INVISIBLE, FONT, BPL, FILL_EOL, HIDDEN_ATTRIB, CHAR_GEN
      APOGEY_SCREEN_ECONOMY(0xE0FF - 7*2 - 94*51 - 2, 64, 51, 7, 0x33, 94, 0, 1, 1);
    }
    Сами же функции (точнее макросы) выглядят так:

    Код:
    #define APOGEY_SCREEN_ECONOMY(MEM_ADDR, FULL_HEIGHT, HEIGHT, TOP_INVISIBLE, FONT, BPL, FILL_EOL, HIDDEN_ATTRIB, CHAR_GEN) \
      register uchar *v; \
      uchar i; \
      memset((uchar*)MEM_ADDR, 0, (HEIGHT)*(BPL)+(TOP_INVISIBLE)*2+2); \
      for(v=(uchar*)(MEM_ADDR)-1, i=TOP_INVISIBLE; i; --i) \
        v+=2, *v = 0xF1; \
      if(FILL_EOL) \
        for(i = HEIGHT; i; --i) \
          v += (BPL), *v = 0xF1; \
      ((uchar*)MEM_ADDR)[(HEIGHT)*(BPL)+(TOP_INVISIBLE)*2+1] = 0xFF; \
      apogeyVideoMem = (uchar*)(MEM_ADDR) + (TOP_INVISIBLE)*2 + 8; \
      apogeyVideoBpl = (BPL); \
      APOGEY_SCREEN_END(MEM_ADDR, FULL_HEIGHT, FONT, (HEIGHT)*(BPL)+(TOP_INVISIBLE)*2+2, HIDDEN_ATTRIB, CHAR_GEN);
      
    #define APOGEY_SCREEN_STD(MEM_ADDR, FULL_HEIGHT, HEIGHT, TOP_INVISIBLE, FONT, BPL, FILL_EOL, HIDDEN_ATTRIB, CHAR_GEN) \
      register uchar *v; \
      uchar i; \
      memset((uchar*)(MEM_ADDR), 0, (FULL_HEIGHT)*(BPL)); \
      if(FILL_EOL) { \
        v = (uchar*)(MEM_ADDR)-1; \
        for(i = FULL_HEIGHT; i; --i) \
          { v += apogeyVideoBpl; *v = 0xF1; } \
      } \
      apogeyVideoMem = (uchar*)(MEM_ADDR) + (TOP_INVISIBLE)*(BPL) + 8; \
      apogeyVideoBpl = (BPL); \
      APOGEY_SCREEN_END(MEM_ADDR, FULL_HEIGHT, FONT, (FULL_HEIGHT)*(BPL), HIDDEN_ATTRIB, CHAR_GEN);
      
    #define APOGEY_SCREEN_END(MEM_ADDR, FULL_HEIGHT, FONT, MEM_SIZE, HIDDEN_ATTRIB) \
      VG75[1] = 0; \
      VG75[0] = 78-1; \
      VG75[0] = (FULL_HEIGHT)-1; \
      VG75[0] = (FONT); \
      VG75[0] = (HIDDEN_ATTRIB) ? 0x93 : 0xD3; \
      VT57[8] = 0x80; \
      VT57[4] = (uchar)(MEM_ADDR); \
      VT57[4] = (uchar)((MEM_ADDR)>>8); \
      VT57[5] = (uchar)((MEM_SIZE)-1); \
      VT57[5] = 0x40 | (uchar)(((MEM_SIZE)-1)>>8); \
      VT57[8] = 0xA4; \
      VG75[1] = 0x27; \
      if(CHAR_GEN) asm { ei } else asm { di }
    Макросы тут использованы потому что мой компилятор не поддерживает inline функции. А если это скомпилировать как обычную функцию, то получается в 5 раз больше кода.

    P.S. В этом коде есть неточности, я уже многое поправил.
    Последний раз редактировалось vinxru; 16.12.2012 в 19:04.

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

  3. #2
    Guru Аватар для tnt23
    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,634
    Спасибо Благодарностей отдано 
    391
    Спасибо Благодарностей получено 
    78
    Поблагодарили
    63 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение

    Текстовые режимы 64x25 (совместимые с BIOS)

    apogeyScreen0b() ...
    apogeyScreen0b() ...
    Наверное, в названии первого режима опечатка (лишнее b).

  4. #3
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ага

  5. #4
    Moderator Аватар для Mick
    Регистрация
    14.06.2005
    Адрес
    г. Калуга
    Сообщений
    9,916
    Спасибо Благодарностей отдано 
    178
    Спасибо Благодарностей получено 
    695
    Поблагодарили
    368 сообщений
    Mentioned
    19 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На мой взгляд неудобно выглядит куча функций, которая делает одно и тоже.
    Логичнее обозвать один раз функцию как типа apogeyScreen(unsigned char ucScreenMode) где ucScreenMode - собственно передается номер графического режима. А их описать через define. Так по крайней мере обычно в во всяких API делается.
    Сайт поддержки моих изделий - http://micklab.ru/
    Группа ВКонтакте - https://vk.com/micklab

  6. #5
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Mick Посмотреть сообщение
    На мой взгляд неудобно выглядит куча функций, которая делает одно и тоже.
    Логичнее обозвать один раз функцию как типа apogeyScreen(unsigned char ucScreenMode) где ucScreenMode - собственно передается номер графического режима. А их описать через define. Так по крайней мере обычно в во всяких API делается.
    #define apogeyScreen(N) \
    switch(N) { \
    case 0: apogeyScreen0(); break; \
    }

    Так можно. Причем, с константой на входе это развернется в единственный вызов.

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

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

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

Похожие темы

  1. Ответов: 27
    Последнее: 14.09.2012, 12:35
  2. Продам 2 Апогея + программатор к ним
    от shapipovo в разделе Барахолка (архив)
    Ответов: 7
    Последнее: 11.09.2010, 15:01
  3. Funtop 98 - видео!!
    от newart в разделе События
    Ответов: 32
    Последнее: 28.12.2008, 16:53
  4. Видео с СС1!!
    от newart в разделе События
    Ответов: 26
    Последнее: 14.08.2007, 19:54
  5. Проблемы с видео
    от andreil в разделе Изображение
    Ответов: 15
    Последнее: 21.07.2007, 01:34

Ваши права

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