Názor k článku Kouzlo minimalismu potřetí: vývoj her a dem pro slavné ZX Spectrum od Pavel Křivánek - Prometheus je malá pokladnice špeků, co se tenkrát...

  • Článek je starý, nové názory již nelze přidávat.
  • 7. 2. 2023 12:58

    Pavel Křivánek

    Prometheus je malá pokladnice špeků, co se tenkrát s programy dělaly. Pár příkladů.

    Prometheus na začátku zkopíruje část kódu, která je potřeba jen jednou (nastavení + relokátor), do video RAM (díky nastavení atributů není vidět) a po použití je zahozena.

    Program je relokovatelný. Neznamená to, že by byl napsán s pomocí jen relativních skoků. Používá tabulku míst v programu, které je potřeba upravit tak, aby odpovídala cílové adrese. Tato tabulka se generovala při kompilaci.

    Prometheus masivně používá sebemodifikující se kód. Nejběžnější příklad je využití paměťového místa s výchozí hodnotou proměnné k uchování její změněné hodnoty.

    variableX:
        ld b,001h
     ...
       ld (variableX+1),a

    Nastavení se také zhusta dělá tak, že se prostě přepíše příslušný kus programu tak, aby dělal, co má - ušetří se místo a nemusí se testovat hodnoty proměnných a dělat skoky. Třeba nastavení toho, jestli se písmena mají zobrazovat jako malá, velká či nezměněná

    caseModificationCodeOptions:
        and 0ffh  ; normal
        or 020h   ; lowercase
        and 0dfh  ; uppercase

    Podobně se řeší to, jestli se fonty mají vykreslovat tučně. Nebo když chcete tisknout nějaký řetězec, umístí se literál s jeho obsahem přímo za volání tiskové rutiny (pomocí CALL). Ta si ze zásobníku vyzvedne adresu, která odpovídá začátku řetězce, a po vytištění skočí za jeho konec (JP, nikoliv RET), kde program vesele pokračuje.

    Jeho Monitor má úsporně řešené provázání kódů kláves (či klávesových zkratek) s akcemi, které se při jejich stisknutí mají provést. Používá k tomu tabulku, která obsahuje pro každou položku dva byty. Druhý je kód stisknuté klávesy, první je rozdíl adres dané operace a operace svázané s předcházející klávesou (přičemž adresa první takové operace je známá). To ušetří místo, protože místo dvojbytové adresy každé operace (je jich celkem 40) stačí jeden byte, a navíc to zkrátí relokační tabulku. Kód pak vypadá nějak takto:

    defb monShowAddresses - monExecutionMode
    defb 0x63 ; c       - show addresses
    defb monAddressPrintingMode - monShowAddresses
    defb 0x3f ; SS + c  - addresses printing mode

    Pro dekompilaci takového kódu to znamená, že adresám příslušných operací nejsou v kódu automaticky přiřazena vůbec žádná návěští, ta je teprve nutné dopočítat. Rovněž ona tabulka vypadá na první pohled jako posloupnost bytů bez zjevného smyslu. Aby toho nebylo málo, na příslušné operace se neskáče pomocí CALL nebo JP, ale tak, že se požadovaná adresa vloží na zásobník a pak se provede RET.