proc. Cleardevice, ewentualnie stronicowanie

0

Mam kolejne pytanko dotyczace grafiki. jak napisac procedure cleardevice ktora blyskawicznie czysci ekran? bo czyszczenie pixel po pixelu dosc dlugo schodzi a podobno sa jakies instrukcje w asemblerze blyskawicznie zerujace banki pamieci. czy ktos cosik wie na ten temat?? No i jesli kto by wiedzial jak zaiplementowac stronicowanie ekranu bylbym wdzieczny.

0

A co ty chcesz czyscic?? Canvas'a??

0

A co ty chcesz czyscic?? Canvas'a??

A co to canvas ? ? ?
nie no chce po prostu szybko wyczyscic ekran

0

Podaj może jakieś szczególy, w czym to chcesz mieć. Bo jeśli w pascalu przy module graph, to jest właśnie funkcja cleardevice, która czyści ekran.

0

Podaj może jakieś szczególy, w czym to chcesz mieć. Bo jeśli w pascalu przy module graph, to jest właśnie funkcja cleardevice, która czyści ekran.

Wiem ze taka jest, ale ja sobie napisalem wlasny prymitywny tryb graficzny (800x600 , 24 bit koloru) i tam mi jest potrzebne samemu napisac to cleardevice. przydaley by sie tez bardzo procedury setactivepage i setvisualpage... albo zrodlo do graph.tpu to moze sobie sam skumam jak to dziala i przerobie.

0

[ot]
Źródło grapha niewiele ci da. Potrzebujesz zródło sterownika bgi obsługującego taki tryb

0

Nie wiem czy Ci to zadziala no ale jesli nie masz lepszych pomyslow to moze sprobuj tak:
procedure linia(x:word);assembler;
asm
mov ax,4f06h
mov bx,0
mov cx,x
int 10h
end;

wywolanie linia(800) powinno ustawic dlugosc linii na 800 i wtedy liczba linii bedzie taka ile tylko da vram.

 procedure przesun(x,y:integer);assembler;

asm
mov ax,4f07h
mov bx,0
mov cx,x
mov dx,y
int 10h
end;

Ta procedura powinna przesunac ekran do punktu (x,y) - to znaczy powinien on stac sie punktem (0,0) na ekranie.
Zatem wywolanie przesun(0,0) pokaze pierwsze 800x600 pixli natomiast
przesun(0,600) powinno dac drugie to znaczy drugi ekran a przesun(0,1200) - trzeci i tak dalej ile tylko da vram. W ten sposob dostaniesz Twoje upragnione visualpage:))))

Teraz czyszczenie. W trybie 24 bitowego koloru na 800x600 jeden ekran zajmie az 21 bankow i jeszcze kawalek 22-ego. Z tego powodu moze lepiej drugi ekran sobie ustalic nie ma linię 600 ale na 601 (chodzi o to zeby ekran konczyl sie wraz z bankiem zeby przy czyszczeniu nie trzeba bylo dzielic banku choc mozna to na partego zrobic i bedzie troche oszczedniej - dokladnie o jedna linię)
const vga:word=$a000;// ja nie wiem czy zawsze to jest ten adres
procedure clearbank(bank:word);
asm
mov ax, $4f05
mov bx,0
mov dx,bank
int 10h
push es
mov cx, 32769;
mov es,[vga]
xor di,di

mov al,0
mov ah,al
rep stosw
pop es
end;

No i teraz jak chcesz wyczyscic piewsza strone (linie od 0 do 599) musisz wywolac for i:=0 to 21 do czyscbank(i);

dla drugiej strony to bedzie dla i od 22 do 43 no i tak dalej.

Nie wiem czy Ci to pomoze, nie gwarantuje ze wszytsko zadziala, ja to specjalnie dla Ciebie odgrzebalem - od dawna nie piszę w turbo pascalu i nawet slabo pamietam jak ja to pisalem i jak tego uzywalem
no ale powodzenia :)))

0

Heh , za długo pisałem i logowanie poszało ........ no , gdzies poszło :)
Nie wiem czy mnie poznajecie po charakterze pisma ale ten anonim na gorze to właśnie ja ;p

A tak swoją droga Wyder, to to bedzie Ci wolno dzialaoło z tymi bankami. Jelsi juz chcesz robic to pod dosem to polecalbym djgpp (c++ lub pascal do wyboru) i tam masz gotowa bibliotekę allegro operujaca na liniowym odwzorowaniu ram<->vram co jest duzo szybsze.

0

Wielkie dzieki miszczu! widze ze na tym forum to chyba tylko ty sie znasz na programowaniu!! Jak tylko wezne sie za robienie tego programu to sprawdze czy to zadziala i dam ci znac! To bedzie gdzies tak do tygodnia, bo musze sie uporac z innymi przedmiotami.... robie to pod dosem bo musze zrobic w pascalu na zaliczenie. jak tylko sie z tym uporam koncze z pascalem i przucam sie na c. dobra ide spac. jak to zaimplementuje to napisze czy dziala! jeszcze raz dzieki!

0

Ojoj - no nie przesadzaj . Tu sporo osob zna sie na wielu rzeczach dotyczacych programowania bardzo dobrze. Tyle ze wiekszosc jednak pisze pod windows i moze nawet nie zetknela sie z programowaniem pod dosem bo to stare dzieje:)

0

Aha, ten anonim wyzej to ja - wyder. to jeszcze jedno pytanko z ciekawosci: O co chodzi z tymi zurawiami ? Pozdrawiam!
cholera co to ma byc ? jeden post na 15 min ? >?? ??

Wiem ze wiele osob sie zna. Moze nie chodzi o to ze umiesz ale o to ze jestes sklonny pomoc! Specjalnie dla nieznajomej osoby grzebac za jakimis starociami! szacunek! pozdrawiam!

0

Chcialbym oficjalnie podziekowac tutaj Marmarowi!! stary wielkie dzieki!!! wszystko dziala !! dokladnie o to mi chodzilo!!! wyrazy uznania, szacunku i wdziecznosci pod adresem tego prze goscia!!!
o co chodzi z tymi zurawiami? ? ?

0

Z żurawiami chodzi o ostrożność wobec przekonania, że jakies rozwiązania są jedynie słuszne a inne są gorsze:)

0

hej jescze jedno pytanie Marmarze! czy procedura line okresla dlugosc lini czy miejsce w ktorym sie ona ma konczyc liczac od zera? bo na drugiej stronie u gory sie mi pojawia maly pasek z wczesniejszej strony, siegajacy polowy dlugosci, i nie wiem czy to jest spowodowane

0

Połowy długosci? A czy to czasem nie jest pasek wysokosci 1 pixelka siegajacy : 64102422-8006003=1792
1792 div 3=597 a wiec 597-ego pixelka?
Jesli tak to znaczy ze nie przeczytales dokladnie tego co napsialem. ;) Mianowicie, poniewaz 22 banki siegaja troche dalej niz jeden ekran to zeby nie wprowadzac dodatkowego kodu do funcji czyszczenia zaproponowalem Ci bys drugi ekran zaczal nie od 600-ej linii a od 601 , spisujac jedna linie na strate i pozbywajac sie problemu.
Jesli to inny pasek (grubszy niz 1 pixelek i siegajcy nie 597 pixelka)to nie bardzo wiem skad sie bierze. Napsiz cos wiecej moze cos zaradzimy.

0

Mam problem z tym kasowaniem bankow, mianowicie uruchamiam to w petli dla okreslonej liczby bankow ale kasuje sie tylko jeden waski pasek na ekranie ... A co do tych stron to juz mi dziala ok, w zasadzie zostalo tylko to czyszczenie. Ale z tym juz sobie moze jakos poradze. Dzieki Marmar!

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