Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
700 changes: 346 additions & 354 deletions avr/main.c

Large diffs are not rendered by default.

175 changes: 83 additions & 92 deletions bios/c_src/cmos.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,115 +5,106 @@ static uint8_t cmos_data[32];
#define CMOS_BASE 0x40

uint8_t cmos_read() {
uint8_t cmos_checksum = 0;
for(int i=0; i<31; i++) {
outb(0x70, CMOS_BASE + i);
cmos_data[i] = inb(0x71);
cmos_checksum += cmos_data[i]; // cmos_checksum skips 0x1F
}
outb(0x70, CMOS_BASE + 0x1F);
cmos_data[31] = inb(0x71);

if(cmos_checksum != cmos_data[31]) {
memset(cmos_data, 0, 32);
cmos_save();
return 0;
}
return 1;
uint8_t cmos_checksum = 0;
for(int i=0; i<31; i++) {
outb(0x70, CMOS_BASE + i);
cmos_data[i] = inb(0x71);
cmos_checksum += cmos_data[i]; // cmos_checksum skips 0x1F
}
outb(0x70, CMOS_BASE + 0x1F);
cmos_data[31] = inb(0x71);

if(cmos_checksum != cmos_data[31]) {
memset(cmos_data, 0, 32);
cmos_save();
return 0;
}

return 1;
}

void cmos_save() {
uint8_t cmos_checksum = 0;

for(int i=0; i<31; i++) {
outb(0x70, CMOS_BASE + i);
outb(0x71, cmos_data[i]);
cmos_checksum += cmos_data[i];
}
outb(0x70, CMOS_BASE + 0x1F);
outb(0x71, cmos_checksum);
uint8_t cmos_checksum = 0;

for(int i=0; i<31; i++) {
outb(0x70, CMOS_BASE + i);
outb(0x71, cmos_data[i]);
cmos_checksum += cmos_data[i];
}
outb(0x70, CMOS_BASE + 0x1F);
outb(0x71, cmos_checksum);
}


uint8_t cmos_get(enum CMOS_SETTINGS setting) {
switch(setting) {

case CMOS_QUICK_MEMTEST:
if((cmos_data[0] & 0b00000001) > 0) return 1;
return 0;

case CMOS_LBA_ENABLED:
if((cmos_data[0] & 0b00000010) > 0) return 1;
return 0;

case CMOS_LOCK_CMOS:
if((cmos_data[0] & 0b00000100) > 0) return 1;
return 0;


default:
return 0;
}
switch(setting) {
case CMOS_QUICK_MEMTEST:
if((cmos_data[0] & 0b00000001) > 0) return 1;
return 0;
case CMOS_LBA_ENABLED:
if((cmos_data[0] & 0b00000010) > 0) return 1;
return 0;
case CMOS_LOCK_CMOS:
if((cmos_data[0] & 0b00000100) > 0) return 1;
return 0;

default:
return 0;
}
}

void cmos_set(enum CMOS_SETTINGS setting, uint8_t value) {
switch(setting) {

case CMOS_QUICK_MEMTEST:
if(value > 0) {
cmos_data[0] |= 0b00000001;
} else {
cmos_data[0] &= ~0b00000001;
}
break;

case CMOS_LBA_ENABLED:
if(value > 0) {
cmos_data[0] |= 0b00000010;
} else {
cmos_data[0] &= ~0b00000010;
}
break;

case CMOS_LOCK_CMOS:
if(value > 0) {
cmos_data[0] |= 0b00000100;
} else {
cmos_data[0] &= ~0b00000100;
}
break;

default:
break;
}
switch(setting) {
case CMOS_QUICK_MEMTEST:
if(value > 0) {
cmos_data[0] |= 0b00000001;
} else {
cmos_data[0] &= ~0b00000001;
}
break;
case CMOS_LBA_ENABLED:
if(value > 0) {
cmos_data[0] |= 0b00000010;
} else {
cmos_data[0] &= ~0b00000010;
}
break;
case CMOS_LOCK_CMOS:
if(value > 0) {
cmos_data[0] |= 0b00000100;
} else {
cmos_data[0] &= ~0b00000100;
}
break;

default:
break;
}
}

void cmos_lock() {
outb(0x70, 0xFF);
outb(0x71, 0x17);
outb(0x70, 0xFF);
outb(0x71, 0x17);
}


uint8_t cmos_is_m8sbc() {
uint8_t b1, b2;
outb(0x70, 0xFC);
b1 = inb(0x71);
outb(0x70, 0xFD);
b2 = inb(0x71);

if(b1 == 0x48 && b2 == 0x86) return 1;
return 0;
uint8_t b1, b2;

outb(0x70, 0xFC);
b1 = inb(0x71);
outb(0x70, 0xFD);
b2 = inb(0x71);

if(b1 == 0x48 && b2 == 0x86) return 1;
return 0;
}

uint16_t cmos_chp_version() {
uint8_t b1, b2;
uint8_t b1, b2;

outb(0x70, 0xFE);
b1 = inb(0x71);
outb(0x70, 0xFF);
b2 = inb(0x71);
outb(0x70, 0xFE);
b1 = inb(0x71);
outb(0x70, 0xFF);
b2 = inb(0x71);

return (uint16_t)((b1<<8) | (b2 & 0xFF));
}
return (uint16_t)((b1<<8) | (b2 & 0xFF));
}
8 changes: 4 additions & 4 deletions bios/c_src/cmos.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
#include "utils.h"

enum CMOS_SETTINGS {
CMOS_QUICK_MEMTEST,
CMOS_LBA_ENABLED,
CMOS_LOCK_CMOS
CMOS_QUICK_MEMTEST,
CMOS_LBA_ENABLED,
CMOS_LOCK_CMOS
};

uint8_t cmos_read(); // returns 0 if checksum was invalid
Expand All @@ -23,4 +23,4 @@ uint8_t cmos_is_m8sbc();
uint16_t cmos_chp_version();


#endif
#endif
Loading