ehBASIC running on an emulated 6502

A forum for users of EhBASIC (Enhanced BASIC), a portable BASIC interpreter for 6502 microcomputers written by Lee Davison.
Post Reply
monsonite
Posts: 9
Joined: 06 Jul 2019

ehBASIC running on an emulated 6502

Post by monsonite »

Hi All,

As a teenager, I didn't get much exposure to the 6502 (my machines were generally Z80) - but I did a bit of 6502 assembly language programming on an AIM-65 whilst at college.

Some years ago, I came across the KimUno - which was a 6502 emulated by an Atmel ATMega328 - running under the Arduino IDE. This uses 6502 emulation code written by Mike Chambers (already well known amongst this forum's members) - but you can find the code at the first posting of this link

https://forum.arduino.cc/index.php?topic=193216.0

With recent 6502 emulation activity over on the Gigatron Forum, I thought I'd have a go at porting the 6502 emulator code to a faster target, using the Arduino IDE and Boards Manager to (hopefully) do all the hard work.

My target board is the $25, 400MHz STM32H743ZI Nucleo board

Arduino IDE now supports this board if you install the STM32 boards using Board Manager.

Mike's code runs ehBASIC on this board without modification, but you may wish to increase the RAMSIZE to 48K  (49152) and increase the serial speed to 921600 .

Using this program it will print the numbers 0 to 10000 in about 8 seconds

Code: Select all

10 FOR I = 0 TO 10000
20 PRINT I
30 NEXT I
If you omit line 20, and increase to 100,000 empty loops - it runs in slightly less than 15 seconds

For something a little more taxing - there is the Trig-Test that prints trig functions from 1 to 89 degrees

Code: Select all

5  REM TRIGONOMETRIC FUNCTIONS TEST 1..89 DEGREE
10 PH = 3.141592653/2.0
15 REM DEFINE ARCSIN AND ARCCOS
20 DEF FN ASN(X) = ATN(X/SQR(1.0-X*X))
30 DEF FN ACS(X) = PH-ATN(X/SQR(1.0-X*X))
35 REM TR, TD - TO RAD, TO DEG
40 TR = 3.141592653 / 180.0
50 TD = 180.0 / 3.141592653
55 REM INPUT IN DEGREE (1..89)
60 FOR D = 1 TO 89
70 R = D * TR
80 S = FN ASN(FN ACS(ATN(TAN(COS(SIN(R))))))
90 T = S * TD
100 PRINT T; " "; D; " "; T-D; " "; FRE(1)
110 NEXT D
120 END
It will complete this in about 2 seconds.

I'm sure if I used some of the modifications and tweaks as discussed in the Arduino 6502 thread it could be a lot quicker - but if you want a quick and dirty 6502 emulation in a hurry, on a stock Nucleo board, this will only take about 30 minutes to get running


regards


Ken
User avatar
floobydust
Posts: 1394
Joined: 05 Mar 2013

Re: ehBASIC running on an emulated 6502

Post by floobydust »

Interesting project!

I decided to test your two programs on a pair of my recent 65C02 Pocket SBC boards, one running at 6MHz and one running at 8MHz. Note that console output for both boards using a NXP SCC2691 UART is set at 38,400 baud.

6MHz board:

- Printing 1-10,000 = 17.92 seconds
- Printing Trig functions = 3.06 seconds

8MHz board:

- Printing 1-10,000 = 17.91 seconds
- Printing Trig functions = 2.30 seconds

In the first test, the vast majority of execution time is based on console character speed. The total time to send all of the characters would be about 15.625 seconds.
The second test shows more of the actual CPU clock speed being the difference versus character output speed, albeit there's still a fair number of characters that are being sent.

Not sure if this is of much interest, but at least it shows some numbers from an actual 65C02 based system.
monsonite
Posts: 9
Joined: 06 Jul 2019

Re: ehBASIC running on an emulated 6502

Post by monsonite »

Hi KM,

Thank you for supplying some timings from real 65C02 processors - most interesting.

As you say, much of the execution time is dominated by the actual time to print character output - something that I could minimise by running at 921,600 baud.

The other metric I tried was 1,000,000 empty FOR-NEXT loops, which almost eliminates the overhead of serial output. This ran in 111 seconds.

For me, the appeal of this emulator project is just how easily and quickly it was ported to a low cost, yet high performance ARM microcontroller, and running on the bare metal in standard C code.

Whilst the emulator currently only exercises the cpu and the uart peripheral, - these STM ARM microcontrollers are loaded with a multitude of modern peripherals including ADC, DAC, Timers, GPIO, SPI, I2C, DMA, PWM, LCD (VGA) etc. It's virtually a complete 1980's 6502 microcomputer on a single device.

Not only does it give another access method into the whole 6502 software ecosystem, but offers potential for emulating other classic microprocessors or even minicomputers on a very compact, yet capable Nucleo pcb.

I don't want to offend anyone here - as this is clearly not a 6502 - but a low effort emulation. I'd be happy to continue the discussion over on the anycpu.org forum


regards


Ken
User avatar
BigEd
Posts: 11464
Joined: 11 Dec 2008
Location: England
Contact:

Re: ehBASIC running on an emulated 6502

Post by BigEd »

It's a good topic here - we had a thread which gradually transformed into a catalogue of inexpensive microcontroller dev boards. Mostly ARM! I think 400MHz for $25 is very interesting.
User avatar
floobydust
Posts: 1394
Joined: 05 Mar 2013

Re: ehBASIC running on an emulated 6502

Post by floobydust »

Hi Ken,

I did the same empty loop on both boards using 1,000,000 as the count:

6MHz: 207.22 seconds

8MHz: 155.20 seconds

Based on this, I'd take a SWAG that your emulated setup seems to be close to a 12MHz clock rate, which is quite admirable. Some other interesting EhBasic benchmarks were done earlier, for Sieve and Mandelbrot. It would be interesting to see how your Nucleo performs on those as well.

For Sieve:

viewtopic.php?f=1&t=5198

For Mandelbrot:

viewtopic.php?f=5&t=5184#p60638

Is your emulator doing a 6502 or 65C02?
monsonite
Posts: 9
Joined: 06 Jul 2019

Re: ehBASIC running on an emulated 6502

Post by monsonite »

Hi KM,

AFAIK - Mike Chambers emulator is for 6502.

Thanks for running the "million empty loops" test - that's gives another good data point to compare what this un-optimised C emulator can achieve.

I will have a go at Sieve and Mandelbrot later.

Ed - thanks for pointing me to to the emulatior thread. Some of those comments are nearly 9 years ago - so by way of an update, it is worthwhile noting how the technology has moved on since then.

The latest STM32H743 has been cranked up to 480MHz - another 20% on the 400MHz part I am currently using.

I must stress that this worked first time, using Mike Chambers' unmodified code.

Of course, more efficient implementations would be possible - and some of these have been discussed on the Arduino forum.

The Arduino IDE gave a quick and easy route to running Mike Chambers' code and getting some comparative benchmarks in EhBASIC.

I wonder how much of a BBC Model B, could be emulated on the Nucleo board?

regards


Ken
User avatar
barrym95838
Posts: 2056
Joined: 30 Jun 2013
Location: Sacramento, CA, USA

Re: ehBASIC running on an emulated 6502

Post by barrym95838 »

Nice, Ken. Please be aware that Mike Chambers' original code didn't handle BCD appropriately, and that might eventually become an issue for you as you widen the scope of your experiments.

viewtopic.php?f=2&t=2052&p=37758&hilit=chambers#p37758
Got a kilobyte lying fallow in your 65xx's memory map? Sprinkle some VTL02C on it and see how it grows on you!

Mike B. (about me) (learning how to github)
monsonite
Posts: 9
Joined: 06 Jul 2019

Re: ehBASIC running on an emulated 6502

Post by monsonite »

Thanks Mike,

I came across your BCD patch - when looking into the original thread on Mike Chambers' code.

Much Appreciated

Ken
Post Reply