8080 CPU Simulator

Dieser interaktive Simulator emuliert die Intel 8080 CPU – den legendären 8-Bit-Mikroprozessor aus den 1970er-Jahren. Du kannst hier Assemblercode schreiben, assemblieren und direkt ausführen. Der Speicher (RAM & VRAM), die Register und Flags werden in Echtzeit angezeigt. Das Textdisplay simuliert einen Monitor mit 80×25 Zeichen, der über den Video-RAM beschrieben wird. Ideal zum Lernen, Experimentieren und Verstehen, wie ein Prozessor intern arbeitet.


    
Register
Flags

    

Dokumentation & Lernhilfe

Willkommen im Intel 8080 CPU Simulator – einem interaktiven Lernwerkzeug, das die Funktionsweise eines klassischen 8-Bit-Prozessors vollständig im Browser nachbildet. Hier kannst du echten Assemblercode schreiben, assemblieren, ausführen und in Echtzeit beobachten, was in den Registern, Flags und Speicherzellen passiert. Das Projekt richtet sich an Schüler · Studenten · Lehrkräfte · Retro-Fans und alle, die verstehen wollen, wie eine CPU tatsächlich „denkt“.

Was kann der Simulator?

Bedienung

  1. Assemblercode eingeben: Schreibe 8080-Code in das Textfeld links.
  2. Assemble: übersetzt den Code in Maschinensprache.
  3. Load: lädt das Programm ab Adresse 0x0000 in den Speicher.
  4. Run: startet die CPU – Step führt nur eine Instruktion aus.
  5. Reset: setzt alle Register und Speicher zurück.
  6. Rechts siehst du das virtuelle Display (80×25 Zeichen) und darunter den VRAM-Dump.

Wie funktioniert die Simulation?

Der Emulator bildet den gesamten Befehlssatz des Intel 8080 nach – jedes Opcode-Byte wird dekodiert und exakt wie im Original-Mikroprozessor ausgeführt. Bei einem Schreibzugriff auf eine Adresse ≥ 0xE000 wird der Wert als Bildschirmzeichen interpretiert und in das 80×25-Display geschrieben. Damit lassen sich Textausgaben, Lauftexte oder einfache Benutzeroberflächen programmieren.

Speicherarchitektur des Simulators

Der Intel 8080-Simulator stellt – wie das Original – einen zusammenhängenden 64-KB-Adressraum bereit (0000h–FFFFh). Dieser ist im Simulator in Hauptspeicher (RAM) und Video-RAM (VRAM) aufgeteilt. Der Zugriff erfolgt byteweise über Befehle wie MOV M,A oder LXI H,addr.

BereichAdresse (hex)GrößeVerwendung
RAM 0000h – DFFFh ≈ 56 KB Programmcode, Daten und Stack
VRAM E000h – E7CFh 2 KB (80 × 25 Zeichen) Text-Display-Speicher: jedes Byte = ein ASCII-Zeichen
BIOS F000h – FFFFh 4 KB Basisroutinen (Init, Textausgabe, Clear)

Adressierungsprinzip

Die CPU unterscheidet nicht zwischen RAM und VRAM – beide liegen im selben 16-Bit-Adressraum. 0xE000 markiert lediglich den Beginn des Video-RAM-Segments. Wird ein Byte in diesen Bereich geschrieben, interpretiert der Simulator den Wert als Zeichen und aktualisiert sofort die Bildschirmanzeige.

Beispiel
; Einfache VRAM-Ausgabe
ORG 0000h
LXI H, 0E000h   ; HL zeigt auf VRAM-Start
MVI A, 'A'
MOV M, A        ; schreibt 'A' an 0xE000 → erscheint auf dem Display
INX H
MVI A, 'B'
MOV M, A        ; schreibt 'B' an 0xE001
HLT

Damit stehen im Simulator realistische Bedingungen eines 8080-Systems zur Verfügung – Programme können im RAM ausgeführt und parallel Text im VRAM darstellen.

Beispiel: „HELLO WORLD“

; VRAM-Demo: Schreibt "HELLO WORLD!" auf den Bildschirm
        ORG 0x0000
        LXI H, 0xE000
        MVI A, 'H'     ; Zeichen setzen
        MOV M, A
        INX H
        MVI A, 'E'
        MOV M, A
        INX H
        MVI A, 'L'
        MOV M, A
        INX H
        MVI A, 'L'
        MOV M, A
        INX H
        MVI A, 'O'
        MOV M, A
        INX H
        MVI A, ' '
        MOV M, A
        INX H
        MVI A, 'W'
        MOV M, A
        INX H
        MVI A, 'O'
        MOV M, A
        INX H
        MVI A, 'R'
        MOV M, A
        INX H
        MVI A, 'L'
        MOV M, A
        INX H
        MVI A, 'D'
        MOV M, A
        INX H
        MVI A, '!'
        MOV M, A
        HLT

Nach dem Assemblieren und Laden zeigt das Display „HELLO WORLD!“ in der ersten Zeile an. Du kannst anschließend mit HLT den Prozessor anhalten oder mit JMP in Schleifen springen.

Beispiel: „Konsolen-Echo“

; TTY-Echo über Ports 0/1
        ORG 0x0000
LOOP:   IN   0
        CPI  0
        JZ   LOOP
        IN   1
        OUT  1
        JMP  LOOP

Dieses Programm liest Eingaben aus dem Konsolen-Eingabefeld (Port 0) und gibt sie sofort wieder aus. Dadurch kannst du direkt mit der CPU über die virtuelle Konsole interagieren.

Beispiel: „Zähler 0–9 im VRAM“

; Zählerdemo: schreibt die Ziffern 0–9 in den VRAM
        ORG 0x0000
        LXI H, 0xE000
        MVI B, 0
LOOP:   MVI A, '0'
        ADD B
        MOV M, A
        INX H
        INR B
        MVI A, 10
        CMP B
        JNZ LOOP
        HLT

Das Programm zeigt im Display die Ziffern 0 bis 9 an. Nach dem letzten Zeichen stoppt die CPU.

Beispiel: „CPU-Alive-Test“

; CPU-Alive-Test: gibt fortlaufend 0xFF auf Port 1 aus
        ORG 0
LOOP:   MVI A, 0FFh
        OUT 1
        JMP LOOP

Dieses einfache Testprogramm sendet fortlaufend Daten an Port 1. Es kann als Basis für Hardware-Simulationen oder zur Laufzeitüberwachung dienen.

Beispiel: „Laufschrift“

; VRAM-Demo: einfache Laufschrift mit dem Zeichen '>'
        ORG 0
        LXI H, 0xE000
        MVI A, '>'
NEXT:   MOV M, A
        INX H
        CPI 0xE000 + 80
        JNZ NEXT
        HLT

Dieses Programm schreibt fortlaufend das Zeichen „>“ in die erste Zeile des Displays, bis 80 Spalten gefüllt sind.

Register & Flags der Intel 8080

Die 8080 besitzt sieben 8-Bit-Allzweck-Register (A,B,C,D,E,H,L) sowie zwei 16-Bit-Spezialregister (PC – Program Counter, SP – Stack Pointer). Viele Befehle arbeiten mit den Registerpaaren BC, DE, HL (16-Bit). Arithmetische/logische Operationen setzen die Status-Flags, die von bedingten Sprüngen und Aufrufen geprüft werden.

Register

RegisterBreiteRolleHinweise
A (Akkumulator) 8 Bit Zentrales ALU-Register für Rechen-/Logikoperationen Viele Befehle nutzen implizit A (z. B. ADD r, ANA r)
B, C8 BitAllzweckregisterAls Paar BC nutzbar
D, E8 BitAllzweckregisterAls Paar DE nutzbar
H, L 8 Bit Zeiger auf Speicher (indirekte Adressierung über M = (HL)) Als Paar HL sehr häufig: MOV M,A, INX H
PC 16 Bit Program Counter – Adresse des nächsten Befehls Wird durch Sprünge/Calls/Returns geändert
SP 16 Bit Stack Pointer – Top-of-Stack im RAM Genutzt von PUSH/POP, CALL/RET

Registerpaare: BC, DE, HL, SP (16-Bit-Operationen wie LXI rp,imm16, DAD rp).

Flags (Statusbits)

FlagBitBedeutungSetzlogik (vereinfacht)
S (Sign) Bit 7 1 = Ergebnis negativ Gesetzt, wenn Bit 7 des Ergebnisses = 1
Z (Zero) Bit 6 1 = Ergebnis ist 0 Gesetzt, wenn Ergebnis = 0
AC (Auxiliary Carry) Bit 4 Übertrag (Addition) bzw. Borrow (Subtraktion) zwischen Bit 3 ↔ Bit 4; u. a. von DAA genutzt (BCD). Wird im Simulator korrekt gesetzt (ADD/ADC/ADI/ACI sowie SUB/SBB/SUI/SBI nach 8080-Regel).
P (Parity) Bit 2 1 = gerade Anzahl von „1“-Bits Even Parity über 8-Bit-Ergebnis
CY (Carry) Bit 0 1 = Übertrag (bei Subtraktion: Borrow) ADD: Carry bei > 0xFF · SUB: Borrow → Carry=1

Zusammenspiel

Mini-Beispiel
MVI A, 0x05      ; A = 5
ADI 3            ; A = 8  → S=0, Z=0, P=1, CY=0
CPI 8            ; vergleicht A mit 8  → Z=1
JZ  EQUAL        ; springt, wenn Z=1

Unterstützte Befehle

BefehlBeschreibungBeispiel
NOPKeine Operation 
HLTStoppt die CPU 
MOV r1, r2Kopiert Inhalt von Register r2 nach r1MOV B, A
MVI r, d8Lädt 8-Bit-Wert in RegisterMVI A, 'H'
LXI rp, d16Lädt 16-Bit-Wert in Register-PaarLXI H, 0xE000
LDA addrLädt A aus SpeicheradresseLDA 0x2000
STA addrSpeichert A an SpeicheradresseSTA 0xE000
LDAX rpLädt A aus Adresse des Register-PaarsLDAX D
STAX rpSpeichert A an Adresse des Register-PaarsSTAX B
LHLD addrLädt HL aus Speicher (low/high)LHLD 0x2050
SHLD addrSpeichert HL in Speicher (low/high)SHLD 0x2050
INX rpInkrementiert Register-PaarINX H
DCX rpDekrementiert Register-PaarDCX D
DAD rpAddiert 16-Bit-Wert des Paars zu HLDAD H
INR rInkrementiert Register um 1INR A
DCR rDekrementiert Register um 1DCR M
ADD rAddiert Registerwert zu AADD B
ADC rAddiert Registerwert + Carry zu AADC B
ADI d8Addiert 8-Bit-Wert zu AADI 1
ACI d8Addiert 8-Bit-Wert + Carry zu AACI 1
SUB rSubtrahiert Registerwert von ASUB B
SBB rSubtrahiert Registerwert + Borrow von ASBB B
SUI d8Subtrahiert 8-Bit-Wert von ASUI 1
SBI d8Subtrahiert 8-Bit-Wert + Borrow von ASBI 1
ANA rLogisches AND mit RegisterANA D
ANI d8Logisches AND mit 8-Bit-WertANI 0xF0
ORA rLogisches OR mit RegisterORA B
ORI d8Logisches OR mit 8-Bit-WertORI 0x0F
XRA rLogisches XOR mit RegisterXRA B
XRI d8Logisches XOR mit 8-Bit-WertXRI 0xFF
CMP rVergleicht Registerwert mit ACMP B
CPI d8Vergleicht 8-Bit-Wert mit ACPI 1
DAADezimal-Korrektur nach Addition (BCD-Adjust)DAA
RLCRotiert A nach links (Carry ← Bit 7)RLC
RRCRotiert A nach rechts (Carry ← Bit 0)RRC
RALRotiert A nach links durch CarryRAL
RARRotiert A nach rechts durch CarryRAR
JMP addrSpringt zu AdresseJMP LOOP
JNZ addrSpringt, wenn Z = 0JNZ LOOP
JZ addrSpringt, wenn Z = 1JZ DONE
JC addrSpringt, wenn C = 1JC OVER
JNC addrSpringt, wenn C = 0JNC NEXT
JPE/JPO addrSprung bei Parität gerade/ungeradeJPE EVEN
JP/JM addrSprung bei S = 0/1 (positiv/negativ)JP OK
PUSH rpSchiebt Register-Paar auf StackPUSH H
POP rpHolt Register-Paar vom StackPOP D
XTHLTauscht HL mit Stack-TopXTHL
SPHLSetzt SP = HLSPHL
XCHGTauscht HL ↔ DEXCHG
PCHLSetzt PC = HLPCHL
CALL addrRuft Subroutine an Adresse aufCALL PRINT
CNZ addrCALL, wenn Z = 0CNZ NEXT
CZ addrCALL, wenn Z = 1CZ ZERO
CNC addrCALL, wenn C = 0CNC OK
CC addrCALL, wenn C = 1CC FIX
CPO addrCALL, wenn Parität ungerade (P = 0)CPO ODD
CPE addrCALL, wenn Parität gerade (P = 1)CPE EVEN
CP addrCALL, wenn S = 0 (positiv)CP POS
CM addrCALL, wenn S = 1 (negativ)CM NEG
RETReturn aus Subroutine 
RNZRET, wenn Z = 0 
RZRET, wenn Z = 1 
RNCRET, wenn C = 0 
RCRET, wenn C = 1 
RPORET, wenn Parität ungerade (P = 0) 
RPERET, wenn Parität gerade (P = 1) 
RPRET, wenn S = 0 (positiv) 
RMRET, wenn S = 1 (negativ) 
IN portLiest 8-Bit-Wert von PortIN 1
OUT portSchreibt 8-Bit-Wert zu PortOUT 2
EI / DIInterrupts global (de)aktivieren 
RST nSoftware-Interrupt auf Vektor n*8RST 1
ORG addrSetzt Startadresse im AssemblerORG 0x0000
DBDefiniert Datenbytes oder StringsDB "HELLO"

