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 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 2 /* */
beaglescout007 0:3dac1f1bc9e0 3 /* pNesX_Mapper.h : pNesX Mapper Function */
beaglescout007 0:3dac1f1bc9e0 4 /* */
beaglescout007 0:3dac1f1bc9e0 5 /* 1999/11/03 Racoon New preparation */
beaglescout007 0:3dac1f1bc9e0 6 /* */
beaglescout007 0:3dac1f1bc9e0 7 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 8
beaglescout007 0:3dac1f1bc9e0 9 #ifndef PNESX_MAPPER_H_INCLUDED
beaglescout007 0:3dac1f1bc9e0 10 #define PNESX_MAPPER_H_INCLUDED
beaglescout007 0:3dac1f1bc9e0 11
beaglescout007 0:3dac1f1bc9e0 12 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 13 /* Include files */
beaglescout007 0:3dac1f1bc9e0 14 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 15
beaglescout007 0:3dac1f1bc9e0 16 #include "pNesX_Types.h"
beaglescout007 0:3dac1f1bc9e0 17
beaglescout007 0:3dac1f1bc9e0 18 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 19 /* Macros */
beaglescout007 0:3dac1f1bc9e0 20 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 21
beaglescout007 0:3dac1f1bc9e0 22 /* The address of 8Kbytes unit of the ROM */
beaglescout007 0:3dac1f1bc9e0 23 #define ROMPAGE(a) &ROM[ (a) * 0x2000 ]
beaglescout007 0:3dac1f1bc9e0 24 /* From behind the ROM, the address of 8kbytes unit */
beaglescout007 0:3dac1f1bc9e0 25 #define ROMLASTPAGE(a) &ROM[ NesHeader.byRomSize * 0x4000 - ( (a) + 1 ) * 0x2000 ]
beaglescout007 0:3dac1f1bc9e0 26
beaglescout007 0:3dac1f1bc9e0 27 /* The address of 1Kbytes unit of the VROM */
beaglescout007 0:3dac1f1bc9e0 28 #define VROMPAGE(a) &VROM[ (a) * 0x400 ]
beaglescout007 0:3dac1f1bc9e0 29
beaglescout007 0:3dac1f1bc9e0 30 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 31 /* Table of Mapper initialize function */
beaglescout007 0:3dac1f1bc9e0 32 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 33
beaglescout007 0:3dac1f1bc9e0 34 struct MapperTable_tag
beaglescout007 0:3dac1f1bc9e0 35 {
beaglescout007 0:3dac1f1bc9e0 36 int nMapperNo;
beaglescout007 0:3dac1f1bc9e0 37 void (*pMapperInit)();
beaglescout007 0:3dac1f1bc9e0 38 };
beaglescout007 0:3dac1f1bc9e0 39
beaglescout007 0:3dac1f1bc9e0 40 extern struct MapperTable_tag MapperTable[];
beaglescout007 0:3dac1f1bc9e0 41
beaglescout007 0:3dac1f1bc9e0 42 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 43 /* Function prototypes */
beaglescout007 0:3dac1f1bc9e0 44 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 45
beaglescout007 0:3dac1f1bc9e0 46 void Map0_Init();
beaglescout007 0:3dac1f1bc9e0 47 void Map0_Write( WORD wAddr, BYTE byData );
beaglescout007 0:3dac1f1bc9e0 48 void Map0_VSync();
beaglescout007 0:3dac1f1bc9e0 49 void Map0_HSync();
beaglescout007 0:3dac1f1bc9e0 50
beaglescout007 0:3dac1f1bc9e0 51 void Map1_Init();
beaglescout007 0:3dac1f1bc9e0 52 void Map1_Write( WORD wAddr, BYTE byData );
beaglescout007 0:3dac1f1bc9e0 53
beaglescout007 0:3dac1f1bc9e0 54 void Map2_Init();
beaglescout007 0:3dac1f1bc9e0 55 void Map2_Write( WORD wAddr, BYTE byData );
beaglescout007 0:3dac1f1bc9e0 56
beaglescout007 0:3dac1f1bc9e0 57 void Map3_Init();
beaglescout007 0:3dac1f1bc9e0 58 void Map3_Write( WORD wAddr, BYTE byData );
beaglescout007 0:3dac1f1bc9e0 59
beaglescout007 0:3dac1f1bc9e0 60 void Map4_Init();
beaglescout007 0:3dac1f1bc9e0 61 void Map4_Write( WORD wAddr, BYTE byData );
beaglescout007 0:3dac1f1bc9e0 62 void Map4_VSync();
beaglescout007 0:3dac1f1bc9e0 63 void Map4_HSync();
beaglescout007 0:3dac1f1bc9e0 64
beaglescout007 0:3dac1f1bc9e0 65 #endif /* !PNESX_MAPPER_H_INCLUDED */
beaglescout007 0:3dac1f1bc9e0 66
beaglescout007 0:3dac1f1bc9e0 67