Важная информация
Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 33

Тема: SVGA на QBASIC

  1. #1  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Давайте здесь обсуждать работу в c SVGA на QBASIC. Предлагаю начать с VGA режима 320х200x256, потом плавно доработать его до 640x480x256.
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    А зачем начинать делать VGA 320x200x256 если он уже в Qb присутствует? Вы хотите ускорить путем прямого копирование в видеопамять (он по ходу в Qb через BIOS реализован).
    Дружба-магия-радость!
    Ответить с цитированием  
     

  3. #3  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Вполне возможно, что и через BIOS. Я хочу потренироваться на этом простом режиме применять ассемблер в QBASIC. До 640х480х256 думаю не сложно будет доработать. Простейшую программу:
    Код :
    ret
    уже запустить получилось.
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Что же, удачи тогда. Потом поделитесь наработками, интересно посмотреть. Возможно и сам даже этим займусь, может чего и выйдет...
    Дружба-магия-радость!
    Ответить с цитированием  
     

  5. #5  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    320х200 думаю через пару часиков закончу, там все просто. :) Закину в эту тему исходничек. Нам главное точку научиться рисовать, остальные функции можно и на QB написать, не думаю, что будет сильная потеря производительности.
    Ответить с цитированием  
     

  6. #6  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Почти закончил с выводом точки на QBASIC через ASM. В примере на экран выводится 256000 пикселов напрямую в видеопамять и через стандартный PSET. В первом случае DosBox показал 11 секунд во втором 37. Тест не совсем честный, т.к. при использовании PSET дополнительно проводится деление, но не думаю, что оно отнимает сильно много ресурсов.

    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ]
     
    'Video Mode
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H55)                           'push bp
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&HEC)              'mov bp,sp
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H50)                           'push ax
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H53)                           'push bx
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5E) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H6)  'mov bx,[bp+06]
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H7)               'mov ax,[bx]
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&HB4) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H0)               'mov ah,0
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&HCD) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H10)              'int 10
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5B)                           'pop bx
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H58)                           'pop ax
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5D)                           'pop bp
    AsmScreen$ = AsmScreen$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&HCA) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H2) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H0)   'ret 02
     
    'Pixel
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H55)                           'push bp
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&HEC)              'mov bp,sp
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H6)                            'push es
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H50)                           'push ax
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H53)                           'push bx
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&HB8) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H0) + [Ссылки могут видеть только зарегистрированные пользователи. ](&HA0)  'mov ax,A000
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8E) + [Ссылки могут видеть только зарегистрированные пользователи. ](&HC0)              'mov es,ax
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5E) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H6)  'mov bx,[bp+06]
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H7)               'mov ax,[bx]
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5E) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8)  'mov bx,[bp+08]
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H8B) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H1F)              'mov bx,[bx]
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H26)                           'es:
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H88) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H7)               'mov [bx],al
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5B)                           'pop bx
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H58)                           'pop ax
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H7)                            'pop es
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&H5D)                           'pop bp
    AsmPset$ = AsmPset$ + [Ссылки могут видеть только зарегистрированные пользователи. ](&HCA) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H4) + [Ссылки могут видеть только зарегистрированные пользователи. ](&H0)   'ret 04
     
    ScreenMode% = &H13
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] = [Ссылки могут видеть только зарегистрированные пользователи. ](AsmScreen$)
    CALL [Ссылки могут видеть только зарегистрированные пользователи. ](ScreenMode%, [Ссылки могут видеть только зарегистрированные пользователи. ](AsmScreen$))
     
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] = [Ссылки могут видеть только зарегистрированные пользователи. ](AsmPset$)
    PixelColor% = 0
    FOR Offset% = 0 TO 25600
      PixelColor% = Offset% / 100
      CALL [Ссылки могут видеть только зарегистрированные пользователи. ](Offset%, PixelColor%, [Ссылки могут видеть только зарегистрированные пользователи. ](AsmPset$))
    NEXT Offset%
    [Ссылки могут видеть только зарегистрированные пользователи. ] K$
     
    [Ссылки могут видеть только зарегистрированные пользователи. ] 13
    FOR Offset% = 1 TO 25600 - 1
      PixelColor% = [Ссылки могут видеть только зарегистрированные пользователи. ](Offset% / 100)
      [Ссылки могут видеть только зарегистрированные пользователи. ] (Offset% [Ссылки могут видеть только зарегистрированные пользователи. ] 320, [Ссылки могут видеть только зарегистрированные пользователи. ](Offset% / 320)), PixelColor%
    NEXT Offset%
    Ответить с цитированием  
     

  7. #7  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Начал эксперементы над VESA режимами, переключается нормально, точки на кусок экрана выводятся без проблем, скорость субъективно не меньше, чем при 320x200. :) Теперь нужно разобраться, как работать с участками экрана, которые не влезают в видеопамять.
    Ответить с цитированием  
     

  8. #8  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    В целом это не сложно, когда используется специальный буфер. Узнается гранулярность окна (т.е участка, его размер), и исходя из этого буфер, с отрисованными в нем данными один раз переносится в видеопамять, естественно, с переключениями этого самого участка, который я называю окном. Если же рисовать поточечно и непосредственно в видеопамять, то для каждой точки в идеале необходимо вычислить, в каком из участков ее необходимо посадить. Что будет крайне медленно.
    Есть кстати по этой теме достаточное кол-во литературы, применительно к ассемблеру, например можно почитать
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    И, кстати, не стоит забывать, что в разных видеоплатах разные режимы могут иметь разные номера (как правило так оно и выходит), поэтому приведенная там таблица скорее всего не будет достоверной. Тут надо с помощью функции 4F01h проверять каждый из режимов, пока не найдется тот, с нужными нам параметрами...
    Дружба-магия-радость!
    Ответить с цитированием  
     

  9. #9  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Я примерно так и хотел сделать. А почему вычисления должны занять много времени, особенно на асме?

    По поводу совместимости думаю стоит ориентироваться на стандарт VESA. Видеокарт не совместимых с ним крайне мало. Вот список видеорежимов, которые поддерживаются даже в VESA 1.0:
    100h 640x400x256
    101h 640x480x256
    102h 800x600x16
    103h 800x600x256
    104h 1024x768x16
    105h 1024x768x256
    106h 1280x1024x16
    107h 1280x1024x256
    Кстати 640х400 оказался вполне стандартным видеорежимом. :)
    Ответить с цитированием  
     

  10. #10  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Вычисления для одной точки много времени не займет. Однако если производить их для каждой точки, тогда будет медленно... Ну, как бы то ни было, решаете вы, как это должно быть реализовано, я могу лишь только посоветовать, и то не факт, что это будет истина ;). Если что либо получиться, выложите в этой темке, ок? Интересно посмотреть.
    А по поводу режимов, то что они VESA 1.0 - это конечно замечательно, однако лишний раз перестраховаться никогда не повредит. Стандарт то VESA конечно был, но не все ему следовали. Например, моя видеоплата GeForce 3 Ti 200 имела всю таблицу начиная с VBE 1.2 абсолютной другой, нежели приводилось в списке. Может, кто-то и решил пожостче пошутить ;).
    Дружба-магия-радость!
    Ответить с цитированием  
     

Страница 1 из 4 123 ... ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

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

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