Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
#1

Вывод текстовых символов путем непосредственного обращения к видеопамяти

27.01.2011, 02:07. Просмотров 2717. Ответов 4
Метки нет (Все метки)

Помогите пожалуйста срочно выполнить упражнения!
Заранее благодарен.
C.rar

Упражнение №1

Ниже приведен пример программы, которая выполняет очистку экрана и вывод текстовых символов путем непосредственного обращения к видеопамяти:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <conio.h>
#include <dos.h>
 
// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xB800, 0);
 
// Очистка экрана
void ClearScreen()
{
  int i;
  for(i=0; i<80*25; i++)
  {
    screen[2*i] = ' ';    // заполнить экран пробелами
    screen[2*i+1] = 0x0F; // символы белые, фон черный
  }
}
 
// Вывод символа
void OutChar(int x, int y, char CharCode, unsigned char Color)
{
  screen[(80*y+x)*2] = CharCode;
screen[(80*y+x)*2+1] = Color;
}
 
// Главный модуль
void main()
{
  ClearScreen();
  OutChar(0,0,'A',0x1E);
  OutChar(1,2,'B',0x2D);
  getch();
}
Функция OutChar имеет следующие параметры:
x и y – координаты символа;
CharCode – код символа;
Color – цвет символа и фона.

Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Изменить программу таким образом, чтобы вместо очистки экрана выполнялась раскраска фона в виде шахматной доски с коричневыми и желтыми клетками (использовать по два знакоместа на каждую клетку, чтобы клетки были квадратными).
3) Вывести «бегущий ноль». При запуске в левом верхнем углу экрана выводится символ ‘0’. Далее при каждом нажатии на клавишу Enter символ должен перемещаться в следующую колонку, а при достижении конца строки – в следующую строку. Работа программы должна прекращаться по достижении конца третьей строки.


Упражнение №2

Ниже приведен пример программы, которая работает в графическом режиме с разрешением 320200 точек. В программе используются следующие функции: SetMode – установка видеорежима; ClearScreen – очистка экрана; Pixel – вывод точки заданного цвета в указанную позицию экрана.
Функция установки видеорежима SetMode имеет один параметр – код режима. Для установки 256-цветного режима с разрешением 320200 точек используется код 0x13, для возврата в текстовый режим – код 0x03.
Функция вывода точки Pixel имеет следующие параметры:
x и y – координаты точки;
Color – цвет точки.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <conio.h>
#include <dos.h>
 
// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xA000, 0);
 
// Установка видеорежима
void SetMode(int Mode)
{
  union REGS regs;
  regs.h.ah = 0;
  regs.h.al = Mode;
  int86(0x10, &regs, &regs);
}
 
// Очистка экрана
void ClearScreen()
{
  unsigned i;
  for(i=0; i<64000l; i++) screen[i] = 0;
}
 
// Вывод точки заданного цвета в заданную позицию экрана
void Pixel(unsigned x, unsigned y, unsigned char Color)
{
  screen[320*y+x] = Color;
}
 
// Главный модуль
void main()
{
  unsigned x, y;
  SetMode(0x13); // установить графический режим с разрешением 320x200
  ClearScreen(); // очистить экран
  // Отобразить всю палитру цветов в виде вертикальных линий
  for(y=0; y<100; y++) for(x=0; x<256; x++) Pixel(x,y,x);
  getch();       // ожидать нажатия любой клавиши
  SetMode(3);    // восстановить текстовый режим
}

Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Добавить в программу функцию, рисующую горизонтальные отрезки заданного цвета с заданной координатой Y от левого до правого края экрана.
3) Добавить в программу функцию, рисующую вертикальные отрезки заданного цвета с заданной координатой X от верхнего края экрана до нижнего..
4) С помощью добавленных функций разлиновать экран линиями светло-серого цвета таким образом, чтобы получились клетки 88 точек
5) Создать маску изображения в виде массива 88 типа unsigned char.
6) Организовать цикл вывода изображения таким образом, чтобы оно перемещалось от левого края экрана до правого с шагом в одну точку при каждом нажатии клавиши Enter.
7) Добавить массив 88 типа unsigned char для хранения фона и усовершенствовать цикл вывода изображения, чтобы фон восстанавливался после перемещения изображения.
8) Добавить в программу функцию синхронизации вывода изображения с частотой кадров WaitSync.Изменить цикл вывода изображения так, чтобы изображение перемещалось не по нажатию Enter, а по началу обратного хода луча.
9) Изменить программу таким образом, чтобы слева направо перемещался не один, а несколько одинаковых объектов – строем (цепью).


Упражнение №3.

Ниже приведен пример программы, которая работает в режиме TrueColor32 1024768.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <dos.h>
 
// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xA000, 0);
 
// Установка режима TrueColor32 с разрешением 1024x768
void SetTrueColorMode(void)
{
  union REGS regs;
  regs.x.ax = 0x4F02;
  regs.x.bx = 0x118;
  int86(0x10, &regs, &regs);
}
 
// Восстановление текстового режима
void SetTextMode(void)
{
  union REGS regs;
  regs.h.ah = 0;
  regs.h.al = 3;
  int86(0x10, &regs, &regs);
}
 
// Переключение окон
void SetPage(unsigned Page)
{
  union REGS regs;
  regs.x.ax = 0x4F05;
  regs.x.bx = 0;
  regs.x.dx = Page;
  int86(0x10, &regs, &regs);
}
 
// Заливка экрана заданным цветом
void FillScreen(unsigned char B, unsigned char G, unsigned char R)
{
  unsigned i,j;
  for(i=0; i<48; i++)
  {
    SetPage(i);
    for(j=0; j<0x4000; j++)
      {screen[j*4] = B; screen[j*4+1] = G; screen[j*4+2] = R;}
  }
}
 
// Главный модуль
void main()
{
  SetTrueColorMode();  // установить графический режим
  FillScreen(255,0,0); // окрасить экран в синий цвет
  getch();
  SetTextMode();       // восстановить текстовый режим
}
В программе используются следующие функции: SetTrueColorMode – установка графического режима, SetTextMode – восстановление текстового режима, SetPage – установка заданного окна видеопамяти, FillScreen – заливка экрана заданным цветом.
Параметры обозначены следующим образом:
• Page – номер окна видеопамяти;
• B – яркость по синей цветовой компоненте;
• G – яркость по зеленой компоненте;
• R – яркость по красной компоненте.

Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Добавить в программу функцию, рисующую горизонтальные отрезки заданного цвета с заданной координатой Y от левого до правого края экрана, а также функцию, рисующую вертикальные отрезки заданного цвета с заданной координатой X от верхнего края экрана до нижнего. С помощью добавленных функций разлиновать экран линиями белого цвета, чтобы получить клетки 3232.
3) Добавить описатель структуры заголовка файла BMP. В главном модуле отрыть для чтения двоичный файл rgb1.bmp. Прочитать из файла заголовок.
4) Добавить в программу массив из 4096 элементов типа unsigned char для промежуточного хранения строки изображения. Используя информацию о ширине и высоте изображения, построчно читать и выводить на экран данные из файла.
5) Добавить указатель для работы с видеопамятью как c массивом типа unsigned long, чтобы можно было передавать точку изображения за одну операцию.
6) Добавить функцию, переворачивающую изображение слева направо. Перевернуть изображение, ожидать нажатия любой клавиши, вернуть изображение в исходное состояние, ожидать нажатия клавиши.
7) Добавить функцию, переворачивающую изображение сверху вниз. Перевернуть изображение, ожидать нажатия клавиши, вернуть в исходное состояние, ожидать нажатия клавиши.
8) Добавить функцию, преобразующую изображение в черно-белое (с 256 градациями яркости).
9) Изменить программу таким образом, чтобы имя файла передавалось из командной строки через параметры функции main().

C.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 02:07
Ответы с готовыми решениями:

Кодировка текста путем сдвига символов
#include &lt;stdio.h&gt; char code(char *c, int n) { int i; for (i=0; c!=0;...

Заполнить массив из одиночных символов путем ввода с клавиатуры
надо заполнить массив из одиночных символов путем ввода с клавиатуры. Если...

Исходные данные определяются путем обращения к датчику случайных чисел
1. Исходные данные: расход каждого из К материалов на единицу каждой из М ...

Локальный чат путем обмена сообщений с помощью текстовых файлов
Доброго времени суток. Решил написать простенький чат для локальной сети. Идея...

Вывод объема видеопамяти
Вот уже сутки пытаюсь отыскать не просторах интернета способ вывода объема...

4
easybudda
27.01.2011, 02:13
  #2

Не по теме:

пишите адрес, куда перфоленту с программой выслать...

2
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
27.01.2011, 08:13  [ТС] #3

Не по теме:

Если это была не ирония, то: fob.exe@gmail.com )



Добавлено через 5 часов 41 минуту
Актуально.
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,321
27.01.2011, 08:36 #4
На почте по этому адресу отказались бандероль отправлять.
А если серьёзно, за последние 15 лет и сама ОС от Микрософт, и принципы написания программ под неё несколько изменились. Теперь уже нельзя обращаться на прямую к видеопамяти, а настройками вывода в консоль, в окно, или ещё куда-нибудь заведуют функции API системы. Больше скажу - уже и система сама давно не DOS называется, да и заголовок dos.h в более-менее современные компиляторы уже не входит...
Очень информативный сайт про программирование в OS Windows
2
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
27.01.2011, 20:34  [ТС] #5
У брата C++ в универе и он тоже чертыхался над этой работой. Не работал у него компилятор с этим кодом.
Но мы работаем в досе, поэтому писать надо именно так.

Добавлено через 7 часов 30 минут
Ребят, очень нужна помощь, буквально горю.
0
27.01.2011, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 20:34

Вывод содержания видеопамяти
Как вывести на экран содержимое видеопамяти в DOS? По какому адресу она...

Вывод двумя страницами видеопамяти
Всем привет:) Подскажите, плиз, как в паскале работать с видеопамятью...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru