mirror of https://github.com/mgba-emu/mgba.git
3DS: Add 3DS main file
This commit is contained in:
parent
39c88da650
commit
4b5822a8ec
|
@ -10,8 +10,6 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
#include "3ds-vfs.h"
|
||||
|
||||
#include "util/vfs.h"
|
||||
|
||||
#include "util/memory.h"
|
||||
|
||||
struct VFile3DS {
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
#include "util/vfs.h"
|
||||
|
||||
#include <3ds.h>
|
||||
|
||||
struct VFile* VFileOpen3DS(FS_archive archive, const char* path, int flags);
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
/* Copyright (c) 2013-2014 Jeffrey Pfau
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
#include "gba.h"
|
||||
#include "gba-video.h"
|
||||
|
||||
#include "renderers/video-software.h"
|
||||
|
||||
#include "3ds-vfs.h"
|
||||
|
||||
#include <3ds.h>
|
||||
|
||||
int main() {
|
||||
srvInit();
|
||||
aptInit();
|
||||
hidInit(0);
|
||||
gfxInit();
|
||||
fsInit();
|
||||
|
||||
gfxSetScreenFormat(GFX_BOTTOM, GSP_RGBA8_OES);
|
||||
|
||||
struct GBAVideoSoftwareRenderer renderer;
|
||||
GBAVideoSoftwareRendererCreate(&renderer);
|
||||
|
||||
size_t stride = sizeof(color_t) * VIDEO_HORIZONTAL_PIXELS * BYTES_PER_PIXEL;
|
||||
color_t* videoBuffer = malloc(stride * VIDEO_VERTICAL_PIXELS);
|
||||
struct GBA* gba = malloc(sizeof(struct GBA));
|
||||
struct ARMCore* cpu = malloc(sizeof(struct ARMCore));
|
||||
int activeKeys = 0;
|
||||
|
||||
renderer.outputBuffer = videoBuffer;
|
||||
renderer.outputBufferStride = stride;
|
||||
|
||||
gba->keySource = &activeKeys;
|
||||
gba->sync = 0;
|
||||
|
||||
FS_archive sdmcArchive = (FS_archive) {
|
||||
ARCH_SDMC,
|
||||
(FS_path) { PATH_EMPTY, 1, (u8*)"" },
|
||||
0, 0
|
||||
};
|
||||
|
||||
struct VFile* rom = VFileOpen3DS(sdmcArchive, "/rom.gba", O_RDONLY);
|
||||
struct VFile* save = VFileOpen3DS(sdmcArchive, "/rom.sav", O_RDWR | O_CREAT);
|
||||
|
||||
GBACreate(gba);
|
||||
ARMSetComponents(cpu, &gba->d, 0, 0);
|
||||
ARMInit(cpu);
|
||||
|
||||
GBAVideoAssociateRenderer(&gba->video, &renderer.d);
|
||||
|
||||
GBALoadROM(gba, rom, save, "rom.gba");
|
||||
|
||||
ARMReset(cpu);
|
||||
|
||||
bool seenVblank = false;
|
||||
while (aptMainLoop()) {
|
||||
hidScanInput();
|
||||
|
||||
ARMRunLoop(cpu);
|
||||
|
||||
if (!seenVblank) {
|
||||
if (GBARegisterDISPSTATIsInVblank(gba->video.dispstat)) {
|
||||
u16 width, height;
|
||||
u8* screen = gfxGetFramebuffer(GFX_BOTTOM, GFX_BOTTOM, &width, &height);
|
||||
int y;
|
||||
for (y = 0; y < VIDEO_VERTICAL_PIXELS; ++y) {
|
||||
u8* row = &screen[(width - VIDEO_HORIZONTAL_PIXELS) * BYTES_PER_PIXEL / 2];
|
||||
row = &row[width * BYTES_PER_PIXEL * (((height - VIDEO_VERTICAL_PIXELS) / 2) + y)];
|
||||
memcpy(row, &videoBuffer[stride * y], stride);
|
||||
}
|
||||
|
||||
gfxSwapBuffersGpu();
|
||||
gspWaitForEvent(GSPEVENT_VBlank0, false);
|
||||
}
|
||||
}
|
||||
|
||||
seenVblank = GBARegisterDISPSTATIsInVblank(gba->video.dispstat);
|
||||
}
|
||||
|
||||
ARMDeinit(cpu);
|
||||
GBADestroy(gba);
|
||||
|
||||
free(gba);
|
||||
free(cpu);
|
||||
|
||||
rom->close(rom);
|
||||
save->close(save);
|
||||
|
||||
fsExit();
|
||||
gfxExit();
|
||||
hidExit();
|
||||
aptExit();
|
||||
srvExit();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue