W tym krótkim artykule chciałbym przedstawić dwie użyteczne funkcje: TIME i DATE (ich wydruk i przebieg testowy). Funkqe te mogą być umieszczone w dowolnym własnym programie pascalowym, jeśli potrzebujemy posługiwać się w nim czasem i datą. Obie funkcje korzystają ze 105 odwołania BDOS'a (Basic Disk Operating System), aby dostać się do struktury TOD systemu ĆP/M Plus, składającej się z następujących pól:
- ilość dni od 1 stycznia 1978 roku — dwa byte'y
- godzina — 1 byte (dwie cyfry w formacie BCD)
- minuty — 1 byte (dwie cyfry w formacie BCD)
- sekundy — 1 byte (dwie cyfry w formacie BCD)
W przypadku korzystania z odwołania BDOS'a w formie procedury Turbo-Pascalowej nie ma dostępu do sekund. Trudność tę można ominąć traktując odwołanie do systemu operacyjnego jako funkcję. Instrukcja
a: = BDOS(get TOD, addr (TOD));
zastosowana w funkcji TIME oprócz dostępu do godzin i minut podstawia na zmienną a liczbę sekund podaną w formacie BCD. Funkcja ta jest bardzo prosta i nie wymaga dalszego komentarza. Bardziej skomplikowany jest przypadek funkcji DATE, ale objaśnienia umieszczone w tekście programu powinny wystarczyć do zrozumienia jej działania.
Możliwe jest napisanie funkcji SetTime i SetDate, zadających odpowiednio czas i datę, które mogłyby zastąpić korzystanie z programu DATE.COM. W tym wypadku używając tej samej struktury TOD należy posłużyć się 104 funkcją BDOS'a.
Osoby korzystające na PCW lub CPC z innego języka programowania, np. BASICu mogą bez trudu przenieść ten pomysł i algorytm, na ten właśnie język.
program TimeDate:
(**************************************************)
(* program demonstrujacy zastosowanie funkcji: *)
(* TIME I DATE w Turbo-Pascalu w systemie CP/M + *)
(* (C) JM Sierpien 1987 *)
(**************************************************)
const
getTOD = $69; type
TODrec = record
n_day: integer; (* dni od 1 stycznia 1978 *)
hour : byte; (* godzina w formacie BCD *)
min : byte; (* minuty w formacie BCD *)
ddd : byte; (* puste *)
end;
DTstring = string(.8.);
function time ; DTstring;
var
TOD: TOOrec; a: integer;
s1,s2,h1,h2,i1,i2:byte;
begin
a:=BDOS(getTOD,addr(TOD));
with TOD
do begin
(* wyznaczenie godzin, minut i sekund *)
h1 := hour shr 4; h2 := hour and $0F;
m1 := min shr 4; m2 := min and $0F;
s1 := a shr 4; s2 := a and $0F;
(* zwroc wynik funkcji time *)
time := chr(48*h1)+chr(48+h2)+':'
+chr(48+m1)+chr(48+m2)+':' +chr(48+s1)+chr(48+s2);
end;
end; (* of time *)
function date ; DTstring;
const
months ; array(.1..12.) of byte =
(31,28,31,30,31,30,31,31,30,31,30,31);
var
TOD ; TODrec;
days ; integer;
year,month,day,flag: byte;
d1,d2,i1,i2,y1,y2 : byte;
begin
BDOS (getTOD,addr(TOD));
days := TOD.n_day;
(* wyznacz rok *)
year := 78; (* 1978 1 Styczen *)
repeat
if year mod 4 = 0
then flag := 1
else flag := 0;
days := days - 365 - flag;
year := year + 1;
until days<0;
year := year - 1;
(* wyznacz miesiac *)
month := 12;
repeat
days := days + month(.month.);
if month=2 then days := days + flag;
month := month - 1;
until days>0: month := month + 1;
(* wyznacz dzien *)
day := days;
d1 := day div 10; d2 := day mod 10;
m1 := month div 10; m2 := month mod 10;
y1 := year div 10; y2 := year mod 10;
(* zwroc wynik funkcji date *)
date := chr(48+dl)*chr(48+d2) +
',' + chr(48+m1)*chr(48+m2) +
',' + chr(48+y1)*chr(48+y2);
end; (* of date *)
begin
writeln('czas: ',time);
writeln('data: ',date);
end.
