parent
							
								
									cd29cca495
								
							
						
					
					
						commit
						4e3495948c
					
				| 
						 | 
				
			
			@ -7,7 +7,7 @@ An SDL-based implementation of shrooms-vb.
 | 
			
		|||
Install the following dependencies:
 | 
			
		||||
 - `gcc` (or MinGW on Windows) (or whatever, just set `CC`)
 | 
			
		||||
 - `pkg-config`
 | 
			
		||||
 - sdl3
 | 
			
		||||
 - sdl2
 | 
			
		||||
 | 
			
		||||
Run
 | 
			
		||||
```sh
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								audio.c
								
								
								
								
							
							
						
						
									
										17
									
								
								audio.c
								
								
								
								
							| 
						 | 
				
			
			@ -4,28 +4,31 @@
 | 
			
		|||
int audioInit(AudioContext *aud) {
 | 
			
		||||
    SDL_AudioSpec spec;
 | 
			
		||||
    spec.freq = 41700;
 | 
			
		||||
    spec.format = SDL_AUDIO_S16;
 | 
			
		||||
    spec.format = AUDIO_S16;
 | 
			
		||||
    spec.channels = 2;
 | 
			
		||||
    spec.samples = 1024;
 | 
			
		||||
    spec.callback = NULL;
 | 
			
		||||
    spec.userdata = NULL;
 | 
			
		||||
 | 
			
		||||
    aud->stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &spec, NULL, NULL);
 | 
			
		||||
    aud->id = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0);
 | 
			
		||||
    aud->paused = true;
 | 
			
		||||
    if (!aud->stream) {
 | 
			
		||||
        fprintf(stderr, "could not open audio device stream: %s\n", SDL_GetError());
 | 
			
		||||
    if (!aud->id) {
 | 
			
		||||
        fprintf(stderr, "could not open audio device: %s\n", SDL_GetError());
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int audioUpdate(AudioContext *aud, void *data, uint32_t bytes) {
 | 
			
		||||
    if (!aud->stream) return -1;
 | 
			
		||||
    if (!aud->id) return -1;
 | 
			
		||||
 | 
			
		||||
    if (!SDL_PutAudioStreamData(aud->stream, data, bytes)) {
 | 
			
		||||
    if (SDL_QueueAudio(aud->id, data, bytes)) {
 | 
			
		||||
        fprintf(stderr, "could not write audio: %s\n", SDL_GetError());
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (aud->paused) {
 | 
			
		||||
        SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(aud->stream));
 | 
			
		||||
        SDL_PauseAudioDevice(aud->id, false);
 | 
			
		||||
        aud->paused = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								audio.h
								
								
								
								
							
							
						
						
									
										4
									
								
								audio.h
								
								
								
								
							| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
#ifndef SHROOMS_VB_NATIVE_AUDIO_
 | 
			
		||||
#define SHROOMS_VB_NATIVE_AUDIO_
 | 
			
		||||
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL2/SDL.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    SDL_AudioStream *stream;
 | 
			
		||||
    SDL_AudioDeviceID id;
 | 
			
		||||
    bool paused;
 | 
			
		||||
} AudioContext;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								controller.c
								
								
								
								
							
							
						
						
									
										22
									
								
								controller.c
								
								
								
								
							| 
						 | 
				
			
			@ -17,28 +17,28 @@
 | 
			
		|||
#define VB_RL  0x4000
 | 
			
		||||
#define VB_RD  0x8000
 | 
			
		||||
 | 
			
		||||
static uint16_t symToMask(SDL_Keycode sym) {
 | 
			
		||||
static uint16_t symToMask(SDL_KeyCode sym) {
 | 
			
		||||
    switch (sym) {
 | 
			
		||||
    default: return 0;
 | 
			
		||||
    case SDLK_A:
 | 
			
		||||
    case SDLK_a:
 | 
			
		||||
        return VB_SEL;
 | 
			
		||||
    case SDLK_S:
 | 
			
		||||
    case SDLK_s:
 | 
			
		||||
        return VB_STA;
 | 
			
		||||
    case SDLK_D:
 | 
			
		||||
    case SDLK_d:
 | 
			
		||||
        return VB_B;
 | 
			
		||||
    case SDLK_F:
 | 
			
		||||
    case SDLK_f:
 | 
			
		||||
        return VB_A;
 | 
			
		||||
    case SDLK_E:
 | 
			
		||||
    case SDLK_e:
 | 
			
		||||
        return VB_LT;
 | 
			
		||||
    case SDLK_R:
 | 
			
		||||
    case SDLK_r:
 | 
			
		||||
        return VB_RT;
 | 
			
		||||
    case SDLK_I:
 | 
			
		||||
    case SDLK_i:
 | 
			
		||||
        return VB_RU;
 | 
			
		||||
    case SDLK_J:
 | 
			
		||||
    case SDLK_j:
 | 
			
		||||
        return VB_RL;
 | 
			
		||||
    case SDLK_K:
 | 
			
		||||
    case SDLK_k:
 | 
			
		||||
        return VB_RD;
 | 
			
		||||
    case SDLK_L:
 | 
			
		||||
    case SDLK_l:
 | 
			
		||||
        return VB_RR;
 | 
			
		||||
    case SDLK_UP:
 | 
			
		||||
        return VB_LU;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#ifndef SHROOMS_VB_NATIVE_CONTROLLER_
 | 
			
		||||
#define SHROOMS_VB_NATIVE_CONTROLLER_
 | 
			
		||||
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL2/SDL.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								game.c
								
								
								
								
							
							
						
						
									
										12
									
								
								game.c
								
								
								
								
							| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
#include <assets.h>
 | 
			
		||||
#include <controller.h>
 | 
			
		||||
#include <game.h>
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL2/SDL.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -73,14 +73,14 @@ int runGame(VB *sim, GraphicsContext *gfx) {
 | 
			
		|||
        sleepNanos(((MAX_STEP_CLOCKS - clocks) * 50) - (ticks - prevTicks));
 | 
			
		||||
 | 
			
		||||
        while (SDL_PollEvent(&event)) {
 | 
			
		||||
            if (event.type == SDL_EVENT_QUIT) {
 | 
			
		||||
            if (event.type == SDL_QUIT) {
 | 
			
		||||
                return 0;
 | 
			
		||||
            }
 | 
			
		||||
            if (event.type == SDL_EVENT_KEY_DOWN) {
 | 
			
		||||
                ctrlKeyDown(&ctrl, event.key.key);
 | 
			
		||||
            if (event.type == SDL_KEYDOWN) {
 | 
			
		||||
                ctrlKeyDown(&ctrl, event.key.keysym.sym);
 | 
			
		||||
            }
 | 
			
		||||
            if (event.type == SDL_EVENT_KEY_UP) {
 | 
			
		||||
                ctrlKeyUp(&ctrl, event.key.key);
 | 
			
		||||
            if (event.type == SDL_KEYUP) {
 | 
			
		||||
                ctrlKeyUp(&ctrl, event.key.keysym.sym);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        vbSetKeys(sim, ctrlKeys(&ctrl));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								graphics.c
								
								
								
								
							
							
						
						
									
										10
									
								
								graphics.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
#include <graphics.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
static void copyScreenTexture(uint8_t *dst, const uint8_t *src, int pitch) {
 | 
			
		||||
    int x, y, i;
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +16,8 @@ static void copyScreenTexture(uint8_t *dst, const uint8_t *src, int pitch) {
 | 
			
		|||
 | 
			
		||||
int gfxInit(GraphicsContext *gfx) {
 | 
			
		||||
    gfx->window = SDL_CreateWindow("Shrooms VB",
 | 
			
		||||
        1536, 896, SDL_WINDOW_HIGH_PIXEL_DENSITY);
 | 
			
		||||
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
 | 
			
		||||
        1536, 896, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
 | 
			
		||||
    if (!gfx->window) {
 | 
			
		||||
        fprintf(stderr, "Error creating window: %s\n", SDL_GetError());
 | 
			
		||||
        return 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ void gfxDestroy(GraphicsContext *gfx) {
 | 
			
		|||
static void gfxUpdateEye(SDL_Texture *eye, const uint8_t *bytes) {
 | 
			
		||||
    void *target;
 | 
			
		||||
    int pitch;
 | 
			
		||||
    if (!SDL_LockTexture(eye, NULL, &target, &pitch)) {
 | 
			
		||||
    if (SDL_LockTexture(eye, NULL, &target, &pitch)) {
 | 
			
		||||
        fprintf(stderr, "Error locking buffer for eye: %s\n", SDL_GetError());
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -85,8 +85,8 @@ void gfxUpdateRightEye(GraphicsContext *gfx, const uint8_t *bytes) {
 | 
			
		|||
 | 
			
		||||
void gfxRender(GraphicsContext *gfx) {
 | 
			
		||||
    SDL_RenderClear(gfx->renderer);
 | 
			
		||||
    SDL_RenderTexture(gfx->renderer, gfx->leftEye, NULL, NULL);
 | 
			
		||||
    SDL_RenderTexture(gfx->renderer, gfx->rightEye, NULL, NULL);
 | 
			
		||||
    SDL_RenderCopy(gfx->renderer, gfx->leftEye, NULL, NULL);
 | 
			
		||||
    SDL_RenderCopy(gfx->renderer, gfx->rightEye, NULL, NULL);
 | 
			
		||||
    SDL_RenderPresent(gfx->renderer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#ifndef SHROOMS_VB_NATIVE_GRAPHICS_
 | 
			
		||||
#define SHROOMS_VB_NATIVE_GRAPHICS_
 | 
			
		||||
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL2/SDL.h>
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    SDL_Window *window;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								main.c
								
								
								
								
							
							
						
						
									
										5
									
								
								main.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,10 +1,9 @@
 | 
			
		|||
#include <cli.h>
 | 
			
		||||
#include <game.h>
 | 
			
		||||
#include <graphics.h>
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL2/SDL.h>
 | 
			
		||||
#include "shrooms-vb-core/core/vb.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
uint8_t *readROM(char *filename, uint32_t *size) {
 | 
			
		||||
    FILE *file = fopen(filename, "rb");
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +69,7 @@ int main(int argc, char **argv) {
 | 
			
		|||
    vbInit(sim);
 | 
			
		||||
    vbSetCartROM(sim, rom, romSize);
 | 
			
		||||
 | 
			
		||||
    if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)) {
 | 
			
		||||
    if (SDL_Init(SDL_INIT_EVERYTHING)) {
 | 
			
		||||
        fprintf(stderr, "Error initializing SDL: %s\n", SDL_GetError());
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								makefile
								
								
								
								
							
							
						
						
									
										6
									
								
								makefile
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
CC?=gcc
 | 
			
		||||
SHROOMSFLAGS=shrooms-vb-core/core/vb.c -I shrooms-vb-core/core
 | 
			
		||||
SDL3FLAGS=$(shell pkg-config sdl3 --cflags --libs)
 | 
			
		||||
SDL2FLAGS=$(shell pkg-config sdl2 --cflags --libs)
 | 
			
		||||
 | 
			
		||||
.PHONY: clean
 | 
			
		||||
clean:
 | 
			
		||||
| 
						 | 
				
			
			@ -12,8 +12,8 @@ endif
 | 
			
		|||
 | 
			
		||||
build:
 | 
			
		||||
	@$(CC) audio.c cli.c controller.c game.c graphics.c main.c assets/assets.s -I . \
 | 
			
		||||
		$(SHROOMSFLAGS) $(SDL3FLAGS) \
 | 
			
		||||
		-D _POSIX_C_SOURCE=199309L \
 | 
			
		||||
		$(SHROOMSFLAGS) $(SDL2FLAGS) \
 | 
			
		||||
		-D POSIX_C_SOURCE=199309L \
 | 
			
		||||
		-o shrooms-vb \
 | 
			
		||||
		-O3 -fno-strict-aliasing \
 | 
			
		||||
		-Werror -std=c90 -Wall -Wextra -Wpedantic
 | 
			
		||||
		Loading…
	
		Reference in New Issue