2024/07/16

PAL videószabvány

 Már hetek óta tanulmányozom a Bibliát is PAL nevű televíziós szabvány előírásait, de leginkább a szinkronjeleket, hogy hogy kell azokat kezelni. Le is írom, hogy mit értek ezalatt.

A Földön 3 nagy televíziós szabvány van, amik meghatározzák, hogy milyen módon kerüljék közvetítésre a TV-adás. Van a legnépszerűbb szabvány, a PAL (meg ennek változatai, Magyarországon a B és G található meg), van a leginkább Amerikában és Nyugat-Ázsiában használt NTSC, és van a franica SECAM. E posztban a PAL-ra fókuszálok.

A képcsöves TV-k a képet úgy jelenítették meg, hogy a V A S K O S üveg belső felére foszfort kentek. Ez a foszfor ha elektronnal érintkezik, fényt bocsát ki. Innen már egyértelműbb a módszer: egy elektronsugarat bocsátanak a képernyőre, ezáltal egy pont jelenik meg, optimális esetben középen. Azonban ezzel még nem nagyon lehet Való Világot nézni. A sugarat el is kell téríteni ahhoz, hogy más pontra is tudjon rajzolni. Ezt két elektromágnes (innentől eltérítőkként hivatkozva) végzi, egy a vízszintes, és egy a függőleges irányban. Ezen a ponton már meg lehet jeleníteni a képet, viszont csak egy fehér képpel se lehet sokra menni, így a világosságot is irányítani kell. Ezzel már lehet fekete-fehér képet csinálni.

A PAL szabvány szerint az elektronsugarat balról jobbra kell téríteni, majd a sor végén eggyel lentebb a kép másik szélétől. Itt jön képbe a sor fogalma. Egy teljes PAL képkocka 625 sorból áll, azonban ezek össze vannak "fésűlve"; először a kép egyik fele kerül kirajzolásra váltott soronként, majd utána a másik fázisban, ígye (minket most csak a bal felső ábra érdekel). Ebből következik, hogy egy "valódi" képkocka 312,5 sorból áll. Igen, az egyik sor a két félkép között meg van felezve, így könnyebb a függőleges eltérítőt üzemeltetni. Ezt mutatja az előző kép alsó és felső része, ahol az alsó rész mutatja azt, hogy milyen feszültség-idő függvénye lenne a függőleges eltérítőnek. Nyilvánvalóan a felső részen bemutatott konfigurációt egyszerűbb előállítani.

A teljes PAL (és egyébként a SECAM is) képkockák 25Hz-cel rajzolódnak ki, viszont sávszélességet lehet megtakarítani, ha a két félkép eltérő rajzolatot tartalmaz, ilyenkor 50Hz-et kapunk.

A sorszámból (625) és teljesképfrekvenciából (25Hz) ki lehet számolni, hogy a sorok 15.625Hz-enként rajzolódnak ki, ennek reciproka (64μsec; 0,000064sec) egy sor idejét mutatja.

Ezekből már majdnem össze lehetnek rakni egy fekete-fehér képet a videojel segítségével, viszont még az adó és a TV nem biztos, hogy egymással szinkronban van, vagyis nem ugyanazt a képpontot rajzolják egyszerre. Ez eltolódást okoz. Ezért szinkronjeleket kell használni.

A szinkronjelek biztosítják, hogy az adó és a TV ugyanazt a dolgot rajzolják. Mivel ezek a jelek akkor jönnek elő, mikor az elektronsugár nem aktív, ezért egy kábelre lehet a világosságjellel helyezni, így a világosságjel két szerepet is kap.

Szinktronizálni szokás a képkockát és a sorokat. Ezek alapján megnevezhetünk képszinkronjelet és sorszinkronjelet, de van még egy harmadik is, ami egyáltalán nem szembetűnő. A szinkronjelek mindig az előtt a jelenség előtt aktívak, amiért felelősek.

A sorszinkronjel 4,7μsec, a képszinkronjel pedig 160μsec hosszú. Elméletben a videojel így nézne ki: (X: idő, Y: feszültség, a négyzetek tetején lenne a látható információ)

Viszont az a helyzet, hogy a 4,7μsec mellett még van még több nem látható rész, ami összesen 12μsec hosszú. Így egy soradat 52μsec látható, és 12μsec nem látható képet tartalmaz. Így erre módosul a videojelünk:

Persze még nincs vége. Azt pontosan nem tudom, miért, de a sorszinkronjelnek az egész képkockaadatban megtalálhatónak kell lennie. Ez azt jelenti, hogy a képszinkronjelbe IS kell sorszinkronjel, viszont itt kétszer sűrűbben.
(a képen kivettem a 160μ jelölést)

Ááááájj, ez még most se minden. Mivel az egyik sor félbe van vágva, ezért ha mindkét felét egy teljes sorként kezelnénk, akkor a kép még így is kiesne a szinkronból. Ezt segítik elő a kiegyenlítőjelek. Ezek a képszinkron előtt és után találhatóak, és félképenként más mennyiségben:
    ¤1. félképen: 6 elő, 5 utó
    ¤2. félképen: 5 elő, 4 utó.
A két kiegyenlítőjelsor egyébként a képszinkronjel inverze, ezért mind a 3 csoportot egy astabil időzítővel meg lehet oldani, mutatom egymáshoz arányosan (a kiegyenlítőjeleket megszámoztam, 1. félkép):

(hiba van a képen, a képszinkronjelbe még egy sorszinkronjel kéne).

Még azt kéne tudni, hogy a sorszinkronjel PONTOSAN hogy néz ki a sorok közti készenléti állaptban.

Ezen megjelöltem azokat a szinteket is, ami látható kép esetén milyen színt rajzol ki. Nem összetéveszteni a rasszista hierarchiára, ahol az alsóbbak az aljanép, csúnya dolog!
Először az 1,5μsec várakozásra azért van szükség, mert a képtartalom végén a feszültség nem azonnal ugrik le a szinkronjel szintjére (-0,3V), így a sor végfeszültségétől függően máskor és máskor lenne szinkronjel. Ez a késleltetés "megvárja", hogy a feszültség biztos lesüllyedjen a feketeszintre. A fennmaradt 5,8μsec meg ennek a szinkronjelből feketeszinte történő esete.

Ezt most mind fejből írtam. Források, amiket mindenképp érdemes elolvasni, mert lényegesen több infót tartalmznak, ha ez még nem lenne elég:
Centroszet Nkft. anyaga
Még pár infó innen

2024/07/09

Játékkonzolom memóriatérképe

Tudom, azt mondtam, hogy nincs külső RAM, és ez még most is igaz, viszont a hardver többi részével való kommunikációt csak így tudom megoldani. Minden külsőleg elérhető cím egy regiszterbe mutat, amit a hardver valamire használ.

Íme egy elgondolás (O: csak olvasható, Í: csak írható)
$00    (Í) LCD-be bemenet (írási hozzáférés beírja automatikusan a kijelzőbe a bemenetet)
$01    (Í) 1-es szólam frekvenciája
$02    (Í) 1-es szólam pulzusszélesség
$03    (Í) 1-es szólam szűrőértéke
$04    (Í) 1-es szólam vezérlő
$05    (Í) 1-es szólam AR (felfutás, lecsengés, mindkét egy nybble hosszú)
$06    (Í) 1-es szólam S (tartás)
$07    (O) 1-es szólam hanggenerátor
$08    (Í) 2-es szólam frekvenciája
$09    (Í) 2-es szólam pulzusszélesség
$0a    (Í) 2-es szólam szűrőértéke
$0b    (Í) 2-es szólam vezérlő
$0c    (Í) 2-es szólam AR (felfutás, lecsengés, mindkét egy nybble hosszú)
$0d    (Í) 2-es szólam S (tartás)
$0e    (O) 2-es szólam hanggenerátor
$0f     (Í) 3-as szólam frekvenciája
$10    (Í) 3-as szólam pulzusszélesség
$11    (Í) 3-es szólam szűrőértéke
$12    (Í) 3-as szólam vezérlő
$13    (Í) 3-as szólam AR (felfutás, lecsengés, mindkét egy nybble hosszú)
$14    (Í) 3-as szólam S (tartás)
$15    (O) 3-as szólam hanggenerátor
$16    (Í) LFSR frekvenciája
$17    (Í) LFSR pulzusszélesség
$18    (Í) LFSR szűrőértéke
$19    (Í) LFSR vezérlő
$1a    (Í) LFSR AR (felfutás, lecsengés, mindkét egy nybble hosszú)
$1b    (Í) LFSR S (tartás)
$1c    (O) LFSR hanggenerátor
$1d    (Í) 4-es szólam frekvenciája
$1e    (Í) 4-es szólam pulzusszélesség
$1f     (Í) 4-es szólam szűrőértéke
$20    (Í) 4-es szólam vezérlő
$21    (Í) 4-es szólam AR (felfutás, lecsengés, mindkét egy nybble hosszú)
$22    (Í) 4-es szólam S (tartás)
$23    (O) 4-es szólam hanggenerátor
$24    (O) 1-es játékvezérlő állapota
$25    (O) 2-es játékvezérlő állapota
$26    (Í) Megszakításkezelő
$27    (ÍO) Képsor száma (alacsony byte)
$28    (ÍO) Képsor száma (magas byte)
$29    (ÍO) Pixel száma

