Форум программистов, компьютерный форум CyberForum.ru

Видео драйвер с++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
08.04.2012, 14:23     Видео драйвер с++ #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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define VIDEO_WIDTH 80    //ширина экрана
#define VIDEO_HEIGHT 25   //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
int tty_cursor;           //положение курсора
int tty_attribute;        //текущий аттрибут символа
 
//Инициализация tty
void init_tty()
{
  //поставить курсор в начало
  //выставить атрибут по-умолчанию
}
 
//Смена текущего аттрибута символа
void textcolor(char c)
{
  //выставить атрибут
}
 
//Очистка экрана
void clear()
{
  //создать указатель в начало видео памяти
  //пройти циклом по всему экрану начиная с пойнтера и выставить значение = ' ' (пробел)
  //вернуть курсор в начало
}
 
//Вывод одного символа в режиме телетайпа
void putchar(char c)
{
  //создать указатель в начало видео памяти
  //проверить символ с: если это символ новой строки (\n), то перевести курсор в начало следующей строки
  //а если это просто символ - вывести его на экран, выставить аттрибут и перевести курсор в следующее положение
 
  //если курсор вышел за границу экрана, то нужно сдвинуть экран вверх на одну строку
  if(tty_cursor>VIDEO_WIDTH*VIDEO_HEIGHT){
    //как-нибудь вот тут
  }
}
 
