С Новым Годом всех дзенствующих! Мужики, дошло до смешного! 3 года назад писал игрушку под ДОС с использованием прямого отображения в видеопамять в 16-ти цветном режиме. И она прекрасно работала. Тогда ни саму ее, ни исходник не сохранил, думал не понадобится. А сейчас пытаюсь вспомнить этот метод и не могу! То есть с самим выводом проблем нету, проблема с очисткой экрана. Цвета можно менять как угодно, но очистить экран простым обнулением кода цвета невозможно. И ни какую другую комбинацию тоже не нашел. Привожу простой пример ниже: рисую линию и после нажатия на любую клавишу меняю цвет. Кто ни будь сможет подсказать как его обнулить? Код (Text): .model small .stack 100h .386 .data buf dw 0 masc dw 0 color db 0 caunt db 0 close dw 0ffffh time dw 300 .code start: mov ax,@data mov ds,ax xor ax,ax mov ax,0A000h mov es,ax mov ax,4f02h mov bx,12h int 10h MOV DX,3CEH ;указываем на регистр адреса MOV AL,5 ;инедксируем регистр 5 OUT DX,AL ;посылаем индекс INC DX ;указываем на регистр режима MOV AL,0 ;выбираем режим записи 0 OUT DX,AL ;устанавливаем режим mov buf,2500 mov masc,0ffffh mov color,4 mov caunt,30 m1: call screen call delay inc buf dec caunt cmp caunt,0 jne m1 mov ah,8 int 21h mov buf,2500 mov color,0 mov caunt,30 m2: call screen call delay inc buf dec caunt cmp caunt,0 jne m2 mov ah,8 int 21h en: mov ax,4C00h int 21h Screen proc near MOV BX,buf ;указываем на байт буфера MOV DX,3CEH ;указываем на адресный регистр MOV AL,8 ;номер регистра OUT DX,AL ;посылаем его INC DX ;указываем на регистр данных MOV AX,masc ;маска OUT DX,AX ;посылаем данные MOV AX,ES:[BX] ;читаем содержимое в задвижку MOV AX,0 ;готовимся к очистке MOV ES:[BX],AX ;чистим задвижку MOV DX,3C4H ;указываем на адресный регистр MOV AL,2 ;индекс регистра маски карты OUT DX,AL ;установка адреса INC DX ;указываем на регистр данных MOV AL,color ;код цвета OUT DX,AL ;посылаем код цвета MOV AX,close ;любое значение с установленным 7 битом MOV ES:[BX],AX ;выводим точку RET screen endp delay proc near push cx mov cx,time ext: push cx mov cx,5000 iter: loop iter pop cx loop ext pop cx ret delay endp end start
очистить экран можно повторной установкой видеорежима посредством int 10h (указав флаг "очистить видеопамять")
Та не, ему нужно именно линию. Я нашел в книжке как, но сам сейчас пытаюсь разобратся как. Так давно это было... Что нашел: "...в регистр маски цвета заносится 0Fh, в регистр маски битов заносится 0FFh, и позаданому адресу выводится число 0 (отсутствие цвета)..."
пробуй без прерываний писать прямо в видеопамять 0B800h:0000h помниццо, на лабах мы так и делали. подробности спроси у гугля
DISS Так уже пробовал -- не выходит, и к тому же как по заданному адресу вывести 0, если код цвета 0Fh?
Да, товарищ. Видеорежим графический для начала поставить неплохо бы, при старте система в текстовом находится. В зависимости от режима и разная организация видеопамяти будет. В 16-ти и менее цветных - битовые плоскости, в более цветных-последовательное представление точек в видеопамяти. Хорошо программирование это описано в такой классике, как IO.PRT, Richard Wilton и других документациях по EGA/VGA.
Если режим 320x200x256( 13h ) то пиши в линейный массив по адресу A000h:0000h. Код (Text): void SetMode(byte Mode) { asm { xor ah, ah mov al, [Mode] int 0x10 } } void Clear(word Dest, byte Color) { asm { mov cx, 16000 mov es, [Dest] xor di, di mov al, [Color] mov ah, al mov dx, ax db 0x66, 0xC1, 0xE0, 0x10 mov ax, dx db 0xF3, 0x66, 0xAB } } void PutPixel(word D, word X, word Y, byte Color) { asm { cmp X, 0 jl bad cmp Y, 0 jl bad mov ax, X cmp ax, MaxX jg bad mov ax, Y cmp ax, MaxY jg bad mov es, [D] mov ax, [Y] shl ax, 6 mov di, [X] add di, ax shl ax, 2 add di, ax mov al, [Color] mov es:[di], al } bad: } void Line(word D, int X1, int Y1, int X2, int Y2, byte Color) { SX = X2-X1; SY = Y2-Y1; DX1 = Sign(SX); DY1 = Sign(SY); M = Abs(SX); N = Abs(SY); DX2 = DX1; DY2 = 0; if (M<N) { M = Abs (SY); N = Abs (SX); DX2 = 0; DY2 = DY1; } X = X1; Y = Y1; K = 0; P = 0; for (int Cnt=M; Cnt>=0; Cnt--) { if ( ((Pattern >> (15-P)) & 1) == 1 ) if (X>=0 && Y>=0 && X<=MaxX && Y<=MaxY) asm { mov es, [D] mov ax, [Y] shl ax, 6 mov di, [X] add di, ax shl ax, 2 add di, ax mov al, [Color] mov es:[di], al } P = ++P & 0xf; K+=N; if (K<M) { X+=DX2; Y+=DY2; } else { K-=M; X+=DX1; Y+=DY1; } } } Кусок моей давнишней програмки. Если есть вопросы - спрашивай. P.S. Извиняюсь за ужасную реализацию вывода линии.
Не дезинформируйте, товарищ. Видеопамять графическая на EGA\VGA с сегмента A000 начинается. На CGA - с B800.
Vov4ick Могу скинуть готовую прогу по работе ИМЕННО в A000:0000. Я в свое время сделал простой 3D растеризатор под real-mode, так что разбераюсь в этом вопросе. В режиме VGA 320x200 с 256 цветами для отображения видеопамяти на основное адресное пространство используется 64 000 байт, располагающихся с адреса A000h:0000h.
Xerx to Vov4ick: "Видеопамять начинается с A000:0000h!" Vov4ick to Xerx: "Издеваешься?!!! Это ж бред! Она всю жизнь начиналась с A000:0000h!" Xerx to Vov4ick: "Я знаю, о чем говорю! Это в режиме VGA именно так!" Vov4ick to Xerx: "Белиберда. Это как раз именно в VGA так. А в CGA c B800h:0000h! Может хватит чепуху нести?"
Глупый разговор получается. Выложил программу с исходниками и рабочим EXE'шником. Моя лаба за 2 курс. В ней все достаточно понятно. К сожалению, только ее сейчас могу выложить - новее сейчас под рукой нет. P.S. A000:0000 - графический режим (320x200x256) B800:0000 - текстовый режим (80x25x16)
Уважаемые мэтры дзена, хватит ломать копья по поводу видеорежима. Чтобы проверить, кто из Вас или точнее из нас прав, достаточно откомпилировать мой код, приведенный выше. К стати сделав это Вы сможете заметить ещё одну странность. После нажатия на клавишу первые два байта меняются не так как остальные. В случае обнуления они все таки обнуляются, в случае же другого цвета меняют цвет на отличный от остальных. Может в этом кроется разгадка?
Xerx Благодарю за доскональное обьяснение, но к сожалению я не силен в "Си-шной" терминологии. По этому видимо не уловил суть твоего метода. Не мог бы представить все это в чисто ASMовском виде?
neyro Просто я выложил, что было под рукой. Вот другой вариант - уже на ассемблере для TASM. Надеюсь, поможет.
Xerx Благодарю за помощь! Я вижу ты так же богат на хорощие исходники, как и древнеперсидский Ксеркс на алмазы и наложниц(не сочти за оскорбление). Помнится ты говорил, что можешь помочь с самодельной графикой в Win API(в другой теме), но я не работаю с Аськой, можешь дать мыл?