整理代码
This commit is contained in:
@@ -1,330 +1,279 @@
|
||||
#ifndef __LCD_H
|
||||
#define __LCD_H
|
||||
#define __LCD_H
|
||||
|
||||
#include "stm32f4xx.h"
|
||||
|
||||
#define LCD_CLK 9 // <20><><EFBFBD><EFBFBD>LCD<43><44><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵӦ<D6B5><D3A6>10-70֮<30>䣬<EFBFBD><E4A3AC>λΪM
|
||||
|
||||
#define LCD_CLK 9 //<2F><><EFBFBD><EFBFBD>LCD<43><44><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵӦ<D6B5><D3A6>10-70֮<30>䣬<EFBFBD><E4A3AC>λΪM
|
||||
#define HBP 40
|
||||
#define VBP 8
|
||||
#define HSW 1
|
||||
#define VSW 1
|
||||
#define HFP 5
|
||||
#define VFP 8
|
||||
|
||||
#define HBP 40
|
||||
#define VBP 8
|
||||
#define HSW 1
|
||||
#define VSW 1
|
||||
#define HFP 5
|
||||
#define VFP 8
|
||||
#define LCD_Width 480 // LCD<43><44><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>
|
||||
#define LCD_Height 272 // LCD<43><44><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>
|
||||
#define LCD_Pixels (LCD_Width * LCD_Height) // <20>ֱ<EFBFBD><D6B1><EFBFBD>
|
||||
#define LCD_MemoryAdd 0xD0000000 // <20>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
|
||||
#define LCD_Width 480 //LCD<43><44><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>
|
||||
#define LCD_Height 272 //LCD<43><44><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>
|
||||
#define LCD_Pixels (LCD_Width*LCD_Height) //<2F>ֱ<EFBFBD><D6B1><EFBFBD>
|
||||
#define LCD_MemoryAdd 0xD0000000 //<2F>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
|
||||
// <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
|
||||
// <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
|
||||
// <09><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>emWinʹ<6E><CAB9>32λɫ<CEBB><C9AB>ʽʱ<CABD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||||
// <09><><EFBFBD>㷽<EFBFBD><E3B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<32><CEBB>ɫ<EFBFBD><C9AB>ʽΪ<CABD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ռ4<D5BC>ֽڣ<D6BD>ʹ<EFBFBD><CAB9>emWin<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>Ϊ<EFBFBD><CEAA>480*272*4*3
|
||||
//
|
||||
#define LCD_MemoryAdd_OFFSET ((uint32_t)LCD_Width*LCD_Height*4*3)
|
||||
#define LCD_MemoryAdd_OFFSET ((uint32_t)LCD_Width * LCD_Height * 4 * 3)
|
||||
|
||||
|
||||
/*---------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------------*/
|
||||
void LCD_Init(void);
|
||||
void LCD_Backlight (u8 power);
|
||||
/*---------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------------*/
|
||||
void LCD_Init(void);
|
||||
void LCD_Backlight(u8 power);
|
||||
|
||||
/*-----------------------<2D><><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD>--------------------------*/
|
||||
|
||||
//IO<49><4F>ʱ<EFBFBD><CAB1>
|
||||
#define LCD_GPIO_CLK RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD \
|
||||
| RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOK | RCC_AHB1Periph_GPIOI
|
||||
// IO<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
#define LCD_GPIO_CLK \
|
||||
RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | \
|
||||
RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOK | \
|
||||
RCC_AHB1Periph_GPIOI
|
||||
|
||||
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_R0_PORT GPIOI
|
||||
#define LTDC_R0_PIN GPIO_Pin_15
|
||||
#define LTDC_R0_PINSOURCE GPIO_PinSource15
|
||||
// <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_R0_PORT GPIOI
|
||||
#define LTDC_R0_PIN GPIO_Pin_15
|
||||
#define LTDC_R0_PINSOURCE GPIO_PinSource15
|
||||
|
||||
#define LTDC_R1_PORT GPIOJ
|
||||
#define LTDC_R1_PIN GPIO_Pin_0
|
||||
#define LTDC_R1_PINSOURCE GPIO_PinSource0
|
||||
#define LTDC_R1_PORT GPIOJ
|
||||
#define LTDC_R1_PIN GPIO_Pin_0
|
||||
#define LTDC_R1_PINSOURCE GPIO_PinSource0
|
||||
|
||||
#define LTDC_R2_PORT GPIOJ
|
||||
#define LTDC_R2_PIN GPIO_Pin_1
|
||||
#define LTDC_R2_PINSOURCE GPIO_PinSource1
|
||||
#define LTDC_R2_PORT GPIOJ
|
||||
#define LTDC_R2_PIN GPIO_Pin_1
|
||||
#define LTDC_R2_PINSOURCE GPIO_PinSource1
|
||||
|
||||
#define LTDC_R3_PORT GPIOJ
|
||||
#define LTDC_R3_PIN GPIO_Pin_2
|
||||
#define LTDC_R3_PINSOURCE GPIO_PinSource2
|
||||
#define LTDC_R3_PORT GPIOJ
|
||||
#define LTDC_R3_PIN GPIO_Pin_2
|
||||
#define LTDC_R3_PINSOURCE GPIO_PinSource2
|
||||
|
||||
#define LTDC_R4_PORT GPIOJ
|
||||
#define LTDC_R4_PIN GPIO_Pin_3
|
||||
#define LTDC_R4_PINSOURCE GPIO_PinSource3
|
||||
#define LTDC_R4_PORT GPIOJ
|
||||
#define LTDC_R4_PIN GPIO_Pin_3
|
||||
#define LTDC_R4_PINSOURCE GPIO_PinSource3
|
||||
|
||||
#define LTDC_R5_PORT GPIOJ
|
||||
#define LTDC_R5_PIN GPIO_Pin_4
|
||||
#define LTDC_R5_PINSOURCE GPIO_PinSource4
|
||||
#define LTDC_R5_PORT GPIOJ
|
||||
#define LTDC_R5_PIN GPIO_Pin_4
|
||||
#define LTDC_R5_PINSOURCE GPIO_PinSource4
|
||||
|
||||
#define LTDC_R6_PORT GPIOJ
|
||||
#define LTDC_R6_PIN GPIO_Pin_5
|
||||
#define LTDC_R6_PINSOURCE GPIO_PinSource5
|
||||
#define LTDC_R6_PORT GPIOJ
|
||||
#define LTDC_R6_PIN GPIO_Pin_5
|
||||
#define LTDC_R6_PINSOURCE GPIO_PinSource5
|
||||
|
||||
#define LTDC_R7_PORT GPIOJ
|
||||
#define LTDC_R7_PIN GPIO_Pin_6
|
||||
#define LTDC_R7_PINSOURCE GPIO_PinSource6
|
||||
#define LTDC_R7_PORT GPIOJ
|
||||
#define LTDC_R7_PIN GPIO_Pin_6
|
||||
#define LTDC_R7_PINSOURCE GPIO_PinSource6
|
||||
|
||||
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_G0_PORT GPIOJ
|
||||
#define LTDC_G0_PIN GPIO_Pin_7
|
||||
#define LTDC_G0_PINSOURCE GPIO_PinSource7
|
||||
// <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_G0_PORT GPIOJ
|
||||
#define LTDC_G0_PIN GPIO_Pin_7
|
||||
#define LTDC_G0_PINSOURCE GPIO_PinSource7
|
||||
|
||||
#define LTDC_G1_PORT GPIOJ
|
||||
#define LTDC_G1_PIN GPIO_Pin_8
|
||||
#define LTDC_G1_PINSOURCE GPIO_PinSource8
|
||||
#define LTDC_G1_PORT GPIOJ
|
||||
#define LTDC_G1_PIN GPIO_Pin_8
|
||||
#define LTDC_G1_PINSOURCE GPIO_PinSource8
|
||||
|
||||
#define LTDC_G2_PORT GPIOJ
|
||||
#define LTDC_G2_PIN GPIO_Pin_9
|
||||
#define LTDC_G2_PINSOURCE GPIO_PinSource9
|
||||
#define LTDC_G2_PORT GPIOJ
|
||||
#define LTDC_G2_PIN GPIO_Pin_9
|
||||
#define LTDC_G2_PINSOURCE GPIO_PinSource9
|
||||
|
||||
#define LTDC_G3_PORT GPIOJ
|
||||
#define LTDC_G3_PIN GPIO_Pin_10
|
||||
#define LTDC_G3_PINSOURCE GPIO_PinSource10
|
||||
#define LTDC_G3_PORT GPIOJ
|
||||
#define LTDC_G3_PIN GPIO_Pin_10
|
||||
#define LTDC_G3_PINSOURCE GPIO_PinSource10
|
||||
|
||||
#define LTDC_G4_PORT GPIOJ
|
||||
#define LTDC_G4_PIN GPIO_Pin_11
|
||||
#define LTDC_G4_PINSOURCE GPIO_PinSource11
|
||||
#define LTDC_G4_PORT GPIOJ
|
||||
#define LTDC_G4_PIN GPIO_Pin_11
|
||||
#define LTDC_G4_PINSOURCE GPIO_PinSource11
|
||||
|
||||
#define LTDC_G5_PORT GPIOK
|
||||
#define LTDC_G5_PIN GPIO_Pin_0
|
||||
#define LTDC_G5_PINSOURCE GPIO_PinSource0
|
||||
#define LTDC_G5_PORT GPIOK
|
||||
#define LTDC_G5_PIN GPIO_Pin_0
|
||||
#define LTDC_G5_PINSOURCE GPIO_PinSource0
|
||||
|
||||
#define LTDC_G6_PORT GPIOK
|
||||
#define LTDC_G6_PIN GPIO_Pin_1
|
||||
#define LTDC_G6_PINSOURCE GPIO_PinSource1
|
||||
#define LTDC_G6_PORT GPIOK
|
||||
#define LTDC_G6_PIN GPIO_Pin_1
|
||||
#define LTDC_G6_PINSOURCE GPIO_PinSource1
|
||||
|
||||
#define LTDC_G7_PORT GPIOK
|
||||
#define LTDC_G7_PIN GPIO_Pin_2
|
||||
#define LTDC_G7_PINSOURCE GPIO_PinSource2
|
||||
#define LTDC_G7_PORT GPIOK
|
||||
#define LTDC_G7_PIN GPIO_Pin_2
|
||||
#define LTDC_G7_PINSOURCE GPIO_PinSource2
|
||||
|
||||
//<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_B0_PORT GPIOJ
|
||||
#define LTDC_B0_PIN GPIO_Pin_12
|
||||
#define LTDC_B0_PINSOURCE GPIO_PinSource12
|
||||
// <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_B0_PORT GPIOJ
|
||||
#define LTDC_B0_PIN GPIO_Pin_12
|
||||
#define LTDC_B0_PINSOURCE GPIO_PinSource12
|
||||
|
||||
#define LTDC_B1_PORT GPIOJ
|
||||
#define LTDC_B1_PIN GPIO_Pin_13
|
||||
#define LTDC_B1_PINSOURCE GPIO_PinSource13
|
||||
#define LTDC_B1_PORT GPIOJ
|
||||
#define LTDC_B1_PIN GPIO_Pin_13
|
||||
#define LTDC_B1_PINSOURCE GPIO_PinSource13
|
||||
|
||||
#define LTDC_B2_PORT GPIOJ
|
||||
#define LTDC_B2_PIN GPIO_Pin_14
|
||||
#define LTDC_B2_PINSOURCE GPIO_PinSource14
|
||||
#define LTDC_B2_PORT GPIOJ
|
||||
#define LTDC_B2_PIN GPIO_Pin_14
|
||||
#define LTDC_B2_PINSOURCE GPIO_PinSource14
|
||||
|
||||
#define LTDC_B3_PORT GPIOJ
|
||||
#define LTDC_B3_PIN GPIO_Pin_15
|
||||
#define LTDC_B3_PINSOURCE GPIO_PinSource15
|
||||
#define LTDC_B3_PORT GPIOJ
|
||||
#define LTDC_B3_PIN GPIO_Pin_15
|
||||
#define LTDC_B3_PINSOURCE GPIO_PinSource15
|
||||
|
||||
#define LTDC_B4_PORT GPIOK
|
||||
#define LTDC_B4_PIN GPIO_Pin_3
|
||||
#define LTDC_B4_PINSOURCE GPIO_PinSource3
|
||||
#define LTDC_B4_PORT GPIOK
|
||||
#define LTDC_B4_PIN GPIO_Pin_3
|
||||
#define LTDC_B4_PINSOURCE GPIO_PinSource3
|
||||
|
||||
#define LTDC_B5_PORT GPIOK
|
||||
#define LTDC_B5_PIN GPIO_Pin_4
|
||||
#define LTDC_B5_PINSOURCE GPIO_PinSource4
|
||||
#define LTDC_B5_PORT GPIOK
|
||||
#define LTDC_B5_PIN GPIO_Pin_4
|
||||
#define LTDC_B5_PINSOURCE GPIO_PinSource4
|
||||
|
||||
#define LTDC_B6_PORT GPIOK
|
||||
#define LTDC_B6_PIN GPIO_Pin_5
|
||||
#define LTDC_B6_PINSOURCE GPIO_PinSource5
|
||||
#define LTDC_B6_PORT GPIOK
|
||||
#define LTDC_B6_PIN GPIO_Pin_5
|
||||
#define LTDC_B6_PINSOURCE GPIO_PinSource5
|
||||
|
||||
#define LTDC_B7_PORT GPIOK
|
||||
#define LTDC_B7_PIN GPIO_Pin_6
|
||||
#define LTDC_B7_PINSOURCE GPIO_PinSource6
|
||||
#define LTDC_B7_PORT GPIOK
|
||||
#define LTDC_B7_PIN GPIO_Pin_6
|
||||
#define LTDC_B7_PINSOURCE GPIO_PinSource6
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
|
||||
#define LTDC_CLK_PORT GPIOI //LCDʱ<44><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_CLK_PIN GPIO_Pin_14
|
||||
#define LTDC_CLK_PINSOURCE GPIO_PinSource14
|
||||
|
||||
#define LTDC_HSYNC_PORT GPIOI //<2F><>ͬ<EFBFBD><CDAC>
|
||||
#define LTDC_HSYNC_PIN GPIO_Pin_12
|
||||
#define LTDC_HSYNC_PINSOURCE GPIO_PinSource12
|
||||
|
||||
#define LTDC_VSYNC_PORT GPIOI //֡ͬ<D6A1><CDAC>
|
||||
#define LTDC_VSYNC_PIN GPIO_Pin_13
|
||||
#define LTDC_VSYNC_PINSOURCE GPIO_PinSource13
|
||||
|
||||
#define LTDC_DE_PORT GPIOK //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
||||
#define LTDC_DE_PIN GPIO_Pin_7
|
||||
#define LTDC_DE_PINSOURCE GPIO_PinSource7
|
||||
|
||||
#define LTDC_Black_PORT GPIOD //<2F><><EFBFBD><EFBFBD>
|
||||
#define LTDC_Black_PIN GPIO_Pin_13
|
||||
|
||||
|
||||
|
||||
#define COLOR565TO888(color) ((((color)&0xf800)<<8)|((color)&0x07e0)<<5|(((color)&0x001f)<<3))
|
||||
#define COLOR888TO565(color) ((((color)>>8)&0xf800)|(((color)>>5)&0x07e0)|(((color)>>3)&0x001f))
|
||||
//<2F><>RGBת<42><D7AA>Ϊ565<36><35>ʽ
|
||||
#define RGB(r,g,b) ((((r)>>3)<<11)|(((g)>>2)<<5)|((b)>>3))
|
||||
//RGBת<42>Ҷ<EFBFBD>
|
||||
#define RGB2GRAY(rgb16) (((((rgb16)&0xf800)>>8)+(((rgb16)&0x07e0)>>3)+(((rgb16)&0x001f)<<3))/3)
|
||||
//<2F>Ҷ<EFBFBD>תRGB
|
||||
#define GRAY2RGB(gray) ((((gray)>>3)<<11)|(((gray)>>2)<<5)|((gray)>>3))
|
||||
|
||||
//#define U8 unsigned char
|
||||
//#define U16 unsigned short
|
||||
//#define U32 unsigned
|
||||
|
||||
|
||||
//extern u32* LCD_ADDR;
|
||||
//extern u32* LCD_ADDR1;
|
||||
|
||||
|
||||
//typedef struct
|
||||
//{
|
||||
// u32 BackColor; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
||||
// u32 Color; //ǰ<><C7B0><EFBFBD><EFBFBD>ɫ
|
||||
// u32 ScreenDis; //<2F><>Ļ<EFBFBD><C4BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>1
|
||||
// u32 DrawMode; //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ɫʱ<C9AB><CAB1><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>ɫ<EFBFBD><C9AB>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ɫʱ<C9AB><CAB1><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>ɫ
|
||||
// u16 *DrawAddr; //<2F><><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ַ
|
||||
// u32 LcdAddr; //<2F><>ǰָ<C7B0><D6B8><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>л<EFBFBD>
|
||||
// u32 LcdSwitchEn; //1,<2C><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>LcdAddrָ<72><D6B8><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ַ<EFBFBD><D6B7>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
||||
// int LayerBuffEnter; //<2F><><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
// int WindowSrcX; //<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
// int WindowSrcY; //
|
||||
// int WindowDstX;
|
||||
// int WindowDstY;
|
||||
//} LCD_Struct;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int xs;
|
||||
int ys;
|
||||
int xe;
|
||||
int ye;
|
||||
}LCD_WindowStruct;
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int x_size;
|
||||
int y_size;
|
||||
int color;
|
||||
int bkColor;
|
||||
int effective; //1<><31><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD>Ч
|
||||
LCD_WindowStruct win;
|
||||
LCD_WindowStruct realwin;
|
||||
u16 *draw;
|
||||
u16 *show;
|
||||
void(*fresh)(void);
|
||||
int LcdSwitchEn;
|
||||
int LayerBuffEnter;
|
||||
}LCD_Struct;
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_CLK_PORT GPIOI // LCDʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LTDC_CLK_PIN GPIO_Pin_14
|
||||
#define LTDC_CLK_PINSOURCE GPIO_PinSource14
|
||||
|
||||
#define LTDC_HSYNC_PORT GPIOI // <20><>ͬ<EFBFBD><CDAC>
|
||||
#define LTDC_HSYNC_PIN GPIO_Pin_12
|
||||
#define LTDC_HSYNC_PINSOURCE GPIO_PinSource12
|
||||
|
||||
#define LTDC_VSYNC_PORT GPIOI // ֡ͬ<D6A1><CDAC>
|
||||
#define LTDC_VSYNC_PIN GPIO_Pin_13
|
||||
#define LTDC_VSYNC_PINSOURCE GPIO_PinSource13
|
||||
|
||||
#define LTDC_DE_PORT GPIOK // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
||||
#define LTDC_DE_PIN GPIO_Pin_7
|
||||
#define LTDC_DE_PINSOURCE GPIO_PinSource7
|
||||
|
||||
#define LTDC_Black_PORT GPIOD // <20><><EFBFBD><EFBFBD>
|
||||
#define LTDC_Black_PIN GPIO_Pin_13
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
int xs;
|
||||
int ys;
|
||||
int xe;
|
||||
int ye;
|
||||
} LCD_WindowStruct;
|
||||
|
||||
typedef struct {
|
||||
int x_size;
|
||||
int y_size;
|
||||
int color;
|
||||
int bkColor;
|
||||
int effective; // 1<><31><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD>Ч
|
||||
LCD_WindowStruct win;
|
||||
LCD_WindowStruct realwin;
|
||||
u16 *draw;
|
||||
u16 *show;
|
||||
void (*fresh)(void);
|
||||
int LcdSwitchEn;
|
||||
int LayerBuffEnter;
|
||||
} LCD_Struct;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<43><44><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
//
|
||||
void LCD_LayerInit(void);
|
||||
|
||||
// <20><>ȡͼ<C8A1><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ַ
|
||||
u32 *LCD_GetShowAddr(void);
|
||||
|
||||
//<2F><>ȡͼ<C8A1><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ַ
|
||||
u32 *LCD_GetShowAddr (void);
|
||||
// <EFBFBD><EFBFBD>ȡͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ַ
|
||||
u32 *LCD_GetDrawAddr(void);
|
||||
|
||||
//<2F><>ȡͼ<C8A1><CDBC><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ַ
|
||||
u32 *LCD_GetDrawAddr (void);
|
||||
u32 LCD_SetLayer(u32 AddrIndex);
|
||||
|
||||
u32 LCD_SetDrawLayer(u32 Index);
|
||||
|
||||
u32 LCD_SetLayer (u32 AddrIndex);
|
||||
u32 LCD_SetLcdColor(u32 color);
|
||||
|
||||
u32 LCD_SetDrawLayer (u32 Index);
|
||||
u32 LCD_SetLcdBkColor(u32 color);
|
||||
|
||||
u32 LCD_SetLcdColor (u32 color);
|
||||
u32 LCD_SetLcdColor16(u32 color);
|
||||
|
||||
u32 LCD_SetLcdBkColor (u32 color);
|
||||
u32 LCD_SetLcdBkColor16(u32 color);
|
||||
|
||||
u32 LCD_SetLcdColor16 (u32 color);
|
||||
u32 LCD_GetLcdColor(void);
|
||||
|
||||
u32 LCD_SetLcdBkColor16 (u32 color);
|
||||
u32 LCD_GetLcdBkColor(void);
|
||||
|
||||
u32 LCD_GetLcdColor (void);
|
||||
u32 LCD_GetLcdColor16(void);
|
||||
|
||||
u32 LCD_GetLcdBkColor (void);
|
||||
u32 LCD_GetLcdBkColor16(void);
|
||||
|
||||
u32 LCD_GetLcdColor16 (void);
|
||||
// <20>㸴<EFBFBD><E3B8B4>
|
||||
void LCD_LayerCopy(int dst, int src);
|
||||
|
||||
u32 LCD_GetLcdBkColor16 (void);
|
||||
// <20><>ʼ<EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_LayerBufferOn(void);
|
||||
|
||||
//<2F>㸴<EFBFBD><EFBFBD>
|
||||
void LCD_LayerCopy (int dst,int src);
|
||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_LayerBuffShow(void);
|
||||
|
||||
//<2F><>ʼ<EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_LayerBufferOn (void);
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><EFBFBD>
|
||||
int LCD_GetLayerUpdataStat(void);
|
||||
|
||||
//<2F><>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_LayerBuffShow (void);
|
||||
// <EFBFBD><EFBFBD><EFBFBD>뻺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_EnterLayerBuff(void);
|
||||
|
||||
//<2F><>ȡ<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><EFBFBD>
|
||||
int LCD_GetLayerUpdataStat (void);
|
||||
// <20>л<EFBFBD><D0BB>㣬<EFBFBD><E3A3AC><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶʱ<EFBFBD><EFBFBD>
|
||||
void LCD_SwitchLayerBuff(void);
|
||||
|
||||
//<2F><><EFBFBD>뻺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_EnterLayerBuff (void);
|
||||
// <20>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_ExitLayerBuff(void);
|
||||
|
||||
//<EFBFBD>л<EFBFBD><EFBFBD>㣬<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶʱ<EFBFBD><EFBFBD>
|
||||
void LCD_SwitchLayerBuff (void);
|
||||
// <20><><EFBFBD>û<C3BB><EEB6AF><EFBFBD><EFBFBD>
|
||||
void LCD_SetWindow(int x_s, int y_s, int x_size, int y_size);
|
||||
|
||||
//<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_ExitLayerBuff (void);
|
||||
int LCD_GetWindowSizeX(void);
|
||||
|
||||
|
||||
//<2F><><EFBFBD>û<C3BB><EEB6AF><EFBFBD><EFBFBD>
|
||||
void LCD_SetWindow (int x_s,int y_s,int x_size,int y_size);
|
||||
|
||||
int LCD_GetWindowSizeX (void);
|
||||
|
||||
int LCD_GetWindowSizeY (void);
|
||||
int LCD_GetWindowSizeY(void);
|
||||
|
||||
int LCD_GetLcdSizeX(void);
|
||||
|
||||
int LCD_GetLcdSizeY (void);
|
||||
int LCD_GetLcdSizeY(void);
|
||||
|
||||
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ģʽ<C4A3><CABD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
||||
void LCD_SetLcdDrawMode (int mode);
|
||||
// <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_SetLcdDrawMode(int mode);
|
||||
|
||||
void LCD_Clear (void);
|
||||
void LCD_Clear(void);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʾ
|
||||
void LCD_ClearRect (int x,int y,int x_size,int y_size);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>ʾ
|
||||
void LCD_ClearRect(int x, int y, int x_size, int y_size);
|
||||
|
||||
void LCD_DrawPoint (int x,int y,u32 mode);
|
||||
void LCD_DrawPoint(int x, int y, u32 mode);
|
||||
|
||||
void LCD_DrawPointSafe (int x,int y,u32 mode);
|
||||
void LCD_DrawPointSafe(int x, int y, u32 mode);
|
||||
|
||||
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ɫ
|
||||
void LCD_DrawPointSafeColor (int x,int y,u16 color);
|
||||
// <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ɫ
|
||||
void LCD_DrawPointSafeColor(int x, int y, u16 color);
|
||||
|
||||
//<2F><>ָ<EFBFBD><D6B8>ɫ<C9AB><CDB8><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>0~32
|
||||
void LCD_DrawPointSafeColorAlpha (int x,int y,u16 color,u8 alpha);
|
||||
// <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>0~32
|
||||
void LCD_DrawPointSafeColorAlpha(int x, int y, u16 color, u8 alpha);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
|
||||
void LCD_FillRectByColor (int x,int y,int x_size,int y_size);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<EFBFBD><EFBFBD>
|
||||
void LCD_FillRectByColor(int x, int y, int x_size, int y_size);
|
||||
|
||||
//<2F><><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
|
||||
void LCD_FillRectByColorAlpha (int x,int y,int x_size,int y_size,u8 alpha);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<EFBFBD><EFBFBD>
|
||||
void LCD_FillRectByColorAlpha(int x, int y, int x_size, int y_size, u8 alpha);
|
||||
|
||||
//void LCD_FillRect16 (u16 *buff,int xsize,int ysize);
|
||||
// void LCD_FillRect16 (u16 *buff,int xsize,int ysize);
|
||||
|
||||
//void LCD_FillRectOff16 (u16 *buff,int x_s,int y_s,int xsize,int ysize);
|
||||
// void LCD_FillRectOff16 (u16 *buff,int x_s,int y_s,int xsize,int ysize);
|
||||
|
||||
void LCD_FillRectOff16At (int s_x,int s_y,int s_xsize,int s_ysize,u16 *buff,int x_s,int y_s,int xsize,int ysize);
|
||||
void LCD_FillRectOff16At(int s_x, int s_y, int s_xsize, int s_ysize, u16 *buff,
|
||||
int x_s, int y_s, int xsize, int ysize);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><CDB8><EFBFBD>ȵ<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
||||
void LCD_FillRectOffAtAlpha (int s_x,int s_y,int s_xsize,int s_ysize,void *buff,int x_s,int y_s,int xsize,int ysize);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void LCD_FillRectOffAtAlpha(int s_x, int s_y, int s_xsize, int s_ysize,
|
||||
void *buff, int x_s, int y_s, int xsize, int ysize);
|
||||
|
||||
void LCD_GetColors (u16 *buff,int x_s,int y_s,int x_size,int y_size);
|
||||
void LCD_GetColors(u16 *buff, int x_s, int y_s, int x_size, int y_size);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,534 +1,447 @@
|
||||
#include "main.h"
|
||||
#include "stm32f4xx.h"
|
||||
#include "nes_main.h"
|
||||
#include "nes_ppu.h"
|
||||
#include "nes_mapper.h"
|
||||
#include "nes_apu.h"
|
||||
#include "mymem.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "nes_main.h"
|
||||
#include "dac.h"
|
||||
#include "main.h"
|
||||
#include "mymem.h"
|
||||
#include "nes_apu.h"
|
||||
#include "nes_mapper.h"
|
||||
#include "nes_ppu.h"
|
||||
#include "stm32f4xx.h"
|
||||
|
||||
#include "ff.h"
|
||||
#include "string.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
u8 nes_frame_cnt; //nes֡<73><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int MapperNo; //map<61><70><EFBFBD><EFBFBD>
|
||||
int NES_scanline; //nesɨ<73><C9A8><EFBFBD><EFBFBD>
|
||||
uint8_t nes_frame_cnt; // nes֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int MapperNo; // map<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int NES_scanline; // nesɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int VROM_1K_SIZE;
|
||||
int VROM_8K_SIZE;
|
||||
|
||||
u8 PADdata; //<2F>ֱ<EFBFBD>1<EFBFBD><31>ֵ [7:0]<5D><>7 <20><>6 <20><>5 <20><>4 Start3 Select2 B1 A0
|
||||
u8 PADdata1; //<2F>ֱ<EFBFBD>2<EFBFBD><32>ֵ [7:0]<5D><>7 <20><>6 <20><>5 <20><>4 Start3 Select2 B1 A0
|
||||
u8 *NES_RAM; //<2F><><EFBFBD><EFBFBD>1024<32>ֽڶ<D6BD><DAB6><EFBFBD>
|
||||
u8 *NES_SRAM;
|
||||
NES_header *RomHeader; //rom<6F>ļ<EFBFBD>ͷ
|
||||
MAPPER *NES_Mapper;
|
||||
MapperCommRes *MAPx;
|
||||
uint8_t PADdata; // <EFBFBD>ֱ<EFBFBD>1<EFBFBD><EFBFBD>ֵ [7:0]<5D><>7 <20><>6 <20><>5 <20><>4 Start3 Select2 B1 A0
|
||||
uint8_t PADdata1; // <EFBFBD>ֱ<EFBFBD>2<EFBFBD><EFBFBD>ֵ [7:0]<5D><>7 <20><>6 <20><>5 <20><>4 Start3 Select2 B1 A0
|
||||
uint8_t *NES_RAM; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1024<EFBFBD>ֽڶ<EFBFBD><EFBFBD><EFBFBD>
|
||||
uint8_t *NES_SRAM;
|
||||
NES_header *RomHeader; // rom<EFBFBD>ļ<EFBFBD>ͷ
|
||||
MAPPER *NES_Mapper;
|
||||
MapperCommRes *MAPx;
|
||||
|
||||
uint8_t *spr_ram; // <20><><EFBFBD><EFBFBD>RAM,256<35>ֽ<EFBFBD>
|
||||
ppu_data *ppu; // ppuָ<75><D6B8>
|
||||
uint8_t *VROM_banks;
|
||||
uint8_t *VROM_tiles;
|
||||
|
||||
u8* spr_ram; //<2F><><EFBFBD><EFBFBD>RAM,256<35>ֽ<EFBFBD>
|
||||
ppu_data* ppu; //ppuָ<75><D6B8>
|
||||
u8* VROM_banks;
|
||||
u8* VROM_tiles;
|
||||
apu_t *apu; // apuָ<75><EFBFBD>
|
||||
uint16_t *wave_buffers;
|
||||
uint16_t *i2sbuf1; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,ռ<><D5BC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> 367*4 <20>ֽ<EFBFBD>@22050Hz
|
||||
uint16_t *i2sbuf2; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,ռ<><D5BC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> 367*4 <20>ֽ<EFBFBD>@22050Hz
|
||||
|
||||
apu_t *apu; //apuָ<75><D6B8>
|
||||
u16 *wave_buffers;
|
||||
u16 *i2sbuf1; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,ռ<><D5BC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> 367*4 <20>ֽ<EFBFBD>@22050Hz
|
||||
u16 *i2sbuf2; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,ռ<><D5BC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> 367*4 <20>ֽ<EFBFBD>@22050Hz
|
||||
|
||||
u8* romfile; //nes<65>ļ<EFBFBD>ָ<EFBFBD><D6B8>,ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nes<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ.
|
||||
uint8_t *romfile; // nes<65>ļ<EFBFBD>ָ<EFBFBD><D6B8>,ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nes<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ.
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//<2F><>¼nes<65>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
||||
static u8 g_nes_break=0;
|
||||
// <EFBFBD><EFBFBD>¼nes<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static uint8_t g_nes_break = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ROM
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// 1,<2C>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 3,map<61><70><EFBFBD><EFBFBD>
|
||||
u8 nes_load_rom(void)
|
||||
{
|
||||
u8* p;
|
||||
u8 i;
|
||||
u8 res=0;
|
||||
p=(u8*)romfile;
|
||||
if(strncmp((char*)p,"NES",3)==0)
|
||||
{
|
||||
RomHeader->ctrl_z=p[3];
|
||||
RomHeader->num_16k_rom_banks=p[4];
|
||||
RomHeader->num_8k_vrom_banks=p[5];
|
||||
RomHeader->flags_1=p[6];
|
||||
RomHeader->flags_2=p[7];
|
||||
if(RomHeader->flags_1&0x04)p+=512; //<2F><>512<31>ֽڵ<D6BD>trainer:
|
||||
if(RomHeader->num_8k_vrom_banks>0) //<2F><><EFBFBD><EFBFBD>VROM,<2C><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
|
||||
{
|
||||
VROM_banks=p+16+(RomHeader->num_16k_rom_banks*0x4000);
|
||||
#if NES_RAM_SPEED==1 //1:<3A>ڴ<EFBFBD>ռ<EFBFBD><D5BC>С 0:<3A>ٶȿ<D9B6>
|
||||
VROM_tiles=VROM_banks;
|
||||
#else
|
||||
VROM_tiles=mymalloc(RomHeader->num_8k_vrom_banks*8*1024);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1MB<EFBFBD>ڴ<EFBFBD>!!!
|
||||
if(VROM_tiles==0)VROM_tiles=VROM_banks;//<2F>ڴ治<DAB4><E6B2BB><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>VROM_titles<65><73>VROM_banks<6B><73><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
compile(RomHeader->num_8k_vrom_banks*8*1024/16,VROM_banks,VROM_tiles);
|
||||
#endif
|
||||
}else
|
||||
{
|
||||
VROM_banks=mymalloc(8*1024);
|
||||
VROM_tiles=mymalloc(8*1024);
|
||||
if(!VROM_banks||!VROM_tiles)res=1;
|
||||
}
|
||||
VROM_1K_SIZE = RomHeader->num_8k_vrom_banks * 8;
|
||||
VROM_8K_SIZE = RomHeader->num_8k_vrom_banks;
|
||||
MapperNo=(RomHeader->flags_1>>4)|(RomHeader->flags_2&0xf0);
|
||||
if(RomHeader->flags_2 & 0x0E)MapperNo=RomHeader->flags_1>>4;//<2F><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//printf("use map:%d\r\n",MapperNo);
|
||||
for(i=0;i<255;i++) // <20><><EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>Mapper<EFBFBD><EFBFBD>
|
||||
{
|
||||
if (MapTab[i]==MapperNo)break;
|
||||
if (MapTab[i]==-1)res=3;
|
||||
}
|
||||
if(res==0)
|
||||
{
|
||||
switch(MapperNo)
|
||||
{
|
||||
case 1:
|
||||
MAP1=mymalloc(sizeof(Mapper1Res));
|
||||
if(!MAP1)res=1;
|
||||
break;
|
||||
case 4:
|
||||
case 6:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 21:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
case 64:
|
||||
case 65:
|
||||
case 67:
|
||||
case 69:
|
||||
case 85:
|
||||
case 189:
|
||||
MAPx=mymalloc(sizeof(MapperCommRes));
|
||||
if(!MAPx)res=1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return res; //<2F><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD>NES_RAM<41><4D><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʱ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
// <20><><EFBFBD><EFBFBD>ROM
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// 1,<2C>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 3,map<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint8_t nes_load_rom(void) {
|
||||
uint8_t *p;
|
||||
uint8_t i;
|
||||
uint8_t res = 0;
|
||||
p = (uint8_t *)romfile;
|
||||
if (strncmp((char *)p, "NES", 3) == 0) {
|
||||
RomHeader->ctrl_z = p[3];
|
||||
RomHeader->num_16k_rom_banks = p[4];
|
||||
RomHeader->num_8k_vrom_banks = p[5];
|
||||
RomHeader->flags_1 = p[6];
|
||||
RomHeader->flags_2 = p[7];
|
||||
if (RomHeader->flags_1 & 0x04)
|
||||
p += 512; // <20><>512<31>ֽڵ<D6BD>trainer:
|
||||
if (RomHeader->num_8k_vrom_banks > 0) // <20><><EFBFBD><EFBFBD>VROM,<2C><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
|
||||
{
|
||||
VROM_banks = p + 16 + (RomHeader->num_16k_rom_banks * 0x4000);
|
||||
#if NES_RAM_SPEED == 1 // 1:<3A>ڴ<EFBFBD>ռ<EFBFBD><D5BC>С 0:<3A>ٶȿ<D9B6>
|
||||
VROM_tiles = VROM_banks;
|
||||
#else
|
||||
VROM_tiles = mymalloc(RomHeader->num_8k_vrom_banks * 8 *
|
||||
1024); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1MB<4D>ڴ<EFBFBD>!!!
|
||||
if (VROM_tiles == 0)
|
||||
VROM_tiles =
|
||||
VROM_banks; // <20>ڴ治<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VROM_titles<EFBFBD><EFBFBD>VROM_banks<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
compile(RomHeader->num_8k_vrom_banks * 8 * 1024 / 16, VROM_banks,
|
||||
VROM_tiles);
|
||||
#endif
|
||||
} else {
|
||||
VROM_banks = mymalloc(8 * 1024);
|
||||
VROM_tiles = mymalloc(8 * 1024);
|
||||
if (!VROM_banks || !VROM_tiles)
|
||||
res = 1;
|
||||
}
|
||||
VROM_1K_SIZE = RomHeader->num_8k_vrom_banks * 8;
|
||||
VROM_8K_SIZE = RomHeader->num_8k_vrom_banks;
|
||||
MapperNo = (RomHeader->flags_1 >> 4) | (RomHeader->flags_2 & 0xf0);
|
||||
if (RomHeader->flags_2 & 0x0E)
|
||||
MapperNo = RomHeader->flags_1 >> 4; // <20><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// printf("use map:%d\r\n",MapperNo);
|
||||
for (i = 0; i < 255; i++) // <20><><EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>Mapper<65><72>
|
||||
{
|
||||
if (MapTab[i] == MapperNo)
|
||||
break;
|
||||
if (MapTab[i] == -1)
|
||||
res = 3;
|
||||
}
|
||||
if (res == 0) {
|
||||
switch (MapperNo) {
|
||||
case 1:
|
||||
MAP1 = mymalloc(sizeof(Mapper1Res));
|
||||
if (!MAP1)
|
||||
res = 1;
|
||||
break;
|
||||
case 4:
|
||||
case 6:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 21:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
case 64:
|
||||
case 65:
|
||||
case 67:
|
||||
case 69:
|
||||
case 85:
|
||||
case 189:
|
||||
MAPx = mymalloc(sizeof(MapperCommRes));
|
||||
if (!MAPx)
|
||||
res = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return res; // <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>NES_RAM<41><4D><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʱ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
void *nes_ram_alignment;
|
||||
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
void nes_sram_free(void)
|
||||
{
|
||||
//myfree(NES_RAM);
|
||||
myfree(nes_ram_alignment);
|
||||
myfree(NES_SRAM);
|
||||
myfree(RomHeader);
|
||||
myfree(NES_Mapper);
|
||||
myfree(spr_ram);
|
||||
myfree(ppu);
|
||||
myfree(apu);
|
||||
myfree(wave_buffers);
|
||||
myfree(i2sbuf1);
|
||||
myfree(i2sbuf2);
|
||||
myfree(romfile);
|
||||
if((VROM_tiles!=VROM_banks)&&VROM_banks&&VROM_tiles)//<2F><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ΪVROM_banks<6B><73>VROM_tiles<65><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>,<2C><><EFBFBD>ͷ<EFBFBD>
|
||||
{
|
||||
myfree(VROM_banks);
|
||||
myfree(VROM_tiles);
|
||||
}
|
||||
switch (MapperNo)//<2F>ͷ<EFBFBD>map<61>ڴ<EFBFBD>
|
||||
{
|
||||
case 1: //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
myfree(MAP1);
|
||||
break;
|
||||
case 4:
|
||||
case 6:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 21:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
case 64:
|
||||
case 65:
|
||||
case 67:
|
||||
case 69:
|
||||
case 85:
|
||||
case 189:
|
||||
myfree(MAPx);break; //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
default:break;
|
||||
}
|
||||
NES_RAM=0;
|
||||
NES_SRAM=0;
|
||||
RomHeader=0;
|
||||
NES_Mapper=0;
|
||||
spr_ram=0;
|
||||
ppu=0;
|
||||
apu=0;
|
||||
wave_buffers=0;
|
||||
i2sbuf1=0;
|
||||
i2sbuf2=0;
|
||||
romfile=0;
|
||||
VROM_banks=0;
|
||||
VROM_tiles=0;
|
||||
MAP1=0;
|
||||
MAPx=0;
|
||||
}
|
||||
//ΪNES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
//romsize:nes<65>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||
// 1,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
u8 nes_sram_malloc(u32 romsize)
|
||||
{
|
||||
u16 i=0;
|
||||
|
||||
//NES_RAM<41><4D>Ҫ0x800<30><30>С<EFBFBD><D0A1><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x400<30><30><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>1024<32>ֽڶ<D6BD><DAB6><EFBFBD>
|
||||
nes_ram_alignment=mymalloc(0x800+0x400);
|
||||
NES_RAM=(void*)(((u32)nes_ram_alignment+0x400)&0xfffffc00);
|
||||
|
||||
NES_SRAM=mymalloc(0X2000);
|
||||
RomHeader=mymalloc(sizeof(NES_header));
|
||||
NES_Mapper=mymalloc(sizeof(MAPPER));
|
||||
spr_ram=mymalloc(0X100);
|
||||
ppu=mymalloc(sizeof(ppu_data));
|
||||
apu=mymalloc(sizeof(apu_t)); //sizeof(apu_t)= 12588
|
||||
wave_buffers=mymalloc(APU_PCMBUF_SIZE*2);
|
||||
i2sbuf1=mymalloc(APU_PCMBUF_SIZE*4+10);
|
||||
i2sbuf2=mymalloc(APU_PCMBUF_SIZE*4+10);
|
||||
romfile=mymalloc(romsize); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸrom<6F>ռ<EFBFBD>,<2C><><EFBFBD><EFBFBD>nes<65>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||
if(i==64||!NES_RAM||!NES_SRAM||!RomHeader||!NES_Mapper||!spr_ram||!ppu||!apu||!wave_buffers||!i2sbuf1||!i2sbuf2||!romfile)
|
||||
{
|
||||
nes_sram_free();
|
||||
return 1;
|
||||
}
|
||||
memset(NES_SRAM,0,0X2000); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(RomHeader,0,sizeof(NES_header)); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(NES_Mapper,0,sizeof(MAPPER)); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(spr_ram,0,0X100); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(ppu,0,sizeof(ppu_data)); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(apu,0,sizeof(apu_t)); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(wave_buffers,0,APU_PCMBUF_SIZE*2);//<2F><><EFBFBD><EFBFBD>
|
||||
memset(i2sbuf1,0,APU_PCMBUF_SIZE*4+10); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(i2sbuf2,0,APU_PCMBUF_SIZE*4+10); //<2F><><EFBFBD><EFBFBD>
|
||||
memset(romfile,0,romsize); //<2F><><EFBFBD><EFBFBD>
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int nes_xoff=0; //<2F><>ʾ<EFBFBD><CABE>x<EFBFBD>᷽<EFBFBD><E1B7BD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>(ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>=256-2*nes_xoff)
|
||||
int nes_yoff=0;
|
||||
|
||||
|
||||
|
||||
//<2F><>ʼnes<65><73>Ϸ
|
||||
//pname:nes<65><73>Ϸ·<CFB7><C2B7>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:
|
||||
//0,<2C><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
||||
//1,<2C>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
//2,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
//3,<2C><>֧<EFBFBD>ֵ<EFBFBD>map
|
||||
u8 nes_load(u8* pname,void *lcd_addr,int x,int y)
|
||||
{
|
||||
nes_xoff=x;
|
||||
nes_yoff=y;
|
||||
FIL *file;
|
||||
FILINFO *file_info;
|
||||
UINT br;
|
||||
u8 res=0;
|
||||
// app_wm8978_volset(wm8978set.mvol);
|
||||
// WM8978_ADDA_Cfg(1,0); //<2F><><EFBFBD><EFBFBD>DAC
|
||||
// WM8978_Input_Cfg(0,0,0);//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
|
||||
// WM8978_Output_Cfg(1,0); //<2F><><EFBFBD><EFBFBD>DAC<41><43><EFBFBD><EFBFBD>
|
||||
g_nes_break=0;
|
||||
file=mymalloc(sizeof(FIL));
|
||||
file_info= mymalloc(sizeof(FILINFO));
|
||||
if(file==0)return 1; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
||||
|
||||
res=f_stat((char*)pname,file_info);
|
||||
if(res!=FR_OK) //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
myfree(file);
|
||||
myfree(file_info);
|
||||
return 2;
|
||||
}
|
||||
res=nes_sram_malloc(file_info->fsize); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
if(res==0)
|
||||
{
|
||||
f_open(file,(char*)pname,FA_READ);
|
||||
f_read(file,romfile,file_info->fsize,&br); //<2F><>ȡnes<65>ļ<EFBFBD>
|
||||
res=nes_load_rom(); //<2F><><EFBFBD><EFBFBD>ROM
|
||||
if(res==0)
|
||||
{
|
||||
Mapper_Init(); //map<61><70>ʼ<EFBFBD><CABC>
|
||||
cpu6502_init(); //<2F><>ʼ<EFBFBD><CABC>6502,<2C><><EFBFBD><EFBFBD>λ
|
||||
PPU_reset(lcd_addr); //ppu<70><75>λ
|
||||
apu_init(); //apu<70><75>ʼ<EFBFBD><CABC>
|
||||
nes_sound_open(0,APU_SAMPLE_RATE); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
||||
nes_emulate_frame(); //<2F><><EFBFBD><EFBFBD>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
nes_sound_close(); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
f_close(file);
|
||||
myfree(file);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
myfree(file_info);
|
||||
nes_sram_free(); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD><D0B5><EFBFBD>Ϸ
|
||||
u8 nes_start(u8* file,int fileSize,void *lcd_addr,int x,int y)
|
||||
{
|
||||
nes_xoff=x;
|
||||
nes_yoff=y;
|
||||
u8 res=0;
|
||||
g_nes_break=0;
|
||||
res=nes_sram_malloc(fileSize); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
|
||||
if(res==0)
|
||||
{
|
||||
mymemcpy (romfile,file,fileSize);//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пռ<D0BF>
|
||||
res=nes_load_rom(); //<2F><><EFBFBD><EFBFBD>ROM
|
||||
if(res==0)
|
||||
{
|
||||
Mapper_Init(); //map<61><70>ʼ<EFBFBD><CABC>
|
||||
cpu6502_init(); //<2F><>ʼ<EFBFBD><CABC>6502,<2C><><EFBFBD><EFBFBD>λ
|
||||
PPU_reset(lcd_addr); //ppu<70><75>λ
|
||||
apu_init(); //apu<70><75>ʼ<EFBFBD><CABC>
|
||||
nes_sound_open(0,APU_SAMPLE_RATE); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
||||
nes_emulate_frame(); //<2F><><EFBFBD><EFBFBD>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
nes_sound_close(); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
nes_sram_free(); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||
void nes_set_window(void)
|
||||
{
|
||||
// <EFBFBD>ͷ<EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
void nes_sram_free(void) {
|
||||
// myfree(NES_RAM);
|
||||
myfree(nes_ram_alignment);
|
||||
myfree(NES_SRAM);
|
||||
myfree(RomHeader);
|
||||
myfree(NES_Mapper);
|
||||
myfree(spr_ram);
|
||||
myfree(ppu);
|
||||
myfree(apu);
|
||||
myfree(wave_buffers);
|
||||
myfree(i2sbuf1);
|
||||
myfree(i2sbuf2);
|
||||
myfree(romfile);
|
||||
if ((VROM_tiles != VROM_banks) && VROM_banks &&
|
||||
VROM_tiles) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ΪVROM_banks<EFBFBD><EFBFBD>VROM_tiles<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>,<2C><><EFBFBD>ͷ<EFBFBD>
|
||||
{
|
||||
myfree(VROM_banks);
|
||||
myfree(VROM_tiles);
|
||||
}
|
||||
switch (MapperNo) // <EFBFBD>ͷ<EFBFBD>map<EFBFBD>ڴ<EFBFBD>
|
||||
{
|
||||
case 1: // <EFBFBD>ͷ<EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
myfree(MAP1);
|
||||
break;
|
||||
case 4:
|
||||
case 6:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 21:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
case 64:
|
||||
case 65:
|
||||
case 67:
|
||||
case 69:
|
||||
case 85:
|
||||
case 189:
|
||||
myfree(MAPx);
|
||||
break; // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
default:
|
||||
break;
|
||||
}
|
||||
NES_RAM = 0;
|
||||
NES_SRAM = 0;
|
||||
RomHeader = 0;
|
||||
NES_Mapper = 0;
|
||||
spr_ram = 0;
|
||||
ppu = 0;
|
||||
apu = 0;
|
||||
wave_buffers = 0;
|
||||
i2sbuf1 = 0;
|
||||
i2sbuf2 = 0;
|
||||
romfile = 0;
|
||||
VROM_banks = 0;
|
||||
VROM_tiles = 0;
|
||||
MAP1 = 0;
|
||||
MAPx = 0;
|
||||
}
|
||||
//<2F><>ȡ<EFBFBD><EFBFBD>Ϸ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void nes_get_gamepadval(void)
|
||||
{
|
||||
// ΪNES<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
// romsize:nes<65>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||
// 1,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
uint8_t nes_sram_malloc(uint32_t romsize) {
|
||||
uint16_t i = 0;
|
||||
|
||||
// NES_RAM<41><4D>Ҫ0x800<30><30>С<EFBFBD><D0A1><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x400<30><30><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>1024<32>ֽڶ<D6BD><DAB6><EFBFBD>
|
||||
nes_ram_alignment = mymalloc(0x800 + 0x400);
|
||||
NES_RAM = (void *)(((uint32_t)nes_ram_alignment + 0x400) & 0xfffffc00);
|
||||
|
||||
NES_SRAM = mymalloc(0X2000);
|
||||
RomHeader = mymalloc(sizeof(NES_header));
|
||||
NES_Mapper = mymalloc(sizeof(MAPPER));
|
||||
spr_ram = mymalloc(0X100);
|
||||
ppu = mymalloc(sizeof(ppu_data));
|
||||
apu = mymalloc(sizeof(apu_t)); // sizeof(apu_t)= 12588
|
||||
wave_buffers = mymalloc(APU_PCMBUF_SIZE * 2);
|
||||
i2sbuf1 = mymalloc(APU_PCMBUF_SIZE * 4 + 10);
|
||||
i2sbuf2 = mymalloc(APU_PCMBUF_SIZE * 4 + 10);
|
||||
romfile = mymalloc(romsize); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸrom<6F>ռ<EFBFBD>,<2C><><EFBFBD><EFBFBD>nes<65>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||
if (i == 64 || !NES_RAM || !NES_SRAM || !RomHeader || !NES_Mapper ||
|
||||
!spr_ram || !ppu || !apu || !wave_buffers || !i2sbuf1 || !i2sbuf2 ||
|
||||
!romfile) {
|
||||
nes_sram_free();
|
||||
return 1;
|
||||
}
|
||||
memset(NES_SRAM, 0, 0X2000); // <20><><EFBFBD><EFBFBD>
|
||||
memset(RomHeader, 0, sizeof(NES_header)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(NES_Mapper, 0, sizeof(MAPPER)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(spr_ram, 0, 0X100); // <20><><EFBFBD><EFBFBD>
|
||||
memset(ppu, 0, sizeof(ppu_data)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(apu, 0, sizeof(apu_t)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(wave_buffers, 0, APU_PCMBUF_SIZE * 2); // <20><><EFBFBD><EFBFBD>
|
||||
memset(i2sbuf1, 0, APU_PCMBUF_SIZE * 4 + 10); // <20><><EFBFBD><EFBFBD>
|
||||
memset(i2sbuf2, 0, APU_PCMBUF_SIZE * 4 + 10); // <20><><EFBFBD><EFBFBD>
|
||||
memset(romfile, 0, romsize); // <20><><EFBFBD><EFBFBD>
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nes_xoff = 0; // <20><>ʾ<EFBFBD><CABE>x<EFBFBD>᷽<EFBFBD><E1B7BD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>(ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>=256-2*nes_xoff)
|
||||
int nes_yoff = 0;
|
||||
|
||||
// <20><>ʼnes<65><73>Ϸ
|
||||
// pname:nes<65><73>Ϸ·<CFB7><C2B7>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:
|
||||
// 0,<2C><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
||||
// 1,<2C>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 2,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 3,<2C><>֧<EFBFBD>ֵ<EFBFBD>map
|
||||
uint8_t nes_load(uint8_t *pname, void *lcd_addr, int x, int y) {
|
||||
nes_xoff = x;
|
||||
nes_yoff = y;
|
||||
FIL *file;
|
||||
FILINFO *file_info;
|
||||
UINT br;
|
||||
uint8_t res = 0;
|
||||
g_nes_break = 0;
|
||||
file = mymalloc(sizeof(FIL));
|
||||
file_info = mymalloc(sizeof(FILINFO));
|
||||
if (file == 0)
|
||||
return 1; // <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>.
|
||||
|
||||
res = f_stat((char *)pname, file_info);
|
||||
if (res != FR_OK) // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
myfree(file);
|
||||
myfree(file_info);
|
||||
return 2;
|
||||
}
|
||||
res = nes_sram_malloc(file_info->fsize); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
if (res == 0) {
|
||||
f_open(file, (char *)pname, FA_READ);
|
||||
f_read(file, romfile, file_info->fsize, &br); // <20><>ȡnes<65>ļ<EFBFBD>
|
||||
res = nes_load_rom(); // <20><><EFBFBD><EFBFBD>ROM
|
||||
if (res == 0) {
|
||||
Mapper_Init(); // map<61><70>ʼ<EFBFBD><CABC>
|
||||
cpu6502_init(); // <20><>ʼ<EFBFBD><CABC>6502,<2C><><EFBFBD><EFBFBD>λ
|
||||
PPU_reset(lcd_addr); // ppu<70><75>λ
|
||||
apu_init(); // apu<70><75>ʼ<EFBFBD><CABC>
|
||||
nes_sound_open(0, APU_SAMPLE_RATE); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
||||
nes_emulate_frame(); // <20><><EFBFBD><EFBFBD>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
nes_sound_close(); // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
f_close(file);
|
||||
myfree(file); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
myfree(file_info);
|
||||
nes_sram_free(); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
return res;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD><D0B5><EFBFBD>Ϸ
|
||||
uint8_t nes_start(uint8_t *file, int fileSize, void *lcd_addr, int x, int y) {
|
||||
nes_xoff = x;
|
||||
nes_yoff = y;
|
||||
uint8_t res = 0;
|
||||
g_nes_break = 0;
|
||||
res = nes_sram_malloc(fileSize); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
|
||||
if (res == 0) {
|
||||
mymemcpy(romfile, file, fileSize); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пռ<D0BF>
|
||||
res = nes_load_rom(); // <20><><EFBFBD><EFBFBD>ROM
|
||||
if (res == 0) {
|
||||
Mapper_Init(); // map<61><70>ʼ<EFBFBD><CABC>
|
||||
cpu6502_init(); // <20><>ʼ<EFBFBD><CABC>6502,<2C><><EFBFBD><EFBFBD>λ
|
||||
PPU_reset(lcd_addr); // ppu<70><75>λ
|
||||
apu_init(); // apu<70><75>ʼ<EFBFBD><CABC>
|
||||
nes_sound_open(0, APU_SAMPLE_RATE); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
||||
nes_emulate_frame(); // <20><><EFBFBD><EFBFBD>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
nes_sound_close(); // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
nes_sram_free(); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
return res;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||
void nes_set_window(void) {}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>Ϸ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
void nes_get_gamepadval(void) {
|
||||
#include "usart.h"
|
||||
PADdata=USART3_GetKey();
|
||||
PADdata1=0;
|
||||
}
|
||||
//nesģ<73><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
void nes_emulate_frame(void)
|
||||
{
|
||||
u8 nes_frame;
|
||||
//TIM3_Int_Init(10000-1,8400-1);//<2F><><EFBFBD><EFBFBD>TIM3 ,1s<31>ж<EFBFBD>һ<EFBFBD><D2BB>
|
||||
nes_set_window();//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
|
||||
while(1)
|
||||
{
|
||||
// LINES 0-239
|
||||
PPU_start_frame();
|
||||
//LCD_SwitchLayerBuff();//<2F>л<EFBFBD>֡
|
||||
for(NES_scanline = 0; NES_scanline< 240; NES_scanline++)
|
||||
{
|
||||
run6502(113*256);
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
//ɨ<><C9A8>һ<EFBFBD><D2BB>
|
||||
if(nes_frame==0)scanline_draw(NES_scanline);
|
||||
else do_scanline_and_dont_draw(NES_scanline);
|
||||
}
|
||||
//LCD_ExitLayerBuff ();
|
||||
|
||||
NES_scanline=240;
|
||||
run6502(113*256);//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31>
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
start_vblank();
|
||||
if(NMI_enabled())
|
||||
{
|
||||
cpunmi=1;
|
||||
run6502(7*256);//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
}
|
||||
NES_Mapper->VSync();
|
||||
// LINES 242-261
|
||||
for(NES_scanline=241;NES_scanline<262;NES_scanline++)
|
||||
{
|
||||
run6502(113*256);
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
}
|
||||
end_vblank();
|
||||
nes_get_gamepadval();//ÿ3֡<33><D6A1>ѯһ<D1AF><D2BB>USB
|
||||
apu_soundoutput();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
||||
nes_frame_cnt++;
|
||||
nes_frame++;
|
||||
if(nes_frame>NES_SKIP_FRAME)nes_frame=0;//<2F><>֡
|
||||
u8 nesBreak (void);
|
||||
if (nesBreak()) break;
|
||||
if (Touch_GetState()->x[1]!=0) break;
|
||||
}
|
||||
//TIM3->CR1&=~(1<<0);//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>3
|
||||
PADdata = USART3_GetKey();
|
||||
PADdata1 = 0;
|
||||
}
|
||||
|
||||
// nesģ<73><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
void nes_emulate_frame(void) {
|
||||
uint8_t nes_frame;
|
||||
// TIM3_Int_Init(10000-1,8400-1);//<2F><><EFBFBD><EFBFBD>TIM3 ,1s<31>ж<EFBFBD>һ<EFBFBD><D2BB>
|
||||
nes_set_window(); // <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
|
||||
while (1) {
|
||||
// LINES 0-239
|
||||
PPU_start_frame();
|
||||
// LCD_SwitchLayerBuff();//<2F>л<EFBFBD>֡
|
||||
for (NES_scanline = 0; NES_scanline < 240; NES_scanline++) {
|
||||
run6502(113 * 256);
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
// ɨ<><C9A8>һ<EFBFBD><D2BB>
|
||||
if (nes_frame == 0)
|
||||
scanline_draw(NES_scanline);
|
||||
else
|
||||
do_scanline_and_dont_draw(NES_scanline);
|
||||
}
|
||||
// LCD_ExitLayerBuff ();
|
||||
|
||||
|
||||
|
||||
u8 nesBreak (void)
|
||||
{
|
||||
u8 t=0;
|
||||
if ((PADdata&0x0c)==0x0c)
|
||||
{
|
||||
g_nes_break=0x0c;
|
||||
}
|
||||
if ((g_nes_break)&&(t=USART3_GetKeyPressed(),t&0x0c))
|
||||
{
|
||||
g_nes_break&=~t;
|
||||
if (g_nes_break==0)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
NES_scanline = 240;
|
||||
run6502(113 * 256); // <20><><EFBFBD><EFBFBD>1<EFBFBD><31>
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
start_vblank();
|
||||
if (NMI_enabled()) {
|
||||
cpunmi = 1;
|
||||
run6502(7 * 256); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
}
|
||||
NES_Mapper->VSync();
|
||||
// LINES 242-261
|
||||
for (NES_scanline = 241; NES_scanline < 262; NES_scanline++) {
|
||||
run6502(113 * 256);
|
||||
NES_Mapper->HSync(NES_scanline);
|
||||
}
|
||||
end_vblank();
|
||||
nes_get_gamepadval(); // ÿ3֡<33><D6A1>ѯһ<D1AF><D2BB>USB
|
||||
apu_soundoutput(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
||||
nes_frame_cnt++;
|
||||
nes_frame++;
|
||||
if (nes_frame > NES_SKIP_FRAME)
|
||||
nes_frame = 0; // <20><>֡
|
||||
uint8_t nesBreak(void);
|
||||
if (nesBreak())
|
||||
break;
|
||||
if (Touch_GetState()->x[1] != 0)
|
||||
break;
|
||||
}
|
||||
// TIM3->CR1&=~(1<<0);//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>3
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//<2F><>6502.s<><73><EFBFBD>汻<EFBFBD><E6B1BB><EFBFBD><EFBFBD>
|
||||
void debug_6502(u16 reg0,u8 reg1)
|
||||
{
|
||||
//printf("6502 error:%x,%d\r\n",reg0,reg1);
|
||||
uint8_t nesBreak(void) {
|
||||
uint8_t t = 0;
|
||||
if ((PADdata & 0x0c) == 0x0c) {
|
||||
g_nes_break = 0x0c;
|
||||
}
|
||||
if ((g_nes_break) && (t = USART3_GetKeyPressed(), t & 0x0c)) {
|
||||
g_nes_break &= ~t;
|
||||
if (g_nes_break == 0)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <20><>6502.s<><73><EFBFBD>汻<EFBFBD><E6B1BB><EFBFBD><EFBFBD>
|
||||
void debug_6502(uint16_t reg0, uint8_t reg1) {
|
||||
// printf("6502 error:%x,%d\r\n",reg0,reg1);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// nes,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֧<EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//nes,<2C><>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
|
||||
static vu8 g_buff_Invalid=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ЧʱҪ<CAB1><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static vu8 g_buff_useing; //<2F><>ǰDMA<4D><41>ʹ<EFBFBD><CAB9><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static vu8 g_buff_Invalid = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ЧʱҪ<CAB1><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static vu8 g_buff_useing; // <20><>ǰDMA<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static DAC_UserStruct g_dac;
|
||||
|
||||
|
||||
|
||||
static void dma_tx_callback(DAC_UserStruct *dac)
|
||||
{
|
||||
u16 i;
|
||||
g_buff_useing=dac->buff_useing;
|
||||
g_buff_Invalid=1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
int nes_sound_open(int samples_per_sync,int sample_rate)
|
||||
{
|
||||
|
||||
//<2F><>ʼ<EFBFBD><CABC>DAC
|
||||
g_dac.buff1=(u32 *)i2sbuf1;
|
||||
g_dac.buff2=(u32 *)i2sbuf2;
|
||||
g_dac.buff_size=APU_PCMBUF_SIZE*4;
|
||||
g_dac.rate=RATE22050;
|
||||
g_dac.call_back=dma_tx_callback;
|
||||
DAC_NormalInit (&g_dac);
|
||||
return 1;
|
||||
static void dma_tx_callback(DAC_UserStruct *dac) {
|
||||
uint16_t i;
|
||||
g_buff_useing = dac->buff_useing;
|
||||
g_buff_Invalid = 1;
|
||||
}
|
||||
//NES<45>ر<EFBFBD><D8B1><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
void nes_sound_close(void)
|
||||
{
|
||||
DAC_NormalDeInit (&g_dac);
|
||||
}
|
||||
//NES<45><53>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2S<32><53><EFBFBD><EFBFBD>
|
||||
void nes_apu_fill_buffer(int samples,u16* wavebuf)
|
||||
{
|
||||
|
||||
if (DAC_GetDacHander()!=&g_dac) return;
|
||||
u16 i;
|
||||
u16 *p;
|
||||
while(g_buff_Invalid==0)//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
rt_thread_delay(5);//
|
||||
};
|
||||
if(g_buff_useing==0)
|
||||
{
|
||||
p=(u16*)i2sbuf2;
|
||||
}else
|
||||
{
|
||||
p=(u16*)i2sbuf1;
|
||||
}
|
||||
{
|
||||
for(i=0;i<APU_PCMBUF_SIZE;i++)
|
||||
{
|
||||
p[2*i]=((wavebuf[i]+0x8000)>>4);
|
||||
p[2*i+1]=p[2*i];
|
||||
}
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
|
||||
g_buff_Invalid=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
int nes_sound_open(int samples_per_sync, int sample_rate) {
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC>DAC
|
||||
g_dac.buff1 = (uint32_t *)i2sbuf1;
|
||||
g_dac.buff2 = (uint32_t *)i2sbuf2;
|
||||
g_dac.buff_size = APU_PCMBUF_SIZE * 4;
|
||||
g_dac.rate = RATE22050;
|
||||
g_dac.call_back = dma_tx_callback;
|
||||
DAC_NormalInit(&g_dac);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// NES<45>ر<EFBFBD><D8B1><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
void nes_sound_close(void) { DAC_NormalDeInit(&g_dac); }
|
||||
|
||||
void nes_apu_fill_buffer(int samples, uint16_t *wavebuf) {
|
||||
if (DAC_GetDacHander() != &g_dac)
|
||||
return;
|
||||
uint16_t i;
|
||||
uint16_t *p;
|
||||
while (g_buff_Invalid == 0) // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
rt_thread_delay(5);
|
||||
};
|
||||
if (g_buff_useing == 0) {
|
||||
p = (uint16_t *)i2sbuf2;
|
||||
} else {
|
||||
p = (uint16_t *)i2sbuf1;
|
||||
}
|
||||
{
|
||||
for (i = 0; i < APU_PCMBUF_SIZE; i++) {
|
||||
p[2 * i] = ((wavebuf[i] + 0x8000) >> 4);
|
||||
p[2 * i + 1] = p[2 * i];
|
||||
}
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
|
||||
g_buff_Invalid = 0;
|
||||
}
|
||||
|
@@ -1,85 +1,68 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __NES_MAIN_H
|
||||
#define __NES_MAIN_H
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES<45><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define NES_SKIP_FRAME 2 //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>,Ĭ<><C4AC><EFBFBD><EFBFBD>2֡
|
||||
|
||||
|
||||
#define INLINE static inline
|
||||
#define int8 char
|
||||
#define int16 short
|
||||
#define int32 int
|
||||
#define uint8 unsigned char
|
||||
#define uint16 unsigned short
|
||||
#define uint32 unsigned int
|
||||
#define boolean uint8
|
||||
#include "stdint.h"
|
||||
|
||||
#define NES_SKIP_FRAME 2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>,Ĭ<><C4AC><EFBFBD><EFBFBD>2֡
|
||||
|
||||
#define INLINE static inline
|
||||
#define boolean uint8_t
|
||||
|
||||
//nes<65><73>Ϣͷ<CFA2>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct
|
||||
{
|
||||
unsigned char id[3]; // 'NES'
|
||||
unsigned char ctrl_z; // control-z
|
||||
unsigned char num_16k_rom_banks;
|
||||
unsigned char num_8k_vrom_banks;
|
||||
unsigned char flags_1;
|
||||
unsigned char flags_2;
|
||||
unsigned char reserved[8];
|
||||
}NES_header;
|
||||
// nes<EFBFBD><EFBFBD>Ϣͷ<EFBFBD>ṹ<EFBFBD><EFBFBD>
|
||||
typedef struct {
|
||||
unsigned char id[3]; // 'NES'
|
||||
unsigned char ctrl_z; // control-z
|
||||
unsigned char num_16k_rom_banks;
|
||||
unsigned char num_8k_vrom_banks;
|
||||
unsigned char flags_1;
|
||||
unsigned char flags_2;
|
||||
unsigned char reserved[8];
|
||||
} NES_header;
|
||||
|
||||
extern u8 nes_frame_cnt; //nes֡<73><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern int MapperNo; //map<61><70><EFBFBD><EFBFBD>
|
||||
extern int NES_scanline; //ɨ<><C9A8><EFBFBD><EFBFBD>
|
||||
extern NES_header *RomHeader; //rom<6F>ļ<EFBFBD>ͷ
|
||||
extern uint8_t nes_frame_cnt; // nes֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern int MapperNo; // map<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern int NES_scanline; // ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern NES_header *RomHeader; // rom<EFBFBD>ļ<EFBFBD>ͷ
|
||||
extern int VROM_1K_SIZE;
|
||||
extern int VROM_8K_SIZE;
|
||||
extern u8 cpunmi; //cpu<70>жϱ<D0B6>־ <20><> 6502.s<><73><EFBFBD><EFBFBD>
|
||||
extern u8 cpuirq;
|
||||
extern u8 PADdata; //<2F>ֱ<EFBFBD>1<EFBFBD><31>ֵ
|
||||
extern u8 PADdata1; //<2F>ֱ<EFBFBD>1<EFBFBD><31>ֵ
|
||||
extern u8 lianan_biao; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
#define CPU_NMI cpunmi=1;
|
||||
#define CPU_IRQ cpuirq=1;
|
||||
#define NES_RAM_SPEED 0 //1:<3A>ڴ<EFBFBD>ռ<EFBFBD><D5BC>С 0:<3A>ٶȿ<D9B6>
|
||||
extern int VROM_8K_SIZE;
|
||||
extern uint8_t cpunmi; // cpu<EFBFBD>жϱ<EFBFBD>־ <20><> 6502.s<><73><EFBFBD><EFBFBD>
|
||||
extern uint8_t cpuirq;
|
||||
extern uint8_t PADdata; // <EFBFBD>ֱ<EFBFBD>1<EFBFBD><EFBFBD>ֵ
|
||||
extern uint8_t PADdata1; // <EFBFBD>ֱ<EFBFBD>1<EFBFBD><EFBFBD>ֵ
|
||||
extern uint8_t lianan_biao; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
#define CPU_NMI cpunmi = 1;
|
||||
#define CPU_IRQ cpuirq = 1;
|
||||
#define NES_RAM_SPEED 0 // 1:<3A>ڴ<EFBFBD>ռ<EFBFBD><D5BC>С 0:<3A>ٶȿ<D9B6>
|
||||
|
||||
// ʹ<><CAB9><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
|
||||
uint8_t nes_load(uint8_t *pname, void *lcd_addr, int x, int y);
|
||||
|
||||
//ʹ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
|
||||
u8 nes_load(u8* pname,void *lcd_addr,int x,int y);
|
||||
// <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>Ϸ
|
||||
uint8_t nes_start(uint8_t *file, int fileSize, void *lcd_addr, int x, int y);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD><D0B5><EFBFBD>Ϸ
|
||||
u8 nes_start(u8* file,int fileSize,void *lcd_addr,int x,int y);
|
||||
|
||||
|
||||
|
||||
void cpu6502_init(void); //<2F><> cart.s
|
||||
void run6502(u32); //<2F><> 6502.s
|
||||
u8 nes_load_rom(void);
|
||||
void cpu6502_init(void); // <20><> cart.s
|
||||
void run6502(uint32_t); // <20><> 6502.s
|
||||
uint8_t nes_load_rom(void);
|
||||
void nes_sram_free(void);
|
||||
u8 nes_sram_malloc(u32 romsize);
|
||||
uint8_t nes_sram_malloc(uint32_t romsize);
|
||||
void nes_set_window(void);
|
||||
void nes_get_gamepadval(void);
|
||||
void nes_emulate_frame(void);
|
||||
void debug_6502(u16 reg0,u8 reg1);
|
||||
void debug_6502(uint16_t reg0, uint8_t reg1);
|
||||
|
||||
void nes_i2s_dma_tx_callback(void);
|
||||
int nes_sound_open(int samples_per_sync,int sample_rate);
|
||||
int nes_sound_open(int samples_per_sync, int sample_rate);
|
||||
void nes_sound_close(void);
|
||||
void nes_apu_fill_buffer(int samples,u16* wavebuf);
|
||||
void nes_apu_fill_buffer(int samples, uint16_t *wavebuf);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -1,18 +1,42 @@
|
||||
#include "stm32f4xx.h"
|
||||
#include "nes_main.h"
|
||||
#include "nes_ppu.h"
|
||||
#include "nes_mapper.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<EFBFBD><EFBFBD>NESģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES MAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// NES MAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
// <20>汾<EFBFBD><EFBFBD>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>map<61>ļ<EFBFBD><C4BC><EFBFBD>.
|
||||
#include "nes_mapper.h"
|
||||
#include "nes_main.h"
|
||||
#include "nes_ppu.h"
|
||||
|
||||
|
||||
#ifndef u8
|
||||
#define u8 uint8_t
|
||||
#endif
|
||||
#ifndef u16
|
||||
#define u16 uint16_t
|
||||
#endif
|
||||
#ifndef u32
|
||||
#define u32 uint32_t
|
||||
#endif
|
||||
#ifndef uint8
|
||||
#define uint8 uint8_t
|
||||
#endif
|
||||
#ifndef uint16
|
||||
#define uint16 uint16_t
|
||||
#endif
|
||||
#ifndef uint32
|
||||
#define uint32 uint32_t
|
||||
#endif
|
||||
#ifndef int32
|
||||
#define int32 int32_t
|
||||
#endif
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>map<61>ļ<EFBFBD><C4BC><EFBFBD>.
|
||||
#include "mapper/000.cpp"
|
||||
#include "mapper/001.cpp"
|
||||
#include "mapper/002.cpp"
|
||||
@@ -24,7 +48,7 @@
|
||||
#include "mapper/011.cpp"
|
||||
#include "mapper/013.cpp"
|
||||
#include "mapper/015.cpp"
|
||||
#include "mapper/016.cpp"
|
||||
#include "mapper/016.cpp"
|
||||
#include "mapper/017.cpp"
|
||||
#include "mapper/018.cpp"
|
||||
#include "mapper/019.cpp"
|
||||
@@ -35,17 +59,17 @@
|
||||
#include "mapper/025.cpp"
|
||||
#include "mapper/032.cpp"
|
||||
#include "mapper/033.cpp"
|
||||
#include "mapper/034.cpp"
|
||||
#include "mapper/064.cpp"
|
||||
#include "mapper/065.cpp"
|
||||
#include "mapper/066.cpp"
|
||||
#include "mapper/067.cpp"
|
||||
#include "mapper/069.cpp"
|
||||
#include "mapper/070.cpp"
|
||||
#include "mapper/071.cpp"
|
||||
#include "mapper/072.cpp"
|
||||
#include "mapper/073.cpp"
|
||||
#include "mapper/075.cpp"
|
||||
#include "mapper/034.cpp"
|
||||
#include "mapper/064.cpp"
|
||||
#include "mapper/065.cpp"
|
||||
#include "mapper/066.cpp"
|
||||
#include "mapper/067.cpp"
|
||||
#include "mapper/069.cpp"
|
||||
#include "mapper/070.cpp"
|
||||
#include "mapper/071.cpp"
|
||||
#include "mapper/072.cpp"
|
||||
#include "mapper/073.cpp"
|
||||
#include "mapper/075.cpp"
|
||||
#include "mapper/076.cpp"
|
||||
#include "mapper/078.cpp"
|
||||
#include "mapper/079.cpp"
|
||||
@@ -53,137 +77,222 @@
|
||||
#include "mapper/087.cpp"
|
||||
#include "mapper/088.cpp"
|
||||
#include "mapper/099.cpp"
|
||||
#include "mapper/113.cpp"
|
||||
#include "mapper/113.cpp"
|
||||
#include "mapper/189.cpp"
|
||||
#include "mapper/225.cpp"
|
||||
#include "mapper/227.cpp"
|
||||
#include "mapper/240.cpp"
|
||||
#include "mapper/245.cpp"
|
||||
#include "mapper/240.cpp"
|
||||
#include "mapper/245.cpp"
|
||||
|
||||
|
||||
//֧<>ֵ<EFBFBD>Mapper<65><72>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
const int MapTab[] =
|
||||
{
|
||||
0,1,2,3,4,6,7,8,11,13,15,16,17,18,19,21,22,23,24,25,32,33,34,
|
||||
64,65,66,67,69,70,71,72,73,75,76,78,79,85,87,88,99,113,
|
||||
189,225,227,240,245,
|
||||
-1,//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,-1,<2C><>ʾ<EFBFBD><CABE>֧<EFBFBD>ֵ<EFBFBD>map<61><70>
|
||||
// ֧<EFBFBD>ֵ<EFBFBD>Mapper<EFBFBD><EFBFBD>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
const int MapTab[] = {
|
||||
0, 1, 2, 3, 4, 6, 7, 8, 11, 13, 15, 16, 17, 18, 19, 21,
|
||||
22, 23, 24, 25, 32, 33, 34, 64, 65, 66, 67, 69, 70, 71, 72, 73,
|
||||
75, 76, 78, 79, 85, 87, 88, 99, 113, 189, 225, 227, 240, 245,
|
||||
-1, // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,-1,<2C><>ʾ<EFBFBD><CABE>֧<EFBFBD>ֵ<EFBFBD>map<61><70>
|
||||
};
|
||||
#define MASK_BANK(bank,mask) (bank) = ((bank) & (mask))
|
||||
#define VALIDATE_VROM_BANK(bank) \
|
||||
MASK_BANK(bank,VROM_mask); \
|
||||
if((bank) >= VROM_1K_SIZE) return;
|
||||
|
||||
|
||||
uint32 VROM_mask;
|
||||
#define MASK_BANK(bank, mask) (bank) = ((bank) & (mask))
|
||||
#define VALIDATE_VROM_BANK(bank) \
|
||||
MASK_BANK(bank, VROM_mask); \
|
||||
if ((bank) >= VROM_1K_SIZE) \
|
||||
return;
|
||||
|
||||
void Mapper_Reset(void){}
|
||||
uint8 Mapper_ReadLow(uint16 addr){ return 0;}
|
||||
void Mapper_WriteLow(uint16 addr,uint8 data){}
|
||||
void Mapper_Write( uint16 addr , uint8 data){}
|
||||
void Mapper_Read( uint8 data,uint16 addr ){}
|
||||
void Mapper_HSync( int scanline ){}
|
||||
void Mapper_VSync(void) {}
|
||||
|
||||
void Mapper_Init(void)
|
||||
uint32_t VROM_mask;
|
||||
|
||||
void Mapper_Reset(void) {}
|
||||
uint8_t Mapper_ReadLow(uint16_t addr) { return 0; }
|
||||
void Mapper_WriteLow(uint16_t addr, uint8_t data) {}
|
||||
void Mapper_Write(uint16_t addr, uint8_t data) {}
|
||||
void Mapper_Read(uint8_t data, uint16_t addr) {}
|
||||
void Mapper_HSync(int scanline) {}
|
||||
void Mapper_VSync(void) {}
|
||||
|
||||
void Mapper_Init(void) {
|
||||
uint32_t probe;
|
||||
NES_Mapper->Reset = Mapper_Reset;
|
||||
NES_Mapper->Write = Mapper_Write;
|
||||
NES_Mapper->Read = Mapper_Read;
|
||||
NES_Mapper->WriteLow = Mapper_WriteLow;
|
||||
NES_Mapper->ReadLow = Mapper_ReadLow;
|
||||
NES_Mapper->HSync = Mapper_HSync;
|
||||
NES_Mapper->VSync = Mapper_VSync;
|
||||
VROM_mask = 0xFFFF;
|
||||
for (probe = 0x8000; probe; probe >>= 1) {
|
||||
if ((VROM_1K_SIZE - 1) & probe)
|
||||
break;
|
||||
VROM_mask >>= 1;
|
||||
}
|
||||
|
||||
switch (MapperNo) {
|
||||
case 0:
|
||||
MAP0_Init();
|
||||
break;
|
||||
case 1:
|
||||
MAP1_Init();
|
||||
break;
|
||||
case 2:
|
||||
MAP2_Init();
|
||||
break;
|
||||
case 3:
|
||||
MAP3_Init();
|
||||
break;
|
||||
case 4:
|
||||
MAP4_Init();
|
||||
break;
|
||||
case 6:
|
||||
MAP6_Init();
|
||||
break;
|
||||
case 7:
|
||||
MAP7_Init();
|
||||
break;
|
||||
case 8:
|
||||
MAP8_Init();
|
||||
break;
|
||||
case 11:
|
||||
MAP11_Init();
|
||||
break;
|
||||
case 13:
|
||||
MAP13_Init();
|
||||
break;
|
||||
case 15:
|
||||
MAP15_Init();
|
||||
break;
|
||||
case 16:
|
||||
MAP16_Init();
|
||||
break;
|
||||
case 17:
|
||||
MAP17_Init();
|
||||
break;
|
||||
case 18:
|
||||
MAP18_Init();
|
||||
break;
|
||||
case 19:
|
||||
MAP19_Init();
|
||||
break;
|
||||
case 21:
|
||||
MAP21_Init();
|
||||
break;
|
||||
case 22:
|
||||
MAP22_Init();
|
||||
break;
|
||||
case 23:
|
||||
MAP23_Init();
|
||||
break;
|
||||
case 24:
|
||||
MAP24_Init();
|
||||
break;
|
||||
case 25:
|
||||
MAP25_Init();
|
||||
break;
|
||||
case 32:
|
||||
MAP32_Init();
|
||||
break;
|
||||
case 33:
|
||||
MAP33_Init();
|
||||
break;
|
||||
case 34:
|
||||
MAP34_Init();
|
||||
break;
|
||||
case 64:
|
||||
MAP64_Init();
|
||||
break;
|
||||
case 65:
|
||||
MAP65_Init();
|
||||
break;
|
||||
case 66:
|
||||
MAP66_Init();
|
||||
break;
|
||||
case 67:
|
||||
MAP67_Init();
|
||||
break;
|
||||
case 69:
|
||||
MAP69_Init();
|
||||
break;
|
||||
case 70:
|
||||
MAP70_Init();
|
||||
break;
|
||||
case 71:
|
||||
MAP71_Init();
|
||||
break;
|
||||
case 72:
|
||||
MAP72_Init();
|
||||
break;
|
||||
case 73:
|
||||
MAP73_Init();
|
||||
break;
|
||||
case 75:
|
||||
MAP75_Init();
|
||||
break;
|
||||
case 76:
|
||||
MAP76_Init();
|
||||
break;
|
||||
case 78:
|
||||
MAP78_Init();
|
||||
break;
|
||||
case 79:
|
||||
MAP79_Init();
|
||||
break;
|
||||
case 85:
|
||||
MAP85_Init();
|
||||
break;
|
||||
case 87:
|
||||
MAP87_Init();
|
||||
break;
|
||||
case 88:
|
||||
MAP88_Init();
|
||||
break;
|
||||
case 99:
|
||||
MAP99_Init();
|
||||
break;
|
||||
case 113:
|
||||
MAP113_Init();
|
||||
break;
|
||||
case 189:
|
||||
MAP189_Init();
|
||||
break;
|
||||
case 225:
|
||||
MAP225_Init();
|
||||
break;
|
||||
case 227:
|
||||
MAP227_Init();
|
||||
break;
|
||||
case 240:
|
||||
MAP240_Init();
|
||||
break;
|
||||
case 245:
|
||||
MAP245_Init();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
NES_Mapper->Reset();
|
||||
}
|
||||
void asm_Mapper_Write(uint8_t byData, uint16_t wAddr) {
|
||||
NES_Mapper->Write(wAddr, byData);
|
||||
}
|
||||
void asm_Mapper_ReadLow(uint16_t wAddr) // <20><><EFBFBD>ӵ<EFBFBD>
|
||||
{
|
||||
uint32 probe;
|
||||
NES_Mapper->Reset = Mapper_Reset;
|
||||
NES_Mapper->Write = Mapper_Write;
|
||||
NES_Mapper->Read = Mapper_Read;
|
||||
NES_Mapper->WriteLow = Mapper_WriteLow;
|
||||
NES_Mapper->ReadLow = Mapper_ReadLow;
|
||||
NES_Mapper->HSync = Mapper_HSync;
|
||||
NES_Mapper->VSync = Mapper_VSync;
|
||||
VROM_mask = 0xFFFF;
|
||||
for(probe = 0x8000; probe; probe >>= 1)
|
||||
{
|
||||
if((VROM_1K_SIZE-1) & probe) break;
|
||||
VROM_mask >>= 1;
|
||||
}
|
||||
|
||||
switch (MapperNo)
|
||||
{
|
||||
case 0 :MAP0_Init();break;
|
||||
case 1 :MAP1_Init();break;
|
||||
case 2 :MAP2_Init();break;
|
||||
case 3 :MAP3_Init();break;
|
||||
case 4 :MAP4_Init();break;
|
||||
case 6 :MAP6_Init();break;
|
||||
case 7 :MAP7_Init();break;
|
||||
case 8 :MAP8_Init();break;
|
||||
case 11:MAP11_Init();break;
|
||||
case 13:MAP13_Init();break;
|
||||
case 15:MAP15_Init();break;
|
||||
case 16:MAP16_Init();break;
|
||||
case 17:MAP17_Init();break;
|
||||
case 18:MAP18_Init();break;
|
||||
case 19:MAP19_Init();break;
|
||||
case 21:MAP21_Init();break;
|
||||
case 22:MAP22_Init();break;
|
||||
case 23:MAP23_Init();break;
|
||||
case 24:MAP24_Init();break;
|
||||
case 25:MAP25_Init();break;
|
||||
case 32:MAP32_Init();break;
|
||||
case 33:MAP33_Init();break;
|
||||
case 34:MAP34_Init();break;
|
||||
case 64:MAP64_Init();break;
|
||||
case 65:MAP65_Init();break;
|
||||
case 66:MAP66_Init();break;
|
||||
case 67:MAP67_Init();break;
|
||||
case 69:MAP69_Init();break;
|
||||
case 70:MAP70_Init();break;
|
||||
case 71:MAP71_Init();break;
|
||||
case 72:MAP72_Init();break;
|
||||
case 73:MAP73_Init();break;
|
||||
case 75:MAP75_Init();break;
|
||||
case 76:MAP76_Init();break;
|
||||
case 78:MAP78_Init();break;
|
||||
case 79:MAP79_Init();break;
|
||||
case 85:MAP85_Init();break;
|
||||
case 87:MAP87_Init();break;
|
||||
case 88:MAP88_Init();break;
|
||||
case 99:MAP99_Init();break;
|
||||
case 113:MAP113_Init();break;
|
||||
case 189:MAP189_Init();break;
|
||||
case 225:MAP225_Init();break;
|
||||
case 227:MAP227_Init();break;
|
||||
case 240:MAP240_Init();break;
|
||||
case 245:MAP245_Init();break;
|
||||
default:break;
|
||||
}
|
||||
NES_Mapper->Reset();
|
||||
}
|
||||
void asm_Mapper_Write(uint8 byData,uint16 wAddr)
|
||||
{
|
||||
NES_Mapper->Write(wAddr,byData);
|
||||
}
|
||||
void asm_Mapper_ReadLow( uint16 wAddr) //<2F><><EFBFBD>ӵ<EFBFBD>
|
||||
{
|
||||
NES_Mapper->ReadLow( wAddr);
|
||||
}
|
||||
void asm_Mapper_WriteLow( uint8 byData ,uint16 wAddr)
|
||||
{
|
||||
NES_Mapper->WriteLow(wAddr, byData );
|
||||
NES_Mapper->ReadLow(wAddr);
|
||||
}
|
||||
void asm_Mapper_WriteLow(uint8_t byData, uint16_t wAddr) {
|
||||
NES_Mapper->WriteLow(wAddr, byData);
|
||||
}
|
||||
|
||||
void set_CPU_bank3(signed char page ) {map67_(page) ;}
|
||||
void set_CPU_bank4(signed char page ) {map89_(page) ;}
|
||||
void set_CPU_bank5(signed char page ) {mapAB_(page) ;}
|
||||
void set_CPU_bank6(signed char page ) {mapCD_(page) ;}
|
||||
void set_CPU_bank7(signed char page ) {mapEF_(page) ;}
|
||||
void set_CPU_banks(int bank0_num,int bank1_num,int bank2_num, int bank3_num)
|
||||
{
|
||||
map89_(bank0_num);
|
||||
mapAB_(bank1_num);
|
||||
mapCD_(bank2_num);
|
||||
mapEF_(bank3_num);
|
||||
void set_CPU_bank3(signed char page) { map67_(page); }
|
||||
void set_CPU_bank4(signed char page) { map89_(page); }
|
||||
void set_CPU_bank5(signed char page) { mapAB_(page); }
|
||||
void set_CPU_bank6(signed char page) { mapCD_(page); }
|
||||
void set_CPU_bank7(signed char page) { mapEF_(page); }
|
||||
void set_CPU_banks(int bank0_num, int bank1_num, int bank2_num, int bank3_num) {
|
||||
map89_(bank0_num);
|
||||
mapAB_(bank1_num);
|
||||
mapCD_(bank2_num);
|
||||
mapEF_(bank3_num);
|
||||
}
|
||||
void set_PPU_banks(uint32 bank0_num, uint32 bank1_num,
|
||||
uint32 bank2_num, uint32 bank3_num,
|
||||
uint32 bank4_num, uint32 bank5_num,
|
||||
uint32 bank6_num, uint32 bank7_num)
|
||||
{
|
||||
void set_PPU_banks(uint32_t bank0_num, uint32_t bank1_num, uint32_t bank2_num,
|
||||
uint32_t bank3_num, uint32_t bank4_num, uint32_t bank5_num,
|
||||
uint32_t bank6_num, uint32_t bank7_num) {
|
||||
VALIDATE_VROM_BANK(bank0_num);
|
||||
VALIDATE_VROM_BANK(bank1_num);
|
||||
VALIDATE_VROM_BANK(bank2_num);
|
||||
@@ -201,113 +310,82 @@ void set_PPU_banks(uint32 bank0_num, uint32 bank1_num,
|
||||
ppu->PPU_VRAM_banks[5] = VROM_banks + (bank5_num << 10);
|
||||
ppu->PPU_VRAM_banks[6] = VROM_banks + (bank6_num << 10);
|
||||
ppu->PPU_VRAM_banks[7] = VROM_banks + (bank7_num << 10);
|
||||
|
||||
set_tile_banks( VROM_tiles + bank0_num * 0x400 ,
|
||||
VROM_tiles + bank1_num * 0x400 ,
|
||||
VROM_tiles + bank2_num * 0x400 ,
|
||||
VROM_tiles + bank3_num * 0x400 ,
|
||||
VROM_tiles + bank4_num * 0x400 ,
|
||||
VROM_tiles + bank5_num * 0x400 ,
|
||||
VROM_tiles + bank6_num * 0x400 ,
|
||||
VROM_tiles + bank7_num * 0x400 );
|
||||
|
||||
set_tile_banks(VROM_tiles + bank0_num * 0x400, VROM_tiles + bank1_num * 0x400,
|
||||
VROM_tiles + bank2_num * 0x400, VROM_tiles + bank3_num * 0x400,
|
||||
VROM_tiles + bank4_num * 0x400, VROM_tiles + bank5_num * 0x400,
|
||||
VROM_tiles + bank6_num * 0x400,
|
||||
VROM_tiles + bank7_num * 0x400);
|
||||
}
|
||||
void set_PPU_bank0(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[0] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(0, VROM_tiles + bank_num * 0x400);
|
||||
void set_PPU_bank0(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[0] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(0, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank1(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[1] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(1, VROM_tiles + bank_num * 0x400 );
|
||||
void set_PPU_bank1(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[1] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(1, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank2(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[2] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(2, VROM_tiles + bank_num * 0x400 );
|
||||
void set_PPU_bank2(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[2] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(2, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank3(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[3] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(3, VROM_tiles + bank_num * 0x400 );
|
||||
void set_PPU_bank3(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[3] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(3, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank4(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[4] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(4, VROM_tiles + bank_num * 0x400 );
|
||||
}
|
||||
void set_PPU_bank5(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[5] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(5, VROM_tiles + bank_num * 0x400 );
|
||||
void set_PPU_bank4(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[4] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(4, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
void set_PPU_bank5(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[5] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(5, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank6(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[6] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(6, VROM_tiles + bank_num * 0x400 );
|
||||
void set_PPU_bank6(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[6] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(6, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
|
||||
void set_PPU_bank7(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[7] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(7, VROM_tiles + bank_num * 0x400);
|
||||
void set_PPU_bank7(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[7] = VROM_banks + (bank_num << 10); // * 0x400
|
||||
set_tile_bank(7, VROM_tiles + bank_num * 0x400);
|
||||
}
|
||||
// for mapper 19,68,90
|
||||
void set_PPU_bank8(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[8] = VROM_banks + (bank_num << 10);
|
||||
void set_PPU_bank8(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[8] = VROM_banks + (bank_num << 10);
|
||||
}
|
||||
void set_PPU_bank9(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[9] = VROM_banks + (bank_num << 10);
|
||||
void set_PPU_bank9(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[9] = VROM_banks + (bank_num << 10);
|
||||
}
|
||||
void set_PPU_bank10(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[10] = VROM_banks + (bank_num << 10);
|
||||
void set_PPU_bank10(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[10] = VROM_banks + (bank_num << 10);
|
||||
}
|
||||
void set_PPU_bank11(uint32 bank_num)
|
||||
{
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[11] = VROM_banks + (bank_num << 10);
|
||||
void set_PPU_bank11(uint32_t bank_num) {
|
||||
VALIDATE_VROM_BANK(bank_num);
|
||||
ppu->PPU_VRAM_banks[11] = VROM_banks + (bank_num << 10);
|
||||
}
|
||||
|
||||
// for mapper 1,4,5,6,13,19,80,85,96,119
|
||||
void set_VRAM_bank(uint8 bank, uint32 bank_num)
|
||||
{
|
||||
if(bank < 8)
|
||||
{
|
||||
ppu->PPU_VRAM_banks[bank] = PPU_patterntables + ((bank_num & 0x0f) << 10);
|
||||
}
|
||||
else if(bank < 12)
|
||||
{
|
||||
set_name_table(bank, bank_num);
|
||||
}
|
||||
void set_VRAM_bank(uint8_t bank, uint32_t bank_num) {
|
||||
if (bank < 8) {
|
||||
ppu->PPU_VRAM_banks[bank] = PPU_patterntables + ((bank_num & 0x0f) << 10);
|
||||
} else if (bank < 12) {
|
||||
set_name_table(bank, bank_num);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -1,122 +1,109 @@
|
||||
#ifndef __NES_MAPPER_H
|
||||
#define __NES_MAPPER_H
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES MAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
#ifndef uint16
|
||||
#define uint16 u16
|
||||
#define uint8 u8
|
||||
#define uint32 u32
|
||||
#endif
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// NES MAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define num_8k_ROM_banks VROM_8K_SIZE
|
||||
#define num_1k_VROM_banks VROM_1K_SIZE
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
typedef struct
|
||||
{
|
||||
void (*Reset)();
|
||||
void (*Write)( uint16 addr,uint8 data);
|
||||
void (*Read)( uint8 data,uint16 addr);
|
||||
uint8 (*ReadLow)( uint16 addr);
|
||||
void (*WriteLow)(uint16 addr,uint8 data);
|
||||
void (*HSync)( int scanline);
|
||||
void (*VSync)(void);
|
||||
#ifndef __NES_MAPPER_H
|
||||
#define __NES_MAPPER_H
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
#define num_8k_ROM_banks VROM_8K_SIZE
|
||||
#define num_1k_VROM_banks VROM_1K_SIZE
|
||||
|
||||
typedef struct {
|
||||
void (*Reset)();
|
||||
void (*Write)(uint16_t addr, uint8_t data);
|
||||
void (*Read)(uint8_t data, uint16_t addr);
|
||||
uint8_t (*ReadLow)(uint16_t addr);
|
||||
void (*WriteLow)(uint16_t addr, uint8_t data);
|
||||
void (*HSync)(int scanline);
|
||||
void (*VSync)(void);
|
||||
} MAPPER;
|
||||
///////////////////////////////////////////////////////////////
|
||||
typedef enum
|
||||
{
|
||||
MMC1_SMALL,
|
||||
MMC1_512K,
|
||||
MMC1_1024K
|
||||
}MMC1_Size_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32 write_count;
|
||||
uint8 bits;
|
||||
uint8 regs[4];
|
||||
uint32 last_write_addr;
|
||||
|
||||
MMC1_Size_t MMC1_Size;
|
||||
uint32 MMC1_256K_base;
|
||||
uint32 MMC1_swap;
|
||||
|
||||
// these are the 4 ROM banks currently selected
|
||||
uint32 MMC1_bank1;
|
||||
uint32 MMC1_bank2;
|
||||
uint32 MMC1_bank3;
|
||||
uint32 MMC1_bank4;
|
||||
typedef enum { MMC1_SMALL, MMC1_512K, MMC1_1024K } MMC1_Size_t;
|
||||
|
||||
uint32 MMC1_HI1;
|
||||
uint32 MMC1_HI2;
|
||||
}Mapper1Res;
|
||||
typedef struct {
|
||||
uint32_t write_count;
|
||||
uint8_t bits;
|
||||
uint8_t regs[4];
|
||||
uint32_t last_write_addr;
|
||||
|
||||
//ͨ<><CDA8>map<61><70><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct
|
||||
{
|
||||
uint8 patch;
|
||||
uint8 regs[11];
|
||||
MMC1_Size_t MMC1_Size;
|
||||
uint32_t MMC1_256K_base;
|
||||
uint32_t MMC1_swap;
|
||||
|
||||
uint32 prg0,prg1;
|
||||
uint32 chr01,chr23,chr4,chr5,chr6,chr7;
|
||||
|
||||
uint8 irq_enabled; // IRQs enabled
|
||||
uint32 irq_counter; // IRQ scanline counter, decreasing
|
||||
uint32 irq_latch; // IRQ scanline counter latch
|
||||
}MapperCommRes;
|
||||
|
||||
extern uint32 ROM_mask;
|
||||
extern uint32 VROM_mask;
|
||||
extern const int MapTab[];
|
||||
// these are the 4 ROM banks currently selected
|
||||
uint32_t MMC1_bank1;
|
||||
uint32_t MMC1_bank2;
|
||||
uint32_t MMC1_bank3;
|
||||
uint32_t MMC1_bank4;
|
||||
|
||||
uint32_t MMC1_HI1;
|
||||
uint32_t MMC1_HI2;
|
||||
} Mapper1Res;
|
||||
|
||||
// ͨ<><CDA8>map<61><70><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct {
|
||||
uint8_t patch;
|
||||
uint8_t regs[11];
|
||||
|
||||
uint32_t prg0, prg1;
|
||||
uint32_t chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
|
||||
uint8_t irq_enabled; // IRQs enabled
|
||||
uint32_t irq_counter; // IRQ scanline counter, decreasing
|
||||
uint32_t irq_latch; // IRQ scanline counter latch
|
||||
} MapperCommRes;
|
||||
|
||||
extern uint32_t ROM_mask;
|
||||
extern uint32_t VROM_mask;
|
||||
extern const int MapTab[];
|
||||
extern MAPPER *NES_Mapper;
|
||||
extern uint32 VROM_mask;
|
||||
extern uint32_t VROM_mask;
|
||||
|
||||
extern Mapper1Res *MAP1;
|
||||
extern MapperCommRes *MAPx;
|
||||
|
||||
extern MapperCommRes *MAPx;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
void Mapper_Init(void);
|
||||
void asm_Mapper_Write(uint8 byData,uint16 wAddr);
|
||||
void asm_Mapper_ReadLow( uint16 wAddr);
|
||||
void asm_Mapper_WriteLow( uint8 byData ,uint16 wAddr);
|
||||
void asm_Mapper_Write(uint8_t byData, uint16_t wAddr);
|
||||
void asm_Mapper_ReadLow(uint16_t wAddr);
|
||||
void asm_Mapper_WriteLow(uint8_t byData, uint16_t wAddr);
|
||||
|
||||
void map67_(signed char page); //6502.s
|
||||
void map89_(signed char page);
|
||||
void map67_(signed char page); // 6502.s
|
||||
void map89_(signed char page);
|
||||
void mapAB_(signed char page);
|
||||
void mapCD_(signed char page);
|
||||
void mapEF_(signed char page);//<2F>з<EFBFBD><D0B7><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||
void mapEF_(signed char page); // <EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||
|
||||
void set_CPU_bank3(signed char page );
|
||||
void set_CPU_bank4(signed char page );
|
||||
void set_CPU_bank5(signed char page );
|
||||
void set_CPU_bank6(signed char page );
|
||||
void set_CPU_bank7(signed char page );
|
||||
void set_CPU_banks(int bank0_num,int bank1_num,int bank2_num, int bank3_num);
|
||||
|
||||
void set_PPU_banks( uint32 bank0_num, uint32 bank1_num,
|
||||
uint32 bank2_num, uint32 bank3_num,
|
||||
uint32 bank4_num, uint32 bank5_num,
|
||||
uint32 bank6_num, uint32 bank7_num);
|
||||
void set_PPU_bank0(uint32 bank_num);
|
||||
void set_PPU_bank1(uint32 bank_num);
|
||||
void set_PPU_bank2(uint32 bank_num);
|
||||
void set_PPU_bank3(uint32 bank_num);
|
||||
void set_PPU_bank4(uint32 bank_num);
|
||||
void set_PPU_bank5(uint32 bank_num);
|
||||
void set_PPU_bank6(uint32 bank_num);
|
||||
void set_PPU_bank7(uint32 bank_num);
|
||||
void set_PPU_bank8(uint32 bank_num);
|
||||
void set_PPU_bank9(uint32 bank_num);
|
||||
void set_PPU_bank10(uint32 bank_num);
|
||||
void set_PPU_bank11(uint32 bank_num);
|
||||
void set_VRAM_bank(uint8 bank, uint32 bank_num);
|
||||
void set_CPU_bank3(signed char page);
|
||||
void set_CPU_bank4(signed char page);
|
||||
void set_CPU_bank5(signed char page);
|
||||
void set_CPU_bank6(signed char page);
|
||||
void set_CPU_bank7(signed char page);
|
||||
void set_CPU_banks(int bank0_num, int bank1_num, int bank2_num, int bank3_num);
|
||||
|
||||
void set_PPU_banks(uint32_t bank0_num, uint32_t bank1_num, uint32_t bank2_num,
|
||||
uint32_t bank3_num, uint32_t bank4_num, uint32_t bank5_num,
|
||||
uint32_t bank6_num, uint32_t bank7_num);
|
||||
void set_PPU_bank0(uint32_t bank_num);
|
||||
void set_PPU_bank1(uint32_t bank_num);
|
||||
void set_PPU_bank2(uint32_t bank_num);
|
||||
void set_PPU_bank3(uint32_t bank_num);
|
||||
void set_PPU_bank4(uint32_t bank_num);
|
||||
void set_PPU_bank5(uint32_t bank_num);
|
||||
void set_PPU_bank6(uint32_t bank_num);
|
||||
void set_PPU_bank7(uint32_t bank_num);
|
||||
void set_PPU_bank8(uint32_t bank_num);
|
||||
void set_PPU_bank9(uint32_t bank_num);
|
||||
void set_PPU_bank10(uint32_t bank_num);
|
||||
void set_PPU_bank11(uint32_t bank_num);
|
||||
void set_VRAM_bank(uint8_t bank, uint32_t bank_num);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,143 +1,128 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// NES APU <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __NES_PPU_H
|
||||
#define __NES_PPU_H
|
||||
#define __NES_PPU_H
|
||||
|
||||
#include "nes_main.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<30><35>NESģ<53><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES APU <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#undef NULL
|
||||
#define NULL 0
|
||||
|
||||
#undef NULL
|
||||
#define NULL 0
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
static const unsigned int NES_Palette[64]=
|
||||
{
|
||||
0x73AE,0x20D1,0x0015,0x4013,0x880E,0xA802,0xA000,0x7840,
|
||||
0x4160,0x0220,0x0280,0x01E2,0x19EB,0x0000,0x0000,0x0000,
|
||||
0xBDF7,0x039D,0x21DD,0x801E,0xB817,0xE00B,0xD940,0xCA61,
|
||||
0x8B80,0x04A0,0x0540,0x0487,0x0411,0x0000,0x0000,0x0000,
|
||||
0xF79E,0x3DFF,0x5CBF,0xA45F,0xF3DF,0xFBB6,0xFBAC,0xFCC7,
|
||||
0xF5E7,0x8682,0x4EE9,0x5FD3,0x075B,0x0000,0x0000,0x0000,
|
||||
0xF79E,0xAF3F,0xC6BF,0xD65F,0xFE3F,0xFE3B,0xFDF6,0xFED5,
|
||||
0xFF34,0xE7F4,0xAF97,0xB7F9,0x9FFE,0x0000,0x0000,0x0000
|
||||
};
|
||||
static const unsigned int NES_Palette[64] = {
|
||||
0x73AE, 0x20D1, 0x0015, 0x4013, 0x880E, 0xA802, 0xA000, 0x7840,
|
||||
0x4160, 0x0220, 0x0280, 0x01E2, 0x19EB, 0x0000, 0x0000, 0x0000,
|
||||
0xBDF7, 0x039D, 0x21DD, 0x801E, 0xB817, 0xE00B, 0xD940, 0xCA61,
|
||||
0x8B80, 0x04A0, 0x0540, 0x0487, 0x0411, 0x0000, 0x0000, 0x0000,
|
||||
0xF79E, 0x3DFF, 0x5CBF, 0xA45F, 0xF3DF, 0xFBB6, 0xFBAC, 0xFCC7,
|
||||
0xF5E7, 0x8682, 0x4EE9, 0x5FD3, 0x075B, 0x0000, 0x0000, 0x0000,
|
||||
0xF79E, 0xAF3F, 0xC6BF, 0xD65F, 0xFE3F, 0xFE3B, 0xFDF6, 0xFED5,
|
||||
0xFF34, 0xE7F4, 0xAF97, 0xB7F9, 0x9FFE, 0x0000, 0x0000, 0x0000};
|
||||
|
||||
/*
|
||||
static unsigned int NES_Palette[64]=
|
||||
{
|
||||
0x73AE,0x20D1,0x0015,0x4013,0x880E,0xA802,0xA000,0x7840,
|
||||
0x4160,0x0220,0x0280,0x01E2,0x19EB,0x0000,0x0000,0x0000,
|
||||
0xBDF7,0x039D,0x21DD,0x801E,0xB817,0xE00B,0xD940,0xCA61,
|
||||
0x8B80,0x04A0,0x0540,0x0487,0x0411,0x0000,0x0000,0x0000,
|
||||
0xF79E,0x3DFF,0x5CBF,0xA45F,0xF3DF,0xFBB6,0xFBAC,0xFCC7,
|
||||
0xF5E7,0x8682,0x4EE9,0x5FD3,0x075B,0x0000,0x0000,0x0000,
|
||||
0xF79E,0xAF3F,0xC6BF,0xD65F,0xFE3F,0xFE3B,0xFDF6,0xFED5,
|
||||
0xFF34,0xE7F4,0xAF97,0xB7F9,0x9FFE,0x0000,0x0000,0x0000
|
||||
0x73AE,0x20D1,0x0015,0x4013,0x880E,0xA802,0xA000,0x7840,
|
||||
0x4160,0x0220,0x0280,0x01E2,0x19EB,0x0000,0x0000,0x0000,
|
||||
0xBDF7,0x039D,0x21DD,0x801E,0xB817,0xE00B,0xD940,0xCA61,
|
||||
0x8B80,0x04A0,0x0540,0x0487,0x0411,0x0000,0x0000,0x0000,
|
||||
0xF79E,0x3DFF,0x5CBF,0xA45F,0xF3DF,0xFBB6,0xFBAC,0xFCC7,
|
||||
0xF5E7,0x8682,0x4EE9,0x5FD3,0x075B,0x0000,0x0000,0x0000,
|
||||
0xF79E,0xAF3F,0xC6BF,0xD65F,0xFE3F,0xFE3B,0xFDF6,0xFED5,
|
||||
0xFF34,0xE7F4,0xAF97,0xB7F9,0x9FFE,0x0000,0x0000,0x0000
|
||||
};
|
||||
*/
|
||||
|
||||
extern uint8_t
|
||||
*VROM_banks; // VROM<4F><4D>ʼ<EFBFBD><CABC>ַ ͼ<><CDBC><EFBFBD><EFBFBD>*************************************
|
||||
extern uint8_t *VROM_tiles;
|
||||
extern uint8_t *PPU_VRAM_banks[12];
|
||||
extern uint8_t *PPU_tile_banks[8];
|
||||
extern uint8_t *PPU_patterntables; // 8192//VROM<4F><4D>ʼ<EFBFBD><CABC>ַ
|
||||
// ͼ<><CDBC><EFBFBD><EFBFBD>*************************************
|
||||
extern uint8_t *spr_ram; // sprite ram
|
||||
|
||||
|
||||
extern u8* VROM_banks; //VROM<4F><4D>ʼ<EFBFBD><CABC>ַ ͼ<><CDBC><EFBFBD><EFBFBD>*************************************
|
||||
extern u8* VROM_tiles;
|
||||
extern uint8* PPU_VRAM_banks[12];
|
||||
extern uint8* PPU_tile_banks[8];
|
||||
extern uint8* PPU_patterntables; //8192//VROM<4F><4D>ʼ<EFBFBD><CABC>ַ ͼ<><CDBC><EFBFBD><EFBFBD>*************************************
|
||||
extern uint8* spr_ram; //sprite ram
|
||||
|
||||
enum
|
||||
{
|
||||
NES_SCREEN_WIDTH = 256,
|
||||
NES_SCREEN_HEIGHT = 240,
|
||||
SIDE_MARGIN = 8,
|
||||
NES_SCREEN_WIDTH_VIEWABLE = NES_SCREEN_WIDTH,
|
||||
NES_BACKBUF_WIDTH = NES_SCREEN_WIDTH + (2*SIDE_MARGIN)
|
||||
enum {
|
||||
NES_SCREEN_WIDTH = 256,
|
||||
NES_SCREEN_HEIGHT = 240,
|
||||
SIDE_MARGIN = 8,
|
||||
NES_SCREEN_WIDTH_VIEWABLE = NES_SCREEN_WIDTH,
|
||||
NES_BACKBUF_WIDTH = NES_SCREEN_WIDTH + (2 * SIDE_MARGIN)
|
||||
};
|
||||
enum
|
||||
{
|
||||
BG_WRITTEN_FLAG = 0x01,
|
||||
SPR_WRITTEN_FLAG = 0x02
|
||||
};
|
||||
enum { BG_WRITTEN_FLAG = 0x01, SPR_WRITTEN_FLAG = 0x02 };
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32 in_vblank;
|
||||
uint32 current_frame_line;
|
||||
uint16 bg_pattern_table_addr;
|
||||
uint16 spr_pattern_table_addr;
|
||||
uint16 ppu_addr_inc;
|
||||
uint16 loopy_v; // vram address -- used for reading/writing through $2007
|
||||
// see loopy-2005.txt
|
||||
uint16 loopy_t; // temp vram address
|
||||
uint8 loopy_x; // 3-bit subtile x-offset
|
||||
uint8 toggle_2005_2006;
|
||||
uint8 spr_ram_rw_ptr; // sprite ram read/write pointer<65>ڴ<EFBFBD><DAB4><EFBFBD>/дָ<D0B4><D6B8>
|
||||
uint8 read_2007_buffer;
|
||||
uint8 LowRegs[0x08];
|
||||
uint8 bg_pal[0x10]; //extern BYTE BGPal[0x20]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
|
||||
uint8 spr_pal[0x10]; //extern BYTE SPPal[0x20]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
|
||||
typedef struct {
|
||||
uint32_t in_vblank;
|
||||
uint32_t current_frame_line;
|
||||
uint16_t bg_pattern_table_addr;
|
||||
uint16_t spr_pattern_table_addr;
|
||||
uint16_t ppu_addr_inc;
|
||||
uint16_t loopy_v; // vram address -- used for reading/writing through $2007
|
||||
// see loopy-2005.txt
|
||||
uint16_t loopy_t; // temp vram address
|
||||
uint8_t loopy_x; // 3-bit subtile x-offset
|
||||
uint8_t toggle_2005_2006;
|
||||
uint8_t spr_ram_rw_ptr; // sprite ram read/write pointer<65>ڴ<EFBFBD><DAB4><EFBFBD>/дָ<D0B4><D6B8>
|
||||
uint8_t read_2007_buffer;
|
||||
uint8_t LowRegs[0x08];
|
||||
uint8_t bg_pal[0x10]; // extern BYTE BGPal[0x20];
|
||||
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
|
||||
uint8_t spr_pal[0x10]; // extern BYTE SPPal[0x20];
|
||||
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
|
||||
|
||||
uint8 PPU_nametables[4*0x400]; //4096 PPU<50><55><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>RAM
|
||||
// Rick
|
||||
uint8* PPU_VRAM_banks[12];
|
||||
uint8* PPU_tile_banks[8];
|
||||
uint8* PPU_tile_tables;
|
||||
uint8 solid_buf[NES_BACKBUF_WIDTH]; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD>λ<EFBFBD><CEBB>־<EFBFBD><D6BE>
|
||||
uint8 dummy_buffer[NES_BACKBUF_WIDTH]; // used to do sprite 0 hit detection when we aren't supposed to draw
|
||||
|
||||
|
||||
} ppu_data;
|
||||
uint8_t PPU_nametables[4 * 0x400]; // 4096 PPU<50><55><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>RAM
|
||||
// Rick
|
||||
uint8_t *PPU_VRAM_banks[12];
|
||||
uint8_t *PPU_tile_banks[8];
|
||||
uint8_t *PPU_tile_tables;
|
||||
uint8_t solid_buf[NES_BACKBUF_WIDTH]; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD>λ<EFBFBD><CEBB>־<EFBFBD><D6BE>
|
||||
uint8_t dummy_buffer[NES_BACKBUF_WIDTH]; // used to do sprite 0 hit detection
|
||||
// when we aren't supposed to draw
|
||||
|
||||
} ppu_data;
|
||||
|
||||
extern ppu_data *ppu;
|
||||
extern u8 *spr_ram;
|
||||
|
||||
extern ppu_data *ppu;
|
||||
extern uint8_t *spr_ram;
|
||||
|
||||
|
||||
uint32 spr_enabled(void);
|
||||
uint32 bg_enabled(void);
|
||||
void set_name_table(uint8 bank, int bank_num);
|
||||
void set_tile_bank(int i, uint8 *bank);
|
||||
void compile(int count, uint8 *src, uint8 *dest);
|
||||
void set_tile_banks(uint8 *bank0, uint8 *bank1, uint8 *bank2, uint8 *bank3,
|
||||
uint8 *bank4, uint8 *bank5, uint8 *bank6, uint8 *bank7);
|
||||
uint32_t spr_enabled(void);
|
||||
uint32_t bg_enabled(void);
|
||||
void set_name_table(uint8_t bank, int bank_num);
|
||||
void set_tile_bank(int i, uint8_t *bank);
|
||||
void compile(int count, uint8_t *src, uint8_t *dest);
|
||||
void set_tile_banks(uint8_t *bank0, uint8_t *bank1, uint8_t *bank2, uint8_t *bank3,
|
||||
uint8_t *bank4, uint8_t *bank5, uint8_t *bank6, uint8_t *bank7);
|
||||
void PPU_reset(void *lcd_addr);
|
||||
void PPU_start_frame(void);
|
||||
void set_mirroring(uint32 nt0, uint32 nt1, uint32 nt2, uint32 nt3);//<2F><><EFBFBD>ô<EFBFBD>ֱˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
uint8 ReadLowRegs(uint32 addr);
|
||||
void WriteLowRegs(uint32 addr, uint8 data);
|
||||
void set_mirroring(uint32_t nt0, uint32_t nt1, uint32_t nt2,
|
||||
uint32_t nt3); // <20><><EFBFBD>ô<EFBFBD>ֱˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
uint8_t ReadLowRegs(uint32_t addr);
|
||||
void WriteLowRegs(uint32_t addr, uint8_t data);
|
||||
void scanline_draw(int LineNo);
|
||||
void do_scanline_and_draw(uint8* buf);
|
||||
void do_scanline_and_draw(uint8_t *buf);
|
||||
|
||||
// Rick
|
||||
void start_frame(uint8 *buf, int ypitch);
|
||||
void end_frame(uint8 *buf);
|
||||
void start_frame(uint8_t *buf, int ypitch);
|
||||
void end_frame(uint8_t *buf);
|
||||
void do_scanline_and_dont_draw(int LineNo);
|
||||
uint32 NMI_enabled(void);
|
||||
uint32_t NMI_enabled(void);
|
||||
void start_vblank(void);
|
||||
void end_vblank(void);
|
||||
void render_bg(uint8* buf);
|
||||
void render_spr(uint8* buf);
|
||||
void update_tile(int byteOffset, uint8 data);
|
||||
void render_bg(uint8_t *buf);
|
||||
void render_spr(uint8_t *buf);
|
||||
void update_tile(int byteOffset, uint8_t data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user