-CLI port is now switched over to C
This commit is contained in:
parent
bfabd56b52
commit
79c3011b19
|
@ -1,4 +1,4 @@
|
|||
bin_PROGRAMS = desmume-cli
|
||||
desmume_cli_SOURCES = main.cpp
|
||||
desmume_cli_SOURCES = main.c
|
||||
desmume_cli_LDADD = ../libdesmume.a $(SDL_LIBS)
|
||||
desmume_cli_CXXFLAGS = $(SDL_CFLAGS)
|
||||
|
|
|
@ -0,0 +1,204 @@
|
|||
#include "SDL.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <libgen.h>
|
||||
|
||||
#include "../MMU.h"
|
||||
#include "../NDSSystem.h"
|
||||
#include "../windows/cflash.h"
|
||||
#include "../debug.h"
|
||||
|
||||
BOOL execute = FALSE;
|
||||
|
||||
void * DeSmuME_Rom_Data;
|
||||
unsigned long DeSmuME_Rom_Mask;
|
||||
unsigned long DeSmuME_Cycles;
|
||||
|
||||
SDL_Surface * surface;
|
||||
|
||||
int Draw() {
|
||||
SDL_Surface *rawImage;
|
||||
|
||||
rawImage = SDL_CreateRGBSurfaceFrom((void*)&GPU_screen, 256, 384, 16, 512, 0x001F, 0x03E0, 0x7C00, 0);
|
||||
if(rawImage == NULL) return 1;
|
||||
|
||||
SDL_BlitSurface(rawImage, 0, surface, 0);
|
||||
SDL_UpdateRect(surface, 0, 0, 0, 0);
|
||||
|
||||
SDL_FreeSurface(rawImage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int DeSmuME_MMU_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);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DeSmuME_Load(const char * filename) {
|
||||
FILE * NdsFile;
|
||||
unsigned long DeSmuME_Rom_Size;
|
||||
|
||||
NdsFile = fopen(filename, "rb");
|
||||
|
||||
if(!NdsFile)
|
||||
return -1;
|
||||
|
||||
fseek(NdsFile, 0, SEEK_END);
|
||||
DeSmuME_Rom_Size = ftell(NdsFile);
|
||||
fseek(NdsFile, 0, SEEK_SET);
|
||||
|
||||
DeSmuME_Rom_Mask = DeSmuME_Rom_Size;
|
||||
DeSmuME_Rom_Mask |= (DeSmuME_Rom_Mask >>1);
|
||||
DeSmuME_Rom_Mask |= (DeSmuME_Rom_Mask >>2);
|
||||
DeSmuME_Rom_Mask |= (DeSmuME_Rom_Mask >>4);
|
||||
DeSmuME_Rom_Mask |= (DeSmuME_Rom_Mask >>8);
|
||||
DeSmuME_Rom_Mask |= (DeSmuME_Rom_Mask >>16);
|
||||
|
||||
DeSmuME_Rom_Data = malloc(DeSmuME_Rom_Mask + 1);
|
||||
|
||||
if(!DeSmuME_Rom_Data)
|
||||
{
|
||||
fclose(NdsFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(fread(DeSmuME_Rom_Data, 1, DeSmuME_Rom_Size, NdsFile) != DeSmuME_Rom_Size)
|
||||
{
|
||||
fclose(NdsFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fclose(NdsFile);
|
||||
|
||||
return DeSmuME_Rom_Size;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
BOOL click;
|
||||
unsigned short keypad;
|
||||
SDL_Event event;
|
||||
int end = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
LogStart();
|
||||
#endif
|
||||
NDSInit();
|
||||
|
||||
DeSmuME_Cycles = 0;
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "usage: %s filename\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (DeSmuME_Load(argv[1]) < 0) {
|
||||
fprintf(stderr, "error while loading %s\n", argv[1]);
|
||||
return 2;
|
||||
}
|
||||
|
||||
DeSmuME_MMU_Init();
|
||||
NDS_loadROM((unsigned char*) DeSmuME_Rom_Data, DeSmuME_Rom_Mask);
|
||||
|
||||
strcpy(szRomPath, dirname(argv[1]));
|
||||
cflash_close();
|
||||
cflash_init();
|
||||
|
||||
execute = TRUE;
|
||||
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
SDL_WM_SetCaption("Desmume SDL", NULL);
|
||||
|
||||
surface = SDL_SetVideoMode(256, 384, 32, SDL_SWSURFACE);
|
||||
|
||||
|
||||
|
||||
while(!end) {
|
||||
|
||||
|
||||
|
||||
|
||||
keypad=0x0000;
|
||||
|
||||
Uint8 *keys;
|
||||
keys = SDL_GetKeyState(NULL);
|
||||
if(keys[SDLK_UP]) keypad |= 0x40;
|
||||
if(keys[SDLK_DOWN]) keypad |= 0x80;
|
||||
if(keys[SDLK_RIGHT]) keypad |= 0x10;
|
||||
if(keys[SDLK_LEFT]) keypad |= 0x20;
|
||||
if(keys[SDLK_SPACE]) keypad |= 0x1;
|
||||
if(keys['b']) keypad |= 0x2;
|
||||
if(keys[SDLK_BACKSPACE]) keypad |= 0x4;
|
||||
if(keys[SDLK_RETURN]) keypad |= 0x8;
|
||||
if(keys['0']) keypad |= 0x200;
|
||||
if(keys['.']) keypad |= 0x100;
|
||||
|
||||
((unsigned short *)ARM9Mem.ARM9_REG)[0x130>>1] = ~keypad;
|
||||
((unsigned short *)MMU.ARM7_REG)[0x130>>1] = ~keypad;
|
||||
|
||||
|
||||
if (SDL_PollEvent(&event)) {
|
||||
switch(event.type) {
|
||||
case SDL_QUIT:
|
||||
end = 1;
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN: // Un bouton fut appuyé
|
||||
if(event.button.button==1) click=TRUE;
|
||||
|
||||
case SDL_MOUSEMOTION: // La souris a été déplacée sur l?écran
|
||||
|
||||
if(!click) break;
|
||||
|
||||
if(event.button.y>=192)
|
||||
{
|
||||
signed long x = event.button.x;
|
||||
signed long y = event.button.y - 192;
|
||||
if(x<0) x = 0; else if(x>255) x = 255;
|
||||
if(y<0) y = 0; else if(y>192) y = 192;
|
||||
NDS_setTouchPos(x, y);
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP: // Le bouton de la souris a été relaché
|
||||
if(click)NDS_releasTouch();
|
||||
click=FALSE;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
NDS_exec(1120380, FALSE);
|
||||
Draw();
|
||||
}
|
||||
|
||||
SDL_Quit();
|
||||
NDSDeInit();
|
||||
#ifdef DEBUG
|
||||
LogStop();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue