Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 22:47   #1
иванлеон
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 31
По умолчанию DOS TurboPascal

Как осуществить установку пикселя с использованием библиотеки DOS TurboPascal? То есть закрасить пиксель.Графический режи 320 на 200.Вот так вот через DOS инициализируется
Код:
procedure initgraph;
 var
    r: registers;
 begin
      SwapVectors;
      r.ah:=$00;
      r.ax:=$13;
      intr($10,r);
      SwapVectors;
 end;
Код:
 procedure closegraph;
 var
    r: registers;
 begin
      SwapVectors;
      r.ah:=$00;
      r.ax:=$03;
      intr($10,r);
      SwapVectors;
 end;
А как поставить пиксель, не знаю

Последний раз редактировалось Stilet; 12.03.2013 в 22:45.
иванлеон вне форума Ответить с цитированием
Старый 11.03.2013, 22:49   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Модуль Graph. Процедура PutPixel
Poma][a вне форума Ответить с цитированием
Старый 11.03.2013, 22:55   #3
иванлеон
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 31
По умолчанию

Надо при помощи DOS, а не Graph
иванлеон вне форума Ответить с цитированием
Старый 12.03.2013, 07:28   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Эм.. DOS - это операционная система, под который работает Turbo Pascal, а Graph - это графический модуль. (подробнее см. справка)
Poma][a вне форума Ответить с цитированием
Старый 12.03.2013, 08:04   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Модуль Graph. Процедура PutPixel
Модуль Graph ничего не знает о режиме 320х200.

Теперь по теме:

Среди прерываний DOS есть те, которые закрашивают пиксель. Соответственно, по справочнику прерываний DOS нужно их найти и соответствующим образом обратиться.
Разумеется, после того, как будет установлен графический режим.

Но это неэффективный (очень медленный) путь.
В видеорежиме $13 видеопамять предсттавляет собой один сплошной массив, каждому байту которого соответствует пиксель. Т.е. точку можно закрасить (и это будет быстрее всего) просто записав нужный байт по нужному адресу.
Примерно это будет выглядеть так:
Код:
procedure SetPixel(x,y : word; c : byte);
begin
  mem[SegA000 : x + 320*y] := c;
end;
Примечание: можно еще чуть-чуть ускорить процедуру, если вместо умножения применить комбинацию из сложения и сдвигов.
s-andriano вне форума Ответить с цитированием
Старый 12.03.2013, 20:21   #6
иванлеон
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 31
По умолчанию

s-andriano, через mem я делал уже. Почему-то возникает арифметическое переполнение. Хотя какое-там переполнение, значение не уходит за допустимые для переменной integer.Пробовал использовать переменную longint, такая же фигня.
Да и в итоге оказалось по-заданию мне надо сравнить во сколько раз быстрее будет работать прога, если сначала я нарисую фигуру, используя для установки пикселя ассемблеровскую вставку, а второй раз - через библиотеку DOS/ Да и тема задания про прерывания.Ассемблер я сделал, а с DOS возникли проблемы
иванлеон вне форума Ответить с цитированием
Старый 12.03.2013, 20:38   #7
иванлеон
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 31
По умолчанию

s-andriano - большое спасибо за помощь! Нашёл справочник и сделал! Кому интересно

procedure PutPixel(x,y:integer;color:byte);
var
r:registers;
begin

SwapVectors;
r.ah:=$0c;
r.dx:=y;
r.cx:=x;
r.al:=color;
intr($10,r);
SwapVectors;

end;
иванлеон вне форума Ответить с цитированием
Старый 12.03.2013, 21:48   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от иванлеон Посмотреть сообщение
s-andriano, через mem я делал уже. Почему-то возникает арифметическое переполнение. Хотя какое-там переполнение, значение не уходит за допустимые для переменной integer.Пробовал использовать переменную longint, такая же фигня.
Да и в итоге оказалось по-заданию мне надо сравнить во сколько раз быстрее будет работать прога, если сначала я нарисую фигуру, используя для установки пикселя ассемблеровскую вставку, а второй раз - через библиотеку DOS/ Да и тема задания про прерывания.Ассемблер я сделал, а с DOS возникли проблемы
Арифметическое переполнение возникает как раз потому, что значение выходит за диапазон integer.
Если обратили внимание, я использовал word, а не integer.

А что делает ассемблерная вставка?
Если точно так же вызывает прерывание, то все равно будет заметно медленнее.

И, кстати, альтернативный вариант - это через BIOS, а не через DOS.
Так что к DOS все равно никакого отношения не имеет.

И еще: не нужны здесь SwapVectors.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
turboPascal masterlomaster Помощь студентам 1 26.04.2011 19:45
TurboPascal masterlomaster Помощь студентам 0 26.04.2011 15:36
Аннаграммы (TurboPascal) beemoto Помощь студентам 9 24.12.2009 21:31
TurboPascal - help! Lexone Помощь студентам 5 29.03.2009 15:38