[zxspectrum] Re: dimensioni schermo
- From: Alfonso Martone <a.martone@xxxxxxxxxxx>
- To: zxspectrum@xxxxxxxxxxxxx
- Date: Thu, 29 Jul 2004 22:04:58 +0200
Ho moltiplicato i frames per 50 perche'... ehm... da qui si vede chi
nasce informatico (come me) e chi nasce elettronico :-)
Assumendo che il clock da 3,5MHz dello Spectrum tiri fuori davvero
3.500.000 cicli al secondo (in natura i quarzi non saranno cosi'
rigorosamente precisi) volevo vedere perche' non riuscivo a
sincronizzare quel benedetto emulatore software.
Sullo Spectrum 48k il tracciamento di un frame video dovrebbe richiedere
in teoria 70000 cicli di clock (quindi tre milioni e mezzo di cicli al
secondo); al termine di ogni frame parte un interrupt (che quindi
comincia ad eseguire istruzioni durante l'inizio del tracciamento del
nuovo frame video; la ULA contenderebbe dunque la RAM solo durante il
tracciamento dell'area piu' interna da 256x192 pixels). La ULA continua
a generare autonomamente l'immagine, anche se un po' di pixel vengono
ignorati (le parti laterali piu' esterne per l'horizontal retrace, e
qualcosa delle scanline iniziali per il vertical retrace).
In realta' sul 48k il frame dura solo 68988 cicli (otto pixel ogni
quattro cicli di clock, perche' la ULA genera 448x312 pixel totali),
cioe' lo Spectrum traccia i frame video ad un po' piu' di 50Hz:
sarebbero circa 50,73 Hz, ma siamo appena sotto l'1,5% di tolleranza...
Tutto questo sempre assumendo che il quarzo del 48k sia assolutamente
preciso nei suoi tre milioni e mezzo di cicli al secondo; eventuali
differenze andrebbero ad aumentare quell'1,5% (se il clock e' piu'
veloce) oppure a diminuirlo (se il clock e' piu' lento). Ci vorrebbe
infatti un clock da 68988*50 = 3.449.400 Hz per generare con quel
formato frame esattamente 50 Hz (il problema finale e' comunque solo
del televisore o del monitor; i demo andranno benissimo perche' il
tempo lo misurano su "quanti cicli di clock sono passati", non su "a
quanti Hz vengono generati i frame video").
Sullo Spectrum 128k e successivi ci sono 3.546.900 cicli al secondo
(sempre assumendo un clock rigoroso) contro 3.545.400 cicli richiesti
per generare 50 frame (parlo dello schermo a 311 scanline), ognuno in
70908 cicli di clock. Dunque il frame rate finale sara' assai piu'
preciso del 48k, perche' 3546900/70908 = 50,021 Hz.
Sul Chrome il clock e' da 3,58 MHz (la meta' di 7.160.000 Hz, esatto?),
e per questo potresti essere tentato di generare i frame un pochino
piu' grandi. Tracciando il frame in stile "128k/+2/+3" (311 scanlines,
ossia 70908 cicli) ottieni 3580000/70908 = 50,4879 Hz, che e' poco
sotto l'uno per cento di tolleranza del televisore (e comunque meglio
dello Spectrum 48k originale).
Con 312 scanlines anziche' 311 (tua possibile "licenza poetica" sul
formato video del Chrome; infatti in realta' solo il 48k della Sinclair
generava 312 scanline) i pixel di un frame, border compreso, sarebbero
456*312=142272, che richiedono 71136 cicli per frame, ossia 3556800
cicli per 50 frame: 50,3261 Hz; non e' il rigore dei 128k ma e'
comunque un certo miglioramento rispetto ai 50,48 Hz di cui sopra.
Infatti per andare vicino ai 50 Hz occorrerebbe generare non 311 o 312
scanlines, ma frame da circa 3580000/50 = 71600 cicli di clock, ossia
da 314 scanline!! In questo caso, al prezzo di un impercettibile
spostamento verso l'alto nel TV dell'area grafica 256x192, avresti
71592 cicli per frame, cioe' 50,00558 Hz, meglio degli stessi Spectrum
128/+2/+3... Ma io ovviamente non lo consiglio.
Tutte queste considerazioni di oggi mi hanno fatto capire varie cose:
1) anche ammettendo di avere un clock assolutamente esatto, generare
un'immagine video a 50 Hz precisi e' un'impresa alquanto ardua perche'
bisognerebbe farla rientrare in x/50 cicli di clock (con x = frequenza
del quarzo); e' assolutamente normale che il TV si "beva" poco piu' o
poco meno dei canonici 50 frame al secondo, e non ci sono altre
controindicazioni. Al contrario, nello scrivere un emulatore software,
il problema e' di sincronizzare al tempo reale la macchina virtuale
(che puo' comodamente seguire in modo rigoroso il numero esatto di
cicli di clock);
2) nel peggiore dei casi (lo Spectrum 48k reale) siamo a 50,73 Hz, che
e' poco meno dell'1,5% di tolleranza. Grazie alla buona combinazione di
dimensioni del frame video e velocita' del quarzo dei vari 128k/+2/etc,
la generazione dei frame e' assai piu' precisa (50,02 Hz);
3) tutto questo significa che degli ipotetici demo che tengono conto
della lunghezza esatta del frame video (anche se aspettano con HALT
l'inizio del frame successivo per risincronizzarsi), se sono fatti per
il 48k allora non gireranno bene sul 128k, e se sono fatti secondo le
temporizzazioni del 128k non gireranno bene sul 48k; i due computer
hanno frame video di lunghezza diversa (nel primo caso si aspettano un
frame video lungo 68988 cicli con scanline larghe 448 pixel, nel
secondo si aspettano un frame video di 70908 cicli con scanline larghe
456 pixel); questo ragionamento e' indipendente dai clock di sistema;
4) per essere perfettamente compatibile coi demo 128/+2/+3 il Chrome
dovrebbe generare frame video da 70908 cicli; in questo modo i demo
gireranno un po' piu' veloci (lo 0,933% in piu') a causa del clock di
sistema da 3,58 MHz, ma resteranno rigorosamente allineati al frame
video (anche se questo arriva al TV un filino piu' frequentemente);
5) se il Chrome generasse frame da 456x312 (o da 456x313 o da 456x314)
anziche' da 456x311, il tracciamento del frame video richiederebbe
centinaia di cicli di clock in piu' anziche' i "canonici" 70908; per i
programmi che aspettano con HALT non c'e' differenza, ma per chi conta
esattamente su quei 70908 allora sballa tutto; data l'ampia tolleranza
dei TV e monitor, direi che si puo' lasciar perdere questa ipotesi;
6) per l'emulazione perfetta dei frame 48k e 128/+2/+3 occorrerebbe
purtroppo implementare entrambe le logiche video: quella 448x312 dello
Spectrum originale e quella 456x311 dei successori (se proprio sul
Chrome ci dovra' essere per forza un secondo PLD, allora... no, eh? :-)
Nel caso peggiore, cioe' del 48k con un clock da 3,58 MHz (il Chrome in
modalita' 48k, insomma) avremmo certamente l'immagine video generata
come ULA Ferranti comanda, ma con 3580000/68988 = 51,893 Hz sul TV;
ricordo vagamente di aver sentito da qualche parte che monitor
"compositi" e TV si bevevano fino a 52-53Hz (ossia 6% di tolleranza) ma
non posso giurarlo;
7) l'audio che si sente sul beeper e' generato "man mano" (non come sui
nostri PC dove prepari un blocco dati e poi lo passi in pasto alla
scheda sonora, la quale provvede a fare l'output a velocita' esatta a
44.5 KHz o 48 KHz o che altro, e tu devi avere un altro blocco pronto
non appena questa dice che ha finito, e potrebbe finire non proprio
quando te lo aspetti... per questo funziona ad interrupts). Quindi
avere uno Spectrum 48k con un clock da 3,58 MHz (il Chrome in modo 48k)
significa che le frequenze in uscita sul ronzatore saranno il 2,28%
piu' alte. Penso che all'orecchio non sara' facile distinguere un
Chrome in modo 48k da uno Spectrum originale. Il guaio e' certamente di
chi scrive un emulatore perche' deve "ridistribuire" su 44.5 KHz o 48
KHz l'uscita audio "raccolta man mano"... questo puo' essere facile se
si fa "a posteriori", ma e' una cosa complicata farlo "in tempo reale";
l'ideale sarebbe una scheda sonora programmabile con decente precisione
tra i 300 e i 400 KHz in uscita, perche' cosi' ad ogni bit sul beeper
(che richiede non meno di 11 cicli di clock per una OUT sulla porta
giusta: per questo ho detto 300-400 KHz, circa un decimo del clock
originale) corrisponderebbe un byte in uscita sulla scheda sonora del
PC (sto sprecando un byte quando il ronzatore piezoelettrico e' di un
solo bit, ma questo e' un altro discorso);
8) l'audio dell'AY, da quel che mi e' dato di capire, pure dipende dal
clock di sistema, e quindi un AY sul Chrome/48k genererebbe al nostro
orecchio frequenze il 2,28% piu' alte di quelle che i programmatori, e
sul Chrome/128k genererebbe al nostro orecchio frequenze del 0,933%
piu' alte; stesso ragionamento che per il beeper: e' arduo emulare a
software la macchina reale, ed il Chrome sara' solo un filino piu'
veloce. Sarebbe invece un bel guaio se l'AY avesse delle sue
temporizzazioni autonome (come invece le nostre adorate schede audio
dei PC). Suppongo che anche il piu' isterico dei programmatori conceda
almeno l'1% di tolleranza quando si tratta di aspettare un chip... :-)
9) video e audio sono i punti su cui piu' ci accorgeremmo che qualcosa
non quadra (un pixel di troppo o un "click-click" durante l'output
audio sono assai fastidiosi); lo stesso discorso si propaga alle altre
periferiche, su cui l'uno o due per cento in piu' di velocita' puo'
essere niente (attesa di un settore da microdrive) o molto (attesa di
una condizione di "ready").
Mi spiego: immagina un driver di una periferica che ha un suo clock
autonomo; il programmatore sa che dopo la OUT sulla porta, prima di
leggere il risultato e dare un nuovo comando, deve aspettare due
millisecondi esatti: sul 48k della Sinclair sono 7000 cicli di clock,
dunque il baldo programmatore scrive un ciclo a vuoto che spreca 7057
cicli a suon di NOP, va a rileggere la porta e trova ancora la
periferica "busy" (infatti non erano passati 2msec, perche' ai 3,58 MHz
del Chrome, in due millisecondi c'entrano 7160 cicli! e 103 cicli a
3,58 MHz fanno ben 0,028msec)... allora lui, tutto obbediente alle
specifiche del suo hardware paranoico, aspetta di nuovo altri 7057
cicli di clock (o addirittura lanciare un nuovo comando che non verra'
eseguito perche' e' ancora in fase di completamento il precedente), e
alla fine trova finalmente "ready", avendoci pero' impiegato quasi il
doppio del tempo! Subito creera' un sito per dichiarare a tutto il
mondo che il Chrome e' lento e incompatibile, convochera' conferenze
stampa, apparira' in TV la sera del 31 dicembre alle 23:00 per un
messaggio a reti unificate per denigrare il Chrome, intentera' causa a
chiunque dice che era colpa sua che non aveva aspettato un centinaio di
cicli di clock in piu'... :-)
Ah, in tutto questo non ho parlato della memoria contesa (per la mia
ignoranza e confusione in materia) sulla quale certamente qualche demo
va a bruciare deliberatamente cicli di clock... :-)
N.B.: potrei rinnegare parte di quanto ho detto qui nel caso qualcuno
dimostrasse che ho sbagliato a considerare il frame del 48k di 448x312,
il frame del 128k/+2/+2A/+3 di 456x311, etc.
- Follow-Ups:
- [zxspectrum] Re: dimensioni schermo
- From: Mario Prato
- References:
- [zxspectrum] dimensioni schermo
- From: Alfonso Martone
- [zxspectrum] Re: dimensioni schermo
- From: Mario Prato
Other related posts:
- » [zxspectrum] dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- » [zxspectrum] Re: dimensioni schermo
- [zxspectrum] Re: dimensioni schermo
- From: Mario Prato
- [zxspectrum] dimensioni schermo
- From: Alfonso Martone
- [zxspectrum] Re: dimensioni schermo
- From: Mario Prato