132 lines
2.5 KiB
ObjectPascal

unit RTC;
interface
uses
console, isrmanager, util, TMR_0_ISR;
type
TDateTime = record
Seconds : uint8;
Minutes : uint8;
Hours : uint8;
Weekday : uint8;
Day : uint8;
Month : uint8;
Year : uint8;
Century : uint8;
end;
procedure init;
function getDateTime : TDateTime;
function weekdayToString(Weekday : uint8) : pchar;
implementation
var
DateTime : TDateTime;
function weekdayToString(Weekday : uint8) : pchar;
begin
case Weekday of
0:weekdayToString:= 'Saturday';
1:weekdayToString:= 'Sunday';
2:weekdayToString:= 'Monday';
3:weekdayToString:= 'Tuesday';
4:weekdayToString:= 'Wednesday';
5:weekdayToString:= 'Thursday';
6:weekdayToString:= 'Friday';
else weekdayToString:= 'Unknown';
end;
end;
function is_update_in_progress : boolean;
var
bin : uint8;
begin
outb($70, $0A);
io_wait();
bin:= inb($71);
is_update_in_progress:= (bin AND ($1 SHL 7)) <> 0;
end;
procedure update();
begin
//outb($70, $0C); // select register C
//io_wait();
//inb($71);
//console.writestringln('RTC Update');
//while not is_update_in_progress do begin
//end;
//while is_update_in_progress do begin
//end;
outb($70, $00);
io_wait();
DateTime.Seconds:= BCDToUint8(inb($71));
io_wait();
outb($70, $02);
io_wait();
DateTime.Minutes:= BCDToUint8(inb($71));
io_wait();
outb($70, $04);
io_wait();
DateTime.Hours:= BCDToUint8(inb($71));
io_wait();
outb($70, $06);
io_wait();
DateTime.Weekday:= BCDToUint8(inb($71));
io_wait();
outb($70, $07);
io_wait();
DateTime.Day:= BCDToUint8(inb($71));
io_wait();
outb($70, $08);
io_wait();
DateTime.Month:= BCDToUint8(inb($71));
io_wait();
outb($70, $09);
io_wait();
DateTime.Year:= BCDToUint8(inb($71));
io_wait();
outb($70, $32);
io_wait();
DateTime.Century:= BCDToUint8(inb($71));
io_wait();
end;
function getDateTime : TDateTime;
begin
update();
getDateTime:= DateTime;
end;
procedure init;
var
prev : uint8;
begin
CLI;
//setup RTC
outb($70, $8A);
io_wait();
outb($71, $20);
io_wait();
//enable ints
outb($70, $8B);
io_wait();
prev:= inb($71);
io_wait();
outb($70, $8B);
io_wait();
outb($71, prev OR $40);
STI;
outb($70, $00);
inb($71);
//isrmanager.registerISR(32 + 8, @update);
//TMR_0_ISR.hook(uint32(@update));
end;
end.