Archiv verlassen und diese Seite im Standarddesign anzeigen : 8085 Prozessor 64k Limit erweitern
rogerberglen
12.02.2010, 12:58
Ich habe momentan an einem 8085 Prozessor einen 32K EPROM und einen 32K Statischen Speicher daranhängen.
Jetzt habe ich das Problem, daß mir die 32K EPROM nicht mehr ausreichen für mein Programm. Ich muß also statt eines 27256 Eproms nun einen 27512 Eprom einsetzen.
Wie stelle ich es jetzt an damit mein Prozessor die zusätzlichen 32K Adressiert? Das Programm würde dabei per Sprungbefehle häufig zwischen den unteren 32k und den oberen 32k wechseln.
Besserwessi
12.02.2010, 14:19
Wer arbeitet noch mit so antiker Hardware ? Der 8085 ist doch schon seit gut 30 jahren nicht mehr aktuell.
Die Erweiterung auf mehr als 64 K Adressraum ist nicht einfach, auch in der Benutzung muß man da einges beachten.
Was man machen kann, wäre ein Adaptersockel, der die meistens Pins direkt verbindet und die zusätzlichen Adressleitungen an IO Ports führt. Zum Sprung von einen Programmteil in den anderen muß dann der IO Port verändert werden. Das Programm kann dann einfach im andern EPROMteil weiterlaufen - aber halt nur an genau der Stelle. Für etwas variablere Sprünge müßte man man sich noch was ausdenken, z.B. die eigentliche Sprungadresse auf den Stack schreiben.
Ich glaube irgendwie nicht, dass das hier das richtige Froum dafür ist...
versuchs doch mal beim Forum 64:
http://www.forum64.de/wbb3/index.php?page=Index
Da könnten vielleicht einige sein, die sich damit auskennen, ich meine, das wurde bei älteren PCs doch auch so gemacht. Vielleicht gibts ja noch entsprechende ICs. Ich hätte jetzt spontan gedacht, man könnte die gewünschte Adresse in eine bestimmte Zelle des RAM schreiben, dann zur "Sprungadresse" springen, die in beiden "Bänken" des EEPROMs vorhanden ist und an deren Adresse in der jeweils anderen Bank ein Code steht, der zu der im RAM abgespeicherten Adresse springt. Das wäre zwar nicht gerade sehr performant, aber würde immerhin, bis auf die von Besserwessi erwähnte Verbindung IOPort - zusätzliche Adressleitung des EEPROMs ohne zusätzliche Hardware auskommen. Aber ich hab auch noch nie mit diesem oder ähnlichen Prozessoren gearbeitet.
Ich denke nur, eine Lösung in Hardware wird durch die gemultiplexte Daten- und Adressleitung nicht grade einfacher
Besserwessi
12.02.2010, 19:15
Man kommt mich drumherum den neuen größeren Chip die zusätzliche Adressinformation (hier wohl nur 1 Bit) irgendwie zusätzlich mitzuteilen. Was wesenlich anderes als einIO Port wird einem da nicht übrigbleiben. Das dabei Leitungen sonst gemultiplext sind wird nicht groß weiter stören, denn man fügt einfach eine zusätzliche Leitung dazu, die dann der einfachheit halber halt nicht noch gemultiplext ist (es braucht sie ja auch kein anderer).
Für das Programm kann es dann tatsächlich so aussehen, das man die eigentliche Ziehadress ins RAM schreibt, und dann eine Spezille Subroutine aufruft, die ein beiden Hälften vorhanden ist. Die Routine stellt dann die Zusätzliche Adresse ein, springt dabei ggf. in den identischen Code auf der anderen Seite und springt an die Stelle die im RAM steht. Wenn man will kann man dabei auch noch einen Rücksprung gleich mit merken.
Es könnte etwa einfacher werden, wenn man die kurze Routine zum Umschalten im RAM Ausführt, und dann erst wieder zurück in EPROM.
Das Forum zum C64 ist da sicher eine gute Adresse um was zu finden. Das sollte sich auch Hardwaremäßig kaum unterscheiden. Eine solche Umschaltung von Speicherberechen was damals bei 8 Bit Systemen nicht so selten, wenn auch selten mittem im Programm (ROM), sondern mehr für extra RAM.
i_make_it
12.02.2010, 19:32
Wer sagt da veraltet?
In Würde gealtert ist besser.
Um ins Microcontoller Gebiet einzusteigen und wirklich von der Basis an alles zu verstehen, sind 8048 und 8051 ideal. Und der 8085 ist da auch recht einfach gestrickt.
Natürlich bringen die nicht das was die heutige Generation kann, aber dafür kann man danach bestimmt Assembler.
Der 8085 hat eine Kraftwerkszulassung, deshalb kann man den ja selbst heute noch (unter Schwierigkeiten) bekommen.
Das Problem ist der 8085 hat schon einen gemultiplexten Adress/Daten Bus im Lowbyte, das da kein Bitmuster als zusätzlicher Adressteil ausgegeben werden kann.
Versuche dein Programm so umzuschreiben das du möglichst wenig Sprünge zwichen den Memory Pages hast.
Falls du SOD nicht verwendest, kannst du damit eine Adressierung erreichen, oder den Zusatzspeicher so an den Bus hängen.
Auf jeden Fall wirst Du Wohl den EPROM Speicher beider 32K Bereiche in den selben Adressbereich der CPU mappen müssen.
http://www.8085projects.info/
@Besserwessi
Leider unterscheidet sich die Adressierung von D-Ram in den Details. Mit einem einzigen Bit und den Chip Select sowie Collum Access und Row Access konnte man da mit ein paar Gattern den Speicher gleich vervierfachen. Das geht so bei S-Ram und Eproms leider nicht. Die Grundsätzliche Technik des Pagemappings ist aber die Selbe und wurde ja auch beim PC verwendet um die 640k Grenze zu überspringen. Nur gabs da dann extra das A20 Gate dafür.
Besserwessi
12.02.2010, 22:23
Hier geht es darum ein EPROM oder ggf. ein statisches RAM anzustprechen. Die sind beide in der Addressierung (und teils sogar Pinbelegung) sehr ähnlich, ohne multiplexing der Adresse. Bei einem 8085 wird das also noch ein Latch zwischen sein, um von des gemultiplexten Adressen des 8085 auf die parallelen des Speichers zu kommen.
Für ein Umschalten von Memory pages muß man nur ein zusätzliches Adressbit für den Speicher (nur EPROM) hinzufügen um den Adressbereich zu verdoppeln. Das hat mit dem Multiplexen eigentlich gar nichts zu tun.
Nur wenn man es sich unnötig kompliziert machen will und das EPROM durch extra DRAM erweitern wollte müßte man darüber nachdenken - das ist aber eine eher abwegige Idee.
Wenn man einfach die eine Adressleitung dazufügt, kreigt man ganz natürlich die beiden EPROM-hälften in den gleiche Adressbereich.
Das A20 gate war mehr dazu da, um eine Eigenheit (fast ein Bug) den 8086 auch auf spätere Prozessoren zu übertragen. So direkt hat das nicht mit page Mapping zu tun, nur das man beim PC gerade den Bereich der davon betroffen war per Pagemapping umgeschaltet hat.
i_make_it
13.02.2010, 07:40
Mit dem D-RAM Beispiel hatte ich folgendes gemeint:
Beim C64 und beim Atari ST ging es primär im Erweiterung von Ram, deshalb sind die meisten Tipps dort nicht für die Erweiterung von S-RAM /EPROM über die Grenze des Adressraumes geeignet.
Nur bei der 1541 brauchte man mehr Eprom wenn man einge Versionen von Speed Copy implementieren wollte. Da könnte eventuell etwas zu finden sein was man einfach so übernehmen kann.
Da beim 8085 Die Adressierungsbefehle auf einen 64K also 16 Bit Adressraum ausgelegt sind, kann man die zusätzlichen 32K nicht einfach in eine "erweiterten" Adressraum stecken.
Die Befehle wie JMP, LDx etc. sind halt schon maximal als 3 Byte Befehle implementiert. Da Intel CISC und keine RISC Chips hat, wird die Selbstimplementierung eines erweiterten Befehlssatzes der eine Erweiterte Adressierung erlaubt vermutlich zum einen, zu speicheraufwändig und zum anderen wird die Verarbeitung dann zu langsam.
Selbst eine Adressierung mit Offset scheitert daran, das Der Offset nicht größer sein kann als der vorgesehene Adressraum.
Entweder man adressiert das als weiteren IO Chip am Bus, dann muß man vor jeder Lese oder Schreib Operation immer erst den Chip Selektieren, also mindestens 2Byte zusätzlich pro R/W Operation oder man mogelt sich woanders ein Selekt Signal her und mapt die 32K auf den selben Adressraum den vorher das andere 32K Eprom hatte. Das hattest du ja sogar schön beschriebeninklusive der Tatsache das da ein Steuerkode notwendig ist, der dann den Stack retten muß und in beiden Pages identische Einsprung Punkte zur Verfügung stellen muß.
Wie viel RAM und wie viel EPROM brauchst du denn tatsächlich? Wenn es kein Problem ist wenn du weniger als 32k RAM zur verfügung hast könntest du dir einfach eine Logikschaltung dazwischen basteln. Du könntest den Adressbereich ja z.B. so teilen dass von 0x0000 bis 0xEFFF das EPROM geht und von 0xEFFF bis 0xFFFF der RAM, wenn das noch ausreichen würde, dann müsstest du außer ein wenig Glue-Logic nichts weiter an deiner Schaltung und deiner Software verändern. Du müsstest dich halt dann damit abfinden das ein ein Teil deines Speicherplatzes brach liegt, aber bei den heutigen Speicherpreisen ist das wohl verkraftbar oder?
P.S.: Wenn wir schon ein wenig am Retro-Trip sind könntest du die Chip-Enable Logik ja mit einem GAL realisieren, um authentisch zu sein.
Besserwessi
13.02.2010, 13:11
Die Erweiterung der EPROMs durch Bankumschaltung sollte nicht so schwer sein. Wenn man die Routine zum Springen zwischen den beiden ERPOM Seiten ins RAM kopiert, kann die Hardware wirklich einfach bleiben. Man braucht dann nicht mal eine syncronisation zwischen IO Port und extra Addressleitung. Wenn man noch irgendwo eine IO Leitung abknapsen kann ist es also wirklich ganz einfach, sonst ist es etwas dumm das man für 1 Leitung noch einen extra IO chip braucht.
Auch wenn man hier eine Adressleitung des Eproms nutzt, hat man natürlich keinen größeren Adressbereich bei der CPU, sonder nur eine Umschaltung zwischen 2 (oder ggf. auch mehr) 2 Speicher bereichen.
ps. Bei der 1541 war eine Speichererweiterung ja kein echtes Problem , denn man hatte noch genug Platz im Adressbereich.
Mit dem D-RAM Beispiel hatte ich folgendes gemeint:
Beim C64 und beim Atari ST ging es primär im Erweiterung von Ram
Sorry, aber da MUSS ich Klugscheissen!
Beim Atari ST ganz bestimmt nicht, den hat man ohne Bankswitching auf 14MB bringen können. Beim Atari XL/XE wurde das gerne und noch häufiger wie beim C64 gemacht.
Atari XL/XE zu Atari ST verhält sich wie C64 zu Amiga.
Aber zum Threadthema:
ich würde empfehlen sich mal die Bankswitchingmethoden beim Atari 2600 anzuschauen.
Dadurch das die Hardware so begrenzt war und zum Modulport z.B. kein /WE etc geführt wurde, haben sich die Entwickler zum Teil wirklich geniale Bankswitchingmethoden ausgedacht.
Ich habe mal eine nachgebaut, mit ein paar 74er TTL Ics. Das läuft dann nach der Methode:
Schreiben oder Lesen auf eine bestimmte Adresse und das Rom wird umgeschalten.
Vorteil: Man braucht keinen Portpin von einem anderen IC etc pp.
Ich würde das Schaltungs- und Programmtechnisch dann so lösen:
Erstmal den RAM bedarf bestimmen.
z.B.
64K Eprom
32K RAM
Aufteilen in 1x 16K Eprom und anschließen in den 16K von 17-32K die 3 16K Blöck einblenden.
Die ersten 16K Eprom mit allen "wichtigen und oft" verwendeten Routinen.
Bei jedem Sprung in eine Routine die in einem geswitchten ROM-Bereich liegt muß man vor dem Sprung nur noch einen Dummyread oder write durchführen. Evtl. noch ein oder 2 NOPs falls sich ungünstige Gatterlaufzeiten bei den TTls ergeben und dann den Sprungbefehl.
Mit der Adresse des Dummyzugriffs übergibt man dann auch gleich den Block den man einblenden möchte. Ziemlich Elegant, weil nur ein zusätzlicher Befehl zum Einblenden pro Aufruf notwendig ist.
Im Anhang an den Sprungbefehl kann man dann (je nach Programmierstil) dann auch gleich mit einem weiteren Dummyread/write nach dem Rücksprung einen default Zustand wieder herstellen.
Die Schaltungen passen auf einen Zwischensockel und sind ziemlich flexibel.
Vorteil: die Methode hat sich bewährt und die Schaltungen kann man im Netz finden. Stichwörter: Atari 2600 Bankswitching. Nicht nur nach Webpages auch nach txt-Dateien im web suchen auf die diese Stichworte treffen.
Viel Erfolg!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.