Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отрисовка символов 
V
    Опции темы
jaAlex
Дата 20.10.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Помогите, пожалуйста, решить такую задачку: нужно в графическом режиме 320x200 256 цветов нарисовать буковку "К" так, что ее высота 100 (50 сверху, 50 снизу), толщина 25, и полукруглые очертания. Желательно с примером. Заранее спасибо всем откликнувшимся.
P.S. Я насколько знаю, делается это прорисовкой по пикселам. Дк каждую линию отдельно прорисовывать чтоли?
PM MAIL   Вверх
makwen
Дата 20.10.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: нет
Всего: 1



код для установки режима 320х200 256 цветов:
Код

mov ah,00h
mov al,013h ; 13h - код требуемого  режима
int 10h


используй функцию 0Ch прерывания INT 10h, которая рисует пиксель.
Пример:
Код

mov ah,0Ch
mov al,03h ; цвет пикселя
mov bh,0 ;номер страницы
mov dx,10 ; вертикальная координата
mov cx,20 ; горизонтальная координата
int 10h

Создавай циклы и прорисовуй свою букву "К"!  smile 
Удачи! 
PM MAIL   Вверх
jaAlex
Дата 20.10.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



А как циклы - то создавать? Вот, к примеру, в твоем втором коде как сделать так, чтобы dx увеличивалась с 50 до 75? И еще такой вопрос: как задать условие типа if...then? Ну, все в том же коде надо так: когда dx=75, то прибавить к cx 1 и чтобы dx опять стала равна 50. Ну и снова цикл пошел, разумеется. Как вот все это, подскажи пожалуйста.
PM MAIL   Вверх
makwen
Дата 20.10.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: нет
Всего: 1



мда... я думаю, что за один пост не смогу описать синтаксис языка Assembler. Так что бери любую книгу по асму, и читай, там все ясно написано! 
Например Питер Абель "Ассемблер. Язык и программирование для IBM PC"
PM MAIL   Вверх
anwe
Дата 20.10.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Даю наводку. Заметь слово пишеться слитно, тот есть не даю на выпивку!  smile 
Для примера - код, выводящий вертикальную составляющую буквы "К"
Код

mov    ax,13h    ;перевод в нужный видеорежим
int    10h
mov    ah,0Ch
mov    dx,50
mov    cx,50
mov    al,100b
int    10h    ;то что писал makwen
mov    bx,49    ;здесь счетчик строк
mov    di,5    ;здесь счетчик колонок
;собственно цикл в цикле: внутренний выводит вертикальную линию
;внешний выводит таких линий 5 штук.
l2:
inc    dx
int    10h
dec    bx
jns    l2    ;это цикл для вывода вертикальной линии
mov    dx,49
inc    cx
mov    bx,50
dec    di
jns    l2
;цикл для выхода из программы по нажатию клавиши
l1:
mov    ah,06h
mov    dl,0FFh
int    21h    ;считать символ
jz    l1    ;если ZF=0 - клавиша нажата - выход
mov    ax,0003h
int    10h
ret

Остальное, таким же способом, додумывай сам.
Можно еще посоветовать, чтобы было легче расчитать букву, сделай сначала ее на бумаге и просчитай координаты граничных точек.
Лучше сначала прорисовать верхнюю линию буквы, потом нижнюю.
Там надо за раз менять и di и bx.

То есть не то хотел сказать. Хотел сказать, что надо отдельно прорисовывать верхнюю линию, потом нижнюю. Так не то, что надо, так просто удобней.

Это сообщение отредактировал(а) anwe - 20.10.2006, 21:27
PM MAIL   Вверх
jaAlex
Дата 20.10.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Код

program K;
begin
asm
  mov  ax,0013h
  int  10h
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,50
  mov  si,0
@@OutLines:
  mov  ax,320
  mul  bx
  add  ax,10
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,100
  jb  @@OutLines
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,50
  mov  si,0
@@OutLines:
  mov  ax,319
  mul  bx
  add  ax,110
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,50
  jb  @@OutLines
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,100
  mov  si,0
@@OutLines:
  mov  ax,321
  mul  bx
  add  ax,-88
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,49
  jb  @@OutLines
end;
asm
  mov  ah,0
  int  16h
end;
asm
  mov  ax,0003h
  int  10h
end;
end.

Вот такая буковка получилась. Но что - то какая - то она некрасивая smile . В чем тут косяк, как бы ее получше здесь вот отрисовать? 
anwe, с твоим кодом не разобрался пока, только напортачил - TP повис, и все...
PM MAIL   Вверх
jaAlex
Дата 20.10.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Код

program TEST;
begin
 asm
 mov ax,$13
 int 10h
