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.
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:
Komenda DIR dla USER 0:
Gra platformowa Ladder:
Microsoft BASIC i ładowanie programu BUNNY.BAS (z książki "101 BASIC Computer Games"):
Fragment kodu (komenda LIST):
Program ten drukuje na drukarce króliczka Playboy'a:
Efekty pracy w programie MOUSE, jaki napisałem w Pascal MT+:
Zmiana typu terminala (jedno z kilku dodatkowych poleceń, jakie dodałem do CP/M):
TINY BASIC dla CP/M:
Bawiłem się też programem muMATH, który też występuje jako muSIMP:
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:
Płyta główna:
Widok ogólny całości:
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.).
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.
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.
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).
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:
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.
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.
@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?
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?
@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.
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.
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ń.
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
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
Witam
Jestem w trakcie budowania prostego komputera na z80 .
Mam jedno pytanie odnośnie adresów z80.
Chodzi o podłączenie do linii adresowej eeproma km28c17 lub km28c64a układy o 12 adresach i 8 bitowej szynie danych.
Wszystko szło dobrze do momentu podłączenia 11 adresowej linni eproma do 16 adresowej lini z80 co z pozostałymi adresami czy reszta czyli A12,A13,A14,A15 bedzie nieużywana ?
Dać 10 k do masy w reszcie Od A12 do A15 ?
pozostałymi adresami czy reszta czyli A12,A13,A14,A15 bedzie nieużywana ?
Najlepiej podpiąć po dekoder adresów np 74138, wtedy obszar pamięci podzieli się na banki, w jednym będziesz miał ten swój eeprom i jego podłączasz 'CE'' pod wyjście '0' żeby był adresowany od '0' co umożliwi start z80. A ram którego tez będzie potrzebował łączy tak samo pod linie danych i adresowe a 'CE' pod kolejny numer (bank) z '138' wtedy adresy sie nie będą pokrywać i nawzajem przeszkadzać.
Czyli reasumując, km28c64a ma 8kB czyli całą przestrzeń z80 adresową można podzielić na 8 bloków, akurat tyle co może zaadresować 74138, aby to uzyskać łączysz tak A0- A12 z z80 do pamięci,
Z80-74138
A13 - 1
A14 - 2
A15 - 3
-MREQ - 4
masa - 5
+5V - 6
z 74138 do pamięci
15 - -CE
jeszcze musisz 'pomnożyć' sygnały -RD, -WR z -MREQ żeby uzyskać sygnały RD i WR dla pamięci.
W sieci jest wiele materiałów na temat budowy prostego komputera na z80 , ale najciekawsze i praktyczne są albo po arabsku, angielsku albo w języku hinduskim albo urdu.
Niektórzy nie potrafią przekazać wiedzy, pomijając barierę językową.
Nie interesuje mnie budowanie konstrukcji na arduino bo to pójście na łatwiznę .
Posiadam wiele układów Ziloga i chcę później je wykorzystać.
Dzisiaj ogarnąłem już trochę w temacie.
Sprzęt działa z80 + eeprom km28c17 proste instrukcje w assemblerze .
Wszystko oczywiście na płytkach stykowych.