[zxspectrum] Re: Ula+

  • From: Luca Bisti <lucbisti@xxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Mon, 28 Mar 2011 21:37:31 +0200

Il 27/03/2011 22.32, Alessandro ha scritto:
On Sun, 2011-03-27 at 21:37 +0200, Alessandro Dorigatti wrote:

Eh... benvenuto nel club... :-)

Allora ulatest3 in pratica dovrebbe visualizzare alcuni elementi:

1) Valori del bus video effettuando una IN su porta dispari =>  test del
floating bus
2) Evidenziare quali sono i T-State "contesi" a livello di accesso ai
primi 16K di RAM o a livello di richiesta di I/O su porta pari.

Nel mio caso si pianta dopo aver visualizzato la barra colorata in alto
e il numero di T-State "14329".
Faccio fatica a dire il momento in cui si pianta, perche' si resetta
proprio. La barra la vedo.

In base a quanto ricordo, ma Luca Bisti potrebbe essere molto piu'
accurato, si tratta di leggere delle porte I/O in momenti chiave.
Potrebbe essere che i cloni rispondano con un valore imprevisto, che
manda in crash il programma.
E' esattamente così. L'aspetto critico per avere una misura affidabile è la tecnica che si usa per assicurarsi una base dei tempi stabile per la conta dei cicli di clock trascorsi dall'interrupt. Bisogna fare in modo che l'interrupt venga accettato sempre allo stesso ciclo macchina di una determinata istruzione a fine quadro. In genere, infatti, l'istante di accettazione di un INT è soggetto a un certo jitter a seconda dell'istruzione in esecuzione durante l'attivazione del segnale.

Ora: è da capire come in tutti e tre i casi viene stabilito che sono
passati "x" T-State. Personalmente non ho abbastanza esperienza in
ambito linguaggio macchina Z80 per dare una risposta.
Non basta l'esperienza in ambito Z80, ce ne vuole in ambito ULA perche'
quando si verifica un 'contenzioso' :-) il comportamento e' alquanto
bizzarro.
Non ho mai studiato "ulatest3" (potrei anche farlo, se mi dite che vi interessa), ma ti posso dire come funziona il mio "floatspy" sotto questo aspetto: per stabilizzare il riferimento temporale di cui dicevo sopra, la routine effettua preliminarmente una serie di accessi in memoria contesa. La contesa della ULA, infatti, risulta utilissima in questo caso proprio perché allinea l'esecuzione di determinate istruzioni a ben precisi boundaries multipli di 8 T-states. Effettuando ripetutamente una serie di questi accessi congegnati in modo opportuno si ottiene l'effetto di "incastrare" forzatamente l'esecuzione di una certa istruzione ad un ben preciso T-state ogni volta.

Luca

Other related posts: