{{htmlmetatags>metatag-robots=() metatag-title=(MSC1: specifiche) metatag-keywords=(MSC1,MIDRES,Commodore 64,Commodore VIC20,Commodore PLUS/4,Commodore 128,Atari) metatag-description=(Questa specifica è destinata agli sviluppatori che desiderano produrre stream di dati compressi compatibili con MSC1 utilizzando qualsiasi linguaggio di programmazione.) metatag-media-og:image=(::msc1.png) metatag-og:title=(MSC1: specifiche) metatag-og:description=(Questa specifica è destinata agli sviluppatori che desiderano produrre stream di dati compressi compatibili con MSC1 utilizzando qualsiasi linguaggio di programmazione.) }} ====== DESCRIZIONE STREAM MSC1 ====== {{ :msc1-msc1-stream.png?nolink |}} MSC1 è un compressore progettato specificamente per comprimere schermate testuali e a colori di computer a 8 bit. Ha la caratteristica di poter comprimere in modo efficiente piccole aree di memoria (fino a 1024 byte). Questa specifica è destinata agli sviluppatori che desiderano produrre stream di dati compressi compatibili con MSC1 utilizzando qualsiasi linguaggio di programmazione. **NOTA BENE: questo documento descrive solo il formato del blocco, non come funzionano effettivamente il compressore né il decompressore.** La correttezza del decompressore non dovrebbe dipendere dai dettagli di implementazione del compressore e viceversa. ===== DATA STREAM COMPRESSO ===== {{ :msc1-MSC1-blocks.png?nolink |}} Un flusso di dati compresso con MSC1 è composto da uno o più "blocchi". Un blocco può essere alternativamente: * un blocco di dati "letterali"; * un blocco di duplicazione ("dupes"). L'ultimo blocco deve essere il blocco di "fine flusso". {{ :msc1-MSC1-CTR.png?nolink |}} Ogni blocco inizia con un token di controllo ("CTR"). Il token è un valore di un byte e gestito a livello di bit. Il primo bit definisce se il blocco è "letterale" (''0'') o "duplicazione" (''1''). Il resto del layout dei bit cambia il significato in base a questo primo bit. La fine del blocco del flusso è speciale poiché ha l'intero token di controllo a zero (''00000000''). La decodifica di qualsiasi blocco si conclude alla fine del blocco corrente. Il byte successivo sarà l'inizio di un altro blocco. ==== BLOCCO "LETTERALE" ==== {{ :msc1-literal-blocks.png?nolink |}} Se il CTR definisce il blocco come "letterale", il token contiene anche il conteggio dei caratteri nei 7 bit inferiori. Quindi, a seguire il CTR si trovano i caratteri stessi, da 1 a 127. Sono esattamente tanti quanto ne indica il campo ''count''. **Non è possibile avere zero letterali** poiché il CTR sarebbe uguale a quello che indica il blocco "END OF STREAM". Ad esempio, i seguenti byte definiscono un letterale di 4 lettere ("CIAO"): 0x04, C, I, A, O ==== BLOCCHI "DUPLICAZIONE" ==== {{ :msc1-dupes-block.png?nolink |}} Se il CTR definisce un blocco come "duplicazione", il token conterrà: * un campo ''count'', come il campo nei bit 6-2 (5 bit); * un campo ''offset'' (bit alti), come parte bassa del CTR (2 bit). Il byte successivo conterrà i bit bassi del campo ''offset'' (8 bit). Quando si incontra un BLOCCO "DUPLICAZIONE", il decoder deve copiare 4 byte dall'indirizzo attuale della memoria di origine meno ''offset'' per ''count'' volte. Iniziamo a valutare l' ''offset'': questo è un valore a 10 bit (posizione 0 ... 1024) e rappresenta la posizione da cui iniziare per copiare. 0 significa "posizione iniziale". Il valore di offset massimo è 1024. Ad esempio, i seguenti byte definiscono una ripetizione della stringa "CIAO" per 4 volte: 0x04, C, I, A, O, 0x90, 0x06, ... |<------ 0x06 bytes-----| ==== BLOCCO "FINE DEL FLUSSO" ==== Se il CTR definisce una "fine del flusso" (un byte di valore ''0x00''), non vi sono altri dati. \adsense\ ===== REGOLE SPECIFICHE ===== Esistono regole specifiche per generare blocchi di flusso compresso. * **L'ultimo blocco DEVE essere la FINE DEL FLUSSO**. Il flusso di dati termina subito dopo. * **Se l'input è inferiore a 5 byte, vi sarà solo un blocco ** e conterrà l'intero input come letterali. * **Un input vuoto può essere rappresentato con un singolo END OF STREAM**, interpretato come un blocco finale senza letterale aggiuntivo e senza doppioni aggiuntivi. * **Se un BLOCCO DUPLICAZIONE ha un conteggio pari a zero (0)** allora è uguale a un conteggio di 32. * **I flussi inferiori a 8 byte non possono essere compressi**. Queste regole sono state aggiunte per garantire che un decodificatore conforme possa essere progettato per la velocità, emettendo istruzioni speculative, senza mai leggere o scrivere oltre i buffer di I/O forniti. ===== NOTE ===== Il formato non presuppone né limita il modo in cui il compressore cerca e seleziona le corrispondenze all'interno del blocco dati sorgente. Possono essere prese in considerazione più tecniche, caratterizzate da distinti compromessi tempo/prestazione. Fintanto che il formato è rispettato, il risultato sarà compatibile e decodificabile da qualsiasi decoder conforme. ===== SORGENTI ===== ===== IMPLEMENTATION EXAMPLES ===== ==== C language ==== Si veda: * [[https://github.com/spotlessmind1975/midres/blob/master/src/midres_memory_008.c|midres_memory_008.c]] per una implementazione di un decompressore in memoria; * [[https://github.com/spotlessmind1975/midres/blob/master/src/midres_memory_007.c|midres_memory_007.c]] per una implementazione basata sui file. ===== POWERED BY ===== [[:it:midres_library|{{ :midres-logo.png?nolink&600 |}}]]