From 9bf0d0c8805e0bb53d0601cb1854684ac9260076 Mon Sep 17 00:00:00 2001 From: $pectr4 <159635610+SpectrTech@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:26:46 +0000 Subject: [PATCH] v1.00 --- CMakeLists.txt | 61 +++++++++ Makefile | 63 +++++++++ README.md | 28 ++++ sce_sys/icon0.png | Bin 0 -> 1559 bytes sce_sys/livearea/contents/bg.png | Bin 0 -> 548 bytes sce_sys/livearea/contents/startup.png | Bin 0 -> 597 bytes sce_sys/livearea/contents/template.xml | 11 ++ src/debugScreen.h | 180 +++++++++++++++++++++++++ src/debugScreenFont.c | 145 ++++++++++++++++++++ src/kernel.c | 180 +++++++++++++++++++++++++ src/kernel.h | 35 +++++ src/main.c | 109 +++++++++++++++ src/system.h | 12 ++ src/utils.c | 43 ++++++ src/utils.h | 18 +++ 15 files changed, 885 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 sce_sys/icon0.png create mode 100644 sce_sys/livearea/contents/bg.png create mode 100644 sce_sys/livearea/contents/startup.png create mode 100644 sce_sys/livearea/contents/template.xml create mode 100644 src/debugScreen.h create mode 100644 src/debugScreenFont.c create mode 100644 src/kernel.c create mode 100644 src/kernel.h create mode 100644 src/main.c create mode 100644 src/system.h create mode 100644 src/utils.c create mode 100644 src/utils.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..56dd8d7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,61 @@ +#Required lines +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{DOLCESDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{DOLCESDK}/share/dolce.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define DOLCESDK to point to your SDK path!") + endif() +endif() + + +project(VitaForge LANGUAGES C) #This is the name of your project. Note that "LANGUAGES C" is optional +include("${DOLCESDK}/share/dolce.cmake" REQUIRED) #Including the SDK's .cmake script is required + +set(VITA_APP_NAME "VitaForge") #Name displayed on the Home Screen +set(VITA_TITLEID "VITAFORGE") #Title ID : 9 characters, capital letters or digits only +set(VITA_VERSION "01.00") #Version of the app + +#Settings for the compilers, this will output an optimized C binary while displaying all warnings +#(-Wno-unknown-pragmas is for the "#pragma region" used in Visual Studio Code) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall -O3 -Wno-unknown-pragmas -fno-lto") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti -fno-exceptions") +#Settings for the param.sfo flags. This sets parental level to the minimum level. +set(DOLCE_MKSFOEX_FLAGS "${DOLCE_MKSFOEX_FLAGS} -d PARENTAL_LEVEL=1") + +#If you have any headers you use, make sure to put the directory here. +#Note that the PSP2, VitaSDK/DolceSDK and taiHEN headers are already included by default. +include_directories() + +#This is equivalent to placing "#define DEBUG" somewhere in your code. +#Useful for testing purposes. +add_definitions(-DDEBUG) + +link_directories( + ${CMAKE_CURRENT_BINARY_DIR} +) + +#All the .c files used by the project. +add_executable(${PROJECT_NAME} + main.c + debugScreenFont.c +) + +#Libraries the project will be linked against. VitaSDK docs can help you find most of them. +target_link_libraries(${PROJECT_NAME} + SceCtrl_stub + SceTouch_stub + SceLibKernel_stub + SceDisplayUser_stub + SceAppMgr_stub + taihen_stub +) + +#Creates a signed elf (EBOOT.BIN) +dolce_create_self(${PROJECT_NAME}.self ${PROJECT_NAME}) +#Packages the EBOOT.BIN into a vpk for installation. +dolce_create_vpk(${PROJECT_NAME}.vpk ${VITA_TITLEID} ${PROJECT_NAME}.self + VERSION ${VITA_VERSION} + NAME ${VITA_APP_NAME} +) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..23c95d1 --- /dev/null +++ b/Makefile @@ -0,0 +1,63 @@ +# You should only use Makefile-based build if you know what you're doing. +# For most vitasdk projects, CMake is a better choice. See CMakeLists.txt for an example. + +PHONY := all package clean +rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) + +CC := arm-vita-eabi-gcc +CXX := arm-vita-eabi-g++ +STRIP := arm-vita-eabi-strip + +PROJECT_TITLE := VitaForge +PROJECT_TITLEID := VSDK00007 + +PROJECT := VitaForge +CFLAGS += -Wl,-q -I../common +CXXFLAGS += -Wl,-q -std=c++11 -I../common + +SRC_C :=$(call rwildcard, src/, *.c) +SRC_CPP :=$(call rwildcard, src/, *.cpp) + +OBJ_DIRS := $(addprefix out/, $(dir $(SRC_C:src/%.c=%.o))) $(addprefix out/, $(dir $(SRC_CPP:src/%.cpp=%.o))) +OBJS := $(addprefix out/, $(SRC_C:src/%.c=%.o)) $(addprefix out/, $(SRC_CPP:src/%.cpp=%.o)) + +# Needed by psvDebugScreenPrintf +LIBS += -lSceDisplay_stub -lSceRegistryMgr_stub -lSceCtrl_stub -lSceVshBridge_stub # Added SceRegMgr_stub here + +all: package + +package: $(PROJECT).vpk + +$(PROJECT).vpk: eboot.bin param.sfo + vita-pack-vpk -s param.sfo -b eboot.bin \ + --add sce_sys/icon0.png=sce_sys/icon0.png \ + --add sce_sys/livearea/contents/bg.png=sce_sys/livearea/contents/bg.png \ + --add sce_sys/livearea/contents/startup.png=sce_sys/livearea/contents/startup.png \ + --add sce_sys/livearea/contents/template.xml=sce_sys/livearea/contents/template.xml \ + $(PROJECT).vpk + +eboot.bin: $(PROJECT).velf + vita-make-fself $(PROJECT).velf eboot.bin + +param.sfo: + vita-mksfoex -s TITLE_ID="$(PROJECT_TITLEID)" "$(PROJECT_TITLE)" param.sfo + +$(PROJECT).velf: $(PROJECT).elf + $(STRIP) -g $< + vita-elf-create $< $@ + +$(PROJECT).elf: $(OBJS) + $(CXX) $(CXXFLAGS) $^ $(LIBS) -o $@ + +$(OBJ_DIRS): + mkdir -p $@ + +out/%.o : src/%.cpp | $(OBJ_DIRS) + arm-vita-eabi-g++ -c $(CXXFLAGS) -o $@ $< + +out/%.o : src/%.c | $(OBJ_DIRS) + arm-vita-eabi-gcc -c $(CFLAGS) -o $@ $< + +clean: + rm -f $(PROJECT).velf $(PROJECT).elf $(PROJECT).vpk param.sfo eboot.bin $(OBJS) + rm -r $(abspath $(OBJ_DIRS)) diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a47888 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +## VitaForge - Playstation Vita mod menu v1.00 + +VitaForge - 3DSForge clone for the Playstation Vita + +Note: VitaForge got multiple times tested on real Playstation Viita hardware. + +**DISCLAIMER**: This tool is for educational purposes **ONLY** and I am not responsible for any damage. + +### Options (more coming soon) : +``` +Show full sys info (identy) +| Firmware version +| System version +| Playstation Vita Unit +| Motherboard +| Playstation Vita CID +| PSID +``` + +You can skip the compilation part if you want to. You just have to download the latest precompiled version from the releases. + +### Compilation: +Make sure you have vitasdk cmake g++/gcc installed before running these +``` +git clone https://github.com/SpectrTech/VitaForge.git +cd 3DSForge +make +``` \ No newline at end of file diff --git a/sce_sys/icon0.png b/sce_sys/icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4eca8ff2e2e6f79e6f3aa9b713cf6006403352 GIT binary patch literal 1559 zcmaJ>c{r2_9Dcv~+>IkM?qXaS=Qzf=GZ@EUryQk6C8>RMDAG;xErqn%NJQp-owA)eRit*u>e+wy+28ZL*Z=SP+cr}atgdFL20&dHB8Z$&>IYQF3H~fA z90O?Fnc>la6Y<|uGY9`ZgkQkUf$v>}kAsy2yCQJw!CHZk4=`VkX%v+8p~QsKAy{U> zqa6WHVHg8V7YIMY`6wp4L&Fi1ED-h=w0I!ZKu&_{RM_u1;8n!#( z)d|i45DHK;gQ7OvTEK09OC7wgz~?3cWYC`ppKGA0z_k&M2jP1gI>BHH5cmpH7eZMN z8XN?_gYhEhgn(0ykWXOvLV*qjA9O2l#c*$f-ENq#gZ}^sMQBfl@z1c{j*wvp2BBhz zkdFWX;Ruva3}?@88*Mdp$yy;n3f6qy->G<-7a`vh2o2+Z#UZ z?VyMth}aR|8p}4w3yZQie6RP zbUWzKtphIi)xWkn8bp-p4xJl|Ev#-#(3`V@vGhq*Qo3kmTsu##rc<@Fz%oKHhw_g< zTEZbqS_#{EQ8%dF;-_`*DCybB%h&LGV;%JB=hpXYSCYJ!8B>gQ;3KauDvw9(Z#hlO z&Gtx&NO7$1ICb~!)<7>x(kG_q#_2D_13kO~U7cDVYw;G&;q;<|WWx1^t#1Yr0~Vhq zs1Z^qSjaaxLkLpd6EBGN;u_Mxv$CovO1IZf*5hC0ENjT`D6C#JH_xiFZeLmV=ZJ!# zMI{?G_GO~tT(-c98j~aKDI@jv5VOpzju3s?VJDW_@XPPLr>B%OrDYU{v$&p~o_g+y z3bn3-n_NwD_IYPgXD)X4O9O^lQMRc~(!xod9=H8!^qtP;u(AcStB!A zo7!z3u)(?T>$ihL`nq!{x8y$t=2gV4pfAamSH)4%Wv}{=&VM$wd^*ySd-seUj$wL? z9y=w9X*+STSvd`dKBSjK>hZ5#jtrLPR^RR0nRLZ>LGse3&-QpV3+8yBe=)-!Z8uja9AoeAygqFG&uue&8EinYy@FH3v(%~M~6`o7=l zdTopeEk83x+V}QBx`Y0R;ob3k#s6Q$kF8Lfg_*E1F?wt|bpDqg?_C%u5{Uidv;F~8 C9x<^1 literal 0 HcmV?d00001 diff --git a/sce_sys/livearea/contents/bg.png b/sce_sys/livearea/contents/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..72383daf03a4edae334bb6c7c0889018dbe269a6 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0y~yVD?~OVEoJh6kxEIOPT@Xy!Lc)45_&F_Ld>n0R;h< zi+At*KexIpvmf_Fogod7j43f=^Mr_O}JZvW< ocqSN1C?p#=92=DwPC=q4H + + + + bg.png + + + + startup.png + + diff --git a/src/debugScreen.h b/src/debugScreen.h new file mode 100644 index 0000000..e3b95e1 --- /dev/null +++ b/src/debugScreen.h @@ -0,0 +1,180 @@ +#ifndef DEBUG_SCREEN_H +#define DEBUG_SCREEN_H + +#include +#include +#include +#include + +#include +#include +#include + +extern unsigned char psvDebugScreenFont[]; + +#define SCREEN_WIDTH (960) +#define SCREEN_HEIGHT (544) +#define SCREEN_FB_WIDTH (960) +#define SCREEN_FB_SIZE (2 * 1024 * 1024) +#define SCREEN_FB_ALIGN (256 * 1024) +#define SCREEN_GLYPH_W (8) +#define SCREEN_GLYPH_H (8) + +#define COLOR_BLACK 0xFF000000 +#define COLOR_RED 0xFF0000FF +#define COLOR_BLUE 0xFF00FF00 +#define COLOR_YELLOW 0xFF00FFFF +#define COLOR_GREEN 0xFFFF0000 +#define COLOR_MAGENTA 0xFFFF00FF +#define COLOR_CYAN 0xFFFFFF00 +#define COLOR_WHITE 0xFFFFFFFF +#define COLOR_GREY 0xFF808080 +#define COLOR_DEFAULT_FG COLOR_WHITE +#define COLOR_DEFAULT_BG COLOR_BLACK + +static int psvDebugScreenMutex; /*< avoid race condition when outputing strings */ +static uint32_t psvDebugScreenCoordX = 0; +static uint32_t psvDebugScreenCoordY = 0; +static uint32_t psvDebugScreenColorFg = COLOR_DEFAULT_FG; +static uint32_t psvDebugScreenColorBg = COLOR_DEFAULT_BG; +static SceDisplayFrameBuf psvDebugScreenFrameBuf = { + sizeof(SceDisplayFrameBuf), NULL, SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; + +/* Set the color of the foreground (text) */ +uint32_t psvDebugScreenSetFgColor(uint32_t color) { + uint32_t prev_color = psvDebugScreenColorFg; + psvDebugScreenColorFg = color; + return prev_color; +} + +/* Set the color of the background*/ +uint32_t psvDebugScreenSetBgColor(uint32_t color) { + uint32_t prev_color = psvDebugScreenColorBg; + psvDebugScreenColorBg = color; + return prev_color; +} + +static size_t psvDebugScreenEscape(const char *str){ + int i,j, p=0, params[8]={}; + for(i=0; i<8 && str[i]!='\0'; i++){ + if(str[i] >= '0' && str[i] <= '9'){ + params[p]=(params[p]*10) + (str[i] - '0'); + }else if(str[i] == ';'){ + p++; + }else if(str[i] == 'f' || str[i] == 'H'){ + psvDebugScreenCoordX = params[0] * SCREEN_GLYPH_W; + psvDebugScreenCoordY = params[1] * SCREEN_GLYPH_H; + break; + }else if (str[i] == 'm'){ + for(j=0; j<=p; j++){ + switch(params[j]/10){/*bold,dim,underline,blink,invert,hidden => unsupported yet */ + #define BIT2BYTE(bit) ( ((!!(bit&4))<<23) | ((!!(bit&2))<<15) | ((!!(bit&1))<<7) ) + case 0:psvDebugScreenSetFgColor(COLOR_DEFAULT_FG);psvDebugScreenSetBgColor(COLOR_DEFAULT_BG);break; + case 3:psvDebugScreenSetFgColor(BIT2BYTE(params[j]%10));break; + case 9:psvDebugScreenSetFgColor(BIT2BYTE(params[j]%10) | 0x7F7F7F7F);break; + case 4:psvDebugScreenSetBgColor(BIT2BYTE(params[j]%10));break; + case 10:psvDebugScreenSetBgColor(BIT2BYTE(params[j]%10) | 0x7F7F7F7F);break; + #undef BIT2BYTE + } + } + break; + } + } + return i; +} + +/*Initializes the psvDebugScreen library. Run this before any other function*/ +int psvDebugScreenInit() { + psvDebugScreenMutex = sceKernelCreateMutex("log_mutex", 0, 0, NULL); + SceUID displayblock = sceKernelAllocMemBlock("display", SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, SCREEN_FB_SIZE, NULL); + sceKernelGetMemBlockBase(displayblock, (void**)&psvDebugScreenFrameBuf.base); + + SceDisplayFrameBuf framebuf = { + .size = sizeof(framebuf), + .base = psvDebugScreenFrameBuf.base, + .pitch = SCREEN_WIDTH, + .pixelformat = SCE_DISPLAY_PIXELFORMAT_A8B8G8R8, + .width = SCREEN_WIDTH, + .height = SCREEN_HEIGHT, + }; + + return sceDisplaySetFrameBuf(&framebuf, SCE_DISPLAY_SETBUF_NEXTFRAME); +} + +/* Clears the screen*/ +void psvDebugScreenClear(int bg_color){ + psvDebugScreenCoordX = psvDebugScreenCoordY = 0; + int i; + for(i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) { + ((uint32_t*)psvDebugScreenFrameBuf.base)[i] = bg_color; + } +} + +#define PSV_DEBUG_SCALE 2 + +int psvDebugScreenPuts(const char * text){ + int c, i, j, l, x, y; + uint8_t *font; + uint32_t *vram_ptr; + uint32_t *vram; + + sceKernelLockMutex(psvDebugScreenMutex, 1, NULL); + + for (c = 0; text[c] != '\0' ; c++) { + if (psvDebugScreenCoordX + 8 > SCREEN_WIDTH) { + psvDebugScreenCoordY += SCREEN_GLYPH_H * PSV_DEBUG_SCALE; + psvDebugScreenCoordX = 0; + } + if (psvDebugScreenCoordY + 8 > SCREEN_HEIGHT) { + psvDebugScreenClear(psvDebugScreenColorBg); + } + if (text[c] == '\n') { + psvDebugScreenCoordX = 0; + psvDebugScreenCoordY += SCREEN_GLYPH_H * PSV_DEBUG_SCALE; + continue; + } else if (text[c] == '\r') { + psvDebugScreenCoordX = 0; + continue; + } else if ((text[c] == '\e') && (text[c+1] == '[')) { /* escape code (change color, position ...) */ + c+=psvDebugScreenEscape(text+2)+2; + continue; + } + + vram = (uint32_t*)psvDebugScreenFrameBuf.base; + + font = &psvDebugScreenFont[ (int)text[c] * 8]; + for (i = l = 0; i < SCREEN_GLYPH_W; i++, l += SCREEN_GLYPH_W, font++) { + for (j = 0; j < SCREEN_GLYPH_W; j++) { + for (y = 0; y < PSV_DEBUG_SCALE; y++) { + for (x = 0; x < PSV_DEBUG_SCALE; x++) { + vram_ptr = &vram[(psvDebugScreenCoordX + x + j * PSV_DEBUG_SCALE) + + (psvDebugScreenCoordY + y + i * PSV_DEBUG_SCALE) * SCREEN_FB_WIDTH]; + if ((*font & (128 >> j))) + *vram_ptr = psvDebugScreenColorFg; + else + *vram_ptr = psvDebugScreenColorBg; + } + } + } + } + psvDebugScreenCoordX += SCREEN_GLYPH_W * PSV_DEBUG_SCALE; + } + + sceKernelUnlockMutex(psvDebugScreenMutex, 1); + return c; +} + +/* printf to the screen */ +int psvDebugScreenPrintf(const char *format, ...) { + char buf[512]; + + va_list opt; + va_start(opt, format); + int ret = vsnprintf(buf, sizeof(buf), format, opt); + psvDebugScreenPuts(buf); + va_end(opt); + + return ret; +} + +#endif diff --git a/src/debugScreenFont.c b/src/debugScreenFont.c new file mode 100644 index 0000000..b1ff939 --- /dev/null +++ b/src/debugScreenFont.c @@ -0,0 +1,145 @@ +/* + * PSP Software Development Kit - http://www.pspdev.org + * ----------------------------------------------------------------------- + * Licensed under the BSD license, see LICENSE in PSPSDK root for details. + * + * font.c - Debug Font. + * + * Copyright (c) 2005 Marcus R. Brown + * Copyright (c) 2005 James Forshaw + * Copyright (c) 2005 John Kelley + * + * $Id: font.c 540 2005-07-08 19:35:10Z warren $ + */ + +unsigned char psvDebugScreenFont[]= +"\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x42\xa5\x81\xa5\x99\x42\x3c" +"\x3c\x7e\xdb\xff\xff\xdb\x66\x3c\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" +"\x10\x38\x7c\xfe\x7c\x38\x10\x00\x10\x38\x54\xfe\x54\x10\x38\x00" +"\x10\x38\x7c\xfe\xfe\x10\x38\x00\x00\x00\x00\x30\x30\x00\x00\x00" +"\xff\xff\xff\xe7\xe7\xff\xff\xff\x38\x44\x82\x82\x82\x44\x38\x00" +"\xc7\xbb\x7d\x7d\x7d\xbb\xc7\xff\x0f\x03\x05\x79\x88\x88\x88\x70" +"\x38\x44\x44\x44\x38\x10\x7c\x10\x30\x28\x24\x24\x28\x20\xe0\xc0" +"\x3c\x24\x3c\x24\x24\xe4\xdc\x18\x10\x54\x38\xee\x38\x54\x10\x00" +"\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x10\x10\xff\x00\x00\x00\x00" +"\x00\x00\x00\xff\x10\x10\x10\x10\x10\x10\x10\xf0\x10\x10\x10\x10" +"\x10\x10\x10\x1f\x10\x10\x10\x10\x10\x10\x10\xff\x10\x10\x10\x10" +"\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\xff\x00\x00\x00\x00" +"\x00\x00\x00\x1f\x10\x10\x10\x10\x00\x00\x00\xf0\x10\x10\x10\x10" +"\x10\x10\x10\x1f\x00\x00\x00\x00\x10\x10\x10\xf0\x00\x00\x00\x00" +"\x81\x42\x24\x18\x18\x24\x42\x81\x01\x02\x04\x08\x10\x20\x40\x80" +"\x80\x40\x20\x10\x08\x04\x02\x01\x00\x10\x10\xff\x10\x10\x00\x00" +"\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20\x20\x20\x00\x00\x20\x00" +"\x50\x50\x50\x00\x00\x00\x00\x00\x50\x50\xf8\x50\xf8\x50\x50\x00" +"\x20\x78\xa0\x70\x28\xf0\x20\x00\xc0\xc8\x10\x20\x40\x98\x18\x00" +"\x40\xa0\x40\xa8\x90\x98\x60\x00\x10\x20\x40\x00\x00\x00\x00\x00" +"\x10\x20\x40\x40\x40\x20\x10\x00\x40\x20\x10\x10\x10\x20\x40\x00" +"\x20\xa8\x70\x20\x70\xa8\x20\x00\x00\x20\x20\xf8\x20\x20\x00\x00" +"\x00\x00\x00\x00\x00\x20\x20\x40\x00\x00\x00\x78\x00\x00\x00\x00" +"\x00\x00\x00\x00\x00\x60\x60\x00\x00\x00\x08\x10\x20\x40\x80\x00" +"\x70\x88\x98\xa8\xc8\x88\x70\x00\x20\x60\xa0\x20\x20\x20\xf8\x00" +"\x70\x88\x08\x10\x60\x80\xf8\x00\x70\x88\x08\x30\x08\x88\x70\x00" +"\x10\x30\x50\x90\xf8\x10\x10\x00\xf8\x80\xe0\x10\x08\x10\xe0\x00" +"\x30\x40\x80\xf0\x88\x88\x70\x00\xf8\x88\x10\x20\x20\x20\x20\x00" +"\x70\x88\x88\x70\x88\x88\x70\x00\x70\x88\x88\x78\x08\x10\x60\x00" +"\x00\x00\x20\x00\x00\x20\x00\x00\x00\x00\x20\x00\x00\x20\x20\x40" +"\x18\x30\x60\xc0\x60\x30\x18\x00\x00\x00\xf8\x00\xf8\x00\x00\x00" +"\xc0\x60\x30\x18\x30\x60\xc0\x00\x70\x88\x08\x10\x20\x00\x20\x00" +"\x70\x88\x08\x68\xa8\xa8\x70\x00\x20\x50\x88\x88\xf8\x88\x88\x00" +"\xf0\x48\x48\x70\x48\x48\xf0\x00\x30\x48\x80\x80\x80\x48\x30\x00" +"\xe0\x50\x48\x48\x48\x50\xe0\x00\xf8\x80\x80\xf0\x80\x80\xf8\x00" +"\xf8\x80\x80\xf0\x80\x80\x80\x00\x70\x88\x80\xb8\x88\x88\x70\x00" +"\x88\x88\x88\xf8\x88\x88\x88\x00\x70\x20\x20\x20\x20\x20\x70\x00" +"\x38\x10\x10\x10\x90\x90\x60\x00\x88\x90\xa0\xc0\xa0\x90\x88\x00" +"\x80\x80\x80\x80\x80\x80\xf8\x00\x88\xd8\xa8\xa8\x88\x88\x88\x00" +"\x88\xc8\xc8\xa8\x98\x98\x88\x00\x70\x88\x88\x88\x88\x88\x70\x00" +"\xf0\x88\x88\xf0\x80\x80\x80\x00\x70\x88\x88\x88\xa8\x90\x68\x00" +"\xf0\x88\x88\xf0\xa0\x90\x88\x00\x70\x88\x80\x70\x08\x88\x70\x00" +"\xf8\x20\x20\x20\x20\x20\x20\x00\x88\x88\x88\x88\x88\x88\x70\x00" +"\x88\x88\x88\x88\x50\x50\x20\x00\x88\x88\x88\xa8\xa8\xd8\x88\x00" +"\x88\x88\x50\x20\x50\x88\x88\x00\x88\x88\x88\x70\x20\x20\x20\x00" +"\xf8\x08\x10\x20\x40\x80\xf8\x00\x70\x40\x40\x40\x40\x40\x70\x00" +"\x00\x00\x80\x40\x20\x10\x08\x00\x70\x10\x10\x10\x10\x10\x70\x00" +"\x20\x50\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00" +"\x40\x20\x10\x00\x00\x00\x00\x00\x00\x00\x70\x08\x78\x88\x78\x00" +"\x80\x80\xb0\xc8\x88\xc8\xb0\x00\x00\x00\x70\x88\x80\x88\x70\x00" +"\x08\x08\x68\x98\x88\x98\x68\x00\x00\x00\x70\x88\xf8\x80\x70\x00" +"\x10\x28\x20\xf8\x20\x20\x20\x00\x00\x00\x68\x98\x98\x68\x08\x70" +"\x80\x80\xf0\x88\x88\x88\x88\x00\x20\x00\x60\x20\x20\x20\x70\x00" +"\x10\x00\x30\x10\x10\x10\x90\x60\x40\x40\x48\x50\x60\x50\x48\x00" +"\x60\x20\x20\x20\x20\x20\x70\x00\x00\x00\xd0\xa8\xa8\xa8\xa8\x00" +"\x00\x00\xb0\xc8\x88\x88\x88\x00\x00\x00\x70\x88\x88\x88\x70\x00" +"\x00\x00\xb0\xc8\xc8\xb0\x80\x80\x00\x00\x68\x98\x98\x68\x08\x08" +"\x00\x00\xb0\xc8\x80\x80\x80\x00\x00\x00\x78\x80\xf0\x08\xf0\x00" +"\x40\x40\xf0\x40\x40\x48\x30\x00\x00\x00\x90\x90\x90\x90\x68\x00" +"\x00\x00\x88\x88\x88\x50\x20\x00\x00\x00\x88\xa8\xa8\xa8\x50\x00" +"\x00\x00\x88\x50\x20\x50\x88\x00\x00\x00\x88\x88\x98\x68\x08\x70" +"\x00\x00\xf8\x10\x20\x40\xf8\x00\x18\x20\x20\x40\x20\x20\x18\x00" +"\x20\x20\x20\x00\x20\x20\x20\x00\xc0\x20\x20\x10\x20\x20\xc0\x00" +"\x40\xa8\x10\x00\x00\x00\x00\x00\x00\x00\x20\x50\xf8\x00\x00\x00" +"\x70\x88\x80\x80\x88\x70\x20\x60\x90\x00\x00\x90\x90\x90\x68\x00" +"\x10\x20\x70\x88\xf8\x80\x70\x00\x20\x50\x70\x08\x78\x88\x78\x00" +"\x48\x00\x70\x08\x78\x88\x78\x00\x20\x10\x70\x08\x78\x88\x78\x00" +"\x20\x00\x70\x08\x78\x88\x78\x00\x00\x70\x80\x80\x80\x70\x10\x60" +"\x20\x50\x70\x88\xf8\x80\x70\x00\x50\x00\x70\x88\xf8\x80\x70\x00" +"\x20\x10\x70\x88\xf8\x80\x70\x00\x50\x00\x00\x60\x20\x20\x70\x00" +"\x20\x50\x00\x60\x20\x20\x70\x00\x40\x20\x00\x60\x20\x20\x70\x00" +"\x50\x00\x20\x50\x88\xf8\x88\x00\x20\x00\x20\x50\x88\xf8\x88\x00" +"\x10\x20\xf8\x80\xf0\x80\xf8\x00\x00\x00\x6c\x12\x7e\x90\x6e\x00" +"\x3e\x50\x90\x9c\xf0\x90\x9e\x00\x60\x90\x00\x60\x90\x90\x60\x00" +"\x90\x00\x00\x60\x90\x90\x60\x00\x40\x20\x00\x60\x90\x90\x60\x00" +"\x40\xa0\x00\xa0\xa0\xa0\x50\x00\x40\x20\x00\xa0\xa0\xa0\x50\x00" +"\x90\x00\x90\x90\xb0\x50\x10\xe0\x50\x00\x70\x88\x88\x88\x70\x00" +"\x50\x00\x88\x88\x88\x88\x70\x00\x20\x20\x78\x80\x80\x78\x20\x20" +"\x18\x24\x20\xf8\x20\xe2\x5c\x00\x88\x50\x20\xf8\x20\xf8\x20\x00" +"\xc0\xa0\xa0\xc8\x9c\x88\x88\x8c\x18\x20\x20\xf8\x20\x20\x20\x40" +"\x10\x20\x70\x08\x78\x88\x78\x00\x10\x20\x00\x60\x20\x20\x70\x00" +"\x20\x40\x00\x60\x90\x90\x60\x00\x20\x40\x00\x90\x90\x90\x68\x00" +"\x50\xa0\x00\xa0\xd0\x90\x90\x00\x28\x50\x00\xc8\xa8\x98\x88\x00" +"\x00\x70\x08\x78\x88\x78\x00\xf8\x00\x60\x90\x90\x90\x60\x00\xf0" +"\x20\x00\x20\x40\x80\x88\x70\x00\x00\x00\x00\xf8\x80\x80\x00\x00" +"\x00\x00\x00\xf8\x08\x08\x00\x00\x84\x88\x90\xa8\x54\x84\x08\x1c" +"\x84\x88\x90\xa8\x58\xa8\x3c\x08\x20\x00\x00\x20\x20\x20\x20\x00" +"\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x90\x48\x24\x48\x90\x00" +"\x28\x50\x20\x50\x88\xf8\x88\x00\x28\x50\x70\x08\x78\x88\x78\x00" +"\x28\x50\x00\x70\x20\x20\x70\x00\x28\x50\x00\x20\x20\x20\x70\x00" +"\x28\x50\x00\x70\x88\x88\x70\x00\x50\xa0\x00\x60\x90\x90\x60\x00" +"\x28\x50\x00\x88\x88\x88\x70\x00\x50\xa0\x00\xa0\xa0\xa0\x50\x00" +"\xfc\x48\x48\x48\xe8\x08\x50\x20\x00\x50\x00\x50\x50\x50\x10\x20" +"\xc0\x44\xc8\x54\xec\x54\x9e\x04\x10\xa8\x40\x00\x00\x00\x00\x00" +"\x00\x20\x50\x88\x50\x20\x00\x00\x88\x10\x20\x40\x80\x28\x00\x00" +"\x7c\xa8\xa8\x68\x28\x28\x28\x00\x38\x40\x30\x48\x48\x30\x08\x70" +"\x00\x00\x00\x00\x00\x00\xff\xff\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" +"\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" +"\x00\x00\x00\x3c\x3c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00" +"\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0" +"\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\x03\x03\x03\x03\x03\x03\x03\x03" +"\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x11\x22\x44\x88\x11\x22\x44\x88" +"\x88\x44\x22\x11\x88\x44\x22\x11\xfe\x7c\x38\x10\x00\x00\x00\x00" +"\x00\x00\x00\x00\x10\x38\x7c\xfe\x80\xc0\xe0\xf0\xe0\xc0\x80\x00" +"\x01\x03\x07\x0f\x07\x03\x01\x00\xff\x7e\x3c\x18\x18\x3c\x7e\xff" +"\x81\xc3\xe7\xff\xff\xe7\xc3\x81\xf0\xf0\xf0\xf0\x00\x00\x00\x00" +"\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00" +"\x00\x00\x00\x00\xf0\xf0\xf0\xf0\x33\x33\xcc\xcc\x33\x33\xcc\xcc" +"\x00\x20\x20\x50\x50\x88\xf8\x00\x20\x20\x70\x20\x70\x20\x20\x00" +"\x00\x00\x00\x50\x88\xa8\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff" +"\x00\x00\x00\x00\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" +"\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\x00\x00\x00\x00" +"\x00\x00\x68\x90\x90\x90\x68\x00\x30\x48\x48\x70\x48\x48\x70\xc0" +"\xf8\x88\x80\x80\x80\x80\x80\x00\xf8\x50\x50\x50\x50\x50\x98\x00" +"\xf8\x88\x40\x20\x40\x88\xf8\x00\x00\x00\x78\x90\x90\x90\x60\x00" +"\x00\x50\x50\x50\x50\x68\x80\x80\x00\x50\xa0\x20\x20\x20\x20\x00" +"\xf8\x20\x70\xa8\xa8\x70\x20\xf8\x20\x50\x88\xf8\x88\x50\x20\x00" +"\x70\x88\x88\x88\x50\x50\xd8\x00\x30\x40\x40\x20\x50\x50\x50\x20" +"\x00\x00\x00\x50\xa8\xa8\x50\x00\x08\x70\xa8\xa8\xa8\x70\x80\x00" +"\x38\x40\x80\xf8\x80\x40\x38\x00\x70\x88\x88\x88\x88\x88\x88\x00" +"\x00\xf8\x00\xf8\x00\xf8\x00\x00\x20\x20\xf8\x20\x20\x00\xf8\x00" +"\xc0\x30\x08\x30\xc0\x00\xf8\x00\x18\x60\x80\x60\x18\x00\xf8\x00" +"\x10\x28\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xa0\x40" +"\x00\x20\x00\xf8\x00\x20\x00\x00\x00\x50\xa0\x00\x50\xa0\x00\x00" +"\x00\x18\x24\x24\x18\x00\x00\x00\x00\x30\x78\x78\x30\x00\x00\x00" +"\x00\x00\x00\x00\x30\x00\x00\x00\x3e\x20\x20\x20\xa0\x60\x20\x00" +"\xa0\x50\x50\x50\x00\x00\x00\x00\x40\xa0\x20\x40\xe0\x00\x00\x00" +"\x00\x38\x38\x38\x38\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00"; + + diff --git a/src/kernel.c b/src/kernel.c new file mode 100644 index 0000000..831de7e --- /dev/null +++ b/src/kernel.c @@ -0,0 +1,180 @@ +#include + +#include "kernel.h" +#include "utils.h" + +char *Kernel_GetFirmwareVersion(SceBool spoofed) +{ + static char version[16]; + + SceKernelFwInfo data; + data.size = sizeof(SceKernelFwInfo); + + // Get the spoofed version + if (spoofed) + { + if (R_SUCCEEDED(sceKernelGetSystemSwVersion(&data))) + snprintf(version, 16, "%s", data.versionString); + + return version; + } + + // Get the actual version + if (R_SUCCEEDED(_vshSblGetSystemSwVersion(&data))) + { + snprintf(version, 16, "%s", data.versionString); + return version; + } + + return NULL; +} + +SceInt Kernel_GetModel(SceVoid) +{ + SceInt model = 0; + + if (R_SUCCEEDED(model = sceKernelGetModelForCDialog())) + return model; + + return 0; +} + +char *Kernel_GetCID(SceVoid) +{ + SceInt ret = 0; + char CID[16]; + + if (R_FAILED(ret = _vshSblAimgrGetConsoleId(CID))) + return NULL; + + static char IDPS[33]; + for (SceInt i = 0; i < 16; i++) + snprintf(&IDPS[2 * i], 33, "%02X", CID[i]); + + return IDPS; +} + +char *Kernel_GetPSID(SceVoid) +{ + SceInt ret = 0; + SceKernelOpenPsId id; + + if (R_FAILED(ret = sceKernelGetOpenPsId(&id))) + return NULL; + + static char PSID[33]; + for(SceInt i = 0; i < 16; i++) + snprintf(&PSID[2 * i], 33, "%02X", id.id[i]); + + return PSID; +} + +static int Kernel_GetModelRev(SceVoid) +{ + SceInt ret = 0; + PsCode pscode; + + if (R_FAILED(ret = _vshSblAimgrGetPscode(&pscode))) + return ret; + + char model[5]; + snprintf(model, 5, "%02X%02X", pscode.model_revision[1], pscode.model_revision[0]); + + return atoi(model); +} + +static char *Kernel_GetTargetID(SceVoid) +{ + SceInt ret = 0; + PsCode pscode; + + if (R_FAILED(ret = _vshSblAimgrGetPscode(&pscode))) + return NULL; + + static char targetID[5]; + snprintf(targetID, 5, "%01X%02X", pscode.target_id[1], pscode.target_id[0]); + + return targetID; +} + +char *Kernel_GetDeviceModel(SceVoid) +{ + static char out[9]; + + switch(Kernel_GetModelRev()) + { + case 10: + snprintf(out, 9, "PCH-10XX"); + break; + case 14: + snprintf(out, 9, "PCH-20XX"); + break; + case 18: + snprintf(out, 9, "PCH-20XX"); + break; + case 201: + snprintf(out, 9, "VTE-10XX"); + break; + } + + return out; +} + +char *Kernel_GetDeviceBoard(SceVoid) +{ + static char out[9]; + + switch(Kernel_GetModelRev()) + { + case 10: + snprintf(out, 8, "IRS-002"); + break; + case 14: + snprintf(out, 9, "USS-1001"); + break; + case 18: + snprintf(out, 8, "Unknown"); + break; + case 201: + snprintf(out, 9, "DOL-1001"); + break; + } + + return out; +} + +char *Kernel_GetDeviceUnit(SceVoid) +{ + static char out[27]; + + if (strncasecmp(Kernel_GetTargetID(), "100", 3) == 0) + snprintf(out, 27, "Test unit"); + else if (strncasecmp(Kernel_GetTargetID(), "101", 3) == 0) + snprintf(out, 27, "Tool unit"); + else if (strncasecmp(Kernel_GetTargetID(), "102", 3) == 0) + snprintf(out, 27, "DEX unit"); + else if (strncasecmp(Kernel_GetTargetID(), "103", 3) == 0) + snprintf(out, 27, "CEX - Japan"); + else if (strncasecmp(Kernel_GetTargetID(), "104", 3) == 0) + snprintf(out, 27, "CEX - North America"); + else if (strncasecmp(Kernel_GetTargetID(), "105", 3) == 0) + snprintf(out, 27, "CEX - Europe/Africa"); + else if (strncasecmp(Kernel_GetTargetID(), "106", 3) == 0) + snprintf(out, 27, "CEX - Korea"); + else if (strncasecmp(Kernel_GetTargetID(), "107", 3) == 0) + snprintf(out, 27, "CEX - United Kingdom"); + else if (strncasecmp(Kernel_GetTargetID(), "108", 3) == 0) + snprintf(out, 27, "CEX - Mexico/Latin America"); + else if (strncasecmp(Kernel_GetTargetID(), "109", 3) == 0) + snprintf(out, 27, "CEX - Australia/New Zeland"); + else if (strncasecmp(Kernel_GetTargetID(), "10A", 3) == 0) + snprintf(out, 27, "CEX - Hong Kong/Singapore"); + else if (strncasecmp(Kernel_GetTargetID(), "10B", 3) == 0) + snprintf(out, 27, "CEX - Taiwan"); + else if (strncasecmp(Kernel_GetTargetID(), "10C", 3) == 0) + snprintf(out, 27, "CEX - Russia"); + else if (strncasecmp(Kernel_GetTargetID(), "10D", 3) == 0) + snprintf(out, 27, "CEX - China"); + + return out; +} \ No newline at end of file diff --git a/src/kernel.h b/src/kernel.h new file mode 100644 index 0000000..88ffc69 --- /dev/null +++ b/src/kernel.h @@ -0,0 +1,35 @@ +#ifndef _VITAIDENT_KERNEL_H_ +#define _VITAIDENT_KERNEL_H_ + +#include +#include +#include +#include + +#include +#include + +#define isPCHX000 ((vshSblAimgrIsCEX()) && (!vshSblAimgrIsTool()) && (!vshSblAimgrIsTest()) && (!vshSblAimgrIsDEX()) && (vshSblAimgrIsGenuineVITA())) +#define isVTE1000 ((vshSblAimgrIsCEX()) && (!vshSblAimgrIsTool()) && (!vshSblAimgrIsTest()) && (!vshSblAimgrIsDEX()) && (sceKernelIsPSVitaTV())) +#define isPDEL ((!vshSblAimgrIsCEX()) && (!vshSblAimgrIsTest()) && (!vshSblAimgrIsDEX()) && (vshSblAimgrIsGenuineVITA()) && (vshSblAimgrIsTool())) +#define isPTEL ((!vshSblAimgrIsCEX()) && (!vshSblAimgrIsTool()) && (!vshSblAimgrIsTest()) && (vshSblAimgrIsDEX()) && (vshSblAimgrIsGenuineVITA())) + +typedef struct PsCode +{ + char magic[2]; + char target_id[2]; + char model_revision[2]; + uint16_t chassis; +} PsCode; + +SceInt _vshSblAimgrGetPscode(PsCode *code); + +char *Kernel_GetFirmwareVersion(SceBool spoofed); +SceInt Kernel_GetModel(SceVoid); +char *Kernel_GetCID(SceVoid); +char *Kernel_GetPSID(SceVoid); +char *Kernel_GetDeviceModel(SceVoid); +char *Kernel_GetDeviceBoard(SceVoid); +char *Kernel_GetDeviceUnit(SceVoid); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..932ddb4 --- /dev/null +++ b/src/main.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include + +#include "debugScreen.h" + +#include "system.h" +#include "kernel.h" + +#define VERSION "v0.0.1b" +#define printf(...) psvDebugScreenPrintf(__VA_ARGS__) + +char* menuItems[] = { + "Dump full system information", + "Quit VitaForge", + "Credits" +}; + +int menuItemsLength = sizeof(menuItems) / sizeof(menuItems[0]); + +void clearScreen() { + psvDebugScreenClear(0xFF000000); +} + +void print_menu(int selectedIndex) { + printf("VitaForge %s\n\n", VERSION); + + for (int i = 0; i < menuItemsLength; i++) { // Changed <= to < + if (i == selectedIndex) + printf(" > %s\n", menuItems[i]); + else + printf(" %s\n", menuItems[i]); + } +} + +int main(int argc, char* argv[]) { + psvDebugScreenInit(); + + SceCtrlData pad; + int selectedIndex = 0; + + clearScreen(); // Clear the screen before printing the menu + print_menu(selectedIndex); + + while (1) { + reset: + sceCtrlPeekBufferPositive(0, &pad, 1); + + if (pad.buttons == SCE_CTRL_UP) { + if (selectedIndex > 0) selectedIndex--; // Changed != 0 to > 0 + clearScreen(); + print_menu(selectedIndex); + } + + if (pad.buttons == SCE_CTRL_DOWN) { + if (selectedIndex < menuItemsLength - 1) selectedIndex++; // Changed != 3 to < menuItemsLength - 1 + clearScreen(); + print_menu(selectedIndex); + } + + if (pad.buttons == SCE_CTRL_CROSS) { + if (strcmp(menuItems[selectedIndex], "Dump full system information") == 0) { + clearScreen(); + + printf("VitaForge %s\n\n", VERSION); + + printf("* Firmware version: %s\n", Kernel_GetFirmwareVersion(SCE_FALSE)); + printf("* System version: %s\n", Kernel_GetFirmwareVersion(SCE_TRUE)); + printf("* PS Vita unit: %s\n", Kernel_GetDeviceUnit()); + printf("* Motherboard: %s\n", Kernel_GetDeviceBoard()); + printf("* PS Vita CID: %s\n", Kernel_GetCID()); + printf("* PSID: %s\n", Kernel_GetPSID()); + + while (1) { + sceCtrlPeekBufferPositive(0, &pad, 1); + if (pad.buttons == SCE_CTRL_CIRCLE) break; + sceKernelDelayThread(100 * 1000); + } + + clearScreen(); + print_menu(selectedIndex); + goto reset; + } + if (strcmp(menuItems[selectedIndex], "Quit VitaForge") == 0) break; + if (strcmp(menuItems[selectedIndex], "Credits") == 0) { + clearScreen(); + + printf("Credits\n\nDeveloper: $pectr4\nGithub: https://github.com/SpectrTech\n"); + + while (1) { + sceCtrlPeekBufferPositive(0, &pad, 1); + if (pad.buttons == SCE_CTRL_CIRCLE) break; + sceKernelDelayThread(100 * 1000); + } + + clearScreen(); + print_menu(selectedIndex); + goto reset; + } + } + + sceKernelDelayThread(100 * 1000); // Adjusted to 100 ms for responsiveness + } + + sceKernelExitProcess(0); + return 0; +} diff --git a/src/system.h b/src/system.h new file mode 100644 index 0000000..ba7265f --- /dev/null +++ b/src/system.h @@ -0,0 +1,12 @@ +#ifndef SYSTEM_H_ +#define SYSTEM_H_ + +#include +#include + +#include +#include + + + +#endif \ No newline at end of file diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..3734080 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "utils.h" + +static SceCtrlData pad, old_pad; + +SceInt Utils_HandleControls(SceVoid) +{ + memset(&pad, 0, sizeof(SceCtrlData)); + sceCtrlPeekBufferPositive(0, &pad, 1); + + SceUInt32 pressed = pad.buttons & ~old_pad.buttons; + + old_pad = pad; + return 0; +} + +SceVoid Utils_GetSizeString(char *string, SceOff size) +{ + double double_size = (double)size; + + SceInt i = 0; + static char *units[] = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; + + while (double_size >= 1024.0f) + { + double_size /= 1024.0f; + i++; + } + + sprintf(string, "%.*f %s", (i == 0) ? 0 : 2, double_size, units[i]); +} + +char*Utils_StringConcat(char *s1, char *s2) +{ + char *ns = malloc(strlen(s1) + strlen(s2) + 1); + ns[0] = '\0'; + strcat(ns, s1); + strcat(ns, s2); + return ns; +} \ No newline at end of file diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..d1dd286 --- /dev/null +++ b/src/utils.h @@ -0,0 +1,18 @@ +#ifndef _VITAIDENT_UTILS_H_ +#define _VITAIDENT_UTILS_H_ + +#include + +/// Checks whether a result code indicates success. +#define R_SUCCEEDED(res) ((res)>=0) +/// Checks whether a result code indicates failure. +#define R_FAILED(res) ((res)<0) +/// Returns the level of a result code. + +//SceUInt32 pressed; + +SceInt Utils_HandleControls(SceVoid); +SceVoid Utils_GetSizeString(char *string, SceOff size); +char*Utils_StringConcat(char *s1, char *s2); + +#endif \ No newline at end of file