Tryb VESA 640*480 w TP
Tryb VESA jest trybem 640*480*256 kolorów dzieli monitor na strony. Przede wszystkim pamięć obrazu zorganizowana jest w ten sposób, iż podzielona jest na tzw. bitplany po 64kB.W jednej chwili zawsze mamy dostep do jednego - jest to tzw. okno zaczynające sie od adresu
A000h:0000h i kończące się na A000h:FFFFh, czyli tylko jeden segment. Ponieważ wielkość segmentu ma 64kB, wynikałoby, że maksymalnie dostepnym trybem bylby 13h (320x200 przy 256 kolorach bo 320x200 = 64k), bowiem caly ekran odpowiada wtedy 64kB. W wyższych trybach, jak np. w trybie VESA 101h - 640x480 przy 256 kolorach logiczne jest, że pamięć obrazu będzie miała 640*480=307Kb.
Włącza się go w ten sposób:
A wyłącza w ten:
No i oczywiście jeszcze jakaś funkcja:
Nie może zabraknąć też funkcji rysowania lini:
No i to by było na tyle.
A000h:0000h i kończące się na A000h:FFFFh, czyli tylko jeden segment. Ponieważ wielkość segmentu ma 64kB, wynikałoby, że maksymalnie dostepnym trybem bylby 13h (320x200 przy 256 kolorach bo 320x200 = 64k), bowiem caly ekran odpowiada wtedy 64kB. W wyższych trybach, jak np. w trybie VESA 101h - 640x480 przy 256 kolorach logiczne jest, że pamięć obrazu będzie miała 640*480=307Kb.
Włącza się go w ten sposób:
A wyłącza w ten:
No i oczywiście jeszcze jakaś funkcja:
var
y,x,ofset:word;
c:integer;
ktory:word;
Procedure putpixel(x,y:word; c:byte);
begin
ktory:=round(int(y / 65535/640));
asm
mov ax, 4F05h
xor bx, bx
mov dx, ktory
int 10h
end;
ofset:=640*y+x;
asm
mov ax, 0A000h
mov es, ax
mov bx, word Ptr">ptr ds:[ofset]
mov al, c
mov byte Ptr">ptr es:[bx], al
end;
end;
y,x,ofset:word;
c:integer;
ktory:word;
Procedure putpixel(x,y:word; c:byte);
begin
ktory:=round(int(y / 65535/640));
asm
mov ax, 4F05h
xor bx, bx
mov dx, ktory
int 10h
end;
ofset:=640*y+x;
asm
mov ax, 0A000h
mov es, ax
mov bx, word Ptr">ptr ds:[ofset]
mov al, c
mov byte Ptr">ptr es:[bx], al
end;
end;
Nie może zabraknąć też funkcji rysowania lini:
PROCEDURE line_(x1,y1,x2,y2:single;kolor:integer);
var
x,y:single;
begin
if (x1<x2) then
begin
x:=x1;
repeat
x:=x+1;
y:=((y2-y1)/(x2-x1))*(x-x1)+y1;
putpixel(round(x),round(y),kolor);
until x = x2;
end;
if (x1>x2) then
begin
x:=x1;
repeat
x:=x-1;
y:=((y2-y1)/(x2-x1))*(x-x1)+y1;
putpixel(round(x),round(y),kolor);
until x = x2;
if (y1=y2) then
begin
if (x2>x1) then
begin
y:=y1;
x:=x1;
repeat
putpixel(round(x),round(y),kolor);
x:=x+1;
until x = x2;
end;
if (x1>x2) then
begin
x:=x1;
repeat
putpixel(round(x),round(y),kolor);
x:=x-1;
until x = x2;
end;
end;
end;
if (x1=x2) then
begin
x:=x1;
if (y2>y1) then
begin
y:=y2;
repeat
y:=y-1;
putpixel(round(x),round(y),kolor);
until y = y1;
end;
if (y1>y2) then
begin
y:=y1;
repeat
y:=y-1;
putpixel(round(x),round(y),kolor);
until y = y2;
end;
end;
end;
var
x,y:single;
begin
if (x1<x2) then
begin
x:=x1;
repeat
x:=x+1;
y:=((y2-y1)/(x2-x1))*(x-x1)+y1;
putpixel(round(x),round(y),kolor);
until x = x2;
end;
if (x1>x2) then
begin
x:=x1;
repeat
x:=x-1;
y:=((y2-y1)/(x2-x1))*(x-x1)+y1;
putpixel(round(x),round(y),kolor);
until x = x2;
if (y1=y2) then
begin
if (x2>x1) then
begin
y:=y1;
x:=x1;
repeat
putpixel(round(x),round(y),kolor);
x:=x+1;
until x = x2;
end;
if (x1>x2) then
begin
x:=x1;
repeat
putpixel(round(x),round(y),kolor);
x:=x-1;
until x = x2;
end;
end;
end;
if (x1=x2) then
begin
x:=x1;
if (y2>y1) then
begin
y:=y2;
repeat
y:=y-1;
putpixel(round(x),round(y),kolor);
until y = y1;
end;
if (y1>y2) then
begin
y:=y1;
repeat
y:=y-1;
putpixel(round(x),round(y),kolor);
until y = y2;
end;
end;
end;
No i to by było na tyle.



@Szczawik: Jak ci nie pasuje tekst, to go nie oglądaj i nie dodawaj zbędnych komentarzy. Jak dla mnie ten tekst jest bardzo ciekawy jako uzupełnienie kursu pisania własnego OS'a w Pascalu. Jeśli według Ciebie wszystko na tym świecie, co interesujące, jest najnowsze, to zacznij patrzeć z dołu a nie z góry na świat komputerów i informatyki, ok?
PS: Na jakiej licencji jest ten tekst? Bo jeśli Open Source itp. to go zamieszczę na mojej stronie o pisaniu własnego OS'a w Pascalu;
W Delphi rysowanie linii zajmuje 2 linie kodu (Canvas.MoveTo, Canvas.LineTo), a powyżej.. no cóż, trochę więcej. Nie wierzę, że ktoś, umiejący programować, siada do kompilatora, by osiągnąć satysfakcję z narysowania wielokąta.
Napisz w Turbo Pascal program wielowątkowy lub współpracujący z innymi aplikacjami. O, sorry - zapomniałem, że się nie da. DOS nie jest wielozadaniowy, a tym bardziej wielowątkowy. Nie ma obsługi schowka, współczesnych sterowników sprzętu, wszystkich funkcji do tworzenia interfejsu graficznego, domyślnie wbudowanej obsługi sieci, ani nawet obsługi tak ogromnych zasobów, jakie oferują współczesne komputery. Jedyne co ma, to ograniczenia: szybkości, dostępu, rozmiaru pamięci; a także braki możliwości. Pisanie we współczesnych kompilatorach pod współczesne systemy (bez znaczenia czy to Linux czy Windows, czy inny OS) nie zabiera Ci żadnej z możliwości Turbo Pascala dla DOSa. Żadnej - po prostu niektóre osiąga się w bardziej cywilizowany sposób. W zamian za to, daje ci szeroką paletę nowych, z których możesz (nie musisz!) korzystać.
Jeśli Cię chemik143 nie przekonałem - Twoja sprawa, pisz w czym chcesz. Jednak wątpię, byś przyszłemu pracodawcy przesłał CV, napisane na maszynie do pisania ("bo można skleić"), niż w pliku z dokumentem (mimo opcji: "szlag trafia dysk albo coś i po zabawie").
Jak dla mnie dalsza dyskusja chyba nic nowego nie wniesie, więc kończę temat.
A kto powiedział ze muszę pchać informatykę do przodu?? Jak już to interesuje się chemią, a programowanie w TP i zgłębianie jego tajników a także osiąganie jakichś celów daje bardzo dużo satysfakcji;) I myślę, że chodzi o to, żeby miło spędzić czas a nie prowadzić dziki bieg ku "lepszej" przyszłości.
Nie taki aż archaiczny - gierkę asteroids można było zrobić
Powiem więcej, przez takich właśnie ludzi, informatyka nie rozwija się tak szybko jakby mogła, bo całe tłumy newbiesów trafiają na ścianę, bo w tutorialu Turbo Pascala port COM obsługuje się przez dostęp bezpośredni, a w systemach Windows w sposób bardziej elegancki, za to bezpośredni nie zadziała w ogóle. Przecież nie zrobiono takich zmian, by utrudniać ludziom życie, tylko wprowadzać cywilizowane rozwiązania.
A gotowe moduły do VESA często nie działają, bo nawet same one już ze starości bywają niekompatybilne z aktualnymi układami graficznymi (które nawet jak wspierają VESA, to często w różnego rodzaju trybach zgodności wstecznej).
A co do artykułu... może sie komuś przyda, kto wie:) W necie są gotowe moduły do VESY ale wszystkie jakieś wadliwe. Chcesz coś zrobić dobrze, to zrób to sam.
@Autor tekstu: Popraw formatowanie tekstu i będzie ok.
Po drugie zastanów się, ile osób skorzysta z Twojego kodu: Turbo Pascal zakończył rozwój prawie 15 lat temu i osoby, które w nim piszą pewnie w 90% robią to w celach akademickich (więc tego nie potrzebują, bo im używać tego nie kazano; w przeciwnym wypadku mieliby to podane przez prowadzącego). Druga połowa osób, której to się może przydać, to osoby, piszące na przykład własny OS - ich wiedza jest znacznie wyższa i takie rzeczy potrafią znaleźć samodzielnie bez większych problemów.
Współcześnie korzysta się z trybów graficznych, oferowanych przez system operacyjny (zależnych od monitora, karty, sterowników), a nie włączanych samodzielnie przerwaniami BIOS. Kto połasi się na 640*480 w 256 kolorach, jak standardem już od wielu, wielu lat są rozdzielczości daleko poza SVGA, o VESA nie wspominając, w 24 bitowym trybie kolorów.
Jak dla mnie istnienie tego tekstu jest bez sensu. Nie przeczę, że jest poprawny, ale ciekawy to on był dekadę, dwie temu.