Obsah této kapitoly jistě dává do ruky mocný argument oponentům: otírá se (a to, prosím, opakovaně) o kalkulátory obdařené AOS stejně jako kapitola minulá. Není to známka poklonkování, servility či devótnosti, chcete-li, před systémem AOS. Je však třeba bez vší ironie a laciného přezírání brát vážně konkurenční výrobky takového kalibru jako je TI-58/59. Právě z jejího programového modulu Master Library je zcela bezostyšně vykraden programový blok s pořadovým číslem 20. Algoritmus pro výpočet dne v týdnu a počtu dní mezi dvěma daty je pro svoji jednoduchost natolik dráždivý, že v kombinaci s pocitem nádechu jeho praktické použitelnosti lze jen s vypětím všech sil (a morálně volních vlastností) odolat pokušení o implementaci pro stroj s RPN. Implementace se urodily pro HP-35s, HP-42s a HP-15C.
Nejprve krátký pohled, jak na to šli borci z Texasu. Na následujících čtyřech "proužcích papíru" z tiskárny PC-100C je originální kód programu pro TI-58/59.
000 76 LBL 001 78 Σ+ 002 53 ( 003 93 . 004 04 4 005 65 × 006 43 RCL 007 01 01 008 85 + 009 02 2 010 93 . 011 03 3 012 54 ) 013 59 INT 014 94 +/- 015 85 + 016 61 GTO 017 77 x≥t 018 76 LBL 019 79 x 020 00 0 021 35 1/x 022 92 RTN 023 76 LBL 024 10 E' 025 53 ( 026 42 STO 027 01 01 028 29 CP 029 22 INV 030 77 x≥t 031 79 x 032 22 INV 033 59 INT 034 22 INV 035 44 SUM 036 01 01 037 65 × 038 04 4 039 22 INV 040 28 log 041 54 ) 042 42 STO 043 03 03 044 32 x↔t 045 01 1 046 05 5 047 08 8 048 01 1 049 77 x≥t |
050 79 x 051 03 3 052 02 2 053 32 x↔t 054 53 ( 055 53 ( 056 43 RCL 057 01 01 058 55 ÷ 059 01 1 060 00 0 061 00 0 062 54 ) 063 42 STO 064 01 01 065 22 INV 066 59 INT 067 22 INV 068 44 SUM 069 01 01 070 65 × 071 01 1 072 00 0 073 00 0 074 54 ) 075 42 STO 076 02 02 077 77 x≥t 078 79 x 079 01 1 080 03 3 081 32 x↔t 082 43 RCL 083 01 01 084 77 x≥t 085 79 x 086 53 ( 087 03 3 088 06 6 089 05 5 090 65 × 091 43 RCL 092 03 03 093 85 + 094 43 RCL 095 02 02 096 85 + 097 03 3 098 01 1 099 65 × |
100 43 RCL 101 01 01 102 75 - 103 03 3 104 01 1 105 85 + 106 03 3 107 32 x↔t 108 43 RCL 109 01 01 110 77 x≥t 111 78 Σ+ 112 01 1 113 22 INV 114 44 SUM 115 03 03 116 76 LBL 117 77 x≥t 118 53 ( 119 43 RCL 120 03 03 121 55 ÷ 122 04 4 123 54 ) 124 59 INT 125 75 - 126 53 ( 127 93 . 128 07 7 129 05 5 130 85 + 131 53 ( 132 43 RCL 133 03 03 134 55 ÷ 135 01 1 136 00 0 137 00 0 138 54 ) 139 59 INT 140 65 × 141 93 . 142 07 7 143 05 5 144 54 ) 145 59 INT 146 54 ) 147 92 RTN 148 76 LBL 149 11 A |
150 10 E' 151 42 STO 152 04 04 153 00 0 154 92 RTN 155 76 LBL 156 12 B 157 10 E' 158 42 STO 159 05 05 160 00 0 161 92 RTN 162 76 LBL 163 13 C 164 53 ( 165 43 RCL 166 05 05 167 75 - 168 43 RCL 169 04 04 170 54 ) 171 92 RTN 172 76 LBL 173 14 D 174 53 ( 175 53 ( 176 10 E' 177 42 STO 178 01 01 179 94 +/- 180 55 ÷ 181 07 7 182 54 ) 183 59 INT 184 65 × 185 07 7 186 85 + 187 43 RCL 188 01 01 189 54 ) 190 92 RTN |
000 - 017 | Pokračování výpočtu faktoru (viz níže) pro měsíce březen až prosinec. |
018 - 022 | Hlášení o chybném zadání. |
023 - 147 | Výpočet faktoru. Tento blíže nespecifikovný termín je převzat z originální (německé) dokumentace. Výsledek dělení této hodnoty počtem dní v roce (pro ty, kteří o tom neradi přemýšlejí, je to 365) naznačuje, že tajemný faktor udává počet dní od začátku letopočtu. Zároveň jsou mezi řádky 028 - 085 prováděny kontroly zadání. Tím je vždy jediná hodnota (číslo ve tvaru MMDD.YYYY) udávající příslušné datum. |
148 - 190 | Zadání hodnot a spouštění jednotlivých výpočtů. |
Zde předkládané RPN řešení je pro HP-35s. Modifikace pro jiný RPN kalkulátor by byla velmi snadná. Stačí (1) nahradit (nebo obejít prostřednictvím více skoků) funkci znaménka SGN na řádku L026 a (2) spočítat zbytek po dělení, není-li k dispozici instrukce RMDR.
Nové řešení není otrockým přepisem výchozího řešení. Co je v novém RPN pojetí jinak ukazuje následující souhrn:
p | nějaká předchozí hodnota | y | rok |
m | měsíc |
d | den |
f | faktor (viz výše) |
v | mezivýsledek |
ADDR | CODE | X | Y | Z | T |
---|---|---|---|---|---|
Vstupní bod pro výpočet dne v týdnu | |||||
L001 | LBL L | p | |||
L002 | XEQ L012 | f | p | ||
L003 | 1 | 1 | f | p | |
L004 | - | f - 1 → f | p | ||
L005 | 7 | 7 | f | p | |
L006 | RMDR | 0 ... 6 | p | ||
L007 | RTN | výsledek | p | ||
Vstupní bod pro výpočet počtu dní mezi dvěma daty | |||||
L008 | XEQ L012 | f1 | |||
L009 | XEQ L012 | f2 | f1 | f1 | f1 |
L010 | - | f1 - f2 | f1 | f1 | f1 |
L011 | RTN | výsledek | f1 | f1 | f1 |
Výpočet faktoru zadaného data | |||||
L012 | INPUT Y | y | p | ||
L013 | INPUT M | m | y | p | |
L014 | INPUT D | d | m | y | p |
L015 | R↑ | p | |||
L016 | 365 | 365 | p | ||
L017 | RCL× Y | 365 y | p | ||
L018 | RCL+ D | 365 y + d | p | ||
L019 | 31 | 31 | 365 y + d | p | |
L020 | RCL× M | 31 m | 365 y + d | p | |
L021 | LASTx | 31 | 31 m | 365 y + d | p |
L022 | - | 31 m - 31 | 365 y + d | p | |
L023 | + | 365 y + d + 31 m - 31 | p | ||
L024 | -3 | -3 | v | p | |
L025 | RCL+ M | m - 3 | v | p | |
L026 | SGN | sign(m - 3) | v | p | |
L027 | x<0? | Je to leden nebo únor? | |||
L028 | GTO L037 | -1 | v | p | |
L029 | R↓ | v | p | ||
L030 | 0.4 | 0.4 | v | p | |
L031 | RCL× M | 0.4 m | v | p | |
L032 | 2.3 | 2.3 | 0.4 m | v | p |
L033 | + | 0.4 m + 2.3 | v | p | |
L034 | IP | intg(0.4 m + 2.3) | v | p | |
L035 | - | v - intg(0.4 m + 2.3) | p | ||
L036 | 0 | 0 | v | p | |
L037 | RCL+ Y | y nebo (y - 1) | v | p | |
L038 | 4 | 4 | y | v | p |
L039 | ÷ | y / 4 | v | p | |
L040 | IP | intg(y / 4) | v | p | |
L041 | LASTx | y / 4 | intg(y / 4) | v | p |
L042 | R↓ | intg(y / 4) | v | p | y / 4 |
L043 | + | v + intg(y / 4) | p | y / 4 | y / 4 |
L044 | R↑ | y / 4 | v | p | |
L045 | 25 | 25 | y / 4 | v | p |
L046 | ÷ | y / 100 | v | p | |
L047 | IP | intg(y / 100) | v | p | |
L048 | 0.75 | 0.75 | intg(y / 100) | v | p |
L049 | × | 0.75 intg(y / 100) | v | p | |
L050 | LASTx | 0.75 | 0.75 intg(y / 100) | v | p |
L051 | + | 0.75 + 0.75 intg(...) | v | p | p |
L052 | IP | intg(0.75 + ...) | v | p | p |
L053 | - | v - intg(0.75 + ...) | p | p | p |
L054 | RTN | výsledek | p | p | p |
LN=185, CK=EFB0 |
Použití programu:
Stisk kláves | Činnost | Display |
---|---|---|
1) Který den v týdnu byl 4. října 1978 | ||
XEQ L ENTER | spuštění programu | Y? 0.0000 |
1 9 7 8 | rok | Y? 1978_ |
R/S | M? 0.0000 | |
1 0 | měsíc | M? 10_ |
R/S | D? 0.0000 | |
4 | den | D? 4_ |
R/S | výpočet | RUNNING |
výsledek: středa (3) | 0.0000 3.0000 | |
2) Počet dní mezi daty: 2. července 1964 až 4. října 1978 | ||
XEQ L 0 0 8 | spuštění programu | Y? 1,978.0000 |
R/S | ponechat datum... | M? 10.0000 |
R/S | ...z předchozího příkladu | D? 4.0000 |
R/S | výpočet faktoru prvního data | RUNNING |
druhé datum bude jiné | Y? 1,978.0000 | |
1 9 6 4 | rok | Y? 1964_ |
R/S | M? 10.0000 | |
7 | měsíc | M? 7_ |
R/S | D? 4.0000 | |
2 | den | D? 2_ |
R/S | dokončení výpočtu | RUNNING |
výsledek: 5207 dní | 277,276.0000 5,207.0000 |
Ve výčtu odlišností od verze pro TI-58/59 je hanebně zamlčen jeden dost vážný nedostatek. Pro opakované spuštění určení počtu dní mezi dvěma daty je vždy třeba zadat oba údaje - přitom potřeba zjišťovat počet dní mezi pevně zadaným datem a sérií měnících se dat je zcela jistě legitimní. K tomu přistupuje ještě jedna přitěžující okolnost: v případě výpočtu dní mezi dvěma daty je třeba hrůzostrašných pět stisků kláves k tomu, aby se program vůbec rozeběhl! Model HP-35s bohužel nemá klávesy pro přímé spouštění podprogramů, jaké známe z typů HP-67, HP-41C nebo HP-15C, a které byly vlastní i konkurenčním strojům z provenience Texas Instruments. Právě tyto klávesy dělaly ovládání programů z výměnných softwarových modulů kalkulátorů TI-58/59 uživatelsky přítulným.
Naštěstí není tak zle, jak by se na první pohled mohlo zdát. Z posledních řádků podprogramu výpočtu faktoru je vidět, že předchozí hodnota (což může být klidně faktor předešle zadaného data) je "rozplevelen" mezi Y-, Z- a T-registr RPN stacku. Toho lze s výhodou využít. Stačí tuto hodnotu přesunout do X-registru (instrukcí R↓) a výpočet spustit od zadání druhého data (instrukcí GTO L009).
Přátelé, přiznejme si, že zahájením iterace opakovaného výpočtu stiskem šesti kláves (z toho čtyři určují adresu, která musí být za každých okolností správná) je zaděláno na neúspěch. Zvyšovat pravděpodobnost dosažení chybného výsledku tak krkolomnou obsluhou je neúnosné. Jakoby nestačilo riziko chybného zadání roků, měsíců a dní... Vhodnější bude obětovat dva programové řádky/kroky navíc a zmíněné instrukce umístit na začátek programové paměti (viz PRGM TOP) třeba i bez označení návěštím (instrukce LBL). Instrukce RTN na adrese L011 ukončující běh ručně spuštěného programu vrátí čítač adres zpět na PRGM TOP, takže GTO . . je provedeno pouze poprvé. A vlastně nepovinně - všechny části tohoto programu svoji činnost končí instrukcí RTN. Použití se pak jednoduchostí vyrovná tomu původnímu Made in Texas.
ADDR | CODE | X | Y | Z | T |
---|---|---|---|---|---|
0001 | R↓ | f1 | |||
0002 | GTO L009 | f1 |
Použití programu:
Stisk kláves | Činnost | Display |
---|---|---|
XEQ L 0 0 8 | spuštění programu | Y? 0.0000 |
1 9 8 6 | rok | Y? 1986_ |
R/S | M? 0.0000 | |
3 | měsíc | M? 3_ |
R/S | D? 0.0000 | |
2 0 | den | D? 20_ |
R/S | výpočet faktoru prvního data | RUNNING |
druhé datum | Y? 1,986.0000 | |
1 9 6 4 | rok | Y? 1964_ |
R/S | M? 3.0000 | |
7 | měsíc | M? 7_ |
R/S | D? 20.0000 | |
2 | den | D? 2_ |
R/S | dokončení výpočtu 1. rozdílu | RUNNING |
výsledek: 7931 dní | 725,450.0000 7,931.0000 | |
GTO . . | spuštění výpočtu od adresy... | 725,450.0000 7,931.0000 |
R/S | ...PRGM_TOP pro další rozdíl | Y? 1,964.0000 |
1 9 7 8 | rok | Y? 1978_ |
R/S | D? 7.0000 | |
1 0 | měsíc | M? 10_ |
R/S | D? 2.0000 | |
4 | den | D? 4_ |
R/S | výpočet 2. rozdílu | RUNNING |
výsledek: 2724 dní | 725,450.0000 2,724.0000 | |
R/S | výpočet dalšího rozdílu od PRGM_TOP | Y? 1,986.0000 |
1 9 8 4 | rok | 1984_ |
R/S | M? 10.0000 | |
4 | měsíc | M? 4_ |
R/S | D? 4.0000 | |
3 | den | D? 3_ |
R/S | výpočet 3. rozdílu | RUNNING |
výsledek: 716 dní | 725,450.0000 716.0000 |
Z úcty ke klasice je zde ještě jedna verze téhož. Ono vlastně použití termínu verze není zcela korektní, spíše se jedná o drobnou modifikaci... Ale dost výmluv a jiných žvástů, prostě sled instrukcí pro HP-35s je zopakován (a jen minimálně upraven), tentokrát v notaci HP-42s.
ADDR | CODE | X | Y | Z | T |
---|---|---|---|---|---|
Vstupní bod pro výpočet dne v týdnu | |||||
01 | LBL "ML20W" | p | |||
02 | XEQ 00 | f | p | ||
03 | 1 | 1 | f | p | |
04 | - | f - 1 → f | p | ||
05 | 7 | 7 | f | p | |
06 | MOD | 0 ... 6 | p | ||
07 | RTN | výsledek | p | ||
Vstupní bod pro výpočet počtu dní mezi dvěma daty | |||||
08 | LBL "ML20D" | ||||
09 | XEQ 00 | f1 | |||
10 | XEQ 00 | f2 | f1 | f1 | f1 |
11 | - | f1 - f2 | f1 | f1 | f1 |
12 | RTN | výsledek | f1 | f1 | f1 |
Výpočet faktoru zadaného data | |||||
13 | LBL 00 | p | |||
14 | + | p → LASTx | |||
15 | RCL 00 | y | |||
16 | "YEAR:" | ||||
17 | PROMPT | ||||
18 | STO 00 | ||||
19 | RCL 01 | m | |||
20 | "MONTH:" | ||||
21 | PROMPT | ||||
22 | STO 01 | ||||
23 | RCL 02 | d | |||
24 | "DAY:" | ||||
25 | PROMPT | ||||
26 | STO 02 | ||||
27 | LASTX | p | |||
28 | 365 | 365 | p | ||
29 | RCL× 00 | 365 y | p | ||
30 | RCL+ 02 | 365 y + d | p | ||
31 | 31 | 31 | 365 y + d | p | |
32 | RCL× 01 | 31 m | 365 y + d | p | |
33 | LASTX | 31 | 31 m | 365 y + d | p |
34 | - | 31 m - 31 | 365 y + d | p | |
35 | + | 365 y + d + 31 m - 31 | p | ||
36 | -3 | -3 | v | p | |
37 | RCL+ 01 | m - 3 | v | p | |
38 | SIGN | sign(m - 3) | v | p | |
39 | X<0? | Je to leden nebo únor? | |||
40 | GTO 01 | -1 | v | p | |
41 | R↓ | v | p | ||
42 | 0.4 | 0.4 | v | p | |
43 | RCL× 01 | 0.4 m | v | p | |
44 | 2.3 | 2.3 | 0.4 m | v | p |
45 | + | 0.4 m + 2.3 | v | p | |
46 | IP | intg(0.4 m + 2.3) | v | p | |
47 | - | v - intg(0.4 m + 2.3) | p | ||
48 | 0 | 0 | v | p | |
49 | LBL 01 | 0 | v | p | |
50 | RCL+ 00 | y nebo (y - 1) | v | p | |
51 | 4 | 4 | y | v | p |
52 | ÷ | y / 4 | v | p | |
53 | IP | intg(y / 4) | v | p | |
54 | LASTX | y / 4 | intg(y / 4) | v | p |
55 | R↓ | intg(y / 4) | v | p | y / 4 |
56 | + | v + intg(y / 4) | p | y / 4 | y / 4 |
57 | R↑ | y / 4 | v | p | |
58 | 25 | 25 | y / 4 | v | p |
59 | ÷ | y / 100 | v | p | |
60 | IP | intg(y / 100) | v | p | |
61 | 0.75 | 0.75 | intg(y / 100) | v | p |
62 | × | 0.75 intg(y / 100) | v | p | |
63 | LASTX | 0.75 | 0.75 intg(y / 100) | v | p |
64 | + | 0.75 + 0.75 intg(...) | v | p | p |
65 | IP | intg(0.75 + ...) | v | p | p |
66 | - | v - intg(0.75 + ...) | p | p | p |
67 | END | výsledek | p | p | p |
Použití je stejné, pouze spuštění jednotlivých částí podléhá "místním zvyklostem": Stisk kláves XEQ L ENTER nahrazuje XEQ ALPHA M L 2 0 W ALPHA a podobně místo XEQ L 0 0 8 je použito XEQ ALPHA M L 2 0 D ALPHA.
Stejně jako u HP-35s i zde platí poznámka o naprosto nesmyslném počtu stisků kláves potřebných ke spuštění programu. Kromě možnosti použití dvouřádkové "berličky" jako v případě provozu na HP-35s je v případě HP-42s ještě jedno (výrazně elegantnější) řešení: Předefinovat některé klávesy příkazem ASSIGN a kalkulátor provozovat v módu USER.
Třetí podoba programu číslo 20 z Master Library kalkulátorů TI-58/59 je pro HP-15C. Předchozí řešení pro stroje s alfanumerickými (a navíc dvouřádkovými) displeji se snažila v co největší míře využít nabízené výhody zobrazení. Ambicí provedení pro HP-15C je maximální možné přiblížení se k původnímu řešení z kalkulátorů TI. Nově vzniklý program bude samozřejmě (co do vnitřní stavby) úplně jiný. Řešení jeho ovládání, tedy vstup a výstup, mohou však být naprosto totožné s ovládáním TI-58/59. Přesto zde jsou drobné odlišnosti, které (doufejme) budou spíše zvýšením uživatelského komfortu, nežli nedostatkem. Pojďme si zmíněné rozdíly vyjmenovat.
Ovládání programu však není jedinou změnou vůči předchozím řešením pro HP-35s resp. HP-42s. Velmi dramaticky se změnila i vlastní stavba programu. Některé změny jsou reakcí na absenci instrukcí, kterými HP-15C na rozdíl od novějších strojů nedisponuje.
#define MAT_ROWS 3 #define MAT_COLS 1 void lbl_0(int date, int mat[MAT_ROWS][MAT_COLS]) { : : lbl_5(mat); } int matA[MAT_ROWS][MAT_COLS], matB[MAT_ROWS][MAT_COLS]; void lbl_A(int date) { lbl_0(date, matA); }Funkce lbl_0() má argument int mat[][]. Je to bázová adresa zpracovávané matice. Tou může být libovolná z matic A nebo B, což funkce lbl_0() nemá šanci rozlišit. Argumentu int mat[][] odpovídá obsah registru RI. Ten je naplněn některým z matrix-descriptorů ve výpisu programu označených jako A 0 0, B 0 0 nebo M 0 0, jde-li o obecné označení reprezentující libovolný ze dvou konkrétních matrix-descriptorů.
Jsou tu ještě dvě malé odlišnosti v porovnání s řešeními pro předchozí kalkulátory HP. Na řádcích programu 086..097 pro HP-15C je poněkud "kostrbatější" postup v porovnání s řádky L016..L021 (pro HP-35s) resp. 28..33 (v případě HP-42s). "Kostrbatost" se projevuje tím, že zde nejsou použity instrukce pro aritmetické operace s registry/proměnnými, ale tyto operace se provádějí "klasicky" s registry "RPN stacku". Důvody jsou hned dva:
ADDR | CODE | X | Y | Z | T | ||
---|---|---|---|---|---|---|---|
Záměna zadání (index [j] zastupuje dvojici [R0, R1]) | |||||||
001 | - | 42,21,15 | LBL E | ||||
002 | - | 42,16, 1 | MATRIX 1 | ||||
003 | - | 42,21, 4 | LBL 4 | ||||
004 | - | 45 11 | RCL A | A[j] | |||
005 | - | 42, 4,12 | x<> B | A[j] ↔ B[j] | |||
006 | u | 44 11 | STO A | Hotovo? | |||
007 | - | 22 4 | GTO 4 | Ne. | |||
008 | - | 45,16,11 | RCL MATRIX A | A 0 0 | |||
009 | - | 44 25 | STO I | A 0 0 | |||
010 | - | 22 5 | GTO 5 | ||||
Den v týdnu | |||||||
011 | - | 42,21,14 | LBL D | ||||
012 | - | 45,16,11 | RCL MATRIX A | A 0 0 | |||
013 | - | 32 2 | GSB 2 | f | |||
014 | - | 1 | 1 | 1 | f | ||
015 | - | 30 | - | f - 1 → f | |||
Zbytek po dělení 7 | |||||||
016 | - | 44 0 | STO 0 | f | |||
017 | - | 7 | 7 | 7 | f | ||
018 | - | 44,10, 0 | STO÷ 0 | 7 | f | ||
019 | - | 42, 4, 0 | x<> 0 | f / 7 | f | ||
020 | - | 43 44 | INT | intg(f / 7) | f | ||
021 | - | 45,20, 0 | RCL× 0 | 7 intg(f / 7) | f | ||
022 | - | 30 | - | f - 7 intg(f / 7) | |||
023 | - | 43 32 | RTN | výsledek | |||
Počet dní mezi dvěma daty | |||||||
024 | - | 42,21,13 | LBL C | ||||
025 | - | 45,16,12 | RCL MATRIX B | B 0 0 | |||
026 | - | 32 2 | GSB 2 | fB | |||
027 | - | 45,16,11 | RCL MATRIX A | A 0 0 | fB | ||
028 | - | 32 2 | GSB 2 | fA | fB | ||
029 | - | 30 | - | fB - fA | |||
030 | - | 43 32 | RTN | výsledek | |||
Zadání data "B" | |||||||
031 | - | 42,21,12 | LBL B | YYYY.MMDD | |||
032 | - | 45,16,12 | RCL MATRIX B | B 0 0 | YYYY.MMDD | ||
033 | - | 22 0 | GTO 0 | B 0 0 | YYYY.MMDD | ||
Zadání data "A" | |||||||
034 | - | 42,21,11 | LBL A | YYYY.MMDD | |||
035 | - | 45,16,11 | RCL MATRIX A | A 0 0 | YYYY.MMDD | ||
Společné zadání data | |||||||
036 | - | 42,21, 0 | LBL 0 | M 0 0 | YYYY.MMDD | ||
037 | - | 44 25 | STO I | M 0 0 | YYYY.MMDD | ||
038 | - | 42,16, 1 | MATRIX 1 | M 0 0 | YYYY.MMDD | ||
039 | - | 33 | R↓ | YYYY.MMDD | |||
040 | - | 43,30, 4 | TEST 4 (x<=0) | Jen zobrazení? | |||
041 | - | 22 5 | GTO 5 | Ano. | |||
042 | - | 3 | 3 | 3 | YYYY.MMDD | ||
043 | - | 45 1 | RCL 1 | 1 | 3 | YYYY.MMDD | |
044 | - | 42,23,25 | DIM I | 1 | 3 | YYYY.MMDD | |
045 | - | 33 | R↓ | 3 | YYYY.MMDD | ||
046 | - | 33 | R↓ | YYYY.MMDD | |||
047 | - | 43 44 | INT | YYYY | |||
048 | u | 44 24 | STO (i) | YYYY → M[1] | |||
049 | - | 32 6 | GSB 6 | MM | |||
050 | - | 32 6 | GSB 6 | DD | MM | ||
051 | u | 44 24 | STO (i) | DD → M[2] | |||
052 | - | 33 | R↓ | MM | |||
053 | u | 44 24 | STO (i) | MM → M[3] | |||
Zobrazení zadání | |||||||
054 | - | 42,21, 5 | LBL 5 | ||||
055 | u | 45 24 | RCL (i) | y | |||
056 | u | 45 24 | RCL (i) | d | y | ||
057 | - | 26 | EEX | 1 00 | d | y | |
058 | - | 4 | 4 | 1 04 | d | y | |
059 | - | 10 | ÷ | d / 10000 | y | ||
060 | - | 40 | + | YYYY.00DD | |||
061 | - | 45 24 | RCL (i) | m | YYYY.00DD | ||
062 | - | 26 | EEX | 1 00 | m | YYYY.00DD | |
063 | - | 2 | 2 | 1 02 | m | YYYY.00DD | |
064 | - | 10 | ÷ | m / 100 | YYYY.00DD | ||
065 | - | 40 | + | YYYY.MMDD | |||
066 | - | 43 32 | RTN | ||||
Výběr měsíce a dne ze zadání (2 řádky hodnot → 2 průchody) | |||||||
067 | - | 42,21, 6 | LBL 6 | ||||
068 | - | 43 36 | LSTx | YYYY.MMDD MM.DD | MM | ||
069 | - | 42 44 | FRAC | 0.MMDD 0.DD | MM | ||
070 | - | 26 | EEX | 1 00 | 0.MMDD 0.DD | MM | |
071 | - | 2 | 2 | 1 02 | 0.MMDD 0.DD | MM | |
072 | - | 20 | × | MM.DD DD.0 | MM | ||
073 | - | 43 44 | INT | MM DD | MM | ||
074 | - | 43 32 | RTN | ||||
Funkce znaménka | |||||||
075 | - | 42,21, 1 | LBL 1 | x | v | p | |
076 | - | 43 20 | x=0 | x | v | p | |
077 | - | 43 32 | RTN | x | v | p | |
078 | - | 36 | ENTER | x | x | v | p |
079 | - | 43 16 | ABS | abs(x) | x | v | p |
080 | - | 10 | ÷ | sign(x) | v | p | p |
081 | - | 43 32 | RTN | ||||
Výpočet faktoru zadaného data | |||||||
082 | - | 42,21, 2 | LBL 2 | M 0 0 | p | ||
083 | - | 44 25 | STO I | M 0 0 | p | ||
084 | - | 33 | R↓ | p | |||
085 | - | 42,16, 1 | MATRIX 1 | p | |||
086 | - | 3 | 3 | 3 | p | ||
087 | - | 6 | 6 | 36 | p | ||
088 | - | 5 | 5 | 365 | p | ||
089 | u | 45 24 | RCL (i) | y | 365 | p | |
090 | - | 20 | × | 365 y | p | ||
091 | u | 45 24 | RCL (i) | d | 365 y | p | |
092 | - | 40 | + | 365 y + d | p | ||
093 | - | 45 24 | RCL (i) | m | 365 y + d | p | |
094 | - | 3 | 3 | 3 | m | 365 y + d | p |
095 | - | 1 | 1 | 31 | m | 365 y + d | p |
096 | - | 20 | × | 31 m | 365 y + d | p | |
097 | - | 43 36 | LSTx | 31 | 31 m | 365 y + d | p |
098 | - | 30 | - | 31 m - 31 | 365 y + d | p | |
099 | - | 40 | + | 365 y + d + 31 m - 31 | p | ||
100 | - | 3 | 3 | 3 | v | p | |
101 | - | 16 | CHS | -3 | v | p | |
102 | - | 45,40,24 | RCL+ (i) | m - 3 | v | p | |
103 | - | 32 1 | GSB 1 | sign(m - 3) | v | p | |
104 | - | 43,30, 2 | TEST 2 (x<0) | Je to leden nebo únor? | |||
105 | - | 22 3 | GTO 3 | -1 | v | p | |
106 | - | 33 | R↓ | v | p | ||
107 | - | 48 | . | 0. | v | p | |
108 | - | 4 | 4 | 0.4 | v | p | |
109 | - | 45,20,24 | RCL× (i) | 0.4 m | v | p | |
110 | - | 2 | 2 | 2 | 0.4 m | v | p |
111 | - | 48 | . | 2. | 0.4 m | v | p |
112 | - | 3 | 3 | 2.3 | 0.4 m | v | p |
113 | - | 40 | + | 0.4 m + 2.3 | v | p | |
114 | - | 43 44 | INT | intg(0.4 m + 2.3) | v | p | |
115 | - | 30 | - | v - intg(0.4 m + 2.3) | p | ||
116 | - | 0 | 0 | 0 | v | p | |
117 | - | 42,21, 3 | LBL 3 | 0 nebo (-1) | v | p | |
118 | - | 42,16, 1 | MATRIX 1 | 0 nebo (-1) | v | p | |
119 | - | 45,40,24 | RCL+ (i) | y nebo (y - 1) | v | p | |
120 | - | 4 | 4 | 4 | y | v | p |
121 | - | 10 | ÷ | y / 4 | v | p | |
122 | - | 43 44 | INT | intg(y / 4) | v | p | |
123 | - | 43 36 | LSTx | y / 4 | intg(y / 4) | v | p |
124 | - | 33 | R↓ | intg(y / 4) | v | p | y / 4 |
125 | - | 40 | + | v + intg(y / 4) | p | y / 4 | y / 4 |
126 | - | 43 33 | R↑ | y / 4 | v | p | |
127 | - | 2 | 2 | 2 | y / 4 | v | p |
128 | - | 5 | 5 | 25 | y / 4 | v | p |
129 | - | 10 | ÷ | y / 100 | v | p | |
130 | - | 43 44 | INT | intg(y / 100) | v | p | |
131 | - | 48 | . | 0. | intg(y / 100) | v | p |
132 | - | 7 | 7 | 0.7 | intg(y / 100) | v | p |
133 | - | 5 | 5 | 0.75 | intg(y / 100) | v | p |
134 | - | 20 | × | 0.75 intg(y / 100) | v | p | |
135 | - | 43 36 | LSTx | 0.75 | 0.75 intg(y / 100) | v | p |
136 | - | 40 | + | 0.75 + 0.75 intg(...) | v | p | p |
137 | - | 43 44 | INT | intg(0.75 + ...) | v | p | p |
138 | - | 30 | - | v - intg(0.75 + ...) | p | p | p |
139 | - | 43 32 | RTN | výsledek | p | p | p |
Použití programu:
Stisk kláves | Činnost | Display |
---|---|---|
[f] USER | aktivovat "USER mode", pokud nebyl | |
1) Který den v týdnu byl 4. října 1978 | ||
1 9 7 8 . 1 0 0 4 | zadání ve formě YYYY.MMDD... | 1,978.1004 |
A | ...datum "A" | 1,978.1004 |
D | spustit výpočet (vždy podle pro datum "A") | running |
výsledek: středa (3) | 3.0000 | |
2) Počet dní mezi daty: 2. července 1964 až 4. října 1978 | ||
1 9 6 4 . 0 7 0 2 | zadat... | 1,964.0702 |
B | ...datum "B" (datum "A" stále platí) | 1,964.0702 |
C | spustit výpočet | running |
výsledek: 5207 dní | -5,207.0000 | |
3) Záměna zadání | ||
E | spustit | running |
výsledek: aktuální datum "A" | 1,964.0702 | |
4) Který den v týdnu byl 2. července 1964 | ||
D | spustit výpočet | running |
výsledek: čtvrtek (4) | 4.0000 | |
5) Zobrazení zadání | ||
0 | nula se neukládá, je to jen značka | 0 |
A | datum "A" | 1,964.0702 |
← | nulu lze zadat i "smazáním displeje" | 0 |
B | datum "B" | 1,978.1004 |
Co říci závěrem? Při porovnání dvou výtvorů - HP-15C vs. HP-35s - musí každého zcela logicky k smrti vyděsit délka programu pro HP-15C: je to šílených 139 řádků/kroků proti polovičnímu počtu pro HP-35s. Otázka "...a kde je ten přínos pro lidstvo?" je naprosto oprávněná. Přesto je zde, ctihodnosti, několik námitek proti argumentům obžaloby. Předně je třeba si uvědomit, že číselné konstanty u "patnáctky" zabírají tolik řádků/kroků, kolik mají cifer. Další drobnou úsporou pro "pětatřicítku" může být použití instrukcí skoků bez nutnosti vytvářet návěští (to je vlastně vidět už i při porovnání délky programů HP-35s vs. HP-42s). Největší měrou se však na enormním nárůstu délky programu podílí jeho - použijme moderní slovník - rozšířená funkcionalita. Kdyby k ní nedošlo, neobsahoval by program bloky řádků 001..010, 040..041 a 054..066, úhrnem tedy 25 řádků. V tu ránu se z obludných 139 dostáváme na 114 řádků, což je sice také obludné, ale - jak praví klasik Jiří Suchý *) - už ne tolik... To už by se dalo pohodlně svést na ty nešťastné číselné konstanty, návěští, chybějící funkce a zcela jiné zpracování vstupních hodnot, které vyžaduje speciální programovou obsluhu.
Také by se dalo s úspěchem polemizovat s nutností uchovávat zadané hodnoty ve formě trojice samostatných čísel (YYYY→M[1,1], MM→M[3,1] a DD→M[2,1]), když to jde evidentně jenom s jedním (YYYY.MMDD). Jasně, že by to šlo. Matice (pokud je vůbec nějaká potřeba) by byla použita jenom jedna pro rozklad zadání na samostatné položky a výpočet faktoru. Odpadly by "manévry" s matrix-descriptory - jediná použitá matice by se adresovala přímo. Určitě by to stálo za úvahu i při nutném použití dalších registrů (R2, R3, atd.; zde použité registry jsou pouze ty "permanentní": RI, R0 a R1). To vše by jistě šlo. Jenže už by to nebyla taková frajeřina!!!
*) "Slovo recitál je cizího původu. Na rozdíl od slova estráda, které je také cizího původu, ale už ne tolik..."