[zxspectrum] Re: dimensioni schermo

  • From: Alfonso Martone <a.martone@xxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Sat, 31 Jul 2004 15:52:10 +0200

Ed ecco le previste rettifiche... (sigh!)

Se il quarzo del Chrome e' 14.3 MHz allora devo dedurre che la velocita' 
sara' 3.575 MHz anziche' 3.58 MHz come avevo scritto io.

Tragicamente FBZX fa passare solo 13488 T-states prima di tracciare il 
primo dei 256x192 pixel a video (solo 60 scanline piu' 96 pixel); 
questo lo posso correggere ma resto sempre con un'approssimazione 
perche' li' l'unita' di misura per il video sono "otto pixel in quattro 
T-states".

Ehm... anche se io non fossi tifoso dei Ramsoft, mi fiderei piu' delle 
loro misurazioni "sul campo" che dei calcoli altrui.

Infatti i 14336 T-states tanto famosi delle FAQ ufficiali sono 64 
scanline (ossia vertical retrace, e la parte visibile piu' alta dello 
schermo). Ma poi c'e' il bordo della sessantacinquesima (prima che la 
ULA abbia bisogno di leggere il primo byte video), bordo che io avevo 
erroneamente calcolato in 64 pixels e stabilito uguale per entrambi i 
lati del video (cioe' 32 T-states ognuno), e quindi con quello potevo 
arrivare a 14368 T-states. Se Ramsoft dice 14347 (cioe' 14336+11) posso 
dedurre che il bordo sinistro parte dopo 22 pixel (anziche' i miei 64).

Riassumo:

mia tabella originale:
448x312 con un bordo di 96 pixel a sx, 96 a dx, 60 su, 60 giu' (immagine 
teoricamente centrata; in realta' il vertical retrace succhia un po' di 
tempo e quindi alcune scanline delle prime 60, per giunta con l'ultima 
che non e' intera, non sarebbero da conteggiare come tali!!). E dire 
che mi era venuto, il dubbio... conoscere la durata dei retrace 
verticale e orizzontale avrebbe aiutato a non prendere la cantonata;

versione Ramsoft (cioe'quella giusta) della generazione del frame video:
* parte l'interrupt
* la ULA genera 64 scanline (durante le prime c'e' il vertical retrace)
* 22 pixel di bordo a sinistra (in realta' era gia' iniziato il bordo!),
  256 pixel della scanline grafica,
  170 pixel di bordo a destra,
  ripetere per 192 volte
* 56 scanline sotto; totale: 312 scanline da 448 pixel, in 69888 Tstates

Cosi' descritta, l'immagine sembrerebbe spostata assai a sinistra e un 
pelino piu' in basso; in realta' questo e' dovuto al vertical retrace, 
che "occupa" circa poco piu' di tre scanline di tempo, cioe' 1418 
pixel, ossia 709 cicli di clock, ovvero 0,2027 millisecondi (!!). 
Quindi non e' che l'estrema sinistra del frame video sia sincronizzata 
con l'interrupt...

Fra parentesi il centraggio della scanline non poteva essere esattamente 
di 96 pixel a sinistra e 96 a destra, perche' sulla destra c'e' la 
pausa dell'horizontal retrace, e quindi per centrare perfettamente 
l'immagine occorrerebbe dare qualche pixel in piu' al bordo destro a 
scapito del sinistro. Per fortuna non c'e' bisogno di fare sul TV o sul 
monitor il centraggio perfetto al pixel...!

Purtroppo ho problemi a far girare Aquaplane nel mio emulatore, dovro' 
modificare l'FBZX originale per verificare queste ipotesi (c'e' da dire 
che FBZX, cosi' com'e', tiene il bordo di Aquaplane parecchi pixel piu' 
su, assai piu' di quelle fatidiche quattro scanline...!)

Rifacendo lo stesso ragionamento per il 128k,  con 14368 T-states per la 
prima lettura, otterremmo:
* parte l'interrupt
* la ULA genera 63 scanline (durante le prime c'e' il vertical retrace)
* 8 pixel di bordo a sinistra (in realta' era gia' iniziato il bordo!),
  256 pixel della scanline grafica,
  192 pixel di bordo a destra,
  ripetere per 192 volte
* 56 scanline sotto; totale: 311 scanline da 456 pixel, in 70908 Tstates

Le dimensioni curiose del bordo destro mi suggeriscono che per tracciare 
un frame video occorre aspettare davvero il vertical retrace. Cioe', 
quando "parte l'interrupt", aspettare un po' di tempo prima di 
tracciare (per evitare di avere la sinistra del border larga solo otto 
pixel!!)

Per "normalizzare" le tabelle allora suggerirei:

48k (frame: 448x312)
* pausa iniziale di 74 pixel (37 T-states)
* tracciare 311 scanline da 448 pixel con 96+96 pixel ai bordi
* tracciare l'ultima scanline di 448-74=374 pixel
* totale: 69888 t-states; puo' partire l'interrupt successivo

128k (frame: 456x311)
* pausa iniziale di 92 pixel (46 T-states)
* tracciare 310 scanline da 456 pixel con 100+100 pixel ai bordi
* tracciare l'ultima scanline di 456-92=364 pixel
* totale: 70908 t-states; puo' partire l'interrupt successivo

alf


Other related posts: