6502 Emulator Arduino

#7863655
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
#7863908
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
#7863921
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.

#7863948
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{|}~

#7863977
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
}
Angehängte Dateien:
#7864408
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

Angehängte Dateien:
#7864547
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 79757008057644623350300078764807923712509139103039448418553259155159833079730688 caculation time [ms]: 791.37 stopped

PiPico

6502 Emulator press key start 79757008057644623350300078764807923712509139103039448418553259155159833079730688 caculation time [ms]: 68.59 stopped

PiPico2

6502 Emulator press key start 79757008057644623350300078764807923712509139103039448418553259155159833079730688 caculation time [ms]: 59.09 stopped

#8014543
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 ;-)

Angehängte Dateien:
#8014732
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
#8014832
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren