ECL Format: differenze tra le versioni

Da Zulu Hotel Italia - Time Warp.
(Usages - codice 01 00)
Riga 6: Riga 6:
 
* '''numeri a virgola mobile (float)''': i numeri a virgola mobile sono codificati sempre come 8 bytes (da chiarire in che formato, probabilmente 4 bytes base + 4 bytes esponente)
 
* '''numeri a virgola mobile (float)''': i numeri a virgola mobile sono codificati sempre come 8 bytes (da chiarire in che formato, probabilmente 4 bytes base + 4 bytes esponente)
  
=Struttura=
+
=Header=
Il file ECL sembra avere una struttura a blocchi. Di seguito sono elencati quelli noti, riportati nello stesso ordine in cui compariranno all'interno del file.
+
 
+
==Header==
+
 
L'header sembra essere fisso: 43 45 02 00 00 00, e sono i primi 6 bytes di ogni file.
 
L'header sembra essere fisso: 43 45 02 00 00 00, e sono i primi 6 bytes di ogni file.
  
Riga 15: Riga 12:
  
 
Il terzo byte ''probabilmente'' è il numero di versione (02 per POL093).
 
Il terzo byte ''probabilmente'' è il numero di versione (02 per POL093).
 +
 +
=Struttura=
 +
Successivamente all'header, il file ECL sembra avere una struttura a blocchi. Di seguito sono elencati quelli noti, riportati nello stesso ordine in cui compariranno all'interno del file.
 +
 +
Ciascun blocco inizia con 6 (2+4) bytes. Di questi 6 bytes, i primi 2 rappresentano il '''codice''' del blocco, mentre i successivi 4 rappresentano, sotto forma di intero, la lunghezza del blocco, in bytes, non conteggiando i 6 bytes dell'intestazione stessa.
 +
 +
Fa '''eccezione''' il codice 01 00 per cui la lunghezza viene indicata sempre come 0.
  
 
==Program - codice 04 00==
 
==Program - codice 04 00==
Riga 21: Riga 25:
 
Non è sempre presente: ad esempio, '''non''' è usato nello script generale di startup ''start.ecl''.
 
Non è sempre presente: ad esempio, '''non''' è usato nello script generale di startup ''start.ecl''.
  
I primi 6 bytes sono 04 00 10 00 00 00, segue un blocco di 13 bytes di cui solo il primo sembra essere usato ed indica il numero di argomenti accettati dal blocco program (01, 02, etc...).
+
I primi 6 bytes sono 04 00 - 10 00 00 00, seguono 16 bytes di cui solo il primo sembra essere usato ed indica il numero di argomenti accettati dal blocco program (01, 02, etc...).
  
Gli altri bytes sono lasciati a NULL.
+
Gli altri bytes sono sempre lasciati a NULL.
  
 
==Usages - codice 01 00==
 
==Usages - codice 01 00==

Versione delle 01:48, 23 feb 2015

Codifica dei tipi

All'interno del file, sono condificati dati di più tipi primitivi a cui si farà riferimento successivamente. Le codifiche finora individuate sono:

  • stringa a lunghezza fissa: La lunghezza è indicata preventivamente all'interno del blocco che ne fa uso o altrove. È rappresentata da un numero fisso di bytes, dove quelli non utilizzati sono impostati a NULL.
  • stringa a lunghezza variabile: Si tratta di un numero variabile di bytes stringa di cui l'ultimo è sempre NULL e rappresenta la fine della stringa stessa
  • numero intero: gli interi sono codificati sempre come 4 bytes, ordinati dal meno al più significativo (quindi invertiti, da un punto di vista algebrico). Sono sempre signed: il valore massimo per un intero è 0x7FFFFFFF, rappresentato come FF FF FF 7F. I valori negativi sono rappresentati partendo da FF FF FF FF che significa -1 e poi sottraendo la rappresentazione del valore come se fosse (intero - 1); ad esempio -255 è rappresentato come 01 FF FF FF.
  • numeri a virgola mobile (float): i numeri a virgola mobile sono codificati sempre come 8 bytes (da chiarire in che formato, probabilmente 4 bytes base + 4 bytes esponente)

Header

L'header sembra essere fisso: 43 45 02 00 00 00, e sono i primi 6 bytes di ogni file.

I primi due bytes rappresentano il magic number del formato ("CE").

Il terzo byte probabilmente è il numero di versione (02 per POL093).

Struttura

Successivamente all'header, il file ECL sembra avere una struttura a blocchi. Di seguito sono elencati quelli noti, riportati nello stesso ordine in cui compariranno all'interno del file.

Ciascun blocco inizia con 6 (2+4) bytes. Di questi 6 bytes, i primi 2 rappresentano il codice del blocco, mentre i successivi 4 rappresentano, sotto forma di intero, la lunghezza del blocco, in bytes, non conteggiando i 6 bytes dell'intestazione stessa.

Fa eccezione il codice 01 00 per cui la lunghezza viene indicata sempre come 0.

Program - codice 04 00

Questo blocco definisce la direttiva program.

Non è sempre presente: ad esempio, non è usato nello script generale di startup start.ecl.

I primi 6 bytes sono 04 00 - 10 00 00 00, seguono 16 bytes di cui solo il primo sembra essere usato ed indica il numero di argomenti accettati dal blocco program (01, 02, etc...).

Gli altri bytes sono sempre lasciati a NULL.

Usages - codice 01 00

I file .em contenenti le funzioni di sistema importati con la direttiva use sono specificate immediatamente dopo l'header. Ogni blocco use ha una dimensione variabile.

I primi 6 bytes sono 01 00 00 00 00 00, segue un blocco di 13 bytes così suddiviso:

  • bytes 1-9: contengono il nome dell'usage sotto forma di stringa a lunghezza fissa
  • byte 10: indica il numero di funzioni utilizzate da questo file
  • bytes 11-13: sempre NULL

Segue la lista delle funzioni utilizzate da questo file, sotto forma 34 bytes ripetuti per il numero di volte indicato dal byte 10. Di questi 34 bytes, i primi 33 rappresentano una stringa a lunghezza fissa contenente il nome della funzione, mentre l'ultimo byte indica il numero di parametri accettati dalla funzione stessa.

"basic" e "basicio" sembrano essere sempre i primi due usages e sono inclusi implicitamente, e ribaditi quindi nel file ECL, anche se non dichiarati nello script sorgente.

Fine Istruzioni -codice 00 0F

Il blocco di istruzioni sembra terminare sempre con 00 0F 20 00 00 00

Costanti - codice 03 00

In questo blocco, l'ultimo del file, sono contenute le costanti usate all'interno del file stesso.

L'inizio del blocco è indicato dai 6 bytes 03 00 XX XX XX XX: dove XX rappresenta la lunghezza del blocco, in formato intero: sembra sempre uguale all'intero indicato dai successivi 4 bytes + 4.

I successivi 4 bytes rappresentano un intero che indica il numero di bytes da cui è composta la sezione delle costanti + 1 (ovvero indica 1 per 0 bytes, 2 per 1 byte, etc...).

Ad esempio, un blocco costanti contenente 4 bytes di dati puri inizierà con: 03 00 - 09 00 00 00 - 05 00 00 00.

Possono essere presenti i seguenti tipi di dati:

  • stringhe a lunghezza variabile
  • interi
  • float