From 47ce58159d3b8a85b62c1ed1d06a7dec4672dc88 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Tue, 5 Aug 2025 23:04:07 -0400 Subject: [PATCH] got hello psyq doing its job. removing pxdev_sample as no longer needed. --- .gitignore | 1 + .vscode/launch.json | 24 ++ code/hello_psyq/hello_psyq_crt.c | 18 +- psxdev_sample/SpinningCube/.gitignore | 9 - .../.vscode/c_cpp_properties.json | 40 --- .../SpinningCube/.vscode/launch.json | 29 --- .../SpinningCube/.vscode/settings.json | 10 - psxdev_sample/SpinningCube/.vscode/tasks.json | 37 --- psxdev_sample/SpinningCube/Makefile | 35 --- psxdev_sample/SpinningCube/build.ps1 | 233 ------------------ psxdev_sample/SpinningCube/compile_flags.txt | 4 - psxdev_sample/SpinningCube/main.c | 127 ---------- psxdev_sample/readme.md | 5 - scripts/debug_psyq.ps1 | 7 +- 14 files changed, 46 insertions(+), 533 deletions(-) delete mode 100644 psxdev_sample/SpinningCube/.gitignore delete mode 100644 psxdev_sample/SpinningCube/.vscode/c_cpp_properties.json delete mode 100644 psxdev_sample/SpinningCube/.vscode/launch.json delete mode 100644 psxdev_sample/SpinningCube/.vscode/settings.json delete mode 100644 psxdev_sample/SpinningCube/.vscode/tasks.json delete mode 100644 psxdev_sample/SpinningCube/Makefile delete mode 100644 psxdev_sample/SpinningCube/build.ps1 delete mode 100644 psxdev_sample/SpinningCube/compile_flags.txt delete mode 100644 psxdev_sample/SpinningCube/main.c delete mode 100644 psxdev_sample/readme.md diff --git a/.gitignore b/.gitignore index 74ba09d..a3453c6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ toolchain/psyq_iwyu *.dep *.o *.a +.sentry-native diff --git a/.vscode/launch.json b/.vscode/launch.json index bc47777..533e342 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,6 +27,30 @@ "tbreak main", "continue" ] + }, + { + "name": "Debug: Hello Psy-Q!", + "type": "gdb", + "request": "attach", + "target": "localhost:3333", + "remote": true, + "cwd": "${workspaceRoot}/build", + "valuesFormatting": "parseText", + "stopAtConnect": true, + "gdbpath": "gdb-multiarch", + "windows": { + "gdbpath": "gdb-multiarch.exe" + }, + "osx": { + "gdbpath": "gdb" + }, + "executable": "${workspaceRoot}/build/hello_psyq.elf", + "autorun": [ + "monitor reset shellhalt", + "load hello_psyq.elf", + "tbreak main", + "continue" + ] } ] } diff --git a/code/hello_psyq/hello_psyq_crt.c b/code/hello_psyq/hello_psyq_crt.c index 3c55b46..66e1f1e 100644 --- a/code/hello_psyq/hello_psyq_crt.c +++ b/code/hello_psyq/hello_psyq_crt.c @@ -20,7 +20,7 @@ int main(void) DB *cdb; ResetGraph(0); - InitGeom(); + // InitGeom(); SetGraphDebug(0); @@ -35,16 +35,28 @@ int main(void) SetDefDispEnv(&db[0].disp, 0, 0, 640, 480); SetDefDispEnv(&db[1].disp, 0, 0, 640, 480); + SetDispMask(1); + + PutDrawEnv(&db[0].draw); + PutDispEnv(&db[0].disp); + while (1) { + cdb = (cdb == &db[0]) ? &db[1] : &db[0]; + + ClearOTagR(cdb->ot, OTSIZE); + FntPrint("Code compiled using Psy-Q libraries\n\n"); FntPrint("converted by psyq-obj-parser\n\n"); FntPrint("PCSX-Redux project\n\n"); FntPrint("https://bit.ly/pcsx-redux"); - ClearImage(&cdb->draw.clip, 60, 120, 120); - DrawSync(0); VSync(0); + + ClearImage(&cdb->draw.clip, 60, 120, 120); + + DrawOTag(&cdb->ot[OTSIZE - 1]); + FntFlush(-1); } return 0; diff --git a/psxdev_sample/SpinningCube/.gitignore b/psxdev_sample/SpinningCube/.gitignore deleted file mode 100644 index ef1ec2a..0000000 --- a/psxdev_sample/SpinningCube/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -PSX.Dev-README.md -*.elf -*.map -*.cpe -*.ps-exe -*.dep -*.o -*.a -third_party/psyq \ No newline at end of file diff --git a/psxdev_sample/SpinningCube/.vscode/c_cpp_properties.json b/psxdev_sample/SpinningCube/.vscode/c_cpp_properties.json deleted file mode 100644 index 03580bf..0000000 --- a/psxdev_sample/SpinningCube/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "configurations": [ - { - "name": "Win32", - "compilerPath": "${env:AppData}\\mips\\mips\\bin\\mipsel-none-elf-gcc.exe", - "cStandard": "c17", - "cppStandard": "c++20", - "defines": [ - "__STDC_HOSTED__ = 0" - ], - "includePath": [ - "${env:AppData}/mips/mips/include", - "${workspaceFolder}/", - "${workspaceFolder}/third_party/nugget", - "${workspaceFolder}/third_party/psyq-iwyu/include" - ], - "intelliSenseMode": "gcc-x86" - }, - { - "name": "linux", - "compilerPath": "mipsel-linux-gnu-gcc", - "cStandard": "c17", - "cppStandard": "c++20", - "defines": [ - "__STDC_HOSTED__ = 0" - ], - "includePath": [ - "/usr/mipsel-linux-gnu/include", - "/usr/local/mipsel-linux-gnu/include", - "/usr/mipsel-none-elf/include", - "/usr/local/mipsel-none-elf/include", - "${workspaceFolder}/", - "${workspaceFolder}/third_party/nugget", - "${workspaceFolder}/third_party/psyq-iwyu/include" - ], - "intelliSenseMode": "gcc-x86" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/psxdev_sample/SpinningCube/.vscode/launch.json b/psxdev_sample/SpinningCube/.vscode/launch.json deleted file mode 100644 index 6edd986..0000000 --- a/psxdev_sample/SpinningCube/.vscode/launch.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Debug", - "type": "gdb", - "request": "attach", - "target": "localhost:3333", - "remote": true, - "cwd": "${workspaceRoot}", - "valuesFormatting": "parseText", - "stopAtConnect": true, - "gdbpath": "gdb-multiarch", - "windows": { - "gdbpath": "gdb-multiarch.exe" - }, - "osx": { - "gdbpath": "gdb" - }, - "executable": "${workspaceRoot}/${workspaceRootFolderName}.elf", - "autorun": [ - "monitor reset shellhalt", - "load ${workspaceRootFolderName}.elf", - "tbreak main", - "continue" - ] - } - ] -} \ No newline at end of file diff --git a/psxdev_sample/SpinningCube/.vscode/settings.json b/psxdev_sample/SpinningCube/.vscode/settings.json deleted file mode 100644 index e7f9a5f..0000000 --- a/psxdev_sample/SpinningCube/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "files.associations": { - "*.rmd": "markdown", - "*.s": "armips", - "stdlib.h": "c", - "libgte.h": "c", - "libgpu.h": "c", - "libetc.h": "c" - } -} \ No newline at end of file diff --git a/psxdev_sample/SpinningCube/.vscode/tasks.json b/psxdev_sample/SpinningCube/.vscode/tasks.json deleted file mode 100644 index b46ac12..0000000 --- a/psxdev_sample/SpinningCube/.vscode/tasks.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build Debug", - "type": "shell", - "command": "make BUILD=Debug", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [ - "$gcc" - ] - }, - { - "label": "Build Release", - "type": "shell", - "command": "make", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [ - "$gcc" - ] - }, - { - "label": "Clean", - "type": "shell", - "command": "make clean", - "group": { - "kind": "build" - } - } - ] -} \ No newline at end of file diff --git a/psxdev_sample/SpinningCube/Makefile b/psxdev_sample/SpinningCube/Makefile deleted file mode 100644 index 634981a..0000000 --- a/psxdev_sample/SpinningCube/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -TARGET = SpinningCube -TYPE = ps-exe - -SRCS = \ -third_party/nugget/common/crt0/crt0.s \ -main.c - -CPPFLAGS += -Ithird_party/psyq-iwyu/include -LDFLAGS += -Lthird_party/psyq/lib -LDFLAGS += -Wl,--start-group -LDFLAGS += -lapi -LDFLAGS += -lc -LDFLAGS += -lc2 -LDFLAGS += -lcard -LDFLAGS += -lcd -LDFLAGS += -lcomb -LDFLAGS += -lds -LDFLAGS += -letc -LDFLAGS += -lgpu -LDFLAGS += -lgs -LDFLAGS += -lgte -LDFLAGS += -lgun -LDFLAGS += -lhmd -LDFLAGS += -lmath -LDFLAGS += -lmcrd -LDFLAGS += -lmcx -LDFLAGS += -lpad -LDFLAGS += -lpress -LDFLAGS += -lsio -LDFLAGS += -lsnd -LDFLAGS += -lspu -LDFLAGS += -ltap -LDFLAGS += -Wl,--end-group - -include third_party/nugget/common.mk diff --git a/psxdev_sample/SpinningCube/build.ps1 b/psxdev_sample/SpinningCube/build.ps1 deleted file mode 100644 index aec3d32..0000000 --- a/psxdev_sample/SpinningCube/build.ps1 +++ /dev/null @@ -1,233 +0,0 @@ -# --- Toolchain Definition --- -# Assumes 'mipsel-none-elf' toolchain is in your system's PATH. -$Prefix = "mipsel-none-elf" -$Compiler = "$($Prefix)-gcc" -$Objcopy = "$($Prefix)-objcopy" - -# --- Abstracted GCC/MIPS Flags --- - -# General Compiler Flags -$f_compile = "-c" -$f_debug = "-g" -$f_define = "-D" -$f_include = "-I" -$f_output = "-o" -$f_std_c11 = "-std=c11" - -# Warning Flags -$f_wall = "-Wall" -$f_wno_attributes = "-Wno-attributes" - -# Optimization Flags -$f_optimize_none = "-O0" # For Debug builds -$f_optimize_size = "-Os" # For Release builds -$f_omit_frame_ptr = "-fomit-frame-pointer" - -# Environment & Standard Library Flags -$f_no_stdlib = "-nostdlib" -$f_freestanding = "-ffreestanding" -$f_no_builtin = "-fno-builtin" - -# MIPS Architecture Specific Flags -$f_arch_mips1 = "-march=mips1" -$f_arch_abi32 = "-mabi=32" -$f_arch_little_endian = "-EL" -$f_arch_fp32 = "-mfp32" -$f_arch_no_pic = "-fno-pic" -$f_arch_no_shared = "-mno-shared" -$f_arch_no_abicalls = "-mno-abicalls" -$f_arch_no_llsc = "-mno-llsc" -$f_arch_no_gpopt = "-mno-gpopt" -$f_arch_no_stack_prot = "-fno-stack-protector" - -# Linker-related Flags (for Compiler) -$f_code_sections = "-ffunction-sections" -$f_data_sections = "-fdata-sections" -$f_no_strict_alias = "-fno-strict-aliasing" - -# Linker Flags (passed via -Wl,) -$f_link_pass_through_prefix = "-Wl," -$f_link_mapfile = "-Map=" # Usage: $flag_link_pass_through_prefix + $flag_link_mapfile + path -$f_link_gc_sections = "--gc-sections" -$f_link_format = "--oformat=" -$f_link_start_group = "--start-group" -$f_link_end_group = "--end-group" -$f_link_static = "-static" -$f_link_script = "-T" -$f_link_lib_path = "-L" -$f_link_lib = "-l" - -# Objcopy Flags -$f_objcopy_format = "-O" - -# --- Project Configuration --- -$path_root = $PSScriptRoot - -$path_build = join-path $path_root 'build' -$path_third_party = join-path $path_root 'third_party' -$path_nugget = join-path $path_third_party 'nugget' -$path_psyq = join-path $path_third_party 'psyq' -$path_psyq_imyu = join-path $path_third_party 'psyq-iwyu' - -if (-not (test-path $path_build)) { - new-item -ItemType Directory -Path $path_build | Out-Null -} - -$path_nugget_common = join-path $path_nugget 'common' - -$unit_nugget_crt0 = join-path $path_nugget_common 'crt0/crt0.s' -$unit_main = join-path $path_root 'main.c' -$units = @( - $unit_nugget_crt0, - $unit_main -) - -write-host "--- Compiling Source Files ---" -ForegroundColor Cyan - -$compile_args_c = @() -$compile_args_c += $f_debug -$compile_args_c += $f_optimize_none -# $compile_args_c += $f_optimize_size - -$compile_args_c += $f_code_sections -$compile_args_c += $f_data_sections - -$compile_args_c += $f_wno_attributes -$compile_args_c += $f_freestanding -$compile_args_c += $f_omit_frame_ptr -$compile_args_c += $f_no_builtin -$compile_args_c += $f_no_stdlib -$compile_args_c += $f_no_strict_alias -$compile_args_c += @( - $f_arch_mips1, - $f_arch_abi32, - $f_arch_fp32, - $f_arch_little_endian, - $f_arch_no_abicalls, - $f_arch_no_gpopt, - $f_arch_no_pic, - $f_arch_no_llsc, - $f_arch_no_shared, - $f_arch_no_stack_prot -) - -$path_psyq_imyu_inc = join-path $path_psyq_imyu 'include' -$compile_args_c += ($f_include + $path_psyq_imyu_inc) -$compile_args_c += ($f_include + $path_nugget) - -$compile_args_asm = @() -$compile_args_asm += $f_debug -$compile_args_asm += @( - $f_arch_mips1, - $f_arch_abi32, - $f_arch_fp32, - $f_arch_little_endian, - $f_arch_no_abicalls, - $f_arch_no_pic, - $f_arch_no_llsc, - $f_arch_no_shared, - $f_arch_no_stack_prot -) -$compile_args_asm += $f_no_stdlib -$compile_args_asm += $f_freestanding -$compile_args_asm += ($f_include + $path_nugget) - -$link_modules = @() -foreach ($unit in $units) { - $base_name = [System.IO.Path]::GetFileNameWithoutExtension($unit) - $extension = [System.IO.Path]::GetExtension($unit) - $link_module = join-path $path_build "$($base_name).o" - $link_modules += $link_module - - $module_compile_args = @() - if ($extension -eq ".c") { $module_compile_args = $compile_args_c } - elseif ($extension -eq ".s") { $module_compile_args = $compile_args_asm } - else { write-error "Unsupported file type: $unit"; exit 1 } - - $module_compile_args = @($module_compile_args) + $f_compile, $unit, ($f_output + $link_module) - - write-host "Compiling '$($unit)' -> '$($base_name).o'" - $module_compile_args | ForEach-Object { Write-Host "`t$_" -ForegroundColor Green } - & $Compiler $module_compile_args - if ($LASTEXITCODE -ne 0) { write-error "Compilation failed for $unit. Aborting."; exit 1 } -} - - -write-host "`n--- Linking Modules ---" -ForegroundColor Cyan - -$link_args = @() -$link_args += $f_debug -# $link_args += $f_optimize_size - -$link_args += $f_no_stdlib -$link_args += $f_link_static - -$link_args += $f_arch_mips1 -$link_args += $f_arch_abi32 -$link_args += $f_arch_little_endian - -$link_args += ($f_link_pass_through_prefix + $f_link_gc_sections) -$link_args += ($f_link_pass_through_prefix + $f_link_format + "elf32-littlemips") - -$linkscript_nugget = join-path $path_nugget 'nooverlay.ld' -$linkscript_ps_exe = join-path $path_nugget "ps-exe.ld" -$link_args += ($f_link_script + $linkscript_nugget) -$link_args += ($f_link_script + $linkscript_ps_exe) - -$path_psyq_lib = join-path $path_psyq 'lib' -$link_args += ($f_link_lib_path + $path_psyq_lib) - -$link_args += $link_modules - -$map = join-path $path_build 'SpinningCube.map' -$link_args += ($f_link_pass_through_prefix + $f_link_mapfile + $map) - -$link_args += ($f_link_pass_through_prefix + $f_link_start_group) -$libraries = @( - "api", - "c", - "c2", - "card", - "cd", - "comb", - "ds", - "etc", - "gpu", - "gs", - "gte", - "gun", - "hmd", - "math", - "mcrd", - "mcx", - "pad", - "press", - "sio", - "snd", - "spu", - "tap" -) -foreach ($lib in $libraries) { - $link_args += ($f_link_lib + $lib) -} - -$elf = Join-Path $path_build "SpinningCube.elf" -$final_link_args = @($link_args) + ($f_output + $elf) - -write-host "Linking modules into 'SpinningCube.elf'" -$final_link_args += ($f_link_pass_through_prefix + $f_link_end_group) -$final_link_args | foreach-object { write-host $_ } - & $Compiler $final_link_args -if ($LASTEXITCODE -ne 0) { write-error "Linking failed. Aborting."; exit 1 } - - -Write-Host "`n--- Creating Final Binary ---" -ForegroundColor Cyan -$exe = join-path $path_build "SpinningCube.ps-exe" - -write-host "Converting ELF to PS-EXE -> 'SpinningCube.ps-exe'" -$objcopy_args = ($f_objcopy_format + "binary"), $elf, $exe - & $Objcopy $objcopy_args -if ($LASTEXITCODE -ne 0) { Write-Error "Objcopy failed. Aborting."; exit 1 } - -write-host "`nBuild successful!" -ForegroundColor Green -write-host "Output: $exe" diff --git a/psxdev_sample/SpinningCube/compile_flags.txt b/psxdev_sample/SpinningCube/compile_flags.txt deleted file mode 100644 index 3bdf489..0000000 --- a/psxdev_sample/SpinningCube/compile_flags.txt +++ /dev/null @@ -1,4 +0,0 @@ --m32 --I. --Ithird_party/nugget --Ithird_party/psyq-iwyu/include diff --git a/psxdev_sample/SpinningCube/main.c b/psxdev_sample/SpinningCube/main.c deleted file mode 100644 index 3190667..0000000 --- a/psxdev_sample/SpinningCube/main.c +++ /dev/null @@ -1,127 +0,0 @@ -#include -#include -#include -#include - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) - -#define OTSIZE 4096 -#define SCREEN_Z 512 -#define CUBESIZE 196 - -typedef struct DB { - DRAWENV draw; - DISPENV disp; - u_long ot[OTSIZE]; - POLY_F4 s[6]; -} DB; - -static SVECTOR cube_vertices[] = { - {-CUBESIZE / 2, -CUBESIZE / 2, -CUBESIZE / 2, 0}, {CUBESIZE / 2, -CUBESIZE / 2, -CUBESIZE / 2, 0}, - {CUBESIZE / 2, CUBESIZE / 2, -CUBESIZE / 2, 0}, {-CUBESIZE / 2, CUBESIZE / 2, -CUBESIZE / 2, 0}, - {-CUBESIZE / 2, -CUBESIZE / 2, CUBESIZE / 2, 0}, {CUBESIZE / 2, -CUBESIZE / 2, CUBESIZE / 2, 0}, - {CUBESIZE / 2, CUBESIZE / 2, CUBESIZE / 2, 0}, {-CUBESIZE / 2, CUBESIZE / 2, CUBESIZE / 2, 0}, -}; - -static int cube_indices[] = { - 0, 1, 2, 3, 1, 5, 6, 2, 5, 4, 7, 6, 4, 0, 3, 7, 4, 5, 1, 0, 6, 7, 3, 2, -}; - -static void init_cube(DB *db, CVECTOR *col) { - size_t i; - - for (i = 0; i < ARRAY_SIZE(db->s); ++i) { - SetPolyF4(&db->s[i]); - setRGB0(&db->s[i], col[i].r, col[i].g, col[i].b); - } -} - -static void add_cube(u_long *ot, POLY_F4 *s, MATRIX *transform) { - long p, otz, flg; - int nclip; - size_t i; - - SetRotMatrix(transform); - SetTransMatrix(transform); - - for (i = 0; i < ARRAY_SIZE(cube_indices); i += 4, ++s) { - nclip = RotAverageNclip4(&cube_vertices[cube_indices[i + 0]], &cube_vertices[cube_indices[i + 1]], - &cube_vertices[cube_indices[i + 2]], &cube_vertices[cube_indices[i + 3]], - (long *)&s->x0, (long *)&s->x1, (long *)&s->x3, (long *)&s->x2, &p, &otz, &flg); - - if (nclip <= 0) continue; - - if ((otz > 0) && (otz < OTSIZE)) AddPrim(&ot[otz], s); - } -} - -int main(void) { - DB db[2]; - DB *cdb; - SVECTOR rotation = {0}; - VECTOR translation = {0, 0, (SCREEN_Z * 3) / 2, 0}; - MATRIX transform; - CVECTOR col[6]; - size_t i; - - ResetGraph(0); - InitGeom(); - - SetGraphDebug(0); - - FntLoad(960, 256); - SetDumpFnt(FntOpen(32, 32, 320, 64, 0, 512)); - - SetGeomOffset(320, 240); - SetGeomScreen(SCREEN_Z); - - SetDefDrawEnv(&db[0].draw, 0, 0, 640, 480); - SetDefDrawEnv(&db[1].draw, 0, 0, 640, 480); - SetDefDispEnv(&db[0].disp, 0, 0, 640, 480); - SetDefDispEnv(&db[1].disp, 0, 0, 640, 480); - - srand(0); - - for (i = 0; i < ARRAY_SIZE(col); ++i) { - col[i].r = rand(); - col[i].g = rand(); - col[i].b = rand(); - } - - init_cube(&db[0], col); - init_cube(&db[1], col); - - SetDispMask(1); - - PutDrawEnv(&db[0].draw); - PutDispEnv(&db[0].disp); - - while (1) { - cdb = (cdb == &db[0]) ? &db[1] : &db[0]; - - rotation.vy += 16; - rotation.vz += 16; - - RotMatrix(&rotation, &transform); - TransMatrix(&transform, &translation); - - ClearOTagR(cdb->ot, OTSIZE); - - FntPrint("Code compiled using Psy-Q libraries\n\n"); - FntPrint("converted by psyq-obj-parser\n\n"); - FntPrint("PCSX-Redux project\n\n"); - FntPrint("https://bit.ly/pcsx-redux"); - - add_cube(cdb->ot, cdb->s, &transform); - - DrawSync(0); - VSync(0); - - ClearImage(&cdb->draw.clip, 60, 120, 120); - - DrawOTag(&cdb->ot[OTSIZE - 1]); - FntFlush(-1); - } - - return 0; -} diff --git a/psxdev_sample/readme.md b/psxdev_sample/readme.md deleted file mode 100644 index 7344621..0000000 --- a/psxdev_sample/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# PSX.DEV Sample Code - -Uses the vscode extension to setup a working C project with a pcsx-redux instance used with GDB server functionality. -Everything is built currently with make files which I want to simplify to not requiring if possible... -My goal was to do the pikuma course mostly in assembly with some sys calls to help but now this is in the way.. diff --git a/scripts/debug_psyq.ps1 b/scripts/debug_psyq.ps1 index ce0cfbe..38adc49 100644 --- a/scripts/debug_psyq.ps1 +++ b/scripts/debug_psyq.ps1 @@ -4,4 +4,9 @@ $path_code = join-path $path_root 'code' $path_scripts = join-path $path_root 'scripts' $path_toolchain = join-path $path_root 'toolchain' -# TODO(Ed): Custom hookup to launching pcsx-redux for hooking up to vscode with gdb server? +$path_pcsx_redux = join-path $path_toolchain 'pcsx-redux' +$path_pcsx_redux_vsprojects = join-path $path_pcsx_redux 'vsprojects' +$path_pcsx_redux_binaries = join-path $path_pcsx_redux_vsprojects 'x64/Release' + +$pcsx_redux = join-path $path_pcsx_redux_binaries 'pcsx-redux.exe' +& $pcsx_redux