Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097

Управление видеопамятью Турбо Си

19.09.2016, 15:40. Показов 2656. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам

Что за ошибки такие?
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// ****** Control videoadapter ................ * /
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
//***************Constanty */
#define VSEG 0xb800    /* video memory segment address*/
#define byte unsigned char#define word unsigned int
#define Esc 27
#define Spase 32
#define Enter 13
#define Up 0x48
#define Down 0x50
#define Left 0x4b
#define Right 0x4d
#define Home 0x47
int xk,yk;
//*****Reading a character from the video memory*/
byte GetSym(x1,y1)
int x1,y1;
{
return(peekb(VSEG,y1*160+x1*2));
}
//****read from the video memory*/
byte GetAtr(x1,y1)
int x1,y1;
{
return(peekb(VSEG,y1*160+x1*2+1));
}
//****Write a character in the video memory*/
void PutSym(x1,y1,sym)
int x1,y1;
byte sym;
{
pokeb(VSEG,y1*160+x1*2,sym);
}
//****Record attribute to video memory*/
void PutAtr(x1,y1,atr)
int x1,y1;
byte atr;
{
pokeb(VSEG,y1*160+x1*2+1,atr);
}
//***The inversion of a square on the screen*/
void Invert(x1,y1)
int x1,y1;
{
byte b;
int i,j;
for (j=0;j<5;j++)for (i=0;i<10;i++)
{
b=GetAtr(x1*10+i,y1*5+j);
PutAtr(x1*10+i,y1*5+j,(b^0x7f));
}
}
//***Replacing the current square in the upper left*/
void Change(x,y)
byte x,y;
{
int i,j;
byte ba,bs;
if ((x!=0)||(y!=0))
for (j=0;j<5;j++)
for (i=0;i<10;i++)
{
bs=GetSym(x*10+i,y*5+j);
ba=GetAtr(x*10+i,y*5+j);
PutSym(x*10+i,y*5+j,GetSym(i,j));
PutAtr(x*10+i,y*5+j,GetAtr(i,j));
PutSym(i,j,bs);
PutAtr(i,j,ba);
}
}
//***Stirring squares until you press*/
void RandText(void)
{
Invert(xk,yk);
xk=5;
yk=1;
while(!kbhit())
{
Change(xk,yk);
xk++;
if (xk>7) xk=0;
yk++;
if (yk>4) yk=0;
}
Invert(xk,yk);
}
//******Start the main program*/
main(int argn,char *argc[])
{int i;
xk=0;
yk=0;
if (argn>1){}
else     / /* If the parameter is not present, the output instructions*/
{
textattr(10);
clrscr();
cprintf(""""""""""""""""");
cprintf("   Laboratorna rabota  N5       ");
cprintf(""""""""""""""""");
cprintf(""""""""""""""""");
cprintf("  Control videoadapter.      ");
cprintf(""""""""""""""""");
textattr(15);
gotoxy(23,4);cprintf("Demonstration of video memory.");
textattr(12);
gotoxy(30,6);cprintf("<< MOZAIKA >>");
textattr(14);
gotoxy(30,8);cprintf("control keys:");
gotoxy(7,10);cprintf("< Left, Right, Up, Down> — ");
cprintf("square dedicated management.");
gotoxy(7,11);cprintf("<Spase Bar> — Sharing content ");
cprintf("between the selected square");
gotoxy(7,12);cprintf("      and the upper left");
cprintf(" квадратом.");
gotoxy(7,13);cprintf("<Enter> — squares mixing");
cprintf(" until you press any key.");
gotoxy(7,14);cprintf("<Esc> — Entrance.");
textattr(11);
gotoxy(28,16);cprintf("ZADACHA GAME :");
gotoxy(14,17);cprintf("Absorb with keys");
cprintf("management initial screen.");
textattr(12);
gotoxy(27,19);cprintf("Zelaem uspeha!");
textattr(7);
gotoxy(1,21);cprintf("Note: When you start with ");
cprintf("parameter<<>");
gotoxy(13,22);cprintf("the initial screen for the game");
cprintf("is the current.");
}
Invert(xk,yk);for(i=0;i==0;)
switch(getch())
{ //* Processing of keypresses */
case Esc: i++; break;
case Enter:RandText();break;
case Spase:Invert(xk,yk);
Change(xk,yk);
Invert(xk,yk);
break;
case 0:
switch (getch()) {
case Left:Invert(xk,yk);
xkkk;
if(xk<0) xk=7;
Invert(xk,yk);
break;
case Right:Invert(xk,yk);
xk++;
if(xk>7) xk=0;
Invert(xk,yk);
break;
case  Up:Invert(xk,yk);
ykkk;
if(yk<0) yk=4;
Invert(xk,yk);
break;
case Down:Invert(xk,yk);
yk++;
if(yk>4) yk=0;
Invert(xk,yk);
break;
}
}
Invert(xk,yk);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2016, 15:40
Ответы с готовыми решениями:

Управление клавиатурой в Турбо Си
Cкачал Borland C++ 3.1.У меня виндовс 8.1 DosBox запускается.File-&gt;Open указываю файл.Начинаю компилировать и вот самое интересное.Перед...

Работа с видеопамятью напрямую
Нашел кусок кода для работы с видеопамятью напрямую #include &lt;conio.h&gt; #include &lt;dos.h&gt; // Создание указателя на видеопамять ...

Работа с видеопамятью
Доброго дня, кодеры! Может кто подсказать как узнать объём свободной/занятой памяти у видеокарты на данный момент? И желательно бы...

35
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.09.2016, 18:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
значит будет так
Так.

Цитата Сообщение от scherbakovss201 Посмотреть сообщение
это VESA?
Нет.

Цитата Сообщение от scherbakovss201 Посмотреть сообщение
как эту асемблеровскую вставку сделать на СИ и потом начертить линию?
Я на Turbo C лет 10 ничего не писал. Пробуй так:
C
1
2
3
4
5
    asm {
        mov ah, 0
        mov al, 6
        int 10h
    }
+ google в помощь с запросом: "Turbo C inline assembly".
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
20.09.2016, 18:38  [ТС]
Линию мне нужно не на асемблере а на си начертить.На асемблеровской вставке только видеорежим включить.

Добавлено через 7 минут
http://shackmaster.narod.ru/vidmodes.htm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Пример установки видеорежима SVGA 800 x 600 256 цветов с очисткой видеопамяти:
 
 
        mov  ah, 4Fh
        mov  al, 02h
        mov  bx, 103h
        int  10h
        cmp  al, 4Fh
        jne  not_supported
        cmp  ah, 0
        jnz  error
        . . . . .
error:
        . . . . .
not_supported:
Добавлено через 30 секунд
SVGA и VESA это одно и то?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.09.2016, 18:40
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
Линию мне нужно не на асемблере а на си начертить.На асемблеровской вставке только видеорежим включить.
Я знаю. Это вообще к чему было сказано?

Добавлено через 2 минуты
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
SVGA и VESA это одно и то?
Это разные термины, но смысл тот же.
VESA-режим установить не проблема, проблема - переключать банки памяти, на разных видеоадаптерах это делается по-разному.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
20.09.2016, 19:05  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Я знаю. Это вообще к чему было сказано?
Задача 1 асемблеровская вставка
asm {
mov ah, 0
mov al, 6
int 10h
}
и черчение обычной линии средствами турбо си.
Задача 2
асемблеровская вставка для включения VESA и черчение на турбо си ромба.

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
VESA-режим установить не проблема, проблема - переключать банки памяти, на разных видеоадаптерах это делается по-разному.
У меня в задачи 2 не сказано что нужно банки памяти переключать,а просто включить.Если можно пример.

Добавлено через 3 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
asm {
mov ah, 0
mov al, 6
int 10h
}
line(0,0,getmaxx(),getmaxy());
getch();
}
Правильно ли решена задача 1?

Добавлено через 19 минут
Правильно ли решена задача 2 про VESA
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
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
asm {
        mov  ah, 4Fh
        mov  al, 02h
        mov  bx, 103h
        int  10h
}
//draw romb
int x =getmaxx();//макс х 
int x1=getmaxx()/2;//середина х
int y1=getmaxy()/2;//середина у
int y=getmaxy();//макс у
//первая точка х1 по у=0
line(x1,0,0,y1);
//вторая точка х=0 по у1
line(0,y1,x1,y);
//третья точка х1 по  у
line(x1,y,x,y1);
//четвертая точка х по у1
line(x,y1,x1,0);
getch();
}
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
20.09.2016, 19:48  [ТС]
задача 1

что не так,может точку с запятой после строчек асемблера поставить?
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
20.09.2016, 19:51  [ТС]
Задача 2
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
21.09.2016, 00:58
Цитата Сообщение от castaway Посмотреть сообщение
переключать банки памяти, на разных видеоадаптерах это делается по-разному.
Это неправда. Есть единый сервис VBE 0x4F05 (Display Window Control), с помощью которого можно переключать окна памяти. На практике же все устанавливают LFB и забывают про это дело (но для ТС проще разобраться с окнами). Соль VBE в том, что он точно не определяет список видеорежимов, есть только рекомендуемая табличка, которую никто не соблюдает. Чтобы установить видеорежим надо перебирать весь список, который возвращает 0x4F00.

Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Это разные термины, но смысл тот же.
VESA - Video Electronic Standard Association (контора такая)
VBE - VESA BIOS Extension (которая придумала вот это расширение для VGA BIOS)
SVGA - Super Video Graphics Array (просто название видеоадаптеров или видеорежима)

Добавлено через 1 минуту
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
У меня в задачи 2 не сказано что нужно банки памяти переключать,а просто включить.Если можно пример.
Без переключения банков или использования LFB ты не сможешь вывести ничего на весь экран.

Добавлено через 2 минуты
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
Правильно ли решена задача 1?
Нет, для graphics.h дожна использоваться своя функция установки видеорежима.
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
Правильно ли решена задача 2 про VESA
Нет. BGI не работает с VBE.

Добавлено через 5 минут
И да, сразу говорю - делать за тебя не буду. Делай сам, задача детская. Я такие вещи в 7м классе школы делал, на том же BC.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.09.2016, 08:06
Цитата Сообщение от shmkv Посмотреть сообщение
Это неправда.
Это неправда потому что вы этого не знали? Можно переключать банки памяти через определённые порты.
Да, я забыл про функцию 0x4F05. Есть такая.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
21.09.2016, 11:13
Цитата Сообщение от castaway Посмотреть сообщение
Это неправда потому что вы этого не знали?
Конечно не знал. Почему-то про установку видеорежиа никто так не говорил, а вот про окна так сразу. И есть еще один способ это сделать, через far указатель на функцию, которую возвращает vbe (структура от функции идентификации).
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.09.2016, 11:48
Цитата Сообщение от shmkv Посмотреть сообщение
Конечно не знал.
Теперь будете знать.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
21.09.2016, 12:13  [ТС]
MS-DOS 6.22 cкачал обаp, запустил. Как из msdos запустить мой код на турбо си c папки C:\Borland

?
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
21.09.2016, 12:16  [ТС]
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
21.09.2016, 15:22  [ТС]
может это подскажите,сделал так тоже компилиться, пишет что линковщик создал екжешник и не запускаеться это про установку видео режима.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
21.09.2016, 16:54
У тебя даже прерывание не то вызывается. 10 это не тоже самое, что 0x10.
1
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
21.09.2016, 17:05  [ТС]
Так делать чего?
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
23.09.2016, 19:46  [ТС]
lab5V6.zip
нашел библиотеку,svga256m.bgi и поместил ее в папку с программой,компилируется без ошибок.Должен ромб нарисоваться.Кто может проверить и на видео записать,бо у меня наверное на виндовс 8 и gefore 710m не получиться запустить.Бо преподаватель говорит мол у него запускается.А как же они такие древности студентам дают.

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
56
#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 
 
/* function prototypes */ 
int huge detectSVGA(void); 
 
int main(void) 
{ 
   int gdriver, gmode = 2; 
 
   /* install a user written device driver */ 
   gdriver = installuserdriver("svga256m", detectSVGA); 
 
   /* initialize graphics and local variables */ 
   initgraph(&gdriver, &gmode, ""); 
 
   /* read result of initialization */ 
   int errorcode = graphresult(); 
 
   if (errorcode != grOk)  /* an error occurred */ 
   { 
      printf("Graphics error: %s\n", grapherrormsg(errorcode)); 
      printf("Press any key to halt:"); 
      getch(); 
      exit(1);             /* return with error code */ 
   } 
 
   /* draw a line */ 
  // line(0, 0, getmaxx(), getmaxy()); 
 //draw romb
int x =getmaxx();//макс х 
int x1=getmaxx()/2;//середина х
int y1=getmaxy()/2;//середина у
int y=getmaxy();//макс у
//первая точка х1 по у=0
line(x1,0,0,y1);
//вторая точка х=0 по у1
line(0,y1,x1,y);
//третья точка х1 по  у
line(x1,y,x,y1);
//четвертая точка х по у1
line(x,y1,x1,0);
 
   /* clean up */ 
   getch(); 
   closegraph(); 
   return 0; 
} 
 
/* detects EGA or VGA cards */ 
int huge detectSVGA(void) 
{ 
return 0; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2016, 19:46

Приколы с видеопамятью
Доброго времени суток. Решил написать сюда, ибо не очень хочу обращаться в СЦ. В общем картина такова: перевозил комп, довольно длительная...

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

Непонятная ситуация с видеопамятью
здравствуйте! у меня gtx 660 , в ней должно быть 2048 обьем видеопамяти, однака все проги в том числе и GPU-Z показывают что в моей только...

Работа с видеопамятью напрямую: управлять мерцанием символа
Есть ли какой-нибудь способ управлять мерцанием символа, не устанавливая соответствующий бит в байте атрибутов? Заранее спасибо

Библиотека для работы с видеопамятью.
в проге-заготовке вот строка far*p=(char far *)MK_FP(0xB800,0x0000) прога-текстовой редактор,вопрос-какая библио в CPP отвечает за работу...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru