[Z80] Superelwro

Kącik dla elektroniki retro - układy, urządzenia, podzespoły, literatura itp.
Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

[Z80] Superelwro

Postautor: gaweł » niedziela 20 paź 2019, 05:23

SUPERELWRO 256k

Z korespondencji z Nataszą (cyt): „superelwro też ciekawe,
dziękuje za te opisy, może wrzuć to na chomika czy microgeeka,
niech ludzie popatrzą jakie fajne rzeczy można powymyślać, co z
oprogramowaniem do tego? szczególnie ciekawe jak zrobiliście izolacje
użytkowników i ten pięcio-tasking
”.
Po prostu opisałem jej pewną historię związaną z konstrukcją czegoś,
co roboczo nazywało się SUPERELWRO 256k. Ta konstrukcja to spory
kawałek ciężkiej pracy. Jej prośba/sugestia ma tu kluczowe znaczenie,
by ocalić ją od zapomnienia, skazania na niebyt i zapomnienie.


se256a-ilu00.jpg


Geneza i rys historyczny

Tak przyglądając się zainteresowaniu na forum „starymi” mikroprocesorami, postanowiłem ocalić swoje ukochane dziecko z bardzo dawnych lat od zapomnienia i śmierci. By je przedstawić, musiałem zrealizować trochę „reverse engineering”, ponieważ historia pochodzi z czasów wręcz średniowiecznych → połowa lat 80-tych XX wieku. Wtedy nie było komputerów, a projekty powstawały na papierze. Zachowało mi się trochę notatek, choć zapewne nie jest to precyzyjne określenie i należałoby napisać: zachował mi się egzemplarz dokumentacji do konstrukcji, który został przekazany zleceniodawcy
se256a-ilu01.jpg
z adnotacji na dokumentacji widać, że było wykonanych 5 egzemplarzy, jeden z nich jest mój.
se256a-ilu02.jpg
Zachowała się sztuka PCB (choć jak się przekonałem przy reverse engineering, nie jest to sprawny egzemplarz). Mówiąc inaczej, była to studencka robótka na zlecenie czyli chałtura. Z wyrazem chałtura może kojarzyć się jakaś praca „na odwal”. Nic z tych rzeczy, jest to realizacja w najwyższych dostępnych w danej chwili standardach. Dzisiaj pewne rzeczy zrobiłbym inaczej. Wsparcie komputerów po pierwsze znacząco skraca czas projektu PCB i gwarantuje brak pomyłek w procesie technologicznym. Pliki gerberów tworzymy sami, więc nikt już nie zepsuje projektu. Jednak kiedyś błędy i pomyłki były codziennością, takie były czasy.
se256a-ilu03.jpg
Jest to dosyć dziwna i pokrętna historia, jednak by ją zrozumieć niezbędny jest drobny rys historyczny.
Należy zacząć od tego, że dawno, dawno temu był produkowany komputer biurowy o nazwie Elwro. Było to takie ćwierć tonowe biurko, z klawiaturą, drukarką i monitorem. W zestawie były jeszcze dwa napędy dyskietek 8 calowych. Właśnie wtedy miałem okazję dotknąć takich dyskietek, nigdy później już mi się nie zdarzyło. Ten komputer był na bazie procesora 8080 produkowanego w ZSRR.
Wyglądało to mniej więcej tak:
se256a-ilu19.jpg

Ponieważ na świecie pojawiły się bardziej nowoczesne procki, powstał pomysł, by zastąpić trochę bebechów z takiego komputera na znacznie bardziej nowoczesne. Bardziej nowoczesnym od 8080 był rzecz jasna Z80. Tak dosyć pokrętną drogą temat trafił do mnie i dałem się namówić na eksperyment pod tytułem Super Elwro. Koncepcja była taka, by zastąpić w tym ćwierć tonowym biurku przede wszystkim płytę główną komputera zostawiając to, co się nadawało. A było tam tego tak trochę. Kontrolery do flopów → zostały, układ generacji obrazu na monitor → został, klawiatura → zostaje, drukarka → zostaje. Wymianie ulega tylko to co najważniejsze → jednostka centrala.
Dokładniej, to „mój zespół był dwuosobowy”. Setki godzin przegadanych nad koncepcją zaowocowało jakimś tam schematem, rzecz jaska na papierze. Dostaliśmy niezbędną dokumentację by wpasować się w istniejące realia, stąd są takie a nie inne niektóre rozwiązania, jak choćby rozszycie sygnałów na złączu CANNON 84. Idea zawierała jeszcze znaczące rozszerzenie funkcjonalności, czyli stworzenie maszynerii wielostanowiskowej. W sumie ta konstrukcja mogła udźwignąć pięciu użytkowników: jeden przy monitorze centralnym i czterech „powieszonych” na łączach szeregowych. Przetwarzanie na każdym stanowisku pracy wymaga jedynie monitora (by cokolwiek widzieć) oraz klawiaturę (by cokolwiek móc powiedzieć do komputera). Projekt PCB robiliśmy 3 miesiące stojąc po kilkanaście godzin przed deską kreślarską z przypiętymi dwoma arkuszami kalki technicznej. Kalka pokratkowana co 2,54 mm o wielkości arkusza A0 (kalki wykonała kreślarka przypięta do uczelnianej ORDY 1305). Kratki odzwierciedlały półraster (50mils), stąd cały projekt jest „półrastrowy”.
Uparliśmy się (ze współtwórcą), by projekt zamknąć na jednej płycie (w Elwro były stosowane płyty o tym samym gabarycie). Wymagało to pewnego wysiłku, bo zmieścić duże kilkadziesiąt układów scalonych na jednym PCB było sporym wyzwaniem. Jak się okazuje, rzeczy prawie niemożliwe do zrealizowania dają się zrealizować. PCB została zaprojektowana w sposób „bardzo ciasny”.
se256a-ilu04.jpg
Powierzchnia laminatu prawie cała jest zajęta przez elementy, tak, że praktycznie wszystkie układy są ze sobą na styk. Z tym związane jest pewne zdarzenie, które należy traktować humorystycznie: niektóre układy wymagały „korekty szlifierką” bo im dupki wystawały poza podstawki, czyli naruszały obszar innych układów.
Jak projekt był gotowy, to należało wykonać dokumentację technologiczną. Mój politechniczny kolega wykreślił całość w tuszu w powiększeniu 4:1. Normalnie szacun za wykonaną pracę, zrobić cyrklem kilka tysięcy kółek w tuszu o średnicy kilku milimetrów. Ta dokumentacja powinna gdzieś znajdować się na chacie, może kiedyś się odnajdzie. Taka „dokumentacja” szła do zakładu, gdzie robili PCB i jakiś pracownik poprzez digitajzer przenosił rysunek do maszynerii od PCB. Robił to jak robił, mógł coś pominąć, się pomylić i zrobić mnóstwo innych błędów. Powstawał wtedy egzemplarz PCB do weryfikacji (i to jest ten, który mi się zachował). Po określeniu poprawek, powstawały PCB „produkcyjne”.
Moja rola, wraz z kolegą, sprowadzała się do zaprojektowania, wykonania i technicznego uruchomienia prototypu. I to zostało zrobione. Poruszona przez Nataszę kwestia oprogramowania to zadanie dla innego zespołu. Maszynerią miała zarządzać jakaś adaptacja systemu CP/M. Nie znam dalszych kolei losu maszyny SE256. Można jedynie się domyślać, że pojawienie się w Polsce w drugiej połowie 80-tych lat komputerów PC XT stało się przeszkodą na drodze SE256 i zapewne wtedy sprawa się rypła i rozwój SE256 upadł. Trudno konkurować z takim sprzętem, miał większą moc obliczeniową i można było uruchamiać większe programy. Tu nie da się przeskoczyć 64kB na wszystko, a realnie, odejmując kawałek na pamięć ekranu monitora, jakiś kawałki obsługi systemowej pozostaje jakieś 48kB na użytkownika.

Koncepcja
Do procesora Z80 zostało włożone 256kB pamięci dynamicznej. Wtedy układy typu 4164 lub 41256 stawały się standardem. Co można zrobić w 256kB pamięci w przestrzeni Z80? Powołać kilku użytkowników, którzy mieliby swój własny region w fizycznej pamięci DRAM i by sobie wzajemnie nie przeszkadzali. Zestaw 4 banków pamięci z układów 4164 dawał sumaryczną przestrzeń adresową 256kB (można było 4 banki pamięci zastąpić jednym bankiem z układów 41256). Pamięć DRAM o adresie liniowym 0 .. 256k została podzielona na:
se256a-ilu05.png
  • 0k .. 48k – obszar przewidziany dla użytkownika 1,
  • 48k .. 64k – obszar systemu operacyjnego,
  • 64k .. 112k – obszar przewidziany dla użytkownika 2,
  • 112k .. 160k – obszar przewidziany dla użytkownika 3,
  • 160k .. 208k – obszar przewidziany dla użytkownika 4,
  • 208k .. 256k – obszar przewidziany dla użytkownika 5.
System operacyjny, umieszczony w obszarze 48k .. 64k, był wspólny dla wszystkich, każda realizacja programu z tego obszaru sprzętowo trafiała na lokację 48k .. 64k. Realizacja programu z punktu widzenia adresowego z obszaru 0 .. 48k trafiała w zależności od aktywowanego użytkownika w różne miejsca w sumarycznej przestrzeni liniowej. Efektem tego było to, że nie istniała konieczność wymiany zawartości pamięci przy przełączaniu użytkowników a elektronika obsługi pamięci dynamicznej rozdzielała obszary użytkowników. Nie było technicznej możliwości, by program jednego użytkownika „pojechał” po innym.

Schemat SE-256
jest następujący:
se256a-ilu06.png
se256a-ilu07.png
se256a-ilu08.png
se256a-ilu09.png
se256a-ilu10.png
se256a-ilu11.png
se256a-ilu12.png
se256a-ilu13.png
se256a-ilu14.png
se256a-ilu15.png
se256a-ilu16.png
Do tego jest PCB. Nie jest to dosłowna kopia. Posiłkując się posiadanym egzemplarzem PCB i wykorzystując współczesne narzędzia, projekt został lekko zoptymalizowany. Zmiany wynikają przede wszystkim z obecnie dostrzeżonych pomyłek (o których będę pisać). Nie jest dobrym pomysłem powielać stare błędy, więc obecny opis został skorygowany by „promować” właściwe wzorce.
Rysunki PCB są następujące:
TOP
se256a-ilu17.png
BOTTOM
se256a-ilu18.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Expert
Expert
Posty: 978
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [Z80] Superelwro

Postautor: tasza » niedziela 20 paź 2019, 19:06

gaweł pisze:Projekt PCB robiliśmy 3 miesiące stojąc po kilkanaście godzin przed deską kreślarską(...)

Ale tak od razu? na żywca? Nie było fazy (przepraszam za korposlang) research & development? Jakieś przymiarko eksperymenty, testy układowe etc/itd?
gaweł pisze:Uparliśmy się (ze współtwórcą), by projekt zamknąć na jednej płycie (w Elwro były stosowane płyty o tym samym gabarycie). Wymagało to pewnego wysiłku, bo zmieścić duże kilkadziesiąt układów scalonych na jednym PCB było sporym wyzwaniem

No i tu się właśnie zastanawiam, jak na takie podejście patrzysz z perspektywy lat? I bagażu doświadczeń, także tych życiowych? Czy warto było wtedy walczyć o upakowanie konstrukcji na jednej płycie, o ile nie zostało postawione w tym zakresie twarde wymaganie?. Tak myślę, że to wydłużyło czas projektowania, ale energia poszła nie tyle w spełnienie założeń (tych stricte technicznych) ale w chęć uzyskania kompaktnej konstrukcji, choć to odgórnym wymogiem nie było, a raczej waszą własną inicjatywą.

Mając taką "komodę" to aż się prosi o modularyzację, i ewentualny serwis łatwiejszy i ... jest otwarte pole do dalszych modyfikacji, podmian bloków funkcjonalnych i tak dalej.

Aaaa i jeszcze pytanko o oprogramowanie - czy użytkownicy mogli się jakoś ze sobą komunikować, ale na poziomie sesji z maszyną (jakieś wiadomości? etc/itd). Domniemywam, że wymiana danych mogła następować via pliki w pamięci masowej, ale ja myślę o jakimś rozwiązaniu bardziej online?

Bardzo fajną zabawkę zmajstrowaliście. Taki jakby mainframe.

O, a rzeczone Elwro to wersja 500: :arrow: https://pl.wikipedia.org/wiki/Elwro_500 kawał komputera, że tak ujmę.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » niedziela 20 paź 2019, 23:50

tasza pisze:Ale tak od razu? na żywca? Nie było fazy (przepraszam za korposlang) research & development? Jakieś przymiarko eksperymenty, testy układowe etc/itd?

Tu mam na myśli sam projekt PCB bazujący już na istniejącym schemacie. Co do ...żywca... to poniekąd tak, ale przymiarko-eksperymenty oczywista były. Ta faza trwała jakieś od pół roku do roku. Nawet narzędzia trzeba było sobie jakieś sprawić, stąd kompilator asm na Z80 (pierwszy był implementacją na ODRA1305 - miał jedną wadę, trzeba było kod z wydruku przeklepać, bo ODERKA mogła jedynie wydrukować), ten który pokazałem ci to już po przeprowadzce na PC. Niektóre fragmenty i rozwiązania były już obcykane, jak przykładowo technika obsługi pamięci dynamicznych. Była już jedna własna/kooperacyjna konstrukcja za sobą z Z80 w roli głównej. Miała ksywkę GAPA - inicjały moje i kolegi, niestety od GAPA nie zachowało się absolutnie NIC. Rozwiązania dotyczące przykładowo dogenerowania wait-state są wystarczająco dokładnie opisane w literaturze, więc zostało tylko uwierzyć w słowo pisane i zastosować (bo w GAPA to chyba czegoś takiego nie było). Filozofia typu IEI i IEO od przerwań była już obcykana w GAPA. Zostało trochę logiki kombinacyjnej, ale to już można przećwiczyć albo na piechotę albo na drobnym układzie zmontowanym niejako w powietrzu.

tasza pisze:No i tu się właśnie zastanawiam, jak na takie podejście patrzysz z perspektywy lat? I bagażu doświadczeń, także tych życiowych?

Zawsze warto podnosić poprzeczkę i pokonywać bariery. Raz się uda innym razem nie. Inaczej to można popaść w rutynę i marazm. Widzisz, kiedyś mi się chciało, nawet bardzo. Później trochę mniej a ostatnio przestało. Przez ostatnie 10 lat to nie zrobiłem nic nowego, nawet infinity to wynalazek sprzed 10 lat. Jednak od jakich 2 lat pokonuję swoją niechęć i zaczyna mi się chcieć, czasami nawet bardzo. Także reasumując: zawsze warto, dociekanie może być sensem istnienia.


tasza pisze:Aaaa i jeszcze pytanko o oprogramowanie - czy użytkownicy mogli się jakoś ze sobą komunikować, ale na poziomie sesji z maszyną (jakieś wiadomości? etc/itd). Domniemywam, że wymiana danych mogła następować via pliki w pamięci masowej, ale ja myślę o jakimś rozwiązaniu bardziej online?

To pytanie raczej do software department. Z technicznego punktu widzenia jest to możliwe. Wystarczy stworzyć ekstrakod czy inną funkcję systemową i przewlec komunikat przez ostatnie 16kB pamięci, które zawsze było wspólne dla wszystkich.


tasza pisze:kawał komputera, że tak ujmę.

Napisałem, że to było ćwierćtonowe biurko ;)

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » poniedziałek 21 paź 2019, 17:10

CPU

se256b-ilu00.jpg


Opis konstrukcji zacznę od elementu najważniejszego, jednostki centralnej. To ten element determinuje wszystko, co się dzieje w okolicy. Tu istotnym elementem jest „napęd” dla procka. Jak wiadomo, sam procek wymaga pojedynczego sygnału taktującego, który trochę odstaje od standardów układów TTL. Zmusza to do zastosowania niewielkiego wsparcia w wykonaniu tranzystora. Jednak wcześniej musi być wygenerowany sygnał zegarowy. W tym wypadku wykorzystany jest układ ze stajni INTEL'a o symbolu 8224. Znawcy architektury procka 8080 doskonale wiedzą, co to za układ. W systemie 8080 spełnia on kilka funkcji. W kooperacji z Z80-CPU nie wszystkie jego możliwości są wykorzystane. W tym wypadku główną atrakcją jest generowanie sygnału zegarowego oraz sygnału RESET. Jest jeszcze jeden argument przemawiający za użyciem tego rozwiązania. ELWRO wyświetlało obraz na monitorze, który był napędzany sygnałem zegarowym o częstotliwości 18MHz. Ten element musiał zostać zachowany, więc generowany jest sygnał o tej częstotliwości (na schemacie zaetykietowany jako FSYNC i wychodzi na złącze CANON84 by napędzać moduł obsługi monitora).
se256b-ilu01.png
Na wyjściu OSC tego układu jest przebieg o częstotliwości wynikającej z zastosowanego rezonatora kwarcowego. Sam układ 8224 strasznie w środku kombinuje by wypracować dwufazowy sygnał zegarowy dla procka 8080, ale my te jego kombinacje mamy głęboko w... Ważne jest to, że na FI2TTL jest sygnał w standardzie układów TTL w dodatku o częstotliwości podzielonej przez 9 (chyba, jakoś mi uleciało z pamięci, kiedyś wiedziałem). Tu zaprzątnęła mi uwagę taka jedna rzecz... dlaczego te FI2TTL (czyli jakieś 2MHz) jest doprowadzone do licznika dzielącego przez 2 a wynik nie jest spożytkowany w żaden sposób – zagadka.
se256b-ilu02.png
No ale może nie warto marnować czasu na rozkminy... tak było... tak pozostało. Sygnał FI2TTL wchodzi do reszty układu jako sygnał zegarowy dla 8253 – intelowego układu CTC. Natomiast sprawa z sygnałem OSC (18MHz) jest prosta jak budowa cepa. Te 18MHz wchodzi na licznik i ta częstotliwość jest dzielona przez 4 (wyjście QC) i jako 4,5MHz staje się sygnałem zegarowym dla procka, znaczy nie tak od razu, wymaga wsparcia. Te wsparcie to negator (74HCT04) z dodatkowym tranzystorem. Jego zadaniem jest wyostrzenie zbocza i podciągnięcie amplitudy. Kolejną cechą intelowego generatora jest obsługa sygnału RESET. Co prawda jego logika jest trochę pokrętna, ale przy pomocy jednego negatora daje się sprowadzić na właściwe tory. Poza tym, w całej konstrukcji jest potrzebny sygnał RESET, który jest aktywny poziomem zera (jak we wszystkich układach ZILOGA i jakichś tam przerzutników → na schematach ma etykietę RESET) oraz aktywny poziomem jedynki na potrzeby układów intelowych (jak DMA czy CTC → na schematach ma etykietę RES8237). Reasumując chwyt z układem 8224 załatwił kilka pieczeni na jednym ogniu.
se256b-ilu03.jpg
Takim bliskim towarzyszem dla Z80-CPU jest układ obsługi DMA. Zastosowany jest scalak intela 8237. Pochodzi co prawda z konkurencyjnej stajni, co wcale nie oznacza, że nie jest możliwa ich współpraca. Wystarczy niewielka perswazja i możliwe jest porozumienie. Gdyby chodziło o jakikolwiek inny układ peryferyjny intela, ot choćby słynny 8255, to dało by się jakoś wysterować. W przypadku układu DMA, który współistnieje z procesorem w pełnej symbiozie, niezbędny jest tłumacz. Procesor komunikując się z resztą świata używa wyrazów: RD, WR, MEMRQ oraz IORQ. Układ DMA posługuje się innym slangiem, używa: REMR, MEMW, IOR i IOW. Niby mówią o podobnych rzeczach, ale wyrazy takie jakieś inne. Z drugiej strony, inne pakiety ELWRO, rozumieją tylko dialekt intela, więc na zewnątrz pakietu SE256 konieczny jest standard intela.
se256b-ilu04.png
Bazując na czterech bramkach 74HCT32, zrealizowane jest tłumaczenie z dialektu ziloga na dialekt intela. Wchodzi to na łącznik trójstanowy 74HCT244 (U113B), który jest sterowany (w sensie 3-stanu) sygnałem pochodzącym od zilogowoego procka dotyczącym przyznaniu dostępu dla DMA. Te intelowe sygnały sterujące po logicznym wzmocnieniu (a właściwie odcięciu wnętrza pakietu od złącza na świat) przez U112B (wysterowany na stałe) wychodzą na złącze CANNON84. Gdyby nawet ktoś chciał nam bruździć z zewnątrz, to „pod prąd” nie pojedzie. Podobnie, sygnały intelowe generowane przez DMA, są tłumaczone przez zespół bramek 74HCT08 na sygnały zilogowe. Po przejściu przez łącznik trójstanowy (U112A) sterowany sygnałem aktywacji DMA, współistnieje ze sterowaniami procesora. Te sterowania, po nabraniu „mocy” dzięki układowi U113A (wysterowany na stałe) sterują pracą wszystkiego w obrębie pakietu. Sterowanie wybranych łączników trójstanowych jest wzajemnie wykluczające się (zadbał o to negator U105F).
se256b-ilu05.jpg
Ta para, Z80-CPU i 8237, wspólnie działa na rzecz reszty układu. Oprócz sygnałów sterujących, które wymagają translacji, mają wspólną szynę danych i adresową (w pełni).
se256b-ilu06.png
Łączniki trójstanowe U102 i U103 wysterowane na stałe wzmacniają sygnały szyny adresowej. Wszelkie zagrywki między CPU a DMA są po stronie CPU_An i jako sygnały An wychodzą na wszystkie układy. Podobnie ma się sprawa z szyną danych. Tu jest układ U106 (74HCT245) , który już jest sterowany w sensie aktywacji i kierunku pracy. Jeżeli jest realizowana instrukcja typu OUT na DMA, to dane jakoś trafią do 8237 (mają wspólną szynę danych jako CPU_Dn) i przy okazji dane pójdą poza łącznik 74HCT245 (U106) na pozostałe układy. To nie jest problem, niech sobie idą. Gorzej sprawa przedstawia się w przypadku instrukcji IN z DMA. Jednocześnie na szynę danych do procka będą orać łącznik U106 oraz DMA. By rozstrzygnąć powstający konflikt, układ 74HCT245 musi się zamknąć. W stanie transmisji do DMA, sygnał CS8237 odpowiada zeru logicznemu, po negacji jest jedynką, co skutecznie zamyka mu buzię. W każdej innej sytuacji wolno mu się wtrącać. Słowo wyjaśnienia do sterowania kierunkiem pracy. Rzeczą normalną, jest, że przy odczycie danych, łącznik musi pracować tak, by dane doszły do procka. Stąd w sterowaniu jest sygnał RD (logiczne zero w operacjach odczytu). Jednak to nie wyczerpuje wszystkich możliwych kombinacji. Z dokumentacji do procka:
se256b-ilu07.png
Przy przyjęciu przerwania, występuje niecodzienna sytuacja: jest cykl M1 z urządzenia (nie ma sygnału RD). Stąd bramka U110A obrabia sygnał RD i sygnał M1. Ta kombinacja pozwoli właściwie określić kierunek dla 74HCT245 już w każdej sytuacji.
se256b-ilu08.jpg
I tak mamy parę wspólnie zarządzającą całą resztą świata.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Expert
Expert
Posty: 978
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [Z80] Superelwro

