Bajtek 1/1989
Bajtek 1/1989

I kolejny numer Bajtka został zreduksowany - tym razem pod nóż poszedł pierwszy numer z 1989 roku. Numer jak numer, oprócz w miarę fajnej okładki w środku dojrzewa nie tylko nowy layout ale przede wszystkim nowe podejście do rzeczywistości - ...

Zobacz stronę związaną z tym artykułem w Reduksach Try2emu
Spis treści:
Listingi dołączone do numeru w ReadyRun

KLAN AMSTRAD — SCHNEIDER

Czas i data w Turbo-Pascal'u

Na dyskietce systemowej Amstrada PCW 8256 można znaleźć program DATE.COM. Pozwala on ustawić czas i godzinę zegara systemowego. Niestety we własnych programach nie mamy dostępu do tego zegara, dopóki sami nie napiszemy procedur, które to zrobią.

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:

  1. ilość dni od 1 stycznia 1978 roku — dwa byte'y
  2. godzina — 1 byte (dwie cyfry w formacie BCD)
  3. minuty — 1 byte (dwie cyfry w formacie BCD)
  4. 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.

Czytaj także w dziale KLAN AMSTRAD — SCHNEIDER
„Arnold”
Marek Car - Bajtek 5-6/1986

Alan Sugar jest Irańczykiem. Swa działalność gospodarczą rozpoczynał w Wielkiej Brytanii od montowania anten samochodowych. Dziś jego nazwisko zna cały komputerowy świat. Joe Oki jest Japończykiem. Odebrał staranne wykształcenie. Cztery lata temu związał się ściśle z Alanem Sugarem. Ich dzieckiem jest ARNOLD.

„Amstrad– Schneider CPC 464”
Roman Poznański - Bajtek 5-6/1986

Amstrad 464 i jego bliźniak — Schneider produkowane są już od dwóch lat. Ich popularność — także w naszym kraju — jest bardzo duża Amstrad sprzedawany jest głównie w Wielkiej Brytanii. Francji i Stanach Zjednoczonych, podczas gdy Schneider dominuje na rynku zachodnioniemieckim. Jedyna różnica między nimi polega na innym ustawieniu zwor elektrycznych na płytce, co powoduje pojawienie się różnych komunikatów po włączeniu komputera.

„CPC 6128”
Wojciech Ziółek - Bajtek 8/1986

W niespełna rok po wejściu na rynek mikrokomputera CPC 464 i pół roku po debiucie „przejściowego” modelu (o którym pare słów pod koniec artykułu) CPC 664, firma Amstrad stała się nieomal monopolista w kręgu wytwórców komputerów ośmiobitowych, wypuszczając CPC 6128.

„Czas i data w Turbo-Pascal'u”

Na dyskietce systemowej Amstrada PCW 8256 można znaleźć program DATE.COM. Pozwala on ustawić czas i godzinę zegara systemowego. Niestety we własnych programach nie mamy dostępu do tego zegara, dopóki sami nie napiszemy procedur, które to zrobią.