end;
asm
 mov ax,$A000
 mov es,ax
 mov al,15
 mov cx,25
 mov bx,16020
 @1:
 mov [es:bx],al
 add bx,1
 loop @1
end;
asm
 xor ah,ah
 int 16h
end;
end.


Вот код программы, которая рисует линию. Я хочу, чтобы таких линий было 100, и чтобы они были друг под другом. Для чего делаю так:

Код

program TEST;
begin
 asm
 mov ax,$13 
 int 10h
end;
asm
 mov ax,$A000
 mov es,ax
 mov al,15
 mov cx,100
 @2:
 mov cx,25
 mov bx,16020
 @1:
 mov [es:bx],al
 add bx,1
 loop @1
 add bx,320
 loop @2
end;
asm
 xor ah,ah
 int 16h
end;
end.


Помоему, все правильно, но программа виснет, и не воспринимает нажатия никаких кнопок с клавиатуры. Цикл в цикле неправильно делаю, чтоли, а может еще чего.  Что тут не так? Почему виснет? Подскажите плз!!! Заранее спасибо всем откликнувшимся.
PM MAIL   Вверх
anwe
Дата 21.10.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Цитата

anwe, с твоим кодом не разобрался пока, только напортачил - TP повис, и все... 

Не знаю, что там можно напортачить. Ну да ладно.
В твоем последнем коде 3 ошибки.
1. Не верно указан адрес ячейки памяти в видеопамяти. Не там стоит скобка. Вместо
Код

mov [es:bx],al

надо
Код

mov es:[bx],al


2. Не верный цикл в цикле.
Код

 mov cx,100
 @2:
 mov cx,25

Не верное использование регистра cx. Второй цикл начнется с нулевым его значением. Для этого нужно использовать либо стек, где хранить cx для внешнего цикла, либо другой регистр. Использование стека в цикле -  smile Поэтому используй другой регистр:
Код

 mov  di,100      ;счетчик внешнего цикла
 @2:
 mov cx,25
mov bx,16020
@1:
 mov es:[bx],al
 add bx,1
 loop @1
 add bx,320
dec  di
jnя  @2


3. Я тебе предложил функцию DOS, которую правильнее использовать для целей выхода по нажатию клавиши. Выбранная тобой функция BIOS имеет другие цели. Ну да ладно. Не это главное.
Главное то, что для выхода при нажатии надо же ведь проверять результат!!! Для твоей функции надо проверять содержимое ah:
Код

@3:
 mov ah,0
 int 16h
test  ah,ah
je  @3


И напоследок 2 примечания.
1) При выходе в DOS лучше перевести видеорежим в текстовый:
Код

mov  ax,03h
int  10h


2)У тебя не прорисует толстую линию, так как при каждом внешнем цикле bx получает значение 16020. Его надо вынести за пределы внешнего цикла.
PM MAIL   Вверх
jaAlex
Дата 21.10.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Код

program TEST;
begin
asm
  mov  ax,0013h
  int  10h
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,50
  mov  si,0
@@OutLines:
  mov  ax,320
  mul  bx
  add  ax,10
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,100
  jb  @@OutLines
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,50
  mov  si,0
@@OutLines:
  mov  ax,319
  mul  bx
  add  ax,110
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,50
  jb  @@OutLines
end;
asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,100
  mov  si,0
@@OutLines:
  mov  ax,321
  mul  bx
  add  ax,-88
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,49
  jb  @@OutLines
end;
asm
  mov  ah,0
  int  16h
end;
asm
  mov  ax,0003h
  int  10h
end;
end.


Вот такая буковка "К" у меня получилась. По - моему, нормально.
И вот у меня такой еще вопрос появился. Вот линия:

Код

asm
  mov  ax,0A000h
  mov  es,ax
  mov  bx,50
  mov  si,0
@@OutLines:
  mov  ax,319
  mul  bx
  add  ax,110
  mov  di,ax
  mov  cx,25
  @@OutLine:
      mov  byte ptr es:[di],15
      inc  di
      dec  cx
      cmp  cx,0
      jnz  @@OutLine
  add  bx,1
  inc  si
  cmp  si,100
  jb  @@OutLines
end;


А как сделать ее такой, чтобы ее угол наклона был меньше, т.е.  вот чтобы каждая следующяя линия сдвигалась налево не на 1 пиксель, а, скажем, на 0.5?
PM MAIL   Вверх
anwe
Дата 21.10.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Цитата
Вот такая буковка "К" у меня получилась. По - моему, нормально.

Нормально.

Цитата
чтобы каждая следующяя линия сдвигалась налево не на 1 пиксель, а, скажем, на 0.5?
 Полпикселя - этот класс  smile Делай сдвиг влево на 1, а вверх - на 2 (3, 4...). (Посмотри на линию секундной стрелки часов, что внизу справа.) Только линия будет уже не линией - ступенькой. Если надо сгладить - повышай разрешение экрана.
