17.12.2018, 02:31 [+3 UTC]
в нашей команде: 3 237 чел. | участники онлайн: 4 (рекорд: 19)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.58 (11.12.2018)

Общие новости:
13.12.2018, 11:36

Форум:
16.12.2018, 14:55

Последний вопрос:
16.12.2018, 22:36

Последний ответ:
16.12.2018, 21:15

Последняя рассылка:
17.12.2018, 00:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
25.02.2016, 17:03 »
YwaN
Грамотная консультация. Хороший и отзывчивый специалист. [вопрос № 188847, ответ № 273404]
17.01.2011, 20:17 »
Denis Loran
Все работает, спасибо [вопрос № 181923, ответ № 265481]
07.06.2010, 22:44 »
Фоменко Роман Федорович
Отличный, очень умный ответ! [вопрос № 178982, ответ № 261966]

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 826
puporev
Статус: 1-й класс
Рейтинг: 33
Степанов Иван /REDDS
Статус: 4-й класс
Рейтинг: 26

Перейти к консультации №:
 

Консультация онлайн # 185912
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: Mihenze
Отправлена: 26.04.2012, 22:31
Поступило ответов: 1

Здравствуйте! Прошу помощи в следующем вопросе:
В графическом режиме средствами BIOS изобразить на экране окружность радиусом 30.
То есть в коде паскаля будет использоваться ассемблер для рисования.
И очень большая просьба прокомментировать каждую строчку кода.

Состояние: Консультация закрыта

Здравствуйте, Mihenze!

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

Удачи!

Приложение:


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 30.04.2012, 19:42

5
нет комментария
-----
Дата оценки: 30.04.2012, 20:05

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 185912

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 1

= общий = | 27.04.2012, 05:29 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата:
...изобразить на экране окружность радиусом 30.

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

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

Ассемблер - это обязательное условие? Мягко говоря, он тут вовсе и не нужен. Ассемблерные вставки в языках высокого уровня, типа Pascal, используются в том случае, если есть повышенные требования к скорости исполнения кода.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Сергей Бендер
Профессионал

ID: 304622

# 2

= общий = | 27.04.2012, 21:49 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Вадим Исаев ака sir Henry:

Я сталкивался с таким -- консультировал студента с похожим заданием. Это прямое обращение к видеопамяти через прерывания. Тут функции самые простые и базовые -- они поддерживаются в NTшном виртуальном ДОСе. Может быть напишу.

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 3

= общий = | 27.04.2012, 23:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

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;текущий графический режим и соответственно это значение нужно поазать

покажите, что получилось.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

• Отредактировал: Зенченко Константин Николаевич (Старший модератор)
• Дата редактирования: 28.04.2012, 00:03


Посетитель

ID: 288721

# 4

= общий = | 29.04.2012, 20:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

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


В помощь прикрепляю аналогичную прогу, но написанную на си++

-----
 Прикрепленный файл:  скачать (RAR) » [9.4 кб]

Сергей Бендер
Профессионал

ID: 304622

# 5

= общий = | 30.04.2012, 12:34 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата:
пытался запустить прогу, она не щапускается,


Вы имеете хоть какие-то минимальные представления о программировании на Паскале?


Посетитель

ID: 288721

# 6

= общий = | 30.04.2012, 16:41 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Минимальные представления имею, и паскаль понимаю, но как его с ассемблером связать не понимаю! Но прога рабосчая, у меня на хп запускается.

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 7

= общий = | 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.

Вам всё понятно?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile


Посетитель

ID: 288721

# 8

= общий = | 30.04.2012, 19:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Да, все понятно, спасибо огромное!!!

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.16801 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.58 от 11.12.2018