[zxspectrum] Re: Chrome VS Spectrum

  • From: Luca Bisti <lucbisti@xxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Mon, 06 Dec 2004 14:31:14 +0100

Ciao a tutti!

Vi chiedo immensamente scusa per non essere piu' intervenuto sull'argomento, sul quale mi sento direttamente coinvolto per ovvi motivi! :) Cerchero' di rimediare adesso anche se non posso commentare tutto come vorrei perche' sono di corsa.

Questo e' lo schema generale delle contese sui cicli di I/O e vale per gli Spectrum classici di filosofia Sinclair, ovvero 16/48K, 128K e +2; ovviamente nel caso del 48K vanno ignorate le parti che si riferiscono alle pagine RAM. Queste informazioni derivano dai nostri studi sulla ULA (e sono quindi quelle implementate in RealSpectrum), anche se suppongo che coincidano con quelle presenti nella FAQ.

La Z80 puo' subire una contesa in ciascuno dei 4 T-states che compongono il ciclo di I/O. Il "trucco" per capire cosa succede sta nell'osservare che la ULA sente un ciclo di I/O unicamente in base allo stato di /ULAIORQ che e' definito come /ULAIORQ = /Z80IORQ or A0. Insomma la ULA non sente affatto i vari segnali diretti di /MREQ e /IOREQ e questa semplificazione circuitale porta ad alcune conseguenze molto particolari. Ecco nel dettaglio cosa succede ciclo per ciclo.

CICLO DI INPUT:

T1 e T2: qui la ULA non ha ancora sentito che si tratta di un ciclo di I/O perche' /Z80IOREQ va giu' nella seconda meta' di T2 e quindi applica la contesa se A15,A14=01 e, attenzione, anche se semplicemente A14=1 (indipendentemente da A15) nel caso in cui la pagina RAM selezionata sia dispari (cioe' appartenga al pool conteso). Quest'ultima stranezza e' dovuta al fatto che la ULA riceve A15 ed A14 non dallo Z80 ma dalla PAL che si occupa della paginazione.

T3 e T4: viene nuovamente applicata una contesa se valgono ancora le condizioni di prima ma in piu' deve essere anche A0=1. Se stiamo facendo ad esempio una IN A,(0xFE) adesso finalmente la ULA sente /ULAIORQ attivo e quindi capisce che non si tratta di un tentativo di accesso in memoria (e quindi non contende piu').

CICLO DI OUTPUT:

Stesse regole di sopra, ma a T2 viene applicata la contesa anche se A0=0, cioe' stavolta alla ULA arriva prima l'attivazione di /ULAIORQ.

Ricordo che il pattern delle contese ha due zeri in fondo, quindi quando lo Z80 riparte dopo una contesa puo' eseguire per lo meno due cicli di clock indisturbato.

Come esempio di applicazione di queste regole vediamo in dettaglio il famigerato fenomeno della contesa della porta 0x7FFD, che ha un ruolo importantissimo nei demo: nella prima meta' di T1 viene applicata subito la contesa perche' A15/A14 valgono 01; al termine del ritardo lo Z80 riparte e completa T1 e T2 (la contesa di T2 non ha effetto perche' in quel punto il pattern prevede sicuramente un delay di 0 cicli di clock). A T3 scatta una nuova contesa (sicuramente di 6 cicli, per come e' fatto il pattern delle contese) perche' A15 e A14 valgono ancora 01 e inoltre /ULAIORQ non si e' attivato perche' l'indirizzo della porta e' dispari; al termine dei 6 t-states viene completato il ciclo di I/O con T3 e T4. In definitiva, quindi, la scrittura al registro di paginazione comporta ben due ritardi, di cui il secondo e' sicuramente della durata massima.

Esercizio per casa: disegnare il diagramma delle contese per una OUT alla porta 0x7FFC (vedere scroller in overscan di Song in Lines 4).

Se avete osservazioni o qualche dubbio chiedete pure, cerchero' di rispondere il prima possibile (non temete se ci dovessi mettere qualche giorno, leggo comunque tutto).

Luca.

PS: Tutto questo e molto altro nell'ormai mitologico documento di Ramsoft sulla ULA, prossimamente online in uno dei prossimi secoli... ;)


Other related posts: