132 lines
2.5 KiB
ObjectPascal
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. |