Řešení hlavolamu z čísla 35

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