got hello psyq doing its job. removing pxdev_sample as no longer needed.

This commit is contained in:
2025-08-05 23:04:07 -04:00
parent 479a65ba36
commit 47ce58159d
14 changed files with 46 additions and 533 deletions
+1
View File
@@ -12,3 +12,4 @@ toolchain/psyq_iwyu
*.dep
*.o
*.a
.sentry-native
+24
View File
@@ -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"
]
}
]
}
+15 -3
View File
@@ -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;
-9
View File
@@ -1,9 +0,0 @@
PSX.Dev-README.md
*.elf
*.map
*.cpe
*.ps-exe
*.dep
*.o
*.a
third_party/psyq
@@ -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
}
-29
View File
@@ -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"
]
}
]
}
-10
View File
@@ -1,10 +0,0 @@
{
"files.associations": {
"*.rmd": "markdown",
"*.s": "armips",
"stdlib.h": "c",
"libgte.h": "c",
"libgpu.h": "c",
"libetc.h": "c"
}
}
-37
View File
@@ -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"
}
}
]
}
-35
View File
@@ -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
-233
View File
@@ -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"
@@ -1,4 +0,0 @@
-m32
-I.
-Ithird_party/nugget
-Ithird_party/psyq-iwyu/include
-127
View File
@@ -1,127 +0,0 @@
#include <libetc.h>
#include <libgpu.h>
#include <libgte.h>
#include <stdlib.h>
#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;
}
-5
View File
@@ -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..
+6 -1
View File
@@ -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