test
Dependencies: SDFileSystem mbed-dev
Fork of Nucleo_Ex06_EMU by
pNesX_System_Nucleo.cpp@4:53ef91c87d74, 2017-05-27 (annotated)
- Committer:
- charliex
- Date:
- Sat May 27 02:17:37 2017 +0000
- Revision:
- 4:53ef91c87d74
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charliex | 4:53ef91c87d74 | 1 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 2 | /* */ |
charliex | 4:53ef91c87d74 | 3 | /* pNesX_System_Nucleo.cpp : The function which depends on a system */ |
charliex | 4:53ef91c87d74 | 4 | /* (for Nucleo F446RE) */ |
charliex | 4:53ef91c87d74 | 5 | /* */ |
charliex | 4:53ef91c87d74 | 6 | /* 2016/1/20 Racoon */ |
charliex | 4:53ef91c87d74 | 7 | /* */ |
charliex | 4:53ef91c87d74 | 8 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 9 | |
charliex | 4:53ef91c87d74 | 10 | #define USE_CAN (1) |
charliex | 4:53ef91c87d74 | 11 | |
charliex | 4:53ef91c87d74 | 12 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 13 | /* Include files */ |
charliex | 4:53ef91c87d74 | 14 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 15 | |
charliex | 4:53ef91c87d74 | 16 | #include "mbed.h" |
charliex | 4:53ef91c87d74 | 17 | #include "SDFileSystem.h" |
charliex | 4:53ef91c87d74 | 18 | #include "tft.h" |
charliex | 4:53ef91c87d74 | 19 | //#include "SWO.h" |
charliex | 4:53ef91c87d74 | 20 | |
charliex | 4:53ef91c87d74 | 21 | // added in for SD check |
charliex | 4:53ef91c87d74 | 22 | int get_filelist ( char *path ); |
charliex | 4:53ef91c87d74 | 23 | |
charliex | 4:53ef91c87d74 | 24 | // logo ptrs |
charliex | 4:53ef91c87d74 | 25 | |
charliex | 4:53ef91c87d74 | 26 | extern const unsigned char l1_Logo[]; |
charliex | 4:53ef91c87d74 | 27 | extern const unsigned char asg_logo[]; |
charliex | 4:53ef91c87d74 | 28 | extern const unsigned char adaptable_conn_logo[]; |
charliex | 4:53ef91c87d74 | 29 | extern const unsigned char hacker_stickers_logo[]; |
charliex | 4:53ef91c87d74 | 30 | extern const unsigned char nostarch_logo[]; |
charliex | 4:53ef91c87d74 | 31 | extern const unsigned char nslmini[]; |
charliex | 4:53ef91c87d74 | 32 | extern const unsigned char PRO_LG_K_500x200_1CRevGrey_noDSCR[]; |
charliex | 4:53ef91c87d74 | 33 | extern const unsigned char securitysnobs[]; |
charliex | 4:53ef91c87d74 | 34 | extern const unsigned char supplyFrame[]; |
charliex | 4:53ef91c87d74 | 35 | extern const unsigned char WallOfSheep_logo_200px[]; |
charliex | 4:53ef91c87d74 | 36 | extern const unsigned char tinder_logo[]; |
charliex | 4:53ef91c87d74 | 37 | |
charliex | 4:53ef91c87d74 | 38 | // ID that game pad data is sent on |
charliex | 4:53ef91c87d74 | 39 | #define CAN_SEND_ID (0x7e1) |
charliex | 4:53ef91c87d74 | 40 | |
charliex | 4:53ef91c87d74 | 41 | // ID that game pad data is received from |
charliex | 4:53ef91c87d74 | 42 | #define CAN_RECV_ID (0x7e0) |
charliex | 4:53ef91c87d74 | 43 | |
charliex | 4:53ef91c87d74 | 44 | // Memory interface |
charliex | 4:53ef91c87d74 | 45 | enum { |
charliex | 4:53ef91c87d74 | 46 | CAN_READ_BYTE = CAN_SEND_ID + 1, |
charliex | 4:53ef91c87d74 | 47 | CAN_READ_WORD, |
charliex | 4:53ef91c87d74 | 48 | CAN_READ_DWORD, |
charliex | 4:53ef91c87d74 | 49 | |
charliex | 4:53ef91c87d74 | 50 | CAN_WRITE_BYTE, |
charliex | 4:53ef91c87d74 | 51 | CAN_WRITE_WORD, |
charliex | 4:53ef91c87d74 | 52 | CAN_WRITE_DWORD |
charliex | 4:53ef91c87d74 | 53 | }; |
charliex | 4:53ef91c87d74 | 54 | |
charliex | 4:53ef91c87d74 | 55 | #ifdef USE_CAN |
charliex | 4:53ef91c87d74 | 56 | |
charliex | 4:53ef91c87d74 | 57 | CAN can1 ( PB_8, PB_9 ); |
charliex | 4:53ef91c87d74 | 58 | |
charliex | 4:53ef91c87d74 | 59 | //not usng second CAN yet., |
charliex | 4:53ef91c87d74 | 60 | //CAN can2(PB_5, PB_6); |
charliex | 4:53ef91c87d74 | 61 | |
charliex | 4:53ef91c87d74 | 62 | #endif |
charliex | 4:53ef91c87d74 | 63 | |
charliex | 4:53ef91c87d74 | 64 | //#define ORIGINAL_GAMEPAD |
charliex | 4:53ef91c87d74 | 65 | //#define PS_GAMEPAD |
charliex | 4:53ef91c87d74 | 66 | #define NES_GAMEPAD |
charliex | 4:53ef91c87d74 | 67 | |
charliex | 4:53ef91c87d74 | 68 | #if !defined(PS_GAMEPAD) |
charliex | 4:53ef91c87d74 | 69 | #include "USBHostGamepad.h" |
charliex | 4:53ef91c87d74 | 70 | USBHostGamepad *pad; |
charliex | 4:53ef91c87d74 | 71 | #else |
charliex | 4:53ef91c87d74 | 72 | #include "pspad.h" |
charliex | 4:53ef91c87d74 | 73 | #endif |
charliex | 4:53ef91c87d74 | 74 | |
charliex | 4:53ef91c87d74 | 75 | #include "pNesX.h" |
charliex | 4:53ef91c87d74 | 76 | #include "pNesX_System.h" |
charliex | 4:53ef91c87d74 | 77 | |
charliex | 4:53ef91c87d74 | 78 | extern int pNesX_Filer(); |
charliex | 4:53ef91c87d74 | 79 | extern void ApuMute ( bool mute ); |
charliex | 4:53ef91c87d74 | 80 | |
charliex | 4:53ef91c87d74 | 81 | // temporary store for joystick value |
charliex | 4:53ef91c87d74 | 82 | static DWORD canval2; |
charliex | 4:53ef91c87d74 | 83 | |
charliex | 4:53ef91c87d74 | 84 | #ifdef USE_CAN |
charliex | 4:53ef91c87d74 | 85 | // if there is a CAN msg available to read from |
charliex | 4:53ef91c87d74 | 86 | static bool msgAvailable = false; |
charliex | 4:53ef91c87d74 | 87 | #endif |
charliex | 4:53ef91c87d74 | 88 | |
charliex | 4:53ef91c87d74 | 89 | SDFileSystem *sd; //(PB_15, PB_14, PB_13, PA_9, "sd", NC, SDFileSystem::SWITCH_NONE, 20000000); |
charliex | 4:53ef91c87d74 | 90 | |
charliex | 4:53ef91c87d74 | 91 | DigitalIn SW1 ( PC_13 ); |
charliex | 4:53ef91c87d74 | 92 | DigitalIn SW2 ( PC_14 ); |
charliex | 4:53ef91c87d74 | 93 | |
charliex | 4:53ef91c87d74 | 94 | DigitalOut bLED1 ( PB_12 ) ; |
charliex | 4:53ef91c87d74 | 95 | DigitalOut bLED2 ( PB_13 ) ; |
charliex | 4:53ef91c87d74 | 96 | |
charliex | 4:53ef91c87d74 | 97 | extern WORD LineData[][256]; |
charliex | 4:53ef91c87d74 | 98 | extern WORD *pDrawData; |
charliex | 4:53ef91c87d74 | 99 | |
charliex | 4:53ef91c87d74 | 100 | //#define SHOW_FPS |
charliex | 4:53ef91c87d74 | 101 | |
charliex | 4:53ef91c87d74 | 102 | #if defined(SHOW_FPS) |
charliex | 4:53ef91c87d74 | 103 | Timer timer; |
charliex | 4:53ef91c87d74 | 104 | int fps = 0; |
charliex | 4:53ef91c87d74 | 105 | int dmawait; |
charliex | 4:53ef91c87d74 | 106 | #endif |
charliex | 4:53ef91c87d74 | 107 | |
charliex | 4:53ef91c87d74 | 108 | //SWO_Channel swo; |
charliex | 4:53ef91c87d74 | 109 | |
charliex | 4:53ef91c87d74 | 110 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 111 | /* ROM image file information */ |
charliex | 4:53ef91c87d74 | 112 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 113 | |
charliex | 4:53ef91c87d74 | 114 | extern char szRomFolder[]; |
charliex | 4:53ef91c87d74 | 115 | extern char szRomFilename[]; |
charliex | 4:53ef91c87d74 | 116 | extern char szRomPath[]; |
charliex | 4:53ef91c87d74 | 117 | |
charliex | 4:53ef91c87d74 | 118 | char szRomName[ 256 ]; |
charliex | 4:53ef91c87d74 | 119 | int nSRAM_SaveFlag; |
charliex | 4:53ef91c87d74 | 120 | |
charliex | 4:53ef91c87d74 | 121 | // Palette data |
charliex | 4:53ef91c87d74 | 122 | const WORD NesPalette[ 64 ] = { |
charliex | 4:53ef91c87d74 | 123 | 0xef7b, 0x1f00, 0x1700, 0x5741, 0x1090, 0x04a8, 0x80a8, 0xa088, 0x8051, 0xc003, 0x4003, 0xc002, 0x0b02, 0x0000, 0x0000, 0x0000, |
charliex | 4:53ef91c87d74 | 124 | 0xf7bd, 0xdf03, 0xdf02, 0x3f6a, 0x19d8, 0x0be0, 0xc0f9, 0xe2e2, 0xe0ab, 0xc005, 0x4005, 0x4805, 0x5104, 0x0000, 0x0000, 0x0000, |
charliex | 4:53ef91c87d74 | 125 | 0xdfff, 0xff3d, 0x5f6c, 0xdf9b, 0xdffb, 0xd3fa, 0xcbfb, 0x08fd, 0xc0fd, 0xc3bf, 0xca5e, 0xd35f, 0x5b07, 0xcf7b, 0x0000, 0x0000, |
charliex | 4:53ef91c87d74 | 126 | 0xffff, 0x3fa7, 0xdfbd, 0xdfdd, 0xdffd, 0x38fd, 0x96f6, 0x15ff, 0xcffe, 0xcfdf, 0xd7bf, 0xdbbf, 0xff07, 0xdffe, 0x0000, 0x0000 |
charliex | 4:53ef91c87d74 | 127 | }; |
charliex | 4:53ef91c87d74 | 128 | |
charliex | 4:53ef91c87d74 | 129 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 130 | /* Function prototypes */ |
charliex | 4:53ef91c87d74 | 131 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 132 | |
charliex | 4:53ef91c87d74 | 133 | int LoadSRAM(); |
charliex | 4:53ef91c87d74 | 134 | int SaveSRAM(); |
charliex | 4:53ef91c87d74 | 135 | |
charliex | 4:53ef91c87d74 | 136 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 137 | /* */ |
charliex | 4:53ef91c87d74 | 138 | /* LoadSRAM() : Load a SRAM */ |
charliex | 4:53ef91c87d74 | 139 | /* */ |
charliex | 4:53ef91c87d74 | 140 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 141 | int LoadSRAM() |
charliex | 4:53ef91c87d74 | 142 | { |
charliex | 4:53ef91c87d74 | 143 | /* |
charliex | 4:53ef91c87d74 | 144 | * Load a SRAM |
charliex | 4:53ef91c87d74 | 145 | * |
charliex | 4:53ef91c87d74 | 146 | * Return values |
charliex | 4:53ef91c87d74 | 147 | * 0 : Normally |
charliex | 4:53ef91c87d74 | 148 | * -1 : SRAM data couldn't be read |
charliex | 4:53ef91c87d74 | 149 | */ |
charliex | 4:53ef91c87d74 | 150 | |
charliex | 4:53ef91c87d74 | 151 | return 0; |
charliex | 4:53ef91c87d74 | 152 | } |
charliex | 4:53ef91c87d74 | 153 | |
charliex | 4:53ef91c87d74 | 154 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 155 | /* */ |
charliex | 4:53ef91c87d74 | 156 | /* SaveSRAM() : Save a SRAM */ |
charliex | 4:53ef91c87d74 | 157 | /* */ |
charliex | 4:53ef91c87d74 | 158 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 159 | int SaveSRAM() |
charliex | 4:53ef91c87d74 | 160 | { |
charliex | 4:53ef91c87d74 | 161 | /* |
charliex | 4:53ef91c87d74 | 162 | * Save a SRAM |
charliex | 4:53ef91c87d74 | 163 | * |
charliex | 4:53ef91c87d74 | 164 | * Return values |
charliex | 4:53ef91c87d74 | 165 | * 0 : Normally |
charliex | 4:53ef91c87d74 | 166 | * -1 : SRAM data couldn't be written |
charliex | 4:53ef91c87d74 | 167 | */ |
charliex | 4:53ef91c87d74 | 168 | |
charliex | 4:53ef91c87d74 | 169 | |
charliex | 4:53ef91c87d74 | 170 | // Successful |
charliex | 4:53ef91c87d74 | 171 | return 0; |
charliex | 4:53ef91c87d74 | 172 | } |
charliex | 4:53ef91c87d74 | 173 | |
charliex | 4:53ef91c87d74 | 174 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 175 | /* */ |
charliex | 4:53ef91c87d74 | 176 | /* pNesX_Menu() : Menu screen */ |
charliex | 4:53ef91c87d74 | 177 | /* */ |
charliex | 4:53ef91c87d74 | 178 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 179 | int pNesX_Menu() |
charliex | 4:53ef91c87d74 | 180 | { |
charliex | 4:53ef91c87d74 | 181 | /* |
charliex | 4:53ef91c87d74 | 182 | * Menu screen |
charliex | 4:53ef91c87d74 | 183 | * |
charliex | 4:53ef91c87d74 | 184 | * Return values |
charliex | 4:53ef91c87d74 | 185 | * 0 : Normally |
charliex | 4:53ef91c87d74 | 186 | * -1 : Exit pNesX |
charliex | 4:53ef91c87d74 | 187 | */ |
charliex | 4:53ef91c87d74 | 188 | |
charliex | 4:53ef91c87d74 | 189 | #if defined(SHOW_FPS) |
charliex | 4:53ef91c87d74 | 190 | timer.stop(); |
charliex | 4:53ef91c87d74 | 191 | #endif |
charliex | 4:53ef91c87d74 | 192 | |
charliex | 4:53ef91c87d74 | 193 | |
charliex | 4:53ef91c87d74 | 194 | ApuMute ( true ); |
charliex | 4:53ef91c87d74 | 195 | |
charliex | 4:53ef91c87d74 | 196 | switch ( pNesX_Filer() ) { |
charliex | 4:53ef91c87d74 | 197 | case 0: // Selected a file |
charliex | 4:53ef91c87d74 | 198 | if ( pNesX_Load ( szRomPath ) == 0 ) { |
charliex | 4:53ef91c87d74 | 199 | // Set a ROM image name |
charliex | 4:53ef91c87d74 | 200 | strcpy ( szRomName, szRomFilename ); |
charliex | 4:53ef91c87d74 | 201 | |
charliex | 4:53ef91c87d74 | 202 | // Load SRAM |
charliex | 4:53ef91c87d74 | 203 | LoadSRAM(); |
charliex | 4:53ef91c87d74 | 204 | } |
charliex | 4:53ef91c87d74 | 205 | |
charliex | 4:53ef91c87d74 | 206 | break; |
charliex | 4:53ef91c87d74 | 207 | |
charliex | 4:53ef91c87d74 | 208 | case 1: // Return to Emu |
charliex | 4:53ef91c87d74 | 209 | break; |
charliex | 4:53ef91c87d74 | 210 | |
charliex | 4:53ef91c87d74 | 211 | case 2: // Reset |
charliex | 4:53ef91c87d74 | 212 | if ( szRomName[ 0 ] != 0 ) { |
charliex | 4:53ef91c87d74 | 213 | // Reset pNesX |
charliex | 4:53ef91c87d74 | 214 | pNesX_Reset(); |
charliex | 4:53ef91c87d74 | 215 | } |
charliex | 4:53ef91c87d74 | 216 | |
charliex | 4:53ef91c87d74 | 217 | break; |
charliex | 4:53ef91c87d74 | 218 | |
charliex | 4:53ef91c87d74 | 219 | case -1: // Error |
charliex | 4:53ef91c87d74 | 220 | |
charliex | 4:53ef91c87d74 | 221 | //printf ( "Filer Error\r\n" ); |
charliex | 4:53ef91c87d74 | 222 | |
charliex | 4:53ef91c87d74 | 223 | while ( 1 ); |
charliex | 4:53ef91c87d74 | 224 | } |
charliex | 4:53ef91c87d74 | 225 | |
charliex | 4:53ef91c87d74 | 226 | tft_clear ( TFT_BLACK ); |
charliex | 4:53ef91c87d74 | 227 | tft_set_window ( 32, 8, NES_DISP_WIDTH + 32 - 1, NES_DISP_HEIGHT + 8 - 1 ); |
charliex | 4:53ef91c87d74 | 228 | |
charliex | 4:53ef91c87d74 | 229 | ApuMute ( false ); |
charliex | 4:53ef91c87d74 | 230 | |
charliex | 4:53ef91c87d74 | 231 | #if defined(SHOW_FPS) |
charliex | 4:53ef91c87d74 | 232 | timer.start(); |
charliex | 4:53ef91c87d74 | 233 | #endif |
charliex | 4:53ef91c87d74 | 234 | |
charliex | 4:53ef91c87d74 | 235 | return 0; |
charliex | 4:53ef91c87d74 | 236 | } |
charliex | 4:53ef91c87d74 | 237 | |
charliex | 4:53ef91c87d74 | 238 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 239 | /* */ |
charliex | 4:53ef91c87d74 | 240 | /* pNesX_ReadRom() : Read ROM image file */ |
charliex | 4:53ef91c87d74 | 241 | /* */ |
charliex | 4:53ef91c87d74 | 242 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 243 | int pNesX_ReadRom ( const char *pszFileName ) |
charliex | 4:53ef91c87d74 | 244 | { |
charliex | 4:53ef91c87d74 | 245 | /* |
charliex | 4:53ef91c87d74 | 246 | * Read ROM image file |
charliex | 4:53ef91c87d74 | 247 | * |
charliex | 4:53ef91c87d74 | 248 | * Parameters |
charliex | 4:53ef91c87d74 | 249 | * const char *pszFileName (Read) |
charliex | 4:53ef91c87d74 | 250 | * |
charliex | 4:53ef91c87d74 | 251 | * Return values |
charliex | 4:53ef91c87d74 | 252 | * 0 : Normally |
charliex | 4:53ef91c87d74 | 253 | * -1 : Error |
charliex | 4:53ef91c87d74 | 254 | */ |
charliex | 4:53ef91c87d74 | 255 | FileHandle* file; |
charliex | 4:53ef91c87d74 | 256 | |
charliex | 4:53ef91c87d74 | 257 | /* Open ROM file */ |
charliex | 4:53ef91c87d74 | 258 | file = sd->open ( pszFileName, O_RDONLY ); |
charliex | 4:53ef91c87d74 | 259 | |
charliex | 4:53ef91c87d74 | 260 | if ( file == NULL ) { |
charliex | 4:53ef91c87d74 | 261 | //printf ( "open error\r\n" ); |
charliex | 4:53ef91c87d74 | 262 | return -1; |
charliex | 4:53ef91c87d74 | 263 | } |
charliex | 4:53ef91c87d74 | 264 | |
charliex | 4:53ef91c87d74 | 265 | /* Read ROM Header */ |
charliex | 4:53ef91c87d74 | 266 | file->read ( &NesHeader, sizeof NesHeader ); |
charliex | 4:53ef91c87d74 | 267 | |
charliex | 4:53ef91c87d74 | 268 | if ( memcmp ( NesHeader.byID, "NES\x1a", 4 ) != 0 ) { |
charliex | 4:53ef91c87d74 | 269 | /* not .nes file */ |
charliex | 4:53ef91c87d74 | 270 | file->close(); |
charliex | 4:53ef91c87d74 | 271 | return -1; |
charliex | 4:53ef91c87d74 | 272 | } |
charliex | 4:53ef91c87d74 | 273 | |
charliex | 4:53ef91c87d74 | 274 | /* Clear SRAM */ |
charliex | 4:53ef91c87d74 | 275 | memset ( SRAM, 0, SRAM_SIZE ); |
charliex | 4:53ef91c87d74 | 276 | |
charliex | 4:53ef91c87d74 | 277 | /* If trainer presents Read Triner at 0x7000-0x71ff */ |
charliex | 4:53ef91c87d74 | 278 | if ( NesHeader.byInfo1 & 4 ) { |
charliex | 4:53ef91c87d74 | 279 | //printf ( "Read Trainer\r\n" ); |
charliex | 4:53ef91c87d74 | 280 | file->read ( &SRAM[ 0x1000 ], 512 ); |
charliex | 4:53ef91c87d74 | 281 | } |
charliex | 4:53ef91c87d74 | 282 | |
charliex | 4:53ef91c87d74 | 283 | //printf ( "RomSize: %d\r\n", NesHeader.byRomSize ); |
charliex | 4:53ef91c87d74 | 284 | /* Allocate Memory for ROM Image */ |
charliex | 4:53ef91c87d74 | 285 | ROM = ( BYTE * ) malloc ( NesHeader.byRomSize * 0x4000 ); |
charliex | 4:53ef91c87d74 | 286 | //printf ( "ROM addr:%x\r\n", ROM ); |
charliex | 4:53ef91c87d74 | 287 | |
charliex | 4:53ef91c87d74 | 288 | /* Read ROM Image */ |
charliex | 4:53ef91c87d74 | 289 | file->read ( ROM, 0x4000 * NesHeader.byRomSize ); |
charliex | 4:53ef91c87d74 | 290 | |
charliex | 4:53ef91c87d74 | 291 | if ( NesHeader.byVRomSize > 0 ) { |
charliex | 4:53ef91c87d74 | 292 | /* Allocate Memory for VROM Image */ |
charliex | 4:53ef91c87d74 | 293 | VROM = ( BYTE * ) malloc ( NesHeader.byVRomSize * 0x2000 ); |
charliex | 4:53ef91c87d74 | 294 | //printf ( "VROM addr:%x\r\n", VROM ); |
charliex | 4:53ef91c87d74 | 295 | |
charliex | 4:53ef91c87d74 | 296 | /* Read VROM Image */ |
charliex | 4:53ef91c87d74 | 297 | file->read ( VROM, 0x2000 * NesHeader.byVRomSize ); |
charliex | 4:53ef91c87d74 | 298 | } |
charliex | 4:53ef91c87d74 | 299 | |
charliex | 4:53ef91c87d74 | 300 | /* File close */ |
charliex | 4:53ef91c87d74 | 301 | file->close(); |
charliex | 4:53ef91c87d74 | 302 | |
charliex | 4:53ef91c87d74 | 303 | /* Successful */ |
charliex | 4:53ef91c87d74 | 304 | return 0; |
charliex | 4:53ef91c87d74 | 305 | } |
charliex | 4:53ef91c87d74 | 306 | |
charliex | 4:53ef91c87d74 | 307 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 308 | /* */ |
charliex | 4:53ef91c87d74 | 309 | /* pNesX_ReleaseRom() : Release a memory for ROM */ |
charliex | 4:53ef91c87d74 | 310 | /* */ |
charliex | 4:53ef91c87d74 | 311 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 312 | void pNesX_ReleaseRom() |
charliex | 4:53ef91c87d74 | 313 | { |
charliex | 4:53ef91c87d74 | 314 | /* |
charliex | 4:53ef91c87d74 | 315 | * Release a memory for ROM |
charliex | 4:53ef91c87d74 | 316 | * |
charliex | 4:53ef91c87d74 | 317 | */ |
charliex | 4:53ef91c87d74 | 318 | if ( ROM ) { |
charliex | 4:53ef91c87d74 | 319 | free ( ROM ); |
charliex | 4:53ef91c87d74 | 320 | ROM = NULL; |
charliex | 4:53ef91c87d74 | 321 | } |
charliex | 4:53ef91c87d74 | 322 | |
charliex | 4:53ef91c87d74 | 323 | if ( VROM ) { |
charliex | 4:53ef91c87d74 | 324 | free ( VROM ); |
charliex | 4:53ef91c87d74 | 325 | VROM = NULL; |
charliex | 4:53ef91c87d74 | 326 | } |
charliex | 4:53ef91c87d74 | 327 | } |
charliex | 4:53ef91c87d74 | 328 | |
charliex | 4:53ef91c87d74 | 329 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 330 | /* */ |
charliex | 4:53ef91c87d74 | 331 | /* pNesX_LoadFrame() : */ |
charliex | 4:53ef91c87d74 | 332 | /* Transfer the contents of work frame on the screen */ |
charliex | 4:53ef91c87d74 | 333 | /* */ |
charliex | 4:53ef91c87d74 | 334 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 335 | void pNesX_LoadFrame() |
charliex | 4:53ef91c87d74 | 336 | { |
charliex | 4:53ef91c87d74 | 337 | /* |
charliex | 4:53ef91c87d74 | 338 | * Transfer the contents of work frame on the screen |
charliex | 4:53ef91c87d74 | 339 | * |
charliex | 4:53ef91c87d74 | 340 | */ |
charliex | 4:53ef91c87d74 | 341 | #if defined(SHOW_FPS) |
charliex | 4:53ef91c87d74 | 342 | fps++; |
charliex | 4:53ef91c87d74 | 343 | |
charliex | 4:53ef91c87d74 | 344 | if ( timer.read_ms() >= 1000 ) { |
charliex | 4:53ef91c87d74 | 345 | timer.stop(); |
charliex | 4:53ef91c87d74 | 346 | //printf ( "%d %d %d\r\n", fps, timer.read_ms(), dmawait ); |
charliex | 4:53ef91c87d74 | 347 | fps = 0; |
charliex | 4:53ef91c87d74 | 348 | timer.reset(); |
charliex | 4:53ef91c87d74 | 349 | timer.start(); |
charliex | 4:53ef91c87d74 | 350 | } |
charliex | 4:53ef91c87d74 | 351 | |
charliex | 4:53ef91c87d74 | 352 | dmawait = 0; |
charliex | 4:53ef91c87d74 | 353 | #endif |
charliex | 4:53ef91c87d74 | 354 | } |
charliex | 4:53ef91c87d74 | 355 | |
charliex | 4:53ef91c87d74 | 356 | void pNesX_TransmitLinedata() |
charliex | 4:53ef91c87d74 | 357 | { |
charliex | 4:53ef91c87d74 | 358 | while ( SpiHandle.State != HAL_SPI_STATE_READY ) { |
charliex | 4:53ef91c87d74 | 359 | #if defined(SHOW_FPS) |
charliex | 4:53ef91c87d74 | 360 | dmawait++; |
charliex | 4:53ef91c87d74 | 361 | #endif |
charliex | 4:53ef91c87d74 | 362 | } |
charliex | 4:53ef91c87d74 | 363 | |
charliex | 4:53ef91c87d74 | 364 | HAL_SPI_Transmit_DMA ( &SpiHandle, ( uint8_t * ) pDrawData, 256 * 2 ); |
charliex | 4:53ef91c87d74 | 365 | } |
charliex | 4:53ef91c87d74 | 366 | |
charliex | 4:53ef91c87d74 | 367 | #if defined(ORIGINAL_GAMEPAD) |
charliex | 4:53ef91c87d74 | 368 | const BYTE UsbPadTable[] = {0x10, 0x90, 0x80, 0xa0, 0x20, 0x60, 0x40, 0x50}; |
charliex | 4:53ef91c87d74 | 369 | #endif |
charliex | 4:53ef91c87d74 | 370 | |
charliex | 4:53ef91c87d74 | 371 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 372 | /* */ |
charliex | 4:53ef91c87d74 | 373 | /* pNesX_PadState() : Get a joypad state */ |
charliex | 4:53ef91c87d74 | 374 | /* */ |
charliex | 4:53ef91c87d74 | 375 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 376 | void pNesX_PadState ( DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem ) |
charliex | 4:53ef91c87d74 | 377 | { |
charliex | 4:53ef91c87d74 | 378 | /* |
charliex | 4:53ef91c87d74 | 379 | * Get a joypad state |
charliex | 4:53ef91c87d74 | 380 | * |
charliex | 4:53ef91c87d74 | 381 | * Parameters |
charliex | 4:53ef91c87d74 | 382 | * DWORD *pdwPad1 (Write) |
charliex | 4:53ef91c87d74 | 383 | * Joypad 1 State R L D U St Se B A |
charliex | 4:53ef91c87d74 | 384 | * |
charliex | 4:53ef91c87d74 | 385 | * DWORD *pdwPad2 (Write) |
charliex | 4:53ef91c87d74 | 386 | * Joypad 2 State |
charliex | 4:53ef91c87d74 | 387 | * |
charliex | 4:53ef91c87d74 | 388 | * DWORD *pdwSystem (Write) |
charliex | 4:53ef91c87d74 | 389 | * Input for pNesX |
charliex | 4:53ef91c87d74 | 390 | * |
charliex | 4:53ef91c87d74 | 391 | */ |
charliex | 4:53ef91c87d74 | 392 | |
charliex | 4:53ef91c87d74 | 393 | #if defined(ORIGINAL_GAMEPAD) |
charliex | 4:53ef91c87d74 | 394 | *pdwPad1 = ( ( pad->report[4] & 0x20 ) >> 5 ) | |
charliex | 4:53ef91c87d74 | 395 | ( ( pad->report[4] & 0x10 ) >> 3 ) | |
charliex | 4:53ef91c87d74 | 396 | ( ( pad->report[5] & 0x30 ) >> 2 ); |
charliex | 4:53ef91c87d74 | 397 | |
charliex | 4:53ef91c87d74 | 398 | if ( ! ( pad->report[4] & 8 ) ) { |
charliex | 4:53ef91c87d74 | 399 | *pdwPad1 |= UsbPadTable[pad->report[4] & 7]; |
charliex | 4:53ef91c87d74 | 400 | } |
charliex | 4:53ef91c87d74 | 401 | |
charliex | 4:53ef91c87d74 | 402 | *pdwPad1 = *pdwPad1 | ( *pdwPad1 << 8 ); |
charliex | 4:53ef91c87d74 | 403 | |
charliex | 4:53ef91c87d74 | 404 | *pdwPad2 = 0; |
charliex | 4:53ef91c87d74 | 405 | *pdwSystem = ( ( pad->report[5] & 0x4 ) >> 2 ) | |
charliex | 4:53ef91c87d74 | 406 | ( ( ( pad->report[5] & 0xa ) == 0xa ) << 1 ); |
charliex | 4:53ef91c87d74 | 407 | |
charliex | 4:53ef91c87d74 | 408 | USBHost::poll(); |
charliex | 4:53ef91c87d74 | 409 | |
charliex | 4:53ef91c87d74 | 410 | #elif defined(NES_GAMEPAD) |
charliex | 4:53ef91c87d74 | 411 | |
charliex | 4:53ef91c87d74 | 412 | *pdwSystem = 0 ; |
charliex | 4:53ef91c87d74 | 413 | *pdwPad1 = 0 ; |
charliex | 4:53ef91c87d74 | 414 | /* |
charliex | 4:53ef91c87d74 | 415 | 01 02 03 04 05 06 07 08 |
charliex | 4:53ef91c87d74 | 416 | ----------------------- |
charliex | 4:53ef91c87d74 | 417 | 01 80 80 7f 7f 0f 00 00 |
charliex | 4:53ef91c87d74 | 418 | LEFT 00 |
charliex | 4:53ef91c87d74 | 419 | RIGHT FF |
charliex | 4:53ef91c87d74 | 420 | UP 00 |
charliex | 4:53ef91c87d74 | 421 | DOWN FF |
charliex | 4:53ef91c87d74 | 422 | SELECT 10 |
charliex | 4:53ef91c87d74 | 423 | START 20 |
charliex | 4:53ef91c87d74 | 424 | B 1F |
charliex | 4:53ef91c87d74 | 425 | A 2F |
charliex | 4:53ef91c87d74 | 426 | */ |
charliex | 4:53ef91c87d74 | 427 | |
charliex | 4:53ef91c87d74 | 428 | if ( pad->report[3] == 0x00 ) {*pdwPad1 |= KEYPAD_LEFT; *pdwSystem ^= PAD_SYS_LEFT;} |
charliex | 4:53ef91c87d74 | 429 | |
charliex | 4:53ef91c87d74 | 430 | if ( pad->report[3] == 0xFF ) {*pdwPad1 |= KEYPAD_RIGHT; *pdwSystem ^= PAD_SYS_RIGHT;} |
charliex | 4:53ef91c87d74 | 431 | |
charliex | 4:53ef91c87d74 | 432 | if ( pad->report[4] == 0x00 ) {*pdwPad1 |= KEYPAD_UP; *pdwSystem ^= PAD_SYS_UP;} |
charliex | 4:53ef91c87d74 | 433 | |
charliex | 4:53ef91c87d74 | 434 | if ( pad->report[4] == 0xFF ) {*pdwPad1 |= KEYPAD_DOWN; *pdwSystem ^= PAD_SYS_DOWN;} |
charliex | 4:53ef91c87d74 | 435 | |
charliex | 4:53ef91c87d74 | 436 | if ( pad->report[6] & 0x10 ) {*pdwPad1 |= KEYPAD_SELECT;} |
charliex | 4:53ef91c87d74 | 437 | |
charliex | 4:53ef91c87d74 | 438 | if ( pad->report[6] & 0x20 ) {*pdwPad1 |= KEYPAD_START;} |
charliex | 4:53ef91c87d74 | 439 | |
charliex | 4:53ef91c87d74 | 440 | if ( pad->report[5] & 0x10 ) {*pdwPad1 |= KEYPAD_B;} |
charliex | 4:53ef91c87d74 | 441 | |
charliex | 4:53ef91c87d74 | 442 | if ( pad->report[5] & 0x20 ) {*pdwPad1 |= KEYPAD_A;} |
charliex | 4:53ef91c87d74 | 443 | |
charliex | 4:53ef91c87d74 | 444 | if ( pad->report[6] == 0x30 ) { *pdwSystem = PAD_SYS_QUIT; } |
charliex | 4:53ef91c87d74 | 445 | |
charliex | 4:53ef91c87d74 | 446 | #ifdef USE_CAN |
charliex | 4:53ef91c87d74 | 447 | |
charliex | 4:53ef91c87d74 | 448 | { |
charliex | 4:53ef91c87d74 | 449 | static DWORD lastpad; |
charliex | 4:53ef91c87d74 | 450 | |
charliex | 4:53ef91c87d74 | 451 | if ( *pdwPad1 != lastpad ) { |
charliex | 4:53ef91c87d74 | 452 | can1.write ( CANMessage ( CAN_SEND_ID, ( char* ) pdwPad1, 4 ) ); |
charliex | 4:53ef91c87d74 | 453 | lastpad = *pdwPad1; |
charliex | 4:53ef91c87d74 | 454 | } |
charliex | 4:53ef91c87d74 | 455 | } |
charliex | 4:53ef91c87d74 | 456 | |
charliex | 4:53ef91c87d74 | 457 | if ( msgAvailable ) { |
charliex | 4:53ef91c87d74 | 458 | |
charliex | 4:53ef91c87d74 | 459 | *pdwPad2 = canval2; |
charliex | 4:53ef91c87d74 | 460 | |
charliex | 4:53ef91c87d74 | 461 | } else |
charliex | 4:53ef91c87d74 | 462 | #endif |
charliex | 4:53ef91c87d74 | 463 | { |
charliex | 4:53ef91c87d74 | 464 | // network ? |
charliex | 4:53ef91c87d74 | 465 | *pdwPad2 = 0; |
charliex | 4:53ef91c87d74 | 466 | } |
charliex | 4:53ef91c87d74 | 467 | |
charliex | 4:53ef91c87d74 | 468 | |
charliex | 4:53ef91c87d74 | 469 | USBHost::poll(); |
charliex | 4:53ef91c87d74 | 470 | #else |
charliex | 4:53ef91c87d74 | 471 | |
charliex | 4:53ef91c87d74 | 472 | unsigned short pad1, pad2; |
charliex | 4:53ef91c87d74 | 473 | pspad_read ( &pad1, &pad2 ); |
charliex | 4:53ef91c87d74 | 474 | // R L D U St Se B A |
charliex | 4:53ef91c87d74 | 475 | |
charliex | 4:53ef91c87d74 | 476 | // SE -- -- ST U R D L L2 R2 L1 R1 TR O X SQ |
charliex | 4:53ef91c87d74 | 477 | *pdwPad1 = ( ( pad1 & 0x0400 ) >> 3 ) | |
charliex | 4:53ef91c87d74 | 478 | ( ( pad1 & 0x0100 ) >> 2 ) | |
charliex | 4:53ef91c87d74 | 479 | ( ( pad1 & 0x0200 ) >> 4 ) | |
charliex | 4:53ef91c87d74 | 480 | ( ( pad1 & 0x0800 ) >> 7 ) | |
charliex | 4:53ef91c87d74 | 481 | ( ( pad1 & 0x1000 ) >> 9 ) | |
charliex | 4:53ef91c87d74 | 482 | ( ( pad1 & 0x8000 ) >> 13 ) | |
charliex | 4:53ef91c87d74 | 483 | ( ( pad1 & 1 ) << 1 ) | |
charliex | 4:53ef91c87d74 | 484 | ( ( pad1 & 2 ) >> 1 ); |
charliex | 4:53ef91c87d74 | 485 | |
charliex | 4:53ef91c87d74 | 486 | *pdwPad1 = *pdwPad1 | ( *pdwPad1 << 8 ); |
charliex | 4:53ef91c87d74 | 487 | |
charliex | 4:53ef91c87d74 | 488 | *pdwPad2 = 0; |
charliex | 4:53ef91c87d74 | 489 | |
charliex | 4:53ef91c87d74 | 490 | *pdwSystem = ( ( pad1 & 0x80 ) >> 7 ) | |
charliex | 4:53ef91c87d74 | 491 | ( ( ( pad1 & 0x50 ) == 0x50 ) << 1 ); |
charliex | 4:53ef91c87d74 | 492 | |
charliex | 4:53ef91c87d74 | 493 | #endif |
charliex | 4:53ef91c87d74 | 494 | |
charliex | 4:53ef91c87d74 | 495 | } |
charliex | 4:53ef91c87d74 | 496 | |
charliex | 4:53ef91c87d74 | 497 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 498 | /* */ |
charliex | 4:53ef91c87d74 | 499 | /* pNesX_MemoryCopy() : memcpy */ |
charliex | 4:53ef91c87d74 | 500 | /* */ |
charliex | 4:53ef91c87d74 | 501 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 502 | void *pNesX_MemoryCopy ( void *dest, const void *src, int count ) |
charliex | 4:53ef91c87d74 | 503 | { |
charliex | 4:53ef91c87d74 | 504 | /* |
charliex | 4:53ef91c87d74 | 505 | * memcpy |
charliex | 4:53ef91c87d74 | 506 | * |
charliex | 4:53ef91c87d74 | 507 | * Parameters |
charliex | 4:53ef91c87d74 | 508 | * void *dest (Write) |
charliex | 4:53ef91c87d74 | 509 | * Points to the starting address of the copied block to destination |
charliex | 4:53ef91c87d74 | 510 | * |
charliex | 4:53ef91c87d74 | 511 | * const void *src (Read) |
charliex | 4:53ef91c87d74 | 512 | * Points to the starting address of the block of memory to copy |
charliex | 4:53ef91c87d74 | 513 | * |
charliex | 4:53ef91c87d74 | 514 | * int count (Read) |
charliex | 4:53ef91c87d74 | 515 | * Specifies the size, in bytes, of the block of memory to copy |
charliex | 4:53ef91c87d74 | 516 | * |
charliex | 4:53ef91c87d74 | 517 | * Return values |
charliex | 4:53ef91c87d74 | 518 | * Pointer of destination |
charliex | 4:53ef91c87d74 | 519 | */ |
charliex | 4:53ef91c87d74 | 520 | |
charliex | 4:53ef91c87d74 | 521 | memcpy ( dest, src, count ); |
charliex | 4:53ef91c87d74 | 522 | return dest; |
charliex | 4:53ef91c87d74 | 523 | } |
charliex | 4:53ef91c87d74 | 524 | |
charliex | 4:53ef91c87d74 | 525 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 526 | /* */ |
charliex | 4:53ef91c87d74 | 527 | /* pNesX_MemorySet() : */ |
charliex | 4:53ef91c87d74 | 528 | /* */ |
charliex | 4:53ef91c87d74 | 529 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 530 | void *pNesX_MemorySet ( void *dest, int c, int count ) |
charliex | 4:53ef91c87d74 | 531 | { |
charliex | 4:53ef91c87d74 | 532 | /* |
charliex | 4:53ef91c87d74 | 533 | * memset |
charliex | 4:53ef91c87d74 | 534 | * |
charliex | 4:53ef91c87d74 | 535 | * Parameters |
charliex | 4:53ef91c87d74 | 536 | * void *dest (Write) |
charliex | 4:53ef91c87d74 | 537 | * Points to the starting address of the block of memory to fill |
charliex | 4:53ef91c87d74 | 538 | * |
charliex | 4:53ef91c87d74 | 539 | * int c (Read) |
charliex | 4:53ef91c87d74 | 540 | * Specifies the byte value with which to fill the memory block |
charliex | 4:53ef91c87d74 | 541 | * |
charliex | 4:53ef91c87d74 | 542 | * int count (Read) |
charliex | 4:53ef91c87d74 | 543 | * Specifies the size, in bytes, of the block of memory to fill |
charliex | 4:53ef91c87d74 | 544 | * |
charliex | 4:53ef91c87d74 | 545 | * Return values |
charliex | 4:53ef91c87d74 | 546 | * Pointer of destination |
charliex | 4:53ef91c87d74 | 547 | */ |
charliex | 4:53ef91c87d74 | 548 | |
charliex | 4:53ef91c87d74 | 549 | memset ( dest, c, count ); |
charliex | 4:53ef91c87d74 | 550 | return dest; |
charliex | 4:53ef91c87d74 | 551 | } |
charliex | 4:53ef91c87d74 | 552 | |
charliex | 4:53ef91c87d74 | 553 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 554 | /* */ |
charliex | 4:53ef91c87d74 | 555 | /* DebugPrint() : Print debug message */ |
charliex | 4:53ef91c87d74 | 556 | /* */ |
charliex | 4:53ef91c87d74 | 557 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 558 | void pNesX_DebugPrint ( char *pszMsg ) |
charliex | 4:53ef91c87d74 | 559 | { |
charliex | 4:53ef91c87d74 | 560 | } |
charliex | 4:53ef91c87d74 | 561 | |
charliex | 4:53ef91c87d74 | 562 | |
charliex | 4:53ef91c87d74 | 563 | #ifdef USE_CAN |
charliex | 4:53ef91c87d74 | 564 | |
charliex | 4:53ef91c87d74 | 565 | /** |
charliex | 4:53ef91c87d74 | 566 | * @brief 'CAN receive-complete' interrup handler. |
charliex | 4:53ef91c87d74 | 567 | * @note Called on arrival of new CAN message. |
charliex | 4:53ef91c87d74 | 568 | * Keep it as short as possible. |
charliex | 4:53ef91c87d74 | 569 | * @param |
charliex | 4:53ef91c87d74 | 570 | * @retval |
charliex | 4:53ef91c87d74 | 571 | */ |
charliex | 4:53ef91c87d74 | 572 | void onMsgReceived() |
charliex | 4:53ef91c87d74 | 573 | { |
charliex | 4:53ef91c87d74 | 574 | CANMessage msg; |
charliex | 4:53ef91c87d74 | 575 | |
charliex | 4:53ef91c87d74 | 576 | // address to read/wrte |
charliex | 4:53ef91c87d74 | 577 | WORD address; |
charliex | 4:53ef91c87d74 | 578 | |
charliex | 4:53ef91c87d74 | 579 | // default to SRAM |
charliex | 4:53ef91c87d74 | 580 | uint8_t *bank_ptr = &RAM[0]; |
charliex | 4:53ef91c87d74 | 581 | uint8_t bank = 0; |
charliex | 4:53ef91c87d74 | 582 | |
charliex | 4:53ef91c87d74 | 583 | memset ( &msg, 0, sizeof ( msg ) ); |
charliex | 4:53ef91c87d74 | 584 | |
charliex | 4:53ef91c87d74 | 585 | if ( can1.read ( msg ) ) { |
charliex | 4:53ef91c87d74 | 586 | |
charliex | 4:53ef91c87d74 | 587 | // less code |
charliex | 4:53ef91c87d74 | 588 | address = ( ( WORD ) msg.data[0] << 8 + ( WORD ) msg.data[1] ); |
charliex | 4:53ef91c87d74 | 589 | |
charliex | 4:53ef91c87d74 | 590 | // RAM,SRAM,ROM,ROMBANK0/1/2/3,PPURAM,VROM,PPUBANK |
charliex | 4:53ef91c87d74 | 591 | bank = msg.data[2]; |
charliex | 4:53ef91c87d74 | 592 | |
charliex | 4:53ef91c87d74 | 593 | // decide which bank |
charliex | 4:53ef91c87d74 | 594 | switch ( bank ) { |
charliex | 4:53ef91c87d74 | 595 | case 0: |
charliex | 4:53ef91c87d74 | 596 | //RAM |
charliex | 4:53ef91c87d74 | 597 | break; |
charliex | 4:53ef91c87d74 | 598 | |
charliex | 4:53ef91c87d74 | 599 | case 1: |
charliex | 4:53ef91c87d74 | 600 | bank_ptr = &SRAM[0]; |
charliex | 4:53ef91c87d74 | 601 | break; |
charliex | 4:53ef91c87d74 | 602 | |
charliex | 4:53ef91c87d74 | 603 | case 2: |
charliex | 4:53ef91c87d74 | 604 | bank_ptr = ROM; |
charliex | 4:53ef91c87d74 | 605 | break; |
charliex | 4:53ef91c87d74 | 606 | |
charliex | 4:53ef91c87d74 | 607 | case 3: |
charliex | 4:53ef91c87d74 | 608 | bank_ptr = &PPURAM[0]; |
charliex | 4:53ef91c87d74 | 609 | break; |
charliex | 4:53ef91c87d74 | 610 | |
charliex | 4:53ef91c87d74 | 611 | case 4: |
charliex | 4:53ef91c87d74 | 612 | bank_ptr = VROM; |
charliex | 4:53ef91c87d74 | 613 | break; |
charliex | 4:53ef91c87d74 | 614 | |
charliex | 4:53ef91c87d74 | 615 | case 5: |
charliex | 4:53ef91c87d74 | 616 | bank_ptr = ( uint8_t* ) &PPUBANK[0]; |
charliex | 4:53ef91c87d74 | 617 | break; |
charliex | 4:53ef91c87d74 | 618 | |
charliex | 4:53ef91c87d74 | 619 | case 6: |
charliex | 4:53ef91c87d74 | 620 | bank_ptr = ( uint8_t* ) &SPRRAM[0]; |
charliex | 4:53ef91c87d74 | 621 | break; |
charliex | 4:53ef91c87d74 | 622 | |
charliex | 4:53ef91c87d74 | 623 | } |
charliex | 4:53ef91c87d74 | 624 | |
charliex | 4:53ef91c87d74 | 625 | switch ( msg.id ) { |
charliex | 4:53ef91c87d74 | 626 | case CAN_RECV_ID : |
charliex | 4:53ef91c87d74 | 627 | |
charliex | 4:53ef91c87d74 | 628 | /// so far only mark it as available when its a gamepad message.. |
charliex | 4:53ef91c87d74 | 629 | msgAvailable = true; |
charliex | 4:53ef91c87d74 | 630 | |
charliex | 4:53ef91c87d74 | 631 | //memcpy(&canval2,(char*)&msg.data[0],4); |
charliex | 4:53ef91c87d74 | 632 | canval2 = ( unsigned long ) ( msg.data[3] << 24 ) + ( ( unsigned long ) msg.data[2] << 16 ) + ( ( unsigned long ) msg.data[1] << 8 ) + ( ( unsigned long ) msg.data[0] ); |
charliex | 4:53ef91c87d74 | 633 | break; |
charliex | 4:53ef91c87d74 | 634 | |
charliex | 4:53ef91c87d74 | 635 | case CAN_READ_BYTE: |
charliex | 4:53ef91c87d74 | 636 | break; |
charliex | 4:53ef91c87d74 | 637 | |
charliex | 4:53ef91c87d74 | 638 | case CAN_READ_WORD: |
charliex | 4:53ef91c87d74 | 639 | break; |
charliex | 4:53ef91c87d74 | 640 | |
charliex | 4:53ef91c87d74 | 641 | case CAN_READ_DWORD: |
charliex | 4:53ef91c87d74 | 642 | break; |
charliex | 4:53ef91c87d74 | 643 | |
charliex | 4:53ef91c87d74 | 644 | case CAN_WRITE_BYTE: |
charliex | 4:53ef91c87d74 | 645 | break; |
charliex | 4:53ef91c87d74 | 646 | |
charliex | 4:53ef91c87d74 | 647 | case CAN_WRITE_WORD: |
charliex | 4:53ef91c87d74 | 648 | break; |
charliex | 4:53ef91c87d74 | 649 | |
charliex | 4:53ef91c87d74 | 650 | case CAN_WRITE_DWORD: |
charliex | 4:53ef91c87d74 | 651 | break; |
charliex | 4:53ef91c87d74 | 652 | } |
charliex | 4:53ef91c87d74 | 653 | } |
charliex | 4:53ef91c87d74 | 654 | } |
charliex | 4:53ef91c87d74 | 655 | |
charliex | 4:53ef91c87d74 | 656 | #endif |
charliex | 4:53ef91c87d74 | 657 | |
charliex | 4:53ef91c87d74 | 658 | |
charliex | 4:53ef91c87d74 | 659 | const unsigned char * const logoPtrs[] = { |
charliex | 4:53ef91c87d74 | 660 | l1_Logo, |
charliex | 4:53ef91c87d74 | 661 | |
charliex | 4:53ef91c87d74 | 662 | //platinum |
charliex | 4:53ef91c87d74 | 663 | tinder_logo, |
charliex | 4:53ef91c87d74 | 664 | supplyFrame, |
charliex | 4:53ef91c87d74 | 665 | asg_logo, |
charliex | 4:53ef91c87d74 | 666 | nslmini, |
charliex | 4:53ef91c87d74 | 667 | |
charliex | 4:53ef91c87d74 | 668 | //gold |
charliex | 4:53ef91c87d74 | 669 | securitysnobs, |
charliex | 4:53ef91c87d74 | 670 | |
charliex | 4:53ef91c87d74 | 671 | //silver |
charliex | 4:53ef91c87d74 | 672 | PRO_LG_K_500x200_1CRevGrey_noDSCR, |
charliex | 4:53ef91c87d74 | 673 | adaptable_conn_logo, |
charliex | 4:53ef91c87d74 | 674 | WallOfSheep_logo_200px, |
charliex | 4:53ef91c87d74 | 675 | hacker_stickers_logo, |
charliex | 4:53ef91c87d74 | 676 | nostarch_logo |
charliex | 4:53ef91c87d74 | 677 | }; |
charliex | 4:53ef91c87d74 | 678 | |
charliex | 4:53ef91c87d74 | 679 | void draw_logos ( void ) |
charliex | 4:53ef91c87d74 | 680 | { |
charliex | 4:53ef91c87d74 | 681 | static unsigned char counter = 0; |
charliex | 4:53ef91c87d74 | 682 | |
charliex | 4:53ef91c87d74 | 683 | unsigned short w; |
charliex | 4:53ef91c87d74 | 684 | unsigned char h; |
charliex | 4:53ef91c87d74 | 685 | const unsigned char *p; |
charliex | 4:53ef91c87d74 | 686 | |
charliex | 4:53ef91c87d74 | 687 | for ( float b = 1 ; b > 0 ; b -= 0.05f ) { |
charliex | 4:53ef91c87d74 | 688 | backlight ( b ); |
charliex | 4:53ef91c87d74 | 689 | HAL_Delay ( 20 ); |
charliex | 4:53ef91c87d74 | 690 | } |
charliex | 4:53ef91c87d74 | 691 | |
charliex | 4:53ef91c87d74 | 692 | backlight ( 0 ); |
charliex | 4:53ef91c87d74 | 693 | tft_clear ( TFT_BLACK ); |
charliex | 4:53ef91c87d74 | 694 | |
charliex | 4:53ef91c87d74 | 695 | p = logoPtrs[counter]; |
charliex | 4:53ef91c87d74 | 696 | |
charliex | 4:53ef91c87d74 | 697 | w = ( unsigned short ) ( p[18] ) + ( ( unsigned short ) p[19] << 8 ); |
charliex | 4:53ef91c87d74 | 698 | h = p[22]; |
charliex | 4:53ef91c87d74 | 699 | |
charliex | 4:53ef91c87d74 | 700 | draw_bmp_4bpp ( p, ( TFT_WIDTH / 2 ) - ( w / 2 ), ( ( TFT_HEIGHT / 2 ) - ( h / 2 ) ) ); |
charliex | 4:53ef91c87d74 | 701 | |
charliex | 4:53ef91c87d74 | 702 | for ( float b = 0 ; b < 1 ; b += 0.05f ) { |
charliex | 4:53ef91c87d74 | 703 | backlight ( b ); |
charliex | 4:53ef91c87d74 | 704 | HAL_Delay ( 20 ); |
charliex | 4:53ef91c87d74 | 705 | } |
charliex | 4:53ef91c87d74 | 706 | |
charliex | 4:53ef91c87d74 | 707 | |
charliex | 4:53ef91c87d74 | 708 | HAL_Delay ( 1000 ); |
charliex | 4:53ef91c87d74 | 709 | counter++ ; |
charliex | 4:53ef91c87d74 | 710 | |
charliex | 4:53ef91c87d74 | 711 | if ( counter >= sizeof ( logoPtrs ) / sizeof ( unsigned char * ) ) { counter = 0; } |
charliex | 4:53ef91c87d74 | 712 | |
charliex | 4:53ef91c87d74 | 713 | } |
charliex | 4:53ef91c87d74 | 714 | |
charliex | 4:53ef91c87d74 | 715 | |
charliex | 4:53ef91c87d74 | 716 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 717 | /* */ |
charliex | 4:53ef91c87d74 | 718 | /* pNesX Initialise */ |
charliex | 4:53ef91c87d74 | 719 | /* */ |
charliex | 4:53ef91c87d74 | 720 | /*===================================================================*/ |
charliex | 4:53ef91c87d74 | 721 | int main() |
charliex | 4:53ef91c87d74 | 722 | { |
charliex | 4:53ef91c87d74 | 723 | const unsigned char *p ; |
charliex | 4:53ef91c87d74 | 724 | bLED1 = 0; |
charliex | 4:53ef91c87d74 | 725 | bLED2 = 0; |
charliex | 4:53ef91c87d74 | 726 | |
charliex | 4:53ef91c87d74 | 727 | #ifdef USE_CAN |
charliex | 4:53ef91c87d74 | 728 | // can1.reset(); |
charliex | 4:53ef91c87d74 | 729 | can1.frequency ( 1000000 ); |
charliex | 4:53ef91c87d74 | 730 | can1.attach ( &onMsgReceived ); // attach 'CAN receive-complete' interrupt handler |
charliex | 4:53ef91c87d74 | 731 | #endif |
charliex | 4:53ef91c87d74 | 732 | |
charliex | 4:53ef91c87d74 | 733 | // TFT initialize |
charliex | 4:53ef91c87d74 | 734 | tft_init(); |
charliex | 4:53ef91c87d74 | 735 | |
charliex | 4:53ef91c87d74 | 736 | tft_set_window ( 32, 8, NES_DISP_WIDTH + 32 - 1, NES_DISP_HEIGHT + 8 - 1 ); |
charliex | 4:53ef91c87d74 | 737 | |
charliex | 4:53ef91c87d74 | 738 | // SD_CS = PB_2 |
charliex | 4:53ef91c87d74 | 739 | // SD_SCK = PB_10 |
charliex | 4:53ef91c87d74 | 740 | // SD_MISO = PC_2 |
charliex | 4:53ef91c87d74 | 741 | // SD_MOSI = PC_3 |
charliex | 4:53ef91c87d74 | 742 | |
charliex | 4:53ef91c87d74 | 743 | if ( sd == NULL ) |
charliex | 4:53ef91c87d74 | 744 | { |
charliex | 4:53ef91c87d74 | 745 | // SD card Initialize |
charliex | 4:53ef91c87d74 | 746 | bLED2 = 1; |
charliex | 4:53ef91c87d74 | 747 | |
charliex | 4:53ef91c87d74 | 748 | sd = new SDFileSystem ( PC_3, PC_2, PB_10, PB_2, "sd", NC, SDFileSystem::SWITCH_NONE, 20000000 ); |
charliex | 4:53ef91c87d74 | 749 | |
charliex | 4:53ef91c87d74 | 750 | |
charliex | 4:53ef91c87d74 | 751 | sd->crc ( true ); |
charliex | 4:53ef91c87d74 | 752 | sd->large_frames ( true ); |
charliex | 4:53ef91c87d74 | 753 | sd->write_validation ( true ); |
charliex | 4:53ef91c87d74 | 754 | |
charliex | 4:53ef91c87d74 | 755 | strcpy ( szRomFolder, "/sd" ); |
charliex | 4:53ef91c87d74 | 756 | |
charliex | 4:53ef91c87d74 | 757 | } |
charliex | 4:53ef91c87d74 | 758 | |
charliex | 4:53ef91c87d74 | 759 | for ( ;; ) { |
charliex | 4:53ef91c87d74 | 760 | draw_logos(); |
charliex | 4:53ef91c87d74 | 761 | |
charliex | 4:53ef91c87d74 | 762 | if ( get_filelist ( "/sd" ) ) { break; } |
charliex | 4:53ef91c87d74 | 763 | } |
charliex | 4:53ef91c87d74 | 764 | |
charliex | 4:53ef91c87d74 | 765 | #if !defined(PS_GAMEPAD) |
charliex | 4:53ef91c87d74 | 766 | tft_clear ( TFT_RED + TFT_BLUE ); |
charliex | 4:53ef91c87d74 | 767 | // USB Gamepad Initialize` |
charliex | 4:53ef91c87d74 | 768 | pad = new USBHostGamepad(); |
charliex | 4:53ef91c87d74 | 769 | pad->connect(); |
charliex | 4:53ef91c87d74 | 770 | #else |
charliex | 4:53ef91c87d74 | 771 | pspad_init(); |
charliex | 4:53ef91c87d74 | 772 | #endif |
charliex | 4:53ef91c87d74 | 773 | |
charliex | 4:53ef91c87d74 | 774 | // Apu Initialize |
charliex | 4:53ef91c87d74 | 775 | ApuInit(); |
charliex | 4:53ef91c87d74 | 776 | |
charliex | 4:53ef91c87d74 | 777 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 778 | /* Start pNesX */ |
charliex | 4:53ef91c87d74 | 779 | /*-------------------------------------------------------------------*/ |
charliex | 4:53ef91c87d74 | 780 | |
charliex | 4:53ef91c87d74 | 781 | bLED2 = 1; |
charliex | 4:53ef91c87d74 | 782 | bLED1 = 1; |
charliex | 4:53ef91c87d74 | 783 | |
charliex | 4:53ef91c87d74 | 784 | pNesX_Main(); |
charliex | 4:53ef91c87d74 | 785 | |
charliex | 4:53ef91c87d74 | 786 | } |
charliex | 4:53ef91c87d74 | 787 | |
charliex | 4:53ef91c87d74 | 788 |