Автор
|
Тема: Вывод прямо на экран
|
Feofan |
опубликован 16-01-2002 23:50 MSK
Как в дос выводить прямо на экран напрямую?
|
Kosha
|
опубликован 17-01-2002 12:16 MSK
Если про графику - то в режимах до 13h включительно - память по адресу A000h и далее. Видеобуфер называется. 64К. Если же ставишь SVGA-режим, тут начинается гемор. Придется через BIOS передвигать фрейм проецирования в память... |
rivitna
|
опубликован 17-01-2002 12:16 MSK
В зависимости от графического режима! В каком режиме? |
rivitna
|
опубликован 17-01-2002 12:37 MSK
> Если про графику - то в режимах до 13h > включительно - память по адресу A000h и > далее.Не так все просто, увы. В режимах 0Dh, 0Eh, 10h, 12h видеоданные хранятся битовыми слоями, то бишь вначале нулевые биты пикселов, затем первые и т.д. То есть нужно еще уметь программировать видеоконтроллер напрямую, через регистры. В режиме память имеет линейную структуру, каждому пикселу соответствует свой байт. > Видеобуфер называется. 64К. Не очень правильно. Если говорить про VGA, то видеопамять имеет размер 256кб. Для графических режимов начальный сегмент 0A000h, для текстовых - 0B800h > Если же ставишь SVGA-режим, тут начинается > гемор. > Придется через BIOS передвигать фрейм > проецирования в память... Да, придется немного потрахаться! Вывод через окно, максимальный размер которого 64к (сегмент 0A000h). И так через это окошко по всему экрану (а-ля принцип работы с памятью EMS) Хотелось бы знать про каким режимом собственно ты интересуешься? А еще лучше найди готовые библиотеки или книжки? Самому писать напряжно. Я писал где-то примерно месяц на АСМе для режимов 10h и 12h. Можешь взять их за основу, только адаптируй для вызова через С. |
rivitna
|
опубликован 17-01-2002 12:39 MSK
> В режиме память имеет линейную структуру, > каждому пикселу соответствует свой байт.пропустил номер режима :( Я имел в виду режим 13h
|
rivitna
|
опубликован 17-01-2002 12:51 MSK
Блин, тороможу, наверное пора спать :((((Некорректно сформулировал: > вначале нулевые биты пикселов, затем > первые и т.д. Битовые слои располагаются в одном адресном пространстве - по адресу одного байта располагаются байты всех цветовых слоев. Выбор слоя определяется значениями регистров адаптера. |
Feofan
|
опубликован 17-01-2002 22:54 MSK
VGA режим... 80х25 Нужно просто слова выводить ну цвета фона менять. Что за библиотеки? и где их взять?Еще в догонку вопрос: подключаю graphics.h но функции от туда не юзятся? линковщик говорит "Андефинед символ ...и названия функций" че за байда? |
clay_pigeon
|
опубликован 17-01-2002 23:04 MSK
Feofan, а graphics.lib подключил? |
Feofan
|
опубликован 17-01-2002 23:17 MSK
Не %) глупый вопрос конечно, а как её подключать? |
Heromantor
|
опубликован 17-01-2002 23:58 MSK
Для 80x25, сегмент 0xB800, там сначала храниться атрибуты символа(вроде 4-бита цвет фона, 4-бита цает символа, если не включен blink, иначе на какой-то цвет приходиться 3 бита) потом сам символ, в ощем есть такая вещь TechHelp6.0 наз-ся посмотри там, да это везде есть... |
rivitna
|
опубликован 18-01-2002 07:25 MSK
Чтобы не таскать graphics.lib из-за пустяка, напиши сам процедурки на встроенном ассемблере в таком духе:/* функция вывода строки с атрибутами (работает во всех текстовых режимов) */ void outtextxy(int x, int y, char *string, int color) { asm { push es push si push di mov ax,40h mov es,ax mov al,es:[4Ah] mul BYTE PTR [y] add ax,[x] shl ax,1 mov di,ax mov ax,0B800h mov es,ax mov si,[string] mov ah,BYTE PTR [color] CharLoop: lodsb or al,al jz Exit stosw jmp CharLoop Exit: pop di pop si pop es } }
|
Feofan
|
опубликован 19-01-2002 13:57 MSK
Спасибо rivitna :) но она вывыдит что угодно только не мою строку:) почему в Борланд С 3.0 не хочет компилироваться (не хочет метки как таковые признавать)? хотя в 5.0 все ок! И еще вопрос, все таки как .lib-ы подключать? |
rivitna
|
опубликован 19-01-2002 15:19 MSK
> ...она вывыдит что угодно только не мою > строку:)Ты компилишь в дальней модели (Compact, Large или Huge), то бишь с дальними указателями. Я не думаю, что у тебя есть крайняя необходимость в такой модели памяти. Ставь "Small", не прогадаешь, да и программка побыстрее будет работать и поменьше в размерах. > почему в Борланд С 3.0 не хочет > компилироваться (не хочет метки как > таковые признавать)? хотя в 5.0 все ок! Во встроенном асме BC 3.0 метки не должны быть в блоках asm в отличие от BC 5.0. > И еще вопрос, все таки как .lib-ы > подключать?
graphics подключается элементарно! Для BC 3.0 выбрать Options\Linker\Libraries... поставить галочку Graphics library и укажи заголовочный файл: #include <graphics> чтобы прилинковать допустим mylib.lib надо откомпилить в BC, получить файл *.obj а затем из командной строки запустить типа такого bcc sample.obj mylib.lib Если у тебя немного работы с графикой не стоит связываться с graphics.lib, лучше самому написать эти функции. В этом случае в твоей проге меньше будет лишнего кода и опять же работать будет побыстрее. Я подправил текст процедурки, так чтобы она компилилась в BC 3.0 и во всех моделях памяти. void outtextxy(int x, int y, char *string, int color) { #if !(defined(__TINY__) |
rivitna
|
опубликован 19-01-2002 15:21 MSK
Не влезло :(void outtextxy(int x, int y, char *string, int color) { #if !(defined(__TINY__) |
rivitna
|
опубликован 19-01-2002 15:28 MSK
Символ "вертикальная черта не передается" :((( замени все "?" на этот символvoid outtextxy(int x, int y, char *string, int color) { #if !(defined(__TINY__) ?? defined(__SMALL__) ?? defined(__MEDIUM__)) asm push ds #endif asm mov ax,40h asm mov es,ax asm mov al,es:[4Ah] asm mul BYTE PTR [y] asm add ax,[x] asm shl ax,1 asm mov di,ax asm mov ax,0B800h asm mov es,ax #if defined(__TINY__) ?? defined(__SMALL__) ?? defined(__MEDIUM__) asm mov si,[string] #else asm lds si,[string] #endif asm mov ah,BYTE PTR [color] _CharLoop: asm lodsb asm or al,al asm jz _Exit asm stosw asm jmp _CharLoop _Exit: #if !(defined(__TINY__) ?? defined(__SMALL__) ?? defined(__MEDIUM__)) asm pop ds #endif }
|
Feofan
|
опубликован 19-01-2002 19:07 MSK
Большое СПАСИБО!!! |
lamo
|
опубликован 19-01-2002 19:57 MSK
не могу не написать.rivitna, красиво ). этак ностальгией дунуло ... зы. дополнение. если вдрук CGA - там есть такое понятие "снег". вобщем там когда луч возвращается - тебе нужно его отслеживать. когда в текст. режиме напрямую в видеопамять пишеш на цга наблюдается "аффехт снега" такскать.
ззы. если не секрет, где это тебе понадобилось ? или ты студент )?
|
Feofan
|
опубликован 19-01-2002 20:59 MSK
Студент:) он самый:) |