Eksperymenty ze starymi procesorami - MOS6502

Rodzina 82xx jest raczej asynchroniczna, szczegolnie 8251, ktory potrzebuje zegarow dopasowanych do transmisji, i wlasnie 8253, jesli on ma te zegary generowac. Nie bez powodu w pececie pojawil sie dodatkowy kwarc, 1.8costam. A nie chcesz uzyc tego "pecetowego" ... 8250 ?

Natomiast ... tak mi cos chodzi po glowie, ze

-ktorys uklad wymagal doprowadzenia sygnalu zegarowego, bo mial "konstrukcje dynamiczna" ... czy to wlasnie nie 8251 ? pdf trzeba doczytac. Byle jaki mial to byc zegar, byle dopuszczalnym w zakresie czestotliwosci sie miescil, ale najprosciej z procka pociagnac

-moze sie okazac, ze cos tam jest sprawdzane w okreslonej fazie zegara, jak np linie przerwan w procesorze. Akurat magistrali peryferiow intela to nie powinno dotyczyc.

J.

Reply to
J.F.
Loading thread data ...

To nie zmienia faktu, że 8251 posiada trzy wejścia zegarowe: TXC, RXC i CLK. Do dwóch pierwszych podłącza się sygnał z baudrate generatora. CLK ma być natomiast taktowany z zegara systemowego. W urządzeniach na 8080 podłączało sie tutaj wyjście zegarowe TTL układu 8224. Chciałem jedynie wiedzieć skąd wziąć ten sygnał w systemie opartym na

6502. Do wyboru mam wyjście generatora (to samo, do którego podłączone jest wejście Fi0 procesora) albo jedno z wyjść Fi1 i Fi2.

A w pecetach dodatkowy kwarc pojawiał się chyba tylko po to, żeby można było tam łatwo zastosować częstotliwość dzielącą się bez reszty do standardowej prędkości portu szeregowego. W moim przypadku nie ma to wielkiego znaczenia, bo główny generator ma być napędzany kwarcem 4.032 MHz, który potem będzie dzielony przez 2 lub 4 (do wyboru zworką, w zależności od typu procesora). Ta częstotliwość ładnie się dzieli na potrzeby UART-a.

Podobne rozwiązanie zastosowałem w projekcie na MCY7880.

Parę sztuk 8251 oraz 8253 mam pod ręką. ;)

Tak. Właśnie 8251 posiada pin CLK, do którego podpinało się zegar systemowy.

Nie ma tutaj potrzeby zachowani synchroniczności czy coś? Nie ma znaczenia którego"Fi" użyję?

Reply to
Atlantis

Hmm... Teraz właśnie jeszcze raz na to patrze i faktycznie, wygląda na to, że zegar 2000000 Hz jest dużo lepszym rozwiązaniem. Po podzieleniu przez 13 (8253), a potem jeszcze przez 16 (wewnątrz 8251) uzyskam baudrate w okolicy 9615.

Okazuje się, że w komputerze z MCY7880 również powinienem podmienić kwarc na 18 MHz. Wtedy także będę miał zegar 2MHz i identyczną sytuację. W chwili obecnej mam kwarc 18.432MHz, co daje zegar 2.048 MHz i baudrate około 9846... O dziwo działa...

Tak to jest, gdy kopiuje się rozwiązania z internetu, bez przeliczenia na wszelki wypadek...

Reply to
Atlantis

Udało mi się złożyć prosty komputerek z MOS6502AD. W tej chwili konfiguracja wygląda następująco:

- 32kB RAM, adresowany bezpośrednio (pierwsza połowa przestrzeni adresowej).

- 16 kB pamięci EPROM (ostatnia ćwiartka przestrzeni adresowej)

- dekoder adresów na układach TTL-LS

- szyna adresowa buforowana przez dwa układy 74LS245

- port równoległy 8255 Poza tym na płytce znajdują się na razie nie obsadzone podstawki pod:

- dodatkowy chip pamięci RAM, dostępny jako cztery banki po 8kB

- port wyjściowy na 74LS373 do sterowania powyższym

- timer 8253 oraz UART 8251

Sygnały !WR oraz !RD na potrzeby pamięci oraz intelowskich peryferiów są generowane przez następujący układ:

formatting link
Podczas wstępnego rozruchu nie obyło się bez wpadki - okazało się, że odwrotnie podłączyłem zasilanie do 8255. Popłynął za dużo prąd - nie na tyle duży, żeby przepalić 3A bezpiecnzik, ale drucik wewnątrz się lekko rozżarzył. Na wszelki wypadek po tym incydencie wymieniłem 8255 i CPU na inne egzemplarze.

Na chwilę obecną układ przeszedł test "pracy na luzie" - podciągnąłem linie danych za pomocą rezystorów, układając wartość 0xEA (NOP). Szyna adresowa w tej sytuacji zachowuje się prawidłowo - na kolejnych liniach pojawiają się impulsy o dwa razy większej długości niż na linii poprzedniej. Dekoder adresów w tej sytuacji także zdaje się działać prawidłowo, generując impulsy stanu niskiego we właściwej sekwencji.

Natomiast za nic nie udało mi się uruchomić programu. W EPROM-ie siedzi w tej chwili coś takiego:

CTRLREG EQU $9000 PA_8255 EQU $9200 PB_8255 EQU $9201 PC_8255 EQU $9202 CONF_8255 EQU $9203

.ORG $C000 INIT: LDX #$FF TXS LDA #$80 STA CONF_8255 ;tryb 0, wszystkie porty wyjsciowe LOOP: LDA #$01 STA PA_8255 JSR DELAY LDA #$00 STA PA_8255 JSR DELAY JMP LOOP DELAY: LDY #$FF DELAY_LOOP1: LDX #$FF DELAY_LOOP2: DEX BNE DELAY_LOOP2 DEY BNE DELAY_LOOP1 RTS IRQ: RTI

NMI: RTI .ORG $FFFA DW NMI DW INIT DW IRQ

Program powinien "machać" stanem pinu PA0 układu 8255. Niestety, nie robi tego. Oscyloskop pokazuje aktywność na liniach adresowych i danych, a także na !WR !RD. Niestety linia CS sterująca 8255 jest nieaktywna, podobnie jak wszystkie linie z obszaru I/O. Podczas pracy "na luzie" linie te regularnie przełączały się na moment w stan niski.

Wstępnie sprawdziłem połączenia, przedzwaniając połączenia multimetrem. Sprawdziłem też inny EPROM.

Ktoś ma jakiś pomysł? Może błąd tkwi w moim kodzie?

Reply to
Atlantis

W dniu 2018-06-10 o 21:49, Atlantis pisze:

Może upewnij się, czy wszystko trafia do EPROMu tam gdzie trzeba.

Reply to
ajt

Dnia Sun, 10 Jun 2018 21:49:04 +0200, Atlantis napisał(a):

Uzyj ten port do testow

uprosc do

LDA #$05

LDA #$FA

Oscyloskop z pamiecia masz ? najlepiej 4 kanaly :-) To moze analizator Salae ?

-zobacz co sie dzieje na liniach adresowych - program chodzi w kolko, to powinien byc w miare stabilny wzor na kilkanascie adresow, po moich poprawkach jeszcze stabilniejszy

-masz teraz zapis adresu na stos - powinny sie regularnie !WR pojawiac, i to tak w cyklach po 3 - zapis do 8255, potem dwa do RAM. Ale bardzo rzadko - masz dlugie petle.

W moim tylko do 8255 i to czesto.

-jakie sa adresy w trakcie tych !WR

-dodaj w petli STA $0010 - bedzie mozna uzyc !WR RAM czy A15 do wyzwalania oscyloskopu, nawet analogowego

-dodaj uklad pracy krokowej :-)

-czy na pewno dobrze EPROM zaprogramowales ? Program jest w zakresie C000-FFFF, trzeba wpisac w 0000-3FFF kosci.

J.

Reply to
J.F.

Okazało się, że winę ponosił uszkodzony procesor. O ile zachowywał się prawidłowo podczas pracy na luzie, to po odpalaniu programu przez chwilę zachowywał się dziwnie, a potem w ogóle przestawał pracować - aktywność na liniach adresowych zamierała. Po podmianie na inny egzemplarz MOS6502 wszystko zaczęło działać tak, jak powinno. Pozostało mi teraz tylko odpalenie UART-a. Potem spróbuje przeportować i uruchomić którąś wersję MS Basic, a także dopisać obsługę ładowania programów przez port szeregowy. Gdy będzie mi się chciało, może dorobię interfejs magnetofonowy. ;)

Reply to
Atlantis

Użytkownik "Atlantis" napisał w wiadomości grup dyskusyjnych:5b1f62fe$0$607$ snipped-for-privacy@news.neostrada.pl...

Dziwne troche. Co prawda jak pomyliles zasilanie to duzo moglo sie zdarzyc ... ale to bylo zasilanie 8255 ? Nie powinno miec wplywu na procesor.

To juz trzeci, czy wrociles do pierwszego ? Jeszcze troche, i seryjna produkcje bedziesz mogl zaczac :-)

Ale ciekaw jestem co mu sie stalo. Zegar dzialal po zawieszeniu ? Moze jakies klopoty z kwarcem ?

A moze uszkodziła mu się ktoras linia danych - czytal czasem dobre rozkazy, czasem inne ale ciagle poprawne, az trafil na jakis nielegalny kod i sie zawiesil.

System Spectrum byl dobry i prosty. Tylko ze 6502 jest 8-bitowy, a Spectrum zapisywal dlugimi blokami :-)

Zaprogramujesz - zrozumiesz czemu 6502 byl kiepski. Choc miejscami pokazywal zalety.

A masz jeszcze magnetofon ? Moze lepiej sie skupic na obsludze kart SD ?

No chyba, zeby tak na MP3 trzymac programy :-)

J.

Reply to
J.F.

Wychodzi na to, że opisując proces debugowania problemu pominąłem jeden istotny szczegół. Mianowicie już po pierwszej podmianie CPU zauważyłem błąd konstrukcyjny - brakowało inwertera na jednej linii, co uniemożliwiało normalną prace I/O i przez co dioda nie migała. Usunąłem ten błąd i podłączyłem zasilanie, jednak urządzenie ciągle nie chciało działać prawidłowo - bo tym razem CPU był wadliwy. Dopiero jego ponowna podmiana dała właściwy efekt. Nie wiem - możliwe nawet, że wziąłem ten procesor sam, który był na początku. :)

Tak, zegar cały czas pracuje prawidłowo. Pierwszą rzeczą, która mi przyszła do głowy było to, że może zworka przy dzielniku częstotliwości (do ustawiania 1 MHz lub 2 MHz) nie łączy. Jednak to nie to. Już po uruchomieniu układu włożyłem jeszcze raz w podstawkę ten podejrzany egzemplarz CPU - układ znów nie chciał działać. To tylko potwierdziło, że tu tkwiła przyczyna problemu.

Chodzi mi przede wszystkim o walor edukacyjny, nie praktyczna użyteczność. W końcu mówimy o procesorach, które nawet hardware'owo nie potrafiły mnożyć i dzielić. ;)

Leży gdzieś u mnie jakiś kasetowy Kasprzak. ;) Poza tym nie mam zamiaru wykorzystywać tego magnetofonu jako pamięci masowej. To raczej zadanie do rozwiązania w ramach nauki. W zamierzeniach głównym sposobem ładowania kodu ma być RS232.

Reply to
Atlantis

Tu sie objawi walor edukacyjny :-)

Tu akurat wystarczy +1 i -1

Jest jeszcze czym wyslac dane? Taki X-modem, czy Z-modem ... a moze po prostu .hex tekstowo ?

J.

Reply to
J.F.

Dnia Sat, 16 Jun 2018 00:00:12 +0200, HF5BS napisał(a):

Kermit calkiem dobry ... i kermit ciagle zyje, a inne programy upadaja.

Tyle ze kermit sie tak rozrosl, ze posadzic go 6502 bedzie problem.

J.

Reply to
J.F.

Dnia Sat, 16 Jun 2018 04:48:51 +0200, HF5BS napisał(a):

Mnie o rozmiar pamieci chodzi.

A tu mamy 64KB RAM+ROM.

No i to byly zlote czasy dla modemow, a teraz ... a co to jest modem ? Juz nawet nie pamietam kiey ostatni raz uzywalem :-(

O ile pamietam, to stacja dyskow byla na laczu szeregowym, i dawala sie przeprogramowac na 19200, bo normalnie to byl tragicznie wolna :-)

ten procesor robi ok 1 MIPS, to mamy ok 500 rozkazow na bajt - az za duzo, wiec to nie koniec mozliwosci.

Ktore ma sprzetowy rejestr i w koncu mamy 80 cykli na bajt.

No chyba, ze nie ma, i czysto programowo wachlujemy jednym bitem?

Tak nawiasem mowiac - pamietam jakis system monitorujacy na 8080. Modem 9600 ... ale wiele ich. No i tak liczymy - od jednego przerwanie co 1ms, zanim przerwanie przyjmiemy, zrzucimy rejestry, sprawdzimy ktory port, odtworzymy ... no zabraknie czasu przy 10 modemach. W efekcie przerwanie bylo zegarowe co ok 0.5ms, sprawdzalo polingiem wszystkie porty.

Tak nawiasem mowiac, to IBM sie nacial podobnie. DMA w 8088/86/286 bylo za wolne, i AT z HDD komunikowal sie rozkazami OUTR/INR

J.

Reply to
J.F.

Dnia Mon, 18 Jun 2018 01:33:58 +0200, HF5BS napisał(a):

To jest kiepski przyklad. Niby jeden writeln, a srodowisko cale trzeba zainicjowac.

Tymczasem zrodelko Kermita liczy 9MB plikow .c

Musisz je najpierw odchudzic :-)

formatting link

Nosnik IMO bez znaczenia - pewnosc z predkosc komunikacji z napedem nie ma znaczenia. Moze w czasach modemow 300 nie pomysleli, ze 19200 to za wolno, moze w czasach gier po 4-30KB te 19200 wystarczalo, wszak to tylko 15s na duza gre. Transmisja asynchroniczna wymaga zegara ok 16x szybszego - dla 19200 to jest 307kHz - moze nie pasowalo im szybciej robic.

Bardzo sprzetowo ... w kosci UART, bo ten warp to musi cos nowego.

buforuje UART, ale tylko 1 bajt (8251). Przy 9600 te 0.5ms wystarczy

Byly, ale na ISA :-)

Wszysto jedno - interfejs ten sam. AT-bus/IDE to moze jeszcze gdzies sie dzis spotka na plycie glownej. Tylko, ze od lat podlaczony do specjalnego sterownika DMA/bus master.

J.

Reply to
J.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.