From b119290d1e7579c75cecbc93d89fb7db095d9754 Mon Sep 17 00:00:00 2001 From: Fierelier Date: Mon, 23 Sep 2024 09:42:01 +0200 Subject: [PATCH] Initial commit --- readme.txt | 17 ++++++++++++++ sdl2/Makefile | 40 ++++++++++++++++++++++++++++++++ sdl2/main.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ sdl2/main.o | Bin 0 -> 23872 bytes 4 files changed, 119 insertions(+) create mode 100644 readme.txt create mode 100755 sdl2/Makefile create mode 100755 sdl2/main.c create mode 100644 sdl2/main.o diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..cd22cf0 --- /dev/null +++ b/readme.txt @@ -0,0 +1,17 @@ +If you want to dev on PS2, you should install this: https://github.com/ps2dev/ps2dev + +Note that a lot of things changed inside ps2dev around 2019, making a lot of documentation on the internet obsolete. Don't do what we did and try to use SDL1, it's broken now. Use SDL2. + +To make this project, cd into a directory and use "make". You can use ps2-packer to make the resulting elf smaller. + +How to debug .ELFs on the PS2 over LAN: +- Put ps2link on memory card (configs did not load from USB), configure appropriately (IP, netmask, gateway): https://www.psx-place.com/resources/ps2link.949/ +- Start ps2link on PS2 +- Use ps2client (part of ps2dev) on PC to manage PS2 +- Start elf: ps2client -h 192.168.0.x execee host:sdl2.elf +- Reset: ps2client -h 192.168.0.x reset + +Special thanks to: +- haloopdy for mental support +- All the people at https://github.com/ps2dev for making this possible +- https://github.com/fjtrujy/helloWorldPS2 for opening our world diff --git a/sdl2/Makefile b/sdl2/Makefile new file mode 100755 index 0000000..afc0da9 --- /dev/null +++ b/sdl2/Makefile @@ -0,0 +1,40 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2022, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. + +EE_BIN = sdl2.elf +EE_OBJS = main.o +EE_CFLAGS += -fdata-sections -ffunction-sections -I$(PS2SDK)/ports/include +EE_LDFLAGS += -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -lSDL2 -lgskit -ldmakit -lps2_drivers -Wl,--gc-sections + +ifeq ($(DUMMY_TIMEZONE), 1) + EE_CFLAGS += -DDUMMY_TIMEZONE +endif + +ifeq ($(DUMMY_LIBC_INIT), 1) + EE_CFLAGS += -DDUMMY_LIBC_INIT +endif + +ifeq ($(KERNEL_NOPATCH), 1) + EE_CFLAGS += -DKERNEL_NOPATCH +endif + +ifeq ($(DEBUG), 1) + EE_CFLAGS += -DDEBUG -O0 -g +else + EE_CFLAGS += -Os + EE_LDFLAGS += -s +endif + +all: $(EE_BIN) + +clean: + rm -rf $(EE_OBJS) $(EE_BIN) + +# Include makefiles +include $(PS2SDK)/samples/Makefile.pref +include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/sdl2/main.c b/sdl2/main.c new file mode 100755 index 0000000..0a6e3e3 --- /dev/null +++ b/sdl2/main.c @@ -0,0 +1,62 @@ +#include +#include "SDL2/SDL.h" +int printf(const char *format, ...); + +char * ps2elf_storage; + +int main(int argc, char **argv) +{ + // Just some debugging + printf("Arguments:\n"); + for (int i=0; i < argc; i++) { + printf("* %d: %s\n",i,argv[i]); + } + printf("\n"); + + // Getting the device from elf path + char * sep = strchr(argv[0], ':'); + if (sep == NULL) { + printf("ERROR: Could not find storage device of elf!\n"); + return 1; + } else { + size_t size = sep - argv[0]; + ps2elf_storage = malloc(size + 1); + memcpy(ps2elf_storage,argv[0],size); + ps2elf_storage[size] = 0; + printf("* Detected storage device: '%s'\n",ps2elf_storage); + } + + // Initializing SDL2 + printf("[SDL2] Initializing ...\n"); + SDL_Init(SDL_INIT_VIDEO); + + printf("[SDL2] Creating window ...\n"); + int width = 640; + int height = 480; + SDL_Window * window = SDL_CreateWindow("game", + 0,0, + width,height, + 0 + ); + + printf("[SDL2] Grabbing surface ...\n"); + SDL_Surface * surface = SDL_GetWindowSurface(window); + Uint16 * pixels = surface->pixels; + Uint32 tracker = 0; + + // Draw-loop + printf("[SDL2] Entering draw-loop ...\n"); + int x; int y; + while (1) { + // Just doing some fun animated pattern + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + pixels[(((y * width) + x) + tracker) % (width * height)] = (tracker + (x ^ y)) + y; + } + } + tracker = tracker + 3; + SDL_UpdateWindowSurface(window); + printf("\r"); fflush(stdout); // printf seems to fire an interrupt, which allows ps2link to reset the console, so we keep sending an "empty" debug message. + } + return 0; +} diff --git a/sdl2/main.o b/sdl2/main.o new file mode 100644 index 0000000000000000000000000000000000000000..bb4187cf607bd94a5c62ccd490c2b19ea7f2773c GIT binary patch literal 23872 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 literal 0 HcmV?d00001