Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - NoeTrimm

Seiten: [1] 2
1
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 03. June 2013, 00:10 »
Wenn du deinen Font als Array in C deklarierst, kannst du auch gleich C benutzen, um ihn in die Grafikkarte zu stopfen. Das hat außerdem auch den Vorteil, dass du verstehen musst, was du da tust. :-D

Daran hab ich auch schon gedacht. Und den Wink mit dem, naja, ZAUN, nehm ich mal hin. War wirklich eine schwere Geburt. Also meine Font als Array in C und dann per inline ASM die entsprechenden Vorarbeiten und in einer Schleife das Array von 0xA0000 an bis 0xA0000 + 256*32 Bits reinkloppen...Richtig?!  8-) Nur fällt mir dann grad nichts anderes ein um den Kopiervorgang von esi/edi zu ersetzen, außer für jedes Byte die Adresse berechnen zu lassen an die das nächste Byte aus dem Array kopiert werden soll. Meintest du deswegen, dass ich wissen muss, was ich tue?...Da scheint ja direkt ASM sinnvoller, bevor mein C-Kernel geladen wird  :-P
2
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 02. June 2013, 23:51 »
ESI = Extended Source Index
EDI = Extended Destination Index
Diese beiden Register werden von dem MOVSD benutzt und geben Quelle (DS:ESI) und Ziel (ES:EDI) der Kopiererei an. In die Register kommt auch nicht dein Font rein (passt eh nicht), sondern nur Adressen.

einmal an den Kopf geklatscht. Danke. also kommt nach EDI 0xA0000 und nach ESI die Anfangsadresse von meiner Font. Wenn ich die als Array in C deklariere, kann ich das dann so übergeben, dass der die Start-Adresse des Arrays übergibt? Oder bleiben wir bei ASM. Wie kann ich dort ein 4KB großes Datenpaket deklarieren um dann an ESI die Anfangsadresse zu übergeben?
3
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 02. June 2013, 21:50 »
Ok, danke erstmal. Also einfach in den Videospeicher. Gut. GrafikModus möchte ich erstmal nicht nutzen. Wieso ist zwischen 640KB und 1 MB nicht genug Platz? Ich brauch doch bloß 4 KB für den Font und 4000 Bytes für die 80x25 Textmodi.

Ich verstehe auch nicht ganz was du mit mehreren Text-Modi meinst. Also ich verstehe es schon, aber so langsam wird es verwirrend für mich. Wenn mein Kernel geladen wurde, liegt doch der begin des Videospeichers bei 0xB8000 und jedes Byte was ich da reinschriebe, wird auf dem monitor angezeigt. Jetzt kann ich also 4000 Bytes weiter beginnen meinen Font rein zu schrieben und dann irgendeinen zeiger zu ändern der dann auf den start von der Font zeigt?! Ich glaub ich seh grad alles wieder komplizierter als es ist.


EDIT:

Wer ein OS schreiben will, sollte sich mit der Hardware beschäftigen  :-D Nachdem ich mir also die VGA Hardware angesehen habe, verstehe ich auch was mit den BitPlanes gemeint ist und das in der Plane 2, die Font drin steht, die aktuell verwendet wird, wenn ich ein Zeichen in ein Byte der Plane 0 schreibe. Damit macht auch die Addressierung mit 0xA0000 sinn; ist ja der Anfang der Plane 2. Nachdem ich nun auch weiß, dass die Plane 2 für den textmodus dort jedes Zeichen in 8x32 Pixel, also in 32 Bytes speichert und die ersten 16 Bytes für mich wichtig sind, kann ich also mit Hilfe des artikels von OSdev da ganze realisieren. Ich verstehe nur noch nciht ganz die Verwendung von "esi" und "edi" im zusammenhang mit movsd. Im Quelltext von OSdev, ist ja hinter dem movsd Befehl kein Quell- und Zieloperand angegeben, weshalb ich nciht verstehe, wie dann in edi die Bitmap liegen soll. Das ich Quell und zieloperand nur tauschen muss um meine Bitmap nach 0xA0000 zu kopieren ist nun klar, aber die modifizierung macht von der theorie für mich keinen Sinn. Dort wird doch nur von 0xA0000 beginnend der Inhalt in "esi" abgelegt und nicht in "edi". Wieso soll danach aber die Bitmap dann in "edi" stehen und nicht in "esi"???

