Předvádím Vám jeden ze způsobů, jak v TBASICu napsat fungující analogové (ručičkové) hodiny. Celé je to napsáno strukturovaně, tedy alespoň do té míry, jak to TBASIC umožňuje.
Vlastní počítání času je přenecháno samotnému TBASICu - program má k dispozici digitální 24hodinový čas v proměnné TIME$.
Nyní ale k vlastnímu programu:.
10 - 30 Protože bude program muset pro výpočty souřadnic ručiček používat dosti pomalé funkce SIN a COS, je v inicializaci předpočítáno 60 hodnot (pro 60 minutových čárek) a uloženo do polí S(60) a C(60). Dále je zde dimenzována pomocná proměnná T$.
40 Nastavení hodin TIME$. Příkazy POKE na ř. 10 a 40 pouze řídí viditelnost kurzoru.
50 Nastavení vzhledu hodin. O je vnější poloměr hodin, S a M je vnitřní poloměr (minutové a hodinové čárky), SR je délka vteřinové ručičky, VR velké a MR malé ručičky.
60 Nastavení gr. módu 24 a barev.
70 - 140 Vykreslení 60 čárek ciferníku. Je-li počet minut (počítadlo I) dělitelné 5, vykreslí se delší hodinová čárka.
160 Začátek nekonečné smyčky.
170 Aktualizace pomocné proměnné T$.
180 SS je aktuální počet sekund.
190 Je-li jiný než v minulém průchodu (SSO), provede se vykreslovací procedura v podmínce.
200 MM je aktuální počet minut.
210 HH je aktuální počet hodin.
220 Převedení HH na 12hodinový cyklus.
230 Převedení HH (0-11) na HH (0-59) - srovnání formátu. HH se potom posunuje každých 12 minut o jednu minutovou čárku. Zároveň je zajištěno, že k posunu dochází o 6 minut dříve. Hodinová ručička potom setrvává např. přesně na třetí hodině v rozmezí 2:54:OO - 3:05:59.
Všechny hodnoty SS, MM a HH mají tedy teď stejný formát: udávají číslo minutové čárky, kam bude příslušná ručička ukazovat.
240 Pokud došlo ke změně MM, provede se podmínka 250 - 330
250 Pokud došlo ke změně HH, provede se podmínka 260 - 290
260, 270 Vymazání staré hodinové ručičky, je-li třeba.
280 Nastavení HHO.
290 Konec podmínky.
300, 310 Vymazání staré minutové ručičky, je-li třeba.
320 Nastavení MMO.
330 Konec podmínky.
340, 350 Vymazání staré sekundové ručičky.
360, 370 Obnovení sekundové ručičky.
380 - 410 Obnovení velké a malé ručičky. Všiměte si, že tyto ručičky se mažou jen je-li to třeba, obnovují se ale každou sekundu (neboli každý průběh podmínky 190 - 430). Je tomu tak proto, že např. při mazání sekundové ručičky kousek za hodinovou by došlo k umazání části hodinové, a to u středu ciferníku, kde by měly díky blízkosti kousek společný.
420 Nastavení SSO.
430 Konec podmínky.
440 Konec celého cyklu, vyčkává se na posunutí času o 1 sekundu.
Původně jsem chtěl do hodin začlenit i datum a stopky, nakonec jsem od toho ale upustil. Nemělo by to praktický efekt a konečně by se tím porušil poměrně pěkný vzhled hodin.
P.S. Pokud chcete udělat něco podobného v ATARI BASICu či v assembleru, zřejmě budete k počítání času používat čítače na adresách 18 - 20. (Adresa 20 se inkrementuje každou 1/50 sekundy a postupně hodnota přetéká do 19 a 18.) Jak jsem si prakticky ověřil, záleží na tom, kdy tuto hodnotu čtete. Občas se může stát, že přečtete hodnotu adresy 19 a než zjistíte obsah adresy 20, proběhne VBI a dvacítka zrovna přeteče. To vy však nepoznáte a dostanete o cca 5 sekund nižší čas. Tím pádem dojde k trhnutí sekundové ručičky o 5 sekund zpět. (TBASICový TIME$ je nastavován ve VBI, čili k tomuto efektu nedochází.)
Jan Walla