Forum: Mikrocontroller und Digitale Elektronik 6502 Emulator Arduino


von Christoph M. (mchris)


Lesenswert?

Da gerade der 6502 im Focus ist, wollte ich gerne 6502 Code auf einem 
Arduino Nano laufen lassen.

Dazu gibt es hier einen Emulator, den ich für einen Nano Compilieren 
konnte

https://forum.arduino.cc/t/arduino-6502-emulator-basic-interpreter/188328

Es musst allerdings ein fehlendes
1
typedef const char prog_uchar;

in cpu.c eingefügt werden muss.

Leider der Emulator nicht ganz funktioniert: Der Arduino Nano meldete 
sich mit "Coldstart (C) Warmstart(W)" oder so ähnlich. Nach dem drücken 
gab er allerdings nie mehr ein Lebenszeichen von sich ... seltsam.

Meine Anforderungen an den Emulator sind:
- muss auf einem Arduino Nano laufen können
- soll aber auch leicht auf einen PiPico oder ESP32 portierbar sein

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> Meine Anforderungen

da muss ich Goethe zitieren:
Ein Hündchen wird gesucht
Das weder murrt noch beißt,
Zerbrochene Gläser frißt
Und Diamanten – –
https://www.aphorismen.de/zitat/156086

Aber das sieht ja interessant aus. Schon 2013 begonnen.

von Michael B. (laberkopp)


Lesenswert?

Christoph M. schrieb:
> Meine Anforderungen an den Emulator sind:
>
> muss auf einem Arduino Nano laufen können
> soll aber auch leicht auf einen PiPico oder ESP32 portierbar sein

Schreib ihn dir. Dann merkst du vielleicht wie realitätsfremd dein 
Wunsch ist

von Christoph M. (mchris)


Lesenswert?

Als erstes brauche ich einen Assembler.
Praktischerweise gibt es die Online:

https://www.masswerk.at/6502/assembler.html

Passt dessen Format in die Applezeit? Der Syntax ist ja bisweilen 
unterschiedlich.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph M. schrieb:
> Meine Anforderungen an den Emulator sind:
> - muss auf einem Arduino Nano laufen können

Muss das unbedingt sein? Es gibt so viele billige leistungsfähige 
Controller, wozu sich den Aufwand mit dem Nano machen?

von Andreas H. (ahz)


Lesenswert?

Christoph M. schrieb:
> Leider der Emulator nicht ganz funktioniert: Der Arduino Nano meldete
> sich mit "Coldstart (C) Warmstart(W)" oder so ähnlich.

Etwas ungenauer geht es nicht?

Oder meldet er sich mit
1
"6502 EhBasic [C]old/[W]arm ?"

/regards

von Christoph M. (mchris)


Lesenswert?

>Muss das unbedingt sein? Es gibt so viele billige leistungsfähige
>Controller, wozu sich den Aufwand mit dem Nano machen?

Sonst wäre es zu einfach. Für die größeren Controller gibt es 
Haufenweise CPU-Emulatoren in C oder C++, das wäre eher keine 
Herausforderung.

Ich habe Spaßeshalber mal den obigen 6502-Arduino-Nano-Emulator umgebaut 
um ihn auf Ubuntu laufen zu lassen.
Es meldet sich ein "EHBASIC, allerdings weiß ich leider nicht genau, wie 
man es bedient. Hier der Log meines ersten Versuchs:
1
6502 EhBASIC [C]old/[W]arm ?
2
3
C
4
6502 EhBASIC [C]old/[W]arm ?
5
6
7
8
9
Memory size ? 100
10
10 print "hallo"
11
100
12
13
1

von Christoph M. (mchris)


Lesenswert?

Andreas H. (ahz)
18.04.2025 17:18
>Etwas ungenauer geht es nicht?
Oh, jetzt haben wir quasi gleichzeitig gepostet.
Läuft es bei dir auf dem Nano?
Aus irgendwelchen Gründen hat es die obige Ausgabe auf dem Nano nur 
einmal angezeigt. Vielleicht hat meiner ein Flash Problem.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph M. schrieb:
> Sonst wäre es zu einfach. Für die größeren Controller gibt es
> Haufenweise CPU-Emulatoren in C oder C++, das wäre eher keine
> Herausforderung.

Wenn du eine Herausforderung möchtest, warum programmierst du dann 
keinen eigenen Emulator und versuchst einen fertigen zu finden?

von Andreas H. (ahz)


Lesenswert?

Christoph M. schrieb:
> Vielleicht hat meiner ein Flash Problem.

Ich glaube, dass das Problem eher vor dem Bildschirm sitzt ;)

Weil mit 100 Byte die Du dem Basic als Arbeitsspeicher zugestehst wird 
er nicht viel machen können.

Schau doch mal hier: 
http://www.6502.org/users/mycorner/6502/ehbasic/starting.html

/regards

von Christoph M. (mchris)


Lesenswert?

Niklas G. (erlkoenig) Benutzerseite
>Wenn du eine Herausforderung möchtest, warum programmierst du dann
>keinen eigenen Emulator und versuchst einen fertigen zu finden?

Weil es ja den Verlinkten schon gibt. Der ist aber unschön programmiert, 
weil sich in cpu.c die ROM-Listings befinden. Das Ganze ist nicht gut 
gekapselt und nicht gut separierbar.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph M. schrieb:
> Das Ganze ist nicht gut
> gekapselt und nicht gut separierbar.

Dann reparier es halt, dann hast du deine Herausforderung! Oder willst 
du Herausforderungen nur für andere?

von Christoph M. (mchris)


Lesenswert?

>Dann reparier es halt, dann hast du deine Herausforderung! Oder willst
>du Herausforderungen nur für andere?

Kein Problem:
1
/*
2
 * rom.c
3
 *
4
 *  Created on: 18.04.2025
5
 *      Author: mchris
6
 */
7
/*
8
9
;Online Assembler:
10
;https://www.masswerk.at/6502/assembler.html
11
12
.org $FF00
13
14
start:
15
    LDA #$30      ; Load ASCII '0' (which is $30) into the accumulator[7]
16
loop:
17
    CLC           ; Clear carry (not strictly necessary for INC, but good practice)
18
    ADC #$01      ; Add 1 to accumulator (A = A + 1)
19
    STA $F001     ; Store accumulator value to $F001
20
    JMP loop      ; Repeat forever
21
22
*/
23
#include "rom.h"
24
25
uint8_t pgm_read_byte_near(uint8_t *adr)
26
{
27
  return *adr;
28
}
29
30
prog_uchar BIOS[] PROGMEM = {
31
  0xA0,
32
};
33
34
35
// BIOSTOP start address: 0xFF00
36
prog_uchar BIOStop[] PROGMEM = {
37
  0xA9,0x30,0x18,0x69,0x01,0x8d,0x01,0xF0,0x4c,0x02,0xFF,
38
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
39
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
40
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
41
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
42
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
43
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
44
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
45
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
46
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
47
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
48
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xA2,0xFF,0x9A,
49
  0xA0,0x1C,0xB9,0xBB,0xFF,0x99,0x04,0x02,0x88,0xD0,0xF7,
50
  0xB9,0xD8,0xFF,0xF0,0x06,0x20,0xED,0xE0,0xC8,0xD0,0xF5,
51
  0x20,0xEA,0xE0,0x90,0xFB,0x29,0xDF,0xC9,0x57,0xF0,0x07,
52
  0xC9,0x43,0xD0,0xD7,0x4C,0x00,0xC0,0x4C,0x00,0x00,0x8D,
53
  0x01,0xF0,0x60,0xAD,0x04,0xF0,0xF0,0x02,0x38,0x60,0x18,
54
  0x60,0xB3,0xFF,0xAF,0xFF,0xBB,0xFF,0xBB,0xFF,0x48,0xA5,
55
  0xDF,0x4A,0x05,0xDF,0x85,0xDF,0x68,0x40,0x48,0xA5,0xDC,
56
  0x4A,0x05,0xDC,0x85,0xDC,0x68,0x40,0x0D,0x0A,0x36,0x35,
57
  0x30,0x32,0x20,0x45,0x68,0x42,0x41,0x53,0x49,0x43,0x20,
58
  0x5B,0x43,0x5D,0x6F,0x6C,0x64,0x2F,0x5B,0x57,0x5D,0x61,
59
  0x72,0x6D,0x20,0x3F,0x00,0x00,0x00,0x00,0x17,0x02,0x00,
60
  0xFF,0x0D,0x02
61
};

Output in der Ubuntu Simulation:
6502 simulator output:

123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

Jetzt auf dem Nano selbst.
Die eingebaute LED ist als Testpin auf die Adresse 0xF002 des 6502 
gemapt.

Togglefrequenz ca. 14kHz.
1
;Online Assembler:
2
;https://www.masswerk.at/6502/assembler.html
3
4
;===== TESTPINTOGGLE =========
5
.org $FF00
6
7
start:
8
loop:
9
    LDA #$00      ;
10
    STA $F002     ; Store accumulator value to port address
11
    LDA #$01      ;
12
    STA $F002     ; Store accumulator value to port address
13
    JMP loop      ;
14
15
..
16
17
  void writePort(uint8_t val)
18
  {
19
#ifdef ARDUINO_AVR_NANO
20
    if (val & 0x01)
21
    {
22
      PORTB |= (1 << PORTB5);  // Set pin 13 HIGH
23
    } else
24
    {
25
      PORTB &= ~(1 << PORTB5); // Set pin 13 LOW
26
    }
27
#else
28
    if (val & 0x01) digitalWrite(LED_BUILTIN, HIGH);
29
    else digitalWrite(LED_BUILTIN, LOW);
30
#endif
31
    //printf("write port %x\n",val);
32
    //Serial.print("write port ");Serial.println(val);
33
  }
34
35
void write6502(uint16_t address, uint8_t value) {
36
  if (address < RAM_SIZE) RAM[address] = value;
37
  if (address == 0xF001) { //EhBASIC simulated ASIC output
38
    serout(value);
39
  }
40
  if (address == 0xF002) { // microcontroller port
41
    writePort(value);
42
  }
43
}

von Christoph M. (mchris)


Lesenswert?

Für die Entwicklung wichtige Links:

Instruction Set:
https://www.masswerk.at/6502/6502_instruction_set.html#INX

Online Simulator und Tutorial:
https://skilldrick.github.io/easy6502/

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

So, jetzt habe ich den 6502 auf dem Arduino Nano zum laufen gebracht ( 
es waren einige Fehler drinnen ) und ich konnte die Fibonacci-Folge aus 
dem Wettbewerb mittels eines Assemblerprogramms (hat auch länger 
gedauert als gedacht) berechnen.

Gesamtrechenzeit für die 80 stellige Zahl:

5.13 Sekunden

Die Terminalausgabe über die serielle Schnittstelle ist vermutlich der 
Hauptbremser.
Ich muss die mal abstellen und nur das Endergebnis drucken.

Das ganze bezieht sich auf den Wettbewerb hier:
Beitrag "Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

edit:
Die Rechenzeit, wenn man nur das Endergebnis ausgibt: 0.79 Sekunden

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Wie schnell läuft nun der 6502 Arduino Emulator auf den verschiedenen 
Mkrocontrollern?


Square Wave Assembler Benchmark:
1
loop:
2
  LDA #$00 ;(Load Accumulator, Immediate): 2 cycles
3
  STA $F002 ;(Store Accumulator, Absolute): 4 cycles
4
  LDA #$01 ;(Load Accumulator, Immediate): 2 cycles
5
  STA $F002 ;(Store Accumulator, Absolute): 4 cycles
6
  JMP loop ;(Jump Absolute): 3 cycles

total: 15 cycles

Mit Oszi am 6502 Arduino Nano gemessen: ~14kHz

Vergleich 6502 Arduino Nano Emulator zu Computer:
Commodore 64, Apple II, 1 MHz: ~66666Hz ( ca, 5x schneller als 6502 
Arduino Emulator)
Atari 800, 1.79 MHz:  ~119333Hz ( ca, 8.5x schneller als 6502 Arduino 
Emulator)

##############################

80 Digits Fibonacci Benchmark:

Arduino Nano
==============
6502 Emulator
press key
start
797570080576446233503000787648079237125091391030394484185532591551598330 
79730688
caculation time [ms]: 791.37
stopped

PiPico
=============
6502 Emulator
press key
start
797570080576446233503000787648079237125091391030394484185532591551598330 
79730688
caculation time [ms]: 68.59
stopped

PiPico2
=============
6502 Emulator
press key
start
797570080576446233503000787648079237125091391030394484185532591551598330 
79730688
caculation time [ms]: 59.09
stopped

: Bearbeitet durch User
von StefanK (stefanka)


Angehängte Dateien:

Lesenswert?

Steampunk Archäologie - Blindflug mit Epson HX-20

Das Thema hat mich animiert, fib.bas von Yalu auf einem 44 Jahre alten 
Epson HX-20 laufen lassen. Der HX-20 hat einen Hitachi 6301 mit 614kHz. 
Darauf läuft ein "Microsoft & Epson" Basic von 1982.

fib.bas lief abgesehen von RIGHT$ und STR$ sofort und war nach 15-18 min 
fertig (ich sah bei Minute 15 zuletzt auf die Uhr, machte dann 3min was 
anderes...)

Die Anpassung des Programms an die Epson eigenen Right und Str Befehle 
wäre sicher möglich gewesen, wenn ich etwas gesehen hätte.

Ich habe 2 HX-20. Einer läuft zwar, aber das Display hat so wenig 
Kontrast, dass es kaum noch lesbar ist. Die Eingabe des Programms war 
nur noch unter größter Anstrengung möglich.

Das Display des anderen ist zwar gut lesbar, aber der Rechner hängt nach 
dem Start komplett. Nach dem Versuch, aus beiden Geräten ein 
funktionierendes zu machen, geht jetzt keiner mehr... Alles hat eben 
seine Zeit ;-)

von Hobby B. (bastler2022)


Lesenswert?

StefanK schrieb:
> Nach dem Versuch, aus beiden Geräten ein
> funktionierendes zu machen, geht jetzt keiner mehr... Alles hat eben
> seine Zeit ;-)

Hallo StefanK,

falls Du dich da nicht mehr weiter mit beschäftigen solltest.
Hätte ich Interesse an den beiden.

Gruß bastler2022

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

Elkotausch hilft.

von StefanK (stefanka)


Lesenswert?

Wolfgang R. schrieb:
> Elkotausch hilft.

Das denke ich auch.

@Hobby B.
Beide laufen wieder nachdem ich sie stromlos gemacht und länger geladen 
habe. Auch das Display erholt sich etwas. Ich komme heute 
Nachmittag/Abend auf Deine Anfrage zurück.

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

https://www.wolfgangrobel.de/museum/hx20.htm

Nur für den Fall, dass es interessiert. Und ja, die Akkus brauchen eine 
Grundladung, ansonsten startet das Teil nur mit Netzteil nicht.

von Soul E. (soul_eye)


Lesenswert?

StefanK schrieb:
> Beide laufen wieder nachdem ich sie stromlos gemacht und länger geladen
> habe. Auch das Display erholt sich etwas. Ich komme heute
> Nachmittag/Abend auf Deine Anfrage zurück.

Warte trotzdem nicht zu lange. In meinem Compaq Portable haben die 
ausgelaufenen SMD-Elkos die Leiterplatten und Leiterfolien im TFT 
vernichtet. Da half wirklich nur noch Komplettaustausch. Zum Glück 
passte da ein etwas moderneres NEC-Panel 1:1 rein, lediglich ein 
Sync-Signal musste etwas verzögert werden damit das Bild wieder mittig 
steht.

(Der Compaq 486c ist kein Sammlerstück, sondern er muss sich seinen 
Strom als Bestandteil eines Data I/O Sprint Expert Programmiersystemes 
verdienen. Daher ist diese nicht-Originalität zu verschmerzen.)

: Bearbeitet durch User
von StefanK (stefanka)


Lesenswert?

Wolfgang R. schrieb:
> https://www.wolfgangrobel.de/museum/hx20.htm
>
> Nur für den Fall, dass es interessiert. Und ja, die Akkus brauchen eine
> Grundladung, ansonsten startet das Teil nur mit Netzteil nicht.

Das ist eine tolle Seite und eine perfekte Reparaturanleitung.

@Alle
Entschuldigt, habe gerade gemerkt, dass ich im falschen Fred gelandet 
bin. Wollte eigentlich zum Wettbewerb posten. Trotzdem Glück, einen 
Epson HX-20 Profi gefunden zu haben :-)

von Rolf (audiorolf)


Lesenswert?

StefanK schrieb:
> Steampunk Archäologie - Blindflug mit Epson HX-20

Das waren noch schöne Geräte an denen das Arbeiten Spass machte.

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.