Hinweis zum AC-Flag (Auxiliary Carry): Das AC-Flag wird vom Simulator korrekt geführt und signalisiert einen Übertrag/Borrow zwischen Bit 3 und Bit 4 (niedrige Nibble) – z. B. bei ADD/ADC/ADI/ACI sowie bei Subtraktionen (SUB/SBB/SUI/SBI) nach der 8080-Borrow-Regel. DAA nutzt das AC-Flag für die BCD-Korrektur.

Abdeckung des 8080-Befehlssatzes

Der Simulator bildet den originalen Intel 8080-Befehlssatz aktuell zu etwa ≈ 98 % ab. Neben allen Register-, Speicher- und ALU-Befehlen werden die CALL/RET-Familie, der BCD-Befehl DAA, die Rotationen RLC/RRC/RAL/RAR sowie die Stack-Operationen PUSH/POP und XTHL/SPHL korrekt ausgeführt. Zusätzlich sind JPE/JPO, JP/JM, PCHL, XCHG sowie EI/DI und RST 0–7 implementiert.

KategorieBeispieleAbdeckungStatus
Datentransfer MOV, MVI, LXI, LDA, STA, LHLD, SHLD, STAX, LDAX 100 % vollständig
Arithmetische Befehle ADD, ADC, SUB, SBB, ADI, ACI, SUI, SBI, INR, DCR, DAD, CMP, CPI, DAA ≈ 100 % inkl. AC-Flag & DAA
Logische & Rotationen ANA, ANI, ORA, ORI, XRA, XRI, RLC–RAR 100 % vollständig
Sprung & Kontrolle JMP, JZ/JNZ, JC/JNC, JPE/JPO, JP/JM, HLT, NOP, PCHL 100 % vollständig
Stack & Subroutinen CALL/C*, RET/R*, PUSH/POP, XTHL/SPHL, XCHG 100 % getestet & aktiv
Interrupts & Software-INT EI/DI, RST 0–7 100 % implementiert

Hinweis: Vor Stack-Operationen immer den Stack Pointer setzen (z. B. LXI SP, D000h), damit CALL/RET zuverlässig arbeiten.

Tipps & Experimente

© 2025 – Andreas Röne • Basierend auf der originalen Intel-8080-Architektur (1974)