Skocz do zawartości

iNap PC - kolejny komputer oparty na Z80


Leoneq

Pomocna odpowiedź

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

Do EEPROMu nie musiałeś doprowadzać A15, skoro z niego nie korzystasz. Mam nadzieję, że pozostałe dwa najstarsze adresy nie wiszą jednak w powietrzu.

Na schemacie nie musisz pisać, że to bramka OR, bo to widać z symbolu. Natomiast zupełnie nie wiadomo jakiej tam użyłeś: 74HC32, CD4071 czy może 74LS32.

Przyjmij sobie jakąś konwencję oznaczania sygnałów aktywnych w stanie niskim, bo na większych schematach się pogubisz. W tamtych czasach takie sygnały były w przeważającej większości a przecież czasem zdarza się je odwracać i wtedy o błąd nietrudno. Nie wiem, zaczynaj od znaku "/" lub "~" lub "#" - jest wiele konwencji, ale jakąś musisz stosować. Obecnie wprowadzasz sygnał MEMRD na wejście OE z kółkiem (czyli aktywne w stanie niskim) a to wygląda źle. Oczywiście tylko formalnie, bo układ jest poprawny. Schemat powinien być czytelny sam z siebie, bez dodatkowych komentarzy i domyślania się.

Wybór kostki pamięci wyłącznie adresem powoduje, że pobierają dużo prądu. To właśnie wejście CE wyłącza mnóstwo elektroniki wewnątrz tych chipów (i przenosi ją do trybu low-power) więc gdybyś A15 (prosty i zanegowany) złożył z sygnałem /MREQ i dopiero tym odblokowywał pamięci, to takie sterowanie zaoszczędziłoby pewnie z 30- 50% prądu zasilania wybranej kostki. /MREQ ma właśnie takie mniej więcej wypełnienie podczas normalnej pracy Z80.

W najbliższej przyszłości spróbuj tak zaprojektować otoczenie EEPROMu, byś miał możliwość zapisywania go z procesora i to do całej przestrzeni (stronicowanej np. po 32K) - albo pracując wtedy z RAMu albo wisząc na wait state. Będziesz miał wtedy sporą jak na te standardy pamięć nieulotną np. do zapisu programów w BASICu.

Osadzanie jakiegoś gotowego BASICa (a jest ich trochę, tak na 8080 jak i dedykowanych do Z80) jest trywialne jeśli masz dostępny UART taki jak 8251. Funkcje znakowego we/wy są zwykle dokładnie wyróżnione i opisane, wystarczy je podmienić na swoją obsługę tego historycznego UARTa i jedziesz. Tutaj koniecznie jak najszybciej zainstaluj jakiś prosty tzw. monitor, czyli program do wpisywania (HEX lub simple-asm) i debugowania programów bezpośrednio w RAMie. To zajmuje zwykle 1...2K i jeśli podepniesz to pod UART, to łączysz się z terminalem na PC i działasz. Te podstawki, wyciąganie, programowanie to jakiś koszmar. Daleko tak nie zajedziesz, bo albo Ci się znudzi, albo za którymś razem spalisz pin/układ od ESD przy przekładaniu pamięci. Szkoda tego wysiłku. Widać, że hardware działa więc buduj oprogramowanie. Nie ma co się podniecać przesuwaniem bitów z zegarem 100Hz.

Ten opis działania procesora to chyba jednak jakaś bajka. No weź, przecież on niczego nie "szuka". Sygnał RESET zeruje PC i od adresu 0x0000 rozpoczyna się pierwszy cykl M1 - pobrania kodu instrukcji. Każda kombinacja bitów jaką wczytasz jakoś się wykonuje. Potem następny rozkaz i następny. Jeśli pamięć wypełnisz NOPami (0x00) to rzeczywiście będzie po nich jechał aż dociągnie 0x7FFF, przejdzie do RAMu a tam kaszana..

Jeśli już chciałeś bawić się w analizę tak wolno i pracującego procka, to warto było zrobić układzik pracy krokowej. To bardzo prosta rzecz, a masz wtedy przycisk STEP, który powoduje wykonanie jednego cyklu maszynowego (mimo taktowania CPU normalnym zegarem kilku MHz). Możesz wtedy podglądać zawartość magistral i sygnały sterujące nawet na LEDach (buforowanych) i krok po kroku skumać jak wykonywane są poszczególne instrukcje.

W każdym razie szacun za zacięcie. Może dołączysz do Homebrew CPU RIng? Chociaż nie, tam chyba nie przyjmują cheaterów co to posługują się procesorami w jednym scalaku 🙂 To co, może w następnej wersji 1-bitowiec liczący ciąg Fibonacciego?

BTW: Dlaczego edytor Forum notorycznie zamienia mi "iks" na symbol mnożenia, gdy wpisuję liczbę szesnastkową tj. robi się 0x15 (o właśnie, znów to zrobił!) zamiast 0x00.

EDIT: Poszedłem za Twoim opisem, ale coś mi nie pasowało. EEPROMy zaczynają się od 28.. a tu masz 29F czyli FLASH. Odpada zatem metoda programowania po bajcie i oczekiwania w wait state. Zapis zadziała tylko podczas zapisu całej strony podczas pobierania kodu z RAMu.

Edytowano przez marek1707
  • Lubię! 2
Link do komentarza
Share on other sites

Dziękuję za tak treściwą odpowiedź. Ma Pan rację, i powinienem przyjąć jeden umowny zapis, i mogłem inaczej zrealizować sterowanie pamięciami. Opis działania spróbowałem napisać tak, żeby i moi koledzy - 2 klasa technikum - zrozumieli o co chodzi, więc staram się jakoś na wyobraźnie działać, może faktycznie z tym przesadziłem xd

Z początku zamiast 555 miał tam być właśnie przycisk step, lecz jakoś mój procesor "świruje" przy zbyt niskich częstotliwościach. Prototyp z przyciskiem nie chciał w ogóle działać normalnie, a z 555 poniżej pewnej częstotliwości też odmawia posłuszeństwa, nie wiem jaka jest tego przyczyna. 

Pamięć FLASH aktualnie procesor może zaprogramować, wysyłając odpowiednią sekwencję komend (jak pamiętam 3 bajty + bajt do zapisania). A15 aktualnie nie jest podłączone do pamięci, mały błąd - nieużyte piny pamięci podłączylem do masy. 

I muszę powiedzieć, że nie słyszałem o monitorze, ale bardzo chętnie spróbuję z niego skorzystać.

Link do komentarza
Share on other sites

O jakże się cieszę, że Zetka jeszcze żyje. To był szczyt moich marzeń w końcu ubiegłego wieku. Zaczynałem z Intelem 4-ro bitowym, a potem 8080. Idę przeszukać swoje pudełka i co tam znajdę to zaoferuję "do wzięcia" dla wszystkich pasjonatów. Pozdrawiam

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Projektowanie układów scalonych w tamtych czasach wiązało się z koniecznością bezwzględnej minimalizacji liczby użytych tranzystorów. Elementy te były duże, chipy krzemowe miały bardzo ograniczone wymiary ze względów zarówno technologicznych jak i funkcjonalnych i nie można było bez umiaru stosować typowych w rozwiązaniach dyskretnych układów przerzutników czy bramek. Rzecz jasna pełno tam było "bramek" bo to podstawowy budulec logiki, ale były to uproszczone do granic możliwości zestawy tranzystorów a zamiast statycznych przerzutników mogących pamiętać raz wpisany stan w nieskończoność, używało się różnych sposobów przechowania informacji na pojemnościach. Przykładowo, obecnie chcąc podłączyć kilka pamięci do jednej magistrali robi się im bufory trójstanowe, załączane (w Twoim przypadku) odpowiednią kombinacją sygnałów /CE/OE/WE. Coś "wybiera" dany scalak a ten włącza swoje drivery linii i wystawia dane na magistralę, skąd jakiś "master" może je odczytać. To fajnie brzmi i jest proste, ale tylko koncepcyjnie. Bufory trójstanowe to stosunkowo duże struktury i w przypadku scalaka w którym ściubolisz każdy tranzystor, odpadają. Dlatego aby podłączyć kilka zasobów (np. rejestrów) do wspólnej magistrali (np. do wejścia ALU) mogłeś tam zrobić tak:

  1. zakładasz, że linie sygnałowe wraz z wejściami (bramki tranzystorów MOS) do bloku ALU mają jakąś niezerową pojemność, nie wiem, 0.1pF na przykład
  2. na początku ładujesz wszystkie linie do stanu wysokiego - do tego wystarczy tylko jeden tranzystor i 8 diod separujących - i odłączasz ten driver
  3. rejestr ma na wyjściach pojedyncze tranzystory umiejące tylko rozładować linię do stanu niskiego i w następnym cyklu zegara załączasz tylko te tranzystory z danego rejestru, których bity mają wartość zero
  4. po chwili ALU "wciąga" stan wybranego rejestru na swoje wejścia - pewne linie wciąż są (ale długo tak nie pociągną) naładowane a pewne zostały rozładowane

