ich befasse mich gerade gedanklich mit dem Design eines Boards für einen 68000. Im Gegensatz zu den meisten Projekten möchte ich allerdings das RAM bei 0x0000-0x???? haben um zur Laufzeit die Vektoren für die Exceptions ändern zu können. Mein Ansatz wäre jetzt für die Dekodierung ein CPLD zu verwenden und damit für die ersten Zugriffe nach dem Reset das ROM auf 0x0000 zu "spiegeln". Gibt es weiter Vorschläge?
ich befasse mich gerade gedanklich mit dem Design eines Boards für einen
68000. Im Gegensatz zu den meisten Projekten möchte ich allerdings das
RAM bei 0x0000-0x???? haben um zur Laufzeit die Vektoren für die
Exceptions ändern zu können. Mein Ansatz wäre jetzt für die Dekodierung
ein CPLD zu verwenden und damit für die ersten Zugriffe nach dem Reset
das ROM auf 0x0000 zu "spiegeln". Gibt es weiter Vorschläge?
Man kann die drei Function Code Pins FC0--FC2 für die Dekodierung benutzen, denn diese signalisieren auch den Zugriff auf die Reset-Vektoren. So hatte ich Anfang der 1990er mein eigenes Board entworfen. Der Adressdekodierer bestand im Wesentlichen aus 2 GALs (16V8 und 20V8) und ein paar TTL-Gattern. Meine Dokumentation ist aber leider etwas lückenhaft.
Für die moderenen 68k-CPUs musst Du aber ggf. prüfen, ob die sich gleich verhalten.
Andere Lösungen implementierten ein Flipflop im Adressdekoder, das nach dem Auslesen des Resetvektors kippt und dann statt des ROMs das RAM in den unteren Adressbereich einblendete, bis zum nächsten Reset.
Mein Ansatz wäre jetzt für die Dekodierung
ein CPLD zu verwenden und damit für die ersten Zugriffe nach dem Reset
das ROM auf 0x0000 zu "spiegeln". Gibt es weiter Vorschläge?
Ein FlipFlop, von RESET zuruckgesetzt, wird gesetzt so bald ein Zugriff anderswo erfolgt der sowieso decodiert wurde. Dieses FlipFlop fliesst in die Decodierung ein und blendet z.B. das RAM aus.
Musste erst mal mein ur-uraltes 68000 Assembler Manual (Kane,Hawkins,Leventhal) ausgraben um mich etwas aufzufrischen. ;-)
Also lt. Fig 15-1 sind es 256 Vektoren, davon einige (24) für Motorola reserviert und 192 für User Interrupts.
Man könnte das ROM dort lassen, wo es hingehört. Nach einem RESET eine Struktur/Sprungtabelle im RAM anlegen mit später modifizierbaren Vektoren. Die ROM Vektoren zeigen auf diese Sprungtabelle im RAM. Kostet ein paar Zyklen, spart aber Hardware und erfüllt alle Zwecke.
Ich muss Heiner beipflichten. ROM mit Shadow-RAM Konfiguration und Flipflop zum Umschalten. Beim Einschalten das ROM ins RAM kopieren und umschalten. Danach kann man alles so Ändern, wie man es mag.
Dann aber darauf achten, dass im ROM nur relative Sprünge und Referenzen verwendet werden, damit diese im RAM auch noch funktionieren.
Und eine physikalische Umschaltung nach abgeschlossenem RESET braucht man dennoch.
Der Aufwand hält sich in Grenzen.
Ich hab das mal gelöst, in dem ich RAM und ROM auf der gleichen Adresse hatte. Gelesen wurde nach RESET immer das ROM und geschrieben immer das RAM. Dann wurde per IO umgeschaltet und das ROM "verschwand". Die Logik dahinter ist minimal und das "Durchkopieren" einfach. Der Code benötigt für das Umschalten keinerlei Besonderheiten. Er macht im RAM einfach da weiter, wo er im ROM aufgehört hat.
Ich hab das vor langer langer Zeit mal so gemacht... 6502 oder Z80... Ich weiß es nicht mehr. Später noch mal in einem Ti DSP.
Mein Ansatz wäre jetzt für die Dekodierung
ein CPLD zu verwenden und damit für die ersten Zugriffe nach dem Reset
das ROM auf 0x0000 zu "spiegeln". Gibt es weiter Vorschläge?
Beim Atari ST wurden nur die ersten beiden Vektoren (Init-Werte für SSP und PC) aus dem ROM eingespiegelt. Macht den Adressdecoder etwas komplizierter als stumpfes "Hälfte RAM, Hälfte ROM", aber sobald Du etwas Peripherie dranhängst, ist er das ohnehin.
Hm, da gibt es Unterschiede zwischen den verschiedenen Modellen, die Variante des A1000 kommt wohl dem Anliegen des TO am nächsten. Bei diesem wurde zu Beginn der "ROM-Inhalt" von Diskette in einen extra (Kickstart-)RAM geschrieben und dann dieser RAM als ROM geschaltet und das eigentliche boot gestartet. Das nannte sich WCS - Writable Control Store.
Für die Nachfolger A500 und A1000 dagegen hatte man die Firmware fertig so das deren Platine einen echten ROM bekam.
Die Logik für die bootphase ist beim A1000 noch diskret (74* und so) während die Nachfolger dafür den Garry als custom chip hatten.
Beschreibung der Logik im Garry gibt es für FPGA-Nachbauten, bspw. in Minimic.projekt. Gekürzter Auszug
1
input cpu_rd, //cpu read
2
input cpu_hwr, //cpu high write
3
input cpu_lwr, //cpu low write
4
5
input ovl, //overlay kickstart rom over chipram
6
input boot, //overlay bootrom over chipram
7
...
8
9
//chipram, kickstart and bootrom address decode
10
always @(dbr or dma_address_in or cpu_address_in or cpu_rd or boot or ovl or t_sel_slow or ecs or memory_config)
Wie man am input 'boot' und 'ovl' sieht, ist das nur die halbe Wahrheit, mehr kann man sicher den Schaltplänen vom A1000 und A500 entnehmen.
In einigen Projekten wird statt logic ein kleiner (8 bit) µController verwendet. Wer diesen "Stilbruch" (moderner Controller auf klassischen 68k board) nicht scheut kann man auch damit das Umkopieren realisieren.
"... haben um zur Laufzeit die Vektoren für die Exceptions ändern zu können ..."
Hm, welche den? Beim Amiga konnte man bspw den Cold (x002A) und den Cool Capture (x002E) "verbiegen" um die Staradresse des bei boot auszuführenden zu ändern:
"... haben um zur Laufzeit die Vektoren für die Exceptions ändern zu
können ..."
Hm, welche den? Beim Amiga konnte man bspw den Cold (x002A) und den Cool
Capture (x002E) "verbiegen" um die Staradresse des bei boot
auszuführenden zu ändern:
Alle 256 welche ein 68000 bietet!
Denn im Eröffnungsbeitrag ging es nie um einen Amiga.
Die haben einen CPU32 Kern mit den meisten 020 Erweiterungen (die Bitfield-Opcodes fehlen), integrierter programmierbarer Decodierlogik (man braucht also keine externen Adressdecoder) und interner Peripherie. Dazu ein BDM Debug-Port zum Flashen und Debuggen. Ich habe mit diesen Teilen Ende der 90'er Jahre entwickelt.
Besorge dir ältere 68000-Cpu Hardware-Beschreibungs-Bücher und alte Atari ST und Amiga Assembler-Programmierbücher. Die Programmierung ist nicht ganz einfach. Letztlich sind die 68000er ja auch untergegangen, gerade weil sie nicht so einfach auf Hardware-Ebene programmiert werden können, und weil die Kompatibilität nicht so gut wie beim Intel funktionierte.
68k-Assembler ist geradezu traumhaft, was soll daran "nicht einfach"
sein?
Mnemonics/Maschinencode sind sogar derart großartig strukturiert, dass man noch nicht einmal einen C-Compiler vermissen würde. Einer der Angenehmsten den ich seinerzeit in den Fingern haben durfte.
68k-Assembler ist geradezu traumhaft, was soll daran "nicht einfach"
sein?
Mnemonics/Maschinencode sind sogar derart großartig strukturiert, dass
man noch nicht einmal einen C-Compiler vermissen würde. Einer der
Angenehmsten den ich seinerzeit in den Fingern haben durfte.
68k-Assembler ist geradezu traumhaft, was soll daran "nicht einfach"
sein?
Mnemonics/Maschinencode sind sogar derart großartig strukturiert, dass
man noch nicht einmal einen C-Compiler vermissen würde. Einer der
Angenehmsten den ich seinerzeit in den Fingern haben durfte.
genau.
+10!
Der liest sich fast wie Hochsprache. Ich hab den 68k-Assembler zwar nur als Trockenübung gemacht (mangels geeigneten Computer, ich wollte damals einen Gepard) aber ... ich kannte damals 6502 und 6809.
Sind die Pins nicht im 100-mil-Raster angeordnet? Dann lassen sich die
Sockel doch recht einfach durch einreihige Sockelleisten "emulieren",
Könnte man mache, ist aber spätestens bei den Sockeln die ich gerne benutze um wie in diesem Fall die Pins am Emulator zu schützen nicht mehr ganz so toll.
OK, komplett also. Na ja, kann man machen wenn genug RAM zum
Verschwenden da ist.
Man muss nicht den kompletten ROM mit RAM hinterlegen.
Man macht es meistens doch, weil man sowieso viel mehr RAM als ROM
hat.
Dann wird's mal Zeit sich zu entscheiden.
Entweder wird das gesamte ROM kopiert (beginnend bei ROM 0x0 nach RAM 0x0), dann braucht man sich um Adressenanpassung nicht zu kümmern. Oder aber das ROM wird nach einem RESET kurz bei 0x0 eingeblendet, etwas kopiert, dann woanders eingeblendet und dort benutzt. Dann müssen Kopierroutine sowie alle anderen mit unterschiedlichen Basisadressen behandelt werden.
Wie gesagt, man kann die tollsten Sachen machen. Aber alle Verschiebereien und Einblendungen benötigen auch noch zusätzliche Hardware.
Und gefragt wurde nach ›weiteren Vorschlägen‹. Nicht nach Wiederholungen der bereits im Eingangsbeitrag genannten Idee.
68k-Assembler ist geradezu traumhaft, was soll daran "nicht einfach"
sein?
Wenn man die Arbeitsweise im Hinterkopf hat dann schon. Nur der Einstieg halt erfordert etwas mehr Aufmerksamkeit, im Schlaf lernt man den nicht. Die Hardware ist prinzipiell vorbildlich aber
Rbx schrieb:
Letztlich sind die 68000er ja auch untergegangen, gerade weil sie nicht
so einfach auf Hardware-Ebene programmiert werden können
Was für ein Unsinn.
Dass die Cpus untergegangen sind? Da gehörten sicher noch andere Hinweise dazu, Kompatibilitätsmangel oder Schwierigkeiten bei den Cirquit-Erweiterungen (Entwicklungsintegrationsschwierigkeiten - wurden damals hier auf MC.Net sehr gut erklärt).
Als Fanboy sieht man natürlich nicht mehr die Schwierigkeiten der CPUs damals. Fakt ist: sie sind untergegangen. Warum sind die Intel oder Z80 Cpus nicht gleich untergegangen? Naja, möglicherweise war auch die Preis/Leistung-Sache im Gang. Aber Informationen und Einübungen waren auch nicht unbedingt billig. Oder noch anders: Die 68000er waren schlicht so schlecht optimiert, dass sie keine Zukunft hatten. Und hinsichtlich des Hardware-Bastelns sich viele Nächte mit Bombenrauswurf auf dem Bildschirm um die Ohren zu hauen, war auch nicht unbedingt so dolle. Letztlich waren Intel und Z80 auch deutlich besser dokumentiert als die 68000er, dessen gute Informationen man vor allem an den Unis finden konnte - sofern man Glück hatte.
Der innere Ablauf der Befehle war besonders ab 68020 derart komplex, dass eine effiziente Beschleunigung durch modernere Verfahren wie out of order execution und superscalar execution enorm erschwert wurde. Mit 68060 kam das zwar, aber der Zug ging damals bereits in eine andere Richtung.
Andere dahingehend hochkomplexe Architekturen wie VAX und NS32K scheiterten ebenfalls daran. Mit Coldfire überlebte die 68K Architektur als ein wieder deutlich reduziertes Derivat in Embedded.
X86 war damals tatsächlich weniger komplex als 68020, was diese Punkte angeht, und hatte die Stückzahlen, trotzdem den damals enormen Aufwand dafür zu rechtfertigen.
68k-Assembler ist geradezu traumhaft, was soll daran "nicht einfach"
sein?
Nur waren die 80er Jahre von einer Abkehr von Assembler-Programmierung geprägt. Pascal und C lieferten sich ein Rennen, das C gewann. Und wenn man einmal auf Hochsprachen-Ebene ist, spielt die Assembler-Ebene keine wesentliche Rolle mehr. Eher schon die Frage, ob der Aufwand einer Assembler-freundlichen Architektur überhaupt noch sinnvoll ist, oder ob man sich auf Maschinen-Ebene auf das beschränkt, was Compiler benötigen.
Eher schon die Frage, ob der Aufwand einer
Assembler-freundlichen Architektur überhaupt noch sinnvoll ist, oder ob
man sich auf Maschinen-Ebene auf das beschränkt, was Compiler benötigen.
Dann hätte ein sofortiger Umschwung weg von CISC auf reine RISC Architektur stattfinden müssen.
Die Intel CPUs haben "das Rennen gewonnen" weil sie zum richtigen Zeitpunkt in den richtigen Geräten (den aufkommenden PCs) und in echten Stückzahlen auftauchten.
Und ich hoffe doch sehr, dass niemand ernsthaft diese grauenvolle Segment-Register Architektur als die beste Erfindung seit geschnittenem Brot ansieht.
VHS hat auch das Rennen gegen Betamax gemacht, egal wie grottig es war.
Dann hätte ein sofortiger Umschwung weg von CISC auf reine RISC
Architektur stattfinden müssen.
Hat ja auch, nur nicht so blitzartig wie du schreibst, und eingeschränkt durch die kritische Masse der x86er. Ich hatte damals selbst mit diesem Compiler-Thema zu tun, und mit der Affinität von Compilern und Architekturen.
Der Schlüssel war der Erfolg der Pentium Pro Architektur, in der die erwähnten Punkte erfolgreich und erschwinglich implementiert wurden. Von da an wars wieder relativ egal, was darunter steckte.
VHS hat auch das Rennen gegen Betamax gemacht, egal wie grottig es war.
Betamax? Was war das?
Bei mir hat VHS gegen Video 2000 gewonnen, weil es nur bespielte Kassetten in VHS zum Ausleihen gab und Video 2000 noch in den Babyschuhen steckte...
Hat ja auch, nur nicht so blitzartig wie du schreibst, und eingeschränkt
durch die kritische Masse der x86er.
Na ja, die komplette x86 Architektur kann man nun wirklich nicht als RISC einstufen. Sie haben später einige wenige RISC ähnliche Dinge eingebaut, aus dem einfachen Grunde weil diese besser/schneller/Energieeffizienter funktionieren.
Als reines Gedankenspiel könnte man mal darüber nachdenken, was damals passiert wäre, hätte man tatsächlich auf RISC gesetzt. Ohne Wenn und Aber und mit der vollen Marktmacht und demzufolge einem enormen Entwicklungspotential.
Die Compiler-Bauer hätten Rückmeldungen geliefert und diese so in die nächste Hardware-Inkarnation einfließen lassen.
Iterate, Iterate, Iterate, …
Fan von alternativer Geschichte? Es gab eine Zeit, in der die RISC deutlich vorne lagen, bei gleicher Chiptech und -Fläche. Mittlerweile ist der bei x86 höhere Aufwand aber kaum noch relevant, der Anteil am Chip minimal.
Sie haben später einige wenige RISC ähnliche Dinge
eingebaut, aus dem einfachen Grunde weil diese
besser/schneller/Energieeffizienter funktionieren.
Sie haben das als notwendige Grundlage von out of order execution eingebaut. Die Auflösung der komplexen Befehle in Sequenzen dafür geeigneterer einfacher Befehle. Das RISC zu nennen ist Werbesprache, weil damals en vogue. Ebenso könnte man die Mikrobefehle einer Maximal-CISC Architektur wie VAX RISC nennen.
In den letzten Jahren ändert sich das Bild etwas, weil Mobilgeräte am PC-Monopol kratzen, der PC nicht mehr zwingend ist. Auch Microsoft öffnet sich vorsichtshalber wieder ARM, um nicht eines Tages auf der falschen Seite der Geschichte aufzuwachen.
Pascal und C lieferten sich ein Rennen, das C gewann.
Viele gute C-Programmierer hatten früher schon auf den Apple-Computern programmiert und so konnten die auch gut Atari-Programme in C entwickeln. Würde aber nicht sagen, das Pascal verloren hatte. Zumindest auf der Spiele-Crack-Ebene nicht ;) so grundsätzlich war damals viel Basic-Asm-Pascal KnowHow verbreitet, vor allem auch bei guten Elektronikern. Die hatte sich aber auch mehr auf den Intel-PC konzentriert. Beim Atari ST war eine Basic-Entwicklung IDE mit eingebaut. War aber ein schreckliches Teil, echt zum Weglaufen oder zum Vergraulen. Diesbezüglich hätten sich die Atari-Leute deutlich mehr Mühe machen müssen. Viele User sind damals dann schnell auf GFA-Basic umgestiegen, glaube ich.
https://de.wikipedia.org/wiki/GFA-BASIC)
Würde aber nicht sagen, das Pascal verloren hatte. Zumindest
auf der Spiele-Crack-Ebene nicht ;)
Dass Du immer nur von Spielen faselst, sagt vieles über Deine Kompetenz aus. Und mir ist kein Cracker begegnet, der etwas anderes als Assembler benutzt hätte.
Blödsinn, das ST-BASIC war nie im ROM, das lag auf einer Diskette bei.
Erbsenzähler. Soweit ich weiß, kam das im Lieferpacket mit, und sonst
nichts anderes. War halt reichlich enttäuschend als ersten Eindruck.
Beim Amiga (zumindest beim 500er) war auch ein reichlich enttäuschendes BASIC dabei. Naja, war von Microsoft, konnte also wohl nicht wirklich gut sein...
Beim Amiga (zumindest beim 500er) war auch ein reichlich enttäuschendes
BASIC dabei. Naja, war von Microsoft, konnte also wohl nicht wirklich
gut sein...
Kenne ich gar nicht. Damals war das vom C16 aber super. Bei PC habe ich auch noch ein MS-BASIC mit Compiler. Das fand ich gar nicht so übel, weil natürlich auch damals (noch nicht so lange her) noch verschiedene Schulprogrammierhefte mit BASIC erklärt wurden und nicht wie aktuell mit Java oder Python.
Beim Amiga (zumindest beim 500er) war auch ein reichlich enttäuschendes
BASIC dabei.
Kickstart 1.3, AmigaBASIC 1.2, Microsoft 1985,1986
Das war so grauenvoll, dass man es bei neueren Kickstart Versionen dann aus gutem Grund endgültig begraben hat. Man hat damit erfolgreich all das am Amiga schlecht gemacht, was eigentlich verdammt gut war.
190 Sekunden für den Hut. In der Zeit hatte die Oma ein paar Socken für den Winter gestrickt.
Naja, war von Microsoft, konnte also wohl nicht wirklich
gut sein...
Andererseits, kaum eine andere Firma kann von sich behaupten über Jahrzehnte hinweg dieses Niveau aufrecht erhalten zu haben.
Beim Amiga (zumindest beim 500er) war auch ein reichlich enttäuschendes
BASIC dabei.
Kickstart 1.3, AmigaBASIC 1.2, Microsoft 1985,1986
Das war so grauenvoll, dass man es bei neueren Kickstart Versionen dann
aus gutem Grund endgültig begraben hat. Man hat damit erfolgreich all
das am Amiga schlecht gemacht, was eigentlich verdammt gut war.
bei jedem Heimecomputer lag "damals" irgendwie ein BASIC dabei. Vielleich um den Bildungsbereich (Schulen) zu bedienen, die zumindest in den USA damals einen großen Anteil unter den Kunden der Computerfirmen ausmachten.
Und es gab langsame und noch langsamere Basic-Interpreter und die schnarch langsame Nutzung von trigomometrischen float-Funktionen auf diesen FPU-losen 8MHz Kisten tat ihr übriges.
Das Amiga-Basic flog hauptsächlich wegen der Kosten und Inkompatibilitäten zu neueren OS-Versionen raus.
Und es gab langsame und noch langsamere Basic-Interpreter und die
schnarch langsame Nutzung von trigomometrischen float-Funktionen auf
diesen FPU-losen 8MHz Kisten tat ihr übriges.
Wie jedes Andere auch, konnte AmigaBASIC mit Integer Werten arbeiten. Und es war nicht verboten, sich einmalig eine kombinierte sin/cos Tabelle mit 450 Einträgen zu erstellen.
1
dim sincos%(451)
2
degrad=3.14159265 / 180!
3
for w%=0 to 90
4
value%=sin(w%*degrad)*128+0.5
5
sincos%(w%)=value%
6
sincos%(180-w%)=value%
7
sincos%(w%+180)=-value%
8
sincos%(360-w%)=-value%
9
sincos%(w%+360)=value%
10
next w%
11
sincos%(450)=128
(Es ist übrigens absichtlich schlecht lesbar geschrieben, da Formatierung und sogar Leerzeichen zusätzliche Rechenzeit benötigen.)
Es ist ja schon alles geschrieben und genug nostalgiert worden - nur noch nicht von mir ;-)
Seinerzeit hatte ich das /Reset-Signal mit an den Adressdekoder ('/INIT' am GAL20V8) gelegt. Nach Laden des Stackpointers und der Startadresse (hier 0x100000) wurde 'HALT' aktiv und somit das RAM ab 0x0 und das EPROM ab 0x100000 angesprochen.
Die letzte 68K CPU war bei mir der 68HC001, den ich auch dem TO empfehlen würde. 68k hatte ich dann durch die sehr ähnlichen H8/3003, H8S2392 und H8SX1668 ersetzt. Seinerzeit alles schöne Teile!