PM MAIL   Вверх
jaAlex
Дата 21.10.2006, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Цитата(anwe @  21.10.2006,  01:40 Найти цитируемый пост)
 Если надо сгладить - повышай разрешение экрана.

А как можно повысить разрешение? 
И еще: как задать пропорцию? Я еще до этого думал, что пропорция какая - то должна быть, посчитал так, чтоб линию из угла экрана в угол наискосок пропорция 5/8 выходит. Но где ее задать - незнаю. И как задать тоже незнаю. Если не составит труда, подскажи пожалуйста.
PM MAIL   Вверх
anwe
Дата 21.10.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Установи SVGA режим. Здесь техника такая.
Так как одного сегмента DOS для всего изображения в SVGA режиме недостаточно, необходимо перемещать окна (так называемые банки) видео памяти. Делает это функция BIOS $4F.
Вобщем давай так. Вот тебе пример, где прорисована линия на экране с разрешением 640х480. Выход из программы - по нажатию клавиши. Попробуй сам разобраться, у меня сейчас нет времени. Если что - позже.
Вот код:
Код

var
buf    db    100h dup(?)
;-----------------------------------
mov    ax,4F01h
mov    cx,111h
mov    di,offset buf
int    10h
mov    ax,4F02h
mov    bx,111h
int    10h
push    word ptr [buf+08h]
pop    es
mov    dx,4
xor    bx,bx
call    dword ptr [buf+0Ch]
mov    di,44416
mov    ax,0FFFFh
mov    cx,100h
@2:
mov    es:[di],ax
inc    di
loop    @2
@1:
mov    ah,06h
mov    dl,0FFh
int    21h
jz    @1
mov    ax,0003h
int    10h

PM MAIL   Вверх
jaAlex
Дата 21.10.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Код

program TEST;
var
buf    db    100h dup(?)
begin
{ Здесь устанавливаем графический режим 640х480}
asm
mov    ax,4F01h
mov    cx,111h
mov    di,offset buf
int    10h
mov    ax,4F02h
mov    bx,111h
int    10h
push    word ptr [buf+08h]
pop    es
mov    dx,4
xor    bx,bx
call    dword ptr [buf+0Ch]
end;
{Здесь отрисовываем линию}
asm
mov    di,44416
mov    ax,0FFFFh
mov    cx,100h
@2:
mov    es:[di],ax
inc    di
loop    @2
@1:
mov    ah,06h
mov    dl,0FFh
int    21h
jz    @1
end;
{Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона}
asm
mov    ax,0003h
int    10h
end;
end.


Вроде разобрался. Но вот это у меня TP никак воспринимать нехочет, ругается сильно:

Код

var
buf    db    100h dup(?)


Я что только уж не делал, никак не хочет. Как тут вот поступить надо? В коде вроде бы разобрался, но получается разрешение, по - моему, не 640х480, а 640х400, ведь разрешение стандартного графического режима 320х200, а мы его увеличиваем с угла. Вот с разрешением еще пока не разобрался.
PM MAIL   Вверх
anwe
Дата 21.10.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Переменную надо объявлять так:
Код

var
buf:array [0..100] of byte;


Цитата
 по - моему, не 640х480, а 640х400 


Не, здесь тупое умножение на коэффициент не правильно. А как же быть, по-твоему, с другими разрешениями, к примеру 800х600?
PM MAIL   Вверх
jaAlex
Дата 22.10.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 31.5.2006
Где: Краснодар

Репутация: нет
Всего: нет



Тут сразу уйма вопросов возникла по поводу этого графического режима. Но не буду тебя грузить, и так достал уже наверно...
Но все же, ответь пожалуйста еще на парочку вопросов. Вот наклонная линия:

Код

program TEST;
begin
 asm
 mov ax,$13
 int 10h
end;
asm
 mov ax,$A000
 mov es,ax
 mov al,15
 mov di,50
 mov bx,16820
 @2:
 mov cx,25
 @1:
 mov [es:bx],al
 add bx,1
 loop @1
 add bx,616
 dec di
 jnz @2
end;
asm
 xor ah,ah
 int 16h
end;
end.


Но почему - то она как зебра. Точнее даже я примерно предполагаю почему она такая, но сделать ее не в полосочку никак не получается. Помоги пожалуйста исправить мои ошибки и нарисовать ее нормально, не в полосочку. Заранее большое спасибо.

P.S. Угол наклона именно такой вот должен быть, это я буковку "А" нарисовать пытаюсь.

Это сообщение отредактировал(а) jaAlex - 22.10.2006, 23:47
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.