Atari Real Clock


       Wielu Atarowców słyszało zapewne, że istnieje coś takiego jak R-Time 8 -zegar czasu rzeczywistego współpracujący z małymi Atarynkami. Niektórzy mogą nawet pochwalić się, że widzieli to cudo "na żywo". Jednak tylko nieliczni szczęśliwcy cieszą się posiadaniem zegara i możliwością używania go na co dzień. Sprzęt ten był i jest dość rzadko występującym dodatkiem dla naszego pupila, a zastosowane w nim rozwiązania techniczne skutecznie utrudniają zwykłe "skopiowanie" go. Brak jest po prostu odpowiednich "części zamiennych". Czyżby więc pozostał nam płacz i zgrzytanie zębów?

       Już nie, bo oto jest Atari Real Clock. Zegarek skonstruowany przez niejakiego Pasia/SSG - czy znacie gościa?

       Po szczegóły dotyczące budowy, czy też działania A.R.C. "od wewnątrz", odsyłam do stosownego artka, który - mam nadzieję - znajdzie się w tym magazynie. Tutaj chciałbym przedstawić zegar z punktu widzenia użytkownika/programisty, a także zaprezentować handler urządzenia dla systemu Sparta DOS X.

       Model Atari Real Clock'a, który otrzymałem do testów, miał postać przelotowego cartridge'a. Jednak jak obiecuje Pasiu, nie powinno być problemu z upchaniem zegara np. wewnątrz carta SDX, albo pod maską komputera - do wyboru, do koloru. Dla procesora 6502 zegar jest dostępny poprzez szesnaście czterobitowych rejestrów umieszczonych pod adresami $D520-$D52F (młodsze połówki bajtów). Znaczenie rejestrów jest następujące:

$D520 (S1) Cyfra jedności sekund (bity 0-3), przyjmuje wartości z zakresu 0-9.
$D521 (S10) Cyfra dziesiątek sekund (bity 0-2), przyjmuje wartości z zakresu 0-6.
Bit 3 zawsze skasowany (0).
$D522 (MI1) Cyfra jedności minut (jak S1).
$D523 (MI10) Cyfra dziesiątek minut (jak S10).
$D524 (H1) Cyfra jedności godzin (jak S1).
$D525 (H10) Cyfra dziesiątek godzin (bity 0-1), przyjmuje wartości 0-2 w trybie 24h lub 0-1 w trybie 12h (AM/PM).
Bit 2 w trybie 24h zawsze skasowany, a w trybie 12h informuje o porze dnia: 0-AM, 1-PM.
Bit 3=0
$D526 (D1) Cyfra jedności dnia (jak S1).
$D527 (D10) Cyfra dziesiątek dnia (bity 0-1), przyjmuje wartości z zakresu 0-3.
Bity 2-3 zawsze skasowane.
$D528 (MO1) Cyfra jedności miesiąca (jak S1).
$D529 (MO10) Cyfra dziesiątek miesiąca (bit 0), Wartość 0 lub 1. Bity 1-3 = 0
$D52A (Y1) Cyfra jedności roku (jak S1).
$D52B (Y10) Cyfra dziesiątek roku (jak S1).
$D52C (W) Numer dnia tygodnia (bity 0-2). Wartości 0-6, 0 to poniedziałek.
Bit 3 zawsze skasowany.
$D52D (RegD) Bit 0 - Busy Flag
Bit 1 - IRQ Adj
Bit 2 - 30s
Bit 3 - nieużywany
Do czego służą te rejestry, szczerze mówiąc nie wiem. Kość zegara pochodzi z rozszerzenia pamięci do Amigi 500, być może tam rejestry te miały jakieś konkretne zastosowanie. W naszym przypadku należy je po prostu olać.
$D52E (RegE) Bit 0 - INT/STD
Bit 1 - t0
Bit 2 - t1
Bit 3 - nieużywany
Patrz uwaga do $D52D.
$D52F (RegF)
Bit 0- Reset - ustawienie bitu resetuje podobno układ. Objawia się to zatrzymaniem zegara.
Bit 1- Stop - jedynka zatrzymuje zegar.
Bit 2- 24/12 - wybór trybu pracy:
0 - tryb 12h (AM/PM),
1 - tryb 24h.
Rejestr jest do zapisu i do odczytu, więc można tu także sprawdzić jaki tryb jest aktualnie włączony.
Uwaga: w niektórych modelach, by zmienić tryb pracy, zegar trzeba najpierw zresetować - (?).
Włączenie trybu 24h może wyglądać tak:
                  lda #$01
                  ldx #$04
                  sta $d52f
                  stx $d52f


Bit 3- Test - ustawienie bitu powoduje kilkudziesięciokrotne przyspieszenie zegara. Przy normalnej pracy bit powinien być skasowany.

       Powyższe informacje powinny w zasadzie wystarczyć do korzystania z zegara we własnych programach. Jak widać, nie ma tutaj żadnej filozofii: odczyt czasu, to po prostu zczytanie kolejnych rejestrów, a zapis - odwrotnie. Ale żeby nie było tak łatwo: wyobraźmy sobie, że w momencie, kiedy zaczynamy czytać czas, jest godzina 23:59:59. Czytamy kolejne rejestry od $D520 począwszy, a tu przed $D526 zmieniła się godzina. Odczytaliśmy starą godzinę z nową datą - ups, pomyłka o dobę. Żeby ustrzec się przed taką sytuacją, wystarczy odczytać zegar drugi raz i sprawdzić, czy się zmienił. Jeśli nie to OK, a jeśli tak to jeszcze raz odczytujemy rejestry - ich stan zmienia się nie częściej niż co sekundę, więc jeśli przed chwilą się zmienił, to... sekunda to wbrew pozorom bardzo długo. Podobnie rzecz ma się w przypadku zapisu czasu - lepiej sprawdzić to co się zapisało.

       Na zakończenie chciałbym opisać handler przeznaczony do obsługi A.R.C. pod kontrolą Sparta DOS X. Instaluje się go standardowo, tj. poleceniem DEVICE w pliku CONFIG.SYS - choć równie dobrze można proga uruchomić bezpośrednio z linii poleceń. Procka zanim zainstaluje handler sprawdza, czy zegar jest i czy działa. Test trwa około półtorej sekundy, co może być trochę wkurzające, bo o te półtorej sekundy wydłuża się start systemu. Jak testuję? Sprawdzam czy rejestr sekund się zmienia - proste i dlatego trwa tak długo. Można jednak test wyłączyć dodając parametr /T za nazwą pliku - zegara nie odłącza się przecież co chwilę, więc po co za każdym razem go sprawdzać. Rozpoznawane są jeszcze parametry /H i /? - powodują one wyświetlenie małego helpa, wstrzymując jednocześnie dalszą instalację.

Uwaga: ponieważ handler zakłada, że zegar pracuje w trybie 24h, to podczas instalacji tryb jest odpowiednio przełączany. Może to spowodować zmianę godziny (cofnięcie o 12h), jeśli wcześniej był tryb 12h i godzina popołudniowa. O ile wiem, nie ma jeszcze żadnego oprogramowania, które pracowałoby w trybie 12h, więc nie powinno być z tym problemów - chyba, że ktoś ręcznie będzie próbował coś ustawiać.

To wszystko.

Qcyk/Dial