Vezérlők:
    ¤0: bázisfeszültség (0: +0V, 1: +0,25V)
    ¤1: bázisfeszültség (0: +0V, 1:+0,75V)
    ¤2: fázis újraindítás
    ¤3: felüláteresztő
    ¤4: aluláteresztő
    ¤5: hanghullám
    ¤6: hanghullám
    ¤7: burkológörbe engedélyezése
Játékvezérlő-állapot byteok:
   
¤0: tűz
    ¤1: fe
    ¤2: le
    ¤3: jobbra
    ¤4: balra
    ¤5: -
    ¤6: -
    ¤7: -
Megszakításkezelő:
   
¤0: megsz. új képsor elején
    ¤1: megsz. új képkocka elején
    ¤2: megsz. sorszinkronjelnél
    ¤3: megsz. képszinkronjelnél
    ¤4: megsz. a következő nem látható sorcsoportnál (overscan)
    ¤5: megsz. a $27-$28-ban meghatározott képsoron
    ¤6: megsz. rögtön a $29-ban meghatározott pixel után
    ¤7: -

Új hardver a játékkonzolomhoz

 Azért nem írtam semmit sem, mert 1 hétig nyaralni voltam egy Tisza melletti faluban.

Gondok akadtak a konzolom hardverének tervezésekor, pontosabban a videójelgenerátorral. Emiatt úgy gondoltam, újratervezem. Íme:

CPU: Intel® P8051AH mikrokontroller
    ¤10MHz óra
    ¤128b belső RAM, külső nincs
    ¤64kb külső ROM
    ¤videóalapú megszakítás (INT0)
    ¤megállító gomb (INT1)
VIDEO: Egyedi
    ¤160×312 pontos felbontás
    ¤2,5MHz pixelóra
    ¤PAL komponens kimenet
    ¤6 bites színpaletta:
        ¤5: világosság (Y)
        ¤4: világosság (Y)
        ¤3: piros különbség (Pr)
        ¤2: piros különbség (Pr)
        ¤1: kék különbség (Pb)
        ¤0: kék különbség (Pb)
HANG: Egyedi (előzőhöz képest szinte változatlan)
    ¤4+1 csatorna
    ¤4 periódikus hang
    ¤1 LFSR fehérzaj
    ¤Alul és felüláteresztő szűrő
    ¤ASR (Felfutás, tartás, lecsengés) burkológörbe
    ¤256 frekvencia (f=16×?, ahol "?" a 256 érték egyike)
    ¤Külső hangbemenet
    ¤Leolvasható csatornakimenetek
    ¤Monó hangbemenet és kimenet
        ¤Kapcsolható ál-sztereó kimenet, ahol az egyik oldal 0,02sec-mal el van tolva

Használható továbbá egy 1×16 karakteres LCD, illetve egy külső port is.  Videómemória nincs, hanem az Atari2600-hoz hasonlóan valós időben kerül kirajzolásra a kép. A fő órajel a 10MHz-es kristály, a pixelóra ennek az 1/4-ede. A kirajzolt pixel egyenesen a CPU 1-es portjáról kerül kiolvasásra. Az 1-es port többi bitje:
    ¤7: külső port, 8-as tüske
    ¤6: kijelző mód (0: adat, 1: instrukció)

2024. 07. 10.-i friss hírek: minden csatornán állítható bázisfeszültség, amivel 2-bites hangfileokat lehet lejátszani. Ha a bázisfeszültség nem 0, akkor az analóg hanggenerátor kikapcsolódik a túlfeszültség elkerülése érdekében.