c++, konsola

Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

c++, konsola

Post autor: Undre »

Jak wiemy, przy robieniu programu aka konsola mamy do czynienia z ekranikiem 80x25 (no można przestawić, ale o takowy mi akurat chodzi ) i w momencie kiedy na przykład walnę w pozycji (80,25) putchar(), to ekran idzie w dół. Jakiś pomysł jak to zatrzymać ? I nie chodzi mi tu o funkcje wscroll z Borlanda bo na Borlandzie nie robię. Z góry dzięki za pomysły.
arigo
Użytkownik
Użytkownik
Posty: 852
Rejestracja: 23 paź 2004, o 10:17
Płeć: Mężczyzna
Lokalizacja: Lublin
Pomógł: 28 razy

c++, konsola

Post autor: arigo »

a mozesz jasniej? tzn co chcesz osignac gdy kursor jest na koncu ekranu i nastapi putchar ?
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

c++, konsola

Post autor: Fibik »

Pamiętam ten problem, jeszcze z czasów grzebania się w dosie - o ile się nie mylę, (a mogę się mylić, bo było to jakieś 40 lat temu), to trzeba użyć innej funkcji do wywalania tekstu na ekran - takiej, która nie rusza kursora (kursor chce być widoczny, więc przewija ekran).
Bezpośredni zapis do pamięci ekranu też załatwia sprawę.
Jest także możliwe, że wystarczy ukryć kursor przed wywołaniem funkcji putch.
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

c++, konsola

Post autor: Undre »

A jak sie odwołać do pamięci ekranu ? Myślę, że to rozwiąże problem, wszak nie wiem na czym to polega ... co do zapytania arigo - chcę żeby kursor nie poszedł dalej, bo jak wstawiam znak w pozycji [x,y] to kursor zaraz potem ląduje w [x+1,y], a jak sie konczy zakres x-ow ( czyli walę putchar dla x=80 ) to leci dopozycji [1,y+1] i dlatego wszystko mi sie wtedy przesuwa ...
arigo
Użytkownik
Użytkownik
Posty: 852
Rejestracja: 23 paź 2004, o 10:17
Płeć: Mężczyzna
Lokalizacja: Lublin
Pomógł: 28 razy

c++, konsola

Post autor: arigo »

teraz mniej wiecej rozumiem o co chodzi.
przenosnym rozwiazaniem tego problemu (chociaz nie jakims optymalnym) jest "zmapowanie" ekranu do macierzy znakowej 80x25 i napisanie wlasnych funkcji "putchar" etc ktora dziala na takich tablicach i wykrywa "nielegalne" przejscia kursorai odpowiednio zmienia ta macierz wg naszych zalecen a potem po kazdym takim wywolaniu zrzucac zawartosc tej tablicy na ekran.

ad wypowiezdi Fibika
bezposredni dostep do pamieci ekranu zalatwi sprawe tylko ze takiej funkcjonalnosci nie uzyskasz na poziomie linuxa freebsd windowsa etc gdyz wszystko dziala w trybie chronionym uP wiec magiczne czasy 16bitowego dosa w real mode sie skonczyly ;)

pozdrawiam
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

c++, konsola

Post autor: Fibik »

I. Borland ma funkcję putch() w conio.h, która to załatwia - może jest coś podobnego w console.h lub czymś takim.

II. Ekran (tryb kolorowy) jest zapisany w tablicy pod adresem: 0xB8000000 (segment 0xB800). Jest jeszcze 0xB000 - mono, i 0xA000 - CGA albo coś tam.

char *e = (char*)0xB8000000;

e[0] = 'A'; // litera A jest już w górnym lewym rogu ekranu.
e[1] = 2; // kolor (atrybut) litery A
e[2] = 'B'; // na ekranie widać AB

e[(x+80*y)*2] = 'Q'; // mamy Q w punkcie (x,y) ekranu, x, y

W programie dla DOS to działa (uruchamianym w okienku sys. Windows także).

III. Można jeszcze użyć funkcji z BIOS:
przerwanie 10H
- funkcja 0A - wpisanie znaku w pozycji kursora (bez ruszania kursora)
- funkcja 09 - wpisanie znaku i jego atrybutu w pozycji kursora
ODPOWIEDZ