Pascal — Änderungen 5796 → 9633

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>program kernel;
+
<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 PASCALMAIN
+
<asm>
 +
extern KERNEL_PASCALMAIN
 
global _start
 
global _start
  
Zeile 60: Zeile 74:
 
     mov esp, kernelstack
 
     mov esp, kernelstack
  
−
     call PASCALMAIN
+
     call KERNEL_PASCALMAIN, sie kann frei gesetzt werden
 
     jmp $
 
     jmp $
  
Zeile 77: Zeile 91:
 
kernelstack:</asm>
 
kernelstack:</asm>
  
−
Anschließend müssen diese drei 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.
+
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]]