From 6deb49048cb9645c56333bffcd61f59806cbcdc5 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Tue, 5 Nov 2024 09:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dnes=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- armv7_8.cmake | 4 +- .../ATSURFF437/nes_simulator/CMakeLists.txt | 8 +- .../nes_simulator/NES_Simulator/ROM__MARIO.c | 4 +- .../nes_simulator/NES_Simulator/nes_main.c | 214 ++++++++++-------- .../infoNES/ports/InfoNES_system.c | 7 +- .../drv/ATSURFF437/nes_simulator/main.c | 31 ++- 6 files changed, 159 insertions(+), 109 deletions(-) diff --git a/armv7_8.cmake b/armv7_8.cmake index 6c26008a4..2aa5cda78 100644 --- a/armv7_8.cmake +++ b/armv7_8.cmake @@ -7,14 +7,14 @@ set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -include ${CMAKE_SOURCE_DIR}/build/autoconf.h \ " CACHE STRING "" FORCE) -set(CMAKE_CXX_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -mthumb-interwork -D=MKRTOS -std=c++11 \ +set(CMAKE_CXX_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -D=MKRTOS -std=c++11 \ -fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector -g \ -u=_printf_float -D__ARM_ARCH_7M__ \ -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ -include ${CMAKE_SOURCE_DIR}/build/autoconf.h \ " CACHE STRING "" FORCE) -set(CMAKE_ASM_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -mthumb-interwork -D=MKRTOS \ +set(CMAKE_ASM_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -D=MKRTOS \ -u=_printf_float -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker -fno-stack-protector -D__ARM_ARCH_7M__ \ -include ${CMAKE_SOURCE_DIR}/build/autoconf.h \ diff --git a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/CMakeLists.txt b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/CMakeLists.txt index 5266657ef..7aba38bf2 100644 --- a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/CMakeLists.txt +++ b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ") -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 -DINFONES") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 -DINFONES") +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 -DINFONES") file( GLOB deps @@ -14,7 +14,6 @@ file( # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/PPU.c # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/ROM__MARIO.c ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/*.c - # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/mapper/*.c ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/ports/*.c *.c ) @@ -51,6 +50,7 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board/ ${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/middlewares/i2c_application_library ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator + # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES ${CMAKE_SOURCE_DIR}/mkrtos_user/server/drv/ATSURFF437/nes_simulator/mapper diff --git a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/ROM__MARIO.c b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/ROM__MARIO.c index 8db707eac..8e552343d 100644 --- a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/ROM__MARIO.c +++ b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/ROM__MARIO.c @@ -1,7 +1,7 @@ -// #define _USE_ROM_MARIO_ +#define _USE_ROM_MARIO_ //#define _USE_ROM_DEMO_ -#define _USE_ROM_TANKE_ +// #define _USE_ROM_TANKE_ #ifdef _USE_ROM_MARIO_ char const rom_file[]={78,69,83,26,2,1,1,0,0,0,0,0,0,0,0,0, diff --git a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/nes_main.c b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/nes_main.c index 612825746..a658a1603 100644 --- a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/nes_main.c +++ b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/NES_Simulator/nes_main.c @@ -1,16 +1,16 @@ /** - ****************************************************************************** - * @file - * @author - * @version - * @date - * @brief - ****************************************************************************** - * @attention - * - * - ****************************************************************************** - */ + ****************************************************************************** + * @file + * @author + * @version + * @date + * @brief + ****************************************************************************** + * @attention + * + * + ****************************************************************************** + */ /* Includes ------------------------------------------------------------------*/ #include "nes_main.h" #include "u_sleep.h" @@ -19,140 +19,162 @@ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ -uint8 Continue = TRUE;//???????? +uint8 Continue = TRUE; //???????? int FrameCnt; -/* NES ????????*/ +/* NES ????????*/ void NesFrameCycle(void) { - int clocks; //CPU?????? + int clocks; // CPU?????? -//// ?????????????????VROM????????????0???????VROM -// if ( NesHeader.byVRomSize == 0) -// ????VROM?›¥??¦Ë?¨¢? + //// ?????????????????VROM????????????0???????VROM + // if ( NesHeader.byVRomSize == 0) + // ????VROM?��??��?��? FrameCnt = 0; - while(Continue){ - /* scanline: 0~19 VBANK ?¦²???PPU???NMI????????NMI ?§Ø?, */ - FrameCnt++; //??????? -// printf("\r\n??????? %d", FrameCnt); - SpriteHitFlag = FALSE; - for(PPU_scanline=0; PPU_scanline<20; PPU_scanline++){ + while (Continue) + { + /* scanline: 0~19 VBANK ?��???PPU???NMI????????NMI ?��?, */ + FrameCnt++; //??????? + // printf("\r\n??????? %d", FrameCnt); + SpriteHitFlag = FALSE; + for (PPU_scanline = 0; PPU_scanline < 20; PPU_scanline++) + { exec6502(CLOCKS_PER_SCANLINE); -// NesHBCycle(); + // NesHBCycle(); } - /* scanline: 20, PPU??????????????¦Ï????????*/ + /* scanline: 20, PPU??????????????��????????*/ exec6502(CLOCKS_PER_SCANLINE); -// NesHBCycle(); //?????? - PPU_scanline++; //20++ + // NesHBCycle(); //?????? + PPU_scanline++; // 20++ PPU_Reg.R2 &= ~R2_SPR0_HIT; - /* scanline: 21~261*/ - for(; PPU_scanline < SCAN_LINE_DISPALY_END_NUM; PPU_scanline++){ - if((SpriteHitFlag == TRUE) && ((PPU_Reg.R2 & R2_SPR0_HIT) == 0)){ + /* scanline: 21~261*/ + for (; PPU_scanline < SCAN_LINE_DISPALY_END_NUM; PPU_scanline++) + { + if ((SpriteHitFlag == TRUE) && ((PPU_Reg.R2 & R2_SPR0_HIT) == 0)) + { clocks = sprite[0].x * CLOCKS_PER_SCANLINE / NES_DISP_WIDTH; exec6502(clocks); PPU_Reg.R2 |= R2_SPR0_HIT; exec6502(CLOCKS_PER_SCANLINE - clocks); - }else{ - exec6502(CLOCKS_PER_SCANLINE); + } + else + { + exec6502(CLOCKS_PER_SCANLINE); } - if(PPU_Reg.R1 & (R1_BG_VISIBLE | R1_SPR_VISIBLE)){ //???????????? - if(SpriteHitFlag == FALSE) - NES_GetSpr0HitFlag(PPU_scanline - SCAN_LINE_DISPALY_START_NUM); //????Sprite #0 ?????? + if (PPU_Reg.R1 & (R1_BG_VISIBLE | R1_SPR_VISIBLE)) + { //???????????? + if (SpriteHitFlag == FALSE) + NES_GetSpr0HitFlag(PPU_scanline - SCAN_LINE_DISPALY_START_NUM); //????Sprite #0 ?????? + } + if (FrameCnt & 2) + { //?2??????? + NES_RenderLine(PPU_scanline - SCAN_LINE_DISPALY_START_NUM); //????????????? } - // if(FrameCnt & 2){ //?2??????? - NES_RenderLine(PPU_scanline - SCAN_LINE_DISPALY_START_NUM); //????????????? - // } } /* scanline: 262 ?????*/ exec6502(CLOCKS_PER_SCANLINE); - PPU_Reg.R2 |= R2_VBlank_Flag; //????VBANK ??? - /*?????PPU VBANK?§Ø????????VBANK*/ - if(PPU_Reg.R0 & R0_VB_NMI_EN){ - NMI_Flag = SET1; //???????Ñk????NMI?§Ø? + PPU_Reg.R2 |= R2_VBlank_Flag; //????VBANK ??? + /*?????PPU VBANK?��????????VBANK*/ + if (PPU_Reg.R0 & R0_VB_NMI_EN) + { + NMI_Flag = SET1; //???????�k????NMI?��? } - /*?????IRQ????????????????APU??*/ - - /* A mapper function in V-Sync ?›¥???§Ý????VBANK???*/ -// MapperVSync(); - + /*?????IRQ????????????????APU??*/ + + /* A mapper function in V-Sync ?��???��????VBANK???*/ + // MapperVSync(); + /*?????????JoyPad??,????JoyPad???????*/ -// NES_JoyPadUpdateValue(); //systick ?§Ø???????? + // NES_JoyPadUpdateValue(); //systick ?��???????? /*?????????????????????*/ -// if(){ -// Continue = FALSE; -// } + // if(){ + // Continue = FALSE; + // } u_sleep_ms(1); } } /** - * @brief NES_Main program. - * @param None - * @retval None - */ -void nes_main(void) -{ - NesHeader *neshreader = (NesHeader *) rom_file; - -/* ????NES??????????0x1A????????0x1a??Ctrl+Z,???????????????????? - * ???????strcncmp????3?????? + * @brief NES_Main program. + * @param None + * @retval None */ - if(strncmp(neshreader->filetype, "NES", 3) != 0){ - printf("\r\n???¦Ä???????????????, NES??????????"); +void nes_main(void) +{ + NesHeader *neshreader = (NesHeader *)rom_file; + + /* ????NES??????????0x1A????????0x1a??Ctrl+Z,???????????????????? + * ???????strcncmp????3?????? + */ + if (strncmp(neshreader->filetype, "NES", 3) != 0) + { + printf("\r\n???��???????????????, NES??????????"); return; - }else{ - printf("\r\n?????????¨À?"); + } + else + { + printf("\r\n?????????��?"); printf("\r\n 16kB ROM ?????: %d", neshreader->romnum); printf("\r\n 8kB VROM ?????: %d", neshreader->vromnum); - if((neshreader->romfeature & 0x01) == 0){ + if ((neshreader->romfeature & 0x01) == 0) + { printf("\r\n ??????"); - }else{ - printf("\r\n ???????"); + } + else + { + printf("\r\n ???????"); } - if((neshreader->romfeature & 0x02) == 0){ + if ((neshreader->romfeature & 0x02) == 0) + { printf("\r\n ?????SRAM"); - }else{ - printf("\r\n ?§Þ???SRAM"); + } + else + { + printf("\r\n ?��???SRAM"); } - if((neshreader->romfeature & 0x04) == 0){ + if ((neshreader->romfeature & 0x04) == 0) + { printf("\r\n ??512????trainer($7000-$71FF)"); - }else{ - printf("\r\n ??512????trainer(ROM?????????)"); + } + else + { + printf("\r\n ??512????trainer(ROM?????????)"); } - if((neshreader->romfeature & 0x08) == 0){ + if ((neshreader->romfeature & 0x08) == 0) + { printf("\r\n 2???VRAM????"); - }else{ - printf("\r\n 4???VRAM????(??????)"); + } + else + { + printf("\r\n 4???VRAM????(??????)"); } - printf("\r\n iNES Mapper Numbers: %d", (neshreader->rommappernum & 0xF0)|( neshreader->romfeature >> 4)); + printf("\r\n iNES Mapper Numbers: %d", (neshreader->rommappernum & 0xF0) | (neshreader->romfeature >> 4)); } - -/* - *?????nes ????? - */ - init6502mem( 0, /*exp_rom*/ - 0, /*sram ??????????, ??????*/ - (&rom_file[0x10]), /*prg_rombank, ?›¥????§³ ??????????*/ - neshreader->romnum - ); //?????6502?›¥?????? + + /* + *?????nes ????? + */ + init6502mem(0, /*exp_rom*/ + 0, /*sram ??????????, ??????*/ + (&rom_file[0x10]), /*prg_rombank, ?��????�� ??????????*/ + neshreader->romnum); //?????6502?��?????? reset6502(); - PPU_Init((&rom_file[0x10] + (neshreader->romnum * 0x4000)), (neshreader->romfeature & 0x01)); /*PPU_?????*/ + PPU_Init((&rom_file[0x10] + (neshreader->romnum * 0x4000)), (neshreader->romfeature & 0x01)); /*PPU_?????*/ NES_JoyPadInit(); -/* - *nes ???????????? - */ + /* + *nes ???????????? + */ NesFrameCycle(); } - /** - * @} - */ - +/** + * @} + */ /*******************************END OF FILE***********************************/ diff --git a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/ports/InfoNES_system.c b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/ports/InfoNES_system.c index 7aa47353a..604027b5b 100644 --- a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/ports/InfoNES_system.c +++ b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/infoNES/ports/InfoNES_system.c @@ -4,9 +4,10 @@ #include "InfoNES.h" #include "InfoNES_System.h" #include +#include // #include "UserMain.h" -#include - +// #include +extern void nes_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color); /*-------------------------------------------------------------------*/ /* Palette data */ /*-------------------------------------------------------------------*/ @@ -150,7 +151,7 @@ void InfoNES_LoadFrame() void InfoNES_LoadLine() { // BSP_LCD_DrawBitmap(32, PPU_Scanline, 256, 1, WorkLine); - lcd_color_fill(32, PPU_Scanline, 32 + 256, PPU_Scanline, WorkLine); + nes_lcd_color_fill(32, PPU_Scanline, 32 + 256, PPU_Scanline, WorkLine); } /* Get a joypad state */ void InfoNES_PadState(DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem) diff --git a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/main.c b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/main.c index 33f1d337f..1aca5f341 100644 --- a/mkrtos_user/server/drv/ATSURFF437/nes_simulator/main.c +++ b/mkrtos_user/server/drv/ATSURFF437/nes_simulator/main.c @@ -6,12 +6,36 @@ #include #include #include -// #include +#ifndef INFONES +#include +#else #include +#endif void delay_ms(int ms) { u_sleep_ms(ms); } +#ifdef INFONES +#define BGR565TORGB565(a) (((a) >> 11) | ((a) & (0x3f << 5)) | (a & 0x1f) << 11) +void nes_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color) +{ + uint16_t height, width; + uint16_t i, j; + + width = ex - sx + 1; + height = ey - sy + 1; + + lcd_windows_set(sx, sy, ex, ey); + + for (i = 0; i < height; i++) + { + for (j = 0; j < width; j++) + { + lcd_data_16bit_write(BGR565TORGB565(color[i * width + j])); + } + } +} +#endif void NES_LCD_DisplayLine(int y_axes, uint16_t *Disaplyline_buffer) { lcd_color_fill(0, y_axes, 256, y_axes, Disaplyline_buffer); @@ -58,11 +82,14 @@ int main(int argc, char *argv[]) #endif while (1) { - // nes_main(); +#ifndef INFONES + nes_main(); +#else if (InfoNES_Load(NULL) == 0) { FrameSkip = 2; InfoNES_Main(); } +#endif } }