01.začátek
FORTH je naprosto úžasný jazyk a kdo to neví, má mezeru ve vzdělání a měl by si ji doplnit:)
S FORTHem jsem začal kdysi na BBC Micro se Z80 koprocesorem a CP/M (týjóó celých 60kB pro programy a data a k tomu grafika navíc). Psal jsem to ve strojáku, nějak to chodilo, něco to dělalo, ale Sametová Revoluce a další okolnosti to odsunuly stranou. Ten FORTH jsem si napsal podle nějakého popisu jeho chování, snad z Amára, nebo něčeho takového, určitě nebyl úplný, ale nějak fungoval a měl jsem takový pocit, že to ani není moc velký program, takže to muselo být docela malé. (Píše o se o tom zde a scany jsou tady a tady )
Pak jsem ho tak nějak používal pořád. Teda vlastně ne. Ale několik mých větších programů (jako Mzdy pro Transgass a tak) používaly větší bloky kódu s RPN a zásobníky a dalšími vychytávkami tam, kde samotný systém nestačil, a nebo kde jsem potřeboval nějaké speciality konfigurovatelné snáz než přeprogramováním.
Narazil jsem na jonesforth.S pro 32bit PC (By Richard W.M. Jones <rich@annexia.org> http://annexia.org/forth - odkaz je asi už neplatný) a velice se mi líbil (doporučuju pročíst a projít si odkazy z něj) a napsal jsem v něm obecné řešení problému 8 Dam na šachovnici. A překlopil jsem ho na 64bit systémy (kde je potřeba používat jiné registry jinak a zcela jiná systémová volání) a ty dámy chodily i na nové verzi, ale pak tak nějak zase šel život okolo a nic moc z toho nebylo. (git.annexia.org github
Teď si hraju s Arduinama a přemýšlím o vlastním 8bitovém počítači Comp24 a vypadá to, že se zase k FORTHu vracím z jiné strany. Jednak ho tam asi chci jako variaci na BASIC a jiné "operační systémy" osmibiťáků ... ale to se ještě uvidí, jednak mě u různých Arduin štve ladění, kdy si nemůžu jen tak snadno cvičit s nožičkama bez kompilování a nahrávání (něco na způsob http://mix.gilhad.cz/Sklad/74HCxx-tester-14-16.html ale lepšího pro ruční manipulaci). Narazil jsem na nanoFORTH a nevypadalo to špatně, ale limit na 3 písmena mi neseděl a neviděl jsem do toho tolik a tak jsem oprášil jonesforth a zkusím si napsat svojí vlastní verzi s Arduinem a jeho piny jako hlavním cílem a patrně i s http://mix.gilhad.cz/HW/PS2-RCA-VGA/PS2-RCA-VGA.html a http://mix.gilhad.cz/Blog/Blog_2025.html#arduino-day . Pokud mi to umožní snadno tahat za nožičky, tak skvělé, pokud to bude umět i dobře FORTHovat, tak ještě líp, hlavně jestli mě to bude bavit (zatím vypadá, že ano).
Úvahy
- Tohle potřebuju hlavně na piny, nejčastější hodnoty asi budou +/-127 ale asi stejně vezmu aspon 16bit čísla +/-32K
- jednotlivá slova se budou přidávat do RAM, primitiva budou ve FLASH kvůli úspoře místa.
- codeblock povede do FLASH v každém případě (stačí 16b pointer)
- pointer na slova musí být 24b __memx (2b pointer+mark, 0x80 znamená FLASH, 0x00 znamená RAM)
- nemůžu rozdělit primitiva do FLASH a ostatní slova do RAM, protože i FORTH obsahuje dost DOCOL slov (QUIT počínaje) pro vnitřní použití
- potřebuju 3B pointery, ale __memx jde jen v C a nikoli v C++ viz tady , ale přes 3B uniony to propašovat jde.
- návratové adresy jsou 2B (FLASH only)
- ? ukládat ukazatele jako 2 hodnoty, nebo 1 (a mít zásobníky na 3B, nebo 4B?)
- 3B zásobník návratových adres zní podivně, protože CALLy a tak ukládají 2B a hlavně se to při čemkoli rozsype mnohem hůř
- asi prostě bude zásobník 2B a ukazatele budou 2 položky s horním bytem nulovým (+ignorovaným v ukazatelových slovech)
- začal jsem od definic typů v C a nějak se mi ta idea rozpadá na technikáliích, možná zkusím napsat nějaký kus uprostřed a pak to třeba bude jednodušší - a zkusím víc používat přetypování
- umělák jako vždy hrozně kecá a drobně pomáhá :)