Доступ к видеопамяти через int 10h

Тема в разделе "WASM.BEGINNERS", создана пользователем Everything, 28 мар 2009.

  1. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Поэтому нужно работать с видеопамятью напрямую.

    Ну вот помещаю в ES сегмент видеопамяти, и устанавливаю режим 13h: 320x200x256:
    Код (Text):
    1. org 100h
    2.  
    3. push 0a000h
    4. pop es
    5.  
    6. mov ah, 00h
    7. mov al, 13h
    8. int 10h
    А что дальше? Как изменять значения ячеек? И формат какой у них, номер;цвет ?

    => Пишу на FASM
     
  2. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    http://democoder.ru/article/221

    Тоже недавно страдал фигней на досуге: xD
    Код (Text):
    1. org 100h
    2.  
    3. push 0x0A000
    4. pop es
    5. mov al,13h
    6. int 10h
    7. stosw
    8.  
    9. mov cx,320
    10. hz:
    11.     push cx
    12.     mov cx,240
    13.     vr:
    14.         rdtsc
    15.         mov bp,ax
    16.         stosb
    17.     loop vr
    18.     pop cx
    19. loop hz
    20.  
    21. mov ah,1h
    22. int 21h
    23. ret
     
  3. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Аха... Значит дело в stosb..
    Я проста не знаю еще этих команд, пошел гуглить )
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Everything
    Просто Mov в режиме 13h: 320x200x256: каждый байт это индекс цвета из палитры.
    stosb используют для оптимизации по размеру чтобы уместиться в 256 Байт или 4КБайта.

    Для того чтобы поставить точку нужно вычеслить ее адресс.
    База+(y*Ширина+x)*Число_байт_в_пикселе
    Для оптимизации по скорости от умножения избавляются через сумирование.
     
  5. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Вот еще док:
    http://www.faqs.org/faqs/assembly-language/x86/general/part1/section-12.html

    Прочитал про эту инструкцию, вроде понятно, рисую где хочу ))

    SmanxX1, а нафиг нужен первый stosw ? он же ничего не дает?
     
  6. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    Вот и почитай, что написано по той ссылке которую ты привел, а потом внимательно прочитай здесь: http://democoder.ru/article/221
     
  7. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Ну видел. Это шоб обнулить DI, но зачем, если у тебя тут BP:
    Код (Text):
    1.  mov bp,ax
    2.         stosb
    Почему тут BP ?
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Everything

    Дело не в STOS/MOVS и т.д., хотя изучить эти команды, конечно, надо: иногда они очень упрощают жизнь. Но просто для вывода информации на экран достаточно знать, где расположена видеопамять и в каком формате там хранятся данные. Ну а эти вещи зависят от режима работы видеоадаптера. Под ДОСом видеопамять графического режима начинается с адреса A0000, ну а формат хранимой информации зависит, понятное дело, от установленного режима.
     
  9. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Чуваки, еще вопрос возник! Разобрался, я со stosb и т.д.

    Вот код для реального режима:
    Код (Text):
    1. use16
    2. org 100h
    3.  
    4. mov ax, 13h
    5. int 10h
    6.  
    7. push 0a000h
    8. pop es
    9.  
    10. mov di, 32160
    11. mov al, 0dh
    12. stosb
    13.  
    14. mov ah, 00h
    15. int 16h
    16.  
    17. int 20h
    Хочу сделать тоже, но для защищенного режима.

    Т.к. значение, которое в es кладем равно 0a000h, то в защищенном оно будет равно 0a0000h (смещение на 4). Но почему этот код не пашет?

    Код (Text):
    1. use32
    2. org 100h
    3.  
    4. mov ax, 13h
    5. int 10h
    6.  
    7. mov ebx, 32160
    8. add ebx, 0a0000h
    9. mov al, 0dh
    10. mov byte [ebx], al
    11.  
    12. mov ah, 00h
    13. int 16h
    14.  
    15. int 20h
    Просто черный экран консоли выходит... Хелп какбэ
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    во первых use 32 это еще не защищённый режим :)) это только код для защищённого режима в который ещё переходить нужно, а во вторых, когда реально перейдёшь bios сервисы перестанут работать :)) короче кури мануалы
     
  11. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Everything
    Рановато тебе лезть в эти дебри.
     
  12. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    А почему тогда в Watcom C++ все пашет? И режим там реальный ..
     
  13. Everything

    Everything New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    22
    Я имею ввиду вставки asm
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Everything
    Watcom C++ использует расширение защищенного режима. Библиотека которая выполяет ряд функций как то перехват прерываний. После чего выполняет переключения в реальный режим выполняет нужное прерывание и возрвращается в защищенный режим.

    А вообще в Watcom C++ можно разные способы компиляции выбрать.