Also ich vermute dann in etwa so?

;copy charmap
mov esi, 0A0000h ;<--Tauschen zu 0A0000h, esi
mov ecx, 256
;copy 16 bytes to bitmap
@@: movsd
movsd
movsd
movsd
;skip another 16 bytes
add esi, 16
loop @b
;restore VGA state to normal operation

Wenn ja, dann muss in edi meine font rein? Aber warum?
4
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 02. June 2013, 20:42 »
Außerdem geht es mit nicht um eine spezielle Font (wenn ich es so lösen kann ist das erstmal ok), sondern das direkte ändern der Codepage durch das BIOS.
Was genau ist an dem Teil mit "durch das BIOS" so wichtig, dass es Teil deiner Zielbeschreibung ist?

Diese Bedingung lag an meinem falschen Verständnis von Codepages und Fonts. Jetzt habe ich mich mal durch so ziemlich alles, was ich finden konnte, durchgelesen udn es bleiben noch zwei drei Fragen.

Ich befinde mich nach dem laden des Kernels im Protected Mode, mit TextMode 80x25. Das heißt mein Videospeicher beginnt bei 0xB8000 und ist 4000 Bytes lang. Meine Zeichen, die ich anstelle der Standard ASCII-Zeichen verwenden möchte muss ich Pixel für Pixel definieren. Das macht beim TextMode mit 80x25 eine Zeichengröße von 8x16 Pixel, die per 16 Bytes (eines für jede Pixelzeile) definiert werden. Dies muss ich für alle 256 Zeichen machen, was also eine Größe von 16 x 256 Byte = 4096 Bytes (4KB) ergibt, die ich im Speicher hinterlegen muss. Soweit dürfte mein Gedankengang richtig sein.

Nun hab ich gelesen, dass diese Font in den Videospeicher gehört und ich, wie Svenska richtig andeutete, lediglich den Zeiger so ändern muss, dass er auf die Startadresse meiner Font zeigt. Aber mein Videospeiche rist doch nur 4000Bytes lang und theoretisch müsste die Font dahinter, oder sehe ich das mal wieder falsch. Wo kann ich die 4kb am besten hinpacken und wenn cih schon im Kernel bin, wie ändere ich dann den zeiger? Reicht da wirklich das esi edi getausche oder nicht?

Wenn ich mal wieder Mist stammle, dann seit nachsichtig  :roll:

Für alle die es interessiert, warum ich das überhaupt ändern will:
Ich habe mal eine eigene Sprache (keine Geheimsprache oder Ähnliches) entwickelt, die mit anderen Zeichen arbeitet. Allerdings nicht so, dass ein "a" nur ersetzt wird durch eines meiner Zeichen und wenn man "Auto" schreiben will, einfach 4 Zeichen meiner Sprache zusammensetzen muss. Es gibt eine eigene Grammatik, andere Laute und Worte, die durch derzeit 19 Zeichen und ihre kombinationen dargestellt werden + Zeichen für die Zahlen 0 - 9. Diese Sprache möchte ich gerne in meinem OS nutzen, was es aber nötig macht, dass die Zeichen hinterlegt sind, da sich die Worte mit lateinischen Buchstaben nur so darstellen lassen wie sie ausgesprochen werden und dadurch sehr lang werden können. Das nur mal zur Info. Auf die Frage, warum ich überhaupt eine eigene Sprache entwickle, kann man genauso antworten, wie auf die Frage warum ein eigenes OS: Weil es geht!
5
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 31. May 2013, 15:33 »
Bedenke, dass du im Real-Mode den int 10h nicht benutzen kannst.

Du legst einen 4k-Bereich im Speicher fest, in den du deinen Font legst. Anschließend kopierst du den an eine bestimmte Stelle in die Grafikkarte und bist fertig. Assembler-Beispielcode steht im OSDev-Wiki.

Wie Kevin schon sagte, im Protected Mode den BIOS Int 10h aufzurufen dürfte schwierig werden  8-)

Und der Beispielcode dafür steht nicht im Wiki. Nicht so, dass man ihn adaptieren kann. Außerdem geht es mit nicht um eine spezielle Font (wenn ich es so lösen kann ist das erstmal ok), sondern das direkte ändern der Codepage durch das BIOS. Sollte allerdings die VGA-Font umsetzung leichter zu realisieren sein, würde ich mich damit auch zufrieden geben. Zumal ich bei der reservierung des 4k speichers und das schreiben meiner font die 512 Byte Marke für meinen Bootloader (in dem ich ja noch im Real Mode lebe) "etwas" sprenge.
6
Lowlevel-Coding / Re: Eigene Codepage im eigenen OS
« am: 30. May 2013, 23:30 »
OK. Danke. Der zweite Link scheint am hilfreichsten. Allerdings verstehe ich das so, dass ich einen bereich festlege in dem ich eine Art PixelMap anlege (font) und diese dann in den Videospeicher schreibe. Oder war mein erstes überfliegen und übersetzen so fehlerhaft?

Das ich meine Zeichen also in 8x16 Pixel schreiben muss ist klar. Nur wie ich diese dann als codepage ablege verstehe ich noch nicht. Es muss ja sowas wie einen BIOS Int geben mit dem ich das machen kann, um jedes einzelne zeichen byte für byte von einem register per int in die codepage schreibe. Wenn es das gibt, kann ja mein Bootloader das noch gleich im Realmode erledigen mit den BIOS-Ints und erst dann in den Protected Mode springen...

Vielleicht denk ich mich auch grad vor eine Wand  :mrgreen:

EDIT: Doch nicht gegen die Wand gedacht. Also dein Link hat mich über einige Int-Lists letztlich zu BIOS Int 10h gebracht. Da ist anscheind einiges möglich und ich werde mal lesen. Sollte ich einen funktionierenden Assembler Quelltext zusammen bekommen der die Codepage manipuliert und auch meine Symbole ausgeben kann, gibt es den hier im Post.

Wenn noch jemand einen Ansatz oder sogar schon eine Lösung hat, wäre ich dankbar für weitere Anregungen.

Danke kevin
7
Lowlevel-Coding / Eigene Codepage im eigenen OS
« am: 30. May 2013, 22:55 »
Moinsen,

ich habe in den letzten Monaten an meinem OS gearbeitet und bin soweit ganz gut voran gekommen (bootloader, kernel und eine Shell sind soweit ok). Die ausgabe von Text erfolgt ganz normal über die Standard_Codepage von Intel. Ist es möglich diese zu ändern und mit eigenen Zeichen zu belegen? Wenn ich z.B ein anderes Symbol für den Buchstaben "A" habe diesen als Standard beim Laden des OS zu etablieren, sodass beim schreiben des Codes für das Zeichen A in den Grafikspeicher eben mein Symbol angezeigt wird.

Für Ansätze wäre ich dankbar.

greetz
8
Offtopic / Re: Was hat mehr Zukunft?
« am: 26. April 2008, 22:22 »
Wenn du das mit den led's am com ausprobieren willst, dann empfehle ich dir mit sehr gutem rat das c/c++ kompendium von dirk luis. Im kapitel interrupt programmierung wird genau dieses bsp. erklärt. habs selbst gemacht und es ist echt witzig die erste ampelschaltung zu generieren  :-D

Probiers aus udn dann übertrag das ganze mal in ein kleines os in assembler. dann transferiere das ganze in die hochsprache c und tada, du hast dein eigenes os mit com steuerung.

Jedoch verzichte dann dabei vorerst auf den Protected mode, da sich sonst das handeln mit den interrupts als komplizierter erweißt.

greetz kanasaru
9
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 22. April 2008, 23:30 »
ja mensch ich meinte auch '\n'. wenn du richtig gelesen hättest im obrigen post (nicht mein letzter, da steht es flasch) hättest du das gesehen. es ging um die definition von /n. \r war niemals thema...
10
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 22. April 2008, 16:01 »
2000 Zeichen auf dem bildschirm.
bei windows '\r' wird in die nächste zeile gesprungen und in die näöchste spalte. die spalten davor gehen verloren

ergo

Platzverschwendung
11
Lowlevel-Coding / Re: Inline-Assembler
« am: 22. April 2008, 10:57 »
Ok Thanks. das hilft mir schonmal enorm weiter.

Zu dem sichern.

Heißt das ich muss garkeine register sichern??? gcc schmeißt automatisch alle, nach ': :' angegebenen Register auf den Stack und holt sie wieder?

Das mit den Klammern fand ich auch seltsam, aber stand so im Artikel. Kann aber auch sein das ich da ne info überlesen habe.

Werd nochmal drüber schauen.
12
Lowlevel-Coding / Inline-Assembler
« am: 22. April 2008, 10:13 »
Einen wunderschönen guten morgen,

ich bin nun gerade dabei die Funktionen memcpy und setmem in meinen C-Kernele einzubauen und hab mir dazu mal den Artikel im Wiki "Inline-Assembler mit gcc" durchgelesen.
Aber so ganz hab ich einiges nicht verstanden.

Hier mal das was ich bisher getipselt habe:
void memcpy(void *Src, void *Dest, unsigned int iByteCount) {
asm(
"push (%ebp)";
"mov %esp, %ebp";
// sichern
"push (%ecx)";
"push (%edx)";
"push (%edi)";
"push (%esi)";
// Quelladresse nach ESI
"mov esi, [ebp+8]";
// Zieladresse nach EDI
"mov edi, [ebp+12]";
// Anzahl der Bytes nach ECX
"mov ecx, [ebp+16]";
// ECX nach EDX kopieren
"mov %ecx, %edx";
// Ersten beiden Bits in ECX löschen um durch 4 teilbare Zahl zu erhalten
"and 0xFFFFFFFC, %ecx";
// ECX durch 4 dividieren
"shr %2, %ecx";
// DWORDS kopieren
"rep movsd";
// EDX wieder nach ECX kopieren
"mov %edx, %ecx";
// Alle Bits bis auf die ersten beiden löschen
"and %3, %ecx";
// BYTES kopieren
"rep movsb";
// holen
"pop (%esi)";
"pop (%edi)";
"pop (%edx)";
"pop (%ecx)";
"mov %ebp, %esp";
"pop (%ebp)";
: : );
}

Bis zur Quelladresse müsste es ja richtig sein. von da an wusst ich nicht weiter wie ich [ebp+8] umschreibe in Inline-Assembler. Das ich Quell und zielreg noch vertauschen muss ist mir bewusst.

Zum zweiten bin ich mir nicht sicher ob ich die Zahlen die in einige register geschrieben werdenals konstanten zu nehmen sind oder ncith und daher hab ich erstmal '%' geschrieben anstatt '$'.

Der Rest dürfte ja soweit stimmen.

Und zu guter Letzt: Die übergabe der Variablen an die Register. Es steht deshalb nix im Code, da ich das (bzw. die Syntax und parametervergabe) überhaupt nich geschnallt habe.

würde mir sehr helfen wenn ihr da mal drüber schaut.
Will ja in meinem kernel (langsam) vorankommen  :wink:
13
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 22. April 2008, 10:00 »
Wenn du einen Wagenrücklauf willst, nimmst du halt noch ein \r dazu. Lang nichts mehr mit Win/DOS zu tun gehabt? ;)
*push [ernsthaftigkeit]*
Windows? was isn das? Hab schon mal davon gehört glaub ich. isn Programm, oder? Soll aber ziemlich fehleranfällig sein und nicht besonders Freundlich mit Kompatiblität...Naja...
*pop [ernsthaftigkeit]*

Sicher könnt ich einfach ein \r dazu nehmen, aber dann hab ich ja mehr tipparbeit. und dem Anwendungsschreiber (falls ich sowas irgendwann mal hab) kann man ja mitteilen wies geht  :wink:
14
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 21. April 2008, 21:28 »
*sing* I love Linux *lol*

stimmt. Hast schon recht. Ist sicher geschmackssache. Aber bei einem 80 zeichen breiten bildschirm will man sicher jedes zeichen nutzen und von daher dachte ich passe ich das mal an. Habe generell auch die fkt erweitert, damit sie darauf reagiert wenn das seitenende erreicht wird.
Und dabei hab ich, die von dir erwähnten 'geschmäcker' mit eingeplant. denn wenn man will das die fkt alle vorher geschriebenen zeichen nach oben schieben soll (sprich eine zeile scrollen) gibt man einfach 1 an und wenn nicht, dann 0 und die seite wird beim erreichen des letzten zeichens einfach per ClearScreen() gelöscht.

Aber '\n' nur als Umbruch, um das nochmal zu sagen, nutzen find ich Platzverschwendung. Und bei 2000 Zeichen will ich jedes optimal nutzen.


greetz
15
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 21. April 2008, 08:29 »
Moinsen alles zusammen.

So ich hab nunmal ein wenig rumgespielt. Vorallem mit dem Videospeicher, da ich ja mehr auch noch nicht kann  :-D

Als nächstes kommt sicher das erstellen der gdt, idt, usw. ?!?

Aber eine kleine Anmerkung habe ich noch zu TeeJays Videospeicherfunktionen und da dazu kein Thread besteht in Tutorialdiskussionen, vermerke ich das mal hier:

Seine Funktion TextOut() hat keinen Fehler im eigentlichen Sinne, jedoch wird bei einem '\n' nicht an den Anfang der nächsten Zeile gesprungen, sondern an die nächste spalte der nächsten Reihe.
Und da mein Verständnis von einem Zeilenbruch, der Sprung an den Anfang in Neue ist, hab ich das einfach mal geändert:

else if(*pText == '\n')
{
CURSORPOS Posi;
Posi = GetCursorPos();
Posi.iColumn = 0;
Posi.iRow += 1;
SetCursorPos(Posi.iRow, Posi.iColumn);
// iVideo_ptr = (((iVideo_ptr / 160) + 1) * 160) + (iVideo_ptr % 160);
}

Das kann man sicher auch noch eleganter lösen indem man die Zeile von Teejay einfach anpasst, aber auf die schnelle gefiel mir das am besten.

greetz Kanasaru

Edit: Jupp. Na klar gehts einfacher.

else if(*pText == '\n')
{
// Alte Zeile
// iVideo_ptr = (((iVideo_ptr / 160) + 1) * 160) + (iVideo_ptr % 160);
// Neue Zeile
iVideo_ptr = (((iVideo_ptr / 160) + 1) * 160);
}

Man betrachte die Einfachheit. *lol*
16
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 19. April 2008, 18:06 »
ich weiß. werde mir die auch noch einrichten, aber erstmal mach ichs so...
17
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 19. April 2008, 16:59 »
ich weiß das es diese gibt. jedoch hab ich nen alten PC rumstehen und nen vga splitter. daher is diese testweise auch nciht viel anstrengender als mit bochs oder so on

Außerdem gefällt mir der gedanke besser es auf einem rechner laufen zu sehen auf dem nix ist außer ne leere hdd, 64 MB RAM und nen süßer 800 MHz Inter Celeron
18
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 19. April 2008, 16:33 »
Arrrrrrrrr...

ach mensch hast ja recht. Aber des war auch eher ironisch gemeint, weil ich schon des lesens mächtig bin  :-P
19
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 19. April 2008, 16:26 »
Ey ihr seid so ...arrr

wer hats geändert? hä? sagt schon.

das is sowas von...arrr. egal. wenigstens weiß ich nun was mein kernel macht:

ne message ausgeben *lol*
20
OS-Design / Re: Was macht eigentlich (m)ein kernel?
« am: 19. April 2008, 16:18 »
So ich muss jetzt mal was loswerden:

Ihr hattet recht. mit GRUB ist alles soviel schöner *freu*

also message kommt. Das heißt jetzt spiele ich erstmal ein wenig mit dem videospeicher um mich an die adressierung zu gewöhnen.

Auf jeden fall bootet mein möchtegern OS brav vonner cd...*freu*

GRUB is toll  :-D

thanks

@taljeth: hä? doch!
Seiten: [1] 2

Einloggen