Ti trovi in: Magazine » Numero 7 » Reform: un decompilatore per Z-Code


Reform: un decompilatore per Z-Code

di Roberto Grassi

Reform è un decompilatore — scritto da Ben Rudiak-Gould — per i file della Z-Machine; esso produce file di testo con una sintassi molto simile al codice sorgente di Inform. Supporta tutti i formati della Z-Machine (compresi quelli della versione 6 della Infocom) e può anche decompilare la porzione esclusivamente testuale dei file BLORB.

Vederlo all’opera è molto semplice.

Scaricatelo dal sito del programmatore (esistono le versioni per Windows e Linux1): http://www.darkweb.com/~benrg/if-decompilers/ e decomprimete il file zip2.

Nel caso più semplice di utilizzo non dovrete far altro che eseguire, a linea di comando:

reform storyfile.z5 > output-file

Ad esempio, usando il file .z5 di Little Falls ( Alessandro, perdonami! :D )

reform LittleFalls.z5 > LittleFalls.txt

Estratti del file:

PORZIONE INIZIALE

  
  ! "LittleFalls.z5", 155648 bytes
  ! Z-machine version 5, release 1, serial 050527
  !
  ! Decompiled by Reform release 6, serial 040226

  ! Grammar

  Verb 'origlia' 'osserva' 'spia'
      *                             -> LookIn
  ;

  Verb 'calcia'
      * noun                        -> Kick
  ;

  Verb 'slega'
      * noun                        -> Slega
  ;

  Verb 'esplora' 'indaga' 'investiga' 'perlustra' 'perquisis'
      * noun                        -> Search
  ;

PORZIONE CENTRALE


                .label55537;
                  if (global49 == 1[?]) {
                      ! no code
                  } else {
                      if (global46 & 2) {
                          routine54736(2 * (local2 + global50));
                      }
                      if (local9 == 3[Routine?]) {
                          local13 = 0;
                          local10 = 0;
                        .label55575;
                          if (local10 < global49) {
                              local13 = local13 + local5->(local10 + local6);
                              ++local10;
                              jump label55575;
                          }
                          routine53616(local13);
                          print ” “;
                          global239 = local7.list_together;
                          print (string) global239;
                          if (global46 & 8 ) {
                              print ” (”;
                          }
                          if (global46 & 2) {
                              print “:^”;
                          }
                      }
                      local13 = global46;
                      if (local9 ~= 3[Routine?]) {
                          global51 = 1[?];
                          global76 = local7;
                          global77 = local2 + global50;
                          if (routine51272(local7,25[Menu?]) == 1[?]) {
                              jump label55738;
                          }
                      }

PORZIONE FINALE

  
  ! 114312 (0x1be88): "La porta principale @`e chiusa. Sembra stata cambiata
             da poco. @`E come nuova."
  ! 114368 (0x1bec0): "Mmm... La porta dell'ingresso @`e socchiusa. ~Strano~,
             pensi. ~Un istante fa sembrava chiusa.~^"
  ! 114444 (0x1bf0c): "La porta principale @`e socchiusa.^"
  ! 114472 (0x1bf28): "Provi con una spallata, ma la porta @`e blindata.
             ^Ti rendi conto subito che @`e pressoch@'e impossibile sfondarla.^"
  ! 114556 (0x1bf7c): "Ti avvicini alla porta, inserendo le chiavi nella
             serratura, ma prima che tu riesca a chiudere la porta, senti
             una fitta sulla testa."
  ! 114648 (0x1bfd8): "^Qualcuno ti ha colpito con il calcio di una pistola.
             Cadi pesantemente a terra."
  ! 114708 (0x1c014): "^Una donna torreggia sopra di te con la tua Beretta
             in pugno.^"
  ! 114756 (0x1c044): "Una camera interna. Sembra uno studio."
  ! 114784 (0x1c060): "^@`E elegantemente arredato con un grande scrittoio
             e una libreria. Una finestra consente di vedere all'esterno. "
  ! 114864 (0x1c0b0): "^L'uscita @`e verso est, al salone.^"
  ! 114892 (0x1c0cc): "L'unica direzione in cui puoi muoverti @`e a est
           (verso l'ingresso). Oppure fuori dalla finestra... Ma non 
           riusciresti a passare attraverso le inferriate."
  ! 115004 (0x1c13c): ", collega lo studio con l'ingresso.^"

In sostanza, Reform può essere utile per andare ad analizzare un sorgente di un file per motivi di studio ed è senza dubbio uno dei migliori decompilatori per file Z-Code.


1 Per scrivere questo articolo ho usato la versione per Windows.

2 Nella distribuzione trovate un ottimo file reform.html che potrete usare come guida.