| Zeile 16: | Zeile 16: | ||
==Beispielkernel in Pascal== | ==Beispielkernel in Pascal== | ||
Zunächst '''kernel.pas''' - der eigentliche Kernel, der ein Zeichen ausgibt. | Zunächst '''kernel.pas''' - der eigentliche Kernel, der ein Zeichen ausgibt. | ||
| − | <pascal> | + | <pascal>unit kernel; |
| + | interface | ||
| + | |||
| + | procedure PASCALMAIN(); | ||
type tScreen = array[1..25, 1..80] of record | type tScreen = array[1..25, 1..80] of record | ||
c: char; | c: char; | ||
attr: byte; | attr: byte; | ||
end; | end; | ||
| + | implementation | ||
| + | |||
| + | procedure PASCALMAIN(); | ||
var | var | ||
screen: ^tScreen; | screen: ^tScreen; | ||
| Zeile 28: | Zeile 34: | ||
screen := Pointer($B8000); | screen := Pointer($B8000); | ||
screen^[1, 1].c := '#'; | screen^[1, 1].c := '#'; | ||
| − | end.</pascal> | + | screen^[1, 1].attr := $07; |
| + | end; | ||
| + | |||
| + | end. | ||
| + | </pascal> | ||
| + | Die Zeile ''screen^[1, 1].attr := $07;'' definiert die Zeichenfarbe, in diesem Fall Grau auf Schwarz. | ||
| + | Wollen wir jetzt aber z.B. einen Bluescreen-Zeichenhintergrund haben müssten wir ''screen^[1, 1].attr := $1F;'' nehmen. | ||
| + | Für weitere Farben siehe [[Textausgabe]]. | ||
Das war der einfache Teil. Als nächstes brauchen wir eine eigene system-Unit, die allerdings für den Anfang nur zwei Stubs bereitstellen muss. '''system.pas''': | Das war der einfache Teil. Als nächstes brauchen wir eine eigene system-Unit, die allerdings für den Anfang nur zwei Stubs bereitstellen muss. '''system.pas''': | ||
| Zeile 51: | Zeile 64: | ||
Und der dritte Teil ist ein Assembler-Stub, '''prt0.asm''': | Und der dritte Teil ist ein Assembler-Stub, '''prt0.asm''': | ||
| − | <asm>extern | + | <asm> |
| + | extern KERNEL_PASCALMAIN | ||
global _start | global _start | ||
| Zeile 60: | Zeile 74: | ||
mov esp, kernelstack | mov esp, kernelstack | ||
| − | call | + | call KERNEL_PASCALMAIN, sie kann frei gesetzt werden |
jmp $ | jmp $ | ||
| Zeile 77: | Zeile 91: | ||
kernelstack:</asm> | kernelstack:</asm> | ||
| − | Anschließend müssen diese | + | Jetzt sind nur noch 2 leere Units nötig damit der Kernel läuft. |
| − | <pre>nasm -felf prt0.asm | + | |
| + | '''si_prc.pas''': | ||
| + | <pascal> | ||
| + | unit si_prc; | ||
| + | |||
| + | interface | ||
| + | |||
| + | implementation | ||
| + | |||
| + | end. | ||
| + | </pascal> | ||
| + | '''fpintres.pas''': | ||
| + | <pascal> | ||
| + | unit fpintres; | ||
| + | |||
| + | interface | ||
| + | |||
| + | implementation | ||
| + | |||
| + | end. | ||
| + | </pascal> | ||
| + | |||
| + | Anschließend müssen diese fünf Dateien kompiliert/assembliert und gelinkt werden. Das ist der Punkt, der mir noch nicht so ganz gefällt, weil ich ld eigentlich nicht von Hand aufrufen müssen will, um text=0x100000 setzen zu können. | ||
| + | <pre> | ||
| + | nasm -felf prt0.asm | ||
fpc kernel | fpc kernel | ||
| − | ld -Ttext=0x100000 *.o -o kernel</pre> | + | ld -Ttext=0x100000 *.o -o kernel |
| + | </pre> | ||
| + | |||
| + | Wer jetzt neugierig ist was der Kernel alles so auf dem Bildschirm bringt, kann den Kernel nach dem linken sofort mit [[QEMU]] ausführen: | ||
| + | <pre> | ||
| + | qemu -kernel kernel | ||
| + | </pre> | ||
==Weblinks== | ==Weblinks== | ||
* [http://www.freepascal.org FreePascal] | * [http://www.freepascal.org FreePascal] | ||
| + | * [http://code.google.com/p/fpos/ FpOS - ein in Pascal geschriebenes OS] | ||
[[Kategorie:Programmiersprache]] | [[Kategorie:Programmiersprache]] | ||