I have ported my old project “pNesX” game console emulator to the nucleo.

Dependencies:   SDFileSystem mbed

Intro

I have ported my old project “pNesX” to the STM32 Nucleo. The pNesX is a NES emulator for the PlayStation that I have created 16 years ago!

Emulation part was almost without change, the sound part was newly added.

Parts

STM32 Nucleo F446RE
QVGA 2.2 TFT SPI (with the SD card slot)
Audio jack(TS or TRS)
USB Connector
Register 100k, 10k, 4.7k, 100
Capacitor 0.01uF, 2.2uF
Breadboard
Wires
Computer Speakers
USB GamePad

Wiring diagram

/media/uploads/beaglescout007/nucleo_ex06_emu.png

TFT J2Nucleo
VCC3V3
GNDGND
CSPB_5(D4)
ResetPA_10(D2) Pull Up(100k)
D/CPA_8(D7)
MOSIPA_7(D11)
SCKPA_5(D13)
LEDLED-100ohm-3V3
MISOPA_6(D12)
TFT J4Nucleo
SD_CSPA_9
SD_MOSIPB_15
SD_MISOPB_14
SD_SCKPB_13
AudioNucleo
TIPPA_4(A2)
USB con.Nucleo
GNDGND
+PA_12
-PA_11
5V5V

https://youtu.be/jL24IjT6LnI

Limitations

  • Since the rest of the RAM is about 50kbyte, maximum capacity of the game ROM is about 50kbyte.
  • The length of the file name up to 32 characters.
  • The number of files in the folder is up to 100.

Used Library

Committer:
beaglescout007
Date:
Sun Apr 03 07:45:29 2016 +0000
Revision:
0:3dac1f1bc9e0
Release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beaglescout007 0:3dac1f1bc9e0 1 #pragma once
beaglescout007 0:3dac1f1bc9e0 2
beaglescout007 0:3dac1f1bc9e0 3 template<class K,class T>
beaglescout007 0:3dac1f1bc9e0 4 class mymap {
beaglescout007 0:3dac1f1bc9e0 5 struct mypair {
beaglescout007 0:3dac1f1bc9e0 6 K first;
beaglescout007 0:3dac1f1bc9e0 7 T second;
beaglescout007 0:3dac1f1bc9e0 8 };
beaglescout007 0:3dac1f1bc9e0 9 public:
beaglescout007 0:3dac1f1bc9e0 10 mymap() {
beaglescout007 0:3dac1f1bc9e0 11 m_size = 0;
beaglescout007 0:3dac1f1bc9e0 12 }
beaglescout007 0:3dac1f1bc9e0 13 T& operator[](const K& key) {
beaglescout007 0:3dac1f1bc9e0 14 int it;
beaglescout007 0:3dac1f1bc9e0 15 if (count(key) == 0) {
beaglescout007 0:3dac1f1bc9e0 16 it = insert(key, 0);
beaglescout007 0:3dac1f1bc9e0 17 } else {
beaglescout007 0:3dac1f1bc9e0 18 it = find(key);
beaglescout007 0:3dac1f1bc9e0 19 }
beaglescout007 0:3dac1f1bc9e0 20 return m_buf[it].second;
beaglescout007 0:3dac1f1bc9e0 21 }
beaglescout007 0:3dac1f1bc9e0 22 bool empty() { return m_size == 0 ? true : false; }
beaglescout007 0:3dac1f1bc9e0 23 int size() { return m_size; }
beaglescout007 0:3dac1f1bc9e0 24 void clear() { m_size = 0; }
beaglescout007 0:3dac1f1bc9e0 25 int count(K key) {
beaglescout007 0:3dac1f1bc9e0 26 for(int i = 0; i < m_size; i++) {
beaglescout007 0:3dac1f1bc9e0 27 if (m_buf[i].first == key) {
beaglescout007 0:3dac1f1bc9e0 28 return 1;
beaglescout007 0:3dac1f1bc9e0 29 }
beaglescout007 0:3dac1f1bc9e0 30 }
beaglescout007 0:3dac1f1bc9e0 31 return 0;
beaglescout007 0:3dac1f1bc9e0 32 }
beaglescout007 0:3dac1f1bc9e0 33
beaglescout007 0:3dac1f1bc9e0 34 private:
beaglescout007 0:3dac1f1bc9e0 35 int find(K key) {
beaglescout007 0:3dac1f1bc9e0 36 for(int i = 0; i < m_size; i++) {
beaglescout007 0:3dac1f1bc9e0 37 if (m_buf[i].first == key) {
beaglescout007 0:3dac1f1bc9e0 38 return i;
beaglescout007 0:3dac1f1bc9e0 39 }
beaglescout007 0:3dac1f1bc9e0 40 }
beaglescout007 0:3dac1f1bc9e0 41 return -1;
beaglescout007 0:3dac1f1bc9e0 42 }
beaglescout007 0:3dac1f1bc9e0 43 int insert(K key, T value) {
beaglescout007 0:3dac1f1bc9e0 44 int it = find(key);
beaglescout007 0:3dac1f1bc9e0 45 if (it != -1) {
beaglescout007 0:3dac1f1bc9e0 46 m_buf[it].second = value;
beaglescout007 0:3dac1f1bc9e0 47 return it;
beaglescout007 0:3dac1f1bc9e0 48 }
beaglescout007 0:3dac1f1bc9e0 49 mypair* new_buf = new mypair[m_size+1];
beaglescout007 0:3dac1f1bc9e0 50 if (m_size > 0) {
beaglescout007 0:3dac1f1bc9e0 51 for(int i = 0; i < m_size; i++) {
beaglescout007 0:3dac1f1bc9e0 52 new_buf[i] = m_buf[i];
beaglescout007 0:3dac1f1bc9e0 53 }
beaglescout007 0:3dac1f1bc9e0 54 delete[] m_buf;
beaglescout007 0:3dac1f1bc9e0 55 }
beaglescout007 0:3dac1f1bc9e0 56 m_buf = new_buf;
beaglescout007 0:3dac1f1bc9e0 57 it = m_size++;
beaglescout007 0:3dac1f1bc9e0 58 m_buf[it].first = key;
beaglescout007 0:3dac1f1bc9e0 59 m_buf[it].second = value;
beaglescout007 0:3dac1f1bc9e0 60 return it;
beaglescout007 0:3dac1f1bc9e0 61 }
beaglescout007 0:3dac1f1bc9e0 62
beaglescout007 0:3dac1f1bc9e0 63 int m_size;
beaglescout007 0:3dac1f1bc9e0 64 mypair *m_buf;
beaglescout007 0:3dac1f1bc9e0 65 };
beaglescout007 0:3dac1f1bc9e0 66