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