Sorry aber der kernel den ich da hatte würde doch nicht funktionieren..
Ich hab eine Header für sowas gemacht:
Kernel.h
#ifndef KERNEL_H
#define KERNEL_H
#include "READ_KEY.h"
int MONITOR_POS = 0x0B0000;
void MonitorPosition(int hexpos)
{
MONITOR_POS = hexpos;
}
void Print(char* text)
{
char *MONO = ( char* ) MONITOR_POS;
*text = *MONO;
}
void LineDown()
{
int MONP = 0x0B0000;
int FIRST = 0x0B0000;
int LAST = 0x0B0050;
if (MONITOR_POS > FIRST && MONITOR_POS < LAST)
{
MONITOR_POS = 0x0B0050;
}
while(1)
{
MONP = MONP + 0x50;
FIRST = FIRST + 0x51;
LAST = LAST + 0x51;
if(MONITOR_POS > FIRST && MONITOR_POS < LAST)
{
MONITOR_POS = MONP;
break;
}
}
}
#define in 0
#define out 1
#define MONO 0x000B0000
namespace IO
{
void Adress(int adr, int *value, int type) //0 = in, 1 = out
{
if(type == in)
{
int *ADR = ( int* ) adr;
int VALUE = ( int ) value;
VALUE = ADR[0];
}
else if(type == out)
{
int *ADR = ( int* ) adr;
int *VALUE = value;
*ADR = *value;
}
}
}
void Reboot()
{
__asm(" .byte 0x0EA \n\t"
" .long 0x0000 \n\t"
" .long 0x0FFFF \n\t");
}
#endif /*KERNEL_H*/
READ_KEY.h#ifndef READ_KEY_H
#define READ_KEY_H
int *SEND;
int *OUT_ADR = ( int* ) 0x00000010;
void READ_KEY_PORT(int SCANNCODE_p ,int* OUTPUT_CODE)
{
if(SCANNCODE == SCANNCODE_p)
{
while(1)
{
SCANNCODE = KEY_PORT[0];
*SEND = *OUTPUT_CODE;
*SEND = *OUT_ADR;
if(SCANNCODE = 0xF0)
{
break;
}
}
}
}
void READ_KEY(int var)
{
var = OUT_ADR[0];
}
#endif /*READ_KEY
dann sieht so ein Kernel z.B. so aus:
Kernel.cpp#include "kernel.h"
int main()
{
Print("Welcome to GAGA-OS"); //Nur ein beispiel ^^
LineDown();
Print("Press any Key to Reboot");
while(1)
{
int VAR_C;
int SCANNCODE= 0x01;
READ_KEY_PORT(SCANNCODE, 0x00);
SCANNCODE++;
READ_KEY(VAR_C);
if(VAR_C > 0x01)
{
break;
}
}
}
Ich habs getestet.. compilieren lässt´s sich !
Hier die Funktionen die du Benutzen kannst:
Print(const char* text)Gibt einen Text aus (Parameter 'text')
MonitorPosition(int hexpos)verändert die Position schreib Position
Bei auflösung 80x25 (Zeichen keine
Pixel !)
Die Position wird in Hexadeziemal angegeben.
Position 0 ist = 0x000B0000
jedes zeichen ist dann plus eins, alsoo Position 1 = 0x000B0001
LineDown()Ein einfacher Zeilenumbruch.
IO::Adresse(int adr, int *value, int type)Wenn der letzte Parameter 'type' gleich 'in' ist, dann ließt er von einer Adresse. Wenn 'out' dann schreibt er in eine Adresse.
Wenn Parameter gleich 'out':
Schreibt in eine Adresse (Parameter 'adr')
Den Wert zum schreiben (Parameter 'value')
Wenn Parameter gleich 'in':
Ließt von einer Adresse (Parameter 'adr')
Variable wo der Wert gespeicher wird (Parameter 'value')
Reboot()Neustart des Computers.
READ_KEY_PORT(int SCANNCODE_p, int* OUTPUT_CODE)Hier wird eine Taste vom TastaturPort gelesen und dann an einen Allgemeinen Tastaturpuffer geschickt.
Im Parameter 'SCANNCODE_p' schreibst du hin welche Taste abgefragt wird. Dazu musst du wissen welche Taste welchen Scanncode hat.
Hier findest du eine liste mit der Deutschen scanncode belegung.
Im Parameter 'OUTPUT_CODE' musst du dem enstprechend einen Code liefern der in den TastaturPuffer geht. Verwende dazu eine eigene liste oder benutz meine:
hierREAD_KEY(int var)Hier wird aus dem Tastaturpuffer gelesen.
Im Parameter 'var' wird der Wert gespeichert !
Ich hoffe mal ich konnte dir helfen... hab mich fast tot gecoded
Außerdem: kernel.h und READ_KEY.h in einem Ordner kopieren. Oder du änderst in kernel.h den #include !
MFG
TOMEK