1

Mam drugie pytanie dotyczące połaczenia 6502 z resztą świata.

6502 nie jest taktowany wprost z generatora. Z jakiejś przyczyny sygnał zegarowy 3.5MHz jest wkładany:

a) najpierw w GTIA do OSC.
b) wychodzi z GTIA jako FO0 i wchodzi na ANTIC FO0
c) Wychodzi z ANTIC jako O0 i podawane jest na SALLY.

Dodatkowo ANTIC i GTIA dostają zwrotnie O2 (sa oczywiscie róznice w A400 i xl/xe, ale z grubsza).

Za dużo tych zegarów i to we wszystkie strony. Pytania:

a) dlaczego sygnał zegarowy przechodzi przez GTIA, ANTICA ?
b) co by się stało gdybym sygnał O0/OSC wygenerwał obok i podal na 6502 i GTIA, a wyjście O0 z antica olał? Czy sa tam jakieś zalezności czasowe pomiedzy O0 a OSC typu parzyste OSC itp?
c) Czy przypadkiem nie jest tak że ANTIC zatrzymuje O0 na czas dostepu dma lub refresh (było by to nielegalne z punktu widzenia 6502, ale moze nic złego nie czyni)?
d) punkt c) ma może i jakiś sens w A400, ale w XE/XL chyba nie bo tam procesor wytwarza O1 i O2.

2

a) Sygnał OSC z kwarcu 3,54MHz (PAL) wchodzi do GTIA  i stanowi cykl koloru. Jednocześnie synchronizuje on sygnał 4.43MHz wychodzący jako PAL. GTIA podaje FO0 do Antica aby zsynchronizować treść obrazu z kolorem, a z Antica wychodzi zegar 1.79MHz dla procka, żeby też synchronicznie działał z tym całym majdanem.
b, c) Procesor działa z zegarem 1.79, system się wywali przy innej częstotliwości, (POKEY, PIA) obsługują SIO i inne rzeczy. Dodatkowo proc jest HALTowany przez Antica na czas jego potrzeb.
d) a "końpatybilność"?

3

jer napisał/a:

a) Sygnał OSC z kwarcu 3,54MHz (PAL) wchodzi do GTIA  i stanowi cykl koloru. Jednocześnie synchronizuje on sygnał 4.43MHz wychodzący jako PAL.

Tu wszystko jasne.

jer napisał/a:

GTIA podaje FO0 do Antica

Wiem, ale po co tylko do antica a nie od razu do CPU?

Więcej, FO0 to prawie to samo co O2 z SALLY. Zapewne różnią się tylko lekkim przesunięciem związanym z propagacją. Dlaczego sa rozdzielone skoro sa praktycznie takie same?

jer napisał/a:

aby zsynchronizować treść obrazu z kolorem, a z Antica wychodzi zegar 1.79MHz dla procka, żeby też synchronicznie działał z tym całym majdanem.

To dalej nie wyjaśnia dlaczego antic steruje cpu. Równie dobrze zarowno ANTIC jak i SALLY mogły by byc podpięte pod tą samą linie O0/O2. Innymi słowy szukam powodu dla którego sygnał z ANTICA steruje CPU wlasnie w ten sposób. Podejrzewam że ANTIC wycina z niego cykle powodując że 6502 zatrzymuje się. Jest to niezgodne ze specyfikacją 6502 i wydaje mi się podejrzane.

Ja wiem że oba mają pracować synchronicznie. To nie tłumaczy jednak dlaczego istnieją dwie linie FO0 i O0 które teoretycznie są identyczne. Więc podstawowe pytanie dalej brzmi: dlaczego ANTIC nie jest wpięty równolegle do O2 tylko steruje CPU.

Gorzej, dlaczego GTIA dzieli sygnał przez 2 i wystawia dalej (przeciez to mozna zrobć jednym przerzutnikiem).

jer napisał/a:

b, c) Procesor działa z zegarem 1.79, system się wywali przy innej częstotliwości, (POKEY, PIA) obsługują SIO i inne rzeczy. Dodatkowo proc jest HALTowany przez Antica na czas jego potrzeb.

Jesli ANTIC ma do dyspozycji HALT to dlaczego ma jeszcze mozliwośc manipulowania O2 SALLY? Może to pozostałośc po 400/800 gdzie realizowano haltowanie inaczej.

Albo jeszcze inaczej: ANTIC ma aż 3 drogi do mieszania z CPU:

a) może go zatrzymać RDY (to chyba jest wykorzystywane tylko przez WSYNC)
b) może zrobić asercję na HALT
c) może "przeoczyć" cykle na O0 pozostawiając CPU bez sygnału co jest niezgodne ze specyfikacją (O0 musi być równo 1/2)

Punkt c) mnie niepokoi sugestią że to mozliwe jest wlaśnie fakt że sygnał O0 CPU ma pod pełną kontrolą ANTIC.

jer napisał/a:

d) a "końpatybilność"?

To rozwiązanie sprzętowe i w niewielkim stopniu jest widoczny w software.

4

Fo0 to 3.5mhz
o2 to 1.7mhz, jak sa identyczne?

przechodze na tumiwisizm

5

Candle napisał/a:

Fo0 to 3.5mhz
o2 to 1.7mhz, jak sa identyczne?

Ponieważ O0 można dostać poprzez podzielenie przez 2 i nie jest w tym potrzebny ANTIC.

W ogóle *NIE* trzeba go w tym celu przepychać aż przez dwa układy od innych zadań. Widocznie jest inny powód. Chcę wiedzieć jaki. Ze schematu A400 wynika że proces haltowania 6502 prawdopodobnie polega m.in. na zatrzymaniu zegara O0. Sprawdze to dzisiaj dokładnie. Być może w XL/XE O0 tez jest zatrzymywany (tylko po co skoro jest HALT).

Najwiekszą dla mnie niejasnością jest dlaczego ANTIC posiada dwa cieżkie sposoby na zatrzymywanie SALLY. Jeden przez HALT a drugi przez posiadanie źródła O0. I chce wiedziec czy faktycznie O0 po wyjściu z antica jest zatrzymywany.

Ogólnie propagacja zegarów w Atari jest przeraxliwie zamotana, bierze w tym udziala za dużo scalaków. Niestety nie trafiłem na żadną literature która to wyjaśnia kompleksowo.

6 Ostatnio edytowany przez Simius (2013-11-15 14:09:46)

Nie ma zatrzymywania O0. Wstrzymywanie procesora jest realizowane  na dwa sposoby - przez sygnały HALT i RDY.

EDIT: w znaczeniu - nie ma wstrzymywania O0 wewnątrz ANTIC

Ceterum censeo Germaniam esse delendam.

7

Simius napisał/a:

Nie ma zatrzymywania O0. Wstrzymywanie procesora jest realizowane  na dwa sposoby - przez sygnały HALT i RDY.

Dlaczego wiec źródłem O0 nie jest OSC tylko aż dwa scalaki? Ma to związek:

a) bo tak było w A400 i zostało
b) bo są tam magiczne opóźnienia
c) nie ma sensownej odpowiedzi

?

Jest też drugie pytanie: skoro O0 to praktycznie to samo co O2 to po co sa oba dostepne z ANTICA? Antic generuje O0 tylko po to by chwilę później reagować na O2 z CPU ktore de facto sam generuje. Dziwne. W A400 nie ma w ogóle O2 z CPU.

8

Hmm, a co jeśli:
1. Puścisz sygnał z boku
2. Wyłączysz Antic
3. Na ekranie wyświetlisz tryb GTIA i/lub duszki?
Jak zsynchronizujesz?
Inna sprawa (nie jestem programistą) - czy sygnał dla proca nie jest modyfikowany przez Antic dla przerwań DL? Coz rozkazami, które są wykonywane z opóźnieniem jednego cyklu i synchronizacją na ekranie? Może to jest powód  - sygnał jest wtedy jeden i jak go któryś z układów zmodyfikuje - zawsze się zsynchronizuje z procesorem.
Ot, tak moja hipoteza...

Sikor umarł...

9

Sikor napisał/a:

Hmm, a co jeśli:
1. Puścisz sygnał z boku
2. Wyłączysz Antic
3. Na ekranie wyświetlisz tryb GTIA i/lub duszki?

