Консультация № 185912
26.04.2012, 22:31
81.47 руб.
0 9 1
Здравствуйте! Прошу помощи в следующем вопросе:
В графическом режиме средствами BIOS изобразить на экране окружность радиусом 30.
То есть в коде паскаля будет использоваться ассемблер для рисования.
И очень большая просьба прокомментировать каждую строчку кода.

Обсуждение

давно
Мастер-Эксперт
425
4118
27.04.2012, 05:29
общий
...изобразить на экране окружность радиусом 30.

30 пикселей?
В графическом режиме средствами BIOS

Для какой операционной системы?
Вопрос этот не праздный, т.к. начиная с Windows NT, обращения к многим функциям BIOS операционной системой просто напросто блокируются.
То есть в коде паскаля будет использоваться ассемблер

Ассемблер - это обязательное условие? Мягко говоря, он тут вовсе и не нужен. Ассемблерные вставки в языках высокого уровня, типа Pascal, используются в том случае, если есть повышенные требования к скорости исполнения кода.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессионал
304622
583
27.04.2012, 21:49
общий
Адресаты:
Я сталкивался с таким -- консультировал студента с похожим заданием. Это прямое обращение к видеопамяти через прерывания. Тут функции самые простые и базовые -- они поддерживаются в NTшном виртуальном ДОСе. Может быть напишу.
давно
Старший Модератор
31795
6196
27.04.2012, 23:50
общий
28.04.2012, 00:03
1) Какая ОСь у Вас?
Если Vista или семерка, то графическим режимом Вы воспользоватся не сможете, т.к. старые графические режимы эти ОСи не поддерживают, вернее их эммуляторы режима DOS'a. В ХР эммулятор ещё как-то справляется.

2)Assembler:
Есть несколько виделрежимов, которые различаются по типу кодирования одного пикселя:
монохром(1 бит),
CGA(2 бита),
EGA/VGA(4 бита),
SVGA(8 бит),
HiColor(16 бит),
TrueColor(24 и 32 бита).
Каждый из этих режимов требует своего подхода к программированию. Современные видеоадаптеры уже точно не работают в первых трех режимах, их может эммулировать ОСь. 8 бит ещё может кто-либо из производителей поддерживать, но не факт(это лично моё мнение, т.к. нет возможности проверить множество контролерров).

С SVGA можно работать сердствами BIOS: функции 0Ch и 0Dh(прерывание 10h). С режимом Hi и True можно работать с помощью функций BIOS 10h(прерывание 10h), но само такое программирование слишком запутано, т.к. скрывает от программиста именно работу с портами и программирование видеоконтролера, тем самым затрудняя понимание кода, хотя смысл этих функций именно к этому и сводится: получить данные и запрограммировать нужный порт.

Стандарт Borland/Turbo Pascal'я позволяет с помощью InitGraph полключить нужный режим или самый оптимальный по
умолчанию и одновременно нужный BGI-файл драйвера. Соответственно подключаются возможности ввода/вывода информации с/на экран под стандартные функции.


Сейчес уточняющие вопросы:
1)ОСь?
2)Адаптер, процессор?
5)Какой компилятор?
3)Наличие FDD(дисковода) т.е. есть возможность написать под чистый DOS.
4)Запустить на своем РС программку паскаля:
a:=detect;автоопределение оптимального режима
InitGraph(a,b,'');инициализация графического режима, BGI-файл должен быть в одной папке с программой
a:=Graphresult;результат инициализации графического режима
if a<>0 then writeln('error:=',a)ошибка перехода в графический режим
else a:=GetGraphMode;текущий графический режим и соответственно это значение нужно поазать

покажите, что получилось.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.04.2012, 20:09
общий
1. ХР
2. intel core2duo(думаю не имеет значения так как хр установлена на виртуалку)
5. Turbo pascal
3. дисковода нет
4. пытался запустить прогу, она не щапускается, во первых просила добавит бегин - сделал, дальше пишет ненайденный идентификатор к переменной, какой тип я не знаю поэтому не объявлял


В помощь прикрепляю аналогичную прогу, но написанную на си++
Прикрепленные файлы:
061fa872c555c702cba2855376dbca86.rar
давно
Профессионал
304622
583
30.04.2012, 12:34
общий
Цитата: 288721
пытался запустить прогу, она не щапускается,


Вы имеете хоть какие-то минимальные представления о программировании на Паскале?
Неизвестный
30.04.2012, 16:40
общий
Минимальные представления имею, и паскаль понимаю, но как его с ассемблером связать не понимаю! Но прога рабосчая, у меня на хп запускается.
давно
Старший Модератор
31795
6196
30.04.2012, 18:35
общий
Посмотрите этот код:
Код:
const
r=30;{радиус}
x0=50;{центр окружности Х}
y0=50;{центр окружности У}
myColor=15;{цвет окружности}
var
x,y,z:integer;
begin
{вызываем ассемблер}
asm
mov ax,13h{устанавливаем видеорежим 320х200х256}
int 10h{вызываем прерывание BIOS}
end;
{}
for z:=0 to 359 do
begin
{считаем текущую координату точки средствами паскаля}
x:=x0+round(r*cos(z*pi/180));
y:=y0+round(r*sin(z*pi/180));
{выводим средствами ассемблера}
asm
{справка по функции BIOS-записать графический пиксель
AH = 0Ch-номер функции
BH = page number-номер видео страницы
AL = pixel color-цвет пикселя
CX = column-столбец
DX = row-строка
}
mov ah,0ch{номер функции}
mov al,myColor{устанавливаем свой цвет пикселя}
xor bx,bx{текущая видеостраница}
mov cx,x{графическая координата Х}
mov dx,y{графическая координата У}
int 10h{вызываем прерывание BIOS}
end;
end;
asm
{ожидаем нажатие любой клавиши на клавиатуре}
xor ax,ax{номер функции}
int 16h{вызываем прерывание BIOS}
end;
end.

Вам всё понятно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
30.04.2012, 19:28
общий
Да, все понятно, спасибо огромное!!!
давно
Старший Модератор
31795
6196
30.04.2012, 19:42
общий
это ответ
Здравствуйте, Mihenze!

Смотрите приложение!
Код ТР 7.0.
В программе не используются модули, Crt и Graph, вместо них используются вставки ассемблера: нулевые фнукции прерываний 0х10 и 0х16, аналоги функций паскаля InitGraph и ReadKey.

Удачи!

Приложение:
const
r=30;{радиус}
x0=50;{центр окружности Х}
y0=50;{центр окружности У}
myColor=15;{цвет окружности}
delta=5;{визуальная коррекция окружности}
var
x,y,z:integer;
begin
{переходим в графический режим, аналог InitGraph, модуль Grpah}
asm
mov ax,13h{устанавливаем видеорежим 320х200х256}
int 10h{вызываем прерывание BIOS}
end;
{средствами паскаля рисуем окружность}
for z:=0 to 359 do
begin
{считаем текущую координату точки средствами паскаля}
x:=x0+round((r+delta)*cos(z*pi/180));
y:=y0+round(r*sin(z*pi/180));
{выводим средствами ассемблера}
asm
{справка по функции BIOS-записать графический пиксель
AH = 0Ch-номер функции
BH = page number-номер видео страницы
AL = pixel color-цвет пикселя
CX = column-столбец
DX = row-строка
}
mov ah,0ch{номер функции}
mov al,myColor{устанавливаем свой цвет пикселя}
xor bx,bx{текущая видеостраница}
mov cx,x{графическая координата Х}
mov dx,y{графическая координата У}
int 10h{вызываем прерывание BIOS}
end;
end;
asm
{ожидаем нажатие любой клавиши на клавиатуре, аналог ReadKey, модуль CTR}
xor ax,ax{номер функции}
int 16h{вызываем прерывание BIOS}
end;
end.
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа