Obsługa graficzna własnego systemu

1

Witajcie.

Ostatnio zacząłem się interesować systemami. Wykonałem jeden na podstawie poradnika z tej stronki, lecz mam pytanie: jak można by było dodać jakąś grafikę do niego ?
Chociażby wyświetlanie jednego piksela ;-)
W Internecie jest o tym nie za dużo informacji (znalazłem jakieś 2 linki prowadzące na Wikipedię, ale tam było tylko coś (dla mnie) niezrozumiałego w bodajże C).
Wiecie coś na ten temat ?
Tylko błagam, nie piszcie, że to za trudne, ponieważ ja to wiem.
Po prostu chcę się czegoś nowego nauczyć.

Edit:
Tryb VESA 640*480 w TP
Jak myślicie, takim sposobem pójdzie ?

0

Użyj trybu 13h jest najprostszy. 320*240 w 256 kolorach. W necie znajdziesz VGA.pas i pokombinuj.
Tryb włącza się tak:
procedure SETVGA; assembler;
ASM
mov ax,13h
int 10h
end;

Pamięć graficzna ekranu zaczyna się od $A000.

0

Przede wszystkim napisz, w jakim języku programujesz ten system :) (Jeśli Pascal to dopisz nazwę kompilatora!!! TP(16bit)/FPC(32bit))

0

Najnowszy FPC 32 BiT ;-)

0

Freepascal może mieć duże problemy z obsługą przerwań w trybie 32-bitowym (teoretycznie w tym trybie nie istnieją :P), więc strona Tryb VESA 640*480 w TP chyba się nie przyda, bo odnosi się do starego, 16-bitowego Turbo Pascala. Sam kiedyś zabierałem się za pisanie OS'a w FPC i chciałem zrobić GUI, lecz po jego zamknięciu system nie rozpoznawał żadnych komend. Prawdopodobnie jest to nieprawidłowe użycie przerwania, które powoduje "rozstrojenie pamięci" :) . Mogę ci poradzić tylko tyle, byś napisał własny sterownik do grafiki. Tak w ogóle to masz tu kilka linków związanych z pisaniem systemów operacyjnych:
www.visopsys.org
www.osdever.net
www.wiki.osdev.org (bez tego raczej nie zaczniesz :D )
www.mikeos.berlios.de

PS. Życzę cierpliwości, a wierz mi, przy pisaniu systemu to jest najważniejsze. :P

0

Też z tym kombinowałem, wiadomości które udało mi się zebrać to iż, aby uzyskać tryb graficzny w PM trzeba wyjść do Real_M, ustawić (włączyć V86), lub przez porty. Zaciekawiłem się tym ostatnim rozwiązaniem oto co udało mi się odnaleźć w sieci:
http://bos.asmhackers.net/docs/vga_without_bios/docs/mode%2013h%20without%20using%20bios.htm
http://files.osdev.org/mirrors/geezer/osd/graphics/modes.c
i opis VGA:
http://wiki.osdev.org/VGA_Hardware
Na podstawie tego skombinowałem takie coś (nie formatowane, bo pisane dla testu).

unit vga;

interface

const
	VGA_AC_INDEX=	$3C0;
	VGA_MISC_WRITE=	$3C2;
	VGA_SEQ_INDEX	=	$3C4;
	VGA_DAC_READ_INDEX=	$3C7;
	VGA_DAC_DATA	=	$3C9;
	VGA_MISC_READ	=	$3CC;
	VGA_GC_INDEX 	=	$3CE;
        VGA_CRTC_INDEX=	$3D4;		
	VGA_INSTAT_READ=	$3DA;

        REGM = $63;

procedure SetVga;

implementation

procedure SetVga; [public, alias: 'SetVga'];
var
	aa, ii :byte;
begin

outportb(VGA_MISC_WRITE,REGM);
outportw(VGA_CRTC_INDEX,$0e11);
outportw(VGA_SEQ_INDEX,$0e04);

outportw(VGA_SEQ_INDEX,$0101);
outportw(VGA_SEQ_INDEX,$0f02);
outportw(VGA_SEQ_INDEX,$0003);


outportw(VGA_CRTC_INDEX,$5f00);
outportw(VGA_CRTC_INDEX,$4f01);
outportw(VGA_CRTC_INDEX,$5002);
outportw(VGA_CRTC_INDEX,$8203);
outportw(VGA_CRTC_INDEX,$5404);
outportw(VGA_CRTC_INDEX,$8005);
outportw(VGA_CRTC_INDEX,$2813);

outportw(VGA_CRTC_INDEX,$BF06);
outportw(VGA_CRTC_INDEX,$1F07);
outportw(VGA_CRTC_INDEX,$4109);
outportw(VGA_CRTC_INDEX,$9c10);
outportw(VGA_CRTC_INDEX,$8e11);
outportw(VGA_CRTC_INDEX,$8f12);
outportw(VGA_CRTC_INDEX,$9615);
outportw(VGA_CRTC_INDEX,$B916);

outportw(VGA_CRTC_INDEX, $0008);

outportw(VGA_CRTC_INDEX,$4014);
outportw(VGA_CRTC_INDEX,$a317);


outportw(VGA_GC_INDEX,$4005);
outportw(VGA_GC_INDEX,$0506);
outportw(VGA_GC_INDEX,$0F07);
outportw(VGA_GC_INDEX,$FF08);


For aa:=0 to 15 do 
	outportb(VGA_AC_INDEX,aa);

inportb(VGA_INSTAT_READ);
outportb(VGA_AC_INDEX,$10);
outportb(VGA_AC_INDEX,$41);
outportb(VGA_AC_INDEX,$11);
outportb(VGA_AC_INDEX,$00);
outportb(VGA_AC_INDEX,$12);
outportb(VGA_AC_INDEX,$0f);
outportb(VGA_AC_INDEX,$13);
outportb(VGA_AC_INDEX,$00);
outportb(VGA_AC_INDEX,$14);
outportb(VGA_AC_INDEX,$00);

inportb(VGA_INSTAT_READ);
outportb(VGA_AC_INDEX, $20);

	
end;

Dopisałem sobie skok do tego po wpisaniu w konsoli polecenia 'TestVGA'.
Po uruchomieniu tego w Bochsie pisze dimesions update x=640 y=400 .... bpp=8.
Natomiast w Virtual PC sprawdzałem Properties to pisze VGA , 320x200x8.
Nie mam pojęcia co jest nie tak, może Tobie uda się to opanować, jak coś proszę o kontakt.

0

To w pascalu da się napisać system?

0

Da się, tylko trzeba umieć to napisać, a wbrew pozorom wcale nie jest to takie trudne... :).

0
TomRiddle napisał(a)

To w pascalu da się napisać system?

Tylko PO CO ?

0

4fun :D

0

Już nie mam 20 lat wiec może na świat patrze troche inaczej , ale czasmi spotykam 20 latków informatyków :)
I co drugi che napisać swój system operacyjny.
Jedno jest pewne z wiekiem przechodzi :)

0

Co najmniej jednemu 22-latkowi też się kiedyś zachciało i nie przeszło mu do dzisiaj.

1

W młodych siła!!! :D Świeże spojrzenie zwykle wychodzi na dobre. Jak ktoś siedzi 30 lat w jakimś zamkniętym zbiorze technologii to ciężko mu potem z tego wyjść. Jest zbyt przyzwyczajony, zna te technologie na wylot, wszystkie swoje pomysły realizował w tych technologiach i mógł się po prostu wypalić.

Ja np chciałbym zrobić system podobny w założeniach do MS Singularity. Społeczność FOSS zbytnio się jednak nie pali do takich pomysłów. Jest kilka podobnych systemów, napisanych w Javie czy C# ale tylko jeden nie jest zarzucony, Cosmos, ale jego rozwój strasznie się wlecze. Już MenuetOS, napisany w całości w asemblerze ma o niebo lepsze funkcjonalności. Żeby zrobić taki system (jaki ja chcę) trzeba jednak mieć sporą wiedzę, więc dużo nauki przede mną.

0

Sorry, że piszę po tygodniu ale dopiero teraz zauważyłem temat. W protected mode nie będzie tak łatwo z grafiką. Musisz najpierw napisać stery do grafiki żeby zmienić tryb, a potem możesz sobie pisać po pamięci ekranu. Możesz także zmusić GRUBa aby sam zmienił tryb. Powinno się przydać: http://wiki.osdev.org/Drawing_In_Protected_Mode

EDIT: Aż mi wróciła ochota na pisanie OSa ;)

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