Postautor: tasza » poniedziałek 21 paź 2019, 21:14

A powiedz proszę, czemu poszliście w kostkę 8237? Deficyt Z-80 DMA czy inne ku temu przesłanki były?
Od jednego ludka u nas na Hucie słyszałam, że DMA Ziloga to była swego czasu spora i droga egzotyka, mniej popularny u nas niż sam CPU, który jednak w sporych ilościach docierał...
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » poniedziałek 21 paź 2019, 22:10

Twój ludek ma rację. Masz pierwszą połowę lat 80-tych, tego typu komponenty to w większości prywatny import, który później trafiał na wolumen, w sklepach tego nie dało się kupić. Wolumen rządzi się swoimi prawami, coś co ma zejście, będzie dostępne, więc układy CPU, PIO, SIO były dostępne bez większych problemów. Na CTC czasami trzeba było zapolować, natomiast DMA ... to egzotyka. Właściwie to nie jest dziwne. Popatrz, ile jest konstrukcji bazujących na Z80 a w ilu jest stosowane DMA?
Ten układ miał bardzo specyficzne zastosowanie. Sens jego użycia jest wtedy, gdy masz długą i powolną transmisję danych a takim dobrym przykładem jest właśnie flop.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » poniedziałek 21 paź 2019, 22:29

Zarządzanie pamięcią
se256c-ilu00.jpg

Ważnym elementem w konstrukcji jest obsługa pamięci, każdej pamięci. Wiele elementów jest ze sobą powiązanych i trudno jest wskazać prostą ścieżkę przepływu sterowań. Zagadnienie ma raczej charakter iteracyjny, iteracyjny w sensie pojęciowym. Przede wszystkim wyjaśnienia wymaga sens istnienia jednobitowego przerzutnika, którego stan znacząco wpływa na działanie logiki kombinacyjnej obsługującej pamięć.
se256c-ilu01.png
Ten przerzutnik (U414A), jest resetowany sygnałem RESET (tym zilogowym ze stanem aktywnym 0) a ustawiany sygnałem zapisu do pewnego rejestru 8-bitowego. Jego wyjście (jako nie Q), określane jako sygnał boot, wchodzi jako argument do logiki kombinacyjnej. Bramka U407B generuje sygnał określający, czy realizowany jest dostęp na adres powyżej 48k. Jeżeli A14=1 i A15=1 → wyjście bramki = 0 i oznacza sięganie powyżej 48k. Jeżeli jest to dostęp do pamięci sygnalizowany sygnałem MEMRQ=0 (za negatorem U408A=1), jest to faza boot=1 (rozruchowa), realizowany jest dostęp do pamięci poniżej 48k (wyjście bramki U408B=1), nie jest to cykl odświeżania (FRSH=1), to zawsze jest generowany chipselect do pamięci EPROM.
se256c-ilu02.png
W przypadku sięgania wyżej (>=48k) realizowany jest inny dostęp do pamięci.
se256c-ilu03.png
Wykonany zostaje typowy cykl obsługi pamięci DRAM (wygenerowanie sygnału RAS i CAS). W fazie rozruchowej dostępne jest jedynie 48k pamięci DRAM w lokacji powyżej 48k oraz EPROM. Sam EPROM jest ulokowany w przestrzeni adresowej od 0 (w rzeczywistości będzie widoczny jako kilka kopii od 0 do 48k). Zadaniem programu zawartego w EPROM jest przepisanie się do lokacji powyżej 48k i przejście tam z wykonaniem programu. Będąc już we właściwym miejscu należało wykonać instrukcję OUT do rejestru U401 (74HCT373). Wpisując tam 0x00 uzyskiwana jest standardowa „konfiguracja” zarządzania pamięcią.
se256c-ilu04.png
Ten zapis (CS373=0) jest połączony z przestawieniem przerzutnika boot (na nie Q=0). To odcina już obsługę pamięci EPROM (gdy boot=0, wyjście U409B=1 bez względu na resztę). Od tej chwili obsługa pamięci dynamicznej ulega zmianie. W całej przestrzeni adresowej procesora znajduje się pamięć DRAM.
se256c-ilu05.png
Znaczenie wspomnianego rejestru 74HCT373 (U401) jest następujące: zawiera dwa 4-bitowe zestawy rozszerzenia adresowego. To rozszerzenie jest dosumowane (arytmetycznie) przez sumator 74HCT83 (U403), jednak wcześniej przez układ 74HCT157 (U402) jest wyselekcjonowany jeden zestaw 4-bitowy (górna lub dolna połówka). Przełączanie połówek jest realizowane sygnałem dostępu dla DMA (BUSACC=1 oznacza pracę procesora, =0 oznacza tryb DMA). Pozwala to na realizację programu jakiegoś użytkownika i jednoczesną transmisję w tle danych dla innego użytkownika (w szczególnym przypadku może być ten sam).
se256c-ilu06.png
Tu ważny jest jeszcze jeden sygnał sterujący: sygnał G w 74HCT157 (pin 15). Rysunek pokazuje sygnały dla dostępu powyżej 48k. Sygnał G=1 (w 74HCT157) wyłącza go i na wyjściu są same zera. To implikuje dosumowanie rozszerzenia adresowego=0, czyli bez względu na dane zawarte w rejestrze, zawsze nastąpi dostęp do fizycznie tej samej lokacji w przestrzeni adresowej DRAM.
se256c-ilu07.png
Obsługa pamięci dynamicznej w sensie generacji RAS, CAS, to już typowa klasyka. Sygnał MEMRQ po przejściu przez opornik 33Ω staje się sygnałem RAS. Każdy dostęp do pamięci (czy to odświeżania, czy normalny) generuje sygnał RAS.
se256c-ilu08.png
Natomiast sygnał CAS jest generowany jedynie w przypadku prawdziwego dostępu do pamięci i robi to bramka U110D (czyli jeżeli wystąpi zapis CPU_WR=0 lub odczyt CPU_RD=0). W zależności co daje sumator, wybierany jest bank pamięci 4164. Zespół układów 74HCT157 (U405, U406) multipleksuje szynę adresową (daje 8 linii adresowych z 16 możliwych). Tyle wystarcza dla układów 4164, banki są rozdzielone sygnałami CAS0 .. CAS3. Zastosowanie pamięci 41256 wymaga dodania jednego adresu i jest on wypracowany przez U415 (dla pamięci 4164 nie ma on żadnego znaczenia). Tu, realizując reverse engineering, zauważyłem własną niedoróbkę. Jeżeli ma być zastosowana pamięć typu 41256, to każdy CAS ma trafić do tego samego banku (bo jest jeden). Dodałem dwa jumperki przełączające sygnały. W oryginale było, że A16* i A17* trafia bezpośrednio na wejścia A i B w 74HCT138, co oznacza, że układ zawsze będzie rozdzielał sygnały CAS na poszczególne fizyczne banki. Pozbywając się wstydu należy określić to jako niedoróbkę. Zapewne główne testy były realizowane z pamięciami 4164, wtedy wszystko by działało OK. Z drugiej strony test z 41256 był zrealizowany, zapewne był niepełny, bo sprawa by wyszła.
Ta cała zadyma z adresami jest tylko i wyłącznie po to by:
se256c-ilu09.png
zadowolić całą bandę układów pamięci dynamicznych. Bank 0 (U421 .. U428) to układy typu 41256. Pozostałe banki to układy 4164. Różnica między układem 4164 a 41256 dotyczy jednego pinu (pin 1, pozostałe są zgodne). Tam, gdzie 4164 na nóżkę no connect, w 41256 występuje dodatkowy adres. Fizycznie w bank 0 może być włożony zestaw 4164 lub 41256. Pozostałe banki są już dedykowane wyłącznie dla 4164. Tu warto zauważyć, że RAS trafia jednocześnie do wszystkich układów (wszystkich banków). Cykl odświeżania (bez CAS) jest realizowany we wszystkich bankach jednocześnie. Normalny dostęp dotyczy już tylko wybranego banku.
se256c-ilu10.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » wtorek 22 paź 2019, 21:37

Brakujący element

Opisując obsługę pamięci tak, jakoś … umknęło mi jedno zagadnienie: poprawny adres do odświeżania pamięci dynamicznej. Tak się składa, że Z80-CPU ze sobie tylko znanych powodów generuje 7-bitowy adres do odświeżania pamięci. Dlaczego? To już zostanie tajemnicą twórców. Pomimo „kulawego” rozwiązania jakoś trzeba sobie radzić: skoro Mahomet nie chciał przyjść do góry, góra przyszła do Mahometa. Mówiąc po polsku: dorobimy brakujący bit na szynie adresowej. Z dokumentacji do układów 4164 (jak i 41256) wynika, że wymagany przez te układy adres jest 8-bitowy. To pozwala zastosować w systemach z Z80 nawet pamięci 41256, choć pierwsza sugestia, jaka przychodzi do głowy sugeruje, że ta pamięć będzie wymagać 9-bitowego adresu do odświeżania. Okazuje się, że rzeczywistość zadbała już o ważne szczegóły i o pewne detale nie należy już walczyć. W jaki sposób 41256 odświeża się bazując na 8-bitowym adresie? A jakie to ma znaczenie, ważne jest to, że wymaga 8-bitowego adresu.
Rozwiązanie nie należy do skomplikowanych. Prosty automat synchroniczny, taktowany sygnałem żądania odświeżenia zapamiętuje stan linii adresowej A6. Bit A6 wynika z tego, że Z80 inkrementuje 7 bitów adresu, czyli A6 jest najstarszym inkrementowanym adresem. Przerzutnik U111A zapamiętuje stan linii A6 w ostatniej operacji odświeżania. Ponieważ zastosowany przerzutnik D reaguje na wpis dodatnim zboczem, natomiast sygnalizacja cyklu odświeżania jest stanem zera logicznego (niejako zachodzi zbocze z 1 na 0 → zbocze ujemne), w torze znajduje się bramka U410C robiąca za negator.
se256d-ilu01.png
Drugi przerzutnik, robiący za dwójkę liczącą, zmieni stan, jeżeli zaistnieje odpowiednia zmiana na linii adresu A6. Ten drugi przerzutnik (U411B) odzwierciedla linię A7 w adresie do odświeżania pamięci. Pozostało jedynie „podmienić” ten bit w ściśle określonych momentach. To realizuje układ kombinacyjny zbudowany na bramkach. Można prześledzić jego działanie: dla RFSH=1 (dostęp do pamięci) A7* jest dziedziczony z oryginalnej szyny adresowej, dla RFSH=0 (odświeżanie) A7* pochodzi z wyjścia Q przerzutnika U114B.
Uważny czytelnik może dostrzec, że A7* jest używane w wielu miejscach, pozornie sprzecznych z nasuwającą się logiką:
  • wychodzi na złącze do pozostałych pakietów,
    se256d-ilu02.png
  • bierze udział w generowaniu sygnałów typu chip select do peryferali,
    se256d-ilu03.png
Wyjaśnienie jest proste, A7* jest tożsame z A7 w każdej sytuacji z wyjątkiem odświeżania pamięci. Wychodząc na zewnątrz w operacjach zapisu lub odczytu z pamięci „jest sobą”. W generowaniu sygnałów aktywacji do portów również „jest sobą”. Nic nie zakłóca realizacji określonych działań, nie ma to żadnego znaczenia w wymienionych sytuacjach a jedynym powodem takiego rozwiązania jest uproszczenie ścieżek na PCB.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony sobota 26 paź 2019, 21:06 przez gaweł, łącznie zmieniany 1 raz.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Expert
Expert
Posty: 978
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [Z80] Superelwro

