Pluginy v Bow Commanderu
Bow Commander je file manager pro ZX Spectrum 128K s DivMMC. Poslední dobou do něj přibývají nové funkce a s nimi jsem narazil na limit, který s mým způsobem programování občas nastane: paměť. Nakonec mě to donutilo změnit způsob, jakým jsou některé části programu uložené a spouštěné.
ZX Spectrum 128K má osm paměťových bank po 16 kB. To je celý rozpočet, se kterým Bow Commander pracuje, a několik bank je obsazených prakticky od začátku.
- 1 banka pro jádro programu,
- 1 banka pro obrazovku,
- 2 banky pro mezipaměti adresářů levého a pravého panelu,
- 1 banka pro operace se soubory, které potřebuju mít stále k dispozici.
Zbývají tři banky. Dokud Bow Commander obsahoval prohlížeč souborů, editor a nastavení, vycházelo to přesně: jedna funkce, jedna banka. Nebyla tam ale prakticky žádná rezerva. Ano, každá funkce neměla přesně 16kB, ale jde o to, že i tyto funkce rozšiřuji a nerad překládávám náročnější funkcionality (např. editor...) do různých stránek, podle toho jak moc se mi nafoukly implementací nové super-čupr funkce.Navíc některé funkce potřebují ke svému chodu velký buffer (editor, viewer...).
A pak jsem chtěl přidat záložky - Bookmarks. Další volná banka samozřejmě nikde nebyla - teda mohl bych použít pamět DivMMC, ale tam bych např (pravděpodobně) odřízl uživatele interface DivIDE.
Řešení je nakonec poměrně jednoduché. Prohlížeč, editor, nastavení a nově i záložky už nemají každý svou vlastní banku natrvalo. Místo toho sdílejí jednu společnou paměťovou banku. Když některou z těchto funkcí otevřu, Bow Commander nahraje z SD karty do této banky přesně ten kód, který je v danou chvíli potřeba.
Žádná z těchto funkcí nemusí běžet současně s jinou, takže nemá smysl držet všechny v paměti najednou. Za cenu krátkého načtení z karty jsem tím získal prostor pro další části programu.
Pluginy? Ne tak docela...
Říkám tomu pluginy, i když z pohledu dnešního software to samozřejmě nejsou pluginy v pravém slova smyslu. Mezi jádrem Bow Commanderu a dotahovaným kódem nemám žádné formální API, verzovanou tabulku funkcí ani podobnou abstrakci. Něco takového jsem implementoval u Calm Commanderu, kde jsem (naivně) cílil na to, že by někdo mohl časem pro Calm Commander psát pluginy sám...
Tady je situace jednodušší. Celý Bow Commander se překládá společně, takže modul, který se později načítá z karty, při překladu zná stejné symboly a adresy jako zbytek programu. Z pohledu zdrojového kódu tedy může pracovat s jádrem téměř stejně, jako kdyby byl jeho běžnou součástí. Jen jeho výsledný strojový kód skončí v samostatném souboru a do paměti se dostane až ve chvíli, kdy je potřeba.
Není to příliš univerzální řešení. Takhle bych nemohl jednoduše vzít cizí plugin a nahrát ho do Bow Commanderu bez společného překladu. Pro tenhle projekt mi to ale vůbec nevadí. Bow Commander si píšu celý sám a nepočítám s tím, že by pro něj někdo vytvářel externí pluginy.
První test: prohlížeč, editor a záložky
V posledních pár dnech jsem na nový systém postupně převedl prohlížeč souborů a editor. Dříve měl každý vlastní banku obsazenou po celou dobu běhu Bow Commanderu, dnes se jejich kód načítá pouze ve chvíli, kdy je opravdu potřeba.
První úplně novou funkcí napsanou rovnou tímto způsobem jsou záložky. Chtěl jsem jednoduchou možnost uložit si oblíbenou cestu pod vlastním názvem a později na ni rychle skočit – klidně i na jiný disk. Záložky byly zároveň dobrým testem celé architektury. Nešlo totiž jen o přesunutí existujícího kódu do jiného místa v paměti. Celou funkci jsem napsal od začátku už s tím, že bude fungovat jako načítaný modul.
A funguje to přesně tak, jak jsem potřeboval. Uložení záložky i její výběr ze seznamu běží v dotahovaném kódu. Samotný přechod do vybraného adresáře už ale provede jádro, protože právě při něm je potřeba aktualizovat panel a věci okolo.
Teď zpátky k nastavení
Momentálně se vracím k nastavení Bow Commanderu. Dolaďuju editaci barev a přebindování klávesových zkratek, hlavně drobnosti kolem vykreslování a pohybu mezi jednotlivými sekcemi. Není to už žádná zásadní změna architektury. Spíš úklid a opravy detailů před tím, než novou verzi pustím ven.
Nový způsob načítání modulů otevírá prostor i pro funkce, na které předtím jednoduše nebyla paměť. Do budoucna bych rád zkusil například prohlížeč obrázků nebo přehrávač hudby. Obojí je přesně ten typ nástroje, který člověk nepoužívá neustále a u kterého vůbec nevadí počkat několik desetin sekundy, než se jeho kód načte z karty.
Teď zbývá všechno pořádně otestovat. Pokud se cestou neobjeví něco zásadního, tahle změna by měla Bow Commanderu dát výrazně větší prostor pro další funkce, aniž bych kvůli každé z nich musel hledat další paměť, která na 128K Spectru jednoduše není.


1 Comment
Bow Commander je vynikající software.
Děkuji za neustálý vývoj.