Speicherzuordnung im 8085-Mikroprozessor

Im 8085-Mikroprozessor stehen 64 kb Speicher zur Verfügung, von denen einige dem ROM zugewiesen sind, während andere dem RAM zugewiesen sind. Meine Frage ist, warum wird das ROM im 8085-Mikroprozessor immer einem unteren Bereich der Speicherzuordnung zugeordnet?

Antworten (4)

Der 8085 benötigt ROM als niedrigste Speicheradresse, da er nach einem Reset versucht, einen Befehl von Speicherplatz 0 abzurufen. Wenn an dieser Adresse RAM vorhanden wäre, würde der Prozessor zufällige Daten abrufen und das Programm nicht starten.

Wenn der 8085 hochfährt, beginnt er mit dem Abrufen von Anweisungen von der Adresse Null. Es ist also erforderlich, dass der dort befindliche Speicher definierte Inhalte enthält. Das bedeutet jedoch nicht, dass Adresse Null permanent auf ROM abgebildet werden muss. Man könnte ein System mit z. B. 2 K ROM, 64 K RAM und einem Diskettenlaufwerk bauen und ein E/A-Bit verwenden, um zu steuern, ob Speicherlesevorgänge vom ROM oder vom RAM kommen. Lassen Sie beim Start alle Lesevorgänge aus dem ROM kommen (Schreibvorgänge gehen unabhängig vom Steuerbit in den RAM) und lassen Sie das ROM-Programm sich selbst in den RAM kopieren. Aktivieren Sie dann das Lesen aus dem RAM und laden Sie die Software von der Diskette. Da der untere Teil des Adressraums RAM wäre, wäre Software, die von Diskette geladen wird, in der Lage, Interrupt-Vektoren für ihre eigenen Zwecke einzurichten – etwas, das nicht möglich wäre, wenn ROM immer noch dort abgebildet wäre.

LDIRist eine Z80-Anweisung und existiert nicht auf dem 8085.
@DaveTweed: Korrigiert. Wenn die Quell- und Zieladresse identisch sein können, frage ich mich, ob es schneller zu verwenden wäre MOV A,M / MOV M,A / INC L / JNZ / DEC H / JPoder besser, eine Schleife von POP / PUSH / POPAnweisungen zu verwenden (ich weiß nichts über 8085-Timings, aber auf dem Z80 wäre die frühere Sequenz 10 Bytes und etwa 28 Zyklen/Byte kopiert, oder 13 Bytes und 23/Byte, wenn es 2x entrollt wird; letzteres würde 11 Bytes und etwa 22 Zyklen/Byte kopieren, wenn es nicht entrollt wird, oder 14 Bytes und 18,5 Zyklen/Byte, wenn es 2x entrollt wird)
@DaveTweed: Ich nehme an, mit einer leichten Hardwareoptimierung könnte man die Dinge noch schneller machen, indem RAM für alle Speicherzugriffe aktiviert wird, aber wenn ROM aktiviert ist, wird die R / W-Leitung des RAM bestätigt, nicht dass die Geschwindigkeit wirklich wichtig ist für solche Initialisierung. Übrigens bin ich gespannt, wie viel Hardware für die "kreative Adressierung" enthalten ist. Mit einer Adressierungshardware, die einem kleineren CPLD entspricht (ein paar 8-Bit-Latches, eine 16-Bit-ALU und ein paar Muxes), könnte man aus einem 8085 eine anständige objektorientierte 16-Bit-CPU machen, die auf 256 KB RAM zugreift.
Ein Beispiel für "kreative Adressierungshardware" wäre der Hitachi HD64180 (ein Z80-Superset). Es hatte eine Möglichkeit, den logischen Adressraum von 64 kB in bis zu drei Regionen zu unterteilen, von denen jede einem physischen Adressraum von 1 MB zugeordnet werden konnte. Dies passte ziemlich gut zu den erweiterten Funktionen der späteren Versionen von CP/M und ermöglichte eine Art Multitasking zusammen mit RAM-Disk, Disketten-Cache usw. Aber zu diesem Zeitpunkt waren der IBM-PC und andere 16- Bit-Prozessoren wurden üblich, also wurde auf 8-Bit-Prozessoren nicht viel mehr als dies getan.
Falls Sie sich fragen, es gibt einen Grund, warum ich 1 MB gesagt habe und der Wikipedia-Artikel 512 kB sagt. Der HD64180 war in zwei Paketen erhältlich, einem 68-Pin-PLCC und einem 64-Pin(!)-DIP. Das höherwertige Adressbit (A19) war einer der Pins, die sie im DIP-Paket entfernen mussten, wodurch es auf 512 kB begrenzt wurde.
@DaveTweed: Das scheint ziemlich "normal" zu sein. Meine Idee wäre gewesen, einen Bereich von Adressraum zu haben, der für die Verwendung von Interrupts verfügbar ist, und ein paar Adressraumbereiche, die auf 4-Byte-Grenzen verschoben werden könnten. Die MMU würde das letzte Byte, das von einer geraden oder ungeraden Adresse im RAM abgerufen wurde, kontinuierlich in einem Nicht-Unterbrechungsbereich zwischenspeichern, und ein MOV B,Boder MOV C,Cwürde die Basis des oberen oder unteren verschiebbaren Bereichs auf das letzte abgerufene Wort setzen, das um zwei verschoben ist. MOV A,Awürde die verschiebbare Basis auf ihre Standardeinstellung setzen. Wenn man also auf Byte 4 eines Objekts zugreifen wollte...
...das 160. und 161. Byte der Standardbasis, würde man sagen mov A,A / lda 80A0h / mov B,B / lda 8004h. Somit wird der Zugriff auf Objekte in einem 256-K-Adressraum schneller als der Zugriff selbst in einem 64-K-Adressraum normalerweise erfolgen würde. Ich habe etwas ähnliche (wenn auch einfachere) Tricks auf einer Atari 2600-Spielekassette gemacht (die 13 Adresskabel, 8 Datenkabel, Strom, Masse und NICHTS ANDERES von der CPU erhält), sodass ich ein HIRES-Pixel an der Koordinate X zeichnen konnte ,Y einer passend angeordneten Bitmap über LDA $7F00,X / ORA $7E00,Y / STA $7E00,Y.

Ich weiß, das ist alt, aber hier, aus der Erinnerung. Soweit ich mich erinnere, hatten die 8080 und 8085 normalerweise eine von Designern verwendete Hardwareschaltung, die aus einem einzigen Gatter bestand, das den Speicher nach drei Taktsignalen neu zuordnete - gerade genug, um einen JMP-Befehl auszuführen. Die ersten Speicherstellen bei 0:0 kamen also von einem EPROM, und das Gate tauschte das EPROM mit dem RAM im 4. Taktzyklus um 0:0. Das ist aus meiner Erinnerung vor 30 Jahren. Ich würde nach Starthardwareschaltungen für 8085-Selbstbaucomputer suchen - ich vermute, sie sind dort.

Das ROM wird im 8085-Mikroprozessor immer im unteren Bereich der Speicherkarte abgebildet, da nach dem Zurücksetzen versucht wird, eine Anweisung von Position o abzurufen. Wenn zu diesem Zeitpunkt die Adresse RAM vorhanden war, holt der Prozessor zufällige Daten und würde das Programm nicht starten. Also ROM nicht in andere Region verschoben.