Skąd GTIA będzie miec dane do ich wyświetlenia?

Sikor napisał/a:

Jak zsynchronizujesz?

Skoro antic nie robi żadnych manipulacji na O0 przed wpuszczeniem w CPU to teoretycznie możliwe było by puszczenie O0 wprost przez dzielnik SCK. Powinno działać dokładnie tak samo. Jestem ciekaw czy te różnice w budowie zegara O0 nie sa przypadkiem odpowiedzialne za inny artefakting GTIA w A400 i xl/xe.

Szyje sobie z boku mały system bazujący na 6502 jako wprawę przed WilekąRzeczą. Po przeglądnięciu jak działa zegar w Atari XE/XL szczęka mi wypadła. To jest przeraźliwie zawiłe i zupełnie nie rozumiem dlaczego. Dla A400 jestem w stanie to chyba pojąć, dla xe/xl nie, dalej zagadką jest szeregowe gtia i antic przed cpu.

Sikor napisał/a:

Inna sprawa (nie jestem programistą) - czy sygnał dla proca nie jest modyfikowany przez Antic dla przerwań DL?

Tu cała zabawa: 6502 nie może mieć inaczej niż 50/50% na O0. Każda zmiana zegara O0 oznacza zakłucenie tej proporcji i wyjście w obszar o którym dokumentacja cpu nic nie mówi (podpieram się dwoma źródłami) poza tym ze nie wolno.

10

1 przykazanie starodawnej sztuki Atari brzmi:
Dokumentacja GTIA i ANTIC'a przyjacielem twy być powinna.

GTIA taktuje ANTIC'a poprzez sygnał FØ0 w rytm ktorego taktu antic dane obrazu śle do GTIA po liniach AN0-AN2. Jest on przesunięty nieco w fazie względem OSC !! na którego narstającym zboczu sygnały z ANTICA są zatrzaskiwane. (w dokumentacji ANTICA jest napisane na którym zboczu ANTIC te dane wystawia)

ANTIC, jako procesor o większym priorytecie (hehe albo dla zasady albo poprostu tak jest bezpieczniej i zgodnie z zasadami) dzieli sygnał na 2 i synchronizuje go fazowo z Ø0 którym taktuje SALLY, sally natomiast odwraca fazę, i już jako sygnał Ø2 idzie w świat. Synchronizuje on wszelkie zapisu Z i DO rejestrów. Wszystkich. Dlatego wraca on właśnie do ANTIC'a i GTIA, żeby wiedziały kiedy dane zatrzasnąć/wystawić.

Mam nadzieję że nić nie pomyliłem bo z pamięci pisałem. Reszta w dokumentacji.

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477

11

heby napisał/a:

Skąd GTIA będzie miec dane do ich wyświetlenia?

No na pewno nie z Antica - duszki i kolory nic z nim wspólnego nie mają. Dane ma z pamięci.

The problem is not the problem; the problem is your attitude about the problem

12

wieczor napisał/a:
heby napisał/a:

Skąd GTIA będzie miec dane do ich wyświetlenia?

No na pewno nie z Antica - duszki i kolory nic z nim wspólnego nie mają. Dane ma z pamięci.

Ciekawe wobec tego jak wyjaśnisz obecność rejestru $D400 oraz:

"ANTIC's Player/Missile DMA feature reads bytes from memory and delivering data to update CTIA/GTIA's GRAFP0, GRAFP1, [...]"

Niestety nie ma to żadnego związku z tematem moich pytań.

13

willy napisał/a:

1 przykazanie starodawnej sztuki Atari brzmi:
Dokumentacja GTIA i ANTIC'a przyjacielem twy być powinna.

Szczególnie że nie tlumaczy "po co". Tlumaczy tylko "że".

willy napisał/a:

GTIA taktuje ANTIC'a poprzez sygnał FØ0 w rytm ktorego taktu antic dane obrazu śle do GTIA po liniach AN0-AN2. Jest on przesunięty nieco w fazie względem OSC !! na którego narstającym zboczu sygnały z ANTICA są zatrzaskiwane. (w dokumentacji ANTICA jest napisane na którym zboczu ANTIC te dane wystawia)

O ile przesuniety? Nie potrafie znaleźć tej informacji. Brzmi podejrzanie. O czas propagacji, czy arbitralny?

willy napisał/a:

ANTIC, jako procesor o większym priorytecie (hehe albo dla zasady albo poprostu tak jest bezpieczniej i zgodnie z zasadami) dzieli sygnał na 2

Potrafi to zwykly przerzutnik. Dlaczego robi to więc antic?

willy napisał/a:

i synchronizuje go fazowo z Ø0

Co robi? Przecież nie ma tu co synchronizować. O0 jest *generowany* przez antic.

willy napisał/a:

sally natomiast odwraca fazę, i już jako sygnał Ø2 idzie w świat.

O0 i O2 mają tą samą fazę. Pomyliło Ci się z O1 albo moja literatura kłamie. Jedyna różnica O0 i O2 to lekkie przesunięcie fazy. Do tego stopnia nieznaczące że w A400 jest w ogóle pominięte O2 a jego rolę pełni O0.

willy napisał/a:

Synchronizuje on wszelkie zapisu Z i DO rejestrów. Wszystkich. Dlatego wraca on właśnie do ANTIC'a i GTIA, żeby wiedziały kiedy dane zatrzasnąć/wystawić.

Oba to wiedzą bo przed chwilą go wygenerowały, antic w szczególności to wie, bo generuje wprost O0 który jest prawie  tym samym co O2. Dalej nie rozumiem dlaczego to antic dzieli przez 2.

14 Ostatnio edytowany przez heby (2013-11-14 20:44:38)

A tak to wygląda w realu, zrzuciłem przed chwilą z działającego Atari 65XE na płycie 130XE:
O0_vs_O2

Od góry:
FO0
O0
O2

Jak widać O2 opóźnia się o 50ns względem O0 natomiast O0 o mniej więcej tyle samo względem FO0/2.

Nie udało mi się zaobserwować nieciągłości w zegarze O0, jednak to powoduje że dalej nie wiem jak robiono halt w A400.

Dodatkowo udalo mi się zaobserwować glitcha na CS pokey o którym była mowa w innym watku. Ma 20ns szerokości.

15 Ostatnio edytowany przez jer (2024-08-12 21:28:14)

Za pomocą Z301 (74LS74)  i Z302 (74LS02) oraz buforów adresowych Z303 i Z304 (74LS244).

https://jsobola.atari8.info/DEREATARI/images/cpu400.jpg

16

jer napisał/a:

Za pomocą Z301 (74LS74)  i Z302 (74LS02) oraz buforów adresowych Z303 i Z304 (74LS244).

Wiem za pomocą czego. Nie jest dla mnie jasne czy O0 byl zatrzymywany (co narusza 50/50%, ale nie wiem jak to zrobić inaczej).

17 Ostatnio edytowany przez willy (2013-11-14 21:17:30)

Racja, pomyliłem Ø1 z Ø0, Ale nie o to chodzi.

Spójrz na ściężkę synchronizacji:

GTIA -> ANTIC -> GTIA  - FØ0
ANTIC -> SALLY  - Ø0
SALLY -> RAM,ANTIC(rejestry), GTIA(rejestry), ogolnie IO - Ø2 , dodatkowo tutaj ANTIC dostaje Ø2 jeszcze lekko przesunięte na bramce (wg schematu 65xe)

To że antic dzieli przez 2 wynika z powyższego. Dywagacje na temat o ile przesunięte są wg. mnie bezcelowe. Bardziej należy to rozpatrywać w kategorii - pułapki elektroniki cyfrowej z przed 30 lat ,)

400 zatrzymuje zegar (tak przynajmiej wynika ze schematu). Zasada 50/50 jest w tym przypadku naruszona. Ale jak widać nie wpływa to na pracę procesora. Jest to niejako zgubienie jednego cyklu, albo raczej przytrzymanie zegara w stanie niskim na okres jednego cyklu. Jest to na tyle krótkie że dynamiczne rejestry pocesora nie zdążą zapomnieć wartości i przy następnym cyklu zostaną odświeżone.

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477