Strona 1 z 2

MC6800

: wtorek 08 lip 2025, 00:03
autor: gaweł
MC6800
m6800_il00.jpg


Nadeszła pora zmierzyć się z chyba najdziwniejszym
prockiem jaki powstał → MC6800. Jak ktoś
się przyzwyczaił do procków zilogowych czy intelowych
to doznaje zdziwienia. Sposób współpracy proca ze światem
zewnętrznym jest pokrętny. W dodatko, wszystko
jest memory mapped. Jego młodszy brat MC6809
też jest trochę dziwny, ale już inaczej. No cóż, jest jak jest...


Mój pierwszy procek, jaki nabyłem to był właśnie MC6800, taki piękny, w ceramicznym fioletowym kubraczku ze złotymi kończynami (taki jak na focie wyżej, ale to nie ten). Tamten poszedł w ludzi zanim zdążyłem coś na nim zrobić. Jednak jakaś podświadoma pamięć pozostała i kilka lat temu znowu takie trafiły w moje ręce. Odleżały w szufladzie aż przyszła na nie pora.
No więc zanim coś na takim procku zrobić, to postanowiłem sprawdzić czy on oddycha i jest sens się trudzić. Nie obeszło się bez różnych doświadczeń i prób, bo literatura na jego temat nie należy do popularnej a i w necie nie specjalnie dużo tego jest, niby jest, ale jak masz konkretne pytania, to nie specjalnie znajdziesz na nie odpowiedź. Trzeba samemu docierać do sedna sprawy.
No więc ów procek to:
m6800_il01.png

Jak każdy ma szynę danych, szynę adresową i zasilanie. Ma dwufazowy sygnał taktujący, coś podobnego było w Intel8080 (ale tu jest w standardzie TTL). Próżno szukać scalaczka będącego generatorem taktu dla procka (taki odpowiednik I8224). Gdzieś trafiłem na informacje, że Motorola taki zaprojektowała, ale go zdobyć, to już inna sprawa. Oczywiście manuale pokazują jak mają wyglądać te zegary, ale okazuje się, że jeden może być negacją drugiego. IRQ i NMI jeszcze mogą poprawnie się kojarzyć, reszta to już jakieś dziwności. Wg danych katalogowych BA, R/W i VMA to sygnały wyjściowe, reszta to wejściowe. Logika ich mnie zadziwiła, bo część ma stan aktywny zerem a część ma stan aktywny jako jeden.
Tak sobie wymyśliłem, że napędzę procka jakimś niezbyt wyśrubowanym sygnałem zegarowym. Użyłem typowego generatora (użyty napędza UARTY – 1,8432MHz), jego częstotliwość podzieliłem na dwa by mieć ładne wypełnienie a przy okazji mam sygnał prosty i zanegowany. One poszły do napędzania procka. Sygnały sterujące dałem do stanu pasywnego a reset zrobiłem wręcz w klasyczny sposób, z bramką Schmitta. Szyna danych jest tak skonstruowana, by dawać stały rozkaz do wykonania. Schemat jak poniżej:
m6800_il02.png

Zmontowałem i podłączyłem do prądu i … nic się nie dzieje.
m6800_il03.jpg

Po odpaleniu, zegar wygląda następująco:
m6800_il04.png

Nawet się zgadza: 1,8MHz podzielone przez 2 tyle daje.
Trochę rozkminy, a pomógł przypadek. Stała czasowa od reset jest spora, a na oscylku było widać, że procek rusza i się zawiesza. Okazało się, że działa, jak trzymam reset, jak puszczę to chwilę później staje. No tak, zapomniałem dodać negator (początkowo była jedna bramka 74HCT14). Po korekcie na szynie danych ustawiłem kod rozkazu 5F hex (CLR B, taki by miał dużo jedynek, bo nie chciało mi się „drutować” dip-switcha) jednobajtowy kod rozkazu, który nie wymaga dostępu do szyny danych (lepiej by nie pisał nic do pamięci, bo się pogryzie z 74HCT245). Dałem ten bufor 3-stanowy by nie zaszkodzić prockowi jak bym się pomylił i wyszła operacja zapisu a szyna byłaby sterowana bezpośrednio z dip-switch.
No więc procek coś robi, na szynie adresowej osylek pokazuje aktywność: A0
m6800_il05.png

Mamy 230 kHz na najmłodszym bicie adresowym, prosty rachunek mówi, że do tej operacji procek potrzebuje 4 taktów. Kolejny bit adresu: A1
m6800_il06.png

ma dwa razy mniejszą częstotliwość. Znaczy wszystko działa zgodnie z oczekiwaniem. Teraz trzeba będzie dołączyć pamiątki.

Re: MC6800

: wtorek 08 lip 2025, 14:49
autor: j23
A czy z tym RESET'em to nie jest tak, że gdyby zastosować tam dławik rzędu np.10[mH] to także ten sygnał RESET byłby podtrzymany. Tzn.jeśli to jest to samo co "drutowanie" dip-switch'a to już wszystko jasne. ;)

Fajnie by było jakiś projekt zrobić na nim na diodach RGB LED, coś np. w oparciu o spektrum barw widzialnych, taki płynny, randomowy zmieniacz kolorów (albo coś ambitniejszego). :)

Re: MC6800

: wtorek 08 lip 2025, 19:46
autor: gaweł
Taki mam cel, ale na razie to odchodzi walka z materią. :D

Re: MC6800

: wtorek 08 lip 2025, 19:53
autor: gaweł
Postanowiłem sprawdzić wpływ kilku sygnałów na działanie procka, by ciągle nie wtykać i wytykać drutów, zrobiłem sobie pomocniczy diwajs, jak poniżej (jak dioda świeci, to na wyjściu jest jedynka), tu nie ma dzwonienia styków:
m6800_il10.png

Z tego wykorzystałem dwa sygnały: biały na sygnał HALT i czarny na TSC. Dodatkowo podłączyłem BA, VMA i R/W do układu ULN2803 (dioda świeci jak jest jedynka). Działa jak HALT=1 i TSC=0, w innych przypadkach chyba się zatrzymuje, trudno zgadnąć czy się rzeczywiście zatrzymuje, czy wchodzi w stan HOLD (na razie miernikiem trudna rozróżnić, czy na szynie adresowej jest 0 czy jest trzeci stan, trzeba będzie dodać rezystory i mierzyć napięcie).
m6800_il11.jpg

Dodałem jeszcze sterowanie kierunkiem łącznika 74HCT245, by procek mógł pisać i nie było konfliktów. Ustawiłem na drutach kod rozkazu D7 hex (będzie zapis akumulatora B do pamięci pod adres D7D7 hex).
m6800_il12.png

Na takie dictum, zareagował jak się spodziewałem: czyta kod rozkazu, wykonuje operację i robi zapis do pamięci. Daje się zauważyć oscylkiem (sygnał R/W):
m6800_il13.png

ale nadal nie widzę, na jakiej zasadzie wygenerować chip select dla EPROM.
Jest w necie dostępna taka książka, jako oficjalne materiały Motoroli:
m6800_il14.png

i w niej taki rysunek:
m6800_il15.png

Jak na razie, jest dla mnie zagadką, na jakiej zasadzie to działa. ROM jako Enable ma sygnał fi2 oraz R/W?

Re: MC6800

: wtorek 08 lip 2025, 21:22
autor: xor
ROM jako Enable ma sygnał fi2 oraz R/W?

fi to chyba ma być zawsze:
https://vtda.org/docs/computing/Motorola/M6800SystemsReferenceDataSheets_May75.pdf
c/)2 - All data transfers take place during the c/)2
clock cycle. Therefore this signal will be
used as an enable input for all memories and
interfaces.

W dokumencie powyższym pokazują inne warianty adresowania, bez R/W.

Wejścia CS MCM6830 programowane na życzenie odbiorcy, ciekawe.

Re: MC6800

: środa 09 lip 2025, 23:21
autor: gaweł
Dziwności, dziwności, dziwności...

Fi2 jako strob do aktywacji pamięci (jak i również peryferali), to trochę takie dziwne. Pozostaje zmienić swoje zapatrywania i tolerować inne rozwiązania, niż te, do których się przyzwyczailiśmy, nie wszystko musi być zgodne z naszym wyobrażeniem. Można mniemać, że VMA (valid memory address) powinien pełnić rolę zilogowego MEMRQ (lub coś podobnego). Oglądałem ten sygnał na oscylku i w normalnej pracy na stałą wartość (nie zmienia się). Gdyby on decydował o dostępie do pamięci, to taka pamięć byłaby permanentnie otwarta, ale już iloczyn logiczny VMA z FI2 zaczyna mieć sens (będzie tam jakiś przebieg). Tylko to z kolei znaczy, że dostęp do pamięci musi być w procku jakoś synchronizowany z tym FI2. Poprzednia jednobajtowa instrukcja bez dostępu do pamięci/peryferali wymagała 4 taktów. Tutaj może zrodzić się pytanie: o jaki takty chodzi, skoro zegar jest dwufazowy?
Jak damy HALT=1 i TSC=0, to procek działa, coś tam biega po szynie adresowej. Na BA nie zauważam przebiegów (stałe 0), na VMA nie zauważam przebiegów (stałe 1), na R/W jest przebieg, bo wykonywana instrukcja jest zapisująca do RAM, a procek czyta kod rozkazu. W dokumentacji napisali:Sygnał BA będzie normalnie w stanie „Low”. Po aktywacji przejdzie do stanu „High”, wskazując, że mikroprocesor zatrzymał się i że magistrala adresowa jest dostępna. Nastąpi to, jeśli linia HALT będzie w stanie „Low” lub procesor będzie w stanie WAIT w wyniku wykonania instrukcji WAIT. W takim momencie wszystkie trzystanowe sterowniki wyjściowe przejdą do stanu wyłączonego, a inne wyjścia do poziomu normalnie nieaktywnego.
To by nawet pasowało.
m6800_il21.jpg

Jak dać HALT=0, to procek się zatrzymuje, VMA i R/W schodzi na 0 a BA wchodzi na 1.
m6800_il22.jpg

W przypadku TSC=1, wszystko schodzi na 0
m6800_il23.jpg

W obu przypadkach (HALT i TSC) szyna (przynajmniej adresowa) wchodzi w trzeci stan, dałem 2 oporniki po 12k od linii adresowej A0 jeden do +5V, drugi do GND.
W stanie HALT na A0 jest połowa napięcia zasilającego → procek nie wymusza ani zera ani jedynki.
m6800_il24.jpg

Podobnie jest przy TSC=1. Dla porównania na A1 (bez polaryzacji linii przez oporniki) voltmeter pokazuje 0V. By wykryć, że jest trzeci stan należy dodać dwa rezystory.
m6800_il25.jpg

Jednak największą dziwność napotkałem w … firmowej literaturze:
m6800_il26.png

Piszą, by TSC dać na stałe do +5V. Procek ma na zawsze zamrozić się w trzecim stanie? Załóżmy, że drukarz się pomylił a nie jest to celowa dezinformacja.

Re: MC6800

: czwartek 10 lip 2025, 09:25
autor: tapy
Przyznaję nigdy nie wgłębiałem się w tajniki 6800, ale pobieżnie znając ich późniejsze rozwiązania (6809) to zaskoczyła mnie przedstawiona tu informacja że można taktować ten procesor w przeciwfazie. Możliwe, że pierwowzór działał trochę inaczej niż późniejsze procesory z tej rodziny. Dotychczas myślałem, że wymagania taktowania zegarem kwadraturowym związane jest z kolejnością sekwencji przetwarzania rozkazu (stąd to powiązanie Ø2 z R/W w cyklach dostępu do pamięci/urządzeń I/O). Nie doszukiwałbym się też tam sygnału odpowiadającemu MREQ z Z80, to kompletnie inne podejście do tematu.

Re: MC6800

: czwartek 10 lip 2025, 12:43
autor: phill2k
W necie jest jeszcze dostępna pozycja MC6800 Microcomputer System Design Data, możne będzie pomocna - https://archive.org/details/bitsavers_m ... 2/mode/2up

Re: MC6800

: czwartek 10 lip 2025, 20:54
autor: gaweł
tapy pisze:Przyznaję nigdy nie wgłębiałem się w tajniki 6800, ale pobieżnie znając ich późniejsze rozwiązania (6809) to zaskoczyła mnie przedstawiona tu informacja że można taktować ten procesor w przeciwfazie. Możliwe, że pierwowzór działał trochę inaczej niż późniejsze procesory z tej rodziny.

