[zxspectrum] Re: Perche` non turbo con decompressore Huffman?

  • From: Paolo Ferraris <pieffe8@xxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Wed, 20 Feb 2013 21:25:24 -0800

On 2/20/2013 12:14 PM, Stefano Donati wrote:
Ciao Antonio,

il WAV di Jet Set Willy X lo trovi alla pagina dedicata http://ronja.twibright.com/jswx.php. Il loader implementa "solo" la codifica Manchester inversa che, stando a quanto scritto nei sorgenti, raggiunge i 16000 baud.
Il mio prototipo invece non l'ho ancora pubblicato... :(

16000 bauds sono davvero tanti, ma per questa velocita` hai bisogno di un file wav da almeno 64000 campioni/sec. (Il file wav presente sul sito e` a 96000 campioni/secondo.)
Per i CD la velocita` massima probabilmente e` 11025 bauds.

La parte "positiva" della velocita` da CD e` pero` che ci sono piu` di 100 cicli di CPU persi dall'algoritmo, che sembrano sufficienti per la decompressione Huffman. Secondo dei miei calcoli approssimativi, 320 kbit (40kbytes) a 16000 bauds richiedono 20 secondi. Con la compressione i 320 kbit diventano ~200kbit, che a 11025 bauds sono 18 secondi!

(Se poi si riuscisse a usare 4 simboli, anche se due piu` lenti, si potrebbero ottenere 12.7 secondi... sogno?)



By looking at the loader code getting faster than 16000 bauds seems not easy: there're very few CPU cycles left in the argorithm. But at the CD speed of 11025 bauds there are more than 100 cy



Stefano.

Il giorno 20/feb/2013, alle ore 14:58, "Antonio S." <schianto9001@xxxxxxxxx <mailto:schianto9001@xxxxxxxxx>> ha scritto:

Il giorno 20 febbraio 2013 09:24, Paolo Ferraris <pieffe8@xxxxxxxxx <mailto:pieffe8@xxxxxxxxx>> ha scritto:

    On 2/19/2013 10:50 AM, Paolo Ferraris wrote:

        On 2/19/2013 12:20 AM, Stefano Bodrato wrote:

            A questa velocità lo spazio di manovra per fare altro con
            la CPU diventa veramente poco (Paolo non me ne voglia se
            rimango di questa idea).


        Non conoscendo l'algoritmo di decompressione dell'ultracargas
        non lo so di sicuro. L'algoritmo huffman che ho visto
        richiede un centinaio di cicli extra per bit, quindi potrebbe
        ancora andare bene.


    Tra l'altro la risposta l'ha gia` data Stefano Donati: non solo
    hanno implementato un turbo che richiede 4 campioni per bit (non
    solo per lo 0 ma anche per l'1, grazie al manchester inverse
    coding) ma con decompressione huffman al volo. Il file wav che
    hanno distribuito in lista per jswx e` circa 26 secondi, circo lo
    stesso tempo che l'ultracargas usa per manic miner, tranne che la
    quantita` di dati in jswx e` di 40k invece dei 32 di manic miner.

C'è un tzx o wav da qualche parte per dargli un'occhiata? Sembra molto interessante.

    L'unico modo che vedo per aumentare ulteriormente la velocita` e`
    usare anche segnali piu` lunghi (non solo 4 campioni, ma anche 8
    campioni). Si potrebbe ridurre il tempo di caricamento di circa
    il 33%.


Non so, da verificare numeri e codice alla mano. Il fatto è che il sampling loop non è precisissimo, specie in presenza di accessi a memoria contesa. Nell'ultima versione ho dovuto mettere lo stack in memoria alta perché le temporizzazioni sballavano di brutto. Purtroppo anche la porta I/O 254 è contesa e quindi il campionamento è intrinsecamente impreciso, il che non consente di diminuire troppo l'intervallo fra i simboli.

Intanto ho ritrovato il cavo video e ho fatto un paio di test sul mio +2 (collegato al portatile via un adattatore con finta cassetta). Inaspettatamente, ottengo risultati migliori con le onde quadre - ma forse la tua osservazione sulla componente continua giustifica questa cosa. Non sono riuscito a caricare il Ghost&Goblins super veloce in nessun modo: non mi prende neanche il loader iniziale.

Una stranezza: sul +2 riesco a caricare un wave che Fuse non legge, cosa che non ritenevo possibile. Deve esserci qualche bug nell'emulazione... Infine ho cambiato leggermente la routine di compressione in maniera da tenere conto del costo effettivo (in tempo) della trasmissione dei bit, che appunto varia a secondo del numero di bit a 1 trasmessi; così facendo si risparmiano altri 2 secondi :-)

Ciao

A.
<Manic_o.wav.bz2>


Other related posts: