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