PSn00bSDK changelog Items that are lower in the log are more recently implemented. 08-16-2021 by spicyjpeg: * psxetc: Added dynamic linking APIs (dl*, DL_*), implemented in dl.c and _dl_resolve_wrapper.s. The APIs can be accessed by including dlfcn.h, while another header (elf.h) provides structs and enums to help with manual parsing of library headers. * libc: Removed _mem_init.s, improved heap initialization code. Added support for setting how much RAM to use for the stack (by defining STACK_MAX_SIZE) and for overriding/replacing the default memory allocator. * psxapi: Added wrapper around BIOS function FlushCache(). * psxspu: Fixed wrong bounds check in SpuSetTransferStartAddr(). * examples: Added an example showing how to compile dynamically-loaded libraries (DLLs) and load them at runtime using the new dynamic linker. * libpsn00b: Added libpsn00b/ldscripts directory and linker scripts for both executables and DLLs. Also fixed several broken header files (psxgpu.h not including sys/types.h, missing scanf() declarations, ...). * Rewritten most makefiles (both for libraries and examples) and centralized all compiler flags into a single psn00bsdk-setup.mk file for consistency and easier editing. Added flags to build libpsn00b without gp-relative addressing for compatibility with the dynamic linker. Also added nm commands to generate symbol maps required by the linker. 07-01-2021 by Lameguy64: * Libpsn00b: Added int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t and uint64_t variable types in sys/types.h. * psxgte: Replaced unsigned int variable types with u_long to further improve compatibility with code written for the official Sony SDK and to make my tutorial examples easier to compile on PSn00bSDK. Example programs have been updated to account for this change. * psxcd: Changed type of 2nd argument of CdRead() from u_int to u_long, as well as changing the type of the size element in CdlFILE from u_int to u_long. 02-17-2021 by Lameguy64: * Improved build instructions in readme file and fixed some typos. * Improved toolchain.txt instructions. * tools: Added experimental elf2cpe converter for executing PSn00bSDK programs in official development units. No debug symbols however. * Fixed prefixes to allow SDK libraries and examples to be built with mipsel-none-elf. * examples: Fixed typo in plasma_tbl.h causing multiple definitions when compiling with newer versions of GCC in n00bdemo. * examples: cartrom example now marked as obsoleted, but still kept for reference purposes. * Includes alextrevisan's GTE macros in inline_c.h. * Added makefile template. 01-05-2021 by Lameguy64: * psxgpu: Added struct names to many primitives. * psxgte: Defined SquareRoot0() and SquareRoot12(). * psxgte: Added gte_lddp() C macro. * examples: Added C++ demo. * Updated readme a bit. 11-29-2020 by Lameguy64: * libpsn00b: Defined MDEC hardware and related DMA registers in hwregs_a.h file. * psxgte: Fixed entry typo in table of squareroot.s (pointed out by SoapyMan). * libc: memmove updated to account for forward-looped memory move (by ckosmic). * examples: Removed redundant toolchain executable definitions in the makefiles. * examples: Included HDTV example for Github repo. 09-19-2020 by Lameguy64: * Revised makefiles for building the libraries and examples in a way to make building with different toolchain versions easier with the PSN00BSDK_TC environment variable. Library installation and linking is also made easier with the PSN00BSDK_LIBS environment variable. See readme in the libpsn00b directory for details. * examples: Fixed libgcc not found error when compiling some of the examples. * libc: Added strtok(). * libc: Added support for command line arguments. Pass arguments via SYSTEM.CNF BOOT= string or a string array with Exec(). Arguments can be read via argc/argv[] in main() or __argc/__argv anywhere else. * libc: Added SetHeapSize(). * psxgpu: Moved ISR and callback subsystem to psxetc. You'll have to link psxetc after psxgpu and psxapi after psxetc in your library string. * psxetc: Moved debug font functions (FntInit(), FntOpen(), etc) to psxgpu. * psxetc: Fixed stack management in RestartCallback(). * examples: Added argument passing in childexec example. * psxcd: Fixed crashing on PSIO and possibly some emulators by implementing a response buffer read limiter. * psxgpu: Interrupts are now disabled before setting up ISR and callbacks in ResetGraph(), as LoadExec() still has interrupts enabled when jumping to the loaded PS-EXE's entrypoint. Fixes programs made with PSn00bSDK crashing at ResetGraph() on PSIO when loading from the Menu System and possibly some emulators. 07-25-2020 by Lameguy64: * psxgte: Added ScaleMatrixL(). * doc: Corrected documentation for CdReadSync() function. * psxcd: Added new define: CdlIsoLidOpen. * psxcd: Updated media change detection logic, media change is checked by lid open status bit in all CD-ROM file functions. CdControl() calls will also trigger the media change status on lid open. * psxcd: Fixed bug in CdGetVolumeLabel() where it constantly reparses the file system regardless of media change status. * examples: Updated cdrom/cdbrowse example slightly. * psxcd: Added CdLoadSession(). * psxcd: Fixed bug where CdReadDir() locks up in an infinite loop when it encounters a NULL directory record, and the parser has not yet exceeded the length of the directory record. * doc: Replaced library version numbers with SVN revision numbers in the introduced fields. * doc: Started work on CD-ROM library overview. 04-24-2020 by Lameguy64: * Refined toolchain instructions a bit. * psxcd: Added automatic read retry for CdRead() operations, as long as CdReadSync() is called until read completion. * psxapi: Added BIOS atoi() and atol() calls. Temporary, may be replaced with a faster implementation * psxsio: Added ioctl() support for FIOCSCAN to probe for pending input in serial tty driver. * examples: Reorganized examples, added new tty and console examples. 03-11-2020 by Lameguy64: * psxcd: Fixed CdInit() syntax (there should be no arguments). * psxcd: Fixed CdlFILE, loc variable renamed to pos. * documentation: Improved and updated toolchain instructions a bit. 02-28-2020 by Lameguy64: * documentation: Added docs for CdOpenDir(), CdReadDir() and CdCloseDir(). * psxgpu: Added GetODE(). * psxspu: Fixed SpuKeyOn() bug where only 16 of the 24 channels can be activated, due to channel bits being written as a 16-bit word. * psxcd: Added CdOpenDir(), CdReadDir() and CdCloseDir() for parsing directories. * psxcd: Issuing CdlNop (GetStat) commands now triggers the media change flag internal to the libraries when CD lid is opened, so file system functions can update the cached ISO descriptor when the disc has been changed. * psxcd: Made internal variables and functions for iso9660 parsing static. 02-25-2020 by thp: * libc: Added abs and labs() functions. 01-06-2020 by Lameguy64: * libpsn00b: Renamed libpsxcd directory to psxcd to match with other libraries. * examples: Added obligatory hello world example. * documentation: Added CD-ROM library documentation. 11-22-2019 by Lameguy64: * psxapi: Added root counter or timer functions and related definitions. * examples: Added timer example. * psxgpu: Added DR_AREA, DR_OFFSET and DR_TWIN primitives and accompanying setDrawArea(), setDrawOffset() and setTexWindow() macros. * psxgpu: Added parenthesis to argument value in setlen(), setaddr() and setcode() macros, preventing addPrims() from being used in a more sensible manner (ie. addPrims(ot, sub_ot+3, sub_ot)). * examples: Added render2tex render to texture example. * psxspu: Fixed typo in spuinit.s on section specifier specifying a data section instead of text section, resulting to jump to non-instruction-aligned linker errors. * psxgpu: Increased ISR stack size to 2048 bytes. * psxsio: Added kbhit() to poll keyboard input asynchronously and stdin is now buffered with an IRQ handler. * psxapi: Added AddDummyTty() (for psxsio DelSIO() fix). * psxsio: DelSIO() now calls AddDummyTty(). * libc: Fixed bug in strncpy() not placing a NULL byte at end of string. * libc: Fixed strchr() and strrchr() declarations commented out in string.h. * libpsn00b: Added the long awaited libpsxcd library with cdxa example. Documentation will come soon but existing libcd docs should be good enough for awhile. * psxgpu: Fixed non functioning GPU DMA wait in DrawSync(). * LibPSn00b run-time library is now officially 0.15b. 10-11-2019 by Lameguy64: * psxetc: Added FntOpen(), FntPrint() and FntFlush() functions. * psxgpu: Fixed typo in termPrim() macro (value too long). * examples: Added billboarding sprites example. * psxapi: Transferred putchar() BIOS function to libc. * libpsn00b: Updated makefiles adding -fdata-sections and -ffunction-sections so unused functions will be stripped out, which yields smaller executables. * libc: Fixed negative integers not displaying properly in vsprintf()/vsnprintf(). * libc: Fixed zero padding not working in vsprintf()/vsnprintf(). * fpscam: Added debug text using FntOpen(), FntPrint() and FntFlush(). Also added _boot() call for returning to CD based serial loaders. 09-23-2019 by Lameguy64: * libc: Added strcat() function. * Included PSn00bSDK logo vector. * psxgte: Added gte_stsz() macro. * psxgpu: Fixed typos in setUVWH() macro. * Added _boot() BIOS function (A(A0h) aka Warmboot, useful for CD based serial loaders). 08-17-2019 by Lameguy64: * LibPSn00b run-time library is officially version 0.13b. * examples: updated balls and n00bdemo examples for the setDrawTPage() correction. * psxgpu: Fixed error on setDrawTPage() syntax and removed setDrawTPageVal() macro (not needed). * psxapi: Added event handler definitions related to memory cards. * psxapi: Added BIOS memory card functions. * examples: Added childexec example demonstrating a parent executable transferring execution to a child executable and back. * elf2x: s_addr no longer set on PS-EXE header, console BIOS already sets it by STACK value in SYSTEM.CNF and allows child executables to return to parent if left zero. * psxapi: Renamed _InitPad(), _StartPad() and _StopPad() to InitPAD(), StartPAD() and StopPAD() respectively. Fpscam example updated to new syntax. 07-18-2019 by Lameguy64: * Added fpscam example. * Gave examples small descriptions. * Updated readme a little. 07-17-2019 by Lameguy64: * LibPSn00b run-time library is officially version 0.12b. * libc: Added basic C++ support (many thanks to ijacquez). * libc: Updated start function that should make it possible for a child executable to return to a parent executable, return logic automatically calls EnterCriticalSection(). * libc: Updated build method which takes libgcc from the compiler and adds its own object files into it, eliminating linker problems caused by having to order libc and libgcc libraries in a specific manner. * psxgpu: Added RestartCallback(). * psxgpu: Added StoreImage() function. * psxgpu: Fixed bugged setRECT() macro. * libc: Added assert.h. * examples: Balls example now has 166% more balls. * psxgpu: Increased ISR stack size to 1024 bytes so printf can be used in callbacks safely. * libc: Removed int64 (long long) printing in vsprintf() for better performance, as the R3000 does not support 64-bit arithmetic natively so its emulated like floats. int64 still used for processing floats and doubles and old vsprintf.c file is still included for those who really want int64 support for whatever reason. * libc: Removed stdarg.h which is part of GCC and not license compatible with MPL. The toolchain compiled with libgcc provides stdarg.h and other standard headers. * examples: Updated sdk-common.mk variable convention for better flexibility. * libpsn00b: Added common.mk file containing global values for all libraries. * Updated library and toolchain build instructions. * psxgpu: Fixed bug in DMACallback where the internal DMA handler would fail to install due to GetInterruptCallback() retrieving the callback value immediately in the branch delay slot of a jr instruction, which resuls to an inconsistent return value. This also broke DrawSyncCallback(). * psxsio: Done fixes on _sio_control() from the aformentioned issues with load instructions in delay slots. * psxgte: Added DVECTOR struct. * psxgpu: Added setLineF2(), setLineG2(), setLineF3() and setLineG3() primitive macros. * Added more functions in documentation. 07-01-2019 by williamblair: * Fixed FntLoad() Y coordinate not working properly for debug font (due to Y coordinate not being specified for the getTPage() macro. 06-23-2019 by Lameguy64: * LibPSn00b Run-time Library is officially version 0.10b. * Reworked readme file with improved build instructions. * libpsn00b: Added missing C extern groups for C++ compatibility in psxapi.h, stdlib.h and string.h. * libpsn00b: Removed changelogs in the readmes of each libpsn00b library as its much easier to keep track of changes in a single changelog than scattering them across multiple changelogs. * psxapi: Added Exec() function and EXEC struct. * psxgpu: Added DrawPrim() function (uses direct I/O). * psxgpu: VSync() function completely overhauled. Logic is now based on Sony's code but more efficient and can return total number of vblanks elapsed, number of hblanks since last call and wait up to n vblanks specified by an appropriate argument value. It will also generate a timeout when vblank interrupt stops working and would attempt to restart it. * psxapi: Added gets() and getc() BIOS functions. * psxapi: Corrected a putc()/putchar() discrepancy. putc() puts a character to a file stream, putchar() puts a character to stdout. * Completely revised library reference manual with better formatting and more functions documented. * psxgpu: Added DrawSyncCallback(). * psxgpu: Implemented DMA interrupt callback system with DMACallback() allowing to handle DMA interrupts very easily. * libpsn00b: Implemented Serial I/O library (psxsio) with serial tty device (installed using AddSIO) and serial callback support. Serial library is also fully documented. * psxgpu: Implemented IRQ callback system with InterruptCallback() allowing to set interrupt callbacks very easily. * psxgpu: Implemented proper IRQ handler installed using HookEntryInt or SetCustomExitFromException() for handling VSync and other interrupts. ChangeClearPAD(0) must now be called after _InitPad() or vsync timeout will occur. * libpsn00b: Started making local labels prefixed with .L instead of . making them not appear in symbol lists resulting in a cleaner symbol dump. Still not possible to do function-scope local labels like in ASMPSX because GAS syntax is ASS (or ASS GAS which is farts, GAS is farts). * psxgpu: DrawSync() function now waits for DMA completion and GPU transfer ready instead of simply waiting for GPU transfer ready which is the likely cause of subtle GPU related timing issues, it also sets GPU DMA transfer mode to off afterwards. It can also read number of words remaining in DMA transfer if a0 is non-zero but it likely only returns the correct value on VRAM transfers. Exact way how DrawSync() returns the count in the official SDK is currently unknown. 06-07-2019 by qbradq: * lzpack: Swapped a buffer length litteral with sizeof operator, fixing a stack overflow bug in some instances. 05-23-2019 by Lameguy64: * Added dev notes.txt file in docs that includes notes about the many quirks about the console discovered during the development of this SDK project. * Updated libn00bref.odf a little. * Added turboboot example. * Added rgb24 example. * Got custom exit handler set using SetCustomExitFromException() (BIOS function B(19h)) working. Currently used to acknowledge VSync IRQ but actual VSync handling is still done with events and needs to be transferred to the custom exit handler. At least it lets BIOS controller functions to work now. See doc/dev notes.txt for details on how this handler behaves. * Made stack usage in ResetGraph() less wasteful. You only need to allocate N words on stack based on N arguments of the function being called. * VSync IRQ handling now done using a custom exit from exception handler. Actual VSync handling is yet to be moved to the custom exit handler though. * Made stack usage in start.s of libc a lot less wasteful. * Implemented controller support via BIOS functions (use _InitPad(), _StartPad() and _StopPad()). BIOS memory card functions may also work as well but its not tested yet. * Removed duplicate initpad.s and initcard.s functions in psxapi. * Added _InitCd() function to psxapi which is a safer version of _96_init() as it preserves other DMA channel settings. Use BIOS file functions such as open(), read() and close() with path names starting with cdrom:/ to access files from CD after calling _InitCd().