Проблема с выводом в видеопамять.

Тема в разделе "WASM.BEGINNERS", создана пользователем neyro, 3 янв 2008.

  1. neyro

    neyro New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2007
    Сообщения:
    18
    С Новым Годом всех дзенствующих!
    Мужики, дошло до смешного! 3 года назад писал игрушку под ДОС с использованием
    прямого отображения в видеопамять в 16-ти цветном режиме. И она прекрасно
    работала. Тогда ни саму ее, ни исходник не сохранил, думал не понадобится.
    А сейчас пытаюсь вспомнить этот метод и не могу! То есть с самим выводом
    проблем нету, проблема с очисткой экрана. Цвета можно менять как угодно,
    но очистить экран простым обнулением кода цвета невозможно. И ни какую
    другую комбинацию тоже не нашел. Привожу простой пример ниже: рисую
    линию и после нажатия на любую клавишу меняю цвет. Кто ни будь сможет
    подсказать как его обнулить?

    Код (Text):
    1. .model  small
    2. .stack  100h
    3. .386
    4. .data
    5. buf dw 0
    6. masc dw 0
    7. color db 0
    8. caunt db 0
    9. close dw 0ffffh
    10. time dw 300
    11. .code
    12. start:
    13. mov ax,@data
    14. mov ds,ax
    15. xor ax,ax
    16. mov ax,0A000h
    17. mov es,ax
    18. mov ax,4f02h
    19. mov bx,12h
    20. int 10h
    21. MOV  DX,3CEH    ;указываем на регистр адреса
    22. MOV  AL,5       ;инедксируем регистр 5
    23. OUT  DX,AL      ;посылаем индекс
    24. INC  DX         ;указываем на регистр режима
    25. MOV  AL,0       ;выбираем режим записи 0
    26. OUT  DX,AL      ;устанавливаем режим
    27. mov buf,2500
    28. mov masc,0ffffh
    29. mov color,4
    30. mov caunt,30
    31. m1:
    32. call screen
    33. call delay
    34. inc buf
    35. dec caunt
    36. cmp caunt,0
    37. jne m1
    38. mov ah,8
    39. int 21h
    40. mov buf,2500
    41. mov color,0
    42. mov caunt,30
    43. m2:
    44. call screen
    45. call delay
    46. inc buf
    47. dec caunt
    48. cmp caunt,0
    49. jne m2
    50. mov ah,8
    51. int 21h
    52. en:
    53. mov ax,4C00h
    54. int 21h
    55.    Screen proc near
    56.    MOV  BX,buf         ;указываем на байт буфера
    57.    MOV  DX,3CEH        ;указываем на адресный регистр
    58.    MOV  AL,8           ;номер регистра
    59.    OUT  DX,AL          ;посылаем его
    60.    INC  DX             ;указываем на регистр данных
    61.    MOV  AX,masc        ;маска
    62.    OUT  DX,AX          ;посылаем данные
    63.    MOV  AX,ES:[BX]     ;читаем содержимое в задвижку
    64.    MOV  AX,0           ;готовимся к очистке
    65.    MOV  ES:[BX],AX     ;чистим задвижку
    66.    MOV  DX,3C4H        ;указываем на адресный регистр
    67.    MOV  AL,2           ;индекс регистра маски карты
    68.    OUT  DX,AL          ;установка адреса
    69.    INC  DX             ;указываем на регистр данных
    70.    MOV  AL,color       ;код цвета
    71.    OUT  DX,AL          ;посылаем код цвета
    72.    MOV  AX,close        ;любое значение с установленным 7 битом
    73.    MOV  ES:[BX],AX     ;выводим точку
    74.    RET
    75.    screen endp
    76. delay proc near
    77. push cx
    78. mov cx,time
    79. ext:
    80. push cx
    81. mov cx,5000
    82. iter:
    83. loop iter
    84. pop cx
    85. loop ext
    86. pop cx
    87. ret
    88. delay endp
    89.  
    90. end start
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    очистить экран можно повторной установкой видеорежима посредством int 10h
    (указав флаг "очистить видеопамять")
     
  3. DiSS

    DiSS Андрей

    Публикаций:
    0
    Регистрация:
    30 дек 2007
    Сообщения:
    23
    Адрес:
    Харьков
    Та не, ему нужно именно линию. Я нашел в книжке как, но сам сейчас пытаюсь разобратся как. Так давно это было...

    Что нашел:
    "...в регистр маски цвета заносится 0Fh, в регистр маски битов заносится 0FFh, и позаданому адресу выводится число 0 (отсутствие цвета)..."
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    пробуй без прерываний писать прямо в видеопамять 0B800h:0000h

    помниццо, на лабах мы так и делали. подробности спроси у гугля
     
  5. neyro

    neyro New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2007
    Сообщения:
    18
    DISS
    Так уже пробовал -- не выходит, и к тому же как по заданному адресу вывести 0,
    если код цвета 0Fh?
     
  6. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Да, товарищ. Видеорежим графический для начала поставить неплохо бы, при старте система в текстовом находится. В зависимости от режима и разная организация видеопамяти будет. В 16-ти и менее цветных - битовые плоскости, в более цветных-последовательное представление точек в видеопамяти. Хорошо программирование это описано в такой классике, как IO.PRT, Richard Wilton и других документациях по EGA/VGA.
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Если режим 320x200x256( 13h ) то пиши в линейный массив по адресу A000h:0000h.
    Код (Text):
    1.  void SetMode(byte Mode) {
    2.   asm {
    3.    xor ah, ah
    4.    mov al, [Mode]
    5.    int 0x10
    6.   }
    7.  }
    8.  
    9.  void Clear(word Dest, byte Color) {
    10.   asm {
    11.    mov cx, 16000
    12.    mov es, [Dest]
    13.    xor di, di
    14.    mov al, [Color]
    15.    mov ah, al
    16.    mov dx, ax
    17.    db 0x66, 0xC1, 0xE0, 0x10
    18.    mov ax, dx
    19.    db 0xF3, 0x66, 0xAB
    20.   }
    21.  }
    22.  
    23.  void PutPixel(word D, word X, word Y, byte Color) {
    24.   asm {
    25.    cmp X, 0
    26.    jl bad
    27.  
    28.    cmp Y, 0
    29.    jl bad
    30.  
    31.    mov ax, X
    32.    cmp ax, MaxX
    33.    jg bad
    34.  
    35.    mov ax, Y
    36.    cmp ax, MaxY
    37.    jg bad
    38.  
    39.     mov es, [D]
    40.     mov ax, [Y]
    41.     shl ax, 6
    42.     mov di, [X]
    43.     add di, ax
    44.     shl ax, 2
    45.     add di, ax
    46.     mov al, [Color]
    47.     mov es:[di], al
    48.   }
    49.   bad:
    50.  }
    51.  
    52. void Line(word D, int X1, int Y1, int X2, int Y2, byte Color) {
    53.   SX = X2-X1;
    54.   SY = Y2-Y1;
    55.   DX1 = Sign(SX);
    56.   DY1 = Sign(SY);
    57.   M = Abs(SX);
    58.   N = Abs(SY);
    59.   DX2 = DX1;
    60.   DY2 = 0;
    61.   if (M<N) {
    62.    M = Abs (SY);
    63.    N = Abs (SX);
    64.    DX2 = 0;
    65.    DY2 = DY1;
    66.   }
    67.   X = X1;
    68.   Y = Y1;
    69.   K = 0;
    70.   P = 0;
    71.   for (int Cnt=M; Cnt>=0; Cnt--) {
    72.    if ( ((Pattern >> (15-P)) & 1) == 1 )
    73.     if (X>=0 && Y>=0 && X<=MaxX && Y<=MaxY)
    74.      asm {
    75.       mov es, [D]
    76.       mov ax, [Y]
    77.       shl ax, 6
    78.       mov di, [X]
    79.       add di, ax
    80.       shl ax, 2
    81.       add di, ax
    82.       mov al, [Color]
    83.       mov es:[di], al
    84.      }
    85.    P = ++P & 0xf;
    86.    K+=N;
    87.    if (K<M) {
    88.     X+=DX2;
    89.     Y+=DY2;
    90.    } else {
    91.     K-=M;
    92.     X+=DX1;
    93.     Y+=DY1;
    94.    }
    95.   }
    96.  }
    Кусок моей давнишней програмки. Если есть вопросы - спрашивай.

    P.S. Извиняюсь за ужасную реализацию вывода линии.
     
  8. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Не дезинформируйте, товарищ. Видеопамять графическая на EGA\VGA с сегмента A000 начинается. На CGA - с B800.
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Vov4ick
    Могу скинуть готовую прогу по работе ИМЕННО в A000:0000. Я в свое время сделал простой 3D растеризатор под real-mode, так что разбераюсь в этом вопросе.

    В режиме VGA 320x200 с 256 цветами для отображения видеопамяти на основное адресное пространство используется 64 000 байт, располагающихся с адреса A000h:0000h.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Xerx to Vov4ick: "Видеопамять начинается с A000:0000h!"
    Vov4ick to Xerx: "Издеваешься?!!! Это ж бред! Она всю жизнь начиналась с A000:0000h!"
    Xerx to Vov4ick: "Я знаю, о чем говорю! Это в режиме VGA именно так!"
    Vov4ick to Xerx: "Белиберда. Это как раз именно в VGA так. А в CGA c B800h:0000h! Может хватит чепуху нести?"
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Глупый разговор получается. Выложил программу с исходниками и рабочим EXE'шником. Моя лаба за 2 курс. В ней все достаточно понятно. К сожалению, только ее сейчас могу выложить - новее сейчас под рукой нет.

    P.S.
    A000:0000 - графический режим (320x200x256)
    B800:0000 - текстовый режим (80x25x16)
     
  12. neyro

    neyro New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2007
    Сообщения:
    18
    Уважаемые мэтры дзена, хватит ломать копья по поводу видеорежима. Чтобы проверить,
    кто из Вас или точнее из нас прав, достаточно откомпилировать мой код, приведенный
    выше. К стати сделав это Вы сможете заметить ещё одну странность. После нажатия
    на клавишу первые два байта меняются не так как остальные. В случае обнуления
    они все таки обнуляются, в случае же другого цвета меняют цвет на отличный от
    остальных. Может в этом кроется разгадка?
     
  13. neyro

    neyro New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2007
    Сообщения:
    18
    Xerx
    Благодарю за доскональное обьяснение, но к сожалению я не силен в "Си-шной"
    терминологии. По этому видимо не уловил суть твоего метода. Не мог бы представить
    все это в чисто ASMовском виде?
     
  14. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    neyro
    Просто я выложил, что было под рукой.
    Вот другой вариант - уже на ассемблере для TASM.

    Надеюсь, поможет.
     
  15. neyro

    neyro New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2007
    Сообщения:
    18
    Xerx
    Благодарю за помощь!
    Я вижу ты так же богат на хорощие исходники, как и древнеперсидский Ксеркс
    на алмазы и наложниц(не сочти за оскорбление). Помнится ты говорил, что
    можешь помочь с самодельной графикой в Win API(в другой теме), но я не
    работаю с Аськой, можешь дать мыл?
     
  16. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    neyro
    Ну пасиба ) Отправил мыло в личку. Плюс оно есть в моем профиле )