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_Filer.cpp : ROM selection screen */
beaglescout007 0:3dac1f1bc9e0 4 /* */
beaglescout007 0:3dac1f1bc9e0 5 /* 2016/1/20 Racoon */
beaglescout007 0:3dac1f1bc9e0 6 /* */
beaglescout007 0:3dac1f1bc9e0 7 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 8
beaglescout007 0:3dac1f1bc9e0 9 #include "mbed.h"
beaglescout007 0:3dac1f1bc9e0 10 #include "SDFileSystem.h"
beaglescout007 0:3dac1f1bc9e0 11 #include "tft.h"
beaglescout007 0:3dac1f1bc9e0 12
beaglescout007 0:3dac1f1bc9e0 13 extern void pNesX_PadState( DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem );
beaglescout007 0:3dac1f1bc9e0 14 extern const unsigned char pNesX_logo[];
beaglescout007 0:3dac1f1bc9e0 15 extern const unsigned char Racoon_logo[];
beaglescout007 0:3dac1f1bc9e0 16
beaglescout007 0:3dac1f1bc9e0 17 #define LOGO_BACKCOLOR 0x86fd
beaglescout007 0:3dac1f1bc9e0 18
beaglescout007 0:3dac1f1bc9e0 19 #define FOLDER_FILE_MAX 100
beaglescout007 0:3dac1f1bc9e0 20 #define LIST_ROWS 20
beaglescout007 0:3dac1f1bc9e0 21 #define LIST_TOP 40
beaglescout007 0:3dac1f1bc9e0 22 #define LIST_LEFT 4
beaglescout007 0:3dac1f1bc9e0 23
beaglescout007 0:3dac1f1bc9e0 24 int DispTop; // Top of the list
beaglescout007 0:3dac1f1bc9e0 25 int SelIdx; // Cursor index
beaglescout007 0:3dac1f1bc9e0 26 int FileCount; // Number of files in the folder
beaglescout007 0:3dac1f1bc9e0 27
beaglescout007 0:3dac1f1bc9e0 28 // file information
beaglescout007 0:3dac1f1bc9e0 29 typedef struct tagLISTITEM{
beaglescout007 0:3dac1f1bc9e0 30 char filename[33];
beaglescout007 0:3dac1f1bc9e0 31 bool isDir;
beaglescout007 0:3dac1f1bc9e0 32 long size;
beaglescout007 0:3dac1f1bc9e0 33 } LISTITEM;
beaglescout007 0:3dac1f1bc9e0 34
beaglescout007 0:3dac1f1bc9e0 35 // folder file list
beaglescout007 0:3dac1f1bc9e0 36 LISTITEM *flist;
beaglescout007 0:3dac1f1bc9e0 37
beaglescout007 0:3dac1f1bc9e0 38 char szRomFolder[256];
beaglescout007 0:3dac1f1bc9e0 39 char szPrevFolder[256];
beaglescout007 0:3dac1f1bc9e0 40 char szRomFilename[33];
beaglescout007 0:3dac1f1bc9e0 41 char szRomPath[256];
beaglescout007 0:3dac1f1bc9e0 42
beaglescout007 0:3dac1f1bc9e0 43 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 44 /* Get file extension */
beaglescout007 0:3dac1f1bc9e0 45 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 46 char *get_ext(char *filename)
beaglescout007 0:3dac1f1bc9e0 47 {
beaglescout007 0:3dac1f1bc9e0 48 int i;
beaglescout007 0:3dac1f1bc9e0 49 for (i = strlen(filename) - 1; i >= 0; --i) {
beaglescout007 0:3dac1f1bc9e0 50 if (filename[i] == '.') {
beaglescout007 0:3dac1f1bc9e0 51 return &filename[i + 1];
beaglescout007 0:3dac1f1bc9e0 52 }
beaglescout007 0:3dac1f1bc9e0 53 }
beaglescout007 0:3dac1f1bc9e0 54 return NULL;
beaglescout007 0:3dac1f1bc9e0 55 }
beaglescout007 0:3dac1f1bc9e0 56
beaglescout007 0:3dac1f1bc9e0 57 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 58 /* Get file path */
beaglescout007 0:3dac1f1bc9e0 59 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 60 char *get_filepath(char *path, char *filename)
beaglescout007 0:3dac1f1bc9e0 61 {
beaglescout007 0:3dac1f1bc9e0 62 static char filepath[256];
beaglescout007 0:3dac1f1bc9e0 63
beaglescout007 0:3dac1f1bc9e0 64 if (strncmp(path, "/sd", 3) != 0)
beaglescout007 0:3dac1f1bc9e0 65 {
beaglescout007 0:3dac1f1bc9e0 66 filepath[0] = 0;
beaglescout007 0:3dac1f1bc9e0 67 return filepath;
beaglescout007 0:3dac1f1bc9e0 68 }
beaglescout007 0:3dac1f1bc9e0 69
beaglescout007 0:3dac1f1bc9e0 70 int len = strlen(path);
beaglescout007 0:3dac1f1bc9e0 71 if (len < 4) {
beaglescout007 0:3dac1f1bc9e0 72 strcpy(filepath, filename);
beaglescout007 0:3dac1f1bc9e0 73 } else {
beaglescout007 0:3dac1f1bc9e0 74 sprintf(filepath, "%s/%s", &path[4], filename);
beaglescout007 0:3dac1f1bc9e0 75 }
beaglescout007 0:3dac1f1bc9e0 76
beaglescout007 0:3dac1f1bc9e0 77 return filepath;
beaglescout007 0:3dac1f1bc9e0 78 }
beaglescout007 0:3dac1f1bc9e0 79
beaglescout007 0:3dac1f1bc9e0 80 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 81 /* Get file list in the folder */
beaglescout007 0:3dac1f1bc9e0 82 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 83 int get_filelist(char *path)
beaglescout007 0:3dac1f1bc9e0 84 {
beaglescout007 0:3dac1f1bc9e0 85 DIR *dir = opendir(path);
beaglescout007 0:3dac1f1bc9e0 86 if ( dir == NULL ) {
beaglescout007 0:3dac1f1bc9e0 87 return 0;
beaglescout007 0:3dac1f1bc9e0 88 }
beaglescout007 0:3dac1f1bc9e0 89
beaglescout007 0:3dac1f1bc9e0 90 dirent *entry;
beaglescout007 0:3dac1f1bc9e0 91 FILINFO fi;
beaglescout007 0:3dac1f1bc9e0 92 fi.lfname = NULL;
beaglescout007 0:3dac1f1bc9e0 93 fi.lfsize = 0;
beaglescout007 0:3dac1f1bc9e0 94 int i = 0;
beaglescout007 0:3dac1f1bc9e0 95
beaglescout007 0:3dac1f1bc9e0 96 // not root
beaglescout007 0:3dac1f1bc9e0 97 if (strcmp(path, "/sd") != 0) {
beaglescout007 0:3dac1f1bc9e0 98 strcpy(flist[i].filename, "..");
beaglescout007 0:3dac1f1bc9e0 99 flist[i].isDir = true;
beaglescout007 0:3dac1f1bc9e0 100 i++;
beaglescout007 0:3dac1f1bc9e0 101 }
beaglescout007 0:3dac1f1bc9e0 102
beaglescout007 0:3dac1f1bc9e0 103 // folder
beaglescout007 0:3dac1f1bc9e0 104 while ((entry = readdir(dir)) != NULL && i < FOLDER_FILE_MAX) {
beaglescout007 0:3dac1f1bc9e0 105 if (f_stat(get_filepath(path, entry->d_name), &fi) == FR_OK) {
beaglescout007 0:3dac1f1bc9e0 106 int len = strlen(entry->d_name);
beaglescout007 0:3dac1f1bc9e0 107 len = len > 32 ? 32 : len;
beaglescout007 0:3dac1f1bc9e0 108 if (entry->d_name[0] == '.') continue;
beaglescout007 0:3dac1f1bc9e0 109
beaglescout007 0:3dac1f1bc9e0 110 memcpy(flist[i].filename, entry->d_name, len);
beaglescout007 0:3dac1f1bc9e0 111 flist[i].filename[len] = 0;
beaglescout007 0:3dac1f1bc9e0 112 flist[i].isDir = fi.fattrib & AM_DIR;
beaglescout007 0:3dac1f1bc9e0 113 flist[i].size = fi.fsize;
beaglescout007 0:3dac1f1bc9e0 114 ++i;
beaglescout007 0:3dac1f1bc9e0 115 }
beaglescout007 0:3dac1f1bc9e0 116 }
beaglescout007 0:3dac1f1bc9e0 117
beaglescout007 0:3dac1f1bc9e0 118 closedir(dir);
beaglescout007 0:3dac1f1bc9e0 119
beaglescout007 0:3dac1f1bc9e0 120 return i;
beaglescout007 0:3dac1f1bc9e0 121 }
beaglescout007 0:3dac1f1bc9e0 122
beaglescout007 0:3dac1f1bc9e0 123
beaglescout007 0:3dac1f1bc9e0 124 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 125 /* Get file information string */
beaglescout007 0:3dac1f1bc9e0 126 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 127 char* filedata(int idx)
beaglescout007 0:3dac1f1bc9e0 128 {
beaglescout007 0:3dac1f1bc9e0 129 static char disptext[41];
beaglescout007 0:3dac1f1bc9e0 130
beaglescout007 0:3dac1f1bc9e0 131 if (flist[idx].isDir) {
beaglescout007 0:3dac1f1bc9e0 132 sprintf(disptext, "%-32s <DIR>", flist[idx].filename);
beaglescout007 0:3dac1f1bc9e0 133 } else {
beaglescout007 0:3dac1f1bc9e0 134 sprintf(disptext, "%-32s %6d", flist[idx].filename, flist[idx].size);
beaglescout007 0:3dac1f1bc9e0 135 }
beaglescout007 0:3dac1f1bc9e0 136
beaglescout007 0:3dac1f1bc9e0 137 return disptext;
beaglescout007 0:3dac1f1bc9e0 138 }
beaglescout007 0:3dac1f1bc9e0 139
beaglescout007 0:3dac1f1bc9e0 140 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 141 /* Draw file list */
beaglescout007 0:3dac1f1bc9e0 142 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 143 void draw_list()
beaglescout007 0:3dac1f1bc9e0 144 {
beaglescout007 0:3dac1f1bc9e0 145 int i,y;
beaglescout007 0:3dac1f1bc9e0 146
beaglescout007 0:3dac1f1bc9e0 147 for (y = 0, i = DispTop; y < LIST_ROWS && i < FileCount; ++y, ++i) {
beaglescout007 0:3dac1f1bc9e0 148 tft_text( LIST_LEFT, LIST_TOP + y * 8, filedata(i), TFT_WHITE, TFT_BLACK );
beaglescout007 0:3dac1f1bc9e0 149 }
beaglescout007 0:3dac1f1bc9e0 150
beaglescout007 0:3dac1f1bc9e0 151 if (y < LIST_ROWS) {
beaglescout007 0:3dac1f1bc9e0 152 tft_boxfill( 0, LIST_TOP + y * 8, 319, LIST_TOP + LIST_ROWS * 8 - 1, TFT_BLACK);
beaglescout007 0:3dac1f1bc9e0 153 }
beaglescout007 0:3dac1f1bc9e0 154 }
beaglescout007 0:3dac1f1bc9e0 155
beaglescout007 0:3dac1f1bc9e0 156 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 157 /* Draw cursor */
beaglescout007 0:3dac1f1bc9e0 158 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 159 void draw_cursor(bool clear = false)
beaglescout007 0:3dac1f1bc9e0 160 {
beaglescout007 0:3dac1f1bc9e0 161 int y = SelIdx - DispTop;
beaglescout007 0:3dac1f1bc9e0 162 if (clear) {
beaglescout007 0:3dac1f1bc9e0 163 tft_box( LIST_LEFT - 1, LIST_TOP + y * 8 - 1, LIST_LEFT + 39 * 8, LIST_TOP + y * 8 + 7, TFT_BLACK);
beaglescout007 0:3dac1f1bc9e0 164 tft_text( LIST_LEFT, LIST_TOP + y * 8, filedata(SelIdx), TFT_WHITE, TFT_BLACK );
beaglescout007 0:3dac1f1bc9e0 165 } else {
beaglescout007 0:3dac1f1bc9e0 166 tft_box( LIST_LEFT - 1, LIST_TOP + y * 8 - 1, LIST_LEFT + 39 * 8, LIST_TOP + y * 8 + 7, TFT_YELLOW);
beaglescout007 0:3dac1f1bc9e0 167 tft_text( LIST_LEFT, LIST_TOP + y * 8, filedata(SelIdx), TFT_BLACK, TFT_YELLOW );
beaglescout007 0:3dac1f1bc9e0 168 }
beaglescout007 0:3dac1f1bc9e0 169 }
beaglescout007 0:3dac1f1bc9e0 170
beaglescout007 0:3dac1f1bc9e0 171 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 172 /* Draw back ground */
beaglescout007 0:3dac1f1bc9e0 173 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 174 void draw_frame()
beaglescout007 0:3dac1f1bc9e0 175 {
beaglescout007 0:3dac1f1bc9e0 176 tft_boxfill( 0, 0, 319, 31, LOGO_BACKCOLOR);
beaglescout007 0:3dac1f1bc9e0 177 tft_boxfill(0, 32, 319, 223, TFT_BLACK);
beaglescout007 0:3dac1f1bc9e0 178 tft_boxfill( 0, 224, 319, 239, LOGO_BACKCOLOR);
beaglescout007 0:3dac1f1bc9e0 179
beaglescout007 0:3dac1f1bc9e0 180 draw_bmp_4bpp(pNesX_logo, 8, 6);
beaglescout007 0:3dac1f1bc9e0 181 tft_text( 200, 225, "L2:Emu<->Menu", TFT_BLACK, LOGO_BACKCOLOR );
beaglescout007 0:3dac1f1bc9e0 182 tft_text( 200, 233, "R1+R2:Reset", TFT_BLACK, LOGO_BACKCOLOR );
beaglescout007 0:3dac1f1bc9e0 183 draw_bmp_4bpp(Racoon_logo, 0, 224);
beaglescout007 0:3dac1f1bc9e0 184 }
beaglescout007 0:3dac1f1bc9e0 185
beaglescout007 0:3dac1f1bc9e0 186 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 187 /* Dialog window */
beaglescout007 0:3dac1f1bc9e0 188 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 189 void dialog(char *msg)
beaglescout007 0:3dac1f1bc9e0 190 {
beaglescout007 0:3dac1f1bc9e0 191 if (msg)
beaglescout007 0:3dac1f1bc9e0 192 {
beaglescout007 0:3dac1f1bc9e0 193 tft_boxfill(0, 100, 319, 139, TFT_NAVY);
beaglescout007 0:3dac1f1bc9e0 194 int len = strlen(msg);
beaglescout007 0:3dac1f1bc9e0 195 len = len > 38 ? 38 : len;
beaglescout007 0:3dac1f1bc9e0 196 msg[len] = 0;
beaglescout007 0:3dac1f1bc9e0 197 int x = (40 - len) * 4;
beaglescout007 0:3dac1f1bc9e0 198 tft_text(x, 116, msg, TFT_WHITE, TFT_NAVY);
beaglescout007 0:3dac1f1bc9e0 199 }
beaglescout007 0:3dac1f1bc9e0 200 else
beaglescout007 0:3dac1f1bc9e0 201 {
beaglescout007 0:3dac1f1bc9e0 202 tft_boxfill(0, 100, 319, 139, TFT_BLACK);
beaglescout007 0:3dac1f1bc9e0 203 }
beaglescout007 0:3dac1f1bc9e0 204 }
beaglescout007 0:3dac1f1bc9e0 205
beaglescout007 0:3dac1f1bc9e0 206 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 207 /* Rom selection */
beaglescout007 0:3dac1f1bc9e0 208 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 209 // return code:
beaglescout007 0:3dac1f1bc9e0 210 // 0 : File selected
beaglescout007 0:3dac1f1bc9e0 211 // 1 : Return to Emu
beaglescout007 0:3dac1f1bc9e0 212 // 2 : Reset
beaglescout007 0:3dac1f1bc9e0 213 // -1: Error
beaglescout007 0:3dac1f1bc9e0 214 int pNesX_Filer()
beaglescout007 0:3dac1f1bc9e0 215 {
beaglescout007 0:3dac1f1bc9e0 216 DWORD dwPad1, dwPad2, dwSystem;
beaglescout007 0:3dac1f1bc9e0 217 DWORD prev_dwPad1 = 0;
beaglescout007 0:3dac1f1bc9e0 218
beaglescout007 0:3dac1f1bc9e0 219 bool loadFolder;
beaglescout007 0:3dac1f1bc9e0 220 int keyrepeat = 1;
beaglescout007 0:3dac1f1bc9e0 221
beaglescout007 0:3dac1f1bc9e0 222 // Draw back ground
beaglescout007 0:3dac1f1bc9e0 223 draw_frame();
beaglescout007 0:3dac1f1bc9e0 224
beaglescout007 0:3dac1f1bc9e0 225 // init
beaglescout007 0:3dac1f1bc9e0 226 flist = (LISTITEM *)malloc(sizeof(LISTITEM) * FOLDER_FILE_MAX);
beaglescout007 0:3dac1f1bc9e0 227 if (flist == NULL) {
beaglescout007 0:3dac1f1bc9e0 228 return -1;
beaglescout007 0:3dac1f1bc9e0 229 }
beaglescout007 0:3dac1f1bc9e0 230
beaglescout007 0:3dac1f1bc9e0 231 loadFolder = true;
beaglescout007 0:3dac1f1bc9e0 232 int ret;
beaglescout007 0:3dac1f1bc9e0 233
beaglescout007 0:3dac1f1bc9e0 234 while(1) {
beaglescout007 0:3dac1f1bc9e0 235 if (loadFolder) {
beaglescout007 0:3dac1f1bc9e0 236 // Drawing of the files in the folder
beaglescout007 0:3dac1f1bc9e0 237 FileCount = get_filelist(szRomFolder);
beaglescout007 0:3dac1f1bc9e0 238
beaglescout007 0:3dac1f1bc9e0 239 if (FileCount > 0) {
beaglescout007 0:3dac1f1bc9e0 240 if (strcmp(szRomFolder, szPrevFolder) != 0)
beaglescout007 0:3dac1f1bc9e0 241 {
beaglescout007 0:3dac1f1bc9e0 242 DispTop = 0;
beaglescout007 0:3dac1f1bc9e0 243 SelIdx = 0;
beaglescout007 0:3dac1f1bc9e0 244 strcpy( szPrevFolder, szRomFolder);
beaglescout007 0:3dac1f1bc9e0 245 }
beaglescout007 0:3dac1f1bc9e0 246 draw_list();
beaglescout007 0:3dac1f1bc9e0 247 draw_cursor();
beaglescout007 0:3dac1f1bc9e0 248 }
beaglescout007 0:3dac1f1bc9e0 249 loadFolder = false;
beaglescout007 0:3dac1f1bc9e0 250 }
beaglescout007 0:3dac1f1bc9e0 251
beaglescout007 0:3dac1f1bc9e0 252 pNesX_PadState( &dwPad1, &dwPad2, &dwSystem );
beaglescout007 0:3dac1f1bc9e0 253
beaglescout007 0:3dac1f1bc9e0 254 if (dwPad1 != prev_dwPad1) {
beaglescout007 0:3dac1f1bc9e0 255 keyrepeat = 0;
beaglescout007 0:3dac1f1bc9e0 256 }
beaglescout007 0:3dac1f1bc9e0 257
beaglescout007 0:3dac1f1bc9e0 258 if (keyrepeat == 0 || keyrepeat >= 10) {
beaglescout007 0:3dac1f1bc9e0 259 // Down
beaglescout007 0:3dac1f1bc9e0 260 if (dwPad1 & 0x20) {
beaglescout007 0:3dac1f1bc9e0 261 if (SelIdx < FileCount - 1) {
beaglescout007 0:3dac1f1bc9e0 262 // clear cursor
beaglescout007 0:3dac1f1bc9e0 263 draw_cursor(true);
beaglescout007 0:3dac1f1bc9e0 264
beaglescout007 0:3dac1f1bc9e0 265 if (SelIdx - DispTop == LIST_ROWS - 1) {
beaglescout007 0:3dac1f1bc9e0 266 DispTop++;
beaglescout007 0:3dac1f1bc9e0 267 draw_list();
beaglescout007 0:3dac1f1bc9e0 268 }
beaglescout007 0:3dac1f1bc9e0 269
beaglescout007 0:3dac1f1bc9e0 270 // draw new cursor
beaglescout007 0:3dac1f1bc9e0 271 SelIdx++;
beaglescout007 0:3dac1f1bc9e0 272 draw_cursor();
beaglescout007 0:3dac1f1bc9e0 273 }
beaglescout007 0:3dac1f1bc9e0 274 }
beaglescout007 0:3dac1f1bc9e0 275
beaglescout007 0:3dac1f1bc9e0 276 // Up
beaglescout007 0:3dac1f1bc9e0 277 if (dwPad1 & 0x10) {
beaglescout007 0:3dac1f1bc9e0 278 if (SelIdx > 0) {
beaglescout007 0:3dac1f1bc9e0 279 // clear cursor
beaglescout007 0:3dac1f1bc9e0 280 draw_cursor(true);
beaglescout007 0:3dac1f1bc9e0 281
beaglescout007 0:3dac1f1bc9e0 282 if (SelIdx - DispTop == 0) {
beaglescout007 0:3dac1f1bc9e0 283 DispTop--;
beaglescout007 0:3dac1f1bc9e0 284 draw_list();
beaglescout007 0:3dac1f1bc9e0 285 }
beaglescout007 0:3dac1f1bc9e0 286
beaglescout007 0:3dac1f1bc9e0 287 // draw new cursor
beaglescout007 0:3dac1f1bc9e0 288 SelIdx--;
beaglescout007 0:3dac1f1bc9e0 289 draw_cursor();
beaglescout007 0:3dac1f1bc9e0 290 }
beaglescout007 0:3dac1f1bc9e0 291 }
beaglescout007 0:3dac1f1bc9e0 292
beaglescout007 0:3dac1f1bc9e0 293 // Select
beaglescout007 0:3dac1f1bc9e0 294 if (dwPad1 & 0x01) {
beaglescout007 0:3dac1f1bc9e0 295 // clear cursor
beaglescout007 0:3dac1f1bc9e0 296 draw_cursor(true);
beaglescout007 0:3dac1f1bc9e0 297
beaglescout007 0:3dac1f1bc9e0 298 if (flist[SelIdx].isDir) {
beaglescout007 0:3dac1f1bc9e0 299 // folder
beaglescout007 0:3dac1f1bc9e0 300 if (strcmp(flist[SelIdx].filename, "..") != 0) {
beaglescout007 0:3dac1f1bc9e0 301 sprintf(szRomFolder, "%s/%s", szRomFolder, flist[SelIdx].filename);
beaglescout007 0:3dac1f1bc9e0 302 } else {
beaglescout007 0:3dac1f1bc9e0 303 // upper folder
beaglescout007 0:3dac1f1bc9e0 304 char *upper = strrchr(szRomFolder, '/');
beaglescout007 0:3dac1f1bc9e0 305 if (upper) {
beaglescout007 0:3dac1f1bc9e0 306 *upper = 0;
beaglescout007 0:3dac1f1bc9e0 307 }
beaglescout007 0:3dac1f1bc9e0 308 }
beaglescout007 0:3dac1f1bc9e0 309
beaglescout007 0:3dac1f1bc9e0 310 loadFolder = true;
beaglescout007 0:3dac1f1bc9e0 311 } else {
beaglescout007 0:3dac1f1bc9e0 312 char *ext = get_ext(flist[SelIdx].filename);
beaglescout007 0:3dac1f1bc9e0 313 if (ext != NULL && strcasecmp(ext, "nes") == 0)
beaglescout007 0:3dac1f1bc9e0 314 {
beaglescout007 0:3dac1f1bc9e0 315 strcpy(szRomFilename, flist[SelIdx].filename);
beaglescout007 0:3dac1f1bc9e0 316
beaglescout007 0:3dac1f1bc9e0 317
beaglescout007 0:3dac1f1bc9e0 318 strcpy(szRomPath, get_filepath(szRomFolder, szRomFilename));
beaglescout007 0:3dac1f1bc9e0 319
beaglescout007 0:3dac1f1bc9e0 320 ret = 0;
beaglescout007 0:3dac1f1bc9e0 321 break;
beaglescout007 0:3dac1f1bc9e0 322 }
beaglescout007 0:3dac1f1bc9e0 323 else
beaglescout007 0:3dac1f1bc9e0 324 {
beaglescout007 0:3dac1f1bc9e0 325 dialog("not a rom file!!");
beaglescout007 0:3dac1f1bc9e0 326 wait(1);
beaglescout007 0:3dac1f1bc9e0 327 dialog(NULL);
beaglescout007 0:3dac1f1bc9e0 328 draw_list();
beaglescout007 0:3dac1f1bc9e0 329 draw_cursor();
beaglescout007 0:3dac1f1bc9e0 330 }
beaglescout007 0:3dac1f1bc9e0 331 }
beaglescout007 0:3dac1f1bc9e0 332 }
beaglescout007 0:3dac1f1bc9e0 333
beaglescout007 0:3dac1f1bc9e0 334 // Return to Emu
beaglescout007 0:3dac1f1bc9e0 335 if (dwSystem & 0x01) {
beaglescout007 0:3dac1f1bc9e0 336 if ( szRomFilename[0] != 0 ) {
beaglescout007 0:3dac1f1bc9e0 337 do {
beaglescout007 0:3dac1f1bc9e0 338 wait(0.08);
beaglescout007 0:3dac1f1bc9e0 339 pNesX_PadState( &dwPad1, &dwPad2, &dwSystem );
beaglescout007 0:3dac1f1bc9e0 340
beaglescout007 0:3dac1f1bc9e0 341 } while (dwSystem & 0x01);
beaglescout007 0:3dac1f1bc9e0 342
beaglescout007 0:3dac1f1bc9e0 343 ret = 1;
beaglescout007 0:3dac1f1bc9e0 344 break;
beaglescout007 0:3dac1f1bc9e0 345 }
beaglescout007 0:3dac1f1bc9e0 346 }
beaglescout007 0:3dac1f1bc9e0 347
beaglescout007 0:3dac1f1bc9e0 348 // Reset
beaglescout007 0:3dac1f1bc9e0 349 if (dwSystem & 0x02) {
beaglescout007 0:3dac1f1bc9e0 350 if ( szRomFilename[0] != 0 ) {
beaglescout007 0:3dac1f1bc9e0 351 do {
beaglescout007 0:3dac1f1bc9e0 352 wait(0.08);
beaglescout007 0:3dac1f1bc9e0 353 pNesX_PadState( &dwPad1, &dwPad2, &dwSystem );
beaglescout007 0:3dac1f1bc9e0 354 } while (dwSystem & 0x02);
beaglescout007 0:3dac1f1bc9e0 355
beaglescout007 0:3dac1f1bc9e0 356 ret = 2;
beaglescout007 0:3dac1f1bc9e0 357 break;
beaglescout007 0:3dac1f1bc9e0 358 }
beaglescout007 0:3dac1f1bc9e0 359 }
beaglescout007 0:3dac1f1bc9e0 360 }
beaglescout007 0:3dac1f1bc9e0 361
beaglescout007 0:3dac1f1bc9e0 362 keyrepeat++;
beaglescout007 0:3dac1f1bc9e0 363
beaglescout007 0:3dac1f1bc9e0 364 prev_dwPad1 = dwPad1;
beaglescout007 0:3dac1f1bc9e0 365
beaglescout007 0:3dac1f1bc9e0 366 wait(0.08);
beaglescout007 0:3dac1f1bc9e0 367 }
beaglescout007 0:3dac1f1bc9e0 368
beaglescout007 0:3dac1f1bc9e0 369 // release memory
beaglescout007 0:3dac1f1bc9e0 370 free(flist);
beaglescout007 0:3dac1f1bc9e0 371
beaglescout007 0:3dac1f1bc9e0 372 return ret;
beaglescout007 0:3dac1f1bc9e0 373 }
beaglescout007 0:3dac1f1bc9e0 374