pane

Dec 062019
 

RLC MŮSTEK

Návod k obsluze

Obsah

Popis
Měření
Měření odporů stejnmosměrným napětím
Měření velmi malých odporů
Měření odporů střídavým napětím
Měření kapacit
Měření velmi malých kapacit
Měření indukčností
Technické údaje
Rozpiska el. součástí
Schéma
Záruka a aopravy

 


 

Ovlácací prvky můstku.
RLC můstek TESLA TM 393 je určen k měření odporů, indukčností a kapacit. Je pro provoz ze střídavé sítě a je konstruován jako provozní přístroj, kterého lze použít i pro méně přesná měření laboratorní. Široké měřicí rozsahy umožňují jeho použití v silno- i slaboproudé elektrotechnice k měření jednotlivých částí nízko- i vysokofrekvenčních obvodů.

Konstrukčně náleží do řady provozních přístrojů TESLA, konstruovaných v kovové skřínce s rukojetí.

POPIS

Přístroj sestává z vlastního můstku, ze zesilovače s usměrňovačem, z nízkofrekvenčního oscilátoru, z můstkového napájecího zdroje a galvanometru.

Veškeré tyto části jsou vestavěny do společné skříně.

Můstek

Řada normálních odporů a cejchovaný potenciometr tvoří vlastní můstek, který obsáhne rozsah dvou dekád. Pro měření kapacit přepojuje se do jednoho ramene pevný kapacitní normál 10.000 pF a potenciometr pro vyrovnávání ztrátového úhlu. Při měření indukčností se do tohoto ramene zapojuje kapacitní normál 0,1 uF a event. druhý potenciometr pro vyrovnávání ztrátového úhlu paralelně ke kapacitnímu normálu. Z tohoto důvodu jsou pro měření indukčnosti na přepínači K4 dvě polohy pro měření indukčnosti.

Zesilovač

Vestavěný zesilovač je v provozu vždy při měření kapacit a indukčností a při měření odporů pouze tehdy, měří-li se střídavým napětím. Zesilovač je dvoustupňový a zapojuje se do diagonály mostu přepínačem K 3, je-li tento přepínač v poloze ~. První stupeň zesilovače má elektronku EF 22, v jejímž anodovém okruhu je filtr LC, který slouží k omezení nižších frekvencí, hlavně síťové, kapacitně přenesené na měřený objekt. Za tímto filtrem je potenciometr, kterým se nastavuje citlivost zesilovače. Druhý stupeň je elektronka EBL 21, zapojená jako triodový zesilovač. Diodový systém této elektronky usměrňuje získaný signál pro galvanometr.

Nízkofrekvenční oscilátor

Nízkofrekvenční oscilátor je tvořen obvodem LC v obvyklém zapojení a jako oscilační elektronky je použito EF 22. Oscilátor slouží k napájení můstku při měření střídavým napětím a jeho kmitočet je přibližně 400 c/s.

Napájecí zdroj

Napájecí zdroj je tvořen síťovým trasformátorem a usměrňovací elektronkou AZ l s příslušnými vyhlazovacími kapacitami a odpory. Dodává anodové napětí pro zesilovač, žhavící napětí pro elektronky a střídavé napětí pro suchý usměrňovač, ze kterého se napájí můstek při měření stejnosměrným napětím.

Galvanometr

Galvanometr je normální ručkový přístroj s nulou uprostřed, takže při měření odporů stejnosměrným napětím indikuje i směr rozladění mostu. Při měření střídavým napětím se vychyluje ručka pouze jedním směrem.

Příslušenství

Jako příslušenství je k přístroji dodávána síťová šňůra „Flexo” a sáček s náhradními pojistkami pro síť 220 i 120 V.

Připojeni na síť

Před připojením na síť je nutné přístroj přepnout na jmenovité napětí sítě přepojovačem napětí, umístěným na zadní straně přístroje. Přepnutí provedeme po uvolnění zajišťovacího kovového pásku, vytažením a zasunutím přepínacího kotoučku tak, aby číslo udávající napětí bylo postaveno proti trojúhelníčkové značce (obr. 2). Zajišťovací pásek opět připevníme. Vlevo vedle voliče napětí je síťová pojistka P a dále síťová zástrčka. Vpravo od voliče je anodová pojistka Pa (obr. 3).

Síť zapínáme knoflíkem K2 (povytažením nebo pootočením doprava), přičemž se rozsvítí signální žárovka Z.

Kryt přístroje je zapojen na ochranný vodič.

Umístění voliče napětí a popjistek.
 

MĚŘENÍ

Měření odporů stejnosměrným napětím (obr. 4)

Stejnosměrným napětím lze měřit veškeré ohmické odpory, bez ohledu na jalovou složku. Měřený odpor připojíme na svorky RLC a vytažením

obr. 4 Schéma měření odporu.

(pootočením) knoflíku K2 uvedeme přístroj do provozu. Přepínač K3 přepneme do polohy = a přepínač K4 zapneme do polohy R.

Knoflíkem K2 nastavíme citlivost tak, aby ručka galvanometru nebyla vychýlena až na doraz. Měrný potenciometr postavíme přibližně do střední polohy a přepínačem K 5 přepneme do té polohy, ve které je výchylka galvanornetru nejmenší. Podle potřeby zvýšíme citlivost knoflíkem K2.

Nastavením potenciometru Kl (hrubě velkým knoflíkem a jemně malým knoflíkem) vyvážíme most tak, až ručka galvanornetru ukazuje na nulu. Při takto vyváženém mostě odečteme údaj na síupnici knoflíku K1 a násobíme ho číslem, na které ukazuje šipka přepínače rozsahů K5.

Při měření stejnosměrným napětím jsou funkce knoflíků K6 a K7 vyřazeny a nezáleží na tom, jak jsou knoflíky nastaveny.

Měření velmi malých odporů

Při měření velmi malých odporů je nutné dbát, aby byl vyloučen vliv přechodových odporů. Veškeré tyto odpory měříme tak, že provedeme dvoje měření. Za prvé změříme přechodové odpory tak, že přepínač K5 postavíme do polohy 0,1 Ω a svorky RLC spojíme nakrátko silným drátem. Nyní vyvážíme most a na stupnici Kl odečteme přechodový odpor Rp. Přepínači přístroje dále nemanipulujeme, zkracovací drát odpojíme ze svorek RLC a na jeho místo připojíme malý odpor, který má být změřen. Knoflíkem Kl most znovu vyvážíme a odečteme naměřenou hodnotu Rs. Správná hodnota měřeného odporu je pak rozdíl obou naměřených hodnot, tedy

R = Rs – Rp.

Protože stupnice knoflíku Kl je cejchována přímo v ohmech, je i výsledek měření udán přímo v těchto jednotkách.

Měření odporů střídavým napětím

Střídavým napětím lze měřit pouze odpory čistě ohmické nebo odpory s velmi malou složkou kapacitní nebo induktivní. Měřený odpor připojujeme rovněž na svorky RLC, přepínač K4 zůstane v poloze R, přepínač K3 přepneme do polohy ~. Potenciomelrem K2 nastavíme menší citlivost tak, aby ručka galvanometru nebyla vychýlena až na doraz. Přepínačem K5 najdeme polohu, při které je výchylka ručky nejmenší a knoflíkem K1 vyvážíme pak můstek na nulu. Knoflíkem K 2 zvýšíme citlivost a opětným dostavením potenciometru K1 můstek znovu vyválíme. Jestliže je poteneiometrem K2 nastavena velká citlivost zesilovače, nevrátí se ručka galvanometru na nulu, což je způsobeno vlastním šumem zesilovače, a pak vyvažujeme most na nejmenší výchylku, bez ohledu na to, že ručka neukazuje na nulu. I v tomto případě jsou potenciometry K6 a K7 mimo provoz a nezáleží na jejich postavení. Naměřenou hodnotu odečítáme již známým způsobem.

Měřeni kapacit (obr. 5)

Kapacity se měří pouze střídavým napětím a přepínač K3 musí být proto v poloze ~. Přepínač K4 přepneme do polohy C a měřený kondensátor připojíme na svorky RLC. Potenciometrem K2 nastavíme zprvu malou citlivost, aby ručka galvanometru nebyla vychýlena až na doraz. Přepínačem rozsahů K5 přepneme do polohy nejmenší výchylky indikátoru a most vyvážíme potenciometrem K1. Citlivost zesilovače zvýšíme a opětným dostavením knoflíku Kl vyvážíme most. Protože měřená kapacita způsobí kvalitou svého dielektrika jisté zbytkové napětí, které není s napětím procházejícím čistou kapacitou ve fázi, je ve větvi, ve které je zapojen kapacitní normál, též potenciometr K7, kterým se vliv ztrátového úhlu měřené kapacity kompensuje.

Obr. 5 měření kapacit.
 

Je tedy nutné po vyvážení mostu tímto potenciometrem, označeným na panelu „tg δ”, pootočit tak, aby se výchylka snížila. Opětným dostavením potenciometru K1 vyvážíme most. Naměřenou kapacitu čteme na stupnici knoflíku K1 a násobíme ji číslem, proti kterému je postaven přepínač rozsahů K5.

Údaj knoflíku K7 není cejchován, lze však podle jeho polohy posuzovat jakost dielektrika.

Měření malých kapacit

Při měření malých kapacit je nutné brát v úvahu i vlastní kapacitu svorek přístroje, která je asi 2 pF, a přívodů, není-li kondensátor připojován přímo na svorky přístroje. Měříme-li malou kapacitu s přívodními dráty, musíme předem změřit kapacitu těchto drátů, při čemž má být jejich poloha stejná při připojeném i odpojeném kondensátoru. Druhé měření pak provedeme s připojeným kondensátorem a výsledná kapacita měřeného kondensátoru je dána rozdílem obou naměřených kapacit.

Měření indukčností (viz obr. 6 a 7)

Pro měření indukčnosti jsou na přepínači K4 dvě polohy. Důvodem pro to je, že měřicí rozsah indukčností je velký a tím jsou i velmi rozdílné ztrátové složky měřených indukčností. Těmto polohám odpovídají i oba potenciometry K6 a K7. Je-li funkční přepínač K4 v poloze Ls, vyrovnáváme ztrátovou složku potenciometrem K6, který je v tomto případě zapojen v sérii s vestavěným kapacitním normálem. Přepneme-li funkční přepínač K4 do polohy Lp, vyrovnáváme ztrátovou složku potenciometrem K7, který se v této poloze připojuje ke kapacitnímu normálu paralelně. Všeobecně lze říci, že měření cívek je nutné provádět v té poloze přepínače K4, ve které můžeme příslušným potenciometrem pro vyrovnání ztrátové složky nastavit minimální výchylku indikátoru.

Obr.  6 a 7. Schemata měření indukčnosti.

Při měření indukčností je tedy nutné přepnout přepínač K3 do polohy ~, přepínač K4 do polohy Ls nebo Lp a měřenou indukčnost připojit na svorky RLC. Potenciometrem K 2 nastavíme menší citlivost, aby vyvažování můstku bylo snazší. Přepínačem K5 přepneme do té polohy, ve které je výchylka galvanometru nejmenší, a knoflíkem Kl vyvážíme most.

Potenciometrem pro ztrátovou složku, odpovídajícím poloze přepínače K4, otáčíme tak, aby se výchylka galvanometru dále snížila. Nelze-li otáčením potenciometru dosáhnout minima výchylky, musíme přepínač K4 přepnout do druhé polohy pro měření indukčností a vyrovnat ztrátovou složku potenciometrem příslušným této poloze. Po dosažení nižší výchylky galvanometru musíme můstek knoflíkem K1 znovu vyvážit a po zvýšení citlivosti knoflíkem K2 tento postup opakovat, až dosáhneme nejnižší výchylky obsluhou knoflíku K1 a příslušného potenciometru pro ztrátovou složku. Po takovém vyvážení můstku čteme pak naměřenou indukčnost na stupnici knoflíku K1 a násobíme ji číslem, proti kterému je nastavena šipka přepínače K5. Naměřená indukčnost je pak udána v jednotkách, které označuje šipka přepínače K5, buď v mH nebo v H.

TECHNICKÉ ÚDAJE

Rozsah odporů: 0,01 Ω  — 10 MΩ, rozděleno do osmi rozsahů; možnost měření bud stejnosměrným nebo střídavým napětím.
Rozsah indukčností: 0,01 mH — 1000 H; rozděleno do sedmi rozsahů.
Rozsah kapacit: 1 pF — 100 μF, rozdělený do sedmi rozsahů.
Přesnost měření: pro R a C ± 2%, při měření elektrolytických kondensátorů je přesnost horší; pro L ±3%.
Vlastní kapacita svorek: cca 2 pF.
Měrný kmitočet: cca 400 c/s.
Galvanometr: ±100 μA s mechanickou nulou uprostřed.
Elektronky: EF 22 —  první stupeň zesilovače,
EBL 21 — druhý stupeň zesilovače,
EF 22 — nf. oscilátor
žárovka 6,3 V/0,3 A.
Pojistky (obr. 3): síťová (P) pro 220 V … 0,4 A,
pro 120 V … 1 A,
anodová (Pa) … 0,1 A.
Napájení: střídavé napětí 120 nebo 220 V, 50 c/s.
Spotřeba: 30 W.
Rozměry: šířka 320 mm,
výška 265 mm,
hloubka 225 mm.
Váha: 9,4 kg.

ROZPISKA EL. SOUČÁSTÍ

Odpory
Označení Druh Norma
R1 karta odporová XF 681 00
R2 karta odporová XF 681 00
R3 karta odporová XF 681 03
R4 karta odporová XF 681 02
R5 karta odporová XF 681 01
R6 odpor vrstvový P1A 0024 WK 181 03/M1/D
R7 odpor vrstvový P1A 0024 WK 181 03/M1/D
R8 potenciometr 1AN 690 04
R9 karta odporová 10K XF 681 01
R10 potenciometr 1AN 69003
R11 karta odporová 10K XF 681 02
R12 potenciometr NTN 150 WN 694 02/1k/N
R13+R21 potenciometr 1AN 698 01
R14 odpor vrstvový NTN 050 TR102 2M/A
R15 odpor vrstvový NTN 050 TR102 500/A
R16 odpor vrstvový NTN 050 TR103 M2/A
R17 odpor vrstvový NTN 050 TR103 M4/A
R18 odpor drátový NTN 053 TR601 10/A
R19 odpor vrstvový NTN 050 TR102 20
R20 odpor vrstvový NTN 050 TR103 20k/A
R22 odpor vrstvový NTN 050 TR104 32k/B
R23 odpor vrstvový NTN 050 TR102 10k/A
R24 odpor vrstvový NTN 050 TR102 10k/A
R25 odpor vrstvový NTN 050 TR103 1k/A
R26 odpor vrstvový NTN 050 TR102 10k
R27 odpor vrstvový NTN 050 TR104 32k/B
R28 odpor vrstvový NTN 050 TR102 64k/B
R29 odpor vrstvový NTN 050 TR102 M16/B
R30 odpor vrstvový NTN 050 TR104 10k/A

 

Dostavovací odpory
Označení Norma Dostavovací hodnoty
Rc NTN 050 TR 103 M32 nebo M5, M8, Ml, 1M25/A
Rd PIA 0024 WK 681 03 1M6 nebo 2M5, 4M, 5M, 6M4, 8M, 10 M/C
Re PIA 0024 WK 681 03 1M6 nebo 2M5, 4M, 5M, 6M4, 8M, 10M/C

 

Kondensátory
Označení Druh Norma
C1 slídový WK 714 08/5k/D
C2 styroflexový CK 724 21/M1/D
C3 elektrolytický NTN 092 TC 500 25M
C4 svitkový NTN 060 TC 103 M5/A
C5+C8 elektrolytický NTN 090 TC 521 16/16M
C6 svitkový NTN 060 TC 104 1k/A
C7 svitkový NTN 060 TC 104 1k/A
C9 svitkový NTN 060 TC 103 50k/B
C10 svitkový NTN 060 TC 103 40k/B
C11 elektrolytický NTN 092 TC 500 25M
C12 svitkový NTN 060 TC 103 Ml/A
C13+C14 elektrolytický NTN 090 TC 521 16/16M
C15 slídový NTN 073 TC 212 4k/B
C16 svitkový NTN 060 TC 106 5k
C17 svitkový NTN 060 TC 106 5k
C25 slídový NTN 073 TC 212 4k/B

 

Dostavovací kondensátory
Označení Norma Dostavovací hodnoty
Ca slídový WK 714 08 1k nebo 2k, 5k/B
Cb slídový WK 714 08 1k/B
Cc NTN 060 TC 103 16k nebo 5k, 10k/B

SCHÉMA

Schéma se otevře ve zvláštním okně, protože je příliš velké pro vložení do textu.

ZÁRUKA A OPRAVY

Výrobní závod poskytuje na každý dodaný přístroj 6měsíční záruku podle všeobecných záručních podmínek, platných pro prodej výrobků TESLA.

Vady, které se na výrobku vyskytnou během poskytované záruční doby a budou způsobeny chybami při výrobě nebo vadným materiálem, budou bezplatně opraveny. Záruka zaniká při porušení plomby výrobního závodu nebo při provedení jakýchkoliv vlastních zásahů do elektrické či mechanické funkce přístroje.

Veškeré opravy přístrojů v záruce i mimo záruční dobu provádí výrobní závod vlastní opravnou.

Bude-li někdy třeba zaslat přístroj k opravě nebo k přezkoušení, zašlete jej dobře zabalený s popisem závady na adresu:

TESLA
národní podnik
BRNO, Čechyňská 16. Opravna tel. č. 38753


Nascannoval a do html podoby upravil Ing. Petr Jeníček. Oproti originálu byl na začátek přidán obsah. Poslední změna dne 8.5.2005.

 Posted by at 3:44 pm
Oct 172019
 

https://forum.43oh.com/topic/13361-add-msp432-support-to-arduino/

 

 Sign in to follow this  

mgh

Add MSP432 support to Arduino?

Does anyone know if MSP432 (black) can be added to the standard Arduino setup?

The reason: I’ve got an Adafruit Feather M0+ board working with Arduino, so the ARM Cortex-M compiler is “already there”. I’m hoping maybe I could remove Energia (since I don’t need the ‘430 support). If I add the JSON board file for the black MSP432 launch-pad, will the Arduino IDE get everything it needs to play with the MSP432?     https://energia.nu/packages/package_msp432_black_index.json

Also, is there a JSON file for the Tiva TM4C123 launch-pad?  (same reason, have a Tiva, want to move everything over to one IDE).

Thanks!

 

No, it is not possible as the Energia IDE includes specific features to support the multi-treading of the MSP432.

The black MSP432 is deprecated and no longer supported.

 

But I don’t care about that multitasking – does anyone know if it would work otherwise?

Yes, I know the black MSP432 has been abandoned, but I’m not going to throw away perfectly good hardware.

Thanks for the response!

 

 

  On 1/11/2019 at 2:51 AM, mgh said:

Also, is there a JSON file for the Tiva TM4C123 launch-pad?  (same reason, have a Tiva, want to move everything over to one IDE).

Thanks!

not json but instructions given for linux

https://github.com/RickKimball/tivac-core

Assumes you have openocd and arm-none-eabi-gcc in your path. Probably won’t work for windows. Probably will work for OSX.

 

Although the Arduino IDE should be able to consume the Energia packages, there is a difference between the arduino-builder in Arduino and Energia which makes the msp432 package incompatible with the Arduino IDE. See the pull request here: https://github.com/arduino/arduino-builder/pull/119. I have it on my list to find a different solution and be able to use the stock arduino-builder at which point the Arduino IDE should be able to consume the Energia package.

For TivaC and MSP430, it is possible to use it in the Arduino IDE. Just put this in the preferences: http://energia.nu/packages/package_energia_index.json. Then pull up the board manager and install TivaC support.

 

 

Wow! Thank you Rick, thank you @energia! I’ll try some of these this weekend.

 

If you want to use one single IDE for all the different boards, try

All come as freemium: free for basic features; one-time-fee or subscription for more advanced features.

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It’s easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

{
  "packages": [
    {
      "name": "energia",
      "maintainer": "Energia",
      "websiteURL": "http://www.energia.nu/",
      "email": "make@energia.nu",
      "help": {
        "online": "http://energia.nu/reference"
      },
      "platforms": [
        {
          "name": "Energia MSP430 boards",
          "architecture": "msp430",
          "version": "1.0.5",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp430-1.0.5.tar.bz2",
          "archiveFileName": "msp430-1.0.5.tar.bz2",
          "checksum": "SHA-256:f40371d7e5140be6ce671aa33ca686b6d0fdfe6fd480dcb5d8dd79a87ce23305",
          "size": "2077472",
          "boards": [
            {"name": "MSP-EXP430F5529"},
            {"name": "MSP-EXP430FR2433"},
            {"name": "MSP-EXP430FR4133"},
            {"name": "MSP-EXP430FR5969"},
            {"name": "MSP-EXP430FR6989"},
            {"name": "MSP-EXP430FR5739"},
            {"name": "MSP-EXP430FR2355"},
            {"name": "MSP-EXP430FR2231"},
            {"name": "MSP-EXP430G2"},
            {"name": "MSP-EXP430G2ET"},
            {"name": "MSP-EXP430FR5994"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"msp430-gcc",
              "version":"4.6.6"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"8.2.0.1400"
            },
            {
              "packager":"energia",
              "name":"mspdebug",
              "version":"0.24"
            }
         ]
        },
        {
          "name": "Energia MSP430 boards",
          "architecture": "msp430",
          "version": "1.0.4",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp430-1.0.4.tar.bz2",
          "archiveFileName": "msp430-1.0.4.tar.bz2",
          "checksum": "SHA-256:84f752999538be0da7305f25a87ccf487008510404182feecbd6e4276642e6f2",
          "size": "2076765",
          "boards": [
            {"name": "MSP-EXP430F5529"},
            {"name": "MSP-EXP430FR2433"},
            {"name": "MSP-EXP430FR4133"},
            {"name": "MSP-EXP430FR5969"},
            {"name": "MSP-EXP430FR6989"},
            {"name": "MSP-EXP430FR5739"},
            {"name": "MSP-EXP430FR2355"},
            {"name": "MSP-EXP430FR2231"},
            {"name": "MSP-EXP430G2"},
            {"name": "MSP-EXP430G2ET"},
            {"name": "MSP-EXP430FR5994"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"msp430-gcc",
              "version":"4.6.6"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"8.2.0.1400"
            },
            {
              "packager":"energia",
              "name":"mspdebug",
              "version":"0.24"
            }
         ]
        },
        {
          "name": "Energia MSP430 boards",
          "architecture": "msp430",
          "version": "1.0.3",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp430-1.0.3.tar.bz2",
          "archiveFileName": "msp430-1.0.3.tar.bz2",
          "checksum": "SHA-256:cc4902a2bcaa43850c0e9a852f10bb5662b3eb4d4388e693d7d71c97bbdcb18a",
          "size": "2072767",
          "boards": [
            {"name": "MSP-EXP430F5529"},
            {"name": "MSP-EXP430FR2433"},
            {"name": "MSP-EXP430FR4133"},
            {"name": "MSP-EXP430FR5969"},
            {"name": "MSP-EXP430FR6989"},
            {"name": "MSP-EXP430FR5739"},
            {"name": "MSP-EXP430G2"},
            {"name": "MSP-EXP430FR5994"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"msp430-gcc",
              "version":"4.6.5"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.4.0.1099"
            },
            {
              "packager":"energia",
              "name":"mspdebug",
              "version":"0.24"
            }
         ]
        },
        {
          "name": "Energia MSP430 boards",
          "architecture": "msp430",
          "version": "1.0.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp430-1.0.2.tar.bz2",
          "archiveFileName": "msp430-1.0.2.tar.bz2",
          "checksum": "SHA-256:855ff60aacc129f8633cb4406dc28d1f3102d2edd05da0ba0b3123468bd1d06e",
          "size": "2243478",
          "boards": [
            {"name": "MSP-EXP430F5529LP"},
            {"name": "MSP-EXP430FR4133"},
            {"name": "MSP-EXP430FR5969"},
            {"name": "MSP-EXP430FR6989"},
            {"name": "MSP-EXP430G2"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"msp430-gcc",
              "version":"4.6.4"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.2096"
            },
            {
              "packager":"energia",
              "name":"mspdebug",
              "version":"0.24"
            }
         ]
        },
        {
          "name": "Energia MSP430 boards",
          "architecture": "msp430",
          "version": "1.0.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp430-1.0.1.tar.bz2",
          "archiveFileName": "msp430-1.0.1.tar.bz2",
          "checksum": "SHA-256:3d687d768013a46a580f0b24fb7e7458bc7175e9a60ecb212ea7cb4bfcd80261",
          "size": "2115215",
          "boards": [
            {"name": "MSP-EXP430F5529LP"},
            {"name": "MSP-EXP430FR4133"},
            {"name": "MSP-EXP430FR5969"},
            {"name": "MSP-EXP430FR6989"},
            {"name": "MSP-EXP430G2"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"msp430-gcc",
              "version":"4.6.3"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1594"
            },
            {
              "packager":"energia",
              "name":"mspdebug",
              "version":"0.22"
            }
         ]
        },
        {
          "name": "Energia MSP432E Ethernet RED boards",
          "architecture": "msp432e",
          "version": "5.19.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432e-5.19.0.tar.bz2",
          "archiveFileName": "msp432e-5.19.0.tar.bz2",
          "checksum": "SHA-256:9d4a549ab2a5e810ee9da352dfe12b757d79a6ef2a0b9161a9c43e7fd0d42e33",
          "size": "35290227",
          "boards": [
            {"name": "MSP_EXP432E401Y"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"8.0.0.1202"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.3"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "5.23.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-5.23.1.tar.bz2",
          "archiveFileName": "msp432r-5.23.1.tar.bz2",
          "checksum": "SHA-256:cda2b25b13920933336c95d90f555a30fc49dfbbd5477c0cf8c29523ffbd0ec3",
          "size": "31990061",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"8.2.0.1400"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.4"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "5.6.3",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-5.6.3.tar.bz2",
          "archiveFileName": "msp432r-5.6.3.tar.bz2",
          "checksum": "SHA-256:51e9e24ed69eaef86fb1b7cd05be96269cc12a5358b77d05ad41af323466c5d8",
          "size": "28895842",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"8.2.0.1400"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.4"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "5.6.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-5.6.2.tar.bz2",
          "archiveFileName": "msp432r-5.6.2.tar.bz2",
          "checksum": "SHA-256:bcde9150f6a4a703dd74dfc5fde92aa4d3ace45300188bc37f9545723576ec06",
          "size": "28893313",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.2096"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.3"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "5.6.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-5.6.1.tar.bz2",
          "archiveFileName": "msp432r-5.6.1.tar.bz2",
          "checksum": "SHA-256:b2c1d36b95e5f8a5feebca25d4895ce98a46fa7d91604d4439430b62c2c2bcbd",
          "size": "28738809",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.2096"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.3"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "5.6.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-5.6.0.tar.bz2",
          "archiveFileName": "msp432r-5.6.0.tar.bz2",
          "checksum": "SHA-256:fd320297acacdb3787f23e23f790770ff6242dbf86ee96702e1aaf8932aeb02e",
          "size": "28738891",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "4.9.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-4.9.1.tar.bz2",
          "archiveFileName": "msp432r-4.9.1.tar.bz2",
          "checksum": "SHA-256:617aa2c65addb9e3a0831b015ce2619abafd27d86b74ad75b0449063ca10421e",
          "size": "21093293",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia MSP432 EMT RED boards",
          "architecture": "msp432r",
          "version": "4.9.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=msp432r-4.9.0.tar.bz2",
          "archiveFileName": "msp432r-4.9.0.tar.bz2",
          "checksum": "SHA-256:f765300336d56d09af2f48a94445050e5313f4d47a038220d2ad0451d5eb655f",
          "size": "21092774",
          "boards": [
            {"name": "MSP_EXP432P401R"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia TivaC boards",
          "architecture": "tivac",
          "version": "1.0.3",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=tivac-1.0.3.tar.bz2",
          "archiveFileName": "tivac-1.0.3.tar.bz2",
          "checksum": "SHA-256:d36684ab78ad516c65177d0402919814ab3681fff070d52e8036c3a13a5167ab",
          "size": "2239118",
          "boards": [
            {"name": "EK-TM4C123GXL"},
            {"name": "EK-TM4C1294XL"},
            {"name": "EK-LM4F120XL"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.2096"
            }
          ]
        },
        {
          "name": "Energia TivaC boards",
          "architecture": "tivac",
          "version": "1.0.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=tivac-1.0.2.tar.bz2",
          "archiveFileName": "tivac-1.0.2.tar.bz2",
          "checksum": "SHA-256:932d7d66dddf9ce4e498b737157c671b668cb450536f7223186e03955ae08041",
          "size": "2189817",
          "boards": [
            {"name": "EK-TM4C123GXL"},
            {"name": "EK-TM4C1294XL"},
            {"name": "EK-LM4F120XL"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {

              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1594"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "4.9.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-4.9.1.tar.bz2",
          "archiveFileName": "cc13xx-4.9.1.tar.bz2",
          "checksum": "SHA-256:9e1324c1f42ecb9b5f54b7eb33af40440809cda768e120e2d22a9d87a30d4b37",
          "size": "24263837",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.1.0.1917"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "4.9.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-4.9.0.tar.bz2",
          "archiveFileName": "cc13xx-4.9.0.tar.bz2",
          "checksum": "SHA-256:4cf43b44a52783bb55994feed5f305b0d26f6a0cee1746cfd14168023ab9c07b",
          "size": "24260076",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.1.0.1917"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.7.4",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.7.4.tar.bz2",
          "archiveFileName": "cc13xx-3.7.4.tar.bz2",
          "checksum": "SHA-256:b1fc52867179ac4b0bb69ef1f877de76ab0a8d2124d16df7bb1ed4585afba884",
          "size": "5008614",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.1.0.1917"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.7.3",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.7.3.tar.bz2",
          "archiveFileName": "cc13xx-3.7.3.tar.bz2",
          "checksum": "SHA-256:55c3cd4265f65119cc6ed60dc1920a5f9762850fa0d8810f6a7735f14453bb5c",
          "size": "5008347",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.1.0.1917"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.7.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.7.2.tar.bz2",
          "archiveFileName": "cc13xx-3.7.2.tar.bz2",
          "checksum": "SHA-256:0183e193755d6557e33d5d505c74d63f580dfbc3b424b028723e8242aa851484",
          "size": "5007077",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.1.0.1917"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.7.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.7.1.tar.bz2",
          "archiveFileName": "cc13xx-3.7.1.tar.bz2",
          "checksum": "SHA-256:4eebf0ac52fe10be6e88482debeb51727b25a6ab1f7b28ec2417260a9132cdaf",
          "size": "5007403",
          "boards": [
            {"name": "LAUNCHXL_CC1310"},
            {"name": "LAUNCHXL_CC1350"},
            {"name": "CC1350STK"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.7.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.7.0.tar.bz2",
          "archiveFileName": "cc13xx-3.7.0.tar.bz2",
          "checksum": "SHA-256:9187d55612bf9681b76b1c20fd960021f93f869538e886cf6e109b31b7e5b0dc",
          "size": "5007247",
          "boards": [
            {"name": "LAUNCHXL_CC1310"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC13xx boards",
          "architecture": "cc13xx",
          "version": "3.6.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc13xx-3.6.1.tar.bz2",
          "archiveFileName": "cc13xx-3.6.1.tar.bz2",
          "checksum": "SHA-256:bbdb1404c748a9e8dc3dbad3d267c8de89d04a7aca62249b47866710ce6b6bda",
          "size": "4991866",
          "boards": [
            {"name": "LAUNCHXL_CC1310"}
          ],
          "toolsDependencies": [
            {
              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1624"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC3220 EMT boards",
          "architecture": "cc3220emt",
          "version": "5.6.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3220emt-5.6.2.tar.bz2",
          "archiveFileName": "cc3220emt-5.6.2.tar.bz2",
          "checksum": "SHA-256:be0c700217218db893a504234c5dea5b9618ab7e23dfe9a370db59784de2994e",
          "size": "25967822",
          "boards": [
            {"name": "CC3220S-LAUNCHXL"},
            {"name": "CC3220SF-LAUNCHXL"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.4.0.1099"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.3"
            }
          ]
        },
        {
          "name": "Energia CC3220 EMT boards",
          "architecture": "cc3220emt",
          "version": "5.6.1",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3220emt-5.6.1.tar.bz2",
          "archiveFileName": "cc3220emt-5.6.1.tar.bz2",
          "checksum": "SHA-256:192561fd563691c6e1559f35d8cfa8b335d77172264d491b55c000d580608110",
          "size": "25969772",
          "boards": [
            {"name": "CC3220S-LAUNCHXL"},
            {"name": "CC3220SF-LAUNCHXL"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.4.0.1099"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC3220 EMT boards",
          "architecture": "cc3220emt",
          "version": "5.6.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3220emt-5.6.0.tar.bz2",
          "archiveFileName": "cc3220emt-5.6.0.tar.bz2",
          "checksum": "SHA-256:9c2d6ca0565e2dc2d0ad82c21193cc0ed0c765534fc07679f20b6f3951b6d623",
          "size": "25970182",
          "boards": [
            {"name": "CC3220S-LAUNCHXL"},
            {"name": "CC3220SF-LAUNCHXL"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"6.3.1-20170620"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.2096"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC3220 EMT boards",
          "architecture": "cc3220emt",
          "version": "4.9.0",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3220emt-4.9.0.tar.bz2",
          "archiveFileName": "cc3220emt-4.9.0.tar.bz2",
          "checksum": "SHA-256:e59c6ba609c99c2ec6ee3856e78962c0b3301af2f67a5de42ec50e543c707919",
          "size": "19051776",
          "boards": [
            {"name": "CC3220S-LAUNCHXL"},
            {"name": "CC3220SF-LAUNCHXL"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"7.2.0.1988"
            },
            {
              "packager":"energia",
              "name":"ino2cpp",
              "version":"1.0.2"
            }
          ]
        },
        {
          "name": "Energia CC3200 boards",
          "architecture": "cc3200",
          "version": "1.0.2",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3200-1.0.2.tar.bz2",
          "archiveFileName": "cc3200-1.0.2.tar.bz2",
          "checksum": "SHA-256:48ad1392d766fd354a368576989e42375da6e072e8337ffa2424463f5c632446",
          "size": "1791123",
          "boards": [
            {"name": "CC3200-LAUNCHXL"},
            {"name": "RedBearLab CC3200"},
            {"name": "RedBearLab WiFi Mini"},
            {"name": "RedBearLab WiFi Micro"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1594"
            },
            {
              "packager":"energia",
              "name":"cc3200prog",
              "version":"1.1.4"
            }
          ]
        },
        {
          "name": "Energia CC3200 boards",
          "architecture": "cc3200",
          "version": "1.0.3",
          "category": "Energia",
          "url": "http://energia.nu/downloads/download_core.php?file=cc3200-1.0.3.tar.bz2",
          "archiveFileName": "cc3200-1.0.3.tar.bz2",
          "checksum": "SHA-256:69f9ac0980bac4ebb8803a161786215228557eba49051af86e980aa8c422cdca",
          "size": "1790853",
          "boards": [
            {"name": "CC3200-LAUNCHXL"},
            {"name": "RedBearLab CC3200"},
            {"name": "RedBearLab WiFi Mini"},
            {"name": "RedBearLab WiFi Micro"}
          ],
          "toolsDependencies": [
            {

              "packager":"energia",
              "name":"arm-none-eabi-gcc",
              "version":"4.8.4-20140725"
            },
            {
              "packager":"energia",
              "name":"dslite",
              "version":"6.2.1.1594"
            },
            {
              "packager":"energia",
              "name":"cc3200prog",
              "version":"1.1.4"
            }
          ]
        }
      ],
      "tools": [
        {
          "name":"msp430-gcc",
          "version":"4.6.6",
          "systems":
          [
            {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/msp430-gcc-4.6.6-i686-mingw32.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.6-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:3dbfe6453f461ae5d7599c3cf1144dc400852b6d788d298f3dd0004283a9202a",
              "size":"30818330"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/msp430-gcc-4.6.6-i386-apple-darwin11.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.6-i386-apple-darwin11.tar.bz2",
              "checksum":"SHA-256:82d4df153a9d64a507a48ed3b5db9e21eeb069809976c8b69946801252b622bb",
              "size":"32574759"
            },
            {
              "host": "x86_64-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/msp430-gcc-4.6.6-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "msp430-gcc-4.6.6-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum": "SHA-256:41fbcb3cc73679186989e1fb27cb4578e9164f07d134e650e23089198b87cbfd",
              "size": "98503002"
            }
          ]
        },
        {
          "name":"msp430-gcc",
          "version":"4.6.5",
          "systems":
          [
            {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/msp430-gcc-4.6.5-i686-mingw32.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.5-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:91496ceffdaf63562d28ca0e27d317f4e22048267efc754450f2b3cf37e69a88",
              "size":"30758086"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/msp430-gcc-4.6.5-i386-apple-darwin11.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.5-i386-apple-darwin11.tar.bz2",
              "checksum":"SHA-256:9a85b83a0015d1219157e503d0515092171c1a49a9bd695fe14a4ddfbde66ffb",
              "size":"32399439"
            },
            {
              "host": "x86_64-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/msp430-gcc-4.6.5-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "msp430-gcc-4.6.5-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum": "SHA-256:0b5b4ee3e027aa88a8d86b1e5d6bd65f919084f3d3f8678475e4debdbbc930c9",
              "size": "98367482"
            }
          ]
        },
        {
          "name":"msp430-gcc",
          "version":"4.6.4",
          "systems":
          [
            {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/msp430-gcc-4.6.4-i686-mingw32.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.4-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:21efce29cc6a83ddce3dbce241fcd235437ed1717f8268af169a6429d0c3d20d",
              "size":"30753419"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/msp430-gcc-4.6.4-i386-apple-darwin11.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.4-i386-apple-darwin11.tar.bz2",
              "checksum":"SHA-256:e1628d6ddce2d0ee6f9134d3d1b20560cf98cda0cb09a9c33028b3a1d210603d",
              "size":"32431529"
            },
            {
              "host": "x86_64-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/msp430-gcc-4.6.4-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "msp430-gcc-4.6.4-i386-x86_64-pc-linux-gnu.tar.bz2",
              "size": "98437003",
              "checksum": "SHA-256:6595fd1dd4ebfd77aec31939e922fb4791e2c74185e908e1a4c27c50cb3b7440"
            }
          ]
        },
        {
          "name":"msp430-gcc",
          "version":"4.6.3",
          "systems":
          [
            {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/msp430-gcc-4.6.3-i686-mingw32.zip",
              "archiveFileName":"msp430-gcc-4.6.3-i686-mingw32.zip",
              "checksum":"SHA-256:5e3722f6651e33991a199f7a7f3182a3ad0d5ddb5eff199e8c27d1fd269132d2",
              "size":"47733038"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/msp430-gcc-4.6.3-i386-apple-darwin11.tar.bz2",
              "archiveFileName":"msp430-gcc-4.6.3-i386-apple-darwin11.tar.bz2",
              "checksum":"SHA-256:b919d80880603b55c64b9095eb80d4005e82d7428b0d7ded3864c200cb4f847c",
              "size":"32357793"
            },
            {
              "host": "x86_64-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/msp430-gcc-4.6.3-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "msp430-gcc-4.6.3-i386-x86_64-pc-linux-gnu.tar.bz2",
              "size": "87607164",
              "checksum": "SHA-256:453832be5150f45a830ea5b0336a911f22fd7553f668a1e93a5c9e58f65f9f7f"
            }
          ]
        },
        {
          "name": "arm-none-eabi-gcc",
          "version": "6.3.1-20170620",
          "systems": [
            {
              "host": "i686-mingw32",
              "url": "https://s3.amazonaws.com/energiaUS/tools/windows/gcc-arm-none-eabi-6.3.1-20170620-windows.tar.bz2",
              "archiveFileName": "gcc-arm-none-eabi-6.3.1-20170620-windows.tar.bz2",
              "checksum": "SHA-256:c28a5c2a5272d09bf396c2dcd4c3188ae0dd8ec04d0ce8f581b1995141fc9044",
              "size": "110277553"
            },
            {
              "host": "x86_64-apple-darwin",
              "url": "https://s3.amazonaws.com/energiaUS/tools/macosx/gcc-arm-none-eabi-6.3.1-20170620-mac.tar.bz2",
              "archiveFileName": "gcc-arm-none-eabi-6.3.1-20170620-mac.tar.bz2",
              "checksum": "SHA-256:70ed9ad76f90f33a14bf47d1c2643ee5374dadef820ab38bf2ad9c3c1981aee1",
              "size": "104268677"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/gcc-arm-none-eabi-6.3.1-20170620-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "gcc-arm-none-eabi-6.3.1-20170620-x86_64-pc-linux-gnu.tar.bz2",
              "checksum": "SHA-256:0a98e8cf843c41fdfdfb74cfe5b27e7b0c6054ee92ea1277812513334b6ce02a",
              "size": "100490382"
            }
          ]
        },
        {
          "name": "arm-none-eabi-gcc",
          "version": "4.8.4-20140725",
          "systems": [
            {
              "host": "i686-mingw32",
              "archiveFileName": "gcc-arm-none-eabi-4.8.4-20140725-windows.tar.gz",
              "url": "https://s3.amazonaws.com/energiaUS/tools/windows/gcc-arm-none-eabi-4.8.4-20140725-windows.tar.gz",
              "checksum": "SHA-256:2ab5a6ad2a32f976d17b7ef9222623e6f9881be908047cb05730ccd89eb79a1d",
              "size": "82014307"
            },
            {
              "host": "x86_64-apple-darwin",
              "url": "https://s3.amazonaws.com/energiaUS/tools/macosx/gcc-arm-none-eabi-4.8.4-20140725-mac.tar.bz2",
              "archiveFileName": "gcc-arm-none-eabi-4.8.4-20140725-mac.tar.bz2",
              "checksum": "SHA-256:66c9261fdd6d646931dfe940e8daf38d3b11cfba8a7e714c7a3811146b6dc9c7",
              "size": "52518522"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url": "https://s3.amazonaws.com/energiaUS/tools/linux64/gcc-arm-none-eabi-4.8.4-20140725-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName": "gcc-arm-none-eabi-4.8.4-20140725-x86_64-pc-linux-gnu.tar.bz2",
              "checksum": "SHA-256:00636c299e7a420212cdc1643d5c52d3e82eb66c8ce0e4693327cd1e936b52db",
              "size": "68654066"
            }
          ]
        },
        {
          "name":"ino2cpp",
          "version":"1.0.4",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            }
          ]
        },
        {
          "name":"ino2cpp",
          "version":"1.0.4",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.4.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.4.tar.bz2",
              "checksum":"SHA-256:f1409b404eb650931ab138aea642451d0706deb19210331d3bd62bfe79099f17",
              "size":"537535"
            }
          ]
        },
        {
          "name":"ino2cpp",
          "version":"1.0.3",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.3.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.3.tar.bz2",
              "checksum":"SHA-256:562c9364db80affc5a5b51a79b70950680c77d7ee62244e18bc8b6f7c114fdeb",
              "size":"485132"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.3.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.3.tar.bz2",
              "checksum":"SHA-256:562c9364db80affc5a5b51a79b70950680c77d7ee62244e18bc8b6f7c114fdeb",
              "size":"485132"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.3.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.3.tar.bz2",
              "checksum":"SHA-256:562c9364db80affc5a5b51a79b70950680c77d7ee62244e18bc8b6f7c114fdeb",
              "size":"485132"
            }
          ]
        },
        {
          "name":"ino2cpp",
          "version":"1.0.2",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.2.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.2.tar.bz2",
              "checksum":"SHA-256:6f63041767f4f15b1da7b62aa3086e6912f9e05b19bfdf512d573bcc9ac7c9a5",
              "size":"484493"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.2.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.2.tar.bz2",
              "checksum":"SHA-256:6f63041767f4f15b1da7b62aa3086e6912f9e05b19bfdf512d573bcc9ac7c9a5",
              "size":"484493"
            },
            {
              "host": "x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/ino2cpp-1.0.2.tar.bz2",
              "archiveFileName":"ino2cpp-1.0.2.tar.bz2",
              "checksum":"SHA-256:6f63041767f4f15b1da7b62aa3086e6912f9e05b19bfdf512d573bcc9ac7c9a5",
              "size":"484493"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"8.2.0.1400",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-8.2.0.1400-i686-mingw32.tar.bz2",
              "archiveFileName":"dslite-8.2.0.1400-mingw32.tar.bz2",
              "checksum":"SHA-256:793a4ea6935fd3436cc7f861b23f353609969b951b62812641635bd467814e05",
              "size":"33976575"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-8.2.0.1400-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-8.2.0.140-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:366b9139052037e480fcba4b3a4fb5783b6336b93bd5e2f3034f479a8d502784",
              "size":"17527708"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-8.2.0.1400-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-8.2.0.1400-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:f95b710f36786ba9d28c9cb96e05c812e7eba875afc69753007c8910c3bce7fd",
              "size":"19182469"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"8.0.0.1202",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-8.0.0.1202-i686-mingw32.tar.bz2",
              "archiveFileName":"dslite-8.0.0.1202-mingw32.tar.bz2",
              "checksum":"SHA-256:88d45eac72682d35e907cefe101b9b32557d70a5044b872d2ac22594b87ae919",
              "size":"33554889"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-8.0.0.1202-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-8.0.0.1202-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:19ccf9a603a528c7b84237fbbcad4fdeb97dff6ff02177086cb3da9eac36041d",
              "size":"16963904"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-8.0.0.1202-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-8.0.0.1202-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:8d84a25eab60624fd216d1e8e76948ac6a218ff81cff5118c3942dc67ab78acb",
              "size":"18783730"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"7.4.0.1099",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-7.4.0.1099-i686-mingw32.tar.bz2",
              "archiveFileName":"dslite-7.4.0.1099-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:298f2d6df8f1122ce8ea437586dfba9c54d394144fdf7853509437a49b642bb8",
              "size":"33486116"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-7.4.0.1099-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-7.4.0.1099-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:445bfbf65a709e2e031c2670b7b0300d11b25f6a58953037f27b09c341fd7fc4",
              "size":"17016539"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-7.4.0.1099-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-7.4.0.1099-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:187aeafd49f76d841f68d5fa9cac0dcdfce9aa401fd2f2b67bd9da5c14833f67",
              "size":"18597835"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"7.2.0.1988",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-7.2.0.1988-i686-mingw32.tar.bz2",
              "archiveFileName":"dslite-7.2.0.1988-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:248da7bf2e882587e6e51117b8ab53eb60793aa7362836fdbc0388774367d81c",
              "size":"30119837"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-7.2.0.1988-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-7.2.0.1988-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:aa80e246122096f26df9826c8a889c45abeac96f349234c9baff7e2f27f72c36",
              "size":"15546846"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-7.2.0.1988-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-7.2.0.1988-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:f43171fac1c09567d22e070e0652dea43eebaf274467e2110cfb826f983054a0",
              "size":"18074747"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"7.1.0.1917",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-7.1.0.1917-i686-mingw32.zip",
              "archiveFileName":"dslite-7.1.0.1917-mingw32.zip",
              "checksum":"SHA-256:e8ef665bfeaa9264a98771ea89d14f977e8e448116372f6883bb74dc703424a8",
              "size":"36225191"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-7.1.0.1917-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-7.1.0.1917-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:629fe0c3c5f066b9dd62e065ac8ba80c5fd260d15d6fe32006e200b9a58343ac",
              "size":"15384479"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-7.1.0.1917-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-7.1.0.1917-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:89fa13bec5e5504ccaef25a7d87464cf784c14870e66d7e149b8308839ab83de",
              "size":"17793290"
            }
          ]
        },
       {
          "name":"dslite",
          "version":"7.2.0.2096",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-7.2.0.2096-i686-mingw32.tar.bz2",
              "archiveFileName":"dslite-7.2.0.2096-mingw32.tar.bz2",
              "checksum":"SHA-256:550922c51ea0c44b1b8f47497d7dadcc81a2695d8aded478307e2d9fcec7d94d",
              "size":"33083804"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-7.2.0.2096-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-7.2.0.2096-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:2a0282a4aae506edde5999e7cffd7e8d4daf3f98df4a5ee0dccf1bb71798f471",
              "size":"16666963"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-7.2.0.2096-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-7.2.0.2096-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:4c3bff77b27a5ff811fd5b062cbe35b22867b5435e0e29d5b8a380c4ca7ad2b4",
              "size":"19132835"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"6.2.1.1624",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-6.2.1.1624-i686-mingw32.zip",
              "archiveFileName":"dslite-6.2.1.1624-i686-mingw32.zip",
              "checksum":"SHA-256:fd673ea66fcd8051d91a0138dcddaf0b3104ca1c6b2e0eab0de8b2080ff70094",
              "size":"34948605"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-6.2.1.1624-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-6.2.1.1624-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:0a89afb99973ec2b4cf23be277ccc66cb2dc53fdd894924aa871b0e9882011e3",
              "size":"15312608"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-6.2.1.1624-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-6.2.1.1624-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:401d9edd1956b87a7b89f162456a8444b2ac73d3d972f8f2231a150a7e384503",
              "size":"17995725"
            }
          ]
        },
        {
          "name":"dslite",
          "version":"6.2.1.1594",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/dslite-6.2.1.1594-i686-mingw32.zip",
              "archiveFileName":"dslite-6.2.1.1594-i686-mingw32.zip",
              "checksum":"SHA-256:aa523ddddbb23fb93fd2705990a10021b3b1ad6553d6149159fc9c0f68b56824",
              "size":"33819921"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/dslite-6.2.1.1594-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"dslite-6.2.1.1594-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:f872f284b090d9c635812ef588645c498eadd1dc8ab8d867b54895d57ddf0127",
              "size":"14735532"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/dslite-6.2.1.1594-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"dslite-6.2.1.1594-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:dfa17d2c26699e1480a13bd7f2941541417c59276ee38d30848e4606e1fba33b",
              "size":"20539172"
            }
          ]
        },
        {
          "name":"mspdebug",
          "version":"0.24",
          "systems":
          [
           {
              "host":"i686-mingw32",
             "url":"https://s3.amazonaws.com/energiaUS/tools/windows/mspdebug-0.24-i686-mingw32.tar.bz2",
              "archiveFileName":"mspdebug-0.24-i686-mingw32.tar.bz2",
              "checksum":"SHA-256:7b3dfb269b58f692d03080a641f543dfe01bcfcef43935c2bb31e2839e284e73",
              "size":"1058435"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/mspdebug-0.24-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"mspdebug-0.24-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:5e0dc170ff259c4fc50a2bd591b1c10c648b9d8ad5770c03ed4228128e206fc0",
              "size":"171307"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/mspdebug-0.24-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"mspdebug-0.24-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:ec6131053a4ddd35b43d44591732313182e3487ffd77181df02ce23f0860a2e5",
              "size":"147947"
            }
          ]
        },
        {
          "name":"mspdebug",
          "version":"0.22",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/mspdebug-0.22.zip",
              "archiveFileName":"mspdebug-0.22.zip",
              "checksum":"SHA-256:e4d061b5cb1de2e17dc7f4fb5c3c6bd8c6f7a3ea013fa16e2332b408440236ec",
              "size":"201798"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"http://www.energia.nu/tools/mspdebug-0.22-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"mspdebug-0.22--x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:efc469b4771367bd5e420eb7d6f36551df8da36dd130d2bbf184131b6876111e",
              "size":"9891660"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"http://www.energia.nu/tools/mspdebug-0.22-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"mspdebug-0.22--x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:efc469b4771367bd5e420eb7d6f36551df8da36dd130d2bbf184131b6876111e",
              "size":"9891660"
            }
          ]
        },
        {
          "name":"cc3200prog",
          "version":"1.1.4",
          "systems":
          [
           {
              "host":"i686-mingw32",
              "url":"https://s3.amazonaws.com/energiaUS/tools/windows/cc3200prog-1.1.4-i686-mingw32.zip",
              "archiveFileName":"cc3200prog-1.1.4-i686-mingw32.zip",
              "checksum":"SHA-256:9701cf08a34c727355261eec502dfa44386b34b2d9cde863eb20c347d7a24f97",
              "size":"400542"
            },
            {
              "host":"x86_64-apple-darwin",
              "url":"https://s3.amazonaws.com/energiaUS/tools/macosx/cc3200prog-1.1.4-x86_64-apple-darwin.tar.bz2",
              "archiveFileName":"cc3200prog-1.1.4-x86_64-apple-darwin.tar.bz2",
              "checksum":"SHA-256:1d499a54ad083869fcc54da60ec4d55f03011fe3bb3d45dd75b5e687694befdd",
              "size":"164785"
            },
            {
              "host":"x86_64-pc-linux-gnu",
              "url":"https://s3.amazonaws.com/energiaUS/tools/linux64/cc3200prog-1.1.4-i386-x86_64-pc-linux-gnu.tar.bz2",
              "archiveFileName":"cc3200prog-1.1.4-i386-x86_64-pc-linux-gnu.tar.bz2",
              "checksum":"SHA-256:892a1ba158ee184451597cd8d1aad32f293dc4279e59deace08e2a67c6b93707",
              "size":"134860"
            }
          ]
        }
      ]
    }
  ]
}
 Posted by at 3:23 pm
Oct 112019
 

Keyboard Matrix Scanning and Debouncing

Keyboard Matrix Scanning and Debouncing

Intro

Without diving into the “why” part, I wanted to make yet another keyboard with Cherry MX keyswitches (just like everyone else these days), and I ended up deciding to make my own keyboard controller (again like everyone else). After all…

customary xkcd/927
(customary https://xkcd.com/927/ )

 Posted by at 4:28 pm
Oct 112019
 

https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/archv021.cgi?read=242802

 

Re: HELP WANTED ON ALGORITHMS
Message #19 Posted by Eric Smith on 27 Apr 2013, 12:49 p.m.,
in response to message #18 by Eddie W. Shore

Usually CORDIC isn’t used for logs and exponentials, although it is possible to do so by using hyperbolic CORDIC. CORDIC is in the general class of shift-and-add algorithms, and there is a simpler one for logs and exponential first published in 1624, only ten years after the invention of logarithms by Napier. I’m not sure whether the HP 9100A (1968) used Briggs’ algorithm, but all of HP’s handheld and handheld-derived calculators from the HP-35 (1972) through the Saturn-based and Saturn-emulating calculators have used it. Recent HP-designed calculators such as the HP 10bII+, 20b, 30b, and 49gII apparently use a math library based on that from Saturn calculators, so they presumably also use Briggs’ algorithm.

There is a good description of Briggs’ algorithm on Jacques Laporte’s “Briggs and the HP35” web page.

Another excellent reference for algorithms for transcendental functions is Elementary Functions: Algorithms and Implementations by Jean-Michel Muller, second edition, which covers many classes of algorithms including shift-and-add (Briggs’, CORDIC, and others), and has especially good coverage of accurate argument range reduction algorithms.

It should be noted that the HP algorithms for sine and cosine use CORDIC, but not in the most basic method normally described. Instead, they compute the tangent (or cotangent), and use an identity to compute the sine (or cosine) from it. This avoids an issue with each CORDIC iteration effectively multiplying the resulting sine and cosine by a scale factor; by using tangent (or cotangent), these scale factors cancel out. In binary CORDIC, the number of CORDIC iteration is fixed, so the result can be multiplied by the inverse of the product of the scale factors, which is constant. In decimal CORDIC as implemented by HP, the number of CORDIC iterations is variable, so it would take more work to compensate for the non-constant product of the scale factors.

For specifics of the algorithms used by HP, see:

Edited: 27 Apr 2013, 1:04 p.m.

 Posted by at 6:04 am
Oct 072019
 

https://keisan.casio.com/calculator

Advanced Calculator

 

 Function list  Input data storage
 Expression
Mode Digit Answer  Accuracy Comma format
Editor

 

(-6.2 -7.6i)!
How to use    Sample calculation    Sample chart
     
Answer
ans1 -9.85941053E-11 +3.2965092E-12i
Function List
Inserted in the cursor position of Expression
Elementary Prob Bessel Sp1 Sp2
Constant
Elementary
function
Real
numerical
function
Complex
numerical
function
Sum
Prod
Input data storage
 File 
 Term 

 Posted by at 10:42 am
Aug 192019
 

https://medium.com/@ly.lee/build-your-iot-sensor-network-stm32-blue-pill-nrf24l01-esp8266-apache-mynewt-thethings-io-ca7486523f5d

Build Your IoT Sensor Network — STM32 Blue Pill + nRF24L01 + ESP8266 + Apache Mynewt + thethings.io

Lup Yuen Lee 李立源
May 27 · 18 min read

Law of Thermospatiality: Air-conditioning always feels too warm ANDtoo cold by different individuals in a sizeable room

 Posted by at 6:48 am
Aug 042019
 

http://www.rechenautomat.de/

Von Halbautomaten, Rechen-Vollautomaten
und Speicher-Superautomaten

Mechanische Rechenmaschinen

Bilder und Aufsätze zur Automatisierung der mechanischen Rechentechnik

“Ein Automat (griech.) ist im weitern Sinn jede sich selbst bewegende mechanische Vorrichtung, die durch im Innern verborgene Kraftmittel (Federn, Gewichte etc.) in Bewegung gesetzt wird, z. B. Uhren, Planetarien u. dgl.; im engern Sinn ein mechanisches Kunstwerk, welches vermittelst eines innern Mechanismus die Thätigkeit lebender Wesen, der Menschen (Android) oder Tiere, nachahmt und meist auch an Gestalt diesen nachgebildet ist.” (aus Meyers Konversationslexikon von 1885-1892)

In der Fachliteratur verwendet(e) man den Begriff “Rechenautomat” meist im Zusammenhang mit (elektronischen) programmgesteuerten Rechenanlagen, die im technisch-wissenschaftlichen Bereich zum Einsatz kamen. Betrachtet man jedoch Prospekte von Büromaschinen-Herstellern aus den 1930er bis 1970er Jahren, so findet man auch dort Rechenautomaten im Angebot. Sie waren in unterschiedlichen Ausführungen erhältlich: von Halbautomaten bis hin zu “vollelektrischen Speicher-Superautomaten”. Es handelt sich hierbei um elektrisch angetriebene, aber mechanische Rechenmaschinen für den Einsatz im Büro sowie für Privatleute. Sie konnten teilweise oder vollständig eine Multiplikation oder Division ausführen und oftmals auch Rechenergebnisse zwischenspeichern. Manche von ihnen waren sogar in der Lage, selbsttätig eine Wurzel zu berechnen. In diesem Sinne sind die vollautomatischen Rechenmaschinen die mechanischen Vorläufer unserer heutigen elektronischen Taschenrechner.

Nachfolgende Liste ist eine Sammlung von Aufsätzen und Büchern zu elektrisch-mechanischen Rechenmaschinen, die im Zeitraum von 1900 bis 1970 produziert wurden.

Facit CA 2-16 Die 10-Tasten-Universal-Rechenmaschinen von
FACIT
Facit
Rheinmetall Staffelwalzenmaschinen
aus Sömmerda

Rheinmetall
Entwicklungsgeschichte und Funktionsweise
Rheinmetall SAR IIc S
 Posted by at 6:52 am
Aug 012019
 

http://user.mendelu.cz/marik/akademie/index.php#maxima

Využití systémů počítačové algebry (CAS) v matematice

(stará verze)

 Posted by at 6:23 pm
Jul 032019
 

(best my Marchant from Robert Mařík)

Pi= 3.141592653589793238462643383279502884197169399375105820974…

22/7 = 3,14…

22/7-Pi = 0.0012644892673496186802137595776400046…

 

355/113 = 3.141592…

355/113-Pi = 2,667641e-7

 

103993/33102 = 3.141592653…

103993/33102 -Pi = -5,77890… e-10

 

 

pi

\\\\\\\\\\\\\\\\

 

http://qin.laya.com/tech_projects_approxpi.html

Fractional Approximations of Pi

After reading the American Scientist article, On the Teeth of Wheels, which describes the intricate interplay between pure and applied mathematics, and how clock makers independently developed mathematical methods to approximate gear ratios that were not feasibly made (such as representing gear ratios that were two primes with other gear ratios that were close in value), I decided to write a program to find fractional approximations of Pi. A couple of minutes searching google brought me to an existing fractional approximations of pi page, which attempted to find decimal approximations using an iterative approach, which turned out to be very slow. However since the code was open source, I decided to modify for my own uses. The stern-brocot method pretty much changes the O(n2) to about O(1) for the calculation of successive values.

You can get several versions of the source:
The original modification to use the stern-brocot method
A 64 bit version

Fractional Approximation Table

pi = 3.14159265358979323846264338327950288419716939937510

               Num.                Den. = Result                                   (Accuracy                                 )
      -------------         ----------- = --------------------------------         (---------------------------------        )

                  7/                  2 = 3.50000000000000000000000000000000000000 (-0.35840734641020676153735661672049711581) [ 0]
                 10/                  3 = 3.33333333333333333333333333333333333333 (-0.19174067974354009487068995005383044914) [ 0]
                 13/                  4 = 3.25000000000000000000000000000000000000 (-0.10840734641020676153735661672049711581) [ 0]
                 16/                  5 = 3.20000000000000000000000000000000000000 (-0.05840734641020676153735661672049711581) [ 1]
                 19/                  6 = 3.16666666666666666666666666666666666666 (-0.02507401307687342820402328338716378247) [ 1]
                 22/                  7 = 3.14285714285714285714285714285714285714 (-0.00126448926734961868021375957763997295) [ 2]
                179/                 57 = 3.14035087719298245614035087719298245614 ( 0.00124177639681078232229250608652042805) [ 2]
                201/                 64 = 3.14062500000000000000000000000000000000 ( 0.00096765358979323846264338327950288419) [ 3]
                223/                 71 = 3.14084507042253521126760563380281690140 ( 0.00074758316725802719503774947668598279) [ 3]
                245/                 78 = 3.14102564102564102564102564102564102564 ( 0.00056701256415221282161774225386185855) [ 3]
                267/                 85 = 3.14117647058823529411764705882352941176 ( 0.00041618300155794434499632445597347243) [ 3]
                289/                 92 = 3.14130434782608695652173913043478260869 ( 0.00028830576370628194090425284472027550) [ 3]
                311/                 99 = 3.14141414141414141414141414141414141414 ( 0.00017851217565182432122924186536147005) [ 3]
                333/                106 = 3.14150943396226415094339622641509433962 ( 0.00008321962752908751924715686440854457) [ 4]
                355/                113 = 3.14159292035398230088495575221238938053 (-0.00000026676418906242231236893288649634) [ 6]
              52163/              16604 = 3.14159238737653577451216574319441098530 ( 0.00000026621325746395047764008509189889) [ 6]
              52518/              16717 = 3.14159239097924268708500329006400669976 ( 0.00000026261055055137764009321549618443) [ 6]
              52873/              16830 = 3.14159239453357100415923945335710041592 ( 0.00000025905622223430340392992240246827) [ 6]
              53228/              16943 = 3.14159239804048869739715516732573924334 ( 0.00000025554930454106548821595376364085) [ 6]
              53583/              17056 = 3.14159240150093808630393996247654784240 ( 0.00000025208885515215870342080295504179) [ 6]
              53938/              17169 = 3.14159240491583668239268448948686586289 ( 0.00000024867395655606995889379263702130) [ 6]
              54293/              17282 = 3.14159240828607800023145469274389538247 ( 0.00000024530371523823118869053560750172) [ 6]
              54648/              17395 = 3.14159241161253233687841333716585225639 ( 0.00000024197726090158423004611365062780) [ 6]
              55003/              17508 = 3.14159241489604752113319625314142106465 ( 0.00000023869374571732944713013808181954) [ 6]
              55358/              17621 = 3.14159241813744963395948016571136711877 ( 0.00000023545234360450316321756813576542) [ 6]
              55713/              17734 = 3.14159242133754370136461035299424833652 ( 0.00000023225224953709803303028525454767) [ 6]
              56068/              17847 = 3.14159242449711436095702358939877850619 ( 0.00000022909267887750561979388072437800) [ 6]
              56423/              17960 = 3.14159242761692650334075723830734966592 ( 0.00000022597286673512188614497215321827) [ 6]
              56778/              18073 = 3.14159243069772588944834836496431140375 ( 0.00000022289206734901429501831519148044) [ 6]
              57133/              18186 = 3.14159243374023974485868250302430440998 ( 0.00000021984955349360396088025519847421) [ 6]
              57488/              18299 = 3.14159243674517733209464998087327176348 ( 0.00000021684461590636799340240623112071) [ 6]
              57843/              18412 = 3.14159243971323050184662176841190527916 ( 0.00000021387656273661602161486759760503) [ 6]
              58198/              18525 = 3.14159244264507422402159244264507422402 ( 0.00000021094471901444105094063442866017) [ 6]
              58553/              18638 = 3.14159244554136709947419250992595772078 ( 0.00000020804842613898845087335354516341) [ 6]
              58908/              18751 = 3.14159244840275185323449416031145005599 ( 0.00000020518704138522814922296805282820) [ 6]
              59263/              18864 = 3.14159245122985581000848176420695504664 ( 0.00000020235993742845416161907254783755) [ 6]
              59618/              18977 = 3.14159245402329135269009854033830426305 ( 0.00000019956650188577254484294119862114) [ 6]
              59973/              19090 = 3.14159245678365636458878994237820848611 ( 0.00000019680613687387385344090129439808) [ 6]
              60328/              19203 = 3.14159245951153465604332656355777743060 ( 0.00000019407825858241931681972172545359) [ 6]
              60683/              19316 = 3.14159246220749637606129633464485400704 ( 0.00000019138229686240134704863464887715) [ 6]
              61038/              19429 = 3.14159246487209840959390601677904163878 ( 0.00000018871769482886873736650046124541) [ 6]
              61393/              19542 = 3.14159246750588476102753044724183809231 ( 0.00000018608390847743511293603766479188) [ 6]
              61748/              19655 = 3.14159247010938692444670567285677944543 ( 0.00000018348040631401593771042272343876) [ 6]
              62103/              19768 = 3.14159247268312424119789558883043302306 ( 0.00000018090666899726474779444906986113) [ 6]
              62458/              19881 = 3.14159247522760424525929279211307278305 ( 0.00000017836218899320335059116643010114) [ 6]
              62813/              19994 = 3.14159247774332299689906972091627488246 ( 0.00000017584647024156357366236322800173) [ 6]
              63168/              20107 = 3.14159248023076540508280698264286069528 ( 0.00000017335902783337983640063664218891) [ 6]
              63523/              20220 = 3.14159248269040553907022749752720079129 ( 0.00000017089938769939241588575230209290) [ 6]
              63878/              20333 = 3.14159248512270692962179707864063345300 ( 0.00000016846708630884084630463886943119) [ 6]
              64233/              20446 = 3.14159248752812286021715739019857184779 ( 0.00000016606167037824548599308093103640) [ 6]
              64588/              20559 = 3.14159248990709664866968237754754608687 ( 0.00000016368269658979296100573195679732) [ 6]
              64943/              20672 = 3.14159249226006191950464396284829721362 ( 0.00000016132973131895799942043120567057) [ 6]
              65298/              20785 = 3.14159249458744286745248977628097185470 ( 0.00000015900235037101015360699853102949) [ 6]
              65653/              20898 = 3.14159249688965451239353048138577854340 ( 0.00000015670013872606911290189372434079) [ 6]
              66008/              21011 = 3.14159249916710294607586502308314692304 ( 0.00000015442269029238677836019635596115) [ 6]
              66363/              21124 = 3.14159250142018557091459950766900208293 ( 0.00000015216960766754804387561050080126) [ 6]
              66718/              21237 = 3.14159250364929133116730234967274097094 ( 0.00000014994050190729534103360676191325) [ 6]
              67073/              21350 = 3.14159250585480093676814988290398126463 ( 0.00000014773499230169449350037552161956) [ 6]
              67428/              21463 = 3.14159250803708708009131994595350137445 ( 0.00000014555270615837132343732600150974) [ 6]
              67783/              21576 = 3.14159251019651464590285502410085279940 ( 0.00000014339327859255978835917865008479) [ 6]
              68138/              21689 = 3.14159251233344091474941214440499792521 ( 0.00000014125635232371323123887450495898) [ 6]
              68493/              21802 = 3.14159251444821576002201632877717640583 ( 0.00000013914157747844062705450232647836) [ 6]
              68848/              21915 = 3.14159251654118183892311202372804015514 ( 0.00000013704861139953953135955146272905) [ 6]
              69203/              22028 = 3.14159251861267477755583802433266751407 ( 0.00000013497711846090680535894683537012) [ 6]
              69558/              22141 = 3.14159252066302335034551284946479382141 ( 0.00000013292676988811713053381470906278) [ 6]
              69913/              22254 = 3.14159252269254965399478745394086456367 ( 0.00000013089724358446785592933863832052) [ 6]
              70268/              22367 = 3.14159252470156927616577994366700943354 ( 0.00000012888822396229686343961249345065) [ 6]
              70623/              22480 = 3.14159252669039145907473309608540925266 ( 0.00000012689940177938791028719409363153) [ 6]
              70978/              22593 = 3.14159252865931925817731155667684681095 ( 0.00000012493047398028533182660265607324) [ 6]
              71333/              22706 = 3.14159253060864969611556416806130538183 ( 0.00000012298114354234707921521819750236) [ 6]
              71688/              22819 = 3.14159253253867391209080152504491870809 ( 0.00000012105111932637184185823458417610) [ 6]
              72043/              22932 = 3.14159253444967730682016396302110587824 ( 0.00000011914011593164247942025839700595) [ 6]
              72398/              23045 = 3.14159253634193968322846604469516164026 ( 0.00000011724785355523417733858434124393) [ 6]
              72753/              23158 = 3.14159253821573538302098626824423525347 ( 0.00000011537405785544165711503526763072) [ 6]
              73108/              23271 = 3.14159254007133341927721198057668342572 ( 0.00000011351845981918543140270281945847) [ 6]
              73463/              23384 = 3.14159254190899760520013684570646595963 ( 0.00000011168079563326250653757303692456) [ 6]
              73818/              23497 = 3.14159254372898667915052985487509043707 ( 0.00000010986080655931211352840441244712) [ 6]
              74173/              23610 = 3.14159254553155442609063955950868276154 ( 0.00000010805823881237200382377082012265) [ 6]
              74528/              23723 = 3.14159254731694979555705433545504362854 ( 0.00000010627284344290558904782445925565) [ 6]
              74883/              23836 = 3.14159254908541701627789897633831179728 ( 0.00000010450437622218474440694119108691) [ 6]
              75238/              23949 = 3.14159255083719570754520021712806380224 ( 0.00000010275259753091744316615143908195) [ 6]
              75593/              24062 = 3.14159255257252098744908985121768764026 ( 0.00000010101727225101355353206181524393) [ 6]
              75948/              24175 = 3.14159255429162357807652533609100310237 ( 0.00000009929816966038611804718849978182) [ 7]
              76303/              24288 = 3.14159255599472990777338603425559947299 ( 0.00000009759506333068925734902390341120) [ 7]
              76658/              24401 = 3.14159255768206221056514077291914265808 ( 0.00000009590773102789750261036036022611) [ 7]
              77013/              24514 = 3.14159255935383862282777188545321041037 ( 0.00000009423595461563487149782629247382) [ 7]
              77368/              24627 = 3.14159256101027327729727534819507045113 ( 0.00000009257951996116536803508443243306) [ 7]
              77723/              24740 = 3.14159256265157639450282942603071948261 ( 0.00000009093821684395981395724878340158) [ 7]
              78078/              24853 = 3.14159256427795437170562909910272401722 ( 0.00000008931183886675701428417677886697) [ 7]
              78433/              24966 = 3.14159256588960986942241448369782904750 ( 0.00000008770018336904022889958167383669) [ 7]
              78788/              25079 = 3.14159256748674189560987280194585111049 ( 0.00000008610305134285277058133365177370) [ 7]
              79143/              25192 = 3.14159256906954588758335979676087646872 ( 0.00000008452024735087928358651862641547) [ 7]
              79498/              25305 = 3.14159257063821379174076269511954159257 ( 0.00000008295157944672188068815996129162) [ 7]
              79853/              25418 = 3.14159257219293414115980801007160280116 ( 0.00000008139685909730283537320790008303) [ 7]
              80208/              25531 = 3.14159257373389213113469899338059613802 ( 0.00000007985590110732794438989890674617) [ 7]
              80563/              25644 = 3.14159257526126969271564498518171892060 ( 0.00000007832852354574699839809778396359) [ 7]
              80918/              25757 = 3.14159257677524556431261404666692549598 ( 0.00000007681454767415002933661257738821) [ 7]
              81273/              25870 = 3.14159257827599536142249710088906068805 ( 0.00000007531379787704014628239044219614) [ 7]
              81628/              25983 = 3.14159257976369164453681253127044606088 ( 0.00000007382610159392583085200905682331) [ 7]
              81983/              26096 = 3.14159258123850398528510116492949110974 ( 0.00000007235128925317754221835001177445) [ 7]
              82338/              26209 = 3.14159258270059903086725933839520775306 ( 0.00000007088919420759538404488429513113) [ 7]
              82693/              26322 = 3.14159258415014056682622900995365093837 ( 0.00000006943965267163641437332585194582) [ 7]
              83048/              26435 = 3.14159258558728957821070550406657839984 ( 0.00000006800250366025193787921292448435) [ 7]
              83403/              26548 = 3.14159258701220430917583245442217869519 ( 0.00000006657758892928681092885732418900) [ 7]
              83758/              26661 = 3.14159258842504032106822699823712538914 ( 0.00000006516475291739441638504237749505) [ 7]
              84113/              26774 = 3.14159258982595054904011354298946739374 ( 0.00000006376384268942252984029003549045) [ 7]
              84468/              26887 = 3.14159259121508535723583888124372373265 ( 0.00000006237470788122680450203577915154) [ 7]
              84823/              27000 = 3.14159259259259259259259259259259259259 ( 0.00000006099720064587005079068691029160) [ 7]
              85178/              27113 = 3.14159259395861763729576218050381735698 ( 0.00000005963117560116688120277568552721) [ 7]
              85533/              27226 = 3.14159259531330345992800999045030485565 ( 0.00000005827648977853463339282919802854) [ 7]
              85888/              27339 = 3.14159259665679066534986649109330992355 ( 0.00000005693300257311277689218619296064) [ 7]
              86243/              27452 = 3.14159259798921754334838991694594200786 ( 0.00000005560057569511425346633356087633) [ 7]
              86598/              27565 = 3.14159259931072011608924360602212951206 ( 0.00000005427907312237339977725737337213) [ 7]
              86953/              27678 = 3.14159260062143218440638774477924705542 ( 0.00000005296836105405625563850025582877) [ 7]
              87308/              27791 = 3.14159260192148537296246986434457198373 ( 0.00000005166830786550017351893493090046) [ 7]
              87663/              27904 = 3.14159260321100917431192660550458715596 ( 0.00000005037878406415071677777491572823) [ 7]
              88018/              28017 = 3.14159260449013099189777635007316986115 ( 0.00000004909966224656486703320633302304) [ 7]
              88373/              28130 = 3.14159260575897618201208674013508709562 ( 0.00000004783081705645055664314441578857) [ 7]
              88728/              28243 = 3.14159260701766809474914138016499663633 ( 0.00000004657212514371350200311450624786) [ 7]
              89083/              28356 = 3.14159260826632811397940471152489772887 ( 0.00000004532346512448323867175460515532) [ 7]
              89438/              28469 = 3.14159260950507569637149179809617478660 ( 0.00000004408471754209115158518332809759) [ 7]
              89793/              28582 = 3.14159261073402840948848925897417955356 ( 0.00000004285576482897415412430532333063) [ 7]
              90148/              28695 = 3.14159261195330196898414357902073531974 ( 0.00000004163649126947849980425876756445) [ 7]
              90503/              28808 = 3.14159261316301027492363232435434601499 ( 0.00000004042678296353901105892515686920) [ 7]
              90858/              28921 = 3.14159261436326544725286124269561910030 ( 0.00000003922652779120978214058388378389) [ 7]
              91213/              29034 = 3.14159261555417786043948474202658951574 ( 0.00000003803561537802315864125291336845) [ 7]
              91568/              29147 = 3.14159261673585617730812776615089031461 ( 0.00000003685393706115451561712861256958) [ 7]
              91923/              29260 = 3.14159261790840738209159261790840738209 ( 0.00000003568138585637105076537109550210) [ 7]
              92278/              29373 = 3.14159261907193681271916385796479760324 ( 0.00000003451785642574347952531470528095) [ 7]
              92633/              29486 = 3.14159262022654819236247710777996337244 ( 0.00000003336324504610016627549953951175) [ 7]
              92988/              29599 = 3.14159262137234366025879252677455319436 ( 0.00000003221744957820385085650494968983) [ 7]
              93343/              29712 = 3.14159262250942380183091007000538502961 ( 0.00000003108036943663173331327411785458) [ 7]
              93698/              29825 = 3.14159262363788767812238055322715842414 ( 0.00000002995190556034026283005234446005) [ 7]
              94053/              29938 = 3.14159262475783285456610328011223194602 ( 0.00000002883196038389654010316727093817) [ 7]
              94408/              30051 = 3.14159262586935542910385677681275165551 ( 0.00000002772043780935878660646675122868) [ 7]
              94763/              30164 = 3.14159262697255005967378331786235247314 ( 0.00000002661724317878886006541715041105) [ 7]
              95118/              30277 = 3.14159262806750999108233972982792218515 ( 0.00000002552228324738030365345158069904) [ 7]
              95473/              30390 = 3.14159262915432708127673576834485027969 ( 0.00000002443546615718590761493465260450) [ 7]
              95828/              30503 = 3.14159263023309182703340655017539258433 ( 0.00000002335670141142923683310411029986) [ 7]
              96183/              30616 = 3.14159263130389338907760648027175333159 ( 0.00000002228589984938503690300774955260) [ 7]
              96538/              30729 = 3.14159263236681961664876826450584138761 ( 0.00000002122297362181387511877366149658) [ 7]
              96893/              30842 = 3.14159263342195707152584138512418131119 ( 0.00000002016783616693680199815532157300) [ 7]
              97248/              30955 = 3.14159263446939105152640930382813761912 ( 0.00000001912040218693623407945136526507) [ 7]
              97603/              31068 = 3.14159263550920561349298313377108278614 ( 0.00000001808058762496966024950842009805) [ 7]
              97958/              31181 = 3.14159263654148359577948109425611750745 ( 0.00000001704830964268316228902338537674) [ 7]
              98313/              31294 = 3.14159263756630664025052725762126925289 ( 0.00000001602348659821211612565823363130) [ 7]
              98668/              31407 = 3.14159263858375521380583946254019804502 ( 0.00000001500603802465680392073930483917) [ 7]
              99023/              31520 = 3.14159263959390862944162436548223350253 ( 0.00000001399588460902101901779726938166) [ 7]
              99378/              31633 = 3.14159264059684506686055701324566117661 ( 0.00000001299294817160208637003384170758) [ 7]
              99733/              31746 = 3.14159264159264159264159264159264159264 ( 0.00000001199715164582105074168686129155) [ 7]
             100088/              31859 = 3.14159264258137417998053925107504943657 ( 0.00000001100841905848210413220445344762) [ 7]
             100443/              31972 = 3.14159264356311772801201050919554610283 ( 0.00000001002667551045063287408395678136) [ 7]
             100798/              32085 = 3.14159264453794608072307932055477637525 ( 0.00000000905184715773956406272472650894) [ 8]
             101153/              32198 = 3.14159264550593204546866264985402820050 ( 0.00000000808386119299398073342547468369) [ 8]
             101508/              32311 = 3.14159264646714741109838754603695335953 ( 0.00000000712264582736425583724254952466) [ 8]
             101863/              32424 = 3.14159264742166296570441648161855415741 ( 0.00000000616813027275822690166094872678) [ 8]
             102218/              32537 = 3.14159264836954851399944678366167747487 ( 0.00000000522024472446319659961782540932) [ 8]
             102573/              32650 = 3.14159264931087289433384379785604900459 ( 0.00000000427892034412879958542345387960) [ 8]
             102928/              32763 = 3.14159265024570399536062021182431401275 ( 0.00000000334408924310202317145518887144) [ 8]
             103283/              32876 = 3.14159265117410877235673439591191142474 ( 0.00000000241568446610590898736759145945) [ 8]
             103638/              32989 = 3.14159265209615326320894843735790718118 ( 0.00000000149363997525369494592159570301) [ 8]
             103993/              33102 = 3.14159265301190260407226149477372968400 ( 0.00000000057789063439038188850577320019) [ 9]
             104348/              33215 = 3.14159265392142104470871594159265392142 (-0.00000000033162780624607255831315103723) [ 9]
             208341/              66317 = 3.14159265346743670552045478534915632492 ( 0.00000000012235653294218859793034655927) [ 9]
             312689/              99532 = 3.14159265361893662339750030141060161556 (-0.00000000002914338493485691813109873137) [10]
             833719/             265381 = 3.14159265358107777120441930658185778183 ( 0.00000000000871546725822407669764510236) [11]
            1146408/             364913 = 3.14159265359140397848254241421927966391 (-0.00000000000161074001989903093977677972) [11]
            3126535/             995207 = 3.14159265358865040137378454934501063597 ( 0.00000000000114283708885883393449224822) [11]
            4272943/            1360120 = 3.14159265358938917154368732170690821398 ( 0.00000000000040406691895606157259467021) [12]
            5419351/            1725033 = 3.14159265358981538324194377730744861112 (-0.00000000000002214477930039402794572693) [13]
           42208400/           13435351 = 3.14159265358977223594679439338801048070 ( 0.00000000000002100251584898989149240349) [13]
           47627751/           15160384 = 3.14159265358977714548655231951908342163 ( 0.00000000000001609297609106376041946256) [13]
           53047102/           16885417 = 3.14159265358978105189821489158366654492 ( 0.00000000000001218656442849169583633927) [13]
           58466453/           18610450 = 3.14159265358978423412652568852445803298 ( 0.00000000000000900433611769475504485121) [14]
           63885804/           20335483 = 3.14159265358978687646612573696921779531 ( 0.00000000000000636199651764631028508888) [14]
           69305155/           22060516 = 3.14159265358978910556761228975786423128 ( 0.00000000000000413289503109352163865291) [14]
           74724506/           23785549 = 3.14159265358979101134054126730478241221 ( 0.00000000000000222712210211597472047198) [14]
           80143857/           25510582 = 3.14159265358979265937562694571217544154 ( 0.00000000000000057908701643756732744265) [15]
          165707065/           52746197 = 3.14159265358979340254615892023457160333 (-0.00000000000000016408351553695506871914) [15]
          245850922/           78256779 = 3.14159265358979316028327718420406748404 ( 0.00000000000000007817936619907543540015) [16]
          411557987/          131002976 = 3.14159265358979325782644815641440084536 (-0.00000000000000001936380477313489796117) [16]
          657408909/          209259755 = 3.14159265358979322134827119529027452029 ( 0.00000000000000001711437218798922836390) [16]
         1068966896/          340262731 = 3.14159265358979323539256492948091926059 ( 0.00000000000000000307007845379858362360) [17]
         2549491779/          811528438 = 3.14159265358979323901400975919959073572 (-0.00000000000000000055136637592008785153) [18]
         3618458675/         1151791169 = 3.14159265358979323794416069185889026381 ( 0.00000000000000000051848269142061262038) [18]
         6167950454/         1963319607 = 3.14159265358979323838637750639037956696 ( 0.00000000000000000007626587688912331723) [19]
        14885392687/         4738167652 = 3.14159265358979323849387505801156062596 (-0.00000000000000000003123167473205774177) [19]
        21053343141/         6701487259 = 3.14159265358979323846238174277486901359 ( 0.00000000000000000000026164050463387060) [21]
       899125804609/       286200632530 = 3.14159265358979323846290312739302875642 (-0.00000000000000000000025974411352587223) [21]
       920179147750/       292902119789 = 3.14159265358979323846289119831454290206 (-0.00000000000000000000024781503504001787) [21]
       941232490891/       299603607048 = 3.14159265358979323846287980289163130623 (-0.00000000000000000000023641961212842204) [21]
       962285834032/       306305094307 = 3.14159265358979323846286890609758924162 (-0.00000000000000000000022552281808635743) [21]
       983339177173/       313006581566 = 3.14159265358979323846285847590540629124 (-0.00000000000000000000021509262590340705) [21]
      1004392520314/       319708068825 = 3.14159265358979323846284848297337933163 (-0.00000000000000000000020509969387644744) [21]
      1025445863455/       326409556084 = 3.14159265358979323846283890036945343710 (-0.00000000000000000000019551708995055291) [21]
      1046499206596/       333111043343 = 3.14159265358979323846282970332883684002 (-0.00000000000000000000018632004933395583) [21]
      1067552549737/       339812530602 = 3.14159265358979323846282086904029653302 (-0.00000000000000000000017748576079364883) [21]
      1088605892878/       346514017861 = 3.14159265358979323846281237645725178231 (-0.00000000000000000000016899317774889812) [21]
      1109659236019/       353215505120 = 3.14159265358979323846280420613037215131 (-0.00000000000000000000016082285086926712) [21]
      1130712579160/       359916992379 = 3.14159265358979323846279634005887720665 (-0.00000000000000000000015295677937432246) [21]
      1151765922301/       366618479638 = 3.14159265358979323846278876155814494589 (-0.00000000000000000000014537827864206170) [21]
      1172819265442/       373319966897 = 3.14159265358979323846278145514157963557 (-0.00000000000000000000013807186207675138) [21]
      1193872608583/       380021454156 = 3.14159265358979323846277440641497885695 (-0.00000000000000000000013102313547597276) [21]
      1214925951724/       386722941415 = 3.14159265358979323846276760198188357586 (-0.00000000000000000000012421870238069167) [21]
      1235979294865/       393424428674 = 3.14159265358979323846276102935860166316 (-0.00000000000000000000011764607909877897) [21]
      1257032638006/       400125915933 = 3.14159265358979323846275467689777075912 (-0.00000000000000000000011129361826787493) [21]
      1278085981147/       406827403192 = 3.14159265358979323846274853371947582775 (-0.00000000000000000000010515043997294356) [21]
      1299139324288/       413528890451 = 3.14159265358979323846274258964906440289 (-0.00000000000000000000009920636956151870) [22]
      1320192667429/       420230377710 = 3.14159265358979323846273683516091186105 (-0.00000000000000000000009345188140897686) [22]
      1341246010570/       426931864969 = 3.14159265358979323846273126132748294414 (-0.00000000000000000000008787804798005995) [22]
      1362299353711/       433633352228 = 3.14159265358979323846272585977311658438 (-0.00000000000000000000008247649361370019) [22]
      1383352696852/       440334839487 = 3.14159265358979323846272062263203084137 (-0.00000000000000000000007723935252795718) [22]
      1404406039993/       447036326746 = 3.14159265358979323846271554251010510785 (-0.00000000000000000000007215923060222366) [22]
      1425459383134/       453737814005 = 3.14159265358979323846271061245004906498 (-0.00000000000000000000006722917054618079) [22]
      1446512726275/       460439301264 = 3.14159265358979323846270582589961333896 (-0.00000000000000000000006244262011045477) [22]
      1467566069416/       467140788523 = 3.14159265358979323846270117668253641040 (-0.00000000000000000000005779340303352621) [22]
      1488619412557/       473842275782 = 3.14159265358979323846269665897195688730 (-0.00000000000000000000005327569245400311) [22]
      1509672755698/       480543763041 = 3.14159265358979323846269226726605047424 (-0.00000000000000000000004888398654759005) [22]
      1530726098839/       487245250300 = 3.14159265358979323846268799636567745111 (-0.00000000000000000000004461308617456692) [22]
      1551779441980/       493946737559 = 3.14159265358979323846268384135384972222 (-0.00000000000000000000004045807434683803) [22]
      1572832785121/       500648224818 = 3.14159265358979323846267979757684694309 (-0.00000000000000000000003641429734405890) [22]
      1593886128262/       507349712077 = 3.14159265358979323846267586062682924856 (-0.00000000000000000000003247734732636437) [22]
      1614939471403/       514051199336 = 3.14159265358979323846267202632581000779 (-0.00000000000000000000002864304630712360) [22]
      1635992814544/       520752686595 = 3.14159265358979323846266829071086609244 (-0.00000000000000000000002490743136320825) [22]
      1657046157685/       527454173854 = 3.14159265358979323846266465002047559662 (-0.00000000000000000000002126674097271243) [22]
      1678099500826/       534155661113 = 3.14159265358979323846266110068188399415 (-0.00000000000000000000001771740238110996) [22]
      1699152843967/       540857148372 = 3.14159265358979323846265763929940953314 (-0.00000000000000000000001425601990664895) [22]
      1720206187108/       547558635631 = 3.14159265358979323846265426264360740155 (-0.00000000000000000000001087936410451736) [22]
      1741259530249/       554260122890 = 3.14159265358979323846265096764121998082 (-0.00000000000000000000000758436171709663) [23]
      1762312873390/       560961610149 = 3.14159265358979323846264775136584745085 (-0.00000000000000000000000436808634456666) [23]
      1783366216531/       567663097408 = 3.14159265358979323846264461102927921823 (-0.00000000000000000000000122774977633404) [23]
      3587785776203/      1142027682075 = 3.14159265358979323846264306850252143875 ( 0.00000000000000000000000031477698144544) [24]
      5371151992734/      1709690779483 = 3.14159265358979323846264358066268961876 (-0.00000000000000000000000019738318673457) [24]
      8958937768937/      2851718461558 = 3.14159265358979323846264337555790890412 ( 0.00000000000000000000000000772159398007) [26]
     77042654144230/     24523438471947 = 3.14159265358979323846264338985711710108 (-0.00000000000000000000000000657761421689) [26]
     86001591913167/     27375156933505 = 3.14159265358979323846264338836754332073 (-0.00000000000000000000000000508804043654) [26]
     94960529682104/     30226875395063 = 3.14159265358979323846264338715903365924 (-0.00000000000000000000000000387953077505) [26]
    103919467451041/     33078593856621 = 3.14159265358979323846264338615889617509 (-0.00000000000000000000000000287939329090) [26]
    112878405219978/     35930312318179 = 3.14159265358979323846264338531751659443 (-0.00000000000000000000000000203801371024) [26]
    121837342988915/     38782030779737 = 3.14159265358979323846264338459987358119 (-0.00000000000000000000000000132037069700) [26]
    130796280757852/     41633749241295 = 3.14159265358979323846264338398054099481 (-0.00000000000000000000000000070103811062) [27]
    139755218526789/     44485467702853 = 3.14159265358979323846264338344061241435 (-0.00000000000000000000000000016110953016) [27]
    288469374822515/     91822653867264 = 3.14159265358979323846264338319580081089 ( 0.00000000000000000000000000008370207330) [28]
    428224593349304/    136308121570117 = 3.14159265358979323846264338327569743446 ( 0.00000000000000000000000000000380544973) [29]
   3137327371971917/    998642318693672 = 3.14159265358979323846264338328304372840 (-0.00000000000000000000000000000354084421) [29]
   3565551965321221/   1134950440263789 = 3.14159265358979323846264338328216143479 (-0.00000000000000000000000000000265855060) [29]
   3993776558670525/   1271258561833906 = 3.14159265358979323846264338328146834546 (-0.00000000000000000000000000000196546127) [29]
   4422001152019829/   1407566683404023 = 3.14159265358979323846264338328090949305 (-0.00000000000000000000000000000140660886) [29]
   4850225745369133/   1543874804974140 = 3.14159265358979323846264338328044932237 (-0.00000000000000000000000000000094643818) [30]
   5278450338718437/   1680182926544257 = 3.14159265358979323846264338328006381618 (-0.00000000000000000000000000000056093199) [30]
   5706674932067741/   1816491048114374 = 3.14159265358979323846264338327973616618 (-0.00000000000000000000000000000023328199) [30]
   6134899525417045/   1952799169684491 = 3.14159265358979323846264338327945425704 ( 0.00000000000000000000000000000004862715) [31]
  17976473982901831/   5722089387483356 = 3.14159265358979323846264338327954374978 (-0.00000000000000000000000000000004086559) [31]
  24111373508318876/   7674888557167847 = 3.14159265358979323846264338327952097924 (-0.00000000000000000000000000000001809505) [31]
  30246273033735921/   9627687726852338 = 3.14159265358979323846264338327950744587 (-0.00000000000000000000000000000000456168) [32]
  36381172559152966/  11580486896536829 = 3.14159265358979323846264338327949847672 ( 0.00000000000000000000000000000000440747) [32]
  66627445592888887/  21208174623389167 = 3.14159265358979323846264338327950254837 ( 0.00000000000000000000000000000000033582) [33]
 230128609812402582/  73252211597019839 = 3.14159265358979323846264338327950319206 (-0.00000000000000000000000000000000030787) [33]
 296756055405291469/  94460386220409006 = 3.14159265358979323846264338327950304754 (-0.00000000000000000000000000000000016335) [33]
 363383500998180356/ 115668560843798173 = 3.14159265358979323846264338327950295601 (-0.00000000000000000000000000000000007182) [34]
 430010946591069243/ 136876735467187340 = 3.14159265358979323846264338327950289285 (-0.00000000000000000000000000000000000866) [35]
1356660285366096616/ 431838381024951187 = 3.14159265358979323846264338327950287593 ( 0.00000000000000000000000000000000000826) [35]
1786671231957165859/ 568715116492138527 = 3.14159265358979323846264338327950288000 ( 0.00000000000000000000000000000000000419) [35]
2216682178548235102/ 705591851959325867 = 3.14159265358979323846264338327950288250 ( 0.00000000000000000000000000000000000169) [35]
2646693125139304345/ 842468587426513207 = 3.14159265358979323846264338327950288418 ( 0.00000000000000000000000000000000000001) [37]

 

 

 Posted by at 3:56 pm
Jun 202019
 

https://polska.pl/science/famous-scientists/abraham-stern-17691842-does-anyone-have-calculator/

Abraham Izrael Stern with his calculating machine
Portrait of Abraham Stern (with one of his calculating machines) from 1823, artist Jan Antoni Blank
The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence.
Charles Bukowski

Abraham Jakub Stern

The Polish Jew Abraham Jakub Stern (see biography of Abraham Stern), a mathematician, inventor, translator, and censor, was born in 1768 in Hrubieszów, in a poor Jewish family. Around 1800, while working at a clockmaker’s shop in his home town, he was lucky to be noticed by Stanisław Wawrzyniec Staszic (1755-1826), a leading figure in the Polish Enlightenment: a Catholic priest, statesman, philosopher, geologist, writer and translator. Staszic, who studied at the Hrubieszów and Lublin secondary school in early 1770s, bought an estate in Hrubieszów in 1800. Staszic obviously noticed the extraordinary talent of the humble clockmaker and encouraged him to devote himself to the study of mathematics, Latin, and German, later sending him to Warsaw to continue his studies.

His first computing machine Stern designed around 1810, and in 1811 he sent a report to Staszic, outlining the device and asking for financial help. Later on he designed two more calculating devices. His inventions became popular, at the time of their development. In 1816 and 1818, Stern demonstrated his machine to the Tzar of Russia Alexander I, who received him cordially and granted him an annual pension of 350 roubles, promising, in case of his death, to pay half of this sum to his widow.

For his inventions, Stern was admitted to the Warsaw Society of the Friends of Science (Warszawskiego Towarzystwa Przyjaciół Nauk, the predecessor of the Polish Academy of Sciences), first as a corresponding member (1817), then as a qualifying member (1821), and finally as a full member (1830). He presented his inventions multiple times at the Society’s meetings.

Stern was a father-in-law and heavily influenced another inventor of calculating machines—Chaim Zelig Slonimski. Stern most probably had strong influence also over another Polish Jew and inventor—Izrael Abraham Staffel.

Stern presented to the Society three calculating machines. First machine for four arithmetic operations was designed around 1810 and was presented on 7 January, 1813, then a different machine for extracting square roots (presented on 13 January, 1817), and finally the combined machine for four operations and square roots (30 April, 1818). A lengthy description of Stern’s machines had been given by himself, and you can see it below. Unfortunately, an original of any of his machines did not survive to the present time, only a later replica of one of the machines, shown below. There is also a low quality reproduction of Stern with one of his calculating machines (see below).

Stern with his calculating machine
Abraham Izrael Stern with his calculating machine (upper image)
and a later replica of the machine itself (lower photo) (© Science Museum, London)
The calculating machine of Stern

The only detailed description of the Stern’s machines is his treatise, prepared for the presentation to the Warsaw Scientific Society of the combined machine for four operations and square roots on 30 April 1817, which you can see below (translated from Polish language by Phil Boiarski and Janusz Zalewski):

***
Traetise on an Arithmetic Machine

For the third time, in this earnest place of gatherings of the Society, comprising a selection of learned and enlightened men, I reveal the fruits of my thought—first in the month of January 1813, I presented an invention of a Machine for 4 arithmetic operations—secondly, in January of the current year 1817, an invention of the Machine for extracting roots with fractions—and then finally today, the 30th of April of the current year 1817, an invention combining both these Machines into a single one.

This memorable day is the anniversary of establishing the glorious Warsaw Society of the Friends of Science and honoring it with the title of a Royal Society. I consider myself to be extremely fortunate that on this celebrated day, I can report concerning my inventions, regarding both their historical development and the thought that inspired them as well as regarding properties of said Machines.

Remarks that initially led me to this thought are the following:

A man, although he comes into the world without any means to meet his inevitable needs, nevertheless, being above all creatures with his invaluable gift of mind elevated, with his unlimited ingenuity, uncountable for meeting his stressing needs finds means; because every need he feels inspires him to search and devise means corresponding to this need. That Man, feeling his superiority, thinks that all of nature for his benefit and service has been created and to him subdued; as the Psalmist with astonishment about a man says:

For thou hast made him a little lower than the angels, and hast crowned him with glory and honor. Thou modest him to have dominion over the works of thy hands; thou hast put all things under his feet: All sheep and oxen, yea, and the beasts of the field; The fowl of the air, and the fish of the sea, etc.

This feeling of his undetermined power over all of nature, causes him to regard whatever he finds for himself in nature useful for his needs, even though it should be considered more as a luxury. Experience teaches us that many things that initially were luxurious only because of having been used by a small number of people, with time, however, have become so common that they have shifted from the level intrinsic to luxury to the level of essential need.

From all this ensues, that when in the mankind a number of needs increases, then by this very thing, the ingenuity in methods and means to meet these needs has to multiply. Since such means are commonly based on physical acts, that is, works of the body, which often become onerous, or even beyond human power, so in such case the mind, as a primary Leader of the Man, makes every effort to invent intermediary means to replace the work of the body, or at least to ease it. Following this purpose, numerous mechanical tools have been invented to protect human physical power and support it.

From the depths of this convincing truth, another one equally undeniable have I drawn, that while no one spared efforts to bring assistance and relief to the physical condition, it becomes at least equally necessary to launch a search for mechanical means, which would offer help in human mental activities and relieve the intensity of thought; since the intensity of thought, as it is known, not only often impairs the subtlety of organs, deadens the wit, degrades memory, but also, even causes weakening of the body.

I considered arithmetic or calculation science such a mental activity, one that was necessary, but through an intensity of thought, one that could be harmful. In it, the first 4 types of operations, that is, Addition, Subtraction, Multiplication and Division are the main principles of all calculations, insofar that all other calculi are only the result of combinations of the said 4 kinds. And even though all 4 arithmetic operations, in general, require an uninterrupted presence of mind, that if for a moment gets distracted, a calculation cannot be accurate; since Multiplication and Division, for the reason of higher and more continuous intensity of thought, turn out to be the most difficult ones and therefore so often are subjected to errors.

Abraham Stern demonstrating one of his calculating machines in Warsaw
Abraham Stern demonstrating one of his calculating machines in Warsaw (at public sittings of the Friends of Sciences Society, Stern’s Jewish clothes among black tailcoats worn by his colleagues always puzzled people who were not aware who he was)

At this point, I think it would not be unusual, regarding calculation errors, to make the following remark:

In regular calculus, we do not have and even cannot have a test convincing us whether any error was made; this is because a test performed by a reverse calculation, for example, Multiplication by Division, or Division by Multiplication, does not yet constitute a sufficient proof, for it means to test a mental activity by another mental activity. Since the repeated mental action, intending to serve as a test, is subjected to an equal error as in the primary calculation, this error in a test could have obstructed an error made in the calculation itself, and made it invisible.

All these remarks became for me the reason to invent an arithmetic Machine based on mechanical and arithmetic principles, with the assistance of which even people knowing only counting and numbers, all 4 kinds of calculations, and therefore all the other calculi, without slightest application of thought to it, easily could accomplish. And because I thought it to be just, in such an important subject, not to rely solely on the principles of the theory of the mechanism, on which my invention has been based, insofar the slightest error in these principles could have disproved the entire construction of the invention, therefore for better conviction, I elaborated for testing a model of such an arithmetic Machine that worked. And even though the Machine was not of a durable construction, and the required accuracy in the first, rough design, could not have been achieved, however, it exactly performed all the arithmetic calculations, so far that it proved the reality of this important invention.

In the month of December 1812, I submitted this invention for the consideration of the respectable Royal Warsaw Society of the Friends of Science. This Eminent Society, having assessed the invention as corresponding fully to its purpose, deigned to deliver to the public a message about it, in its gathering on January 1813.

I have stated then, that I have planned to make another Machine, made of metal, in a way strong and durable. And although such an endeavor in particular at the initial stage, required time and significant funds for covering expenses, which by then a critical war situation of the Polish state, of which I am a compatriot, made it even more difficult for me, however, not saving efforts on my part, this statement of mine I have put into effect, so far that working continuously on this invention, I have finished a Machine for 4 fundamental arithmetic operations, completely of metal made with the finest work, and performing 13 digit operations.

In conjunction with work on this arithmetic Machine, I also worked on another, by far more difficult, invention of a Machine for extracting roots with fractions. The difference existing between only arithmetic operations and extracting roots already shows the level of difficulty; because in the former, there are always at least two known numbers given and the third unknown is searched for, but in extracting roots, there is only one known number given, and the other one unknown, that multiplied by itself equals the given number. Admittedly I learned that I ventured into such an abyss, from which a recovery is subject to numerous difficulties, both regarding the implementation of a thought as well as the huge costs, which a carefully elaborated plan definitely required. But no difficulty could oppose my keen willingness to finish the invention, which from various points of view seems to be important, both for the intention proper, the relief in the intensity of thought and counteracting unintentional errors, and to create a completely new mechanical means, included in this invention, which could apply great benefits to mechanical tools in other objects.

Thanks to the Almighty, I have passed this difficult and dangerous path, too, and the Machine for extracting roots with fractions I have led to the intended goal. This invention just like the first one, I have submitted for consideration of the glorious Royal Society of the Friends of Science, about which the public has been informed at the past January gathering of this Society.

This way, then, these two inventions, two separate Machines have been formed, one for the 4 arithmetic operations, and another for extracting roots.

I began thinking further on the ways, which these two inventions could combine into a single Machine. It seemed to me, initially, to be impossible, indeed. But finally, at this point mechanical ingenuity showed me the means to put my intent into effect. The importance of this thought so overwhelmed me, that to all unpleasant things stemming from shortages I have been insensitive, doubling my efforts, so I could make this combination sooner.

Thanks to the Highest Being, in this subject I did not fail either. I can say this boldly, since I am referring to the convincing proof, that is, before our eyes: a Machine, which accurately performs all 4 arithmetic operations, as well as extracting roots.

If I wanted to venture into the details and explanations of all principles of the internal Mechanism of this Machine, the purpose would be missed. Because the Mechanism, comprising several wheels of various kind, rotations of a new type, springs and levers, by various means connected with each other, requires an extensive description and many figures, which will be the subject of a work planned for a later date, with figures clearly presenting the matter, but in this treatise clarifications would be an excessive boring of the respected public. Therefore I am moving now only to a brief sketch of the Machine and the explanation of the way of using it, in various arithmetic operations and extracting roots, as well as doing a foolproof test.

This Machine has a shape of a parallelepiped, longish and rectangular, in its length by five rows of wheels divided. The first, uppermost row, just like the second one underneath, is composed of 13 wheels based on axles. The wheels of the first uppermost row have discs, on which there are engraved ordinary digits of numbers of which only one number over the aperture is visible. Because the numbers of these wheels correspond to positions of units, tens, hundreds, etc., thus, this row entails trillions. Wheels of the second row, in turn, do not have discs, and serve only as the Mechanism offering movement to the uppermost numerical wheels. Both these rows do not change (their place in the Machine. Behind these rows underneath, there are two rows of wheels, which similarly have numerical discs visible through the apertures, and are placed in a separate base in the shape of a carriage. This carriage with its two rows of wheels is so imbedded in the Machine, that it can easily move on smaller wheels or rollers. The first row in this carriage has 7 numerical wheels on the axles of which there are as many folding cranks. Besides these cranks, on the diameter of a folding crank, there is another main crank which can be inserted and removed. The second row underneath has 8 wheels. Below this carriage, there is a lowermost row, composed of 7 wheels, equipped with numerical discs visible through apertures. This row has a stable and invariable place in the Machine. In addition to these rows of wheels, in top of the Machine there are two more rows of wheels, on which Roman numerals are engraved, visible through apertures. One of these rows has its place above the ordinary numerical apertures of the uppermost row, and the other above the ordinary numerical apertures of the lowermost row.

The way of using the Machine in operations is the following:
When any of the 4 arithmetic operations is to be performed, then one has to move to the left the handle positioned on the right on the carriage at the second row. As a result of this move, on a carriage on the left hand side, the word Species shows through an aperture, all the numerical apertures of the second row are covered, and thus the Machine is ready for 4 arithmetic operations. If the species of an operation is to be addition or multiplication, then with two handles at the ends of the Machine devised at the right and left hand sides, one moves up, while at the same time the words: Addition – Multiplication show up on the Machine through apertures, and by this the Machine is ready for these operations. If the species of the calculation were subtraction or division, this is done by moving from top down, the same way, words Addition and Multiplication disappear, and in their place the words Subtraction – Division are seen and the Machine by this is ready for to the said operations.

In calculations of addition or subtraction, one puts the first number known participating in the problem, in the uppermost row, and the other one in the first crank row on a carriage. The operation is performed by the main crank in the middle of the carriage base, which gives movement to the entire Machine. If only a single circular rotation is performed, then the brake, located on the left hand side of the carriage, stops further movement of the Machine, and at the same time the unknown number searched for, appears in the uppermost row through apertures as a result of the operation.

In addition, there is one more convenience in the Machine, that is, because in this type of operation it happens that more than two rows of numbers in the calculation have to be combined, for example, in Registers and Tables, one sets on the Machine the first two given rows, as mentioned above, and by making a single circular rotation of a crank the Machine brakes, one touches the brake with a finger, and the Machine becomes available for rotation. Furthermore, one sets, in the third crank row on a carriage, the third given row, and rotates the crank once again, and so on, acting so until all the given rows are exhausted; at that time, in the uppermost row there will be a general Sum of all the given numbers. However, to prevent an error from squeezing in, when all these different numbers are being added, which can especially happen when the operator interrupts the work, the Machine shows, through the aperture, the number corresponding to the value of how many given rows have been taken to the operation thus far.

Multiplication is performed in the following way. One of the factors is set on the crank row in a carriage, and the other on the lowermost row, while on the uppermost row, which is designated for the product searched for, zeroes are placed. After that, one moves the carriage from the right to the left side, to the very end of the Machine, by the handle placed on the left hand side of the carriage. After releasing the handle, the carriage returns by itself, and stops in a position resulting from the nature of the problem. In this position one begins rotation of the main crank. During the rotation, the carriage moves by itself from one number to the other towards the right hand side, back through the end of the Machine; over there, the operation lasts until the ring of a bell warns about the operation’s completion, while at the same time the product searched for appears already on the uppermost row. In this species of operation, the Machine has a particular superiority over calculations in an ordinary manner, that from several given multiplications one can obtain a general product without performing an addition operation, that is, without combining individually calculated products together. This is because in an ordinary calculation, in such case, one has to first calculate a separate product from every two factors, then collect all individual products together and, by addition, derive the general product. On the Machine, however, one sets the first task and operates as long as the ring of a bell indicates to stop; not paying attention to the value of a product, one sets the second task, third, and so on, and when after the last operation the ring of a bell indicates to stop the rotations, at that time the general product of all the tasks appears on the uppermost row.

In division, one proceeds in the following way. The dividend is set on the uppermost row, and the divisor on the crank row in the carriage, while on the lowermost row, designated for the quotient, zeroes are placed. The carriage moves towards the left hand side, until the divisor stands straight under the dividend number being greater or at least equal to the divisor. Then a main crank rotation begins and lasts as long as the dividend number becomes smaller than the divisor, at which point one presses with finger a flap situated on the right hand side of the carriage, after which the carriage moves by itself towards the right hand side and stops at the appropriate place, where further operation continues in a similar manner till the end of the job. And when the divisor located on the carriage, standing in its first place, that is, at the end of the Machine on the right hand side, carries the dividend, then the operation is to stop and the quotient appears on the lowermost row. In case there is a fraction, then the numerator appears on the uppermost row and the denominator on a crank row in the carriage. If on the uppermost row there are only zeroes, this means that quotient is a whole number, without a fraction.

I am now going to describe the way of extracting roots.

If one wants to extract a square root from a given number, first, one has to move to the right the handle at the second row on the right hand side of the carriage, so that at the left hand side of the carriage, the word Species disappears and is replaced by the word Radices in the aperture. Then, numerical apertures of the second row of the carriage open, and the Machine is ready for extracting roots. Next, one has to move the handles at the ends of the Machine from top down, where between the inscriptions Subtraction – Division, one can also see on the Machine the word Extraction. The main crank in the middle of the carriage has to be removed, and the smaller folding cranks replace it in the operation. On the uppermost row, one sets up the known number of a given square, and on the first and second rows of the carriage all zeroes, except at the position of units in the second row, where one places the number 1. At the apertures for ordinary numbers of the uppermost row there are various signs dividing this row into sections, in such an order that for every two numerical wheels there is a sign, that is, at units, hundreds, tens of thousands, millions, and so on. On the said cranks there are identical signs, so that each crank corresponds to two wheels of the uppermost row, for example, the first crank from the right corresponds to units and tens, the second one – hundreds and thousands, and so on. The last sign, at the given number of the square, points to the crank from which the operation has to start, for example, if the given square ends on the wheels of the first sign, then the operation has to be undertaken with the first crank on the right hand side. If, however, a given square ended on the wheels of the second sign, the operation then begins with the second crank, having the same sign. Indicated this way the folding crank unfolds, the carriage moves to the left until the unfolding crank stops in front of the last sign of a given square. The rotation is conducted with this unfolding crank and lasts as long as the number on the uppermost row, in front of the rotating crank, becomes smaller than or, at least, equal to the number positioned in front of the same crank on the second row of the carriage. Next, by folding this crank, the crank to the right of it unfolds, and by pressing with finger a flap on the right hand side of the carriage, the carriage moves by itself to the right hand side, until it is stopped by a folded crank, just in front of the previous section. One performs the same operations as above, for each section up to the last one. After completing the operation, if a given number was a full square, then it is replaced by zeroes and the whole root on the crank row in the carriage appears. Otherwise, except of the whole number root, an additional fraction results, namely, the numerator on the uppermost row and the denominator on the second row in the carriage.

To approximate the root in decimal fractions, one has to set on the uppermost row as many sections to zeroes as decimal digits in a fraction we want to have, for example, if the root is to be extracted from the number 7, and a fraction approximated with two decimal digits, one sets two sections, or four wheels, to zeroes, and the given number 7 is set in the third section, that is, on the 5th wheel of the uppermost row. To distinguish between the number actually given and the zeroes attached to it, a moving hand always slides out under this sign where the actual number has been set, which warns the operator how many digits for a decimal fraction he has to cut from the right hand side on the crank row in the carriage. This way, then, when a given number is under the third sign, one has to unfold the third crank and perform the operations as above. The root will, then, result on the 3 crank wheels in the carriage, as number 264. Cutting off, following the hand’s warning, two digits for a decimal fraction, will mean 2 wholes and 64 hundredths. In addition to that, in the uppermost row there is number 304, as a numerator, and in the second row of the carriage, 529, as a denominator of the ordinary fraction of the tenth units of the first order.

At the beginning of this treatise I explained that in our ordinary calculus, there is no convincing test that in our mental operation there was not any error, and that a way of testing by reverse calculation does not constitute a sufficient proof. The same remark applies to the operation of the Machine. In case the Machine, due to damage, produced a false result, then the test by a reverse operation would not be proving, because the same damage that caused a false result in Multiplication, for example, would have affected a false result in Division, which would be clear even from the composition of the Machine. But to remedy this, I devised for the Machine a completely different kind of test, which is an absolute proof.

Two rows of wheels with Roman numerals, mentioned above, located on top of the Machine, are designed for this purpose.

To obtain such a reliable test, one proceeds as follows.

Regarding Multiplication: Since from all the factors, the numbers of the factor on the uppermost row disappear during the work, being replaced by zeroes, so to make it visible after the work, what factor was a part of the problem, one sets in advance, on a Roman numbered row located above the apertures of the lowermost row, the signs corresponding to the digits of the factor which is to disappear. And because after completing the operation, the product results on the uppermost row and on the lowermost row there are zeroes, so one shifts as many zeroes to the number 9 as the number of digits of the remaining factor in the Roman numbered row, except of the first digit, being meaningful, at the right hand side of the factor, where the appearing zero remains. After this, the operation of testing begins. The carriage moves to the left and will stop by itself at the last number 9, but the rotation lasts as long as the number appears that is equal to the Roman numeral right above it, that is, the same which previously disappeared. At that time, one presses the flap on the right hand side of the carriage, the carriage moves to the right and the rotations proceed further, as before, until a given factor fully appears on its first place, that is, on the lowermost row.

If after this work it turns out that there are as many digits in the factor on the lowermost row, as the number of zeroes on the uppermost row, at the right hand side, and the numbers following them are equal to the numbers on the crank row of the carriage, then it is an absolute proof that the first product was true, otherwise it had been false.

In Division, the test is conducted as follows. When the dividend is set on the uppermost row, at the same time on the Roman numerals row above it, the same signs are set, so that the dividend, which disappears during the work, that way be preserved; and when after completion of the division, the quotient appears on the lowermost row, it is then moved to the Roman numerals row directly above it. Then one moves the carriage towards the left hand side, until the first number of units on the carriage appears in front of the last number of the quotient. The rotation is conducted in this place, until the carriage moves by itself towards the right hand side, and this continues number by number, until the carriage moves to the first number of units, where one has to rotate as long as a zero appears. After completing this operation, one moves the carriage to the left as long as its first number of units passes all the digits of the preserved quotient. When the carriage is moved thus far, one has to watch if the number on the uppermost row, which has now formed, combined with the number on the crank row of the carriage, will match the dividend preserved on the Roman numerals row, which is a positive proof that the first result was true, otherwise it had been false.

The test of extracting roots is conducted the same way as in the division, except that right before making the test, one has to adjust the Machine from the state of extracting roots to the state of arithmetic operations, and then set on the lowermost row the number equal to the root resulted in the crank row of the carriage. The remaining steps and the proving test are the same as in the division testing.

Remark: I am ending this treatise with a remark that since the Mechanics is an Opener to [meeting] our needs, insofar that not only our physical power but even that of mental power can replace, thus we should put our strongest effort to propagate ingenuity in such a broad and useful field, not venturing, however, into a search for perpetuum mobile, that is, an eternal motion, since this is an incurable disease of Mechanics, just as a philosopher’s stone and an inextinguishable fire in Chemistry, and a squaring of a circle in Geometry—all thoughts in this area have an attribute of an ineffective stubbornness. Let us better strive to make progress in mechanical matters showing promise, since such conduct paves the way to the well-being and glory of the Nation.

  
 Posted by at 4:52 am
Jun 072019
 

https://www.computerhistory.org/atchm/who-invented-the-microprocessor/

Who Invented the Microprocessor?

Intel Pentium microprocessor die and wafer

Intel Pentium microprocessor die and wafer

The microprocessor is hailed as one of the most significant engineering milestones of all time. The lack of a generally agreed definition of the term has supported many claims to be the inventor of the microprocessor. The original use of the word “microprocessor” described a computer that employed a microprogrammed architecture—a technique first described by Maurice Wilkes in 1951. Viatron Computer Systems used the term microprocessor to describe its compact System 21 machines for small business use in 1968. Its modern usage is an abbreviation of micro-processing unit (MPU), the silicon device in a computer that performs all the essential logical operations of a computing system. Popular media stories call it a “computer-on-a-chip.” This article describes a chronology of early approaches to integrating the primary building blocks of a computer on to fewer and fewer microelectronic chips, culminating in the concept of the microprocessor.

 Posted by at 6:15 pm
May 242019
 

https://www.dos4ever.com/flyback/flyback.html

Flyback Converters for Dummies

A simple flyback converter high voltage power supply for NIXIE tubes.

Ronald Dekker

Special thanks to Frans Schoofs, who really understands how flyback converters work


 

If you are interested in Flyback Converters you might want to
keep track of my present project: the µTracer:
a miniature radio-tube curve-tracer
Click here to read about my “low-noise” 6 to 90 V converter project which replaces the anode battery in battery tube receivers.


introduction

In the NIXIE clocks that I have built, I did not want to have the big and ugly mains transformer in the actual clock itself. Instead I use an AC adapter that fits into the mains wall plug. This means that I have to use some sort of an up-converter to generate the 180V anode supply for the NIXIEs.

This page describes a simple boost converter and a more efficient flyback converter both of which can be used as a high voltage power supply for a 6 NIXIE tube display. Frans Schoofs beautifully explained to me the working of the flyback converter and much of what he explained to me you find reflected on this page. I additionally explain the essentials of inductors and transformers that you need to know. This is just a practical guide to get you going, it is not a scientific treatise on the topic.

to top of page back to homepage


What you need to know about inductors

Consider the simple circuit consisting of a battery connected to an inductor with inductance L and resistance R (Fig. 1). When the battery is connected to the inductor, the current does not immediately change from zero to its maximum value V/R. The law of electromagnetic induction, Faraday’s law prevents this. What happens instead is the following. As the current increases with time, the magnetic flux through this loop proportional to this current increases. The increasing flux induces an e.m.f. in the circuit that opposes the change in magnetic flux. By Lenz’s law, the induced electric field in the loop must therefore be opposite to the direction of the current. As the magnitude of the current increases, the rate of the increase lessens and hence the induced e.m.f. decreases. This opposing e.m.f. results in a linear increase in current at a rate I=(V/L)*t. The increase in current will finally stop when it becomes limited through the series resistance of the inductor. At that moment the amount of magnetic energy stored in the inductor amounts to E=0.5*L*I*I.

Figure 1

 

 Posted by at 5:42 am
May 202019
 

http://public.beuth-hochschule.de/~hamann/

Prof. Dr.-Ing. Christian-M. Hamann
( verantwortlich für den Inhalt dieser HomePage )

Spezialgebiete:
( ehem. Leiter des Labors für Künstliche Intelligenz )
LISP & PROLOG
Anwendung Expertensysteme
Evolutionsstrategien & Genetische Algorithmen
Simulation Neuronaler Netze
Positionale Logische Algebra
Fuzzy-Logik

OVER 777 HISTORICAL/TECHNICAL OBJECTS TO EXPLORE …
THE ON-LINE MUSEUM
RechenMaschinen, RechenStäbe, … , SchreibMaschinen, Telefone, Uhren

Collection & Restoration
Mechanical Calculators
Slide Rules
& More…

 Posted by at 6:10 am
May 072019
 

http://www.vcalc.net/hp-code.htm

 

Hewlett Packard Logo

Microcode: Electronic Building Blocks For Calculators

Last Update: January 22, 2003 — THE HP REFERENCE

Hewlett Packard Personal Calculator Digest
Vol. 3, 1977
pp 4-6


Just as DNA can be called the building blocks of the human organism. Microcode can be called the building blocks of the electronic calculator.

But, while the way the human organism works is determined by heredity, the way an electronic calculator works is determined by the highly personal–and even idiosyncratic–creative impulses of a programming specialist.

The principles of programming can be learned, of course. But anyone who has programmed his own calculator quickly discovers that techniques may vary widely from person to person.

Consider the challenge faced by the professional programmer When you press the key labeled SIN, for example, you expect the calculator to display the sine of the value you have keyed into it–and presto, it does. But in that less-than-a-second interval between keystroke and display, the calculator has executed an internal program of about 3500 steps. And it does this according to the highly individualistic microcode that the programmer has created.

The development of microcode in Hewlett-Packard personal calculators began with the development developments of the microprocessor in the HP-35–and not coincidentally, since both were developed by the same Hewlett-Packard engineer.

It is the microprocessor that determines the “language” of the internal microcode. If you are familiar with computer languages such as BASIC, FORTRAN, and COBOL, you know that these languages structure the way you write your program on the computer. You can only do what the language lets you do.

The microprocessor is similar to the computer. It provides a language that a clever engineer can then build into a function on the keyboard.

The original HP-35 microprocessor has remained essentially unchanged through the years and is the heart of the new HP-19C and HP-29C. Compared with computer processors, the binary-coded decimal microprocessor is very simple it does not handle byte data well, but is, in fact, specially designed for 10-digit floating point numbers (See figure 1.). The resulting microcode language most closely resembles machine language, which is programming at as most basic level.

Most microprocessors use 8-bit instructions and two or three instructions are usually combined to perform one operation. The beauty of HP’s calculator microcode is that 10-bit instructions are used and each usually performs a complete operation by itself.

The language’s strongest point is its robust arithmetic section of 37 instructions combined with eight field-select options. The field-select options allow the program to apply the instruction to any word-select portion of the register (See figure 2.).

The language is also designed to use very little storage; only seven registers were used in the HP-35 of which five were user registers. This is done to reduce costs and to save valuable space. For the design engineer it means that he must accomplish all of his miracles within the program itself.

Based on warranty card analysis and other market research, parameters regarding the desired function set and price are given to the design engineer. It is his job then to determine the specific functions for the calculator and to attempt to fit them in the allotted memory. Price is an important factor to the engineer because it directly influences the amount of memory he has to work with.

Only after several months of hard work writing and compacting microcode will he know if the function set will fit. If it is not possible, the product may be redefined at a higher price with greater performance to increase the available memory. More likely however, the engineer will be forced to pare functions until his program fits.

To give you an idea of how much memory is required, the HP-35 used three pages of 256 instructions each. Each page required a separate ROM read-only memory.

  • HP-35—-768 instructions–3/4 quad (3 pages of 256 instructions each)

The HP-45 originally took six pages of instructions. But about that time the quad ROM was developed, which, as its name implies, was the equivalent of four conventional ROM’S. So for the HP-45, two quad ROM’s were used. It was in the leftover two pages that an enterprising designer placed the celebrated HP-45 clock. Later calculators, listed below, continued to use quad ROM’s.

  • HP-45—2048 instructions–2 quads
  • HP-80—2048 instructions–2 quads
  • HP-65—3072 instructions–3 quads
  • HP-70—2048 instructions–2 quads
  • HP-55—3072 instructions–3 quads
  • HP-19C–5120 instructions–5 quads
  • HP-10—1536 instructions–1 1/2 quads
  • HP-21—1024 instructions–1 quad
  • HP-25—2048 instructions–2 quads
  • HP-22—2048 instructions–2 quads
  • HP 91—3072 instructions–3 quads
  • HP-29C–4096 instructions–4 quads
  • HP-27—3072 instructions–3 quads
  • HP-25C–2048 instructions–2 quads
  • HP 67—5120 instructions–5 quads
  • HP 97—6144 instructions–6 quads
  • HP-92—6144 instructions–6 quads

Note: 1 quad = 1024 instructions or 4 pages of 256 instructions each. -Rick-

Writing the microcode is where the designer’s personality is stamped indelibly on the Calculator. While it is true that the fundamental algorithms for commuting the complex mathematical functions found in HP personal calculators have remained essentially the same since the HP-35, the individual code is substantially different.

+---------------------------------------------------------------------+
| NUMBER   REGISTER REPRESENTATION                                    |
|                                                                     |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|   23.4   | 0 | 2 | 3 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |  |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|                                                                     |
|            a                                                        |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|  -123.   | 9 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |  |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|                                                                     |
|                                                                   b |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|  .002    | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 9 | 7 |  |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|                                                                     |
|          a. A "9" in the sign position indicates a negative number. |
|          b. Exponents are kept in 10's complement form.             |
|                                                                     |
+---------------------------------------------------------------------+
|  Figure 1. All numbers in registers are in scientific notation with |
|  the mantissa portion of the number left justified in the mantissa  |
|  portion of the register.                                           |
+---------------------------------------------------------------------+
+---------------------------------------------------------------------+
|          mantissa sign                               exponent sign  |
| pointer    |                                           |            |
| positions+---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|    ----> |13 |12 |11 |10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |  |
|          +---+---+---+---+---+---+---+---+---+---+---+---+---+---+  |
|          |   |                                       |           |  |
|          |   |                                       |           |  |
|          |   +------------- mantissa ----------------+- exponent +  |
|          |                                           |           |  |
|          +----------- mantissa and sign -------------+           |  |
|          |                                                       |  |
|          +----------------------  word --------------------------+  |
|                                                                     |
+---------------------------------------------------------------------+

+---------------------------------------------------------------------+
|Instructions                                                         |
+--------------+------------------------------------------------------+
|  A = 0       |                                                      |
|  B = 0       | Clears word-select portion.                          |
|  C = 0       |                                                      |
+--------------+------------------------------------------------------+
|  B = A       | Copies word-select portion                           |
|  C = B       |   from specified register                            |
|  A = C       |   to specified register.                             |
+--------------+------------------------------------------------------+
|  AB EX       | Exchanges word-select portion                        |
|  AC EX       |   between specified registers.                       |
|  CB EX       |                                                      |
+--------------+------------------------------------------------------+
|  A = A + B   |                                                      |
|  A = A + C   |                                                      |
|  C = A + C   |                                                      |
|  C = C + C   |                                                      |
|  A = A - B   |                                                      |
|  C = A - C   |                                                      |
|  A = A - C   | Performs stated arithmetic                           |
|  A = A + 1   |   on word-select portion.                            |
|  C = C + 1   |                                                      |
|  A = A - 1   |                                                      |
|  C = C - 1   |                                                      |
|  C = -C      |                                                      |
|  C = -C - 1  |                                                      |
+--------------+------------------------------------------------------+
|  A SR        |                                                      |
|  B SR        | Shifts word-select portion right.                    |
|  C SR        |                                                      |
+--------------+------------------------------------------------------+
|              |                                                      |
|  A SL        | Shifts word-select portion left.                     |
|              |                                                      |
+--------------+------------------------------------------------------+
|              | Circular shifts whole A                              |
|  A SLC       |   register but does not have                         |
|              |   word-select option.                                |
+--------------+------------------------------------------------------+
|  ? B = 0     |                                                      |
|  ? C = 0     |                                                      |
|  ? A => C    | Tests word-select portion of                         |
|  ? A => B    |   given register.                                    |
|  ? A = 0     |                                                      |
|  ? C = 0     |                                                      |
+--------------+------------------------------------------------------+
| Field-Select Options                                                |
|                                                                     |
|  1. Mantissa (M)                                                    |
|  2. Mantissa and Sign (MS)                                          |
|  3. Exponent (X)                                                    |
|  4. Exponent Sign (XS)                                              |
|  5. Sign of Mantissa (S)                                            |
|  6. Pointer (P)                                                     |
|  7. Word (W)                                                        |
|  8. Word thru Pointer (WP)                                          |
|                                                                     |
+---------------------------------------------------------------------+
|  Figure 2. Registers are 14 digits long with each digit being four  |
|  bits. An additional four bit register is used as a pointer. The    |
|  programmer can set the pointer to any digit position, change that  |
|  digit or all digits up to that position.                           |
+---------------------------------------------------------------------+

Some of the major routines such as those for sine, cosine, and tangent are the same from calculator to calculator. But in most cases if the code cannot be borrowed exactly as it exists in another calculator, it must be rewritten.

Some designer begin by strictly flowcharting the entire program Others tackle the code directly and leave all but basic flowcharting till the end for documentation purposes only. The code is written originally on paper just as you would write a program on an HP programming pad. It is then either punched on cards or typed into a handy CRT.

The major task in writing the microcode is not only to have the functions produce the correct answers when a key is pressed, but to fit the code into a given amount of memory and make it execute as fast as possible. Compacting the code, that is, rewriting sections of the program to make them more space-efficient, is easy enough, but sometimes results in a loss of speed. These are tradeoffs to which the designer must be constantly attentive.

The processor executes approximately three instructions per millisecond, with each instruction taking the same amount of time. The designer takes into consideration the type of function and the necessary speed when writing the code. Straight-line code with no branches of any I kind executes the fastest. For the label search function on the HP-67 and the HP-97 the designer duplicated a great deal of code to; make it faster. The print instructions for the new HP-19C, on the other hand, did not need to be as fast to keep up with the printer, mechanism. So the designer compacted these codes, making them very complex.

+---------------------------------------------------------------------+
|     +---------------+    +---------------+    +---------------+     |
|     |   A. Answer   |    |B. Multiplicand|    | C. Multiplier |     |
|     +---------------+    +---------------+    +---------------+     |
|                                                                     |
+--------+-----------+--------+---------------------------------------+
| LABEL  | CODE      |        | Explanation                           |
+--------+-----------+--------+---------------------------------------+
|        | A = 0     | W      | Clearing space for answer.            |
|        | P =       | 3      | Starting at least significant digit.  |
|        | GoTo      | Mpy90  | Starting in middle of loop for speed. |
| Mpy90  | A = A + B | W      | Add Multiplicand to partial product   |
|        |           |        |   the number of times specified by    |
|        |           |        |   digit being worked on.              |
+--------+-----------+--------+---------------------------------------+
| Mpy100 | C = C - 1 | P      |                                       |
|        | GoNC      | Mpy90  | NC stands for no carry, i.e. a GoTo   |
|        |           |        |   is executed unless a digit is       |
|        |           |        |   carried (or borrowed).              |
|        | ? P =     | 12     | Have we reached the end of the world? |
|        | GoYes     | END    |                                       |
|        |           |        |                                       |
+--------+-----------+--------+---------------------------------------+
|        | P = P + 1 |        | Move on the next digit.               |
|        | A SP      | W      | This does a divide by 10 to line up   |
|        |           |        |   for the next decade.                |
|        | GoTo      | Mpy100 | Go reenter loop.                      |
|        |           |        |                                       |
+--------+-----------+--------+---------------------------------------+
|  Figure 3. Multiplying two numbers uses the basic routine shown     |
|  above and involves three registers The starting point of this      |
|  code assumes the sign and exponent of the answer have already      |
|  been calculated. END is a common function return which would       |
|  perform operations such as display formatting, printing, etc.      |
+---------------------------------------------------------------------+

In general, programmable calculators go through more gyrations for each function than do preprogrammed calculators because they must generate an intermediate keycode. Where simple functions such as Change Sign, x exchange y, and ENTER require only 100 steps of code on a preprogrammed calculator, the same functions on a programmable calculator might take 150 steps. And a complex function such as rectangular-to-polar conversion might take over 4000 steps, depending on the argument keyed in.

The engineer uses a computer simulator to write and debug his code. Special programs written for this simulator furnish him with status bit information, register contents, and intermediate answers as an aid in this process.

Once the microcode is completed on the computer, it is transferred to an E-ROM (erasable read only-memory) simulator for further debugging (See photo.). The simulator is ideal for this because it is portable and easily updated as bugs are found and corrected. Simulated calculators are given to application engineers and quality assurance engineers to help locate problems.

After much editing, the microcode is ready to be converted into hardware. This usually takes several weeks. In the meantime, the simulators continue to be used heavily and, in most cases, additional bugs are found.

When the completed integrated circuit chips return, the first working models of the calculator are constructed. Final testing is then initiated. Some problems can only be discovered at this stage because of the peculiarities of simulated operation. For example, this is the first time low battery indicators can be checked since the E-ROM simulator does not work on batteries.

At long last, the revised code is ready to be sent for final chips. Although no problems are anticipated at this stage, testing continues to assure traditional Hewlett-Packard reliability.

The tremendous emphasis on testing of the calculators is for practical reasons as well incorrect programs cannot be easily corrected as they can be on large computers. Once the code is set in hardware, changes are costly and inconvenient.

When the final chips are approved for production, the development cycle is complete. The design engineer has spent anywhere from six months to 13 months perfecting his building block design. And whether the end product is a high-powered financial calculator like the HP-92 or a versatile keystroke programmable like the HP-19C, it is first an expression of his personality and creativity.


The Calculator Reference by Rick Furr (rfurr@vcalc.net)


Back to The HP Page


Back to The Calculator Reference

 Posted by at 7:53 pm
May 042019
 

Division, part 1: Integer division

 

DIVISION, PART 1: INTEGER DIVISION

Been a long time since I said anything here, and I and my Nippon HL-21 are parted for a few weeks, so I’ll talk algorithms for a while. Thus far we’ve seen addition, subtraction, and multiplication. The missing operation is division. Now, we’re going to start with “fourth-grade” division: the sort where you divide one whole number by another whole number and get a remainder. Later we’ll talk about decimals.

To start with, we might look at what integer division means, and how we do it by hand; the latter will inform our design of algorithms. Let’s suppose we want to divide, say, 52301 by 13.

 Posted by at 7:22 pm
May 032019
 

http://www.pythondiary.com/blog/Oct.15,2014/building-cpu-simulator-python.html

 

Wednesday, October 15th2014

Building a CPU simulator in Python

You can find the entire source listing from this article, plus more interesting code on my Python Experiments BitBucket page. Plus, the source code there will evolve and grow.

Early this morning in my Planet Python feed, I read this really interesting article called Developing Upwards: CARDIAC: The Cardboard Computer, which is about this cardboard computer called the Cardiac. As some of my followers and readers might know, I have another project that I have been working on and evolving for the past months called simple-cpu, which I have released the source code for. I really should give that project a proper license so that others might feel interested in using it in their own projects… Anyways, hopefully I’ll have that done by the time this publishes.

After reading that article and the page it links to, I felt a bit inspired and decided to write my own simulator for it since I already have experience in writing bytecode engines. I plan on following this article up with another on how to write a Assembler for it, then shortly after how to write a compiler. So basically, throughout these articles, you will learn how to create a build toolchain for the Cardiac in Python. The simple-cpu I wrote already has a fully working Assembler, and in the game I am putting it in, already has the first steps of a working compiler. I choose to also use Cardiac as a demonstration machine due to it’s pure simplicity. There are no really complex mnemonics here, each opcode only accepts a single parameter, so it’s perfect as a learning tool. Furthermore, all data parameters are known to be the same, there is no need to detect if the program wants a registera literal, or a memory address. In fact, there is really only one register, the accumulator. So lets get started. We will be making this class-based, so that the scope is contained and so that you can easily sub-class it to say add new opcodes if you want to feel adventurous. First, we will focus on the Initialization routines. This CPU is very simple, so we only need to initialize the following: CPU registersopcodesmemory spacecard reader/input, and the printer/tty/output.

class Cardiac(object):
    """
    This class is the cardiac "CPU".
    """
    def __init__(self):
        self.init_cpu()
        self.reset()
        self.init_mem()
        self.init_reader()
        self.init_output()
    def reset(self):
        """
        This method resets the CPU's registers to their defaults.
        """
        self.pc = 0 #: Program Counter
        self.ir = 0 #: Instruction Register
        self.acc = 0 #: Accumulator
        self.running = False #: Are we running?
    def init_cpu(self):
        """
        This fancy method will automatically build a list of our opcodes into a hash.
        This enables us to build a typical case/select system in Python and also keeps
        things more DRY.  We could have also used the getattr during the process()
        method before, and wrapped it around a try/except block, but that looks
        a bit messy.  This keeps things clean and simple with a nice one-to-one
        call-map. 
        """
        self.__opcodes = {}
        classes = [self.__class__] #: This holds all the classes and base classes.
        while classes:
            cls = classes.pop() # Pop the classes stack and being
            if cls.__bases__: # Does this class have any base classes?
                classes = classes + list(cls.__bases__)
            for name in dir(cls): # Lets iterate through the names.
                if name[:7] == 'opcode_': # We only want opcodes here.
                    try:
                        opcode = int(name[7:])
                    except ValueError:
                        raise NameError('Opcodes must be numeric, invalid opcode: %s' % name[7:])
                    self.__opcodes.update({opcode:getattr(self, 'opcode_%s' % opcode)})
    def init_mem(self):
        """
        This method resets the Cardiac's memory space to all blank strings, as per Cardiac specs.
        """
        self.mem = ['' for i in range(0,100)]
        self.mem[0] = '001' #: The Cardiac bootstrap operation.
    def init_reader(self):
        """
        This method initializes the input reader.
        """
        self.reader = [] #: This variable can be accessed after initializing the class to provide input data.
    def init_output(self):
        """
        This method initializes the output deck/paper/printer/teletype/etc...
        """
        self.output = []

Hopefully I left enough comments in the code above for you to understand exactly what’s going on here. You might notice here a key difference from my simple-cpuproject, is the method which opcodes are handled. I actually plan on incorporating this new way of detecting opcodes into that project in the near future. This method makes it easier for other developers of the library to extend it for their own requirements. As mentioned before, that project has been evolving as I started to understand more about how things should be done. In fact, taking on a CPU simulator project is a really incredible learning experience all on it’s own. If you are truly a computer scientist, you should understand the under workings of a CPU, and how each opcode is processed at it’s lowest level. Plus, developing and seeing a custom built CPU simulator made by your own imagination is a very gratifying experience. It’s almost like giving birth, as this machine was entirely built by your mind alone, and seeing it work, is something magical.

In the next part of this class, we will focus on the utility functions that we may need to call and use multiple times, these methods can also be overridden in subclasses to alter how the CPU actually functions:

    def read_deck(self, fname):
        """
        This method will read a list of instructions into the reader.
        """
        self.reader = [s.rstrip('\n') for s in open(fname, 'r').readlines()]
        self.reader.reverse()
    def fetch(self):
        """
        This method retrieves an instruction from memory address pointed to by the program pointer.
        Then we increment the program pointer.
        """
        self.ir = int(self.mem[self.pc])
        self.pc +=1
    def get_memint(self, data):
        """
        Since our memory storage is *string* based, like the real Cardiac, we need
        a reusable function to grab a integer from memory.  This method could be
        overridden if say a new memory type was implemented, say an mmap one.
        """
        return int(self.mem[data])
    def pad(self, data, length=3):
        """
        This function pads either an integer or a number in string format with
        zeros.  This is needed to replicate the exact behavior of the Cardiac.
        """
        orig = int(data)
        padding = '0'*length
        data = '%s%s' % (padding, abs(data))
        if orig < 0:
            return '-'+data[-length:]
        return data[-length:]

These are the various utility functions, all of which might be overridden in a subclass. Later in this article, I will also provide an alternate source output which displays how this simulator can be built using Python Mixin classes, to make things even more pluggable. Finally, we find ourselves at the final part of code to get this simulator running, the actual processing methods:

    def process(self):
        """
        Process a single opcode from the current program counter.  This is
        normally called from the running loop, but can also be called
        manually to provide a "step-by-step" debugging interface, or
        to slow down execution using time.sleep().  This is the method
        that will also need to used if you build a TK/GTK/Qt/curses frontend
        to control execution in another thread of operation.
        """
        self.fetch()
        opcode, data = int(math.floor(self.ir / 100)), self.ir % 100
        self.__opcodes[opcode](data)
    def opcode_0(self, data):
        """ INPUT Operation """
        self.mem[data] = self.reader.pop()
    def opcode_1(self, data):
        """ Clear and Add Operation """
        self.acc = self.get_memint(data)
    def opcode_2(self, data):
        """ Add Operation """
        self.acc += self.get_memint(data)
    def opcode_3(self, data):
        """ Test Accumulator contents Operation """
        if self.acc < 0:
            self.pc = data
    def opcode_4(self, data):
        """ Shift operation """
        x,y = int(math.floor(data / 10)), int(data % 10)
        for i in range(0,x):
            self.acc = (self.acc * 10) % 10000
        for i in range(0,y):
            self.acc = int(math.floor(self.acc / 10))
    def opcode_5(self, data):
        """ Output operation """
        self.output.append(self.mem[data])
    def opcode_6(self, data):
        """ Store operation """
        self.mem[data] = self.pad(self.acc)
    def opcode_7(self, data):
        """ Subtract Operation """
        self.acc -= self.get_memint(data)
    def opcode_8(self, data):
        """ Unconditional Jump operation """
        self.pc = data
    def opcode_9(self, data):
        """ Halt and Reset operation """
        self.reset()
    def run(self, pc=None):
        """ Runs code in memory until halt/reset opcode. """
        if pc:
            self.pc = pc
        self.running = True
        while self.running:
            self.process()
        print "Output:\n%s" % '\n'.join(self.output)
        self.init_output()

if __name__ == '__main__':
    c = Cardiac()
    c.read_deck('deck1.txt')
    try:
        c.run()
    except:
        print "IR: %s\nPC: %s\nOutput: %s\n" % (c.ir, c.pc, '\n'.join(c.output))
        raise

As mentioned above, I will now refactor the code into Mixin classes and provide a full source output of that:

class Memory(object):
    """
    This class controls the virtual memory space of the simulator.
    """
    def init_mem(self):
        """
        This method resets the Cardiac's memory space to all blank strings, as per Cardiac specs.
        """
        self.mem = ['' for i in range(0,100)]
        self.mem[0] = '001' #: The Cardiac bootstrap operation.
    def get_memint(self, data):
        """
        Since our memory storage is *string* based, like the real Cardiac, we need
        a reusable function to grab a integer from memory.  This method could be
        overridden if say a new memory type was implemented, say an mmap one.
        """
        return int(self.mem[data])
    def pad(self, data, length=3):
        """
        This function pads either an integer or a number in string format with
        zeros.  This is needed to replicate the exact behavior of the Cardiac.
        """
        orig = int(data)
        padding = '0'*length
        data = '%s%s' % (padding, abs(data))
        if orig < 0:
            return '-'+data[-length:]
        return data[-length:]

class IO(object):
    """
    This class controls the virtual I/O of the simulator.
    To enable alternate methods of input and output, swap this.
    """
    def init_reader(self):
        """
        This method initializes the input reader.
        """
        self.reader = [] #: This variable can be accessed after initializing the class to provide input data.
    def init_output(self):
        """
        This method initializes the output deck/paper/printer/teletype/etc...
        """
        self.output = []
    def read_deck(self, fname):
        """
        This method will read a list of instructions into the reader.
        """
        self.reader = [s.rstrip('\n') for s in open(fname, 'r').readlines()]
        self.reader.reverse()
    def format_output(self):
        """
        This method is to format the output of this virtual IO device.
        """
        return '\n'.join(self.output)
    def get_input(self):
        """
        This method is used to get input from this IO device, this could say
        be replaced with raw_input() to manually enter in data.
        """
        try:
            return self.reader.pop()
        except IndexError:
            # Fall back to raw_input() in the case of EOF on the reader.
            return raw_input('INP: ')[:3]
    def stdout(self, data):
        self.output.append(data)

class CPU(object):
    """
    This class is the cardiac "CPU".
    """
    def __init__(self):
        self.init_cpu()
        self.reset()
        try:
            self.init_mem()
        except AttributeError:
            raise NotImplementedError('You need to Mixin a memory-enabled class.')
        try:
            self.init_reader()
            self.init_output()
        except AttributeError:
            raise NotImplementedError('You need to Mixin a IO-enabled class.')
    def reset(self):
        """
        This method resets the CPU's registers to their defaults.
        """
        self.pc = 0 #: Program Counter
        self.ir = 0 #: Instruction Register
        self.acc = 0 #: Accumulator
        self.running = False #: Are we running?
    def init_cpu(self):
        """
        This fancy method will automatically build a list of our opcodes into a hash.
        This enables us to build a typical case/select system in Python and also keeps
        things more DRY.  We could have also used the getattr during the process()
        method before, and wrapped it around a try/except block, but that looks
        a bit messy.  This keeps things clean and simple with a nice one-to-one
        call-map. 
        """
        self.__opcodes = {}
        classes = [self.__class__] #: This holds all the classes and base classes.
        while classes:
            cls = classes.pop() # Pop the classes stack and being
            if cls.__bases__: # Does this class have any base classes?
                classes = classes + list(cls.__bases__)
            for name in dir(cls): # Lets iterate through the names.
                if name[:7] == 'opcode_': # We only want opcodes here.
                    try:
                        opcode = int(name[7:])
                    except ValueError:
                        raise NameError('Opcodes must be numeric, invalid opcode: %s' % name[7:])
                    self.__opcodes.update({opcode:getattr(self, 'opcode_%s' % opcode)})
    def fetch(self):
        """
        This method retrieves an instruction from memory address pointed to by the program pointer.
        Then we increment the program pointer.
        """
        self.ir = self.get_memint(self.pc)
        self.pc +=1
    def process(self):
        """
        Process a single opcode from the current program counter.  This is
        normally called from the running loop, but can also be called
        manually to provide a "step-by-step" debugging interface, or
        to slow down execution using time.sleep().  This is the method
        that will also need to used if you build a TK/GTK/Qt/curses frontend
        to control execution in another thread of operation.
        """
        self.fetch()
        opcode, data = int(math.floor(self.ir / 100)), self.ir % 100
        self.__opcodes[opcode](data)
    def opcode_0(self, data):
        """ INPUT Operation """
        self.mem[data] = self.get_input()
    def opcode_1(self, data):
        """ Clear and Add Operation """
        self.acc = self.get_memint(data)
    def opcode_2(self, data):
        """ Add Operation """
        self.acc += self.get_memint(data)
    def opcode_3(self, data):
        """ Test Accumulator contents Operation """
        if self.acc < 0:
            self.pc = data
    def opcode_4(self, data):
        """ Shift operation """
        x,y = int(math.floor(data / 10)), int(data % 10)
        for i in range(0,x):
            self.acc = (self.acc * 10) % 10000
        for i in range(0,y):
            self.acc = int(math.floor(self.acc / 10))
    def opcode_5(self, data):
        """ Output operation """
        self.stdout(self.mem[data])
    def opcode_6(self, data):
        """ Store operation """
        self.mem[data] = self.pad(self.acc)
    def opcode_7(self, data):
        """ Subtract Operation """
        self.acc -= self.get_memint(data)
    def opcode_8(self, data):
        """ Unconditional Jump operation """
        self.pc = data
    def opcode_9(self, data):
        """ Halt and Reset operation """
        self.reset()
    def run(self, pc=None):
        """ Runs code in memory until halt/reset opcode. """
        if pc:
            self.pc = pc
        self.running = True
        while self.running:
            self.process()
        print "Output:\n%s" % self.format_output()
        self.init_output()

class Cardiac(CPU, Memory, IO):
    pass

if __name__ == '__main__':
    c = Cardiac()
    c.read_deck('deck1.txt')
    try:
        c.run()
    except:
        print "IR: %s\nPC: %s\nOutput: %s\n" % (c.ir, c.pc, c.format_output())
        raise

You can find the code for deck1.txt from the Developing Upwards: CARDIAC: The Cardboard Computer article, I used the counting to 10 example.

Hopefully this article was inspiring to you and gives you a brief understanding on how to built class-bases modular and pluggable code in Python, and also gave you a nice introduction to developing a CPU simulator. In the next article which I hope to publish soon, will guide you through making a basic assembler for this CPU, so that you can easily and effortlessly create decks to play around with in the simulator.

Comment #1: Posted 4 years, 6 months ago by Calvin Spealman

This is such cool work! The simplicity of the CARDIAC is certainly something to admire. If you don’t mind I’ll probably follow up with a nod towards this. Are you planning to put the code up at a proper repo anywhere?

Comment #2: Posted 4 years, 6 months ago by Kevin Veroneau

@Calvin, the code is up in a repo, look inside the information tooltip box at the very top of this article for a click-able link to the BitBucket page.

About Me

My Photo

Names Kevin, hugely into UNIX technologies, not just Linux. I’ve dabbled with the demons, played with the Sun, and now with the Penguins.





Kevin Veroneau Consulting Services
Do you require the services of a Django contractor? Do you need both a website and hosting services? Perhaps I can help.

If you like what you read, please consider donating to help with hosting costs, and to fund future books to review.


Python Powered | © 2012-2019 Kevin Veroneau

 Posted by at 5:44 am
May 032019
 

https://www.cs.drexel.edu/~bls96/museum/cardiac.html

 

CARDIAC

Background

The acronym CARDIAC stands for “CARDboard Illustrative Aid to Computation.” It was developed by David Hagelbarger at Bell Labs as a tool for teaching how computers work in a time when access to real computers was extremely limited. The CARDIAC kit consists of a folded cardboard “computer” and an instruction manual. In July 1969, the Bell Laboratories Record contained an article describing the system and the materials being made available to teachers for working with it.

As illustrated in the following pictures, the CARDIAC computer consisted of a left-hand CPU section and a right-hand memory section. On the CPU side there are five sliders:

  • One slider of input “cards”
  • One slider for the accumulator sign
  • Three sliders for the digits of an instruction

The memory side has a single slider of output “cards.” Portions of the sliders show through cutouts in the card frame. The cutouts for the input and output card sliders each show the current card to be read or written. The combination of the accumulator sign and the three instruction sliders show steps through cutouts that describe the operation of the selected instruction. Effectively, the sliders and cutouts are the instruction decoder of the CPU. Finally, each memory location has a hole in it. A small carboard ladybug serves as the program counter which is moved from location to location in response to the steps described on the CPU side.

The CARDIAC manual is 50+ pages divided into 16 sections describing the basics of computers from a late 1960s perspective. The first six sections cover things like flow charts, instructions, data, addresses, and the stored program concept. Sections 7–12 discuss the CARDIAC and some basic programming techniques including loops and multiplication. Sections 13 and 14 discuss the techniques for bootstrapping and subroutines, both of which we elaborate on below. Section 15 focuses on the development of a program to play NIM. Finally, Section 16 discusses assemblers and compilers. Although there is some duplication of information, the material on this page is not intended to replace the manual. Rather, the material here expands on that in the manual, particularly from the point of view of one who is already familiar with the most basic concepts of computers and programming.

Pictures

Click on these pictures for larger versions.

Book and “Computer”

Open CARDIAC

CARDIAC Architecture

Memory

The CARDIAC has a grand total of 100 memory locations identified by the two-digit decimal numbers 00 through 99. Each memory location holds a signed three-digit decimal numer. (With the exception of a single code example, the CARDIAC book is actually silent on whether memory contains signed or unsigned values.) Locations 00 and 99 are special. Location 00 always contains the value 001, which as we see below is the instruction to read a card into location 01. This special value is used the the bootstrapping process discussed later. Location 99 always contains a value between 800 and 899. The tens and ones digits of the number are the value of the program counter after a jump instruction is executed. This provides the mechanism for a return from subroutine.

CPU

The CARDIAC CPU is a single-accumulator single-address machine. Thus each instruction operates optionally on a single memory location and the accumulator. For example, the ADD instruction reads the data in one memory location, adds it to the current value of the accumulator and stores the result back into the accumulator. The ALU supports addition, subtraction, and decimal shifting. CARDIAC’s CPU architecture is illustrated in the following figure:

The CARDIAC accumulator holds a signed 4-digit number, which seems odd given that everything else is oriented around 3-digit numbers. The manual includes the statement:

Since CARDIAC’s memory can store only 3-digit numbers, you may be puzzled by the inclusion of an extra square in the accumulator. It is there to handle the overflow that will result when two 3-digit numbers whose sum exceeds 999 are added.

What’s not clear is under what conditions that overflow/carry digit is kept or discarded. From the discussion of the SFT instruction in Section 12 of the manual, exactly four digits are kept for the intermediate value between the left and right shift operations. However, the manual doesn’t state whether all four digits are kept between instructions nor what happens when storing the accumulator to memory if the accumulator contains a number whose magnitude is greater than 999. In the case of our simulator, we retain all four digits, effectively implementing a 4-digit ALU. However, when storing the accumulator to memory, we discard the fourth digit. I.e. the number stored in memory is a mod 1000, where a is the contents of the accumulator.

I/O

The CARDIAC has exactly one input device and one output device. These are a card reader and a card punch. Unlike real punch cards, the CARDIAC input and output cards can each hold exactly one signed three-digit number. When a card is read by way of the INP instruction, it is taken into the card reader and removed from the stack of cards to be read. Similarly, on each OUT instruction, a new card is “punched” with the specified value on it, and the card moved to the output card stack.

Instruction Set

The CARDIAC’s instuction set has only 10 instructions, each identified by an operation code (opcode) of 0 through 9. The instructions are as follows:

Opcode Mnemonic Operation
0 INP Read a card into memory
1 CLA Clear accumulator and add from memory (load)
2 ADD Add from memory to accumulator
3 TAC Test accumulator and jump if negative
4 SFT Shift accumulator
5 OUT Write memory location to output card
6 STO Store accumulator to memory
7 SUB Subtract memory from accumulator
8 JMP Jump and save PC
9 HRS Halt and reset

Encoding

All instructions are non-negative numbers expressed as three-digit decimal numerals. The CARDIAC manual doesn’t describe what happens if an attempt is made to execute a negative instruction. In our simulator, we treat negative instructions as no-ops (i.e. they are ignored and the program continues on to the next instruction). The operation code is the most significant of those three digits, i.e., o=⌊i /100⌋, where i is the contents of the instruction register (IR) loaded from the memory location specified by the PC. For most instructions, the lower-order digits are the address of the operand, i.e. a=i mod 100. This arrangement is illustrated in the following figure.

In the cases of the INP and STO instructions, a is the destination address for the data coming from either an input card or the accumulator, respectively. In the cases of the CLA, ADD, OUT, and SUB instructions, a is the source address of the second operand to the ALU or the source address of the operand being written to an output card. For the TAC, JMP, and HRS instructions, a is the address to be loaded into the PC (conditionally, in the case of the TAC instruction). The remaining instruction, SFT, doesn’t treat the lower-order digits as an address. Instead, each of the lower-order digits is a number of digit positions to shift first left, then right. The left shift count is given by l=⌊a /10⌋, and the right shift count is given by r=a mod 10. The instruction format for the SFT instruction is shown in the following figure:

Instruction Execution

The instructions operate as described here. In this discussion, we use the following notation:

Notation Meaning
ACC Contents of the accumulator
PC Contents of the program counter
a Operand address as described in the previous subsection
MEM[x] Contents of memory location x
INPUT Contents of one card read from the input
OUTPUT Contents of one card written to the output
INP
The INP instruction reads a single card from the input and stores the contents of that card into the memory location identified by the operand address. (MEM[a] ← INPUT)
CLA
This instruction causes the contents of the memory location specified by the operand address to be loaded into the accumulator. (ACC ← MEM[a])
ADD
The ADD instruction takes the contents of the accumulator, adds it to the contents of the memory location identified by the operand address and stores the sum into the accumulator. (ACC ← ACC + MEM[a])
TAC
The TAC instruction is the CARDIAC’s only conditional branch instruction. It tests the accumulator, and if the accumulator is negative, then the PC is loaded with the operand address. Otherwise, the PC is not modified and the program continues with the instruction following the TAC. (If ACC < 0, PC ← a)
SFT
This instruction causes the accumulator to be shifted to the left by some number of digits and then back to the right some number of digits. The amounts by which it is shifted are shown above in the encoding for the SFT instruction. (ACC ← (ACC × 10^l) / 10^r)
OUT
The OUT instruction takes the contents of the memory location specified by the operand address and writes them out to an output card. (OUTPUT ← MEM[a])
STO
This is the inverse of the CLA isntruction. The accumulator is copied to the memory location given by the operand address. (MEM[a] ← ACC)
SUB
In the SUB instruction the contents of the memory location identified by the operand address is subtracted from the contents of the accumulator and the difference is stored in the accumulator. (ACC ← ACC − MEM[a])
JMP
The JMP instruction first copies the PC into the operand part of the instruction at address 99. So if the CARDIAC is executing a JMP instruction stored in memory location 42, then the value 843 will be stored in location 99. Then the operand address is copied into the PC, causing the next instruction to be executed to be the one at the operand address. (MEM[99] ← 800 + PC; PC ← a)
HRS
The HRS instruction halts the CARDIAC and puts the operand address into the PC. (PC ← a; HALT)

Assembly Language

All of the code fragments and complete program examples on this page are shown in an assembly language format with each line organized into six columns:

  1. Address: The first column shows the memory address respresented by that line.
  2. Contents: In the second column, we put the number that is stored in that memory location.
  3. In most cases, this is a instruction, but for lines with a DATA pseudo-op, it is a data value.

  4. Label: The third column contains an optional label on the memory location, allowing it to be identified by name, rather than by address.
  5. Opcode: Instruction mnemonics are places in the fourth column. In addition to the ten instructions discussed above, we will use on pseudo-op (or assembler directive), DATA. For memory locations containing a DATA item, the operand is the literal data value stored in the memory location, rather than an operand for an instruction. This pseudo-op is particularly useful when labeled for creating variables.
  6. Operand: The fifth column is the operand part of the instruction or the literal data for a DATA directive. Numerical operands are included directly in the address field of the instruction. When a label name appears as an oeprand, the memory address associated with that label is placed in the address field of the instruction.
  7. Comment: Any desired descriptive text can be placed after the operand.

Indirection, Indexing, and Pointers

Notice that the only way of specifying the address of a memory location we want to use is in the instruction itself. Most comptuer architectures provide a mechanism whereby the address we want to use can be stored in a register or another memory location. Variables which contains memory addresses are usually referred to as pointers.

Indirect Loads

Even though the CARDIAC doesn’t have hardware support for using pointers directly, we can still do simple indirect addressing. Suppose we have a variable stored in a memory location called ptr and it has the value 42 in it. Now if we want to load the accumulator with the contents of memory location 42, we can do something like:

05	100	loader	DATA	100
06	042	ptr	DATA	042

20	105		CLA	loader
21	206		ADD	ptr
22	623		STO	indload
23	100	indload	CLA	00

Notice that even though we have specified that we will load from location 00 in the instruction at location 23, we will have changed it to load from location 42 by the time we run execute that instruction. For that matter, it doesn’t matter if we’ve loaded anything into location 23 before starting this sequence. It will get set before we use it.

Indirect Stores

Storing the accumulator to a memory location identified by a pointer is similar. We just have to be careful not to lose the value we want to store while we’re fiddling about with the store instruction and in the following bit of code:

05	600	storer	DATA	600
06	042	ptr	DATA	042
07	000	acc	DATA	000

20	607		STO	acc
21	105		CLA	storer
22	206		ADD	ptr
23	625		STO	indstor
24	107		CLA	acc
25	600	indstor	STO	00

Array Indexing

Often we aren’t so much interested in a pointer that identifies a single memory location as we are in an array of memory locations we can refer to by index. We will identify our array locations starting at index 0. So the first element of the array is at index 0, the second at index 1, and so on. If we have a variable called base that holds the first address of the array, then we can just add the base and the index together to get the address of a particular element. This is just a slight modification of the indirect accesses above. In particular, to load from an array element:

05	100	loader	DATA	100
06	042	base	DATA	042
07	000	index	DATA	000

20	105		CLA	loader
21	206		ADD	base
22	207		ADD	index
23	624		STO	arrload
24	100	arrload	CLA	00

and for storing to an array element:

05	600	storer	DATA	600
06	042	base	DATA	042
07	000	index	DATA	000
08	000	acc	DATA	000

20	608		STO	acc
21	105		CLA	storer
22	206		ADD	base
23	207		ADD	index
24	626		STO	arrstor
25	108		CLA	acc
26	600	arrstor	STO	00

If we’re dealing with only one array, we could eliminate one add instruction from each sequence by pre-adding the base and loader and pre-adding the base and storer.

Stacks

Another use of indirect address is the stack data structure. If you’re not familiar with a stack, think of it like a stack of plates in a cafateria. A plate is always placed on top of the stack. Likewise, the one removed is always the one on the top of the stack. We refer to the process of putting an element onto a stack as pushing and the process of taking an element off of a stack as popping.Note that we always pop that most recently pushed element. Because of this, the stack is often referred to as a last-in, first-out (LIFO) data structure. Pushing and popping are very similar to storing and loading indirectly, except that we must also adjust the value of the pointer that identifies the top of the stack. In the following code we’ll use a memory location named tos (for top-of-stack) for the pointer. Also, we’ll do as is often done in hardware stacks and let the stack grow downward. That is to say, as we push data onto the stack, the stack pointer moves toward lower memory addresses. With that in mind, here is a fragment of code for pushing the accumulator onto the stack:

05	600	storer	DATA	600
06	100	loader	DATA	100
07	089	tos	DATA	089
08	000	acc	DATA	000

20	608		STO	acc
21	107		CLA	tos
22	205		ADD	storer
23	628		STO	stapsh
24	107		CLA	tos
25	700		SUB	00
26	607		STO	tos
27	108		CLA	acc
28	600	stapsh	STO	00

And similarly to pop from the top of the stack:

20	107		CLA	tos
21	200		ADD	00
22	607		STO	tos
23	206		ADD	loader
24	625		STO	stapop
25	100	stapop	CLA	00

These code fragments (slightly modified) are used in the example below that uses the LIFO properties of the stack to reverse the order of a list of numbers on the input cards.

Subroutines

There are many reasons why we might wish to subdivide a program into a number of smaller parts. In the context of higher level languages and methodologies, these subdivisions are often referred to by names like procedures, functions, and methods. All of these are types of subroutines, the name we usually use when working at the hardware or machine language level. In these sections, we look at the techniques for creating and using subroutines on the CARDIAC. Each subsection progressively builds from the simplest subroutine technique to more complex and advanced techiques. Don’t worry if not all of it makes sense on a first reading. You can get a good sense of the general idea of subroutines without necessarily understanding the details of how recursion is implemented on a machine as limited as the CARDIAC.

Single Simple Subroutines

In the CARDIAC, the JMP instruction is effectively a jump-to-subroutine instruction, storing the return address in location 99. Because the address stored in location 99 is prefixed by the opcode 8, the instruction in that location becomes a return-from-subroutine instruction. Thus any segment of code whose last instruction is at location 99 can be called as a subroutine, simply by jumping to its first instruction. For example, a simple routine to double the value of the accumulator could be coded as:

96	000	accval	DATA	000

97	696	double	STO	accval
98	296		ADD	accval
99	800		JMP	00

and the subroutine can be called with a jump to double:

	897		JMP	double

Multiple Subroutines

Clearly, if our subroutine executes a JMP instruction or if it calls another subroutine, then we will lose our return address, because it will be overwritten by the JMP instruction. Along similar lines, if we have more than one subroutine in our program, only one of them can be at the end of the memory space and flow directly into location 99.

As a result, in many cases, we’ll need a more involved subroutine linkage mechanism. One way to accomplish this is to save the return address somewhere and restore it when needed. If we use this method, we’ll have to devise a mechansism to transfer control to location 99 with the right return address. Although location 99 can itself be used as the return from subroutine instruction, it doesn’t have to be. In many cases, it will be easier to copy it to the end of our actual subroutine. Using this approach, we can write a subroutine that outputs the value of the accumulator as follows:

80	686	aprint	STO	86
81	199		CLA	99
82	685		STO	aexit
83	586		OUT	86
84	186		CLA	86
85	800	aexit	JMP	00

Similarly, our doubling routine would look like:

90	696	double	STO	96
91	199		CLA	99
92	695		STO	dexit
93	196		CLA	96
94	296		ADD	96
95	800	dexit	JMP	00

See below for an example of a program that uses these subroutines to produce a list of powers of two.

Recursion

There’s one more limitation on subroutines still in the techniques we have developed. What happens if a subroutine calls itself? You might reasonably as, is it even useful for a function call itself? The answer is, yes, and it called recursion.

The key to making it possible for a subroutine to call itself is to realize that no matter where we’re called from, we always want to return to the place from which we were most recently called that we haven’t already returned to. That should sound familiar. We should use the return addresses in the same LIFO order that a stack provides. In other words, when we call a recursive subroutine, we want to push the return address onto a stack and then pop it back off when we return from that subroutine. With a little reflection, we can see that this approach applies to all subroutine calls, not just to those that are recursive. This is why pushing return addresses on a stack is the basis for hardware subroutine call support in most architectures since about the 1970s on.

On the CARDIAC, we can implement this technique with a modification of the multiple subroutine technique above. When entering a subroutine, rather than copying location 99 to the return from subroutine instruction, we push the contents of location 99 onto the stack. Then when we’re about to return from the subroutine, we pop the return address off the stack into the return from subroutine instruction. So our code would look something like:

	1xx		CLA	tos
	2yy		ADD	storer
	6zz		STO	stapsh
	1xx		CLA	tos
	700		SUB	00
	6xx		STO	tos
	199		CLA	99
zz	600	stapsh	STO	00
	 .
	 .		body of the subroutine
	 .
	1xx		CLA	tos
	200		ADD	00
	6xx		STO	tos
	2ww		ADD	loader
	6ss		STO	stapop
ss	100	stapop	CLA	00
	6rr		STO	rts
rr	800	rts	JMP	00

There’s one more aspect of recursive subroutines that is also suitable for other subroutines as well. In particular, subroutines often need input data passed to them by whatever code has called them or temporary variables that are needed during the course of their operation. If a subroutine is not recursive, we can get away with just allocating some fixed memory locations for these. However, in the case of recursive subroutines, we need to make sure that we have fresh ones for each time the subroutine is called and not overwrite the ones that might still be needed by other instances we might return back to. The most natural way to handle this is to allocate them on the stack along with the return address.

Putting all these things together, we can summarize the steps for calling a subroutine in the most general cases:

  1. Before calling the subroutine, we push any inputs (also called arguments or parameters) onto the stack.
  2. Transfer control to the first instruction of the subroutine, saving the PC (which holds the return address) in the process.
  3. If the hardware has not already saved the PC onto the stack, the first thing we do in the subroutine is copy it to the stack.
  4. Move the stack pointer to resever space on the stack for any temporary (local) variables the subroutine will need.
  5. Before returning, the subroutine readjusts the stack pointer to remove the temporary variables it allocated.
  6. If the hardware does not already expect the return address to be on the stack, we need to pop it off the stack and copy it back to where it does need to be.
  7. Return control from the subroutine back to the code that called it.
  8. Finally, the calling code adjusts the stack pointer to remove the arguments it pushed onto the stack before calling the subroutine.

Bootstrapping

Like many of the early system designs, the mechanism for loading an initial program into the CARDIAC and getting it running involves a small amount of hardware support and a lot of cleverness. The whole enterprise is often somewhat remenescent of the image of a person attempting to lift themselves off the ground by pulling on their own bootstraps. This is why we usually refrer to the process as bootstrapping or often just booting.

The CARDIAC’s hardware support for bootstrapping is the fixed value of memory location 00. The fixed contents of this memory location are 001 which is the instruction to load a single card into location 01. Naturally, after executing this instruction, the PC moves to location 01 and executes the instruction on the card just read. But what do we put on that card to load? The answer is 002, which is the instruction to load a card into location 02. This causes us to load a second card into location 02 and execut it. At first glance, it would seem we haven’t really improved things any, because we’re right back where we’re still just loading a single card and executing it. But here’s where the first bit of cleverness comes in. The card we load into location 02 has the value 800 on it which causes us to jump back to location 00 which will load another card into location 01. We now have a loop that loads cards into location 01 and executes them. If the instructions we put into location 01 are reads of cards into other memory locations, we now have a little program that reads a whole set of cards into memory. Conveniently, a card containing just a memory address also contains the instruction to read a card into that memory address. So if the next card we read after the 800 is, say, 010, then location 01 will be changed to an instruction to read a card into location 10, after which we’ll execut the 800 instruction to jump back to location 00 and do it all over again. This means that after the 002 and 800 cards, we can have pairs of cards where the first of the pair is the address where we want to put some data, and the second of the pair is the data to put there.

If this is all we did, we’d read all the remaining cards into memory and then the computer would halt when there were no more cards to read. But there’s another trick we can play. If we make the last address-data card pair change location 02 from 800 to a jump to the first instruction of our program, the loader loop will stop and control will transfer to the program we just loaded. So after all of our address-data card pairs, we’ll append the cards 002 and 8xx where xx is the address of the first instruction of our program. The net effect is that we can now load a program and start running it without any manual intervention.

The last piece of this puzzle is how do we include the data we want the program to operate on? It turns out, that’s a simple as just appending the data after the 002 and 8xx cards. When control transfers to the program we loaded, any remaining cards will still be in the reader waiting to be read. When the program executes its first INP instruction, it will happily read the next card, not knowing that there were a bunch of other cards read ahead of it.

So putting all the pieces together, we bootstrap the CARDIAC by putting together a card deck that looks like:

002
800
 .
 .	address-data card pairs
 .
002
8xx	where xx is address of the first instruction
 .
 .	data cards
 .

Then we put that deck into the card reader, and start the computer at address 00. The CARDIAC will first load the two-card bootstrap loader, then load the program into memory, then transfer control to the newly loaded program. If the program itself also includes INP instructions, they read the remaining data cards.

Simulator

We have developed a CARDIAC simulator suitable for running the code discussed on this page. All of the examples in the next section have been tested using this simulator.

To avoid any unnecessary requirements on screen layout, the simulator is laid out a little differently than the physical CARDIAC. At the top of the screen is the CARDIAC logo from a photograph of the actual unit. This picture is also a link back to this page. The next section of the screen is the CARDIAC memory space as appears on the right hand side of the physical device. When the simulator starts up, the value 001 in location 00 and the value 8– in location 99 are preloaded. As a simplification, we don’t use a picture of a ladybug for the program counter, but instead highlight the memory location to which the PC points with a light green background. Each memory location is editable (including the ones that are intended to be fixed), and the tab key moves focus down each column in memory address order.

The bottom section of the simulator is the I/O and CPU. Input is divided into two text areas. The first is the card deck and is editable. The second area is the card reader, and as cards are consumed by the reader they are removed from the listing in the reader. Cards in the deck are loaded into the reader with the Load button. Output cards appear in the Output text area as they are generated with the OUT instruction.

The CPU section of the simulator has four parts showing the status of the CPU and buttons for control. On the top of the CPU section, the Program Counter is shown in an editable text box. Below that is the instruction decoder with non-editable text boxes showing the contents of the Instruction Register and a breakdown of the instruction decoding in the form of an opcode mnemonic and numeric operand. The Accumulator is shown below the instuction decoder. Below the register display are six buttons that control the operation of the simulator:

Reset
The Reset button clears the instruction register, resets the PC and accumulators to 0 and clears the output card deck.
Clear Mem
This button resets all memory locations to blank and re-initializes location 00 to 001 and location 99 to 8–.
Step
Clicking on the Step button causes the simulator to execute the single instruction highlighted in the memory space as pointed to by the program counter. Upon completion of the instruction, the screen is updated to show the state of the computer after the instruction.
Slow
The Slow button causes the simulator to begin executing code starting at the current PC. Instructions are executed at the rate of 10 per second with the screen being updated after each instruction. When the program is run in this way, the movement of the highlighted memory shows the flow of control in the program very clearly.
Run
In the current version of the simulator, the Run button causes the program to be executed beginning from the current PC at the full speed of the JavaScript interpreter. Because of the way JavaScript is typically implemented, the screen contents will not show the effects of code execution until the simulator executes the HRS instruction and the program halts.
Halt
Pressing the Halt button while the program is running in slow mode causes the simulator to stop after the current instruction. The state of the machine remains intact and can be continued with any of the StepSlow, or Run buttons.

Examples

The remainder of this page are a number of examples of programs written for the CARDIAC. They have all been tested using the simulator described above. Because the memory space of the CARDIAC is so limited, none of the programs are particularly complex. You won’t find a compiler, operating system, or web browser here. However, we do have a few of more complexity than you might expect. There’s a pretty simple program for generating a list of the powers of 2. There’s one that recursively solves the Towers of Hanoi problem. For each of them, we include the assembly language source code with assembled machine language code and a card deck suitable for bootstrapping on the CARDIAC.

Note that most of these examples aren’t the most compact way of solving the problem. Rather, they illustrate techniques as described through this page. The primary exception is the Towers of Hanoi solution which requried some effort to squeeze it into the limited memory space of the CARDIAC.

When we take these programs and turn them into decks of cards to be bootstrapped on the CARDIAC, we get the card decks listed below the program listings. If you cut and paste the list into the input deck of the simulator, hit load, and hit slow, you can see the program get loaded into memory and run.

Count from 1 to 10

This is sort of our CARDIAC version of “Hello World.” Our objective is simply to print out a set of output cards with the values 1 to 10. We keep two variables to control the process. One, called n keeps track of how many cards we still have left to print. At any point in time it represents that we need to print n+1 more cards. We also have a variable called cntr wich is the number to print out. Each time through the loop, we check to see if n is negative and if so, we’re done. If not, we decrement it, print cntr and then increment cntr.

Program Listing

04	009	n	DATA	009
05	000	cntr	DATA	000

10	100		CLA	00	Initialize the counter
11	605		STO	cntr	
12	104	loop	CLA	n	If n < 0, exit
13	322		TAC	exit
14	505		OUT	cntr	Output a card
15	105		CLA	cntr	Increment the card
16	200		ADD	00
17	605		STO	cntr
18	104		CLA	n	Decrement n
19	700		SUB	00
20	604		STO	n
21	812		JMP	loop
22	900	exit	HRS	00

Card Deck

002
800
010
100
011
605
012
104
013
322
014
505
015
105
016
200
017
605
018
104
019
700
020
604
021
812
022
900
004
009
002
810

List Reversal

Our next example uses the stack techniques described above to take in a list of cards and output the same list in reverse order. The first card in the input deck (after the bootstrapping and the program code) is the count of how many cards we’re operating on. The remainder of the input deck are the cards to reverse. In the example card deck, we are reversing the first seven Fibonacci numbers.

Program Listing

04	600	storer	DATA	600
05	100	loader	DATA	100
06	089	tos	DATA	089	Stack pointer
07	000	acc	DATA	000	Temp for saving accumulator
08	000	n1	DATA	000	Write counter
09	000	n2	DATA	000	Read counter

10	008		IN	n1	Get the number of cards to reverse
11	108		CLA	n1	Initialize a counter
12	609		STO	n2
13	109	rdlp	CLA	n2	Check to see if there are any more cards to read
14	700		SUB	00
15	327		TAC	wrlp
16	609		STO	n2
17	007		IN	acc	Read a card
18	106		CLA	tos	Push it onto the stack
19	204		ADD	storer
20	625		STO	stapsh
21	106		CLA	tos
22	700		SUB	00
23	606		STO	tos
24	107		CLA	acc
25	600	stapsh	STO	00
26	813		JMP	rdlp
27	108	wrlp	CLA	n1	Check to see if there are any more cards to write
28	700		SUB	00
29	339		TAC	done
30	608		STO	n1	
31	106		CLA	tos	Pop a card off the stack
32	200		ADD	00
33	606		STO	tos
34	205		ADD	loader
35	636		STO	stapop
36	100	stapop	CLA	00
37	890		JMP	aprint	Output a card
38	827		JMP	wrlp
39	900	done	HRS	00

90	696	aprint	STO	96	Write a card containing the contents of the accumulator
91	199		CLA	99
92	695		STO	aexit
93	596		OUT	96
94	196		CLA	96
95	800	aexit	JMP	00

Card Deck

002
800
004
600
005
100
006
089
007
000
008
000
009
000
010
008
011
108
012
609
013
109
014
700
015
327
016
609
017
007
018
106
019
204
020
625
021
106
022
700
023
606
024
107
025
600
026
813
027
108
028
700
029
339
030
608
031
106
032
200
033
606
034
205
035
636
036
100
037
890
038
827
039
900
090
696
091
199
092
695
093
596
094
196
095
800
002
810
007
001
001
002
003
005
008
013

Powers of 2

This is a slightly more interesting version of the list from 1 to 10. In this case, we are printing the powers of 2 from 0 to 9. The main difference is that instead of incrementing the number to output, we call a subroutine that doubles it. The program illustrates the use of multiple subroutines as discussed above.

Program Listing

04	000	n	DATA	000
05	009	cntr	DATA	009

10	100		CLA	00	Initialize the power variable with 2^0
11	880		JMP	aprint
12	604	loop	STO	n
13	105		CLA	cntr	Decrement the counter
14	700		SUB	00
15	321		TAC	exit	Are we done yet?
16	605		STO	cntr
17	104		CLA	n
18	890		JMP	double	Double the power variable
19	880		JMP	aprint	Print it
20	812		JMP	loop
21	900	exit	HRS	00

80	686	aprint	STO	86	Print a card with the contents of the accumulator
81	199		CLA	99
82	685		STO	aexit
83	586		OUT	86
84	186		CLA	86
85	800	aexit	JMP	00

90	696	double	STO	96	Double the contents of the accumulator
91	199		CLA	99
92	695		STO	dexit
93	196		CLA	96
94	296		ADD	96
95	800	dexit	JMP	00

Card Deck

002
800
005
009
010
100
011
880
012
604
013
105
014
700
015
321
016
605
017
104
018
890
019
880
020
812
021
900
080
686
081
199
082
685
083
586
084
186
090
696
091
199
092
695
093
196
094
296
002
810

Towers of Hanoi

By far the most complex example we include is a solution to the Towers of Hanoi problem. The puzzle consists of three posts on which disks can be placed. We begin with a tower of disks on one post with each disk smaller than the one below it. The other two posts are empty. The objective is to move all of the disks from one post to another subject to the following rules:

  1. Only one disk at a time may be moved.
  2. No disk may be placed on top of a smaller disk.

According to legend, there is a set of 64 disks which a group of monks are responsible for moving from one post to another. When the puzzle with 64 disks is finally solved, the world will end.

Although the puzzle sounds like it would be difficult to solve, it’s very easy if we think recursively. Moving n disks from Post a to Post b using Post c as a spare can be done as follows:

  1. Move n−1 disks from Post a to Post c.
  2. Move one disk from Post a to Post b.
  3. Move n−1 disks from Post c to Post b.

The CARDIAC doesn’t have enough memory to solve a 64-disk puzzle, but we can solve smaller instances of the problem. In particular, the program we show here can solve up to six disks. The actual number of disks to solve is given by the first data card, and the initial assignment of source destination and spare posts is given on the second data card. The post assignments as well as the output encoding are shown in the following table.

Output Disk Move
000 1 → 3
001 2 → 3
002 3 → 2
003 3 → 1
004 2 → 1
005 1 → 2

For example, the post assignments indicated by a card with the value 3 are that Post 3 is a, Post 2 is c and Post 1 is b. Similarly, an output card with 3 indicates that we are to move a disk from Post 3 to Post 1.

Before trying to understand the details of this program, note that there are several tricks used to reduce the memory usage. The amount of memory available for the stack allows for a puzzle of up to six disks to be solved with this program. Be aware, however, that slow running this program on six disks takes the better part of a half hour to run.

Program Listing

03	031	tos	DATA	031
04	100	loader	DATA	100
05	600	storer	DATA	600
06	107	r2ld	DATA	r2
07	001	r2	DATA	001
08	000		DATA	000
09	005	five	DATA	005
10	004		DATA	004
11	003	three	DATA	003
12	002		DATA	002

34	033		INP	32	Get the number of disks from the cards
35	032		INP	31	Get the column ordering from the cards
36	838		JMP	tower	Call the tower solver
37	900		HRS

38	199	tower	CLA	99	Push the return address on the stack
39	890		JMP	push
40	111		CLA	three	Fetch n from the stack
41	870		JMP	stkref
42	700		SUB	00	Check for n=0
43	366		TAC	towdone
44	890		JMP	push	Push n-1 for a recursive call
45	111		CLA	three	Get the first recursive order
46	870		JMP	stkref
47	669		STO	t1
48	109		CLA	five
49	769		SUB	t1
50	890		JMP	push
51	838		JMP	tower	Make first recursive call
52	880		JMP	pop
53	111		CLA	three	Get move to output
54	870		JMP	stkref
55	669		STO	t1
56	569		OUT	t1
57	111		CLA	three	Get second recursive order
58	870		JMP	stkref
59	206		ADD	r2ld
60	661		STO	t2
61	100	t2	CLA	00
62	890		JMP	push
63	838		JMP	tower	Make second recursive call
64	880		JMP	pop
65	880		JMP	pop
66	880	towdone	JMP	pop
67	668		STO	towret
68	800	towret	JMP	00

70	679	stkref	STO	refsav	Replace the accumulator with the contents
71	199		CLA	99	of the stack indexed by the accumulator
72	678		STO	refret
73	179		CLA	refsav
74	203		ADD	tos
75	204		ADD	loader
76	677		STO	ref
77	100	ref	CLA	00
78	800	refret	JMP	00

80	199	pop	CLA	99	Pop the stack into the accumulator
81	688		STO	popret
82	103		CLA	tos
83	200		ADD	00
84	603		STO	tos
85	204		ADD	loader
86	687		STO	popa
87	100	popa	CLA	00
88	800	popret	JMP	00

90	689	push	STO	pshsav	Push the accumulator on to the stack
91	103		CLA	tos
92	205		ADD	storer
93	698		STO	psha
94	103		CLA	tos
95	700		SUB	00
96	603		STO	tos
97	189		CLA	pshsav
98	600	psha	STO	00

Card Deck

002
800
003
031
004
100
005
600
006
107
007
001
008
000
009
005
010
004
011
003
012
002
034
033
035
032
036
838
037
900
038
199
039
890
040
111
041
870
042
700
043
366
044
890
045
111
046
870
047
669
048
109
049
769
050
890
051
838
052
880
053
111
054
870
055
669
056
569
057
111
058
870
059
206
060
661
061
100
062
890
063
838
064
880
065
880
066
880
067
668
068
800
070
679
071
199
072
678
073
179
074
203
075
204
076
677
077
100
078
800
080
199
081
688
082
103
083
200
084
603
085
204
086
687
087
100
088
800
090
689
091
103
092
205
093
698
094
103
095
700
096
603
097
189
098
600
002
834
003
000

Pythagorian Triples

The next example comes courtesy of Mark and Will Tapley. It finds sets of three integers which satisfy the Pythagorian property of x2+y2=z2.

Discussion

There is much motivation and explanation for this program at:

https://www.khanacademy.org/math/recreational-math/vi-hart/vi-cool-stuff/v/what-was-up-with-pythagoras

Subroutine to calculate square of a number:

In finding pythagorean triplets, the operation of squaring a number occurs very often, so the program uses a subroutine to perform this function.

  • Addresses 076–099 are loaded with the subroutine to utilize the return function hard-wired at address 099.
  • Addresses 072–075 are used for data storage for the subroutine.
  • Address 072 is loaded with the value 32, one larger than the largest allowable input. The calling program can test an input by subtracting this value from the prospective input and branching if the result is negative. (Negative value means legal input.)
  • Address 073 accepts the input to the subroutine. On return, the absolute value of the input will be in this location.
  • Address 074 is used as a counter during routine execution.
  • Address 075 will contain the calculated square, an integer between 0 and 961 inclusive.
Subroutine INPUT:

Store the number to be squared in address 073
Jump to address 077 (label SQmem in assembly listing)

-OR-

Load the number to be squared into the accumulator
Jump to address 076 (label SQacc in assembly listing)

Subroutine OUTPUT:

On return, the square of the input number is in address 075.

The subroutine has a single loop (addresses 090–098). In each loop, it subtracts one from a counter which is initially set to one greater than the input number N, then adds a copy of N into the output address. When the counter reaches 1, the output address contains the sum of N copies of N=N2 and the loop exits, returning program control to the location from which it was called (per the return capability special function of location 99).

Limitations:

The square of the input number must have 3 or fewer digits to comply with cell storage limitations. Therefore the input number is checked to be 31 or less (since 322=1024). Violating this condition will cause the subroutine to terminate execution (HRS) with the program counter pointing at location 086. The input number is converted from negative to positive if it was negative, so if the calling program needs a copy of the input, it should store it in some location other than Address 073 (SQIN). After the subroutine executes, that location will contain the absolute value of the input.

Main Program:

The main program searches over all allowable lengths of the shortest side S of the right triangles corresponding to pythagorean triplets. For each shortest side, it then searches over all possible lengths of the intermediate side L. For each combination of short and intermediate sides, it checks whether there is a hypotenuse H that satisfies the condition S2+L2=H2. The short side (S) search starts at 0, to avoid missing any triplets with very small values. (This results in identifying the degenerate triplet (0,1,1) which does satisfy 02+12=12 but does not really correspond to a right triangle.) The long side (L) search for each value of S starts at S+1, because L cannot equal S for an integer triplet (see URL above) and if L<S, the corresponding triplet should already have been found with a smaller S. (So, this program will identify (3,4,5) but will not identify (4,3,5).) The hypotenuse (H) search starts at 1.4 times S, since the minimum possible length of the hypotenuse is greater than the square root of 2 (1.404…) times S. (Note: 1.4 times S is calculated by shifting S right and then adding four copies of the result, which is truncated to an integer, to S. For S<10, the result is just S, so the search takes needlessly long until S≥10.)

With the starting values for S, L, and H, the program calculates S2 + L2−H2. If the result is <0, H is too long. In this case, the program increments L and tries again. If the result is =0, a triplet has been found and is printed out. The program then increments L and tries again. If the result is >0, H is too short. In this case, H is incremented and the program tries again. When H is long enough that no more triplets can be found for this value of S, the value of S is incremented, new L and H starting values are calculated, and the loop repeats.

  • Addresses 010–067 are loaded with the main program.
  • Addresses 004–009 are used for data storage.
  • Address 004 contains S, the smallest member of the triplet (length of the short leg of the triangle) and is initially set to 0.
  • Address 005 contains S2, calculated each time S is changed.
  • Address 006 contains L, the intermediate member of the triplet (length of the long “leg” of the triangle) and is re-initialized for each smallest member loop to one greater than the smallest member (which is always the minimum possible value for L; see above)
  • Address 007 contains L2, calculated each time L is changed.
  • Address 008 contains H, the largest member of the triplet (length of the hypotenuse of the triangle) and is initialized for each smallest member to a value <1.4×(the smallest value) (which is always shorter than the minimum possible value for H)
  • Address 009 contains H2, calculated each time H is changed. The same address also contains S/10 (S shifted right by one place), used to initialize H each time S is changed. This value is used to set the initial value of H to 1.4 S, which is just less than √2S.

The “outside” loop of the program (addresses 010–067) tests for all possible sets of triplets with the smallest value S stored in 004. After each loop, it increments the value of S and tries again. This loop will terminate when the value of 1.4×S exceeds 31, since the subroutine will no longer be able to calculate correct squares for any possible hypotenuse value (H). The subroutine will halt execution when this input is sent to it. (The outer loop also contains a check to verify that the value of S itself doesn’t exceed 31, but this check is never reached.)

The next-inner loop (addresses 032–061) starts with a value of L=S+1. Any smaller, and L would take the role of S (and hence, the resulting triplet would have already been found with a smaller S) or would be qual to S (and the length of the corresponding hypotenuse would be irrational). This loop terminates on one of two conditions: first, when the value of H exceeds 31 (in which case the subroutine to calculate squares can no longer work); or second, when 2L>S2. This latter condition applies because once L exceeds S2/2, L2 and H2 cannot differ by as little as S2 even if H=L+1. At that point, H2−L2 = (L+1)2−L2=2L+1>S2.

The innermost section (addresses 032–044) calculates the difference S2+L2−H2. If the difference is positive, H is incremented and the loop repeats. If the difference is zero, a triplet has been found and the values of S, L, and H are printed out. If the difference is negative or zero, L is then incremented and the loop repeats. In any case where H is incremented, its new value is checked against the limit for inputs to the subroutine, and if it exceeds that limit, the inner two loops terminate and the outer loop progresses to the next value of S.

Independent Verification:

The code below is instructions to Mathematica (tested on versions 8 and 3) which should compute the same output as the above program, but using a more general (and slower) algorithm. It will also generate a plot of triplets by (short side) against (intermediate side).

candid = 
Table[
	Table[
		Table[
			{i, j, k}, 
			{k, j, i^2/2 + 2}
		], 
		{j, i+1, i^2/2 + 1}
	], 
    {i, 0, 31}
];

trips = Select[Flatten[candid, 2], #1[[1]]^2 + #1[[2]]^2 == #1[[3]]^2 & ];

smalltrips = Select[trips, #1[[3]] < 32 & ]

ListPlot[(Take[#1, 2] & ) /@ trips]

Program Listing

Symbol map:
Address		Variable
04		S			short side = 0 initially
05		S2			square of short side
06		L			long side
07		L2			square of long side
08		H			hypotenuse
09		H2			square of hypotenuse. (Also used
					to store S/10 in picking initial
					value of H each loop.)
--		----
72		SQLIM			maximum input to Square = 30 initially
73		SQIN			input to square subroutine
74		SQCNT			counter for square subroutine
75		SQOUT			output for square subroutine

Address		Name (as referenced by JMP instruction)
00		BootLp
10		S_Loop
32		L_Loop
45		Next_H
49		PrintTr
52		Inc_L
62		Next_S
--		-----
76		SQacc
77		SQmem
83		SQpos
87		SQgood
90		SQloop

Load	Instr.	
Address	Opcode		Instruction	Comment

		BootLp:
002	800		JMP 	BootLp	Bootstrap loop. Code self-modifies
					to load memory locations.

004	000		(variable)	S Initial value for Short side = 0
072	032		(constant)	SQLIM Limit on input to square = 32

		S_Loop:
010	104		CLA	S		
011	673		STO	SQIN	Input to square subroutine
012	200		ADD	1	(Using ROM value)
013	606		STO	L	Save long side L
014	877		JMP	SQmem	Square subroutine (saved entry)
015	175		CLA	SQOUT	Retrieve result of subroutine
016	605		STO	S2	Store square of S
017	106		CLA	L	Load L
018	876		JMP	SQacc	Square subroutine, entry using ACC
019	175		CLA	SQOUT	Retrieve result of subroutine
020	607		STO	L2	Store square of L
021	104		CLA	S	Load S
022	401		SFT	01	Divide by 10
023	609		STO	H2	Save S/10 temporarily in H2 location
024	209		ADD	H2	Sum into accumulator
025	209		ADD	H2	Sum into accumulator
026	209		ADD	H2	Sum into accumulator
027	204		ADD	S	Sum is now between S and 1.4 S ~ S sqrt(2)
028	608		STO	H	Store initial hypotenuse H
029	876		JMP	SQacc	Square subroutine (accumulator entry)
030	175		CLA	SQOUT
031	609		STO	H2	Store square of H

		L_Loop:
032	105		CLA	S2	Load short side squared
033	207		ADD	L2	Add long side squared
034	709		SUB	H2	Subtract hyp. squared
035	352		TAC	Inc_L	if H2 too big, increment L
036	700		SUB	1	Subtract 1 (ROM)
037	349		TAC	PrintTr	H was just right - print
038	108		CLA	H	H too small, so load H
039	200		ADD	1	Add 1 (ROM)
040	608		STO	H	Store back
041	673		STO	SQIN	Save in input to Square routine
042	772		SUB	SQLIM	Subtract limit for input
043	345		TAC	Next_H	Go on if negative (input < 32)
044	862		JMP	Next_S	Branch to next value of S if not.

		Next_H:
045	877		JMP	SQmem	(saved entry)
046	175		CLA	SQOUT	Get result
047	609		STO	H2
048	832		JMP	L_Loop	Try again

		PrintTr:
049	504		OUT	S	Print S
050	506		OUT	L	Print L
051	508		OUT	H	Print H

		Inc_L:
052	106		CLA	L	Load L
053	200		ADD	1	Increment
054	606		STO	L	Store
055	876		JMP	SQacc	Square subr.
056	175		CLA	SQOUT	get result
057	607		STO	L2	Store new L squared
058	106		CLA	L	Load new L
059	206		ADD	L	Double it
060	705		SUB	S2	Subtract S^2
061	332		TAC	L_Loop	If S^2 still bigger, keep looking

		Next_S:
062	104		CLA	S	Load short side S
063	200		ADD	1	Increment
064	604		STO	S	Store short side S
065	772		SUB	SQLIM	Subtract upper limit for Square
066	310		TAC	S_Loop	If result is negative, new S is low
					enough to loop again
067	900		HRS		Else, S is longer than Square can handle,
					so Done - exit.

---	---		--------
		SQacc:
076	673		STO	SQIN	Jump here if input value is in ACC

		SQmem:
077	173		CLA	SQIN	Jump here if input is already in SQIN
078	773		SUB	SQIN	Input was in both accumulator and SQIN, so this gets 0
079	675		STO	SQOUT	initialize output to 0 for use later
080	773		SUB	SQIN	This gets negative of SQIN
081	383		TAC	SQpos	If the negative is negative, SQIN is positive - good.
082	673		STO	SQIN	If the negative is positive, store that in SQIN.

		SQpos:
083	173		CLA	SQIN	Load Absolute value of input
084	772		SUB	SQLIM	Compare against limit value
085	387		TAC	SQgood	Quit if number to square > limit
086	986		HRS		Halt if error on input.

		SQgood:
087	173		CLA	SQIN	Retrieve number
088	200		ADD	0	Add one
089	674		STO	SQCNT	Count is input + 1

		SQloop:
090	174		CLA	SQCNT	load counter
091	700		SUB	0	subtract 1
092	674		STO	SQCNT	save new counter value
093	175		CLA	SQOUT	load output
094	273		ADD	SQIN	add a copy of input
095	675		STO	SQOUT	store cumulative sum
096	100		CLA	0	load 1 (from ROM)
097	774		SUB	SQCNT	subtract counter
098	390		TAC	SQloop	loop again if counter was > 1

		Jump out of boot loop to 10 (skips initial increment to S)
002	810		JMP	S_Loop

Card Deck

002
800
004
000
072
032
010
104
011
673
012
200
013
606
014
877
015
175
016
605
017
106
018
876
019
175
020
607
021
104
022
401
023
609
024
209
025
209
026
209
027
204
028
608
029
876
030
175
031
609
032
105
033
207
034
709
035
352
036
700
037
349
038
108
039
200
040
608
041
673
042
772
043
345
044
862
045
877
046
175
047
609
048
832
049
504
050
506
051
508
052
106
053
200
054
606
055
876
056
175
057
607
058
106
059
206
060
705
061
332
062
104
063
200
064
604
065
772
066
310
067
900
076
673
077
173
078
773
079
675
080
773
081
383
082
673
083
173
084
772
085
387
086
986
087
173
088
200
089
674
090
174
091
700
092
674
093
175
094
273
095
675
096
100
097
774
098
390
002
810

Other CARDIAC Resources

Related Work


Brian L. StuartDepartment of Computer ScienceDrexel University

 Posted by at 5:43 am
May 032019
 
 Posted by at 5:41 am
Apr 272019
 

 

gatema logo

Výroba
desek
plošných
spojů

Rozšiřujeme povrchové úpravy o Imerzní stříbro
Nová brožura pro vývojáře
Konfigurátor

Nová brožura pro vývojáře

Na 20 stranách formátu A4 najdete celou škálu tabulek, nákresů, fotek nebo popisů důležitých pro kvalitní návrh desek plošných spojů. Přináší důležité informace a odpovědi na vaše dotazy. Navrhnutý stackup, dodržení aspect ratia vrtaného otvoru, výběr správné technologie atp.

OBJEDNAT ZDARMA

Tento web využívá cookies

Tyto stránky používají soubory cookie k poskytování služeb a analýze návštěvnosti. Soubory cookie používáme také k personalizaci reklam, když na tomto webu na něco kliknete nebo přejdete, vyjádříte tím svůj souhlas k našemu používání cookie.Přečtěte si další informace, mimo jiné i to, jaké máte možnosti.

 Posted by at 3:13 pm