First commit
This commit is contained in:
commit
8ec65dc6ae
|
@ -0,0 +1,3 @@
|
||||||
|
/shrooms-vb
|
||||||
|
/shrooms-vb.exe
|
||||||
|
.vscode
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "shrooms-vb-core"]
|
||||||
|
path = shrooms-vb-core
|
||||||
|
url = https://git.virtual-boy.com/PVB/shrooms-vb-core.git
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Shrooms VB (native)
|
||||||
|
|
||||||
|
An SDL-based implementation of shrooms-vb.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Install the following dependencies:
|
||||||
|
- `gcc` (or MinGW on Windows) (or whatever, just set `CC`)
|
||||||
|
- `pkg-config`
|
||||||
|
- sdl2
|
||||||
|
|
||||||
|
Run
|
||||||
|
```sh
|
||||||
|
make build
|
||||||
|
```
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include <cli.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int parseCLIArgs(int argc, char **argv, CLIArgs *args) {
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "usage: %s /path/to/rom.vb\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
args->filename = argv[1];
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef SHROOMS_VB_NATIVE_CLI_
|
||||||
|
#define SHROOMS_VB_NATIVE_CLI_
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *filename;
|
||||||
|
} CLIArgs;
|
||||||
|
|
||||||
|
int parseCLIArgs(int argc, char **argv, CLIArgs *args);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include <game.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
int sleepNanos(long int ns) {
|
||||||
|
struct timespec time;
|
||||||
|
time.tv_sec = ns / 1000000000;
|
||||||
|
time.tv_nsec = ns % 1000000000;
|
||||||
|
return nanosleep(&time, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAX_STEP_CLOCKS 20000
|
||||||
|
|
||||||
|
int runGame(VB *sim) {
|
||||||
|
uint32_t clocks;
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
clocks = MAX_STEP_CLOCKS;
|
||||||
|
vbEmulate(sim, &clocks);
|
||||||
|
while (SDL_PollEvent(&event)) {
|
||||||
|
if (event.type == SDL_QUIT) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleepNanos((MAX_STEP_CLOCKS - clocks) * 50);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef SHROOMS_VB_NATIVE_GAME_
|
||||||
|
#define SHROOMS_VB_NATIVE_GAME_
|
||||||
|
|
||||||
|
#include <vb.h>
|
||||||
|
|
||||||
|
int runGame(VB *sim);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,100 @@
|
||||||
|
#include <cli.h>
|
||||||
|
#include <game.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include "shrooms-vb-core/core/vb.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
uint8_t *readROM(char *filename, uint32_t *size) {
|
||||||
|
FILE *file = fopen(filename, "rb");
|
||||||
|
uint8_t *rom;
|
||||||
|
long filesize;
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
perror("could not open file");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fseek(file, 0, SEEK_END)) {
|
||||||
|
perror("could not seek file end");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
filesize = ftell(file);
|
||||||
|
if (filesize == -1) {
|
||||||
|
perror("could not read file size");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (fseek(file, 0, SEEK_SET)) {
|
||||||
|
perror("could not seek file start");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*size = (uint32_t) filesize;
|
||||||
|
rom = malloc(*size);
|
||||||
|
if (!rom) {
|
||||||
|
perror("could not allocate ROM");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
fread(rom, 1, *size, file);
|
||||||
|
if (ferror(file)) {
|
||||||
|
perror("could not read file");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (fclose(file)) {
|
||||||
|
perror("could not close file");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
VB *sim;
|
||||||
|
uint8_t *rom;
|
||||||
|
uint32_t romSize;
|
||||||
|
SDL_Surface *winSurface;
|
||||||
|
SDL_Window *window;
|
||||||
|
CLIArgs args;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if (parseCLIArgs(argc, argv, &args)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rom = readROM(args.filename, &romSize);
|
||||||
|
if (!rom) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sim = malloc(vbSizeOf());
|
||||||
|
vbInit(sim);
|
||||||
|
vbSetCartROM(sim, rom, romSize);
|
||||||
|
|
||||||
|
if (SDL_Init(SDL_INIT_EVERYTHING)) {
|
||||||
|
fprintf(stderr, "Error initializing SDL: %s\n", SDL_GetError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
window = SDL_CreateWindow("Shrooms VB",
|
||||||
|
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||||
|
384, 224, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
|
if (!window) {
|
||||||
|
fprintf(stderr, "Error creating window: %s\n", SDL_GetError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
winSurface = SDL_GetWindowSurface(window);
|
||||||
|
if (!winSurface) {
|
||||||
|
fprintf(stderr, "Error getting surface: %s\n", SDL_GetError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_FillRect(winSurface, NULL, SDL_MapRGB(winSurface->format, 255, 0, 0));
|
||||||
|
SDL_UpdateWindowSurface(window);
|
||||||
|
|
||||||
|
status = runGame(sim);
|
||||||
|
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
SDL_Quit();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
CC?=gcc
|
||||||
|
SHROOMSFLAGS=shrooms-vb-core/core/vb.c -I shrooms-vb-core/core
|
||||||
|
SDL2FLAGS=$(shell pkg-config sdl2 --cflags --libs)
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
ifeq ($(OS),WINDOWS_NT)
|
||||||
|
@del shrooms-vb.exe
|
||||||
|
else
|
||||||
|
@rm -f shrooms-vb
|
||||||
|
endif
|
||||||
|
|
||||||
|
build:
|
||||||
|
@$(CC) cli.c game.c main.c -I . \
|
||||||
|
$(SHROOMSFLAGS) $(SDL2FLAGS) \
|
||||||
|
-D POSIX_C_SOURCE=199309L \
|
||||||
|
-o shrooms-vb \
|
||||||
|
-Werror -std=c90 -Wall -Wextra -Wpedantic
|
Loading…
Reference in New Issue