Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Komputer na Z80 z VGA by piotr_go

piotr_go 05 Feb 2021 13:35 4638 14
  • Komputer na Z80 z VGA by piotr_go

    Był już 8051, teraz pora na Z80.
    Komputer składa się z kilku modułów.
    Płyta główna zawiera procesor Z80, pamięć 512kB ram i 512kB flash, układ IO 8255 i spinający to wszystko w całość leciwy 5V CPLD Atmela ATF1502AS, który działa też jako przełącznik banków pamięci.
    Wcześniejsza wersja zamiast układu Atmela była zrobiona na CPLD Xilinxa i wymagała dodatkowego konwertera poziomów 3,3V->5V.
    Płytka "IO+" odpowiada za generację obrazu, odczyt klawiatury, generację dźwięku, komunikację z kartą SD i zegarem.
    Wymagane zegary VGA, UARTa i YMZ284 generowane są za pomocą układu Si5351 (konfigurowalny przez I2C generator*3).

    Obsługiwane systemy: CP/M, ZSDOS.
    Zasilanie 5V za pomocą gniazda USB-C.


    Link


    Płytka główna i wcześniejsza jej wersja na CPLD Xilinxa:
    Komputer na Z80 z VGA by piotr_go Komputer na Z80 z VGA by piotr_go
    Z80, 512kB ram, 512kB flash, CPLD, 8255 IO.

    Schemat:
    Komputer na Z80 z VGA by piotr_go

    Płytka IO:
    Komputer na Z80 z VGA by piotr_go
    XC9572XL w roli kontrolera uart, spi i przerwań.
    GD32 generuje obraz, czyta klawiaturę, konfiguruje Si5351 i generuje 50Hz do przerwania.
    YMZ284 generacja dźwięku.
    DS1302Z zegar.

    Schemat:
    Komputer na Z80 z VGA by piotr_go

    Kontroler ATA:
    Komputer na Z80 z VGA by piotr_go

    Schemat:
    Komputer na Z80 z VGA by piotr_go

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    piotr_go
    DIY electronics designer
    Offline 
    Has specialization in: technika cyfrowa
    piotr_go wrote 2180 posts with rating 2334, helped 81 times. Been with us since 2003 year.
  • #2
    maciej_333
    Level 35  
    Gratuluję realizacji ciekawego projektu. Pozwolę sobie zapytać, czy wyrzeźbiłeś od podstaw własny BIOS dla CP/M w asemblerze Z80? Zrobiłeś tzw. deblocking dla karty SD? Robiłeś jakieś podejście do CP/M 3.0?

    Też pracuję od trzech lat nad czymś takim, jednak jest to projekt na 8080. Jest to też układ zdecydowanie bardziej retro. Mam nawet obsługę FDD i całkowicie samodzielnie napisany BIOS w asemblerze 8080. Zrobiłem też deblocking dla FDD. Z innych ciekawostek można wymienić interfejs LPT dla drukarki, pióro świetlne i myszkę RS232C. Klawiatura to też typowa od PC tyle, że ze złączem DIN. Również uruchomiłem CP/M 2.2 i całą masę oprogramowania z epoki. Planuję dołożenie jeszcze m.in. stacji 5,25" oprócz już obecnej 3,5".

    Jeśli chodzi o urządzenia wskaźnikowe, to zrobienie pióra świetlnego jest trudniejsze niż się wydaje z uwagi na występujący jitter. Działa to tylko w jasnych punktach ekranu. Jednak nawet wtedy nie zawsze efekt jest idealny. Natomiast mysz działa świetnie. Jednak do takiej rozdzielczości ekranu trzeba przesyłane przesunięcie dzielić przez 2. Napisałem też prosty program "graficzny" w Pascal Mt+. Odwołałem się do dodatkowych funkcji BIOS, jakie zrobiłem poprzez wstawki asemblerowe. Efekt końcowy jest dosyć dobry.

    Ekran startowy:
    Komputer na Z80 z VGA by piotr_go

    Komenda DIR dla USER 0:
    Komputer na Z80 z VGA by piotr_go

    Gra platformowa Ladder:
    Komputer na Z80 z VGA by piotr_go
    Komputer na Z80 z VGA by piotr_go

    Microsoft BASIC i ładowanie programu BUNNY.BAS (z książki "101 BASIC Computer Games"):
    Komputer na Z80 z VGA by piotr_go
    Fragment kodu (komenda LIST):
    Komputer na Z80 z VGA by piotr_go
    Program ten drukuje na drukarce króliczka Playboy'a:
    Komputer na Z80 z VGA by piotr_go

    Efekty pracy w programie MOUSE, jaki napisałem w Pascal MT+:
    Komputer na Z80 z VGA by piotr_go
    Komputer na Z80 z VGA by piotr_go

    Zmiana typu terminala (jedno z kilku dodatkowych poleceń, jakie dodałem do CP/M):
    Komputer na Z80 z VGA by piotr_go

    TINY BASIC dla CP/M:
    Komputer na Z80 z VGA by piotr_go

    Bawiłem się też programem muMATH, który też występuje jako muSIMP:
    Komputer na Z80 z VGA by piotr_go
    Jest to coś jak współczesne środowiska w stylu MATLAB/SCILAB/OCTAVE dla CP/M. Ma to naprawdę duże możliwości np. różniczkowanie wzorów, całkowanie (całki nieoznaczone) itd.

    Pióro świetlne:
    Komputer na Z80 z VGA by piotr_go

    Płyta główna:
    Komputer na Z80 z VGA by piotr_go

    Widok ogólny całości:
    Komputer na Z80 z VGA by piotr_go

    Generalnie jak widać obraz jest dosyć dobry i czytelny. Jednak sporo zależy od telewizora (pasmo wzmacniacza wizji, przekątna ekranu, ogólne zestrojenie - zbieżność, ostrość, geometria itd.).
  • #3
    piotr_go
    DIY electronics designer
    maciej_333 wrote:
    wyrzeźbiłeś od podstaw własny BIOS dla CP/M w asemblerze Z80?

    Pewnie bym tak zrobił, tyle że wcześniej nie miałem do czynienia z Z80 czy CP/M.
    Modyfikowałem te źródła:
    https://github.com/wwarthen/RomWBW
    Asembler Z80 wygląda na przyjemniejszy od tego z C51.
    FDD chyba zostawię na wersję w FPGA (o ile powstanie).
    CP/M 3.0 na razie odpuszczam.
  • #4
    maciej_333
    Level 35  
    piotr_go wrote:
    Asembler Z80 wygląda na przyjemniejszy od tego z C51.

    Dyskusyjne stwierdzenie. Lista rozkazów w Z80 jak i cały procesor to rozwinięcie tego, co było w 8080. Jest tam ogromny archaizm, jak np. warunkowe wywołanie podprogramu, czy warunkowy powrót z podprogramu. W przypadku 8051 było już trochę lepiej, bo usunięto już takie złożone rozkazy. Nie myślałeś o współczesnym EZ80? Jest wg dokumentacji zgodny z Z80, więc także z 8080.

    piotr_go wrote:
    FDD chyba zostawię na wersję w FPGA (o ile powstanie).

    Ciężko zrobić FDD. Napisać dobry sterownik nie jest prosto. Dochodzi nie tylko deblocking (emulowanie logicznych sektorów 128 B na fizycznych sektorach 512 B), tablica przekosu (bez tego zapis i odczyt są szybkie inaczej) itd.

    piotr_go wrote:
    CP/M 3.0 na razie odpuszczam.

    Też nie mam zamiaru tego uruchamiać.

    Również w swoim projekcie zrobiłem banki. Mam ok. 160 kB pamięci RAM i 32 kB ROM. CP/M jest właśnie ładowany z EPROM. Zrobiłem też RAM DISK ok. 80 kB.
  • #5
    fotomh-s
    Level 22  
    piotr_go wrote:
    FDD chyba zostawię na wersję w FPGA (o ile powstanie).

    Wiesz może czy jest dostępny jakiś open core FDC dla FDD 3.5 cala? Szukałem i nie znalazłem.
    Jak w ogóle z podłączeniem FDD pod FPGA, wyjścia mogą być na 3V3 czy muszą być przez konwerter poziomów?
    Dla wejść starczą zwykłe rezystory żeby FPGA nie spalić?
    Rozumiem że większość FDD 3.5 cala nie wymaga zasilania 12V i starczy samo 5V podpiąć aby działało.

    Swoją drogą to jest ciekawy projekt na FPGA: http://searle.x10host.com/Multicomp/index.html
    Modułowy retrokomputer. Nawet jak ktoś VHDLa nie zna (ja tam wolę Veriloga) to może posklejać sobie do kupy.
    Ja na tej bazie zrobiłem sobie terminal VGA dla kalkulatora programowalnego, wystarczyło tylko ROM (zaimplementowany w block ramie FPGA) wymienić na własny.
    Problem jest taki że przy układzie EP2C5T144 zostaje tylko 2kB RAMu (bo 8kB zjada basic ROM, resztę zjada pamięć character generatora).
  • #6
    piotr_go
    DIY electronics designer
    maciej_333 wrote:
    Ciężko zrobić FDD. Napisać dobry sterownik nie jest prosto. Dochodzi nie tylko deblocking (emulowanie logicznych sektorów 128 B na fizycznych sektorach 512 B)

    Zawsze można zrobić 128B sektory :)

    fotomh-s wrote:
    Wiesz może czy jest dostępny jakiś open core FDC dla FDD 3.5 cala? Szukałem i nie znalazłem.

    Nie szukałem, ale pewnie jest, do amigi pisałem swój.

    fotomh-s wrote:
    Jak w ogóle z podłączeniem FDD pod FPGA, wyjścia mogą być na 3V3 czy muszą być przez konwerter poziomów?
    Dla wejść starczą zwykłe rezystory żeby FPGA nie spalić?

    Ja zrobiłem tak:
    Komputer na Z80 z VGA by piotr_go
    FPGA od lewej, flopp od prawej.

    fotomh-s wrote:
    Rozumiem że większość FDD 3.5 cala nie wymaga zasilania 12V i starczy samo 5V podpiąć aby działało.

    5V powinno wystarczyć.
  • #7
    perfi
    Level 13  
    Bardzo fajny projekt. Miło popatrzeć, że jakie cuda można zrobić ze starych procków :)

    @piotr_go, mam oczywiście kilka pytań :) Jesteś zadowolony z Si5351? Jaka jest rola T1 przy układzie 8255? Co to za przerwanie co wymaga 50Hz? (nigdy nie miałem Z80 w rękach)

    Jeszcze raz gratuluję fajnego projektu i życzę dalszych sukcesów.
  • #8
    piotr_go
    DIY electronics designer
    perfi wrote:
    Jesteś zadowolony z Si5351?

    Zakłóceń obrazu nie widać, działa jak trzeba.

    perfi wrote:
    Jaka jest rola T1 przy układzie 8255?

    Negacja resetu. Z80 resetuje się stanem niskim, 8255 wysokim.
    Reset można też zanegować w CPLD, tyle że trzeba wlutować nieco pojemniejszą wersję.

    perfi wrote:
    Co to za przerwanie co wymaga 50Hz?

    Odtwarzacz melodyjek wymaga równomiernego taktowania.
  • #9
    perfi
    Level 13  
    @piotr_go , @maciej_333 , a jak w waszych projektach macie "zorganizowaną" szynę danych? Zastanawiam się co się dzieje jak na szynie adresowej podamy adres do którego nic nie jest podpięte i cpu będzie chciało odczytać dane. Czy macie jakiś sposób by na szynie danych był stan niski w takiej sytuacji?
  • #10
    piotr_go
    DIY electronics designer
    perfi wrote:
    Zastanawiam się co się dzieje jak na szynie adresowej podamy adres do którego nic nie jest podpięte i cpu będzie chciało odczytać dane. Czy macie jakiś sposób by na szynie danych był stan niski w takiej sytuacji?

    Nie widzę takiej potrzeby.
  • #11
    maciej_333
    Level 35  
    perfi wrote:
    @piotr_go , @maciej_333 , a jak w waszych projektach macie "zorganizowaną" szynę danych? Zastanawiam się co się dzieje jak na szynie adresowej podamy adres do którego nic nie jest podpięte i cpu będzie chciało odczytać dane. Czy macie jakiś sposób by na szynie danych był stan niski w takiej sytuacji?

    Nie ma takiej potrzeby. Nigdy się czegoś takiego nie stosowało. Zresztą u mnie cała przestrzeń dla danych jest wykorzystana. W przypadku przestrzeni I/O są wolne adresy do ewentualnej dalszej rozbudowy. Generalnie program musi być tak napisany, by nie doszło do odczytu/zapisu na niewykorzystane obszary i tym bardziej, by nie doszło do wykonania kodu z takiego miejsca.
  • #12
    fotomh-s
    Level 22  
    Można dać rezystory pull down na szynie danych, wtedy jak PC zostanie ustawiony na adres pod którym nic nie ma to będzie wykonywał NOPy.

    maciej_333 wrote:
    Nie ma takiej potrzeby. Nigdy się czegoś takiego nie stosowało.

    Fakt, nie słyszałem aby ktoś to stosował. Jednak pomysł sam w sobie nie jest taki zły, w końcu różne rzeczy się mogą zdarzyć i błędy podczas programowania mogą doprowadzić do sytuacji że PC zostanie ustawiony właśnie w niewykorzystanej przestrzeni adresowej.

    Na FPGA to już można sobie kombinować i np. zrobić logikę która zresetuje rdzeń przy odczycie lub zapisie w niewykorzystanej przestrzeni adresowej. Na faktycznym hardware takie kombinowanie się mija z celem.
  • #13
    maciej_333
    Level 35  
    fotomh-s wrote:
    Można dać rezystory pull down na szynie danych, wtedy jak PC zostanie ustawiony na adres pod którym nic nie ma to będzie wykonywał NOPy.

    Średni pomysł. Rezystory te obciążą na stałe szynę danych. Dopuszczalny prąd Ioh jest znacznie mniejszy od Iol. Nie zawsze można sobie na coś takiego pozwolić. 8080 i Z80 to architektura von Neumanna. Jeżeli niewykorzystany obszar użyć jako dane, albo stos, to i tak system się zawiesi.

    fotomh-s wrote:
    maciej_333 wrote:
    Nie ma takiej potrzeby. Nigdy się czegoś takiego nie stosowało.

    Fakt, nie słyszałem aby ktoś to stosował. Jednak pomysł sam w sobie nie jest taki zły, w końcu różne rzeczy się mogą zdarzyć i błędy podczas programowania mogą doprowadzić do sytuacji że PC zostanie ustawiony właśnie w niewykorzystanej przestrzeni adresowej.

    Pomysł sam w sobie nie jest zły. Jednak wymaga to dodatkowych układów sprzętowych. Rozbudowa sprzętu może przez to być dosyć znacząca. Miałoby to sens jedynie w jakimś systemie rozwojowym jakim np. był rodzimy RTDS8.

    Tak, jak pisałem wcześniej trzeba tak napisać program, by nie było to potrzebne. Układy współczesne też nie mają przecież takich zabezpieczeń.
  • #14
    perfi
    Level 13  
    Zapytałem o takie rozwiązanie bo podobny mechanizm jest używany z architekturze ISA i chciałbym go zastosować w swoich projektach, ale nie wiem jak to zrobić (bawię się MOS 6502).

    Jeżeli chodzi o architekturę ISA, to szyna danych jest podciągana do stanu wysokiego, co daje możliwość przeszukiwania pamięci w celu wykrycia znaczników i pewność, że nie natrafi się na jakieś śmieci. Podczas uruchomienia kompa jednym z zadań POST jest właśnie przeszukiwanie pewnego obszaru pamięci I/O w celu odnalezienia sekwencji bajtów 55h i AAh. Jak znajdzie się ten ciąg to znaczy, że natrafiono na ROM karty rozszerzeń (który zawiera kod programu do uruchomienia).

    A po co mi to? Marzy mi się taka namiastka plug and play :)
  • #15
    PiotrPitucha
    Level 33  
    Witam
    Bawiłem się kiedyś CP/M w Amstradzie w którym były stacje dysków 3", ze względu na słabą dostępność dyskietek i ich znaczną cenę próbowałem podpinać stację 5,25" ze średnim skutkiem. Stacja działała idealnie, ale czasami oryginalna stacja ( działałem na dwu ) lubiła wyjechać za daleko i się blokowała, trzeba jej było pomóc palcem by wróciła na pozycję Home. Nie pamiętam czy udało mi się uruchomić stację 3,5", bo kontroler ( stosowany w PC XT ) nie obsługiwał o ile pamiętam 1,44MB. Ponieważ chyba obsługiwał 720KB poszukiwałem stacji które miały pin do przepięcia stacji w tryb 720KB. Amstrady 8256 miały natywnie stacje 3" 720KB. Ze starych dziejów został mi kontroler dysków do Amstrada 644 i oryginalna książka z opisem i źródłami do CP/M +.
    Swoją drogą to drugi CP/M na którego napotykam się ostatnimi dniami, ten pierwszy jakiegoś rosjanina był na Atmedze.
    Żal tylko że dyskietki się gdzieś rozpłynęły bo miałem Pascal, C i Forth o bazach danych też nie zapomniano, DB chyba w wersji 2.2
    Pozdrawiam