Można, o tym to wiedziałem, tzn. w jego czasach w latach 80-tych to widziałem takie chwyty na schematach. Teraz widać to w dokumentacjach (wtedy nie było książek :( ).
moto1.png

w tej publikacji jest nawet propozycja rozwiązania taktowania:
moto2.png

Jest bramka prosta i negująca. Obecnie zastosowane można uznać za tożsame. Zamiast tych podciągaczy zboczy zastosowałem układ z serii HCT, który daje napięcia bliskie zasilania, w końcu to CMOS. Z drugiej strony, to wyostrzanie zboczy nie jest konieczne, współczesne układy cyfrowe robią to równie dobrze.
Jak by się upierać na siłę, to jest również rozwiązanie prawdziwie dwufazowe:
moto3.png



tapy pisze:P Nie doszukiwałbym się też tam sygnału odpowiadającemu MREQ z Z80, to kompletnie inne podejście do tematu.

No właśnie, ten jest inny niż wszystkie. :D

Re: MC6800

: czwartek 10 lip 2025, 20:57
autor: gaweł
phill2k pisze:W necie jest jeszcze dostępna pozycja MC6800 Microcomputer System Design Data, możne będzie pomocna - https://archive.org/details/bitsavers_m ... 2/mode/2up



Dzięki @phill2k, każde wsparcie się przyda.

Re: MC6800

: piątek 11 lip 2025, 02:30
autor: j23
W tej dokumentacji z archive.org, do której link Kolega phill2k udostępnił na stronach 7-12 jest to rozpisane. A z kolei na rysunku 6 (figure 6, str.7) są podane zależności w sygnałach DBE gdy DBE = fi2, albo gdy DBE != fi2. Co ja tam dziwnego jeszcze widzę to np.na stronie 9-tej pisze, że... ten system mikroprocesorowy wymaga.. dwóch zegarów fi1 i fi2 (plus czasami trzeci = sygnał E / Enable, który ma być zgodny z fi2). Ja piernicze...
Co tam jeszcze..
Poziomy sygnałów sterujących:
- dla wyjściowych (output levels) są: 0,4[V] ( logiczne zero? ) i 2,4[V] ( logiczna jedynka? )
- dla wejściowych (input levels) są: 0,8[V ] ( logiczne zero? ) i 2[V] ( logiczna jedynka? )
co ma zagwarantować przynajmniej 0,4[V] przestrzeni na ewentualne błędy powstałe wskutek przypadkowych zakłóceń sygnału (zła interpretacja poziomów logicznych).
Zasilanie procka zalecają między 4,75[V] a 5,25[V] przy temperaturze otoczenia od 0 - 70°C (strona 8 w zakładce "Maximum ratings"), a z tym wejściem TSC (Three Stage Connection) to tym co pisali dokumentacji chodzi o TAMTEN KONKRETNY diagram połączeń (nazwali go "typowy" diagram połączeń, gdzie podciągnięcie TSC do 5[V] ma wymusić określoną interpretację stanów logicznych co wynika z tabeli stanów statycznych (przesyłam obrazek o co mi chodzi).
MC6800_TSC.png

Co dodatkowo znajduje potwierdzenie na stronie 5 w zakładce "Microprocessor Address Bus Lines (AO-A1S)" gdzie pisze m.in."Putting TSC in its high stateforces the address bus and R/W lines to go into the three-state mode." co rozumiem, że -tam jak na tym schemacie było TSC do 5V podpięte- że zapięcie TSC na stan wysoki (5V) umożliwia sterowanie magistralą adresową i sygnałami odczytu/zapisu w trybie trójstanowym. Jakoś tak.. o ile nic nie popieprzyłem..

Z kolei z tymi wejściami CS to jest chyba tak, że normalnie dwa z nich zazwyczaj pełnią określone role CS0 dla sygnału E (Enable), a CS3 dla sygnału VMA (patrz rysunek/figure 2, str.3), ALE.. jeżeli chce się korzystać z wewnętrznej pamięci RAM/ROM (która jest poukładana w 8 bitowe kawałki jak piszą) to wtedy wszystkie te sygnały CS (a jest ich 6-eść) powinny być przeznaczone WYŁĄCZNIE dla pracy z pamięcią wewnętrzną (patrz str.3 i str.5 z zakładką "Chip selects (CS0-CS5) ).
Krótko mówiąc: gdy chce się korzystać z pamięci zewnętrznej (i adresować za pomocą PIA) to potrzebne są sygnały VMA (CS3) i E (CS0) plus oczywiście R/W. VMA (Valid Memory Address) jako sygnał wyjściowy jest używane do potwierdzenia właściwego adresu dla danego urządzenia (zewnętrznego) na magistrali adresowej, sygnał E uczestniczy w wysterowaniu buforów danych zewnętrznych.
Natomiast gdy operuje się na wewnętrznej pamięci RAM/ROM to zawczasu należy przydzielić wszystkie sygnały od CS0-CS5 tylko do adresowania (czytania i pisania) dla pamięci wewnętrznej. Przy czym jak piszą na str.5 w zakładce "Address Inputs (AO-A1S)" to siedem pierwszych adresów jest przewidziane dla RAM, a 10-sięć jest przewidzianych dla wewnętrznej pamięci ROM.

Pominę tutaj fakt dość skomplikowanego timingu i korzystania z dwóch/trzech sygnałów zegarowych co jest po prostu "kombinacją alpejską" do kwadratu.. Niemniej ciekawa jest obsługa tego procka.. :)

Krótko mówiąc ta dokumentacja, którą podesłał Kolega Phill2k jest całkiem zacna (nie mam tego procka, ale dzięki, dokumentację sobie czytam), bo wszystko w niej jest. No, a jak to wychodzi w praktyce to niestety chyba trzeba by mieć MC6800 żeby sprawdzić ;) Swoją drogą niezły ten procek.. Niby stary, 8-bitowy, ale z takim potencjałem możliwości, że mógłby mu pozazdrościć niejeden nowszy MCU...

Re: MC6800

: piątek 11 lip 2025, 13:37
autor: phill2k
Natknąłem się jeszcze na taką książkę How to Program and Interface the 6800 - https://archive.org/details/How_to_Prog ... 8/mode/2up

Re: MC6800

: niedziela 13 lip 2025, 20:06
autor: j23
phill2k pisze:Natknąłem się jeszcze na taką książkę How to Program and Interface the 6800 - https://archive.org/details/How_to_Prog ... 8/mode/2up

Dzięki za link. W tym pdf'ie to z kolei jest jakby przekrojowo objaśnione jak to się projektowało komputery (albo i nawet proste systemy operacyjne) w latach 80-tych. Bardzo fajna lektura. Coś jakby podręcznik do projektowania komputerów dla szkoły średniej, z przykładami, z pytaniami i z odpowiedziami. Bardzo fajne. Ech... żeby tak człowiek jak ja miał do tego dostęp ze 30, albo i ze 40 lat temu..
Ale lektura niezła.
Dzięki :like:

Re: MC6800

: niedziela 20 lip 2025, 00:46
autor: gaweł
Kolejne dziwności

Czas zapuścić jakiś program w tym procku, więc niezbędne jest odpowiednie narzędzie. Na kompiler przykładowo C, to nie ma liczyć (choć kompilator sdcc chyba generuje na MC6809 – chyba, bo nie pamiętam a chwilowo nie chce mi się sprawdzać, jednak nadal to nie jest ten procek). Więc z narzędziami krucho (jakieś narzędzia można wygooglać, ale często to generuje więcej problemów niż pożytku – albo jakieś starocie albo …) zrobiłem własne.
Posiłkowałem się oryginalną dokumentacją:
m6800_il30.png

i tu nieoczekiwanie wystąpiły dziwności, gdyż jest taka inna książka:
m6800_il31.png

nawet całkiem sensowna (ale w drugiej połowie, bo w pierwszej to jak dla przedszkolaków...), gdzie jest opisana lista instrukcji, przykładowo instrukcja ASR:
m6800_il32.png

W tej pierwszej jest:
m6800_il33.png

instrukcja ASRA oraz ASRB (bez spacji). Po kodach instrukcji (47 hex i 57 hex) widać, że to są te same instrukcje. Obie książeczki są autoryzowane przez Motorolę. To w końcu ze spacją czy bez spacji?
To zjawisko występuje wszędzie, gdzie operandem instrukcji jest akumulator A lub B. Zapis ASR A, ASR B jest wręcz naturalny. Doszedłem do wniosku, że zrobię dualnie: kompilator zaakceptuje oba warianty syntaktyczne.
No i kompiler toleruje wszystko.
m6800_il34.png

Cokolwiek zostanie napisane, kompiler się obroni, nawet opkody się zgadzają.

Re: MC6800

: niedziela 20 lip 2025, 10:53
autor: tapy
gaweł pisze: z narzędziami krucho (jakieś narzędzia można wygooglać, ale często to generuje więcej problemów niż pożytku – albo jakieś starocie albo …) zrobiłem własne.

To prawda, znalezienie czegoś sensownego dla mniej popularnych CPU często graniczy z cudem. Przyznam, że to był jeden z głównych hamulców przed zapoznaniem się z architekturą Zilog Z8000. Kilka lat poszukiwań może zniechęcić nawet najbardziej wytrwałych, a i tak często jedyną drogą jest napisanie własnych narzędzi. Mnie się udało i to w wersji "de luxe" - assembler, linker,... ponieważ w zamierzchłych czasach architektura Z8000 była wspierana przez Linux. Takiego szczęścia nie mają procesory 8-bit lub inne mniej typowe, które posiadały tylko narzędzia napisane przez producentów tych układów w czasach ich produkcji (często dla nich DOS to była pieśń dalekiej przyszłości). Dobrze, że dorobiłeś się takiego programowego szkieletu, które umożliwia Ci pisanie asemblerów, wcześniej dla 8085 a teraz 6800.

Re: MC6800

: niedziela 20 lip 2025, 15:48
autor: gaweł
tapy pisze:Dobrze, że dorobiłeś się takiego programowego szkieletu, które umożliwia Ci pisanie asemblerów, wcześniej dla 8085 a teraz 6800.

W gruncie rzeczy, to 3/4 kodu jest w pełni powielarne: analizator syntaktyczny, słownik zdefiniowanych symboli, obróbka wyrażeń, kompilacje warunkowe, obróbka missingów, czyli uzupełnienie wszelkich adresów etykiet, które wystąpią później czy generowanie EPROM. Jakby się zastanowić, to w tydzień można napisać taki na każdy procek 8-bitowy, potrzebna jest tylko precyzyjna lista instrukcji z opkodami.

Re: MC6800

: wtorek 22 lip 2025, 14:40
autor: j23
gaweł pisze:W gruncie rzeczy, to 3/4 kodu jest w pełni powielarne: analizator syntaktyczny, słownik zdefiniowanych symboli, obróbka wyrażeń, kompilacje warunkowe, obróbka missingów, czyli uzupełnienie wszelkich adresów etykiet, które wystąpią później czy generowanie EPROM. Jakby się zastanowić, to w tydzień można napisać taki na każdy procek 8-bitowy, potrzebna jest tylko precyzyjna lista instrukcji z opkodami.
Tak, słowo "tylko" robi czasem kolosalną różnicę w interpretacji tego co jest darmowe i co wolno, konkludując to wcześniej napisał Kolega Tapy na temat poszukiwań "wolności" w robieniu projektu takich żeby były po prostu zrobione dobrze (jak rozumiem z pewną możliwością elastycznego dopasowania, czy też w celach edukacji, lub przyjęcia określonych standardów czyli wyeliminowania tzw. "monopolu wiedzy"). "Wolność" kosztuje, o czym zapewne twórcy sprzętu i oprogramowania (bigtech) doskonale wiedzą, a pomyśleć, że chodzi tylko o to, żeby z procka wydobyć (zdekodować) instrukcję, która np. (jeśli chodzi o instrukcję MOV) robi coś takiego, że podmienia zawartość docelowej komórki pamięci (target memory cell) na zawartość komórki źródła (source memory cell), innymi słowy myśląc od strony sprzętu to na układach TTL byłby to na początku reset (wyzerowanie komórki docelowej lub całego układu TTL), a potem logiczna operacja AND (na komórce docelowej i źródłowej, lub danych i/o z układów TTL). A w języku assemblera chodzi o to, żeby samemu napisać ileś tam np. takich linijek:

Kod: Zaznacz cały

source equ b
target equ a
mov equ 57 target source

Tzn.nie "ileś tam" linijek, a dokładnie tyle ile procek ma sprzętowo przewidzianych (i nieprzewidzianych) możliwości tzw.opkodów i pamięci.
Ja doskonale rozumiem Kolegę Tapy, bo swego czasu jak próbowałem skonstruować zestaw edukacyjny to właśnie jedną z dużych trudności było to, że na pewnym etapie prototypowania projektu musiałem ustandaryzować pewne sprawy z kodem oprogramowania (żeby prościej było nauczyć programowania), no i właśnie tutaj była rozbieżność i wszelkie możliwe szlabany prawne, bo... jak nie wiadomo o co chodzi to wiadomo...temat rzeka (ale dopiero jak ktoś długo grzebie i próbuje coś konstruktywnego zrobić).
Dlatego warto jest myśleć niestandardowo i zwyczajnie w domowym zaciszu hackować (w pozytywnym słowa znaczeniu), no bo na użytek prywatny póki co dzięki Bogu wolno.. :roll: oraz od czasu do czasu przejrzeć filmiki (dla początkujących w tym temacie) jak np.
https://www.youtube.com/watch?v=xBB1nAUvuqU lub https://www.youtube.com/watch?v=wLbuSk03F5I a potem to już jak leci po tematach szkoleniowych z najlepiej tego Forum. :)
Wracając do tematu projektu zestawu edukacyjnego (który rozpocząłem a nie ukończyłem) to po czasie dochodzę do wniosku, że aby to zrobić całkiem legitnie (w świetle ogólnie przyjętego obecnego prawa) to należałoby:
1. Zrobić własny procek (z układów TTL, albo metodą fotolitografii :roll: :roll: :roll: ) - albo tak jak Kolega Tapy znaleźć właściwy procek ;)
2. Napisać dla procka własny assembler (mam na myśli kompilator języka assemblera)
3. Zaprojektować, przetestować i wykonać prototyp zestawu edukacyjnego
4. Stworzyć lekcje (z przykładami) do nauki na w/w zestawie edukacyjnym.
Mój projekt zestawu edukacyjnego miał na celu dość luźne wprowadzenie do konstruowania własnego hardware lub software w kontekście elektroniki dyskretnej (cyfrowej). No i ja (póki co) zatrzymałem się tak mniej więcej na pkt.1 i pkt.2, a więc wczesny etap projektu...
Jeśli coś pomieszałem (to wtedy proszę Kolegów o konstruktywną korektę), no i przepraszam jeśli to za duża dygresja od głównego tematu tegoż wątku (offtop). ;)

Re: MC6800

: wtorek 22 lip 2025, 21:20
autor: gaweł
To ja, @j23, jestem chyba na 3 punktem w przypadku motorolki, bo kompiler już napisałem a nawet kawałek emulatora.

Re: MC6800

: środa 23 lip 2025, 17:47
autor: gaweł
Kompilator ASM

Prosty kompilator asm dla proca 6800 (prosty, bo program źródłowy ma być kompletny, jest kompilowany i linkowany jednocześnie), wymaga podanie nazwy pliku z programem źródłowym. Sam program źródłowy może zawierać dołączenia innych kawałków źródłowych poprzez dyrektywę include, istnieje możliwość kompilacji warunkowych, w sumie mechanizmy podobne do stosowanych w języku C. Oprócz standardowych opcji programu jak otwórz plik źródłowy, jest możliwość określenia na jaki EPROM jest generowany kod. Motorolka ma tą swoją specyfikę, że „rusza” od końca (ale nie jak procek 8088/8086 → te zawierają instrukcje do wykonania najczęściej skoku). Tu na ściśle określonych adresach w ostatnich 8 bajtach przestrzeni adresowej procka są umieszczone cztery pary adresów do miejsc gdzie jest lokacja akcji reset, przerwania maskowalnego i niemaskowalnego oraz lokacja przerwania programowego SWI. Wygenerowany plik hex musi więc „stykać” swym końcem z końcem przestrzeni adresowej. Przykładowo, jeżeli program mieści się w 2 kB (EPROM 2716), to plik hex musi zawierać dane lokowane od 0 hex do 7FF hex, choć dla procka wygenerowane bajty dotyczą adresacji F800 hex .. FFFF hex. Takich problemów nie ma przykładowo w Z80, czy 8085, gdyż program zaczyna się od 0 i zajmuje ile wyjdzie. Zarówno adresacja samego hex (dla programatora) i adresacją procka są tożsame. W motorolce tak nie ma: adresacja w EPROM (dla potrzeb programatora) nie pokrywa się z adresacją dla procka (no chyba, że generowany jest kod dla EPROM 27512).
m6800_il41.png

Można wybrać układ EPROM, wybranie Auto oznacza, że program wybierze układ o najmniejszej pojemności, by wygenerowany kod się zmieścił. Nie ma obowiązku, by ORG programu wynosił:
  • FC00 hex dla EPROM 2708,
  • F800 hex dla EPROM 2716
  • F000 hex dla EPROM 2732
  • E000 hex dla EPROM 2764
  • C000 hex dla EPROM 27128
  • 8000 hex dla EPROM 27256
  • 0000 hex dla EPROM 27512 (choć ten przypadek jest już bez sensu, bo blokuje lokacje pamięci RAM oraz peryferali).
Całość jest zaprojektowana tak by nazwę kompilowanego programu przeciągnąć i upuścić na formę programu (można ją wskazać również poprzez Open source), jak będą błędy, to je poprawić w źródle i dać Recompile (bez konieczności ponownego wskazywania nazwy pliku).
m6800_il42.png

Przykładowo jest program, którego bajty zaczynają się od adresu F87B hex (F800 hex jak dla 2716 + 123).
m6800_il43.png

Wariant Auto, spowodował, przyjęcie EPROM 2716, gdyż w mniejszym się już nie zmieści.
m6800_il44.png

Dane zawarte w pliku hex (dla programatora) zawierają bajty od adresu 7B hex (to wynika z +123 w ORG), kończą się w okolicach 280 hex, później jest dziura do 7F8 hex, gdzie zapisane są adresy wejść do funkcji przerwań i obsługi reset (całość kończy się na 7FF hex).
m6800_il45.png


Sensowny opis listy instrukcji:
Basics microprocessors and the 6800, 1979 (Bishop).pdf

Re: MC6800

: środa 23 lip 2025, 21:33
autor: j23
gaweł pisze:To ja, @j23, jestem chyba na 3 punktem w przypadku motorolki, bo kompiler już napisałem a nawet kawałek emulatora.

Jak rozumiem @gaweł to jesteś na etapie kompletowania/składania takiego zestawu do samodzielnego wykonania (DIY)? No bo efekty Twoich wcześniejszych prac ma się rozumieć widziałem już tutaj na Forum i są one zaiste imponujące. Skoro już zestaw DIY będzie gotowy to nic tylko pora zacząć kilka prostych lekcji. Nie wiem.. Może na początek proste wprowadzenie do Twojego systemu komputerowego, omówienie podzespołów hardware, następnie składników software i ich zależności w systemie operacyjnym (o ile jakiś system operacyjny będzie). To by było fajne zrobić taki kolejny CA80, tym razem nieco nowocześniejszy i zdecydowanie bardziej zaktualizowany. Trzeba dbać o przyszłe pokolenia naszych naukowców :)
Powodzenia! :like:

Re: MC6800

: piątek 25 lip 2025, 01:15
autor: gaweł
Program źródłowy może być podzielony na pliki, które poprzez dyrektywę include mogą być „scalone” do jednego, który jest kompilowany. Zapis jest następujący:
.include "nazwa pliku”
nazwa pliku może zawierać ewentualnie ścieżkę do pliku. Dopuszczalne są includy w includach, ale rekurencja jest wykrywana, przykładowo:
m6800_il51.png

Poprawne includy, przykładowo (we fragmencie):

Kod: Zaznacz cały

;
          .include     "m6800_const.asm"
;
          .include     "m6800_memory_page0.asm"
;
          .include     "m6800_memory.asm"
;
          .org M2716    ;
Text1  .fcc       '***** zestaw analizowanych instrukcji *****'
Text2  .fcb       '***** mikroprocesora 6800 (MOTOROLA) *****'
Block  .fdb       Text1, Text2
;
nmiserv         ;
    nop                 ;
    rti                 ;
intserv                 ;
    nop                 ;
    rti                 ;
swiserv                 ;
    nop         ;
    rts         ;
resserv                 ;
    ldx   #1024      ;
    lds   #1024         ;
    aba                 ; 1B
;
    adc   a , # Data8   ; 89 <nn>
    adc   a , Var2      ; 99 <nn>
    adc   a , Var12     ; B9 <nnnn>
    adc   a , displ , x ; A9 <nn>
    adc   b , # Data8   ; C9 <nn>
    adc   b , Var2      ; D9 <nn>
    adc   b , Var12     ; F9 <nnnn>
    adc   b , displ , x ; E9 <nn>

finalnie dają:
m6800_il52.png

wygenerował się EPROM 2716
m6800_il53.png

Re: MC6800

: piątek 25 lip 2025, 20:33
autor: jarekz
tapy pisze:
gaweł pisze: z narzędziami krucho (jakieś narzędzia można wygooglać, ale często to generuje więcej problemów niż pożytku – albo jakieś starocie albo …) zrobiłem własne.

To prawda, znalezienie czegoś sensownego dla mniej popularnych CPU często graniczy z cudem(...)

Jak budowałem płytkę z MC6803, to znalazłem w Sieci makroasembler DASM: https://dasm-assembler.github.io/.
Jest przeznaczony m. in. dla MC6803, więc program napisany na MC6800 powinien dać się skompilować do prawidłowego kodu wynikowego.
Dużym atutem użycia DASM-a są oczywiście makroinstrukcje.

Re: MC6800

: czwartek 31 lip 2025, 00:02
autor: gaweł
jarekz pisze:Jest przeznaczony m. in. dla MC6803, więc program napisany na MC6800 powinien dać się skompilować do prawidłowego kodu wynikowego.
Dużym atutem użycia DASM-a są oczywiście makroinstrukcje.

Super, ale ja już zaangażowałem się we własne rozwiązanie.


No więc kolejny krok w zagłębianiu się w procka motoroli. Zmodyfikowałem trochę schemat do postaci:
m6800_il61.png

czyli jest dodany EPROM (lokacja adresowa: C000 hex .. FFFF hex), pamięć RAM (lokacja: 8000 hex .. BFFF hex) oraz przestrzeń portów (lokacja 0000 hex .. 7FFF hex). Trzeba zrobić AND sygnału FI2 z VMA i to potraktować jako MEMRQ (mówiąc żargonem zilogowym). Jako port (w całej przestrzeni portowej) dałem rejestr 74HCT574 z dodanymi na wyjściu LED’ami. Zamiast EPROM dałem emulator EPROM:
m6800_il62.jpg

Nie chciało mi się drutować pamięci RAM, więc wymyśliłem sobie, że będę inkrementować akumulator, zapisywać do portu 74HCT574 w ciasnej pętli bez używania pamięci RAM (bo jej jeszcze nie ma). Jeżeli akumulator będzie inkrementowany, to na oscylku powinno dać się to wszystko obejrzeć, bo przebieg będzie regularny.
Jednak coś poszło nie tak, bo emulator EPROM się wypiął:
m6800_il63.png

Twierdzi, że jest błąd formatu pliku hex. Qrcze, ktoś tu oszukuje, bo oglądając plik hex na oko wygląda poprawnie (choć na piechotę nie liczyłem sum kontrolnych). Trzeba się do tego jeszcze przyłożyć (emulator używałem wielokrotnie, kompiler jest nowy) i trudno zgadnąć kto leci w bambuko.
Jak puścić procka na emulatorze EPROM na śmieciach, to on coś tam robi, choćby mruga diodami LED. Oglądając wyjścia układu 74HCT138 wygląda to sensownie, choć jadąc na śmieciach to trudno coś sensownego powiedzieć: na razie jest śmiesznie: mała dyskoteka na ledach.

Re: MC6800

: czwartek 31 lip 2025, 21:22
autor: jarekz
gaweł pisze:(...)Nie chciało mi się drutować pamięci RAM, więc wymyśliłem sobie, że będę inkrementować akumulator, zapisywać do portu 74HCT574 w ciasnej pętli bez używania pamięci RAM (bo jej jeszcze nie ma)(...)

Ułatwione zadanie miałbyś, używając 6803, bo zawiera on 128 bajtów RAM - w sam raz na trochę zmiennych (na stronie zerowej, czyli o szybkim dostępie) i stos. Że nie wspomnę o innych kwiatkach jak porty we/wy, łącze szeregowe czy timer.
Uwaga zapewne po niewczasie, bo z 6800 zaszedłeś już dość daleko. Rozumiem też, że chodzi o rozpoznanie "klasycznego" mikroprocesora, a nie jego dalszej generacji.
Ja sobie bardzo chwalę 6803. Robiłem na nim w połowie lat 80. pracę dyplomową. Na Politechnice Warszawskiej dominowały wtedy 8080 i Z80, a systemy oparte na Motoroli były rzadkością. Pamiętam, że p. Tuszyński zaprogramował mi EPROM, ale tylko dolne kilkaset bajtów, bo nie wziął pod uwagę, że w Motorolach istotna jest też zawartość "góry" pamięci (adresy FFF8...FFFF), bo tam siedzą wektory przerwań...

Re: MC6800

: piątek 01 sie 2025, 11:28
autor: gaweł
jarekz pisze:Rozumiem też, że chodzi o rozpoznanie "klasycznego" mikroprocesora, a nie jego dalszej generacji.

Dokładnie o to chodzi, beż uproszczeń i ułatwień, bo to daje prawdziwą wiedzę. Taki trochę powrót do korzeni. Motka to był mój pierwszy procek, ale nie miał farta i nie doczekał się jakiejkolwiek realizacji, ustąpił z80.
Teraz to są jedynie eksperymenty by bardziej zrozumieć. Później zrobię porządne PCB i nie będzie istniał jakikolwiek problem z drutowaniem.