Postautor: tasza » wtorek 22 paź 2019, 22:15

W nawiązaniu do siedmiobitowego adresu odświeżania: :arrow: https://retrocomputing.stackexchange.co ... -increment
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » środa 23 paź 2019, 02:35

tasza pisze:W nawiązaniu do siedmiobitowego adresu odświeżania: :arrow: https://retrocomputing.stackexchange.co ... -increment

No niby tak. Na ten temat napisano tysiące słów, ale, sama przyznasz: albo to dziwactwo albo krótkowzroczność. Ale cóż, jest jak jest, pozostało się dostosować.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » czwartek 31 paź 2019, 21:36

Peryferale
se256f-ilu00.jpg


Rozwiązanie układów peryferyjnych to aplikacja układu CTC (8253), który generuje sygnał taktujący dla układów transmisji szeregowej Z80-SIO (są dwa układy). Dodatkowo jest 8255 do obsługi drukarki (to jest kopia z oryginalnego Elwro z dziwnymi rozwiązaniami, ale takie było i nie ma tu co dyskutować → taki być musi).
se256f-ilu01.png

se256f-ilu02.png
Firmowo-zilogowe układy są połączone w łańcuch (w sensie priorytetów przerwań). Na samym szczycie „ważności” jest umieszczony układ PIO. Kolejność obsługi przerwań wynika z realizowanej funkcji. W przypadku PIO jest ona najważniejsza, pozostałe elementy są jej podporządkowane. W konstrukcji występuje, zaawansowany technicznie, port równoległy (właściwie zbiór portów) ze stajni intela – układ 8255.
se256f-ilu03.png
Jest on przewidziany do obsługi drukarki. Interfejs drukarkowy jest jakiś prehistoryczny, poza prezentowanym rozwiązaniem nie miałem okazji więcej takiego spotkać. Jednak interfejs, jak interfejs... ma robić co do jego należy i tyle. To nie powód, by nad nim się rozwodzić.
Całością zawiaduje generator sygnałów typu chip select bazujący na intelowskim 8205.
se256f-ilu03a.png
Uważny czytelnik może zauważyć, że na schematach występuje 74HC138. Otóż te układy są ze sobą w pełni zgodne: pinologicznie i funkcjonalnie.
Występujące w układzie interfejsy szeregowe są „zabezpieczone” układami typu 1488/1489. To klasyczne układy powszechnie stosowane w czasach, gdy o MAX232 jeszcze nikt nie słyszał (niestety wymagają zasilania -12V/+12V).
se256f-ilu04.png
Dwa układy SIO (po dwa kanały każdy) tworzy możliwość czterech kanałów komunikacyjnych. W każdym kanale poza oczywistym „przetwarzaniem” przez 1488/1489 linii nadawanych i odbieranych danych występują, jako linie modemowe, sygnały RTS i CTS. Jeden z sygnałów (już na złączu) jest „wysterowany na stałe”. Logika sugeruje, że jest to jakaś linia modemowa, jaka – nie mam pojęcia, nie zachowały się żadne zapiski dotyczące tego szczegółu. W „filozofii” standardu RS232 takie podpolaryzowanie sygnału oznacza, że ma on stan aktywny.
Tu również można dostrzec „dziwne” rozwiązanie złącza. W swojej praktyce miałem okazję stosowania złącz typu DB25 oraz (obecnie) wyłącznie złącza DB9. Wariant DB15 jest tak trochę obcy, z innego świata, ale widocznie tak było choć brzmi to dziwnie.
se256f-ilu05.png
Klawiatura centralna, to już domena układu Z80-PIO. Oryginalna klawiatura pozostaje, więc trzeba było wykombinować takie rozwiązanie by się podłączyć bez większych problemów. Z tego co widzę na schemacie (zachowały mi się fotki samego schematu – to był arkusz prawie wielkości A0 i gdzieś powinien być w domu, puki co to go nie znalazłem), klawiatura jest matrycowa. Skoro matryca, to jest generator (na 74132) i liczniki (7493). Jak zostaje wykryty naciśnięty klawisz (z 74151), to liczniki się zatrzymują.
Rozwiązanie z przerzutnikiem 7474 w kooperacji z 7493 eliminuje dzwonienie styków i inne hazardy bo 7474 reaguje na zbocze dodatnie zaś 7493 na zbocze ujemne, więc jest pół taktu na podjęcie właściwej decyzji: czy w końcu klawisz jest naciśnięty, czy nie.
Tu mi się przypomniała niecodzienna historia i jak można sobie radzić w sytuacjach prawie niemożliwych. Projektując druk, nie dało się przeprowadzić jednego druta (na schemacie jest podpisany jako MAGIC łączący 74HCT123 z 74HCT74). Pewne elementy, pozornie dziwne i niezrozumiałe, mają całkiem sensowne wyjaśnienie, które na pierwszy rzut oka są irracjonalne i pozbawione sensu. Jednak nie dajmy się zwodzić emocjom, wyjaśnienie jest prozaicznie proste.
se256f-ilu06.png
Przy takim zagęszczeniu ścieżek i układów powstał problem z poprowadzeniem ścieżki. Po stronie BOTTOM nie ma dojścia.
se256f-ilu07.png
Po stronie TOP jest jeszcze gorzej.
se256f-ilu08.png
Dojście trzeba znaleźć, każdą możliwą i dopuszczalną metodą. Możliwym rozwiązaniem jest „przejść” przez pin numer 2 w 7493 ale ten jest używany.
se256f-ilu09.png
Pin 2 w 74HCT93 służy do asynchronicznego zerowania licznika, które następuje, jeżeli na pinie 2 i pinie 3 występuje jedynka logiczna. Typowo, by nie zostawiać niewysterowanych wejść, oba są przywiązane do ziemi. Jednak, jeżeli na jednym jest stałe zero, to bez względu na stan na drugim pinie, iloczyn logiczny nigdy nie zostanie spełniony. Można pin użyć do innych celów i tak stał się on „przekaźnikiem” na drodze sygnału. Coś, co może wydawać się głupim i bezsensownym, może mieć logiczne wyjaśnienie, wręcz istotne w ściśle określonej sytuacji. Taki niekonwencjonalny zabieg uratował projekt PCB. Niby można było przeprojektować, ale wtedy nie było komputerów i środowisko projektowe to deska kreślarska, do której są przypięte dwa arkusze pokratkowanej kalki, gumka i ołówek. To PCB, które obecnie metodą suwmiarki calowej i mało wyraźnych zdjęć zostało przeniesione do komputera zajęło mi prawie 1 tydzień, wtedy zajęło 3 miesiące ciężkiej pracy. Termin gonił, więc są określone decyzje. Tak przy okazji, mając do dyspozycji komputery, można wnieść pewne optymalizacje i tak zrobiłem. Projekt nie jest ścisłą kopią i zawiera kilka zmian choć główna koncepcja PCB pozostaje ta sama. Tak rozmyślając nad konstrukcją, to zauważyłem pewien babol w całości, o czym już pisałem (problem sygnału CAS dla 41256 lub banków 4164).
PCB jest zaprojektowane w sposób bardzo „ciasny”. Większość powierzchni płyty zajmują podstawki na styk. Z tym wiąże się zabawne zdarzenie. Niektóre układy trzeba było „poprawić” na szlifierce, bo im dupki wystawały poza podstawki. Cóż, każde zdarzenie niesie jakąś wiedzę i doświadczenie. Już nigdy więcej nie projektowałem aż tak ciasnych konstrukcji.
Na poniższej focie, układ intelowego CTC (8253) nie mieście się w podstawce razem z układem EPROM'a. Jeden narusza prywatną strefę drugiego. No cóż, ktoś musi ustąpić. EPROM ma bardzo ceramiczną obudowę i nie sądzę, by ta dała się łatwo przekonać dla szlifierki. 8253 to już obudowa plastykowa i ta znacząco łatwiej daje się obrabiać.
se256f-ilu10.jpg
Podobna sytuacji wystąpiła w układach SIO (i w kilu innych).
se256f-ilu11.jpg
Odtwarzając płytę główną, zauważyłem kilka niedoróbek i błędów (różnic między schematem a PCB). Tak się zastanawiałem, o co w tym wszystkim chodzi i nagle dostałem olśnienia: to był egzemplarz próbny. W danych czasach, gdzie dokumentacja była tworzona ręcznie, z której ktoś ręcznie przenosił dane do naświetlarki, zawsze istniała możliwość pomyłki. Produkowana była jedna sztuka, która szła do weryfikacji. Należało dostrzec błędy (własne jak i cudze) i wnieść korektę. I to jest taki właśnie egzemplarz. Tak się teraz zastanawiam co zrobić dalej: wyprodukować poprawny egzemplarz, czy metodą lanceta i kynara uruchomić posiadany. Przygoda jest fascynująca ale ma jedną wadę. Jak zostaną wlutowane podstawki, do nie ma dojścia do ścieżek i jak zostanie przeoczona jakaś niedoróbka, to będzie już koniec drogi.
Chyba przeprojektuję całość wnosząc kilka istotnych zmian. Jedne elementy wypadną (na zawsze), inne zostaną zamienione, dojdą nowe. Nowe elementy (jak i zamienniki), to czasami nowe problemy. Zamiast, przykładowo, stosować bandę układów 41256 można użyć dwóch układów 44256 jednak tu rodzi się problem do pokonania: te wymagają 512 cykli odświeżania. Nie jest to skomplikowany problem. Wyżej pokazany jest sposób wygenerowania 8-bitowego adresu do odświeżania. Teraz powstaje potrzeba, by ten adres był 9-bitowy, więc zamiast zastosowanego przerzutnika typu 74HCT74 należy zastosować licznik. Prosty zabieg rozwiązuje problemy. A może zastosować układy DRAM 1mega * 4 bity? ZILOG i 1 megabajt pamięci operacyjnej → to już trąca kosmiczną przesadą, chociaż... wszystko zależy od punktu widzenia. Innym szalonym pomysłem może być całkowita zmiana adresu. Zamiast dorabiać coś do istniejącego rozwiązania można wygenerować całkowicie własny adres do odświeżania. Niezbędny jest jedynie sygnał, który sygnalizuje ten cykl, a taki występuje w Z80 → RFSH (pin 28 w Z80-CPU). Zmiana punktu widzenia często implikuje inne podejście i prawdziwe staje się porzekadło, że problem nie leży w problemie tylko w podejściu do problemu.
W tym temacie to już wszystko, ewentualne dywagacje to już będzie oddzielny temat.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Expert
Expert
Posty: 978
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [Z80] Superelwro

Postautor: tasza » czwartek 31 paź 2019, 22:08

gaweł pisze:Można pin użyć do innych celów i tak stał się on „przekaźnikiem” na drodze sygnału. Coś, co może wydawać się głupim i bezsensownym, może mieć logiczne wyjaśnienie, wręcz istotne w ściśle określonej sytuacji.

O tym myku z zagospodarowaniem resetującej nogi '93 pisałeś mi wcześniej... no to jest właśnie kreatywność, respekt.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » czwartek 31 paź 2019, 22:45

Ja pamiętam, że pisałem :) , ale to było w "prywatnej korespondencji". Koledzy forumowicze o tym nie wiedzą, a niestandardowe pomysły może warto propagować ;)

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: [Z80] Superelwro

Postautor: WoodPaker » piątek 01 lis 2019, 19:34

Ło matko. Mój pierwszy komputer to był Elwro 800 Junior. Dostałem go od cioci, która była księgową w Elwro :)
Stare dobre czasy :)
Life is to short to eject USB safely

Awatar użytkownika
gaweł
Expert
Expert
Posty: 792
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Z80] Superelwro

Postautor: gaweł » piątek 01 lis 2019, 20:28

Historia zatoczyła koło :lol:

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Retro”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości