Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Как скопировать часть экрана в текстовом режиме?

Автор: kornet 11.03.2008 21:16

Здравствуйте! Можно ли как то с помощью процедур Паскаля или ассемблера в текстовом режиме скопировать часть экрана и сохранить её (в графического режиме для этого существует процедура GetImage из модуля Graph)? Заранее спасибо за ответ.

Автор: klem4 11.03.2008 22:28

Используй видеопамять.

Автор: Гость 12.03.2008 2:11

Цитата(klem4 @ 11.03.2008 18:28) *

Используй видеопамять.


Спасибо. Я нашёл на форуме несколько тем по поводу использования видеопамяти, но такой способ не работает во FreePascal'e.
type bytear = array [1..4000] of byte;
var arr : bytear absolute $B800:$0000;
- не компилируется, компилятор выдает ошибку <Syntax Error, ";" expected but ":" found >. Вопрос: как обратиться к видеопамяти с помощью FreePascal?

Автор: volvo 12.03.2008 2:24

Используя Go32V2 DOSExtender. Иначе FPC не воспринимает привязку Absolute к адресу в памяти, только к другой переменной...

Автор: klem4 12.03.2008 2:45

kornet

Советую покапаться в rtl.pdf, вот что я смог вынести из копания за пару минут:


uses video;

const
my_text = 'Hello, World!';

var
i: Byte;

begin
InitVideo;
for i := 1 to length(my_text) do
VideoBuf^[i - 1] := ord(my_text[i]) + ($07 shl 8);
UpdateScreen(false);
DoneVideo;
end.

Автор: volvo 12.03.2008 2:50

Кстати, kornet, ты в программе Crt используешь? А то Video можно применять только тогда, когда не используется Crt, иначе будут глюки... yes2.gif

Автор: kornet 12.03.2008 3:46

Цитата(volvo)
Используя Go32V2 DOSExtender. Иначе FPC не воспринимает привязку Absolute к адресу в памяти, только к другой переменной...

Не хочет компилировать в режиме Go32V2 DOSExtender. Жалуется на то, что не может найти модуль System.ppu, хотя он есть в папке FPC\2.2.0\units\i386-win32\rtl и в Directories этот адрес указан.
Пишет : PPU Loading D:\FPC\2.2.0\units\rtl\System.ppu.
PPU is compiled for other target.
test2.pas(1,1) Fatal: Can't find unit System used by program;

Цитата(klem4)
kornet
Советую покапаться в rtl.pdf, вот что я смог вынести из копания за пару минут:

Спасибо, почитаю. Этот способ работает.

Цитата(volvo)
Кстати, kornet, ты в программе Crt используешь? А то Video можно применять только тогда, когда не используется Crt, иначе будут глюки...

Вообще то я хочу разработать несколько объектов окон(типа тех, что во FreePascal), чтобы их можно было передвигать, изменять их размеры, закрывать и т.д., для использования в других программах. Для этого, мне и надо, чтобы можно было сохранять часть экрана - для того, чтобы запоминать то, что находится под окном.

Автор: andriano 12.03.2008 12:32

Цитата(kornet @ 11.03.2008 23:46) *
Не хочет компилировать в режиме Go32V2 DOSExtender.
Можно отмаппить функциями DPMI область видеопамяти в адресное пространство программы. Но, честное слово, проще это не будет. По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.

Автор: kornet 13.03.2008 0:01

Цитата(andriano)
По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.
Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.

Автор: andriano 13.03.2008 0:34

Цитата(kornet @ 12.03.2008 20:01) *

Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.

Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет. Но ведь у тебя задача получить доступ к видеопамяти, а не использовать определенную конструкцию языка.

Автор: kornet 13.03.2008 1:08

Цитата(andriano @ 12.03.2008 19:34) *

Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет.

Вообще то я спрашивал, как настроить FreePascal, чтобы он работал в режиме Go32V2 DOSExtender. Но, допустим, я не смогу его настроить. Мог бы ты написать, какими функциями DPMI я должен пользоваться или где я могу про это прочитать. Спасибо.

Автор: volvo 13.03.2008 1:27

Цитата
Вообще то я спрашивал, как настроить FreePascal, чтобы он работал в режиме Go32V2 DOSExtender.
Вообще-то ты толком объясни, чего хочешь-то? Ты хочешь из-под WinNT пользоваться Go32V2? (Компилятор какой качал? Для Win32? Судя по пути, указанному тобой, так и есть...) Не будет этого:
Цитата(Offsite)
The latest release version is 2.0.4 Please keep in mind that this package isn't supposed to work in Windows NT/2000/XP.
, с ним можно работать под чистым ДОСом. Обрати также внимание на соответствие версии компилятора, если у тебя вторая ветка - ты огребешь столько проблем с Go32V2, что лучше и не начинай...

Автор: kornet 13.03.2008 2:14

Цитата(volvo @ 12.03.2008 20:27) *

Вообще-то ты толком объясни, чего хочешь-то? Ты хочешь из-под WinNT пользоваться Go32V2? (Компилятор какой качал? Для Win32? Судя по пути, указанному тобой, так и есть...) Не будет этого:
, с ним можно работать под чистым ДОСом. Обрати также внимание на соответствие версии компилятора, если у тебя вторая ветка - ты огребешь столько проблем с Go32V2, что лучше и не начинай...


Да, качал для Win32. И хотел бы все программы и модули компилировать в нём. Вобщем, я понял, что для обращения к видеопамяти в Windows легче и лучше всего пользоваться модулем video.ppu, но при этом придется отказаться от использования модуля crt(но судя по тому, что я прочитал в руководстве, в video.ppu имеются те же и другие подпрограммы и переменные, которые есть в crt, и можно пользоваться ими). Спасибо всем, еще раз, за советы.

Автор: andriano 14.03.2008 2:48

Цитата(kornet @ 12.03.2008 22:14) *
...что для обращения к видеопамяти в Windows легче и лучше всего...
Нич-чего не понимаю!
В Windows обращаться к видеопамяти вообще безыдейно.
До сих пор я был уверен, чо речь идет имено о DOS, исходя из этого и писал.
В DOS требуется вполне конкретное железо, соответственно, можно гарантировать, что номера регистров, способов работы с ними, адресов видеопамяти и т.п. при работе программы идентичны вне зависимости от того, где и когда бы эта программа ни запускалась.
Windows изначально предполагает иное. Поэтому непосредственная работа с видеопамятью - дело гиблое и бесперспективное.

Автор: sheka 19.08.2010 2:24

Цитата
type bytear = array [1..4000] of byte;
var arr : bytear absolute $B800:$0000;

Так что, получается этим под виндосом пользоваться нельзя?
(у меня ФриПаскаль, ОСь ХРюша или Вин7)

Т.е. надо качать ТП и на ХРюше работать, да?

Автор: volvo 19.08.2010 3:01

Цитата
Так что, получается этим под виндосом пользоваться нельзя?
Получается, что нельзя. Если б ты сразу задал вопрос в разделе "32-битные компиляторы" - тебе бы сразу сказали, что обращение к видеопамяти напрямую - не их сильная черта.