Koniec, na takim prostym myku zaoszczędziłeś całe mnóstwo tranzystorów, bo każdy normalny bufor trójstanowy ma ich co najmniej 2 na wyjściu plus sterowanie. Niestety ma to jedną wadę i dlatego o tym wspominam: to (a także wiele innych mechanizmów w chipach z tamtego okresu) działa do jakiejś minimalnej częstotliwości zegara. Poniżej pewnej granicy, odległości czasowe między kolejnymi impulsami wyznaczającymi kolejne takty pracy są na tyle długie, że pojemności "zapominają" informację (przez rezystancje upływności) i system się rozpada. Dlatego trzeba tak samo uważnie patrzeć na maksymalne jak i na minimalne częstotliwości taktowania. A gdy chcesz swój procesor zwolnić do prędkości zauważalnych gołym okiem (albo nawet do zera) zachowując przy tym spójność jego stanu (wszystkich rejestrów i logiki) to musisz korzystać z dostępnych sygnałów. W Z80 istnieje wejście /WAIT, które służy do współpracy z wolnymi pamięciami. Jeśli procesor po wystawieniu adresu i sygnałów sterujących zobaczy stan niski na tym pinie, to wstrzyma bieżący odczyt/zapis do czasu "potwierdzenia" przez pamięć (lub port I/O), że ta jest gotowa do zakończenia cyklu magistrali. Przy czym jest to mechanizm wbudowany w procesor i nie naruszający żadnych jego reguł - w stanie wait kostka może stać w nieskończoność. Jeśli teraz dobudujesz układ, który "sztucznie" zgłasza niegotowość po rozpoczęciu każdego cyklu maszynowego, to masz spowolnienie o jakie chodziło. Zakończyć bieżący cykl możesz z przycisku albo z jakiegoś 555. Procesor w ciągu mikrosekundy zakończy to co zaczął i rozpocznie następny cykl wynikający z przebiegu realizacji programu. Wtedy znów dostanie wait i tak w kółko. Zegar wciąż jest MHz a Ty możesz spokojnie oglądać co się dzieje ma szynach. Poszukaj schematów do hasła np. "Z80 single step circuit" a wszystko się wyjaśni.

No i uwaga: od czasu opanowania technologii CMOS raczej stosuje się układy statyczne więc proste procesory (o ile nie jest to wyraźnie zaznaczone) można zwalniać za pomocą zegara do 0Hz.

Monitorek to konieczny w każdym tego typu systemie program "startowy". Wgrywasz raz do ROMu a potem już tylko stukasz w klawiaturę i dłubiesz swoje programiki w RAMie.. Kilka pierwszych z brzegu:

https://github.com/fiskabollen/z80Monitor

https://github.com/MatthewWCook/Z80Project/tree/master/Z80 Monitor Part 1

https://github.com/antbern/z80-monitor

itd...

  • Lubię! 2
Link do komentarza
Share on other sites

19 godzin temu, marek1707 napisał:

BTW: Dlaczego edytor Forum notorycznie zamienia mi "iks" na symbol mnożenia, gdy wpisuję liczbę szesnastkową tj. robi się 0x15 (o właśnie, znów to zrobił!) zamiast 0x00.

@marek1707 dzięki za zgłoszenie, naprawione. Mega ciekawa sprawa, bo to była funkcja "zaszyta" w foncie... Wystarczyło wyłączyć i wszędzie się naprawiło z automatu, bo to cały czas były znaki "x" tylko wyświetlały się w taki pokrętny sposób 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

@Leoneq Jakieś postępy w pisaniu oprogramowania podstawowego? Udało Ci się wrzucić do ROMu i uruchomić jakiś monitorek? Piszesz coś dalej? A może masz już któryś BASIC albo podłączyłeś kontroler i napęd dyskietek (lub ich emulator na FLASHu) i właśnie odpalasz CP/M?

@Wrodarek Jak tam przegląd pudełek? Też mam trochę zapasów muzealnych i także planuję kiedyś ich udostępnienie. A może wymiana? Mamy tu dział Sprzedam/Kupię/Zamienię 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Obecnie w planach mam ogarnąć układ 8251, co robię, ale powoli - szkoła, inne projekty, itd. także basica spodziewałbym się do maja jak dobrze pójdzie. A napęd FDD bym bardzo chętnie podłączył, tylko nigdzie nie mogłem znaleźć jak. A tym bardziej poczytać jak działa system plików, więc chyba po prostu źle szukam.

edit: jak mi się zechce posortować układy które mi się przydadzą a które nie (a mam ich z jakieś 2kg), to może i ja sprzedam

Edytowano przez Leoneq
  • Lubię! 1
Link do komentarza
Share on other sites

Aktualizacja 20 kwietnia 2021:

odbieranie po UART działa. Poszło o wiele szybciej, głównie dlatego że wiedziałem już konkretnie co trzeba zrobić. Program najpierw wysyła wiadomość "powitalną", potem nasłuchuje czy nie ma żadnych danych. Obecnie wykonuję tzw. polling, czyli procesor całą swoją uwagę skupia na 8251, w przyszłości planuję zaimplementować przerwanie bezpośrednio do procesora, lub przez 8259. Program po odebraniu danych pokazuje je na linijce ledowej (tutaj, będą to znaki ascii z klawiatury):

; inapPC demo
; 
; memory: 0x0000-0x7FFF ROM
;		  0x8000-0xFFFF RAM
;
; i/o:    A0-A3 device address:
;			0x00  PORT A
;			0x01  HD44780
;			0x02  VGA card (in development!)
;			0x03  8251 UART
;		  A4-A7 device function:
;			0x11  high on R/S on device 0x01 (lcd)
;			0x13 high on D/C on device 0x03 (uart)
; licence opensauce !
;+
; made with lots of  kakao by Leoneq ;3

	cpu z80
	org 0x0000
	
				
disableInterrupts:	
	di
	ld a, 0
	out (0), a

initializeLCD:
	ld a, 0x38		;initialize
	out (0), a
	out (0x01), a
	ld a, 0x0F		;cursor on
	out (0), a
	out (0x01), a
	ld a, 0x1		;clr
	out (0), a
	out (0x01), a

initializeUART:

	ld a,  01001111B ;normally 01001110, for 57600 baud rate
	out (0x13), a ;initialize 

	ld a, 0x15
	out (0x13), a ;turn on transmitter, receiver, clear errors

	ld a, 0xA
	out (0x03), a ;send new line character

	ld bc, message ;initilize for

print:
	ld a, msgend ;check condition
	sub c
	jp z, loop

	call TXnotrdy ;transmit character
	ld a, (bc)
	out (0x11), a	
	out (0x03), a

	inc bc ;repeat 
	jp print

loop:
	call checkReceiver
	jp loop

checkReceiver:
	in a, (0x13)
	bit 1, a
	jp z, notReceived
	jp nz, receivedChar

receivedChar:
	in a, (0x03)
	out (0), a
	ret

notReceived:
	ret

TXnotrdy:
	in a, (0x13) 	;fetch the status
	bit 2, a 		;test TXEmpty bit is set
	jp z, TXnotrdy 	;loop till TX is ready
	ret

message: 			;message
	DB "hello there, straight from iNap z80!", 0xA, "by leonek :3"
msgend:




	

Myślę że powoli mogę się zająć basiciem. A może nawet nie powoli, po prostu zacząć pisać bootloader.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.