Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
1

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

19.09.2016, 15:40. Просмотров 691. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2016, 15:40
Ответы с готовыми решениями:

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

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

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

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

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

35
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
20.09.2016, 18:23 21
Цитата Сообщение от 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
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
20.09.2016, 18:38  [ТС] 22
Линию мне нужно не на асемблере а на си начертить.На асемблеровской вставке только видеорежим включить.

Добавлено через 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
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
20.09.2016, 18:40 23
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
Линию мне нужно не на асемблере а на си начертить.На асемблеровской вставке только видеорежим включить.
Я знаю. Это вообще к чему было сказано?

Добавлено через 2 минуты
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
SVGA и VESA это одно и то?
Это разные термины, но смысл тот же.
VESA-режим установить не проблема, проблема - переключать банки памяти, на разных видеоадаптерах это делается по-разному.
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
20.09.2016, 19:05  [ТС] 24
Цитата Сообщение от 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
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
20.09.2016, 19:48  [ТС] 25
задача 1
Управление видеопамятью  Турбо Си

что не так,может точку с запятой после строчек асемблера поставить?
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
20.09.2016, 19:51  [ТС] 26
Задача 2
Управление видеопамятью  Турбо Си
0
shmkv
1204 / 426 / 59
Регистрация: 21.07.2015
Сообщений: 1,112
21.09.2016, 00:58 27
Цитата Сообщение от 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
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
21.09.2016, 08:06 28
Цитата Сообщение от shmkv Посмотреть сообщение
Это неправда.
Это неправда потому что вы этого не знали? Можно переключать банки памяти через определённые порты.
Да, я забыл про функцию 0x4F05. Есть такая.
0
shmkv
1204 / 426 / 59
Регистрация: 21.07.2015
Сообщений: 1,112
21.09.2016, 11:13 29
Цитата Сообщение от castaway Посмотреть сообщение
Это неправда потому что вы этого не знали?
Конечно не знал. Почему-то про установку видеорежиа никто так не говорил, а вот про окна так сразу. И есть еще один способ это сделать, через far указатель на функцию, которую возвращает vbe (структура от функции идентификации).
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
21.09.2016, 11:48 30
Цитата Сообщение от shmkv Посмотреть сообщение
Конечно не знал.
Теперь будете знать.
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
21.09.2016, 12:13  [ТС] 31
MS-DOS 6.22 cкачал обаp, запустил. Как из msdos запустить мой код на турбо си c папки C:\Borland

?
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
21.09.2016, 12:16  [ТС] 32
Управление видеопамятью  Турбо Си
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
21.09.2016, 15:22  [ТС] 33
может это подскажите,сделал так тоже компилиться, пишет что линковщик создал екжешник и не запускаеться это про установку видео режима.
Управление видеопамятью  Турбо Си
0
shmkv
1204 / 426 / 59
Регистрация: 21.07.2015
Сообщений: 1,112
21.09.2016, 16:54 34
У тебя даже прерывание не то вызывается. 10 это не тоже самое, что 0x10.
1
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
21.09.2016, 17:05  [ТС] 35
Так делать чего?
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,611
23.09.2016, 19:46  [ТС] 36
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
23.09.2016, 19:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2016, 19:46

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

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

Сортировка массива с текстовой видеопамятью!
Сортировка массива(10 случайных чисел) методом пузырька с использованием...


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

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

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