mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Intel 8080 CP/M Emulator für Mikrocontroller (ARM7, ARM9, CortexM3, AVR32)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ole R. (olereinhardt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich möchte Euch hiermit ein kleines Projekt vorstellen...

http://www.embedded-it.de/bsp/demos/8080_emulator.php

Ein Intel 8080 CP/M Emulator für Mikrocontroller. Und das beste dabei: 
Der eigentliche Emulator Code ist nur ca. 4K groß!

Ein ähnliches Projekt wurde bereits in [1] besprochen.

Wolltet Ihr nicht auch schon immer mal Eure alte Textverarbeitung (z.B. 
MicroPRO WordStar) oder Turbo Pascal 1.0 auf einem Mikrocontroller 
laufen lassen?

Die Software ist für das Nut/OS Betriebssystem [2] geschrieben und lässt 
sich damit auf einer Reihe von Plattformen verwenden. Allen voran 
natürlich ARM (auf unserem eNet-sam7X Modul), aber auch AVR32, CortexM3.

Es wird ein vollständiges CP/M System inkl. Terminal- und 
Disc-Controller emuliert.

Da CP/M ein ein Disketten basiertes Betriebssystem ist, werden zwei 
Disk-Images (hier jeweils bis zu 8 MB groß) sowie das Bios des 
emulierten Rechners benötig. Alles zusammen wird auf einer SD-Karte 
abgelegt.

Für ein minimales System sind damit z.B. nur ein At91sam7x512, ein 
SD-Sockel sowie etwas Vogelfutter nötig.

Getestet habe ich das Programm auf dem Ethernut 3 board sowie unserem 
eNet-sam7X. Es sollte jedoch ohne größere Änderungen zumindest auch auf 
dem Elektor Internet Radio (EIR), Ethernut5, etc. laufen.

Minimalvoraussetzungen für den nachbau sind eigentlich lediglich
- eine CPU, für die ein Nut/OS Port existiert
- ein SD-Karten Slot
- ca. 80kByte RAM (davon werden 64K für das CP/M System benötigt).

Diverse interessante Retro-Computing Software findet sich im übrigen 
unter [3].

Da das ganze OpenSource ist freue ich mich natürlich über alle Ideen, 
Vorschläge und Erweiterungen!

Viele Grüße,

Ole



[1] Beitrag "CP/M auf ATmega88"
[2] http://www.ethernut.de
[3] http://www.retroarchive.org

Autor: Ole R. (olereinhardt)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry... Bild vergessen...

Anbei ein Screenshot der Ausgaben des laufenden Emulators (in minicom).

Viele Grüße,

Ole

Autor: Michael E. (cuby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ole,

long time no see :-).

Ole Reinhardt schrieb:
> Turbo Pascal 1.0

Hmm... war Turbo Pascal nicht Z80-only?

Grüße,
    Michael

Autor: Maestro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ole Reinhardt schrieb:
> auf unserem eNet-sam7X Modul

Üble Schleichwerbung...

Erinnert irgendwie an Robert Teufel, der damals für NXP Guerilla-Werbung 
hier gemacht hat...

Autor: Ole R. (olereinhardt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dass es Leute gibt, die zufällig auch noch selber Hardware 
herstellen...

Hier geht es jedoch konkret um ein reines Hobby und dazu auch noch 
OpenSource Projekt, welches völlig Hardware unabhängig ist (im Rahmen 
dessen, was von Nut/OS supported wird).

Das hat nicht im geringsten was mit Schleichwerbung zu tun.

Nut/OS ist im übrigen ebenfalls ein OpenSource Projekt unter BSD 
Lizenz...

Viele Grüße,

Ole

Autor: Andreas J. (antibyte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der verwendete Emulator von Óscar Toledo Gutiérrez ist ja mal
absolut krass.
Das der den Code noch selbst verstanden hat kann man kaum glauben.
Eine komplette 8080 Emulation mit zwei Seiten Code ... Wahnsinn.
Sein Schachprogramm ist genauso heftig. 1,4K Quelltext.

Der komplette Emulator :
                               #include <stdio.h>
           #define n(o,p,e)=y=(z=a(e)%16 p x%16 p o,a(e)p x p o),h(
                                #define s 6[o]
             #define p z=l[d(9)]|l[d(9)+1]<<8,1<(9[o]+=2)||++8[o]
                                #define Q a(7)
           #define w 254>(9[o]-=2)||--8[o],l[d(9)]=z,l[1+d(9)]=z>>8
                               #define O )):((
                  #define b (y&1?~s:s)>>"\6\0\2\7"[y/2]&1?0:(
                               #define S )?(z-=
                    #define a(f)*((7&f)-6?&o[f&7]:&l[d(5)])
                               #define C S 5 S 3
                       #define D(E)x/8!=16+E&198+E*8!=x?
                             #define B(C)fclose((C))
                       #define q (c+=2,0[c-2]|1[c-2]<<8)
                          #define m x=64&x?*c++:a(x),
                         #define A(F)=fopen((F),"rb+")
                    unsigned char o[10],l[78114],*c=l,*k=l
                          #define d(e)o[e]+256*o[e-1]
#define h(l)s=l>>8&1|128&y|!(y&255)*64|16&z|2,y^=y>>4,y^=y<<2,y^=~y>>1,s|=y&4
+64506; e,V,v,u,x,y,z,Z; main(r,U)char**U;{

     { { { } } }       { { { } } }       { { { } } }       { { { } } }
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } }
      { { ; } }      { { {     } } }      { { ; } }      { { {     } } }
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } }
     { { { } } }       { { { } } }       { { { } } }       { { { } } }

                                   for(v A((u A((e A((r-2?0:(V A(1[U])),"C")
),system("stty raw -echo min 0"),fread(l,78114,1,e),B(e),"B")),"A")); 118-(x
=*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x&
207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7)(z=x-2 C C C C
C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9
[o]=a(5),8[o]=a(4) O 237==*c++?((int (*)())(2-*c++?fwrite:fread))(l+*k+1[k]*
256,128,1,(fseek(y=5[k]-1?u:v,((3[k]|4[k]<<8)<<7|2[k])<<7,Q=0),y)):0 O y=a(5
),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x]
,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z||read(0,&Z,1),1&*c++?Q=Z,Z=0:(
Q=!!Z):(c++,Q=r=V?fgetc(V):-1,s=s&~1|r<0) O++c,write(1,&7[o],1) O z=c+2-l,w,
c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s|=1 O q[l]=Q O Q=~Q O a(5)=l[x=q]
,a(4)=l[++x] O s|=s&16|9<Q%16?Q+=6,16:0,z=s|=1&s|Q>159?Q+=96,1:0,y=Q,h(s<<8)
O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s&~1|x O Q=l[d(3)]O x=Q  /
128,Q=Q*2+s%2,s=s&~1|x O l[d(3)]=Q O s=s&~1|1&Q,Q=Q/2|Q<<7 O Q=l[d(1)]O s=~1
&s|Q>>7,Q=Q*2|Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q|=x,h(y) O m z=0,
y=Q^=x,h(y) O m z=Q*2|2*x,y=Q&=x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y)  O
m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s|Q<<8,w O p,r-8?o[r+1]=z,r
[o]=z>>8:(s=~40&z|2,Q=z>>8) O r[o]--||--o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4)
+o[r-1]+z/256,s=~1&s|z>>8 O ++o[r+1]||r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w
,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y
,x=0,a(r)n(1,-,y)s<<8) O r=y,x=0,a(r)n(1,+,y)s<<8))));
system("stty cooked echo"); B((B((V?B(V):0,u)),v)); }

Autor: Ole R. (olereinhardt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andreas,

genau. Für die Nut/OS Portierung musste ich allerdings ein paar 
Kleinigkeiten anpassen. War gar nicht so einfach sich in den 
obfuscateten Code einzuarbeiten.

Das coolste ist jedoch, dass ca. 30 % des Quelltextes auf die Klammern 
(8080) drauf gehen...

Btw: Der oben gepostete Code läuft im übrigen so 1a unter Linux. Einfach 
ein

gcc -o 8080 8080.c

und dann die drei Dateien

A, B und C (C --> c_bios.bin oder c_basic.bin)

zur Verfügung stellen.

Autor: Ole R. (olereinhardt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Engel schrieb:
> Hmm... war Turbo Pascal nicht Z80-only?

Hm, in der Tat :) Wikipedia lügt... Ich hatte es zuvor tatsächlich nur 
auf einem Z80 Emulator getestet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.