Nathaniel Walizer 7 месяцев назад
Родитель
Сommit
e465e241b8
5 измененных файлов: 86 добавлений и 13 удалений
  1. +1
    -1
      Makefile
  2. +15
    -10
      src/linux/port.c
  3. +47
    -0
      src/menu.c
  4. +20
    -0
      src/menu.h
  5. +3
    -2
      src/port.h

+ 1
- 1
Makefile Просмотреть файл

@@ -33,7 +33,7 @@ NESE_SRC_SRCS = f6502.c f6502_opcodes.c
NESE_SRC_SRCS += nese.c nes.c cart.c mapper.c
NESE_SRC_SRCS += ppu.c apu.c
NESE_SRC_SRCS += memory.c serdes.c save.c rle.c
NESE_SRC_SRCS += cartinfo.c
NESE_SRC_SRCS += cartinfo.c menu.c
NESE_SRC_SRCS += $(OS)/port.c
NESE_GFX_SRCS = $(notdir $(wildcard $(GFXDIR)/*.c))
NESE_MAP_SRCS = $(notdir $(wildcard $(MAPDIR)/*.c))


+ 15
- 10
src/linux/port.c Просмотреть файл

@@ -15,6 +15,7 @@
#include "save.h"
#include "draw.h"
#include "cartinfo.h"
#include "menu.h"

#define NESE_DEBUG "Port"
#include "log.h"
@@ -98,11 +99,6 @@ typedef struct {

/* Input */

int nese_update_input(void* plat_data, nes_Input* input) {
// Gamepad states are already updated in nese_frame_ready()
return 0;
}

static const int sdl_action_keycodes[Action_Max] = {
[Action_Menu] = SDLK_ESCAPE,
[Action_Reset] = SDLK_BACKSPACE,
@@ -179,6 +175,13 @@ static nese_Action process_events(nes* sys) {
return action;
}

nese_Action nese_update_input(void* plat_data, nes_Input* input) {
platform_data* plat = (platform_data*)plat_data;
nese_Action action = process_events(plat->sys);
if (NULL != input) *input = plat->sys->core.memory.input;
return action;
}


/*
* Time / Video - Should be maximally reusable across platforms
@@ -353,8 +356,9 @@ int nese_frame_ready(void* plat_data) {

/* Drawing */

void nese_draw_begin(void* plat_data, int dim) {
draw_begin(&((platform_data*)plat_data)->renderer, dim);
void nese_draw_begin(void* plat_data) {
platform_data* plat = (platform_data*)plat_data;
draw_begin(&plat->renderer, NULL != plat->cart.filename);
}

void nese_draw_text(void* plat_data, const char* str, int x, int y, uint32_t c) {
@@ -422,14 +426,15 @@ int main(int argc, char* argv[]) {

if (0 == status) {
if (argc <= 1) {
LOGI("No ROM file provided.");
modal_popup(&plat, "No ROM file provided.", color_error);
status = -1;

} else {
status = load_cart(&plat.cart, argv[1], &sys);
if (0 != status) {
LOGE("Failed to load %s", argv[1]);
// TODO: Error modal on load failure
char message[128];
snprintf(message, sizeof(message), "Failed to load %s", argv[1]);
modal_popup(&plat, message, color_error);
}
}



+ 47
- 0
src/menu.c Просмотреть файл

@@ -0,0 +1,47 @@
#include "menu.h"
#include "nes.h"
#include "action.h"
#include "port.h"


static nese_Action wait_for_input(void* plat, uint8_t* new_buttons) {
nes_Input input = {0};
nese_Action action = nese_update_input(plat, &input);
uint8_t changed = 0;

while (0 == changed && Action_OK == action) {
// TODO: Sleep
uint8_t buttons = input.gamepads[0].buttons;
action = nese_update_input(plat, &input);
changed = (~buttons & input.gamepads[0].buttons);
}

if (NULL != new_buttons) *new_buttons = input.gamepads[0].buttons;

return action;
}


int modal_popup(void* plat, const char* message, uint32_t color) {
int w = 0;
int h = 0;

nese_text_size(plat, message, &w, &h);

int x = ((int)nes_ppu_render_w - w) / 2;
int y = ((int)nes_ppu_render_h - h) / 2;

if (x < 5) x = 5;
if (y < 5) y = 5;

nese_Action action = 0;
uint8_t buttons = 0;
while (0 == action && 0 == buttons) {
nese_draw_begin(plat);
nese_draw_text(plat, message, x, y, color);
nese_draw_finish(plat);
action = wait_for_input(plat, &buttons);
}

return action;
}

+ 20
- 0
src/menu.h Просмотреть файл

@@ -0,0 +1,20 @@
#ifndef NESE_MENU_H_
#define NESE_MENU_H_

#include "cartinfo.h"


typedef struct {
int cursor;
int top;
} Menu_State;


int run_rom_menu(void*, Menu_State*, const Cart_Info*, char* file, int sz_file);

int run_game_menu(void*, Menu_State*);

int modal_popup(void*, const char* message, uint32_t color);


#endif // NESE_MENU_H_

+ 3
- 2
src/port.h Просмотреть файл

@@ -4,6 +4,7 @@
#include <stdio.h>

#include "input.h"
#include "action.h"


int nese_file_size(FILE* file);
@@ -23,7 +24,7 @@ int nese_frame_start(void*, uint8_t background);
int nese_line_ready(void*, uint8_t* buffer, int line);
int nese_frame_ready(void*);

int nese_update_input(void*, nes_Input*);
nese_Action nese_update_input(void*, nes_Input*);

int nese_get_audio_frequency(void*);

@@ -33,7 +34,7 @@ void* nese_alloc_cpu(int);
void* nese_alloc(int);


void nese_draw_begin(void*, int dim);
void nese_draw_begin(void*);
void nese_draw_text(void*, const char*, int x, int y, uint32_t color);
void nese_text_size(void*, const char*, int* w, int* h);
void nese_draw_finish(void*);


Загрузка…
Отмена
Сохранить