Also, folgendes Problem:
Ich habe eine Funktion (in C) geschrieben mit der ich das Fehlerregister des CMOS-Speichers testen kann und, falls einen Fehler gibt, eine Nachricht ausgibt, in der die Fehlerursace beschrieben wird. Wenn ich das ganze kompiliere und dann in Bochs testen möchte, macht er sobald der Computer das CMOS-Register überprüft hat einen, mir völlig unerklärlichen, reboot.
Was mach ich da falsch? Hier mal der code:
cmos.c:
void check_cmos(void)
{
unsigned char value;
print("Checking CMOS for errors...");
out(0x70, 0x0E);
value = in(0x71);
if (value == 0) /* If 0 -> everything is all-right. */
{
print("CMOS [OK]");
}
else /* If not -> there MUST be an error. */
{
print("CMOS ERROR:");
switch(test_bit(value, 2))
{
case 0: break;
case 1: print("Invalid time or data."); break;
}
switch(test_bit(value, 3))
{
case 0: break;
case 1: print("Disk or controller error."); break;
}
switch(test_bit(value, 4))
{
case 0: break;
case 1: print("Memory size compare error."); break;
}
switch(test_bit(value, 5))
{
case 0: break;
case 1: print("Invalid POST-configuration."); break;
}
switch(test_bit(value, 6))
{
case 0: break;
case 1: print("CMOS - Bad checksum."); break;
}
switch(test_bit(value, 7))
{
case 0: break;
case 1: print("Clock lost power."); break;
}
}
}
-------------
Die in / out (für die Ports) funktionieren, ebenso die print-Funktion. Bei der Funktion test_bit bin ich mir nicht sicher, vielleicht liegt der Fehler auch da. Deswegen hier noch der Code der test_bit-Funktion:
bitops.c:
int test_bit(char val, char bit)
{
char test_val = 0x01;
/* push bit to position */
test_val = (test_val << bit);
/* 0 = Bit setted 1 = Bit not setted */
if ((val & test_val) == 0)
return 0; /* not setted */
else
return 1; /* setted */
}
-----------
Danke schon mal im vorraus!