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
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.