//Вывод строки, заканчивающейся нуль-символом
void puts(const char *s)
{
  while(*s) {
    //вывод одного символа и переход к следующему
  }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 14:23     Видео драйвер с++
Посмотрите здесь:

Драйвер ММ-клавиатуры C++
C++ Драйвер клавиатуры и мыши.
драйвер для миди клавиатуры C++
C++ Драйвер Фильтр
C++ Драйвер для чтения CD-ROM
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 14:25     Видео драйвер с++ #2
ща попробую
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
08.04.2012, 14:39     Видео драйвер с++ #3
видео-драйвер? О_о По-моему, это просто работа с консолью.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 14:44     Видео драйвер с++ #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#define VIDEO_WIDTH 80    //ширина экрана
#define VIDEO_HEIGHT 25   //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
int tty_cursor;           //положение курсора
int tty_attribute;        //текущий аттрибут символа
 
//Инициализация tty
void init_tty()
{
  tty_cursor=0;
  //выставить атрибут по-умолчанию
//C АТРИБУТАМИ КАК НЕ ЗНАЮ Я ВООБЩЕ ВПЕРВЫЕ С ВИДЕОПАМЯТЬЮ РАБОТАЮ
}
 
//Смена текущего аттрибута символа
void textcolor(char c)
{
  //выставить атрибут
}
 
//Очистка экрана
void clear()
{
 memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
 
//Вывод одного символа в режиме телетайпа
void putchar(char c)
{
  //создать указатель в начало видео памяти
  //проверить символ с: если это символ новой строки (\n), то перевести курсор в начало следующей строки
  //а если это просто символ - вывести его на экран, выставить аттрибут и перевести курсор в следующее положение
  if (c!='\n'){
    memset(VIDEO_RAM+tty_cursor, c, 1);
    ttycursor++;
   }
   else{
     ttycursor=(ttycursor+WIDTH)/WIDTH;
   }
 
  //если курсор вышел за границу экрана, то нужно сдвинуть экран вверх на одну строку
  if(tty_cursor>VIDEO_WIDTH*VIDEO_HEIGHT){
    memmove(VIDEO_RAM, VIDEO_RAM+WIDTH);
    memset(VIDEO_RAM+WIDTH*(HEIGHT-1), 0, WIDTH);
  }
}
 
//Вывод строки, заканчивающейся нуль-символом
void puts(const char *s)
{
  while(*s) {
    //вывод одного символа и переход к следующему
    putchar(*s);
    s++;
  }
}
Добавлено через 1 минуту
Цитата Сообщение от Nekto Посмотреть сообщение
видео-драйвер? О_о По-моему, это просто работа с консолью.
Какая ж это работа с консолью. Это ему нужно самому реализовать функции putchar и.т.п. путём записи в видеопамять
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
08.04.2012, 15:11  [ТС]     Видео драйвер с++ #5
Kuzia domovenok, было бы здорово.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 15:15     Видео драйвер с++ #6
Цитата Сообщение от Hardcore Посмотреть сообщение
Kuzia domovenok, было бы здорово.
Что здорово, ты код из моего сообщения смотрел?
Plazma
5 / 5 / 0
Регистрация: 20.11.2010
Сообщений: 51
08.04.2012, 16:03     Видео драйвер с++ #7
Hardcore, позвольте спросить, что такое tty_attribute ?
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
08.04.2012, 16:14  [ТС]     Видео драйвер с++ #8
Plazma, Точно не помню, но вроде этот атрибут равен 7, и как я полагаю это размер шрифта.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
08.04.2012, 16:21     Видео драйвер с++ #9
Цитата Сообщение от Hardcore Посмотреть сообщение
Мы как бы пишем сами ОС, и вот, это типа драйвер.
извените за вопрос но что значит "как бы пишем", и это в универе?
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
08.04.2012, 16:28  [ТС]     Видео драйвер с++ #10
Plazma, Это цвет фона и шрифта.
Deviaphan
08.04.2012, 16:28
  #11

Не по теме:

Сперва хотел поглумиться, но передумал. Вам и без меня тяжко... будет...

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 16:30     Видео драйвер с++ #12
Цитата Сообщение от Hardcore Посмотреть сообщение
Plazma, Точно не помню, но вроде этот атрибут равен 7, и как я полагаю это размер шрифта.
Какой, к чёрту размер шрифта в текстовом режиме? Тебя что в моём коде не устраивает? Ты его видел? Я например не использовал никогда такую видеопамять в программах раньше, но ведь по логике должно же работать!

Что? укажи конкретную строчку?
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
08.04.2012, 18:50  [ТС]     Видео драйвер с++ #13
Kuzia domovenok, вот эти строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void init_tty()
{
  tty_cursor=0;
  tty_attribute=7;
  //выставить атрибут по-умолчанию
//C АТРИБУТАМИ КАК НЕ ЗНАЮ Я ВООБЩЕ ВПЕРВЫЕ С ВИДЕОПАМЯТЬЮ РАБОТАЮ
}
 
//Смена текущего аттрибута символа
void textcolor(char c)
{
    
  //выставить атрибут
}
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
08.04.2012, 19:39     Видео драйвер с++ #14
Да, повеселило) Я помню так тоже игрался. Причем много чего сохранилось, а вот с видеопамятью ничего нет. Работал так со звуком и с буфером клавиатуры.

Помню, что пишем в регистры, а затем генерируем программное прерывание, это было еще в Borland'е, а там есть int86 в dos.h

Вот как делал аналог gotoxy

C
1
2
3
4
5
6
union REGS regs;
regs.h.ah = 2;
regs.h.dh = y;
regs.h.dl = x;
regs.h.bh = 0;
int86(0x10, &regs, &regs);
А атрибуты символа передаются вместе с символом как его старший байт между прочим. Еще что нибудь вспомню - обязательно сообщу!))
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
08.04.2012, 20:49     Видео драйвер с++ #15
существует 15 возможных атрибутов, атрибут под номером 7 это синий экран, белые буквы.
друзья айтишники, не путайте теплое с мягким, мы пишем не на С++, а на голом Си, на Си без классов. Объясняю, у нас даже нет <iostream>, из за этого мы пишем все это, это называется телетайп.
Kuzia domovenok, как говорил у нас голый Си, и из за этого мы не можем использовать
C
1
memset
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
08.04.2012, 21:16     Видео драйвер с++ #16
Цитата Сообщение от jambas92 Посмотреть сообщение
существует 15 возможных атрибутов, атрибут под номером 7 это синий экран, белые буквы.
друзья айтишники, не путайте теплое с мягким, мы пишем не на С++, а на голом Си, на Си без классов. Объясняю, у нас даже нет <iostream>, из за этого мы пишем все это, это называется телетайп.
Kuzia domovenok, как говорил у нас голый Си, и из за этого мы не можем использовать
C
1
memset
ну вызывайте 16 прерывание ассемблерной вставкой если хотите. По теме, кстати, никто еще ни одной строчки кода толковой не написал. Я не понимаю что вам не нравится? int86?
Я надеюсь хоть функциями доса и биоса можно пользоваться? а то будет очень сложно))
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 21:32     Видео драйвер с++ #17
Цитата Сообщение от jambas92 Посмотреть сообщение
существует 15 возможных атрибутов, атрибут под номером 7 это синий экран, белые буквы.
друзья айтишники, не путайте теплое с мягким, мы пишем не на С++, а на голом Си, на Си без классов. Объясняю, у нас даже нет <iostream>, из за этого мы пишем все это, это называется телетайп.
Kuzia domovenok, как говорил у нас голый Си, и из за этого мы не можем использовать
Код C
1
memset
Ну да, сам то я вообще раньше такими вещами не занимался, просто прочитал задание.
Вот только скажи, почему ж это нельзя использовать memset ?
Какая разница, напишу я так
C
1
2
3
unsigned char* c;
c= VIDEO_RAM;
while (c<VIDEO_RAM+WIDTH*HEIGHT){ *c=symbol; c++;}
Или так
C
1
memset(VIDEO_RAM, symbol, WIDTH*HEIGHT);
Я не вижу разницы. Кто-нибудь видит? Я нет!
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
08.04.2012, 22:30     Видео драйвер с++ #18
Kuzia domovenok, при написании ОС нужно реализовывать все с нуля, и посколько работа с памятю будет написана собственноручно то и memsetа у вас нету
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 22:45     Видео драйвер с++ #19
Цитата Сообщение от aram_gyumri Посмотреть сообщение
Kuzia domovenok, при написании ОС нужно реализовывать все с нуля, и посколько работа с памятю будет написана собственноручно то и memsetа у вас нету
Я ещё раз спрошу, какая разница, вызову я memset или открою в VisualStudio замечательный файл memset.asm и скопирую оттуда следующий код. Присмотрись: ты видишь, чтобы тут использовалось что-то специфичное для ОС??? Почему его запрещено использовать?
Assembler
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
        page    ,132
        title   memset - set sections of memory all to one byte
;***
;memset.asm - set a section of memory to all one byte
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       contains the memset() routine
;
;*******************************************************************************
 
        .xlist
        include cruntime.inc
        .list
 
page
;***
;char *memset(dst, value, count) - sets "count" bytes at "dst" to "value"
;
;Purpose:
;       Sets the first "count" bytes of the memory starting
;       at "dst" to the character value "value".
;
;       Algorithm:
;       char *
;       memset (dst, value, count)
;               char *dst;
;               char value;
;               unsigned int count;
;               {
;               char *start = dst;
;
;               while (count--)
;                       *dst++ = value;
;               return(start);
;               }
;
;Entry:
;       char *dst - pointer to memory to fill with value
;       char value - value to put in dst bytes
;       int count - number of bytes of dst to fill
;
;Exit:
;       returns dst, with filled bytes
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************
 
        CODESEG
 
    extrn   _VEC_memzero:near
    extrn   __sse2_available:dword
 
        public  memset
memset proc \
        dst:ptr byte, \
        value:byte, \
        count:dword
 
        OPTION PROLOGUE:NONE, EPILOGUE:NONE
 
        .FPO    ( 0, 3, 0, 0, 0, 0 )
 
        mov     edx,[esp + 0ch] ; edx = "count"
        mov     ecx,[esp + 4]   ; ecx points to "dst"
 
        test    edx,edx         ; 0?
        jz      short toend     ; if so, nothing to do
 
        xor     eax,eax
        mov     al,[esp + 8]    ; the byte "value" to be stored
 
; Special case large block zeroing using SSE2 support
    test    al,al ; memset using zero initializer?
    jne     dword_align
    cmp     edx,0100h ; block size exceeds size threshold?
    jb      dword_align
    cmp     DWORD PTR __sse2_available,0 ; SSE2 supported?
    je      dword_align
 
    jmp     _VEC_memzero ; use fast zero SSE2 implementation
    ; no return
 
; Align address on dword boundary
dword_align:
 
        push    edi             ; preserve edi
        mov     edi,ecx         ; edi = dest pointer
 
        cmp     edx,4           ; if it's less then 4 bytes
        jb      tail            ; tail needs edi and edx to be initialized
 
        neg     ecx
        and     ecx,3           ; ecx = # bytes before dword boundary
        jz      short dwords    ; jump if address already aligned
 
        sub     edx,ecx         ; edx = adjusted count (for later)
adjust_loop:
        mov     [edi],al
        add     edi,1
        sub     ecx,1
        jnz     adjust_loop
 
dwords:
; set all 4 bytes of eax to [value]
        mov     ecx,eax         ; ecx=0/0/0/value
        shl     eax,8           ; eax=0/0/value/0
 
        add     eax,ecx         ; eax=0/0val/val
 
        mov     ecx,eax         ; ecx=0/0/val/val
 
        shl     eax,10h         ; eax=val/val/0/0
 
        add     eax,ecx         ; eax = all 4 bytes = [value]
 
; Set dword-sized blocks
        mov     ecx,edx         ; move original count to ecx
        and     edx,3           ; prepare in edx byte count (for tail loop)
        shr     ecx,2           ; adjust ecx to be dword count
        jz      tail            ; jump if it was less then 4 bytes
 
        rep     stosd
main_loop_tail:
        test    edx,edx         ; if there is no tail bytes,
        jz      finish          ; we finish, and it's time to leave
; Set remaining bytes
 
tail:
        mov     [edi],al        ; set remaining bytes
        add     edi,1
 
        sub     edx,1           ; if there is some more bytes
        jnz     tail            ; continue to fill them
 
; Done
finish:
        mov     eax,[esp + 8]   ; return dest pointer
        pop     edi             ; restore edi
 
        ret
 
toend:
        mov     eax,[esp + 4]   ; return dest pointer
 
        ret
 
memset  endp
 
        end
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 22:47     Видео драйвер с++
Еще ссылки по теме:

Аудио драйвер, микрофон C++
C++ Логический драйвер
Драйвер для отслеживания обращения к папкам C++

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

Или воспользуйтесь поиском по форуму:
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
08.04.2012, 22:47     Видео драйвер с++ #20
Kuzia domovenok , да это круто. но все же, можно просто проще без memseta
Yandex
Объявления
08.04.2012, 22:47     Видео драйвер с++
Ответ Создать тему
Опции темы

Текущее время: 03:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru