CP/M-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Memberlist || Home || Statistik || Kalender || Staff Willkommen Gast!
[ Unofficial CP/M Website ] [ Z80 Family Support Page ] [ Forum-Regeln ] [ Impressum/Kontakt ] [ Datenschutzerklärung ]

CP/M-Forum » CP/M 2.2 » CP/M auf Arduino? » Threadansicht

Autor Thread - Seiten: [ 1 ] -2-
025
11.05.2012, 20:11 Uhr
prefect



PS: yaze implementiert nicht ALLE undokumentierten Befehle und Cringle wusste das auch. Die yaze Z80 implementierung würde als Spectrum Emu vermultlich nicht lange durchhalten. Aber da will ich auch nicht hin. Ich will einfach einen möglichst "authentischen" Z80. Danach kommt denn auch die Peripherie des Z180/HD64180, meines alten Lieblings, ich hab meinen Hitachi einfach vergöttert. Wie krieg ich eigentlich einen 2mm-Raster HD64180 oder Nachfolger auf ein Breadboard? Hat jemand nen Link wo ich nen Adapter kaufen kann?
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
026
11.05.2012, 22:52 Uhr
m.haardt



Wenn Du den Z80 nur zum Test anbinden willst, wozu dann RAM? Du kannst die Buszugriffe mit /WAIT strecken und das Teil mit allen Leitungen an Ports anschliessen.

Hier hat jemand das mit einem 8048 gemacht:

http://www.coprolite.com/art12.html

So bekommst Du Befehl für Befehl mit, was er tut. Zu den 2mm: Sockel kaufen und auf Lochraster montieren, dann Pin für Pin mit Draht auf 2,54mm adaptieren.

Michael
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
027
11.05.2012, 23:49 Uhr
prefect



Also die Idee hat ja was, irgendwann werde ich das mal ausprobieren, aber aus dem Z80 Breadboard könnte ich ein Arduino Shield machen (CP/M Shield, funny). Ich weiss nicht. Bin ein bischen hin und hergerissen. Wenn ich den Chip in der Hand hätte würde ich es ausprobieren.

Ist der Z80 wirklich statisch steppable? Ich glaube mich zu erinnern dass jemand sowas mal mit Schaltern und Tastern gemacht hat. Gespenstisch irgendwie.

Während ich das hier schreibe finde ich die Idee immer irrer. Du meinst ich strippe MREQ und IOREQ auf Interrupts vom Ardu, der lässt wait stehen bis er die entsprechenden Werte draussen hat? Ich vermute die Ditigal-IOs werden nicht reichen für den Bus, das ist was für 3 Buffers mit High-Out. Aber die Idee ist haltbar. Also ... chips bestellen. Mal sehen was wird, vermutlich gibt's Rauchzeichen aber naja.

Je länger ich drüber nachdenk: alles was der Z80 wollen könnte ist mem oder IO. Der Arduino hat 16MHz und kann als Mega 512k RAM (banked).

Michael, Du machst gerade böse Sachen mit meiner Phantasie. Ok, den Exerciser brauche ich trotzdem, denn auf so nem Ding würde ich auch ein CP/M fahren. Das wird langsam aber sehr authentisch ;-) Auf einem Proto-shield.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
028
12.05.2012, 00:50 Uhr
m.haardt



Es ist nicht statisch, weil Du die Clock nicht anhältst. Ob das geht, könnte vom CPU-Typ abhängen. Aber es gibt keine Grenze für die Anzahl der Waitstates.

Es gibt Schaltungen, die Polling auf I/O Ports beschleunigen, indem sie /WAIT hochhalten, bis Daten bereit sind. So spart man sich die Pollingschleife. Mit dem Signal wird viel Unsinn gemacht.

Du kannst auch nach jedem Befehl ein paar Befehle einstreuen, die den Zustand sichern, ausgeben, und dann zurück zur eigentlichen Adresse springen. Schliesslich musst Du ja nicht den Inhalt eines RAMs ausgeben, sondern kannst dem Z80 dynamisch generierten Code verfüttern.

Michael
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
029
12.05.2012, 01:34 Uhr
prefect



Ok ich konnte nicht widerstehen. Ich mal Reichelt bereichelt und übliche Verdächtige bestellt. Genug um eine Prototypenboard mit einem "direkt"-Z80 zu bauen und ggfls. noch einen oder zwei mit RAM.

Wenngleich ich die RAM Variante nach einigem Nachdenken doch favorisiere, der Gedanke des Direkt-Z80 hat was. Das ist was für unter Plexiglas: ein Arduino spendet einem Z80 I/O, RAM, disk, Ethernet, etc. Ok der wird kaum schneller sein als mein Emulator. Aber die Idee reize ich mal aus, das sind bestimmt 2-3 spannende Wochenenden bis da ein CP/M drauf läuft!
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
030
12.05.2012, 01:39 Uhr
prefect



Einen "authentischen" CP/M computer aus: 1 Arduino (25€), 1 QuadRAM mit 512kB RAM (25€), 1 SD port (6€) auf einem Protoboard mit Z80 und etwas LS s*x. Dann noch die RAMs seriell mit 64kB über SPI auf das Protoboard quetschen und es entfällt das QuadRAM.

Hat was! Aufgrund des recht teuren QuadRAMs von RaggedCircuits wäre ein SRAM auf dem Protoboard nun wohl sogar billiger, aber naja, kommen lassen und amüsieren.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
031
12.05.2012, 01:49 Uhr
prefect



Michael, für nur einen Exerciser ist mir die Idee zu schade, wenn schon, dann sollte das richtig arbeiten.

Ich versteh Dich schon richtig, ein nackter Mega-Arduino hat genug I/O um den Z80 ganz einfach DIREKT anzukleben und zu füttern und mit 8k hat der Ardu genug RAM um die Test-cases durchzufahren. Wird sicher gehen.

Aber ich will angeben und ich denke ein "Z80-shield" auf Basis eines Proto-Boards ist das was ich wirklich will. ;-)

Das kann ich dann in passiv und aktiv bauen, also ohne oder mit RAM.

Ich denke: mit RAM kann der Z80 sich richtig austoben. I/O kann der Arduino dann offline abhandeln. Austausch über interrupt und shared buffer. Ganz entsprechend der Logik der guten alten Z80 Karte im Apple II. Das würde auf eine Mega-Proto-Karte passen und hätte die volle Speed vom Z80.

Effektiv gäbe das meiner eigentlichen Idee "embedded/industrial/control" Aufgaben mit CP/M zu entwickeln sogar noch eine zusätzliche Option.

Mal sehen, ich glaube das ist was kommen musste: früher oder später lief es auf Hardware hinaus.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
032
12.05.2012, 02:07 Uhr
prefect



Heute sind ein 3 Wyse Terminals (10€/Stück) angekommen und ein Igel (30€). Diese alten Wyse-Thinclients sind mit AMD/K6-III ausgestattet und 256MB RAM. Drinnen rasselt ein Compactflash als Platte.

Theoretisch sind die dick genug als CP/M Emulator Plattform. Um RZ etwas zu tunen würde ich eine schnellere Speicherklasse einsetzen (direkteres bankswitching, etc. pp.). Also Linux drauf Textmodus konfigurieren und 2-3 Emulatoren direkt auf die virtuellen Consolen. Ich müßte nur dafür sorgen dass der BIOS call "const" bzw. "conin" der CPU auch mal ne pause gönnen (1/100 sek sleep oder so), damit die Mühle nicht so heizt.

Der Igel hat etwas mehr Macht: 1GHz C3 mit bis zu 1GB RAM (derzeit 256MB).

s*x-Appeal dieser Platform für den RZ: USB für Keyboard vorhanden. Das wird er: der kompakte CP/M-Computer mit VGA/DVI und Netzwerk, USB für Daten und Tastatur. X11 geht auch damit und mit etwas Glück läuft da sogar die Arduino development Umgebung drauf. Dann feier ich! Einschalten ... ok ... warten bis Linux wach ist ... so schnell wie damals meinen HD64180 der aus den batterie gepufferten RAMs bootete wird wohl keiner meiner Rechner jemals wieder booten ;-). Aber wer weiss. Immerhin ... etwas warten und nach dem Linux boot-strap meldet sich auf der Console direkt der Emulator, das wärs doch. Aber es ist noch ein weiter weg. Morgen tu ich mal ein Linux drauf und schau ob ich das erstmal mit yaze hinbekommen.

Das Eisen nimmt ganze 20 Watt im Betrieb. Das wäre die Platform für die yaze-tests etc.pp. 35€ für den Igel inkl. Versand, und effektiv 12 € inkl Versand für die Wyses ist doch ein Präsent. Wenn der AMDK6 zu tränig ist für den RZ, kein Akt, dann degradier ich die Dinger zu dem was sie sind : Terminals, gut alte V.24 Terminal mit VT52 und VT100 Emu!
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
033
12.05.2012, 02:08 Uhr
prefect



Nachtrag, die Preise sind natürlich nur die Thinclients: nen TFT und nen Keyboard kommen natürlich noch drauf, aber das ist dann eine Stil und Prestige-Frage.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
034
15.05.2012, 00:15 Uhr
prefect



Wegen des CPU back-to-back zwischen Arduino/ATMEL und Z80: ich habe etwas denken lassen.

Also: Der Z80 gibt Laut über MREQ und IOREQ, die könnte man im Arduino auf Interrupt-Eingänge legen.

2 Int Eingänge

Für den Wait gibt es ein Monoflop. Es ist eigentlich immer Wait ausser bei einer steigenden Flanke auf einem Pin. Ich weiss nicht welchen Condensator ich dafür an ein LS123 kleben muss aber das finde ich noch raus.

Bleibt der Bus. Idealerweise nehme ich einfach digitalen IO vom ATMEL den man bei Bedarf auf high schalten kann. Wenn ich nicht genug pins habe (weil ein Quadram den zusätzlichen IO vom Arduino Mega belegt) dann eben über einige Buffer. Mehr als 2x LS 244 und ein mal LS245 wird es nicht brauchen. Damit habe ich aus 24 Leitungen (16 Address und 8 Daten) 12 gemacht: 8 Daten, 3 "Chip-Selects" oder Enables und ein Direction für den 245er.

Dazu kommen noch: die üblichen Verdächtigen um den Z80 zu treten:
Reset, Int, NMI

BusRQ und BusAck werden in diesem Scenario ohne RAM nicht gebraucht, aber warum nicht: Einfach ein zusätzliches Latch und schon gehts (welches wäre das? LS373 oder 374 oder so, denke ich! Darüber gehen dann BusRQ und Reset,Int, NMI . HALT passt auch noch drauf.
In der Gegenrichtung lesen wir BusAck, RD, WR, MREQ und IOREQ über ein LS 244 ... wieder ein pin. Also mit 2 pins und 2 LSen haben wir die grundlegende Steuerung.

Wir sind bei 6 Chips angekommen.

2x LS244 Adressbus
1x LS245 Datenbus
1x LS37x Steuerausgänge
1x LS244 Steuereingänge
1x LS123 Monoflop für Steuerausgänge

Etwas Logik: ein FlipFlop würde den Pin für die Richtungssteuerung des Datenbusses steuern, spart einen Pin.

Bei 6 bit verbleibenden Steuerleitungen für Chips wäre ggfls ein LS138 eine Hilfe für eine korrekte Addressierung der Chips.

Mit 8 ICs plus CPU müsste es also zu machen sein. Von diesen würden die meisten nicht gebraucht wenn der Arduino genug Leitungen frei hat:

16 Adressen
8 Daten
4 Control
3 Interrupt und Reset
2 Bus-Control
1 Wait
==
34 digital I/Os

Das ginge auf einem Arduino aber man büsst dabei das RAM-Interface ein.



Eine weitere Lösung wäre ein MCP23S17 Port Extender für SPI. Diese Lösung kommt mir generell pfiffiger vor, für den Anfang: erheblich weniger Kabelage: 1 für Adressen, 1 für Control, 1 bit Version davon dür Daten. Drei Chips plus ein Monoflop. Und massiv weniger Drähte. Das ist weitaus eher Breadboard-fähig. Und SPI mit Port-Extendern ist sicherlich ein Skill der interessant wird. Mit 10MHz d.h. max 1MHz Bandbreite und mehrere Zugriffen pro Befehl wird dies mit der langsamste Z80 den es gibt ,aber spassig.

Da die SPI Port Extender Interrupt-Fähig sind, reicht sogar eine Interrupt-Leitung. Durch daisy-chaining kann die gesamte Kommunikation auf 5 pins ablaufen:
MISO, MOSI, SCLK, SS, Int

Das wäre schon ein Spielzeug. Insbesondere funktioniert die Schaltung an jedem Microcontroller, der SPI kann, mit wenigen Handgriffen.

Mal sehen. Ich order noch ein paar von den Port-Extendern.

Dieser Post wurde am 15.05.2012 um 00:28 Uhr von prefect editiert.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
035
15.05.2012, 00:37 Uhr
prefect



Durststrecke ... seit Tagen versuche ich die ALUOPs für IX/IY+1 zu debuggen.

Irgendwie klemmt es total.

Alle anderen ALUOP werden akzeptiert, aber die DD/FD Prefixes nicht. Ich such mir nen Wolf. Innerlich weiss ich, ich brauche nun meinen Exerciser, aber ich komme da nicht voran. Hoffentlich bringt das lange Wochenende mehr Motivation. Ich vergleiche meinen Code nun zum 1000. Mal mit dem vom Yaze, aber das Flag-Handling etc. ist identisch. Ich hab die Adress-Berechnung geprüft. Auch ok. Ebenso die Behandlung von Flags 3 und 5 in F.

Ich hatte sogar Fehler darin gefunden, aber die waren es nicht.

Es soll nicht einfach sein, so scheint es zumindest.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
036
15.05.2012, 00:41 Uhr
prefect



Was wurmt mich da?

ALUOPs auf normalen Register gehen.
Index-Operationen mit IX/IY+d gehen.

Beides zusammen geht nicht.

Umpf!
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
037
15.05.2012, 01:24 Uhr
prefect



a>zexall
Z80 instruction exerciser
<adc,sbc> hl,<bc,de,hl,sp>.... OK
add hl,<bc,de,hl,sp>.......... OK
add ix,<bc,de,ix,sp>.......... OK
add iy,<bc,de,iy,sp>.......... OK
aluop a,nn.................... OK
aluop a,<b,c,d,e,h,l,(hl),a>.. OK
aluop a,<ixh,ixl,iyh,iyl>..... OK
aluop a,(<ix,iy>+1)........... OK
bit n,(<ix,iy>+1)............. OK
bit n,<b,c,d,e,h,l,(hl),a>.... OK
cpd<r>........................ OK
cpi<r>........................ OK
<daa,cpl,scf,ccf>............. OK
<inc,dec> a................... OK
<inc,dec> b................... OK
<inc,dec> bc.................. OK
<inc,dec> c................... OK
<inc,dec> d................... OK
<inc,dec> de.................. OK
<inc,dec> e................... OK
<inc,dec> h................... OK
<inc,dec> hl.................. OK
<inc,dec> ix.................. OK
<inc,dec> iy.................. OK
<inc,dec> l................... OK
<inc,dec> (hl)................ OK
<inc,dec> sp.................. OK
<inc,dec> (<ix,iy>+1)......... OK
<inc,dec> ixh................. OK
<inc,dec> ixl................. OK
<inc,dec> iyh................. OK
<inc,dec> iyl................. OK
ld <bc,de>,(nnnn)............. OK
ld hl,(nnnn).................. OK
ld sp,(nnnn).................. OK
ld <ix,iy>,(nnnn)............. OK
ld (nnnn),<bc,de>............. OK
ld (nnnn),hl.................. OK
ld (nnnn),sp.................. OK
ld (nnnn),<ix,iy>............. OK
ld <bc,de,hl,sp>,nnnn......... OK
ld <ix,iy>,nnnn............... OK
ld a,<(bc),(de)>.............. OK
ld <b,c,d,e,h,l,(hl),a>,nn.... OK
ld (<ix,iy>+1),nn............. OK
ld <b,c,d,e>,(<ix,iy>+1)...... OK
ld <h,l>,(<ix,iy>+1).......... OK
ld a,(<ix,iy>+1).............. OK
ld <ixh,ixl,iyh,iyl>,nn....... OK
ld <bcdehla>,<bcdehla>........ OK
ld <bcdexya>,<bcdexya>........ OK
ld a,(nnnn) / ld (nnnn),a..... OK
ldd<r> (1).................... OK
ldd<r> (2).................... OK
ldi<r> (1).................... OK
ldi<r> (2).................... OK
neg........................... OK
<rrd,rld>..................... OK
<rlca,rrca,rla,rra>........... OK
shf/rot (<ix,iy>+1)........... OK
shf/rot <b,c,d,e,h,l,(hl),a>.. OK
<set,res> n,<bcdehl(hl)a>..... OK
<set,res> n,(<ix,iy>+1)....... OK
ld (<ix,iy>+1),<b,c,d,e>...... OK
ld (<ix,iy>+1),<h,l>.......... OK
ld (<ix,iy>+1),a.............. OK
ld (<bc,de>,a................ OK
Tests complete

Cool, ich hab den Fehler gefunden. Leider, leider geht Turbo immer noch nicht. Naja, dafür kann es viele Gründe geben. Zexall prüft nicht alles: stack-operationen, jump/call/jr und einige andere nicht. Da werde ich nun erstmal etwas Sichtprüfung machen und dann den Exerciser angreifen.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] -2-     [ CP/M 2.2 ]  



gaby.de

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek