Forum: Mikrocontroller und Digitale Elektronik KIM-1 in AVR?


von Peter S. (petersieg)


Lesenswert?

Hallo.

Über diesen Weg, möchte ich eruieren, Gedanken sammeln und am besten 
Gleichgesinnte begeistern für eine mögliche KIM-1 Implementierung mit 
einem AVR.

Nun, für alle, die es bisher noch nicht wußten.. was ist ein KIM-1?
KIM-1 ist ein sog. Single-Board-Computer auf 6502 Basis mit 6x7-Segment 
Display und 4x6 Matrixtastatur (und serieller Schnittstelle!).
Das System verfügt über 1kb Ram und 2kb Rom. Das Rom enthält einen 
rudimentären Monitor, der unter anderem die Programmierung über die HEX 
Tastatur erlaubte.

Zu seiner Zeit erlangt der KIM-1 eine 'weite' Verbreitung und 
Berühmtheit,
der er einer der ersten Computer war, der 'erschwinglich' war.

Es gab so einige 'Programme' für den KIM-1.. darunter auch MicroChess!

Ein orig. KIM-1 dürfte heute mehr kosten als der damalige Preis (um 
1977),
wenn man ihn überhaupt mal zu kaufen bekommt!

Es gibt aktuell einen Nachbau von Briel Computer aus den USA für 99€ als
Bausatz (ich habe mir einen bestellt ;-) ).

Nun, die Frage.. 6502 Emulationen auf AVR gibt es ja bereits!
7-Segment und Tastaturmatrix sollten auch kein größeres Problem sein..?
Und serielle Kommunikation können heutige AVR's von zuhause aus.

Sähen sich hier interessierte in der Lage und hätten Lust sich an einem
solchen Projekt zu beteiligen..?

Ziel wäre es, einen KIM-1 mit einem AVR nachzubauen. Ideal mit möglichst 
'echtem' Feeling = 6x7-Segmentanzeige und 6x4 Matrixtastatur.
Obwohl zumindest als Alternative der KIM-1 auch komplett über die 
serielle Schnittstelle 'bedient' werden kann..

Ich selber verfüge NICHT über die nötigen Fertigkeiten und Kenntnisse in 
C auf einem AVR! Ich bin mehr der 
Koordiniererer/Dokumentierer/Nachbauer/Tester... ;-)

Als AVR sähe ich in erster Näherung einen ATmega644/1284..?

EDIT: Zum Einstieg einige englische Textdokumente im ZIP Archiv..


Peter

von Karl H. (kbuchegg)


Lesenswert?

ketzerische Frage:

Wenn du sowieso nicht programmieren willst, wozu brauchst du dann einen 
KIM?

Um so einen Nachbau zu machen, bräuchte man als allererstes die 
Schaltpläne vom KIM. die 6502 CPU ist eine Sache, aber die Peripherie 
rundherum ist eine andere Sache. Die muss ebenfalls in Software 
nachgebildet werden, wenn du die Originalprogramme laufen lassen willst.

von Peter S. (petersieg)


Angehängte Dateien:

Lesenswert?

Nun, da waren die 15min wohl um... Hier die Texte..

@Karl heinz: Wer sagt, das ich keine Programme FÜR den KIM-1 schreiben 
will?
Ich bin generell fasziniert von der Anfangszeit der Computer.. also ein 
Retro-Freak ;-) Und dazu auch noch Minimalist.. reicht das als 
Begründung.. ;-)

Schaltplan bekommt du hier angehangen.. ob man das aber wirklich genau 
so
nachbilden MUSS, kann ich z.Z noch nicht abschließend sagen.. ggf. 
reicht es
sogar, die 7-9 Monitorroutinen abzufangen und nachzubilden..?


Peter

von Peter S. (petersieg)


Angehängte Dateien:

Lesenswert?

Hier der Schaltplan..

Hier die Monitorroutinen:
1
                                  KIM SUBROUTINES
2
3
CALL         ADDRESS  ACTION            ARG   RESULT  NOTES
4
JSR AK       1EFE     Check for         -     A       A = 0 = Key down
5
                      key depressed                   A<>0 = No Key down
6
                                                      X & Y lost
7
8
JSR GETKEY   1F6A     Get key from      -     A       A>15 illegal
9
                      keyboard                        or no key
10
11
JSR SCANS    1F1F     Display F9, FA,   F9.   -       A, X, Y are lost
12
                      FB                FA,
13
                                        FB
14
15
JSR GETCH    1E5A     Put character     -     A       X preserved
16
                      from TTY in A                   Y = FF
17
18
JSR PRTBYT   1E3B     Prints A as       A     -       A preserved
19
                      2 Hex Char.                     X preserved
20
                                                      Y = FF
21
22
JSR PRTPNT   1E1E     Prints Contents   FB,           A lost
23
                      of FB & FA        FA            X preserved
24
                      on TTY                          Y = FF
25
26
JSR OUTCH    1EA0     Print ASCII char  A     -       Xis preserved
27
                      in A on TTY                     Y = FF
28
                                                      A = FF
29
30
JSR OUTSP    1E9E     Print a space     -             A = FF
31
                                                      X preserved
32
                                                      Y = FF
Peter

von Peter S. (petersieg)


Angehängte Dateien:

Lesenswert?

Und hier das ROM inkl. 6502 Assemblerquelltext. Das kann man so auch im 
I-Net finden! Aber da nicht 100% das (C) klar ist, darf es nur für 
eigene Schulungszwecke verwendet werden!


Peter

von Thomas W. (diddl)


Lesenswert?

Es ist möglich eine 1MHz CPU (6502) in Echtzeit zu emulieren mit einem 
AVR der mit 18 MHz getaktet ist. Das wurde bei der NES Emulation bereits 
nachgewiesen:

NES Emu: 
http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2009/bhp7_teg25/bhp7_teg25/index.html

Ich habe mich vor einiger Zeit mit einem sehr ähnlichem Projekt 
beschäftigt: die Emulation einer 1541 Floppy, die technisch gesehen 
einem KIM-1 sehr ähnlich ist:

1541-Emul: http://t-winkler.net/dokuwiki/doku.php?id=1541-emul:start

Dabei habe ich diese NES Emulation als Basis verwendet.


Der KIM-1 könnte problemlos laufen. Man müsste aber die Tastatur und die 
7 Segment LED Anzeige auch am AVR anhängen. Oder möchtest du das über 
ein Terminal emulieren?

von Entwickler (Gast)


Lesenswert?

Wenn ich mich richtig erinnere, wurde beim KIM ein Programm als Hexcode 
eingehackt und dann laufen gelassen.
Der AVR hat den Haken, dass Programme nur aus dem Flash-ROM und nicht 
aus dem RAM laufen können. Wie willst Du das Problem lösen?

Welcher Cassettenrecorder soll denn zur Abspeicherung verwendet werden? 
:-)

von visitor (Gast)


Lesenswert?


von .,.,.,.,.,.,. (Gast)


Lesenswert?

Es geht doch um einen Emulator... und der kann die zu interpretierenden 
Befehle problemlos aus dem RAM holen...

von Thomas W. (diddl)


Lesenswert?

Ja, ein Mega644 hat genug RAM für einen KIM im Grundausbau.

Das ROM könnte man bequem im Flash ablegen.


Der Emu läuft als virtuelle CPU deren Adressraum aus AVR RAM und Flash 
zusammengesetzt wird. IO Zugriffe werden emuliert auf eigenen IO.

von Thomas W. (diddl)


Lesenswert?

Selbst im Maximal-Ausbau würde ein KIM locker von einem 644er abgedeckt 
werden:

1K RAM bis maximal 5K RAM
2K ROM

Der KIM hat nur einen Adressraum von 8KB der 8 mal gespiegelt ist.


Die 7-Segment Anzeige gibts auch schon fertig bei myAVR:
http://shop.myavr.de/index.php?sp=article.sp.php&artID=200018


Man müsste nur noch eine passende Tastatur finden.


Es gibt auch KIM mit einer seriellen Schnittstelle, die könnte man auf 
den internen UART des Atmega umleiten.

:)

von Thomas W. (diddl)


Lesenswert?

Blödsinn, das Teil von myAVR hängt an einem 74HC4511, der kann leider 
nur BCD darstellen ...

von bongo (Gast)


Lesenswert?

Wenn es eine 6502-Emulation für den Mega644 gibt, wäre doch eine 
Emulation des PET 2001 bzw. des C64 für Mega644 o.ä. eine feine Sache. 
Weiss jemand, ob es das schon gibt?

von Dr.PillePalle (Gast)


Lesenswert?

moin

hab das letztens mal für VC20 gesehen ,ob hier im Forum k.a.
und es gibt diese Spiele Joysticks mit C64 emulation für ca.20€ da ist 
irgendein AVR verbaut.

mfg

von Peter S. (petersieg)


Lesenswert?

@alle: Thomas Winkler hat eine 6502 Emulation für AVR erstellt, die 
läuft.. ist aber für den damals gedachten Zweck (1541 Emulation) etwas 
zu langsam..

@Dr.PillePalle: Im sog. 64DTV Joystick mit ca. 30 C64 Programmen werkelt 
kein AVR, sondern ein custom progr. ASIC Chip (quasi eine fest geflashte 
FPGA Variante).

Ich denke VC20/PET etc. in einem einzigen AVR dürfte z.Z noch nicht 
machbar sein.. Es gibt allerdings einige Projekte, die in eine solche 
Richtung (= Basic Selbstbaucomputer mit AVR) gehen.. aber keine 
Kompatibitität mit den genannten (Home)Computern anstreben.. Zur Zeit 
scheint es aber möglich zu sein, einzelne Chips solcher Computer durch 
eine AVR Ersatzschaltung ersetzen zu können (siehe z.B SwinSID als SID 
Ersatz).

Wobei ich noch darauf warte, das jemand mal eine 6502/10, 6526, 6520, 
VIC
Ersatz bastelt..

Zurück zum Thema!
KIM-1 sollte machbar sein.. da (kein) Sound und keine aufwendige 
Bildschirmsteuerung..

Peter

von Thomas W. (diddl)


Lesenswert?

Update: ich habe die NES Emulation angepasst auf das Speichermodell des 
KIM-1.


Die NES Emulation läuft leider etwas langsamer wie ein 1MHz 6502 bei 
einem AVR Takt von 20MHz. Vielleicht lässt sich da noch was optimieren.

Aber Geschwindigkeit ist ja nicht alles. Ich gebe die Zugriffe auf die 
6530 Ports direkt auf die Atmega644 Ports aus. Damit sollte Tastatur und 
7-Segment funktionieren.


Ich habe mir nun 7-Segment und Printtasten bestellt. In den nächsten 
Wochen werde ich das mal auf einer Lochraster aufbauen und testen.

von Detlev T. (detlevt)


Lesenswert?

Ein 6502 müsste meiner Meinung nach in ein FPGA zu bekommen sein. Das 
muss man nicht mit einem AVR machen.

Über eine Art Retro-Computer denke ich inzwischen auch schon verschärft 
nach seitdem der ATMEGA1284p im DIP-Gehäuse erhältlich ist. Mit 16kiB 
SRAM fängt das ja an, interessant zu werden.

Lösungen für eine integrierte Alpha-Nummerischen Videoausgabe (TV und 
VGA) gibt es ja auch schon. Bei VGA bleiben vielleicht dann nur 15% der 
Rechenleistung, das sollte aber in etwa für C64-Niveau reichen.

Größtes Problem ist der Basic-Interpreter. Den werde ich wohl selbst 
schreiben müssen. Gefunden habe ich leider noch nichts, was auch nur 
annähernd meinen Ideen nahe kommt. Auch wenn ich z.B. für Berechnungen 
auf die gcc-Bibliotheken zurückgreifen kann, bleibt da eine Menge 
Arbeit.

Reiner "Spielkram" soll das auch gar nicht werden. Ich kann mir durchaus 
vorstellen, dass man wenig zeitkritische Projekte auch mit so einem 
Interpreter abwickeln kann. Und der Zugang zu Mikrocontrollern wäre so 
viel einfacher, wenn man nicht gleich zu Beginn sich mit Toolchain, 
Programmer und Fuses auseinander setzen muss, sondern Befehle "einfach 
mal so" eingeben kann und sieht, was die machen.

Schaun mer mal. Zur Zeit entwerfe ich noch die Hardware. Wenn etwas 
dabei heraus kommt, sage ich Bescheid. ;-)

von Joerg F. (felge1966)


Lesenswert?

Ganz ausschließen würde ich nicht, daß der AVR eine Emulation 
hinbekommt, denn für einen CP/M Rechner hat es ja auch mal gereicht.

http://pmd85.topindex.sk/

von Thomas W. (diddl)


Lesenswert?

Ich bin überzeugt es geht, allerdings sind meine Assembler Künste am AVR 
sehr sehr beschränkt.

Und die Kombination AVR Assembler und C im GCC habe ich auch noch nicht 
vollständig geblickt ...

von Detlev T. (detlevt)


Lesenswert?

Einen 6502 zu emulieren dürfte deutlich einfacher sein als ein 8080 - 
oder gar Z80. Der hat eigentlich nur drei Register (A,X,Y), weniger 
Adressierungsmöglichkeiten und der Stack kann nur im Bereich 0x0100 bis 
0x01ff liegen, wobei der Stackpointer nur 8Bit groß ist.

Ich würde wahrscheinlich eine rjmp-Tabelle mit 256 Einträgen machen, für 
jeden OP-Code eine eigene Routine. Die springt man dann mit einem ijmp 
an und gut. Ist ein bisschen Fleißarbeit, aber nicht wirklich 
kompliziert.

Bei dem CP/M-Projekt hat man sich aus meiner Sicht zu viel Arbeit 
gemacht, als man die Arbeitsweise des Prozessors selbst (Laden, 
Verarbeiten, Speichern) im Detail nachgebaut hat. Das BIOS hätte man 
zudem nativ in AVR anlegen können anstatt auch hier emulierten 8080-Code 
zu verwenden. Dann wäre das sicher auch performanter.

von Michael E. (cuby)


Lesenswert?

Peter Sieg schrieb:
> Hier der Schaltplan..

Das scheint mir aber nicht der original KIM1-Schaltplan zu sein - der 
hatte IIRC 8 Stück 6102 (1k x 1!) SRAMs und das Monitor-ROM fest in den 
6530 drin (je 1k x 8 IIRC).

Aber das wäre schon ne schöne Ergänzung zum 8080 mit CP/M im AVR :-) - 
vielleicht sogar mit erträglichem Aufwand zum Apple II erweiterbar...

(Edit: stimmt, zum Apple II gab's ja auch schon was - 
http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/bcr22/final%20webpage/final.html 
- die Jungs sind aber nicht wirklich weit gekommen)

-- Michael

von Thomas W. (diddl)


Lesenswert?

Eine AVR lib die eine 6502 bei 1 MHz Taktgenau emuliert, - das wäre ein 
absoluter Traum.

Es gäbe so viele Projekte die man darauf aufbauen könnte!

von Sigint 112 (sigint)


Lesenswert?

Detlev T. schrieb:
> Ein 6502 müsste meiner Meinung nach in ein FPGA zu bekommen sein. Das
> muss man nicht mit einem AVR machen.

Ah, statt mit Kanonen willst du mit Atombomben auf Spatzen schießen?!?
In einen durchschnittlichen FPGA bekommst du mehrere AVR rein, die dann 
auch noch besser und schneller sind. Und ein 6502 ist ein absoluter Witz 
für einen FPGA, da bekommst du ganze Rechner drin unter. (MINIMIG, 
C-One, FPGA64,Zet-Processor, etc. etc.)



> Lösungen für eine integrierte Alpha-Nummerischen Videoausgabe (TV und
> VGA) gibt es ja auch schon. Bei VGA bleiben vielleicht dann nur 15% der
> Rechenleistung, das sollte aber in etwa für C64-Niveau reichen.

Ach, C64 Niveau?!? Und was ist mit den ganzen Custom-Chips?!?
(VIC,SID,VIA) Ich möchte sehen, wie du das in den 15% unter bekommst.

Vieles ist mit den AVR machbar, aber nicht alles.
Aber so Sätze wie "müsste gehen" oder "geht nicht" mag ich nicht leiden, 
wenn man sich noch garnicht praktisch mit dem Thema beschäftigt hat.

Soviel von meiner Seite...

Gruß,
  SIGINT

von Peter Sieg (Gast)


Angehängte Dateien:

Lesenswert?

@SIGNINT: So ist es! Willkommen im Thread ;-)

Hier noch ein paar Links:
Orig. Commodore Unterlagen und Info's:
http://www.commodore.ca/products/kim1/mos_kim1.htm

Micro-KIM Nachbau von Briel Computer:
http://www.brielcomputers.com/micro-KIM.html

Tools:
http://www.6502.org/tools/emu/

Von dort kann ich den Soft6502 und die von diese Seite ebenfalls
verfügbaren Assember (CBA65) und Disassembler empfehlen:
http://www.crbond.com/soft6502.htm

Z.Zeit bin ich dabei auf Basis:
http://www.piumarta.com/software/lib6502/
einem KIM-1 Emulator auf PC Basis zu implementieren, wobei ich NUR die
3 Nicht-TTY Monitorroutinen abfange und das KIM-1 Rom gar nicht 
verwende.
Erste Testprogramme laufen schon.. Lunar Lander mußte ich ersteinmal
mühsam von Fehlern bereinigen.. aber jetzt kann ich den CBA65 ASM Source
in ein 1:1 bytegleiches BIN File assemblieren..
Sobald auch Lunar Lander in meinem Emulator läuft.. lade ich den 
Emulator  hier mal hoch.. und danach mache ich mich an MicroChess.. ;-)
(Das wird nur ein absolut minimalistischer Emulator werden! Und das ist 
so
von mir auch beabsichtigt!)

Peter

von Detlev T. (detlevt)


Lesenswert?

Sigint 112 schrieb:
> Ach, C64 Niveau?!? Und was ist mit den ganzen Custom-Chips?!?
> (VIC,SID,VIA) Ich möchte sehen, wie du das in den 15% unter bekommst.

Oha, da fühlt sich aber jemand auf den Schlips getreten. Äh, ich wollte 
natürlich "Apple][ -Niveau" schreiben. ;-)

Wo bitteschön habe ich behauptet, ich wolle einen kompletten C64 auf 
einem AVR simulieren? Ich sprach von "Rechenleistung", also wie schnell 
ein Basic-Interpreter da wohl vermutlich sein könnte. 15% von 25MHz 
machen in etwa 4MHz "effektive" Taktrate aus, das muss man mit dem 1MHz 
damaliger Rechner vergleichen. Ein RISC-Prozessor braucht im Mittel da 
vielleicht doppelt so viele Befehle, das sollte insgesamt ungefähr 
hinkommen. Es soll aber wie beim ZX81 auch einen "FAST-Modus" geben :-) 
, wo nur noch die Sync-Signale erzeugt werden.

Das mit "noch nicht praktisch beschäftigt" lasse ich für mich nicht 
gelten. Das Pflichtenheft für die Hardware ist fertig. Der Sprachumfang 
des Basic praktisch auch. Das Layout ist begonnen, ich komme wohl mit 
1/4 Eurokarte aus, auch ohne SMD. Immerhin 8 I/O-Pins (digital I/O oder 
ADC), 2 x PWM und ein Interrupt werden verfügbar und vom 
Basic-Interpreter aus ansprechbar sein.

Die Ausführgeschwindigkeit solcher Programme liegt dann natürlich weit 
unter dem, was man mit einem Compiler erreichen könnte, eben auf 
C64-Niveau. Oder Apple ][ - Niveau. Oder PET2001-Niveau. Oder....

von Thomas W. (diddl)


Lesenswert?

Die NES Geschichte verwendet eh schon eine Sprungtabelle für alle 256 OP 
codes. Leider ist der Rest in reinem C und zu langsam. Außerdem keine 
Clock Synchronisation.

Der Apple-II Ansatz gefällt mir sehr, kritische Teile sind in Assembler 
implementiert. Leider braucht man dazu den IAR Compiler und mit AVRGCC 
lässt es sich nicht compilieren weil die ASM Einbindung ganz anders ist.


Es gibt allein hier im Forum schon zwei Ansätze eine 6502 zu emulieren 
mit einem AVR die in reinem Assembler geschrieben sind.

Beitrag "Re: 6502 Emulation auf AVR ?"
Beitrag "Re: 6502 Emulation auf AVR ?"



Kann mir jemand erklären und an einem Beispiel vorführen wie man mit 
AVRGCC richtig Assembler und C mischt? Ich kenne die Beschreibung:

http://www.rn-wissen.de/index.php/Inline-Assembler_in_avr-gcc

Aber ich bin leider nicht in der Lage das aufgrund dieser Beschreibung 
umzusetzen. Mir ist das irgendwie zu komplex.

von Peter Sieg (Gast)


Angehängte Dateien:

Lesenswert?

Soo.. nachdem ich mich nun einige h verweifelt versucht habe kbhit(), 
getch() unter Vista und Dual Core und mingw dazu zu bewegen, das zu 
machen, was ich möchte.. gebe ich erseinmal auf.. ich lade das ganze 
lib6502 emu Verzeichnis mal hoch.. evtl. weiß ja jemand weiter..

Das Problem scheint zu sein, das selbst wenn ich die taste gedrückt 
halte, mind. 15x keine Taste zurück kommt und erst dann mal wieder die 
gedrückte..

Damit läuft Lunar Lander nie..
Ach war DOS doch schön ;-)

Peter

von Thomas W. (diddl)


Lesenswert?

Hier ist der Link eines VC-20 nachbau mit einem Atmega 8:

http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_type=project&item_id=400



Das Teil ist komplett in Assembler geschrieben und läuft 1,5 bis 2 mal 
so schnell wie ein 6502 mit 1MHz bei einer Atmega Taktrate von 16MHz.

Das ist der Beweis das es in Assembler möglich wäre den 6502 in Echtzeit 
zu emulieren.

von Michael E. (cuby)


Lesenswert?

Thomas Winkler schrieb:
> Hier ist der Link eines VC-20 nachbau mit einem Atmega 8:
>
> http://www.avrfreaks.net/index.php?module=Freaks%2...

Leider etwas wenig Beschreibung bei (oder hab ich die übersehn?). Aus 
dem Projektfile für AVR Studio ergibt sich, dass ein ATmega 128 benutzt 
wurde, der laut Webseite mit 16 MHz lief. Gewundert hatte ich mich über 
die Screenshots des LCD, in denen 28kB BASIC-Speicher angezeigt wurde - 
da wird laut Projektdatei das externe SRAM-lnterface verwendet. Der 
LCD-Anschluß ist unter 
http://www.belanger.pwp.blueyonder.co.uk/Projects/ANSI%20terminal/Terminal.htm 
beschrieben. Fehlt zum Nachbau eigentlich nur noch die verwendete 
Pinbelegung des AVR, aber die sollte sich durch ein wenig Assembler 
lesen rausfinden lassen.

Das wäre sicher ne gute Basis, auch für ne allgemeine 
6502-Emulations-Library (optional wäre sicher gut, wenn es mit der 
GNU-Toolchain übersetzbar wäre). Leider schreibt der Autor weder auf der 
Webseite noch im Source etwas zu einer Lizenz für seinen Code. Aber da 
hilft vielleicht eine kurze Anfrage.

-- Michael

von Michael E. (cuby)


Lesenswert?

(Zu spät zum editieren...)

Michael Engel schrieb:
> Aber da hilft vielleicht eine kurze Anfrage.

Anfrage ist raus.

-- Michael

von Thomas W. (diddl)


Lesenswert?

Hoffentlich kommt eine Antwort. Das VC-20 Projekt liegt schon ein paar 
Jährchen zurück ...

Wenn die 6502 Library zustande kommen sollte, - ich würde mich gern bei 
der Arbeit beteiligen wenn mir jemand erklärt wie man es richtig macht.

von Michael E. (cuby)


Lesenswert?

Das ging fix. Ich mag nicht direkt aus privaten Mails zitieren, daher 
die Zusammenfassung:

Emile freut sich, dass wir den Code verwenden wollen - er meint, wir 
können damit tun, was wir wollen und er wäre froh, seinen Namen irgendwo 
dabei zu sehen (das ist IMHO selbstverständlich).

Er hatte bisher nicht über eine Lizenz für den Code nachgedacht und ist 
sich nicht sicher, was die passendste Lizenz wäre. Aktuell tendiert er 
zu GPL3.

Gegen GPL3 hätte ich nichts einzuwenden, was denkt ihr? Ich würde mich 
auch bereiterklären, das Projekt auch auf Sourceforge oder Google Code 
zu stellen und zu administrieren.

Habe jetzt schonmal damit angefangen, den Code auf gas-Syntax umzubauen, 
das sollte nicht so lange dauern. Meine Idee wäre, die nicht 
zeitkritischen Teile in C neu zu schreiben und die restlichen 
Assembler-Routinen zu einer gut verwendbaren Assembler Black Box :) zu 
machen.

-- Michael

von Peter Sieg (Gast)


Lesenswert?

Wow! Das hört sich ja prima an!

Peter

von Thomas W. (diddl)


Lesenswert?

Das wäre super und hört sich großartig an!!!

Für mich wäre die Engine sehr wichtig für das KIM-1 Projekt.



Wenn es wirklich Echtzeit schaffen würde, das wäre ein Traum, dann 
könnte ich ein aufgelassenes Projekt von mir wieder aufnehmen, das mir 
sehr sehr wichtig ist:

1541-Emul  ::  Ein Floppy 1541 Ersatz


Bei diesem Projekt müsste man aber zusätzlich die 6502 Befehle mit dem 
AVR Takt synchronisieren. Sodass man zumindest im Schnitt taktgenau zu 
einer 1MHz 6502 CPU wird.

Der Grund ist, zu C64 Zeiten wurde Code geschaffen der auf die Floppy 
1541 geladen wird und diese um Faktor 6 bis 15 beschleunigt.

Dieser Code sendet Daten zum C64 ohne Handshake, also mit ausgezählten 
CPU Takten.


Siehst du eine Chance dass man das taktgenau hinkriegt?

====

Ich dachte an AVR Hardware Timer und an eine Tabelle der Taktzyklen für 
jeden 6502 Opcode.

Die 6502 Engine summiert die "verbrauchten" 6502 Taktzyklen in einer 
uint8 Variable.

So alle 10 CPU Befehle (6502 Opcodes) synchronisiert man die virtuelle 
CPU mit dem AVR Timer. Also man wartet einfach bis die Zeit abgelaufen 
ist, die eine echte 6502 CPU gebraucht hätte. Geht natürlich nur wenn 
die virtuelle schneller läuft.

Wenn nun ein IO Befehl kommt, der ist alleinig zeitkritisch, macht man 
außerordentlich eine Synchronisation.

So wirkt die virtuelle CPU nach "außen" hin taktgenau.


Was meinst du, könnte das klappen?


Man könnte damit eine komplette 1541 Floppy durch einen Atmega1284 + SD 
Interface ersetzen. Und es wäre der perfekte Ersatz, der sogar 
Benutzerprogramme wie Speeder etc. ausführen würde.

Ziel wäre, das 1541-Emul an den C64 anzuschliessen als perfekten Floppy 
Ersatz.

Es gibt ja schon so ein Projekt: SD2IEC

Funktioniert großartig aber leider ohne 6502 Emulation. Daher 
funktioniert das SD2IEC nicht in allen Fällen dh. nicht mit jeder C64 
Software.

von Michael E. (cuby)


Lesenswert?

Thomas Winkler schrieb:
> Wenn es wirklich Echtzeit schaffen würde, das wäre ein Traum, dann
> könnte ich ein aufgelassenes Projekt von mir wieder aufnehmen, das mir
> sehr sehr wichtig ist:
>
> 1541-Emul  ::  Ein Floppy 1541 Ersatz

Mir schwebt ein Apple-I und Apple-II vor...

> Bei diesem Projekt müsste man aber zusätzlich die 6502 Befehle mit dem
> AVR Takt synchronisieren. Sodass man zumindest im Schnitt taktgenau zu
> einer 1MHz 6502 CPU wird.

Ja, wir brauchen hier Zyklenexaktheit - also mehr als eine WCET (worst 
case execution time-Analyse). Dazu gibt es ein paar wissenschaftliche 
Ansätze, die ich mir mal anschaue (z.B. von Puschner/Kirner zu 
single-path). Gut, dass die WCET-Experten hier nebenan sitzen :-).

> Der Grund ist, zu C64 Zeiten wurde Code geschaffen der auf die Floppy
> 1541 geladen wird und diese um Faktor 6 bis 15 beschleunigt.
>
> Dieser Code sendet Daten zum C64 ohne Handshake, also mit ausgezählten
> CPU Takten.
>
> Siehst du eine Chance dass man das taktgenau hinkriegt?

Mal schaun, ich schlage mich grade noch mit gas rum und versuche, den 
Code mit gcc/binutils ans Laufen zu bekommen. Das ist mehr oder weniger 
nervige Fleißarbeit. Danach kann das Zyklen-zählen beginnen...

> ====
>
> Ich dachte an AVR Hardware Timer und an eine Tabelle der Taktzyklen für
> jeden 6502 Opcode.
>
> Die 6502 Engine summiert die "verbrauchten" 6502 Taktzyklen in einer
> uint8 Variable.
>
> So alle 10 CPU Befehle (6502 Opcodes) synchronisiert man die virtuelle
> CPU mit dem AVR Timer. Also man wartet einfach bis die Zeit abgelaufen
> ist, die eine echte 6502 CPU gebraucht hätte. Geht natürlich nur wenn
> die virtuelle schneller läuft.

Wenn die Synchronisierung nicht zu viel Zeit braucht und die "Auflösung" 
von 10 6502-Zyklen reicht, wäre das ein machbarer Ansatz IMHO. Wenn man 
den AVR-Code aber so hinbekommt, dass jeder Ausführungspfad durch den 
Emulationscode für eine Instruktion genauso lange dauert wie auf einem 1 
MHz 6502, wäre es noch besser.

> Wenn nun ein IO Befehl kommt, der ist alleinig zeitkritisch, macht man
> außerordentlich eine Synchronisation.
>
> So wirkt die virtuelle CPU nach "außen" hin taktgenau.
>
> Was meinst du, könnte das klappen?

Ausprobieren kann nicht schaden. Wir haben hier einen einfachen 
Zyklenzähler (mit ein paar Extras) für dsPIC gebaut, der AVR ist da auch 
nicht komplexer.

> Man könnte damit eine komplette 1541 Floppy durch einen Atmega1284 + SD
> Interface ersetzen. Und es wäre der perfekte Ersatz, der sogar
> Benutzerprogramme wie Speeder etc. ausführen würde.
>
> Ziel wäre, das 1541-Emul an den C64 anzuschliessen als perfekten Floppy
> Ersatz.

Hm, dann brauchen wir aber noch defekte Netzteile und einen 
Hitzegenerator, sonst wird die 1541-Emulation nie perfekt :-).

> Es gibt ja schon so ein Projekt: SD2IEC

Small World - Ingo (der SD2IEC-Autor) wird hier am Lehrstuhl öfter 
gesehn :-).

> Funktioniert großartig aber leider ohne 6502 Emulation. Daher
> funktioniert das SD2IEC nicht in allen Fällen dh. nicht mit jeder C64
> Software.

Ja, das Problem ist in dem Fall erstmal, dass die 8 MHz AVRs, die Ingo 
verwendet, sicherlich zu langsam sein werden. Mit 16 oder 20 MHz dürfte 
das schon anders aussehn.

-- Michael

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hallo,

bin derzeit auch dabei, mir eine 6510-Emulation zusammen zu tippen. 
Absolute Taktgenauigkeit ist für mich dabei wichtig, da mich die Idee 
eines C64-Nachbaus mit AVRs reizt. Dabei sind aber die 6502-Opcodes 
recht einfach strukturiert, sie dauern abhängig von den 
Speicherzugriffen. Ich löse das derzeit so, dass die jeweiligen 
Zugriffsroutinen entsprechende Warteschleifen haben je nach den Takten 
in Original. Der Prozessor gammelt dabei zwar meist nur rum, aber auf 
die Art könnte man ggf. sogar das Speicherinterface des 6510 an den 
ATmega-Ports nachbilden.

Michael Engel schrieb:
> Ja, das Problem ist in dem Fall erstmal, dass die 8 MHz AVRs, die Ingo
> verwendet, sicherlich zu langsam sein werden. Mit 16 oder 20 MHz dürfte
> das schon anders aussehn.

Zumindest bei meinem Ansatz könnte es schwierig werden, alle 
2-Takt-opcodes mit unter 16MHz (evtl. auch 20) zuverlässig zu 
verarbeiten. Bin aber mit den opcodes noch nicht durch und habe mich 
auch noch nicht mit den Interrupts beschäftigt, außerdem weiß ich nicht, 
ob meine Idee sonderlich effizient war.

Mark

von Thomas W. (diddl)


Lesenswert?

Das könnte ja eine art 6502 / 6510 Ersatz werden. Das wäre gut falls mal 
die Chips knapp werden.

Nur befürchte ich, der Atmega wird das Bus Timing niemals einhalten 
können.

Für diesen Zweck wird es wohl irgendwann Ersatzchips auf CPLD/FPGA Basis 
geben. Leider ist eine CPU wie die 6502 ein CPLD zu klein und ein FPGA 
zu gross/teuer ...



Wenn du den C64 in Atmega aufbauen möchtest, komplett, nicht nur den 
6510, dann spielt timing in sich ja kaum eine Rolle mehr. Es muss nur im 
Schnitt wieder passen.

Der SID als Custom Chip ist ja schon fertig (SwinSID, Atmega88).

Mit dem VIC-II wirst du wahrscheinlich an die Grenzen stoßen wegen der 
Sprites, Rasterinterrupts etc.

Aber insgesamt wäre das sehr cool!

von Thomas W. (diddl)


Lesenswert?

Die Taster sind da!

Natürlich musste ich die gleich mal in eine Lochraster Platine setzen.


Das hat mich veranlasst mal eine Projekt Page anzulegen:
http://t-winkler.net/dokuwiki/doku.php?id=kim:kim1284

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Nur befürchte ich, der Atmega wird das Bus Timing niemals einhalten
> können.

Da ich ja schon alles nach einem festen Takt ausrichte müsste ich doch 
eigentlich nur die OUTs und INs für den externen Speicher entsprechend 
dem Original ausrichten. Vielleicht sehe ich das zu einfach, aber das 
schlimmste, was meiner Meinung nach passieren kann, wäre, dass man auf 
Subroutinen und Sprungtabellen verzichten müsste. Schwieriger finde ich 
da den Punkt, den Prozessor von extern anzuhalten, wenn der Speicher 
noch anderweitig verwendet wird. Weiß aber nicht, ob das bei der 
1541(meine lief übrigens nur ohne Deckel, sonst konnte sie keinen 
einzigen Sektor einlesen) oder dem Kim-1 eine Rolle gespielt hat.
Bei einem 'Ersatz'-Chip könnte ich auch auf die Idee kommen, die 
'freien' Opcodes sinnvoll zu verwenden, bspw. mit einer Multiplikation. 
Allerdings fehlen auch Pins am Atmega

Thomas Winkler schrieb:
> Mit dem VIC-II wirst du wahrscheinlich an die Grenzen stoßen wegen der
> Sprites, Rasterinterrupts etc.

Du sagst es, die lieben Sprites sind genau mein 'Knackpunkt', sowas wie 
die Eiger-Nordwand eines C64-Emulators mit ATmegas ;-). Ich meine, da 
sind auch andere Projekte dran gescheitert. Zumindest in Echtzeit beim 
Anzeigen der Zeile weiß ich noch nicht weiter. Da das Original mit >7MHz 
gearbeitet hat und die Sprites in Hardware gelöst waren, ist es aber 
vielleicht auch verrückt das mit einem ATmega versuchen zu wollen. Für 
Basic-Programme und Spiele ohne intensive Grafiknutzung würde es zwar 
reichen die im VSync vorzuberechnen, aber (sofern die Disketten noch 
lesbar sind) verschiedene selbstgeschriebene Demos von ganz früher halt 
nicht und so einige Lieblingsspiele aus der Kinderzeit könnte ich auch 
vergessen. Da reicht dann die Motivation oft nur für 'ne Stunde hier und 
da mal ;-)

Mark

von Thomas W. (diddl)


Lesenswert?

Nö weder bei KIM noch bei 1541 spielen Bustiming oder externe CPU 
Signale eine Rolle. Der KIM ist überhaupt unkritisch, solange man das 
Kassetten Interface nicht implementiert.

Die 1541 ist auch relativ unkritisch im "Normalbetrieb". Wenn aber 
Programme im RAM laufen (User Code) und der Interrupt maskiert wird, 
dann wird es heikel. Dann sollten die IO Schreibzugriffe möglichst exakt 
laufen damit alle Speeder laufen.

=======

Das spielt nur eine Rolle, wenn man eine 6510 ersetzen will. Ich sag 
mmal das bringt man einfach nicht hin:

+ die CPU greift nur in der Phi2 Phase auf den Bus zu, sonst ist sie 
hochohmig. So können zwei 6510 im Gegentakt am selben Bus arbeiten oder 
eben ein 6510 und ein VIC

+ über ein externes Signal hält die CPU an und wird hochohmig. Wenn der 
VIC zusätzlich Zeit am Bus braucht.

+ über ein Signal gibt die CPU bekannt was sie intern gerade verarbeitet


Alles Dinge die im µs Bereich ablaufen und für einen Atmega vermutlich 
nur schwer zu schaffen sind.

Andererseits läuft der Swin-SID direkt am 6510 Bus und gibt brauchbare 
Töne von sich. Nur Register lesen, das scheint nicht schaffbar zu sein. 
Aber immerhin funktioniert SID Register schreiben, da muss der Mega88 
innerhalb von 300nS reagieren und das Byte vom Bus lesen. Das lässt nur 
sehr wenig Spielraum.

von Michael E. (cuby)


Lesenswert?

Thomas Winkler schrieb:
> Die 1541 ist auch relativ unkritisch im "Normalbetrieb". Wenn aber
> Programme im RAM laufen (User Code) und der Interrupt maskiert wird,
> dann wird es heikel. Dann sollten die IO Schreibzugriffe möglichst exakt
> laufen damit alle Speeder laufen.

Die 6502-Emulation macht grade für die Speeder wohl Sinn - eine 
unmodifizierte 1541 hält sich ja ans Protokoll :).

> Das spielt nur eine Rolle, wenn man eine 6510 ersetzen will. Ich sag
> mmal das bringt man einfach nicht hin:
>
> + die CPU greift nur in der Phi2 Phase auf den Bus zu, sonst ist sie
> hochohmig. So können zwei 6510 im Gegentakt am selben Bus arbeiten oder
> eben ein 6510 und ein VIC

Das erste Problem dürfte sein, ob der AVR seine Pins mit 1 MHz schalten 
kann - und dann auch noch jede Mege davon jede Mikrosekunde.

> + über ein externes Signal hält die CPU an und wird hochohmig. Wenn der
> VIC zusätzlich Zeit am Bus braucht.

Das sollte sich mit Bustreiberbausteinen regeln lassen.

> Alles Dinge die im µs Bereich ablaufen und für einen Atmega vermutlich
> nur schwer zu schaffen sind.

Einfach ist es sicher nicht - aber ohne Herausforderung wär's ja 
langweilig ;-).

> Andererseits läuft der Swin-SID direkt am 6510 Bus und gibt brauchbare
> Töne von sich. Nur Register lesen, das scheint nicht schaffbar zu sein.
> Aber immerhin funktioniert SID Register schreiben, da muss der Mega88
> innerhalb von 300nS reagieren und das Byte vom Bus lesen. Das lässt nur
> sehr wenig Spielraum.

Ein Multi-AVR-System, von denen jeder einen Original-Chip ersetzt. 
Schick :-). Was XMOS mit großem Aufwand macht ("software implemented 
hardware"), sollte man auch einfacher hinbekommen.

-- Michael

von Michael E. (cuby)


Lesenswert?

Ich habe mal einen Artikel zum Thema im Wiki unter 
http://www.mikrocontroller.net/articles/AVR_6502_Emulator angelegt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:

> Kann mir jemand erklären und an einem Beispiel vorführen wie man mit
> AVRGCC richtig Assembler und C mischt? Ich kenne die Beschreibung:
>
> http://www.rn-wissen.de/index.php/Inline-Assembler_in_avr-gcc
>
> Aber ich bin leider nicht in der Lage das aufgrund dieser Beschreibung
> umzusetzen. Mir ist das irgendwie zu komplex.

Prinzipiell ja, aber ins Blaue rein erklären bringt nix. Am besten 
machst du einen Tread im GCC-Forum auf und stellst dort konkrete Fragen, 
was dir an dem Artikel nicht klar ist oder es wird ein konkretes 
Beispiel vorgeführt.

Den Artikel hier hab ich nur grob überflogen. AVR und 6502/10 hab ich 
schon in asm programmiert.

So ganz klar ist mir das Projekt aber nicht, insbesondere wie das 
Interface zur Umgebung aussieht und wie die Taktung der 65xx genau 
aussieht. Wird da pro Takt/Doppeltakt nur 1 Byte gelesen? Das würde ja 
bedeuten, daß man nach Lesen des Opcodes auf diesem sitzt und erst wenn 
man mit Byte 2 bzw. 3 die Operanden gelesen hat die Auswertung machen 
kann.

Das Hauptproblem dürfte die Zyklenexaktheit sein und die WCET 
einzuhalten, insbesondere bei den exotischen Adressierungen wie 
indirekt+indiziert, indiziert+indirekt, die ja mehrfach auf den externen 
Speicher zugreifen und Sachen wie BCD-Mode. Zudem muss ja auch immer das 
PSW mitgeführt werden. Inwieweit das schon im SREG abgebildet wird, hab 
ich noch nicht angeschaut; jedenfalls sehe ich nicht, wie da 
Inline-Assembler helfen kann. Da man harte Echtzeitanforderungen mit 
sehr engem Zeitrahmen hat, scheidet C+iasm recht wahrscheinlich aus und 
es ist Assembler angesagt. C und Assembler per Inline zu mischen ist 
also kaum angezeigt, sondern die Mischung wäre -- wenn überhaupt -- C 
und GNU-Assembler.

Die Zyklenexaktheit per Timer herzustellen dürfte schwer werden, da zur 
Timerbedienung weitere Befehle anfallen und man eine definierte 
IRQ-Latenz sicherstelen muss. Zudem frisst der IRQ-Mechanismus weitere 
Ticks. Die Ticks zu zählen ist ne Sklavenarbeit, vor allem die Ticks bei 
bedingten Sprüngen wieder glatt zu ziehen...

von Thomas W. (diddl)


Lesenswert?

Ich denke auch dass C und GNU-Assembler die richtige Variante ist. Wobei 
inline ja im Endeffekt keinen Unterschied macht, nur dass alle 
Quelldateien dann mit .c enden.


Im Falle der 1541 muss es ja nur unter bestimmten Umständen zyklengenau 
sein, im Interrupt gar nie.

Diese bestimmten Umstände sind auch genau definiert:

+ Programm im RAM
+ der 6502 Code setzt das IRQ Flag (SEI)
+ eigentlich sind nur Schreibzugriffe auf das VIA (IO) kritisch


Wenn die virtuelle 6502 CPU etwas schneller läuft als die echte bei 
1MHz, dann muss man nur bei IO Operationen mit dem AVR Timer 
synchronisieren. Damit das Protokoll am IEC Bus noch funktioniert.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Ich denke auch dass C und GNU-Assembler die richtige Variante ist. Wobei
> inline ja im Endeffekt keinen Unterschied macht, nur dass alle
> Quelldateien dann mit .c enden.

Unter Inline-asm versteht man idR das Mischen von C/C++ und Asm in 
einer Funktion, während bei "externem" Assembler nur das C-ABI 
eingehalten werden muss und eine Funktion entweder in Asm oder in 
Hochsprache steht. Zudem sind lange Inline-Asm-Sequenzen nervig, da sie 
in einem String stehen und man alles quoten muss.

von Thomas W. (diddl)


Lesenswert?

Der Monitor für die virtuelle 6502 Umgebung ist nun auch fast fertig.

Über das Monitorprogramm kann der virtuelle KIM Speicher ausgelesen 
(Hexdump, Disassembler) und verändert werden. Auf diesem Wege kann man 
auch einfach Programme in den AVR-KIM laden (Datei Transfer) bzw. einen 
Speicher Dump als Datei speichern. Die virtuelle 6502 CPU kann jederzeit 
angehalten und gestartet werden.

http://t-winkler.net/dokuwiki/doku.php?id=kim:kim1284#monitorprogramm


Für den virtual KIM habe ich blaue LED Anzeigen geordert. Sieht sicher 
stylish aus wenn es erst mal läuft.

Die Print Taster aus dem eBay kann man oben prima beschriften. Der 
single step Schalter bekommt eine LED, die direkt am Taster raus guckt. 
Der Taster bekommt eine Schalter Funktion durch die AVR Firmware.

von Peter Sieg (Gast)


Lesenswert?

Super! Das wird!

Ab wann kann man denn 'mitfühlen' ;-) = Quelltext/HEX-Datei..
Z.Zeit braucht man ja nur einen AVR (welcher?) und 
Quarzbeschaltung..(bitte nicht wieder 14,xxxx MHz ;-) ) (Besser 
16/20MHz)
Seriell Anbindung über MAX232 oder Handykabel..

K[im] interaktiv liest ja schon 'Tastendrücke' über serielle IF - 
korrekt?
Display gibt 7-Segment in Ascii Darstellung aus (kann ich mir z.Z nicht 
so richtig vorstellen.. hast du da mal ne Hardcopy?).. heißt das, das 
ich im
interaktiven Modus auch die 7-Segmentanzeige über serielle IF 'sehe'?
(Das wäre 'machbar'.. immer wenn JSR $1f1F angesprungen wird, oder nach 
x Zyklen..)
Falls die 7-Segmentanzeige 'mehrzeilig' simuliert wird, müßte da eine
ESC Sequenz zur HOME-Pos vorgeschaltet werden (VT100/52).. ist glaube 
ich
ESC[2J o.ä.

Damit könnte man den virutellen KIM-1 komplett ohne echte Matrixtastatur 
und
7-Segmentanzeige ersteinmal laufen lassen und bedienen..

Peter

von Thomas W. (diddl)


Lesenswert?

Peter Sieg schrieb:
> Super! Das wird!
>
> Z.Zeit braucht man ja nur einen AVR (welcher?) und
> Quarzbeschaltung..(bitte nicht wieder 14,xxxx MHz ;-) ) (Besser
> 16/20MHz)
Zur Zeit läuft V-KIM auf meinem XS-1541 mit Mega644, einem modifizierten 
Olimex Prototype Board.

14,xxxx MHz ist halt ideal für RS232. ;-)

Ne bei 38400 spielt der Quarz keine Rolle. Wird wohl eher 20MHz werden.

> Seriell Anbindung über MAX232 oder Handykabel..
Egal, bei mir ist ne USB Bridge dran

>
> K[im] interaktiv liest ja schon 'Tastendrücke' über serielle IF -
> korrekt?
Ne, Zukunftsmusik. Zur Zeit geht nur der Terminal Monitor. Ich warte 
jetzt auf die 6502 lib von Michael Engel für die anderen Sachen.

> Display gibt 7-Segment in Ascii Darstellung aus (kann ich mir z.Z nicht
> so richtig vorstellen.. hast du da mal ne Hardcopy?).. heißt das, das
> ich im
> interaktiven Modus auch die 7-Segmentanzeige über serielle IF 'sehe'?
Nein, die Wiederholfrequenz ist viel zu hoch beim KIM. Es werden nur 
Tastendrücke gesendet.

Der AVR merkt wenn die virtuelle CPU ein 7-Segment anspricht und buffert 
das Byte. Man kann alle 6 Zeichen per Monitor Kommando anzeigen lassen
1
 
2
 **
3
*  *
4
 **
5
*  *
6
 **
1
 
2
 --
3
!  !
4
 --
5
!  !
6
 --

> (Das wäre 'machbar'.. immer wenn JSR $1f1F angesprungen wird, oder nach
> x Zyklen..)
> Falls die 7-Segmentanzeige 'mehrzeilig' simuliert wird, müßte da eine
> ESC Sequenz zur HOME-Pos vorgeschaltet werden (VT100/52).. ist glaube
> ich
> ESC[2J o.ä.
Nix mit $1f1f.

Das Betriebssystem ist egal. Es funktioniert auch wenn nur ein Programm 
im RAM das Display ansteuert.

Ich trace die Ausgabe auf den 6530 direkt ...

>
> Damit könnte man den virutellen KIM-1 komplett ohne echte Matrixtastatur
> und
> 7-Segmentanzeige ersteinmal laufen lassen und bedienen..
Nicht wirklich.

Wenn man Spielereien mit den einzelnen LED der 7-Segment macht 
(Animation) dann kommt die serielle nicht mit.

Man kann am Display ja auch nicht darstellen wenn das Display ausgeht.

Ganz davon zu schweigen dass so kein KIM feeling aufkäme, so ohne LED 
Anzeige.

von Peter Sieg (Gast)


Lesenswert?

ok.. macht nichts.. mit LED+Tasten ist sowieso 'echter'..

Hier übrigens noch ein KIM-1 Emulator für den C64 ;-)
http://www.floodgap.com/retrobits/kim-1/emu.html

Peter

von Jochen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

damit ihr noch etwas Futter für euren KIM habt biete ich das
Das RPB Heft

Herwig Feichtinger

Anwendungsbeispiele
Für den
Mikroprozessor 6502

Für 5,-Euro incl. Versand an.

Interessant ist  die Rückseite, demnach hat sich Feichtinger
schon 1945 mit dem 6502 beschäftigt.

Email an: Jochen-Rathje (ätt) t-online.(dot) de

MfG

Jochen

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hallo,

mir ist zwar gestern mein Arbeitsrechner kaputt gegangen, aber vorher 
konnte ich noch etwas weitermachen und habe den Emulator ganz grob 
'fertig'.

Folgendes ist dabei herausgekommen:
Pur Assembler, alles komplett durchgetaktet. 25MHz-Raster, 4CK für 
externen Speicherzugriff reserviert(out ADDLow, out ADDHigh, out RE/WE, 
in/out Data), dann jeweils 21 Takte Verarbeitung. Zyklengenaue 
Verarbeitung der 6502-Opcodes inkl Speicherzugriff. Das Bustiming sollte 
ich mit etwas Arbeit auch abbilden können, müsste ja 'nur' die OUTs und 
INs entsprechend auseinanderziehen. Einfache Interruptroutinge für NMI 
und IRQ ist eingebaut. Abfangen von IO-Adressen sollte in den 
WRITE-Routinen möglich sein. Die unnützen Speicherzugriffe habe ich zwar 
gespart aber Takte dafür sind noch frei.
Derzeitige Nachteile/Probleme:
Dezimalmode bei ADC/SBC in 2 Takten fehlt noch, derzeit Übertaktung auf 
25MHz nötig, aber die 10 Takte mehr als bei 20MHz sind derzeit bei 
wenigen OPcodes nötig. Ich bilde das StatusRegister original ab, was 
einige Takte kostet aber vermutlich nicht nötig ist. Noch keine 
Verarbeitung des AEC-Signals, hab auch noch keine Idee, wie ich das da 
rein bekomme. Illegale Ops fehlen noch. Fehlerkorrektur (ist 
unwahrscheinlich, dass ich mich nicht ein paar Male verzählt habe) und 
Testläufe sind vermutlich aufwendiger als den Code zu schreiben. Das 
V-Flag-Signal der 6502 fehlt auch noch.

Bin da auch auf ein grundlegendes 'Problem' gestossen: die 
Zeropagezugriffe benötigen logisch und auch lt. dem kaum lesbaren 
Datenblatt bei 6502.org 3 Zyklen, indiziert 4. In den 
Opcodebeschreibungen lese ich aber ständig von 2 bzw. 3 Zyklen. Hab 
derzeit die logische Variante umgesetzt (1CK opcode, 1CK Adresse in ZP, 
1CK Daten lesen). Da aber soviele Webseiten was anderes behaupten bin 
ich etwas verunsichert, ob die alle falsch liegen.

Mark

von Thomas W. (diddl)


Lesenswert?

Cool, das ging aber schnell. Bin schon gespannt wie dein Projekt 
weitergeht und ob da womöglich wirklich mal ein voller CPU Ersatz Chip 
raus schauen wird?

von Norbert (Gast)


Lesenswert?

Mark L. schrieb:
> Bin da auch auf ein grundlegendes 'Problem' gestossen: die
> Zeropagezugriffe benötigen logisch und auch lt. dem kaum lesbaren
> Datenblatt bei 6502.org 3 Zyklen, indiziert 4. In den
> Opcodebeschreibungen lese ich aber ständig von 2 bzw. 3 Zyklen. Hab
> derzeit die logische Variante umgesetzt (1CK opcode, 1CK Adresse in ZP,
> 1CK Daten lesen). Da aber soviele Webseiten was anderes behaupten bin
> ich etwas verunsichert, ob die alle falsch liegen.

Mark,
Die Befehle mit Zeropagezugriffen brauchen 3 bzw. bei ZP,X und ZP,Y 4 
Zyklen.
Bei den Befehlen:
ASL, DEC, INC, LSR, ROL, ROR braucht es 5 bzw. bei ZP,X 6 Zyklen.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

@ Norbert:
Besten Dank, dann habe ich mir das schon richtig gedacht.

@ Thomas:
Ein voller Ersatz-Chip wird nur mit Hardwaretricksereien gehen, schätze 
ich mal. Was ich mir erstmal vorgenommen habe, wäre ein ATmega, der in 
einer ATmega-tauglichen Hardware (zumindest was den Speicher anbelangt) 
den Originalcode so originalgetreu wie möglich auszuführen. Ich wollte 
erstmal sehen, ob es überhaupt so geht, wie ich mir das dachte, jetzt 
kommt aber auch erstmal die Detailarbeit.

Ich hätte noch zwei Fragen, zum einen, könnte ich einen 8515 auf 25MHz 
übertakten? Und, so wie ich mich erinnere, wäre es unüblich gewesen, die 
Adressen 0x0000 und 0x0001 anders, als direkt über ZP-Zugriffe 
anzusprechen, daher fange ich diese Adresse auch nur da ab. Weiß aber 
nicht, ob's nicht Programmiermethoden gab, die das absolut oder so 
ansprechen. Vielleicht weiß das ja jemand, der etwas mehr im 6502-Code 
drin ist.

Mark

von Thomas W. (diddl)


Lesenswert?

Im Projekt SwinSID werden AVR auf 28MHz übertaktet und es läuft sicher. 
Ich glaube die haben vor dem Mega88 einen 8515 verwendet.

Habe keine Erfahrung damit, vielleicht geht nicht jeder AVR zum 
übertakten, sondern nur ein Prozentsatz, keine Ahnung. Vielleicht weiss 
Peter mehr darüber?

Einige AVR werden jetzt von den Shops schon offiziell mit 28MHz 
angeboten.

---

Der 6510 verwendet die ersten beiden Bytes für das interne IO (DDR, 
PORT). Diese beiden RAM Zellen sind definitiv unerreichbar für den 6510, 
egal ob man die ZP, Absolut oder indexiert anspricht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mark L. schrieb:

> könnte ich einen 8515 auf 25MHz übertakten?

Ich verwende einen ATmega168 @ 24Mhz, funktioniert seit jeher ohne 
Probleme. An (interner) Peripherie verwende ich allerdings nur Timer 
(CTC-Mode, PWM), digitale I/O, UART und EEPROM.

AFAIR haben die neueren AVR nen eigenen, internen RC-Oszillarot für das 
EEPROM-Timing, der unabhängig von F_CPU arbeitet, was bei älteren 
Modellen nicht der Fall ist.

Auf jeden Fall sollte die Versorgungsspannung im "normalen" Bereich 
sein, also saubere 5V, und der µC bei etwa Zimmertemperatur betrieben 
werden. Der spezifizierte Bereich, in denen der µC fehlerfrei 
funktioniert, dürfte einiges kleiner sein als der Bereich, in dem er 
fehlerfrei funktioniert, ohne daß dies spezifiziert ist.

von Peter (Gast)


Lesenswert?

>Der spezifizierte Bereich, in denen der µC fehlerfrei
>funktioniert, dürfte einiges kleiner sein als der Bereich, in dem er
>fehlerfrei funktioniert, ohne daß dies spezifiziert ist.

Hä...?

von Thomas W. (diddl)


Lesenswert?

Ich denke er meint, übertakten funktioniert nicht im ganzen 
spezifizierten Bereich. Sondern eben am besten bei Zimmertemperatur und 
etwas auf und ab.

von Norbert (Gast)


Lesenswert?

Mark L. schrieb:
> Und, so wie ich mich erinnere, wäre es unüblich gewesen, die
> Adressen 0x0000 und 0x0001 anders, als direkt über ZP-Zugriffe
> anzusprechen, daher fange ich diese Adresse auch nur da ab. Weiß aber
> nicht, ob's nicht Programmiermethoden gab, die das absolut oder so
> ansprechen. Vielleicht weiß das ja jemand, der etwas mehr im 6502-Code
> drin ist.

Mark, da die 6502 CPU (die 6510 CPU ist nur ein 'unglücklicher' 
Sonderfall ;-) viele Befehle mit absoluter Adressierung beinhaltet, muss 
ein Emulator diese auch berücksichtigen.

Einfachstes Beispiel LDA:

Zero Page: A5 xx (2cyc)
Absolute:  AD xx xx (4cyc)
Absolute,X:  BD xx xx (4cyc, 5cyc when page boundary is crossed)
Absolute,Y:  B9 xx xx (4cyc, 5cyc when page boundary is crossed)

Normalerweise würde jeder Programmierer zB. auf $0000 mit A5 00 
zugreifen.
Ein Byte und eine Mikrosekunde gespart.
Da 'früher' aber sehr viel mit selbstmodifizierendem Code gearbeitet 
wurde,
kann auch zB. der Befehl AD 00 00 vorkommen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Ich denke er meint, übertakten funktioniert nicht im ganzen
> spezifizierten Bereich. Sondern eben am besten bei Zimmertemperatur und
> etwas auf und ab.

Nö, so war's nicht gemeint. Beim Übertakten ist man immer ausserhalb 
der Spezifikation. Ansonsten wär's kein Übertakten ;-)

von Peter Sieg (Gast)


Lesenswert?

SwinSID nutzt Atmega88PA mit 32MHz bei +5V.
Beim AVR CP/M Projekt habe ich 168/88PU mit +3.3V und 30MHz stabil am
laufen..

Peter

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Der 6510 verwendet die ersten beiden Bytes für das interne IO (DDR,
> PORT). Diese beiden RAM Zellen sind definitiv unerreichbar für den 6510,
> egal ob man die ZP, Absolut oder indexiert anspricht.
Daher muss ich ja alle Schreib- und Lesezugriffe auf diese Adresse 
entsprechend auf die IO-Adressen vom ATmega umleiten um den IO-Port wie 
im Original verwenden zu können. Ich hatte das wohl etwas unglücklich 
formuliert.

Norbert schrieb:
> Da 'früher' aber sehr viel mit selbstmodifizierendem Code gearbeitet
> wurde, kann auch zB. der Befehl AD 00 00 vorkommen.
Ich glaube, ich hatte gehofft, dass ich das falsch in Erinnerung hatte 
und mir die Fleissarbeit sparen könnte, das überall abzufangen.

30MHz hören sich ja ziemlich verlockend an, gerade da mir genau diese 5 
Takte beim ADC/SBC immediate in Dezimal-Modus immer noch fehlen. Wäre 
ärgerlich, wenn es an den zwei Opcodes scheitern würde, bzw. ich dort 
einen Takt mehr brauchen würde, als das Original. Ist schon ärgerlich 
genug, dass ich bei allen andern OPcodes mit 20MHz hinkommen könnte, 
wenn diese zwei Spezialfälle nicht wären. Ich hielt das für etwas 
utopisch, als ich es beim SwinSID mit den 32MHz gelesen hatte, aber 
Versuch macht anscheinend kluch.

Mark

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hallo,
hab' noch etwas weiter gemacht und hab' bereits den ersten 6502-Code 
laufen lassen muss jetzt hauptsächlich noch Testprogramme schreiben. Ich 
hab mich jetzt erstmal für die folgende Variante entschieden, da ich die 
hier habe und erstmal kein Löten nötig ist: Atmega644, 20MHz, emuliert 
6510 bei 1MHz mit Code im internen SRAM, zyklengenau(im Dezimalmodus bei 
ADC/SBC gemäß CMOS-6510), anhalten bei Lesezugriffen über RDY möglich, 
die AVR-IO-Register können mit Vorsicht verwendet werden(alle, die über 
LD/ST angesprochen werden können), die AVR-Interrupts lösen einen NMI 
aus, unter 6KBytes Codegröße, 6510-IO-Port auf beliebigem AVR-Port, 
neuer opcode zum verschieben der ZP (ähnlich 65C02).

Da ich mich bei all den vielen Möglichkeiten, die ich ständig sehe, wenn 
ich mal an dem Kram arbeite, immer wieder verzettel, wollte ich mal 
fragen, ob und was genau ihr vielleicht für eure KIM-1 und 1541-Projekte 
gebrauchen könntet. Bin etwas in den Emulator vertieft, wenn ich mal 
Zeit habe, daher hab' ich mir das noch nicht so genau angesehen. Könnte 
mir aber so grob, wie ich den KIM überblicke, vorstellen, 'einfach' 
Anzeige per Schieberegister an den AVR, Hex-Tasten an AVR-Port, 
AVR-USART von 6502 aus ansprechen, KIM-ROM entsprechend anpassen und ins 
SRAM schreiben beim Booten.

Mark

von Peter S. (petersieg)


Lesenswert?

Hi Mark. Das hört sich ja schon mal super an!
Diddl wird das sicher in seinem KIM-1 Prototypen einbauen, mit 
Matrixtastatur und 7-Segmentanzeige..
In wie weit das für sein 1541-Ersatzprojekt einsetzbar ist..?
Ich sehe eine weitere Möglichkeit, eine 6510 Ersatz-CPU zu bauen, die 
man
dann direkt in eine DIP-40 Fassung z.B in einem C64 als 6510 Ersatz 
einsetzen
könnte (der ultimative Test!). Preislich z.Z eher uninteressant.. da 
sicher 6510 nicht soo oft kaputt geht und die ggf. auch noch für 5-8€ zu 
erwerben ist.. aber die 644 werden auch immer günstiger.. und für die 
Zukunft sicher ein interessanter Ersatz!

Peter

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hi Peter, ich wollte erstmal eine Variante weit genug hinbekommen, um zu 
sehen, ob die ganzen Konzepte, die ich mir so ausgedacht habe auch 
funktionieren. Ist das erste Mal, dass ich mich überhaupt mit Emulation 
beschäftigt habe. Die jetzige Variante mit internem SRAM ist leider die 
einzige, die ich einfach hier habe und auch in Hardware testen kann. 
Durch die 2-Takt Zugriffe auf den Speicher könnte man das vermutlich 
noch auf 16MHz runterkürzen (bzw. 1,25MHz emulieren), die RDY-Leitung 
ergibt auch nur Sinn, wenn entsprechende Hardware dran kommt. Für einige 
Projekte ist es vielleicht gut, wenn man den AVR-IO wahlweise verwenden 
kann (besonders den USART) für die Kompatibilität ist es aber Mist falls 
Programmcode in der ZP ausgeführt werden soll. Will man das so 
verwenden, wie es derzeit ist, ok, will man gar keinen AVR-IO, aber 
internen Speicher (oder externen per XMEM) müsste ich das auch abfangen, 
ohne XMEM wäre eher die umgedrehte Frage, ob und inwiefern das AVR-IO 
verwendet werden sollte/könnte. Ist leider der Nachteil von so 
durchgetakteter Assemblersoftware, dass man nicht so flexibel mit 
Änderungen ist, aber mir ist bis heute kein Compiler begegnet, der sowas 
auch nur in Ansätzen hinbekommen würde.

Die 6510-Hardware-Eratz-Variante schiebe ich ein Wenig von mir weg, da 
ich nicht so viel Erfahrung mit der Hardware habe. Ich stelle mir das 
zwar recht 'einfach' vor (so im Prinzip), dass ich per PLL oder sowas 
den Systemtakt ver-20-fache, das Phi2 über PWM erzeuge und die Adress- 
und Daten-Leitungen über Tri-State-Buffer bzw. -Latch mit AEC verbinde. 
Wenn ich dann in der Software dafür sorge, dass die Signale zeitlich 
innerhalb der Spezifikation (sind oft nur Min/Max-Zeiten) zur Verfügung 
stehen, sollte es ja eigentlich klappen. Da die reale Hardware aber 
meist nicht so funktioniert wie die ideale, fürchte ich da mangels 
Erfahrung etwas wichtiges übersehen zu haben. Hab's mir auch noch nicht 
ganz genau angesehen, ob ich die 'in's und 'out's in der Software soweit 
auseinandergezogen bekomme, wie das Bustiming es auf den ersten Blick 
erfordert (Viel Zeit zwischen Anlegen der Adresse und der Gültigkeit der 
Daten), oder ob die Adresse erst angelegt werden braucht, bevor die 
Leitungen aus dem Tri-State herausgehen(Wurde ja nicht überall 
verwendet). Wenn es so geht, könnte man allerdings jeden 
20MHz-8KB-40Pin-AVR nehmen, der 644 ist nur wegen dem internen SRAM 
interessant. Dann könnte man auch noch so 'verrückt' sein, eine Art 
Extended-Modus in den Emulator einzupflegen (manche 2-Takt opcodes 
lassen sich in einem erledigen usw.) und die invaliden opcodes mit 
sinnvollen Funktionen zu belegen (bspw. MUL). Beschäftige ich mich aber 
wohl erst weiter mit, wenn ich die entsprechenden Teile bestelle und 
praktische Erfahrungen mache. Sofern er die Lagerung überstanden hat(was 
ich aber bezweifel) könnte ich immerhin meinen alten Brotkasten als 
Testsystem verwenden, würde mich eh' mal interessieren, ob 27 Jahre alte 
Disketten noch lesbar sind.

Mark

von Peter Sieg (Gast)


Lesenswert?

Jup.

Ich habe hier immer einen C64 aufgebaut und betriebsbereit stehen.. ;-)
Diddl dürfte auch bald aus dem Urlaub wieder da sein, sodaß man am 
ursprünglichen Thema weiter basteln kann..

Aber langfristig hätte so eine 6502/10 Ersatz-CPU auf AVR Basis schon 
seine
Existenzberechtigung.. und wenn auch nur um zu zeigen, das es geht!

Peter

von Mark L. (m2k10) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hab' mir mal das Bustiming genauer angesehen und könnte mir gut 
vorstellen, dass es so geht (Skizze und Code):
1
RAM_READ:
2
  ; sync: Phi0 erreicht Vcc-0.2V
3
  2x  nop
4
    cbi ALE
5
    out add_L
6
    sbi ALE
7
    out add_H
8
    sbi RW
9
    out data_DDR, input
10
  14x  nop
11
    in data
12
  2x  nop
13
14
RAM_WRITE:
15
  ; sync: Phi0 erreicht Vcc-0.2V
16
  2x  nop
17
    cbi ALE
18
    out add_L
19
    sbi ALE
20
    out add_H
21
    cbi RW
22
    out data_DDR, output
23
  10x  nop
24
    out data
25
  6x  nop
Bei den Datenleitungen bin ich mir aber nicht wirklich sicher, ob das 
eine gute Lösung ist, oder ob ich sie nicht über den AVR länger 
hochohmig schalten muss. Aber ansonsten müsste ich so alle 
Min/Max-Vorgaben einhalten können (mit 74HCTxx). Der Emulator sollte 
auch da herum passen.

von Osche R. (Gast)


Lesenswert?

Peter Sieg schrieb:

> Diddl wird das sicher in seinem KIM-1 Prototypen einbauen, mit
> Matrixtastatur und 7-Segmentanzeige..

Als Gehäuse eignet sich ein alter EPROM-Brenner. So ein Ding mit 
Hexadezimaltastatur und Display, und V.24-Schnittstelle an der 
Rückseite.


Patrick

von Thomas W. (diddl)


Angehängte Dateien:

Lesenswert?

So, der Urlaub ist zu Ende, bin wieder im Lande ...


Inzwischen sind die blauen 7-Segment aus China da. Habe dieses 
Wochenende meine LED Theorie etwas aufgebessert und die Display am 
Breadboard getestet.

Und ein Schaltbild gezeichnet. Es zeigt die Erweiterung für ein AVR 
Entwickler Board auf Lochraster.


Die 100 Ohm Widerstände beziehen sich auf das von mir verwendete blaue 
7-Segment Display bei 5V. Die Displays laufen mit 3,4V und ziehen 15 bis 
20 mA.

Für andere (rote,grüne) Displays müssen die Widerstände entsprechend 
angepasst werden.


Der BD137 ist überdimensioniert, ich weiß. Aber habe gerade nix anderes 
da ...

von Mark L. (m2k10) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,
vielleicht hat ja jemand Lust das mal zu testen. Ich habe zwar 
vermutlich noch nicht alle (Tipp-)Fehler beseitigt, IRQ und NMI sind 
auch noch nicht richtig getestet, aber ansonsten sollte alles soweit 
funktionieren. Das Taktverhältnis ist 20zu1, AVR mit 20MHz ergibt 6510 
mit 1MHz. Habe das auch auf dem STK500 laufen lassen und die LEDs 
blinken so wie sie sollen, angesprochen vom 6510er-Code aus direkt auf 
den AVR-IO. Ich hab' nur mal das Arbeitsverzeichnis kopiert, ist daher 
alles noch etwas chaotisch und voll von nutzlosen, überholten 
Kommentaren. Der 6510er-Code kommt in die Datei "6510CodeSeg_inc.asm" in 
Form von .db-Anweisungen, wird ab Adresse 0x0200 ins SRAM kopiert und 
dann der Code an Adresse 0x0200 ausgeführt. Der IRQ ist derzeit 
deaktiviert(SEI/CLI setzen nur das Flag ohne Auswirkungen), spart einen 
Pullup beim Testen. Einstellungen bzgl. IO-Port, Reset-, NMI- und 
IRQ-Vektoren und -Portpins befinden sich ganz zu Anfang der Datei 
"6510Emu644iRam.asm". Die RDY-Leitung ist mit active-High in Funktion, 
wenn's stört, sollte es genügen, die zwei Befehle im Macro "READ_RDY" 
durch nops zu ersetzen.
Mark

von Thomas W. (diddl)


Lesenswert?

Genial, da muss ich doch glatt am Weekend mein verstaubtes STK500 aus 
dem Keller holen! :-)

von Mark L. (m2k10) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hab' leider nicht mehr genügend Taster hier, sonst würde ich mir mal die 
KIM-Tasten und Display zusammenlöten.

Ich habe in dem Emulator noch ein paar kleinere Fehler korrigiert sowie 
IRQ und NMI fertig gemacht. Ich konnte bisher nicht herausfinden, 
wieviele Takte es benötigt, wenn während BRK ein IRQ/NMI kommt, habe 
einfach mal 8 genommen. IRQ ist noch deaktiviert, damit der feste Pin 
nirgends dazwischen funkt.

Das KIM-Rom habe ich mir auch mal angesehen, sollte eigentlich kein 
Problem sein, dass anzupassen auf AVR. Ich habe nur nicht ganz 
verstanden, was mit dem dritten Port ist, im KIM-Rom tauchen nur A+B 
auf, liegt der auf dem anderen IO-Baustein??

von Thomas W. (diddl)


Lesenswert?

Ich habe alle Teile beisammen, aber hier hat es so schönen Schnee, das 
wirkt stark Projekt verögernd ...

Aber immerhin habe ich nun den Lochraster Aufbau im Lochmaster geplant:
http://t-winkler.net/dokuwiki/doku.php?id=kim:kim1284#prototyp

Und gestern bin ich auch noch etwas zum Löten gekommen, - es wird 
langsam.

---

@Mark L.

Deine Engine ist 100% Assembler. Mit Assembler hab ich es leider nicht 
so. Kann ich deine Engine irgendwie aus meinem C Programm ansprechen? 
Kann das Assembler Teil mit Variablen arbeiten die ich in C global 
definiert habe? Oder verkehrtt rum, kann ich Daten ansprechen die im 
Assembler definiert wurden?

Wenn der AVR zu schnell ist, dann wird die übrige CPU Zeit quasi 
"verheizt", also du hast einfach bei jedem Befehl Waits um den Vorsprung 
auszugleichen.

Wenn jetzt der Speicher nicht so simpel ist wie beim KIM, also bei jedem 
fetch entschieden werden muss, welchen Speicher man zugreifen muss, dann 
müsste man alle Waits jedesmal anpassen?

Als CPU Ersatz, mit ausschliesslich externem Speicher und IO, hat man 
das Problem natürlich nicht.

---

Wie weit ist denn Hr. Engel mit der 6502 Engine?

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Deine Engine ist 100% Assembler. Mit Assembler hab ich es leider nicht
> so. Kann ich deine Engine irgendwie aus meinem C Programm ansprechen?
> Kann das Assembler Teil mit Variablen arbeiten die ich in C global
> definiert habe? Oder verkehrtt rum, kann ich Daten ansprechen die im
> Assembler definiert wurden?

Tut mir leid, aber ich habe von dem Zusammenspiel Hochsprache+Assembler 
auf AVR kaum Ahnung. Ich beschäftige mich nur wegen dem Assembler 
überhaupt mit AVRs um mal gerade keine 'Hoch'-Sprache nutzen zu müssen, 
bezweifel aber auch, dass ein Zyklentreuer Emulator ohne viel Assembler 
überhaupt möglich ist.

Thomas Winkler schrieb:
> Wenn der AVR zu schnell ist, dann wird die übrige CPU Zeit quasi
> "verheizt", also du hast einfach bei jedem Befehl Waits um den Vorsprung
> auszugleichen.

Prinzipiell ja, es finden alle 20-AVR-Takte eine Abfrage des RDY-Pins 
und ggf. ein Speicherzugriff statt. Das 'einfach' hat allerdings den 
Großteil der Arbeit an dem Emulator ausgemacht ;-).
Eigentlich ist dieser Emulator ein geschlossenes System, das einfach 
durchläuft und (hoffentlich) seine Arbeit fehlerfrei erledigt. 
Änderungen im Emulator bedeuten immer wieder neu Takte zählen, auch wenn 
ich das über Macros etwas vereinfacht habe.

Thomas Winkler schrieb:
> Wenn jetzt der Speicher nicht so simpel ist wie beim KIM, also bei jedem
> fetch entschieden werden muss, welchen Speicher man zugreifen muss, dann
> müsste man alle Waits jedesmal anpassen?

Ich denke mal, du willst auch weitere Hardware im AVR emulieren nicht 
nur den Prozessor. Ich hab' vielleicht diesbezüglich ein Brett vorm 
Kopf, aber ich sehe auch nicht, wie es möglich sein soll, dann noch 
Zyklenexaktheit zu erreichen, außer man begnügt sich mit ungefähren 
Mittelwerten wie bspw. die Cornell-Projekte. Einen Mini-Speichermanager 
wollte ich noch in den freien Takten einbauen, damit auch der AVR-Flash 
als 6502-ROM verwendet werden kann, aber dann ist auch spätestens 'Ende 
der Fahnenstange' für die immediate-Opcodes (aus meiner Sicht). In den 
>3-6502-Takte-Opcodes ist zwar genügend Platz, aber da nicht 
vorhersagbar ist, wann, bzw. ob diese überhaupt auftauchen würde das 
wohl nur in ganz speziellen Fällen funktionieren, wenn man Hardware in 
dieser Zeit emuliert.

Hoffe, dass sich das hier nicht zu negativ/kritisch anhört, ich suche 
nur nach Lösungsmöglichkeiten die ich bisher übersehen habe. Das Üble 
sehe ich gerade in den immediate-opcodes. Da muss in 40 
AVR-Takten(@20MHz) der opcode gelesen werden(min. 9 Takte), IRQ+NMI+RDY 
abgefragt(min. 6 Takte), im absoluten Minimum zwei Sprünge durchgeführt 
(durch das dann notwendige Ausformulieren gehen keine relativen Sprünge 
mehr)(6 Takte), Oparand lesen, verarbeiten, Flags setzen (8+ Takte) 
sowie der Timer gesetzt und angesprungen werden (6+ Takte). Ist nur grob 
überschlagen, ich weiß nichtmal, ob das überhaupt so hinhaut, aber 
vielleicht hat ja jemand eine bessere Idee.
Viele Grüße
Mark

von Thomas W. (diddl)


Lesenswert?

Deine Lösung ist super! Speziell wenn man an einen 6502 Ersatz denkt.


Aber, - ja, - ich will AVR Flash als 6502 ROM verwenden!

Und da fängt die Problematik an. Bei jedem Speicherzugriff des 6502 muss 
man prüfen ob es RAM oder ROM wird.

Ja schlimmer noch, es muss auch geprüft werden ob IO gemeint ist.



Aber, - mir würde eine durschnittliche Takt Synchronität leicht langen. 
Es muss halt an bestimmten, kritischen Stellen erfolgen. Also zb. Wenn 
ein IO Zugriff erfolgt.

Ich bräuchte also nur eine Funktion Sync(), die vergleicht AVR Timer 
Zeit (Echtzeit) mit 6502 CPU Zeit (6502 Takte) und wartet gegebenfalls 
bis die synchron sind.

Diese Funktion Sync könnte man alle 10 6502 Befehle aufrufen. und 
natürlich bevor kritische Befehle kommen (IO Access).

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Ich hab' bisher keine Idee, wie man das alles hinbekommen könnte. 
RAM+ROM geht, ein, zwei oder drei IO-Adressen umleiten geht auch dazu, 
aber es wird schon eng, wenn dann noch bspw. ein 74145 emuliert werden 
soll. Für die Sync-Funktion habe ich auch noch keine Idee, wie man die 
kurz und genau hinbekommen könnte, die müsste ja Taktgenau mit 3 
Wartetakten zurecht kommen, wie mit 500, je nach emulierten 
Programmcode. Und sie müsste so kurz sein, dass, wenn bspw. vor dem 
IO-Zugriff nur ein 2-Zyklen-Opcode steht, Opcode+Sync+IO im Takt sind.

Hab mich da gestern mal mit beschäftigt, aber bisher nix brauchbares 
zusammenbekommen, im vorgenannten Worst-Case würde aber bisher alleine 
der Sync alles aus dem Takt hauen.

Thomas Winkler schrieb:
> Aber, - mir würde eine durschnittliche Takt Synchronität leicht langen.
> Es muss halt an bestimmten, kritischen Stellen erfolgen. Also zb. Wenn
> ein IO Zugriff erfolgt.

Der Durchschnitt bspw. bei der NES-Emulation bezog sich ja darauf(nur 
grobe Zahlen, genauere standen da irgendwo auf der Seite), dass 
2-Takt-Opcodes mit <1MHz emuliert werden, dafür die 7-Takter mit <4MHz 
und damit ein Mittel von 1,77MHz erreicht werden könnte. Eine 
Sync-Funktion müsste da noch Takte einsparen.

Vielleicht hat ja jemand eine Idee, wie man so einen Emulator aufbauen 
kann, bzw., wie man in (Worst-Case) 10-15 Maschinentakten(inkl. Sprünge) 
eine solche Syncfunktion hinbekommt.

von Thomas W. (diddl)


Lesenswert?

Mark L. schrieb:
> Vielleicht hat ja jemand eine Idee, wie man so einen Emulator aufbauen
> kann, bzw., wie man in (Worst-Case) 10-15 Maschinentakten(inkl. Sprünge)
> eine solche Syncfunktion hinbekommt.


Eine Idee habe ich schon:

+ Jede 6502 Funktion "weiss" wieviele 6502 Takte sie braucht. Also 
einfach eine Konstante in eine Register laden.

+ Die übergeordnete Funktion die die einzelnen OP Code Routinen aufruft 
addiert die 6502 Takte aus dem Register in eine Variable (VT).

+ Ein AVR Timer muss reserviert sein für die Sync Sache. Teiler und 
Counter werden auf 1MHz geeicht. Man braucht eine Funktion die quasi die 
vergangenen µs (RT) zurückgibt.


Die Sync() Routine vergleicht nun die aufsummierte Zahl in VT mit dem 
Wert RT.

Is VT kleiner, - Pech gehabt. Wir waren zu langsam.

Ist VT größer, dann muss man VT - RT in µs warten (delay()).

In jedem Fall wird der AVR Timer und VT auf null gesetzt.



Die Taktik ist nun Sync() ab und zu aufzurufen und bei bedarf (critical 
IO).

Ab und zu bedeutet:

+ alle 50µs

+ oder alle 10 6502 Befehle

+ oder ...

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

"The first book of KIM" 1977, 176 Seiten

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Thomas Winkler schrieb:
> Is VT kleiner, - Pech gehabt. Wir waren zu langsam.

Das plus kritischen IO macht die Sache irgendwie unbrauchbar aus meiner 
Sicht. Dann kann man auch die vorgenannte Durchschnittsmethode nehmen, 
wenn der IO dann eh' schon aus dem Takt ist.

So, wie du es vorschlägst und auch andere Möglichkeiten habe ich gestern 
mal ausprobiert, aber alle dauern deutlich zu lange, um sicher zu 
laufen. Die Idee, die ich meinte, wäre, wie geht das in möglichst 
wenigen 8-bit Rechenoperationen, so bspw. einmal Plus, einmal Minus, 
eine Verzweigung (in C: b-=c;a+=b; If (a>d) warte;) Viel mehr Code darf 
das nicht sein für den Sync. Vielleicht könnte man den Watchdog 
missbrauchen oder irgendeine andere Funktionseinheit im AVR. Um den 
Timer auf 1MHz zu bekommen, müsste man das wohl mit einem Timer als 
externes Signal erzeugen und in einem zweiten als Eingang nehmen, 8 oder 
64 als Prescaler ist da unbrauchbar.

Was vielleicht auch geht wäre soweit übertakten, dass ausreichend Zeit 
zur Verfügung steht (so aus dem Bauch, vielleicht auf 28 oder 30MHz).

von Peter Sieg (Gast)


Lesenswert?

Falls euch das hilft.. beim SwinSID88 wird ein ATmega88 mit 30MHz 
übertaktet.. läuft stabil bei +5V. Beim AVR CP/M Projekt läuft bei
mir ein 88/168 mit 30MHz sogar noch bei +3,3V..

Ergo: 30MHz bei +5V sind definitiv machbar..

Peter

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Die >=20 AVR-Takte, die bei 30MHz pro Opcode mehr zur Verfügung stehen 
sollten für einen Sync reichen. Je nachdem, wie ich Zeit finde, probiere 
ich das mal aus. Hab' schon angefangen den Emulator neu zu schreiben 
(hab bisher mit dem Z-Register getrickst, brauche das aber für die LPMs 
daher ist's was mehr Arbeit).

Wieviel Genauigkeit für den Sync ist eigentlich nötig? Ich versuche 
100%(Abweichung =0 AVR-Takte) zu erreichen, könnte mir aber vorstellen, 
dass das übertrieben ist.

von Thomas W. (diddl)


Lesenswert?

Nach dem Sync sollte es möglichst µs genau sein. Wenn es im Schnitt 
etwas langsamer oder schneller läuft ist für meine Projekte irrelevant.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hab' mich mal für eine Variante entschieden, die bis zu 16-AVR-Takte 
schwankt, aber im Mittel konstant laufen sollte. Zumindest bei 30MHz 
sollte das gehen.

Was die Verwendung von dem Code angeht sehe ich aber Schwierigkeiten. Es 
gibt zwar genau definierte Punkte, ab denen Code für IO eingefügt werden 
kann, mir ist aber kein Assembler bekannt, der Inline-C beherrscht. Am 
PC wüsste ich wie man das machen könnte, aber beim AVR???

Viele Grüße
Mark

von Thomas W. (diddl)


Lesenswert?

Inline C? Nö aber der GCC kann inline Assembler.

Aber zum Mixen sollte es ja langen wenn man Assembler vom C aus aufruft. 
Man müsste einfach die Anzahl Takte vorgeben können. ZB.:

Exec6502(50);

läuft 50 µs lang. Bei

Exec6502(1);

läuft genau ein Assemblerbefehl, für single step.

Exec6502(0);

läuft unendlich, Unterbrechungen nur durch IO oder Interrupt.

---------

Wenn er RAM (extern oder AVR RAM) und ROM (AVR flash) kann ist es schon 
ok. Für IO müsste er einfach eine Unterprogramm (RCALL) ausführen.

Es müsste "nur" der Adressbereich für IO selektieren können:

ZB.

RAM :: 0000 - 17FF
IO  :: 1800 - 1BFF
ROM :: FC00 - FFFF


Im Falle vom KIM-1 wäre es gut die obersten drei Bit (A15, A14, A13) zu 
ignorieren. So dass sich RAM, ROM und IO einfach 8 mal spiegeln im 
Adressbereich.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Komme im Moment nicht groß dazu, weiter zu machen, aber so das Gröbste 
habe ich schon.

Eine Ablaufsteuerung habe ich nicht vorgesehen.

Bei Speicherzugriffen wird zwischen RAM und ROM unterschieden anhand 
einer Grenze (bspw. RAM von $0000 bis $17FF, dann ROM), außer bei 
ZP-Zugriffen, die ZP muss im RAM liegen. Außer bei den Opcodes wird dann 
zusätzlich beim RAM eine Grenze abgefragt(bspw. RAM von $0000 bis $16FF, 
IO von $1700 bis $17FF), ab der zur einer IO-Routine (rcall IOREAD, 
rcall IOWRITE) verzweigt wird.

IO-Zugriffe werden synchronisiert auf den Genauen Takt innerhalb des 
Opcodes beim ersten Zugriff. Bspw. liest die absolute Adressierung bei 
6502-Takt 4 des Opcodes den IO ein, Sync ist hier nach 3 Takten. Bei 
READ-Modify-WRITE-Zugriffen auf den IO wird 'nur' das READ 
synchronisiert, das restliche Timing(WRITE nach 2 6502-Takten) innerhalb 
des Opcodes muss dann die IO-Routine übernehmen.

Verwenden des IO für opcodes geht nicht, auch die Möglichkeit Opcodes in 
der ZP auszuführen habe ich derzeit nicht vorgesehen, das könnte aber 
evtl. noch möglich sein.

Wenn ich das Spiegeln richtig verstehe, reicht da wohl das regelmäßige 
ANDen des Highbyte aus, das sollte kein Problem sein. Deutlich 
schwieriger würde es, wenn die Bereiche RAM, IO und ROM keine 
aufeinander folgenden Blöcke sind. Wenn's mehr als ein paar 
IO-Adressen(Tastatur+7-Segment waren's, glaub ich, 4) wie beim KIM sind 
sollte man da auch eine schnelle Sprungtabelle einbauen.

Mark

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hallo,
also, sieht so aus, als wenn alles soweit läuft. Hab's aber bisher nur 
mal grob getestet mit dem KIM-ROM im Flash und es funktioniert so, wie 
es soll. Ich kann das gerne mal hochladen, so wie es ist, aber das 
Vorhandensein von Fehlern kann ich nicht wirklich aussschließen.

Mir ist dabei noch eine 'Inkompatibilität' zu der Platine von Thomas 
aufgefallen: Ich habe für IRQ, NMI und RST INT0 bis INT2 verwendet, der 
Platinenaufbau würde aber PinChange-Interrupts verlangen. Problem eins 
ist das Entprellen bei diesen Leitungen, außerdem würde der PCI beim 
Drücken und auch beim Loslassen der Taste auslösen.
Das Entprellen könnte man vielleicht lösen, indem die entsprechenden 
Leitungen per PWM nur mit 50Hz oder so versorgt werden, für die 
PCI-Verwendung fallen mir aber nur FlipFlops ein

von Peter S. (petersieg)


Lesenswert?

@Mark L: Ja, bitte hänge den Code doch mal an..
Wie wird 'das System / dein Micro-KIM' bedient..?
Ich hatte mir ja als Option 'gewünscht', das auch eine
parallele Bedienung über seriell möglich ist.. ;-)

Peter

von Mark L. (m2k10) Benutzerseite


Angehängte Dateien:

Lesenswert?

Da ich wegen dem (C) nicht Bescheid weiß, habe ich das KIM1-ROM nicht 
dabei gelassen. Dieses müsste als .db-Anweisung in die Datei 
"k1rom_inc.asm".

Zur 'Bedienung' weiß ich nicht so recht, was ich sagen soll. Es gibt ein 
paar Einstellmöglichkeiten im Code, aber mehr eigentlich nicht. So, wie 
es ist (hab die IO-Port grob umgesetzt), sollte die Schaltung von Thomas 
mit dem KIM-ROM eigentlich laufen (von vorgenannten Schwierigkeiten mit 
dem IRQ etc. abgesehen).

Was eine Steuerung des Emulators angeht, kann es gut sein, dass ich das 
zu kompliziert sehe, aber das, was ich mir darunter vorstelle passt 
einfach nicht mehr auf einen AVR. Zumindest nicht so präzise, wie ich 
denke, dass sowas sein müsste.
Ist aber vielleicht mehr die Frage, welche Art von Steuerung man wie 
unterbekommen könnte und wie der Emulator sich dabei verhalten soll. 
Bspw. könnte man den Emulator über eine Steuerleitung anhalten oder den 
USART-Interrupt verwenden und bei Empfang eines Bytes in eine 
Steuerrotuine verzweigen. Aber es wäre meistens das Timing hin und bspw. 
beim KIM-1 könnte man die 7-Seg.Anzeigen nicht mehr lesen, wenn der 
Emulator nicht durchläuft.

von Thomas W. (diddl)


Lesenswert?

Die KIM-1 Geschichte wird wieder interessant.


Jetzt, 2 Jahre später ist die Technik an einem ganz anderen Stand. Die 
ARM's sind super günstig geworden. Deshalb habe ich vor ein paar Monaten 
beschlossen, die ARM Welt für mich zu erschliessen.

Die Entscheidung fiel auf den Cortex-M4 von ST. Der Grund ist das 
günstige Discovery Board um 16€. Der STM32F4 strotzt nur so vor 
Leistung: 168MHz, 1MB Flash, 168K SRAM, eine Unzahl von Timer und 
Peripherie ...

Nach den ersten Gehversuchen mit dem F4 war ich restlos begeistert von 
dem Teil. Die Abkehr von der alten 8 bit AVR Technik fiel mir nun sehr 
leicht.

Berauscht von der hohen Leistung des F4, habe ich mich an mein altes 
1541-Emul Projekt erinnert. Kurze Tests mit der 6502 Engine haben 
gezeigt, dass es diesesmal nicht scheitern würde. Eine reine C 
Implementierung würde funktionieren.

Ganz so leicht war die Umsetzung dann aber doch nicht. Viele Monate hat 
die Umsetzung samt Grundlagenforschung nun verschlungen. Inzwischen 
läuft die Floppy Emulation am F4 ziemlich gut. Natürlich wird es noch 
Monate dauern, bis zur Perfektion. Aber man sieht, dass die Probleme 
überwunden sind und es nur noch fertig gestellt werden muss.



Lange Rede kurzer Sinn, - der virtuelle KIM-1 ist mittelfristig wieder 
im Rennen. Er wird quasi als Abfallprodukt vom 1541-Emul kommen. Alle 
Komponenten des KIM-1 sind auch in der Floppy 1541 drin. Man muss es nur 
noch auf den KIM-1 abspecken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.