[tryb tekstowy] Odczyt z ekranu konsoli

0

czy ktos wie, w jaki sposob, bez wstawek assemblerowych, pobrac w c znak z danego miejsca na ekranie (tryb tekstowy) plus kolor czcionki i kolor tla?

0

Tryb 3 (25x80x16)

Bufor zaczyna się od adresu <font color="darkblue">0b800h:0</span>, a dane naprzemiennie oznaczają: znak (kod ASCII), atrybut, znak, atrybut, ...

Aby odczytać znak z 3 wiersza i 10 kolumny liczysz adres (przyjmuję, że lewy górny róg ma współrzędne <font color="darkblue">(0,0)</span>):
(3*80+10)*2 = 500 = 1F4h
Tak więc pod adresem <font color="darkblue">0b800h:1F4h</span> masz znak, a jego atrybut pod <font color="darkblue">0b800h:1F5h</span>.

0

Witaj Marooned

Czy mógłbyś podać jakiś gotowy przykład jak to wykonać praktycznie?

pozdrawiam

0

Czy mógłbyś łaskawie podać praktyczne warunki? Marooned napisał to dla trybu rzeczywistego DOS, jeśli pracujesz pod muzealnym kompilatorem Borlanda, to on miał makro, którego mógłbyś użyć tak:

char znak = *(char*)MK_FP(0x0B800,0x1F4);

żeby odtworzyć dokładnie przykład Marooneda.

Dałoby się to też inaczej:

char* ekran = (char*)MK_FP(0x0B800,0);
// ...
char znak = ekran[ (3*80+10)*2 ];

dałoby się inaczej... ale podaj konkrety, jeśli oczekujesz konkretów.

0

Aktualnie korzystam z DEVC++ (win) i GCC pod (linux)

Do czego to konkretnie mi potrzeba? Potrzebuje z "ekranu" skopiować sobie jakiś jego fragment, powiedzmy że dokładnie ten fragment, na którym mam wyświetlić jakiś komunikat mojego programu (np. "błąd wprowadzenia danych")... Gdy komunikat nie będzie potrzebny, zastąpie ten nadpisany fragment "oryginalną", wcześniejszą zawartością.
Pewnie to co chcę uzyskać to jakaś herezja, bo pewnie jest na to łatwiejszy sposób (ale tak właśnie zrobiłem za czasów 8-bitowców (ach te Atari) i sposób okazał się być działający)
Zależy mi zdecydowanie, aby móc wykonać powyższy trick pod linuxem... ale pewnie to nie takie proste? Zgadłem?

Jak wygląda sprawa adresów bufora ekranu w innych trybach tekstowych pod WIN oraz pod LINUX ?

Pozdrawiam i dziękuję za pomoc.

0

Jak wygląda sprawa adresów bufora ekranu w innych trybach tekstowych pod WIN oraz pod LINUX ?

nie ma ich.

..a wlasciwie, sa -- ale nie sa stale. dla win, masz caly szereg funkcji z WINAPI do obslugi konsoli - np. http://msdn.microsoft.com/en-us/library/ms686047(VS.85).aspx ktorym mozesz sterowac kolorkami, itd. zerknij sobie na drzewko-spistresci po lewej

na linuxie zas - nie ma "okna konsoli", tylko jest TERMINAL. tzn. ze Twoj program wysyla ciagi znakow do KLIENTA, a on sam sobie decyduje jak je wyswietlic. ...i ze Twoj program po prostu nie ma niczego takiego jak "bufor ekranu tekstowego". jelsi klient obsluguje, to mozna nim sterowac sekwencjami kontrolnymi VT100/100+/400/400+ [o ile nie pokrecielm] i to przez nie ustawia sie kolory albo wysyla komendy przesuniecia kursora. z tego co pamietam ktoras-tam komenda pozwala zażądać od klienta zwrocenia znaku wyswietlanego na pozycji x,y.. ale moge sie mylic, to bylo dawno..

0

aha...

A gdyby zrobić sobie swój własny bufor, który będzie "przerzucany" na ekran (coś na wzór podwójnego buforu dla grafiki 3D) po wykonaniu operacji, które mu zadam?? Jaką wg Ciebie będzie to wydajność i sens działania??? Opłaci się?

pozdrawiam

0

oplaci sie o tyle, ze bedziesz mial 'kopie' tego co user niby-widzi. ale tak na prawde CO on widzi, to zalezy od tego jak to terminal wyswietli..

naprawde-naprawde, pod konsola, bardzo rzadko kiedy trzeba odczytywac jej zawartosc. co Ty wlasciwie chcesz osiagnac? bardzo mozliwe ze podchodzisz do tego z 'najprostszej strony' ktora okazala sie wlasnie najgorsza;)

0

Jak "to coś" ma być i na Windows i na Linuksa, to pomyśl o bibliotece ncurses i będziesz miał wszystko co trzeba. Chyba tak to najprościej widzę.

0

Quetzalcoatl: prawdopodobnie masz rację z tym, że wybrałem 'najprostsza strone' :) każdy w końcu na czymś musi sie uczyć ;D

Ranides: biblioteka ncurses? przyjże sie temu i dam znać co udało mi się z tego wyłuskać.

dziękuje za pomoc oraz za poświęcony czas.

0

Ja nawet nie pamiętałem, że 5 lat temu pisałem takiego posta ;) ale widzę, że koledzy wszystko ładnie wyjaśnili.

1 użytkowników online, w tym zalogowanych: 0, gości: 1