-Screenshot function moved to NDSSystem.c. Now all ports can use a universal screenshot function.

-moved __PACKED type to types.h
This commit is contained in:
cyberwarriorx 2006-10-15 21:42:16 +00:00
parent 76bb37145d
commit b8a4e56b98
5 changed files with 112 additions and 85 deletions

View File

@ -37,6 +37,36 @@ void NDS_Init(void) {
armcpu_new(&NDS_ARM7,1);
armcpu_new(&NDS_ARM9,0);
//ARM7 BIOS IRQ HANDLER
MMU_writeWord(1, 0x00, 0xE25EF002);
MMU_writeWord(1, 0x04, 0xEAFFFFFE);
MMU_writeWord(1, 0x18, 0xEA000000);
MMU_writeWord(1, 0x20, 0xE92D500F);
MMU_writeWord(1, 0x24, 0xE3A00301);
MMU_writeWord(1, 0x28, 0xE28FE000);
MMU_writeWord(1, 0x2C, 0xE510F004);
MMU_writeWord(1, 0x30, 0xE8BD500F);
MMU_writeWord(1, 0x34, 0xE25EF004);
//ARM9 BIOS IRQ HANDLER
MMU_writeWord(0, 0xFFF0018, 0xEA000000);
MMU_writeWord(0, 0xFFF0020, 0xE92D500F);
MMU_writeWord(0, 0xFFF0024, 0xEE190F11);
MMU_writeWord(0, 0xFFF0028, 0xE1A00620);
MMU_writeWord(0, 0xFFF002C, 0xE1A00600);
MMU_writeWord(0, 0xFFF0030, 0xE2800C40);
MMU_writeWord(0, 0xFFF0034, 0xE28FE000);
MMU_writeWord(0, 0xFFF0038, 0xE510F004);
MMU_writeWord(0, 0xFFF003C, 0xE8BD500F);
MMU_writeWord(0, 0xFFF0040, 0xE25EF004);
MMU_writeWord(0, 0x0000004, 0xE3A0010E);
MMU_writeWord(0, 0x0000008, 0xE3A01020);
// MMU_writeWord(0, 0x000000C, 0xE1B02110);
MMU_writeWord(0, 0x000000C, 0xE1B02040);
MMU_writeWord(0, 0x0000010, 0xE3B02020);
// MMU_writeWord(0, 0x0000010, 0xE2100202);
}
void NDS_DeInit(void) {
@ -307,3 +337,79 @@ void NDS_Reset(void)
execute = oldexecute;
}
typedef struct
{
u32 size;
s32 width;
s32 height;
u16 planes;
u16 bpp;
u32 cmptype;
u32 imgsize;
s32 hppm;
s32 vppm;
u32 numcol;
u32 numimpcol;
} bmpimgheader_struct;
typedef struct
{
u16 id __PACKED;
u32 size __PACKED;
u16 reserved1 __PACKED;
u16 reserved2 __PACKED;
u32 imgoffset __PACKED;
} bmpfileheader_struct;
int NDS_WriteBMP(const char *filename)
{
bmpfileheader_struct fileheader;
bmpimgheader_struct imageheader;
FILE *file;
int i,j,k;
u16 *bmp = GPU_screen;
memset(&fileheader, 0, sizeof(fileheader));
fileheader.size = sizeof(fileheader);
fileheader.id = 'B' | ('M' << 8);
fileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader);
memset(&imageheader, 0, sizeof(imageheader));
imageheader.size = sizeof(imageheader);
imageheader.width = 256;
imageheader.height = 192*2;
imageheader.planes = 1;
imageheader.bpp = 24;
imageheader.cmptype = 0; // None
imageheader.imgsize = imageheader.width * imageheader.height * 3;
if ((file = fopen(filename,"wb")) == NULL)
return 0;
fwrite(&fileheader, 1, sizeof(fileheader), file);
fwrite(&imageheader, 1, sizeof(imageheader), file);
for(j=0;j<192*2;j++)
{
for(i=0;i<256;i++)
{
u8 r,g,b;
u16 pixel = bmp[(192*2-j-1)*256+i];
r = pixel>>10;
pixel-=r<<10;
g = pixel>>5;
pixel-=g<<5;
b = pixel;
r*=255/31;
g*=255/31;
b*=255/31;
fwrite(&r, 1, sizeof(u8), file);
fwrite(&g, 1, sizeof(u8), file);
fwrite(&b, 1, sizeof(u8), file);
}
}
fclose(file);
return 1;
}

View File

@ -193,6 +193,8 @@ int NDS_LoadROM(const char *filename);
void NDS_FreeROM(void);
void NDS_Reset(void);
int NDS_WriteBMP(const char *filename);
static INLINE void NDS_ARM9HBlankInt(void)
{
if(((u16 *)ARM9Mem.ARM9_REG)[0x0004>>1]&0x10)

View File

@ -14,10 +14,6 @@
#define FILE_FREE 0xE5
#define __PACKED __attribute__((__packed__))
// Boot Sector - must be packed
typedef struct
{

View File

@ -118,4 +118,6 @@ typedef enum
ARM7 = 1
} cpu_id_t;
#define __PACKED __attribute__((__packed__))
#endif

View File

@ -148,55 +148,6 @@ BOOL LoadROM(char * filename)
return FALSE;
}
int WriteBMP(const char *filename,u16 *bmp){
BITMAPFILEHEADER fileheader;
BITMAPV4HEADER imageheader;
FILE *file;
int i,j,k;
memset(&fileheader, 0, sizeof(fileheader));
fileheader.bfType = 'B' | ('M' << 8);
fileheader.bfSize = sizeof(fileheader);
fileheader.bfOffBits = sizeof(fileheader)+sizeof(imageheader);
memset(&imageheader, 0, sizeof(imageheader));
imageheader.bV4Size = sizeof(imageheader);
imageheader.bV4Width = 256;
imageheader.bV4Height = 192*2;
imageheader.bV4Planes = 1;
imageheader.bV4BitCount = 24;
imageheader.bV4V4Compression = BI_RGB;
imageheader.bV4SizeImage = imageheader.bV4Width * imageheader.bV4Height * sizeof(RGBTRIPLE);
if ((file = fopen(filename,"wb")) == NULL)
return 0;
fwrite(&fileheader, 1, sizeof(fileheader), file);
fwrite(&imageheader, 1, sizeof(imageheader), file);
for(j=0;j<192*2;j++)
{
for(i=0;i<256;i++)
{
u8 r,g,b;
u16 pixel = bmp[(192*2-j-1)*256+i];
r = pixel>>10;
pixel-=r<<10;
g = pixel>>5;
pixel-=g<<5;
b = pixel;
r*=255/31;
g*=255/31;
b*=255/31;
fwrite(&r, 1, sizeof(u8), file);
fwrite(&g, 1, sizeof(u8), file);
fwrite(&b, 1, sizeof(u8), file);
}
}
fclose(file);
return 1;
}
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
@ -239,36 +190,6 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
NDS_Init();
//ARM7 BIOS IRQ HANDLER
MMU_writeWord(1, 0x00, 0xE25EF002);
MMU_writeWord(1, 0x04, 0xEAFFFFFE);
MMU_writeWord(1, 0x18, 0xEA000000);
MMU_writeWord(1, 0x20, 0xE92D500F);
MMU_writeWord(1, 0x24, 0xE3A00301);
MMU_writeWord(1, 0x28, 0xE28FE000);
MMU_writeWord(1, 0x2C, 0xE510F004);
MMU_writeWord(1, 0x30, 0xE8BD500F);
MMU_writeWord(1, 0x34, 0xE25EF004);
//ARM9 BIOS IRQ HANDLER
MMU_writeWord(0, 0xFFF0018, 0xEA000000);
MMU_writeWord(0, 0xFFF0020, 0xE92D500F);
MMU_writeWord(0, 0xFFF0024, 0xEE190F11);
MMU_writeWord(0, 0xFFF0028, 0xE1A00620);
MMU_writeWord(0, 0xFFF002C, 0xE1A00600);
MMU_writeWord(0, 0xFFF0030, 0xE2800C40);
MMU_writeWord(0, 0xFFF0034, 0xE28FE000);
MMU_writeWord(0, 0xFFF0038, 0xE510F004);
MMU_writeWord(0, 0xFFF003C, 0xE8BD500F);
MMU_writeWord(0, 0xFFF0040, 0xE25EF004);
MMU_writeWord(0, 0x0000004, 0xE3A0010E);
MMU_writeWord(0, 0x0000008, 0xE3A01020);
// MMU_writeWord(0, 0x000000C, 0xE1B02110);
MMU_writeWord(0, 0x000000C, 0xE1B02040);
MMU_writeWord(0, 0x0000010, 0xE3B02020);
// MMU_writeWord(0, 0x0000010, 0xE2100202);
CreateThread(NULL, 0, run, NULL, 0, &threadID);
if(LoadROM(lpszArgument))
@ -541,12 +462,12 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
ofn.lpstrDefExt = "bmp";
ofn.Flags = OFN_OVERWRITEPROMPT;
GetSaveFileName(&ofn);
WriteBMP(filename,GPU_screen);
NDS_WriteBMP(filename);
}
return 0;
case IDM_QUICK_PRINTSCREEN:
{
WriteBMP("./printscreen.bmp",GPU_screen);
NDS_WriteBMP("./printscreen.bmp");
}
return 0;
case IDM_STATE_LOAD: