Hi Leute,
ich bin am verzweifeln. Seit Tagen oder Wochen versuche ich die Textausgabe in meinem Kernel zum laufen zu bekommen. Aber es will einfach nicht. Das einzige was funktioniert ist die Funktion Cls(); Wenn cih Set_Cursor nicht auskommentiere, meldet der Kompiler folgendes
kernel_c.o: In function `main':
Kernel.c:(.text+0x48): undefined reference to `Set_Cursor'
Ich verstehe nicht warum. Und dann noch das mit der Textausgabe. Das auskommentierte in Kernel.c funktioniert. Wenn ich aber den gleichen Code nehme, und ihn in eine andre Funktion packe (sei es Cls()) funktioniert er auf einmal nicht mehr. Ich bin schon seit Wochen am herumprobieren, aber ich finde die Lösung nicht. Hie mein Code:
Kernel.c
#include "OS.h"
// Main function (this is called in Kernel.asm)
int main()
{
//char *video = (char*)0xB8000;
char *hello = VERSION;
// Clear the screen
Cls();
kprintf(hello, 1, 1);
// String ausgeben
/*while (*hello) {
*video = *hello;
video++;
*video = 0x07;
video++;
hello++;
}*/
Set_Cursor(11, 0);
while (1);
return 0;
}
OS.h
#ifndef OS_H_INCLUDED
#define OS_H_INCLUDED
#include "Graphic.h"
// Version of the Kernel
#define VERSION "28.09.2009"
// Util.c
extern void OutPort(unsigned int iPort, unsigned char chData);
extern unsigned char InPort(unsigned int iPort);
// Graphic.c
extern void Cls();
extern void Set_Cursor(const int iX, const int iY);
extern void kprintf(char* chBuffer, const unsigned int iXPos, const unsigned int iYPos);
#endif // OS_H_INCLUDED
Graphic.c
#include "OS.h"
// Vars
int iXPos, iYPos; // Position of the cursor
char* VGAMem = (char*) 0xB8000; // Pointer to the videoram
unsigned int iAttrib = 0x0F; // Attributes for the text
// Functions
// Clear the screen
void Cls()
{
// Clear the screen
int i = 0;
while(i < (80 * 2 * 25))
{
VGAMem
= 0x20;
i++;
VGAMem = 0x07;
i++;
}
}
// Print text on the screen
void kprintf(char* chBuffer, const unsigned int iXPos, const unsigned int iYPos)
{
VGAMem = (char*) 0xB8000;
while(*chBuffer)
{
*VGAMem = *chBuffer;
VGAMem++;
*VGAMem = 0x07;
VGAMem++;
chBuffer++;
}
}
// Set text attributes
void Set_Attribute()
{
}
// Set the cursor
void Set_Cursor(const int iX, const int iY)
{
unsigned short Position = (iX * 80) + iY;
OutPort(0x3D4, 0x0E);
OutPort(0x3D5, (unsigned char)((Position>>&0xFF));
OutPort(0x3D4, 0x0F);
OutPort(0x3D5, (unsigned char)(Position&0xFF));
}
Util.c
#include "OS.h"
// Write something to an I/O port
void OutPort(unsigned int iPort, unsigned char chData)
{
asm volatile ("outb %%al,%%dx"::"d" (iPort), "a" (chData));
}
// Read something from an I/O port
unsigned char InPort(unsigned int iPort)
{
// Vars
unsigned char chData;
// Read from the port
asm volatile ("inb %w1,%b0" : "=a"(chData) : "d"(iPort));
return chData;
}
CreateKernel.sh
nasm -f elf -o kernel_asm.o Kernel.asm
gcc -m32 -ffreestanding -o util_c.o -c Util.c -Wall -Werror -nostdinc
gcc -m32 -ffreestanding -o graphic_c.o -c Graphic.c -Wall -Werror -nostdinc
gcc -m32 -ffreestanding -o graphic_h.o -c Graphic.h -Wall -Werror -nostdinc
gcc -m32 -ffreestanding -o os_h.o -c OS.h -Wall -Werror -nostdinc
gcc -m32 -ffreestanding -o kernel_c.o -c Kernel.c -Wall -Werror -nostdinc
ld -T LinkerSkript.ld -o Kernel.bin kernel_asm.o kernel_c.o Graphic_c.o Util_c.o
Ich hoffe, mir kann einer helfen. Vielen dank schon mal im Voraus.