From 72db767f5a5bdb958bb11bcb6fe6b9b332a2b195 Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Sun, 20 Feb 2022 12:31:31 +0100 Subject: Rewrite assert() and DL_CALL(), update mkpsxiso --- libpsn00b/libc/abort.c | 14 ++++++++++---- libpsn00b/libc/c++-support.cxx | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 15 deletions(-) (limited to 'libpsn00b/libc') diff --git a/libpsn00b/libc/abort.c b/libpsn00b/libc/abort.c index ca5ab1d..1d07037 100644 --- a/libpsn00b/libc/abort.c +++ b/libpsn00b/libc/abort.c @@ -1,9 +1,15 @@ #include void abort() { - printf("abort()\n"); - - while(1); -} \ No newline at end of file + for (;;) + __asm__ volatile(""); +} + +void _assert_abort(const char *file, int line, const char *expr) { + printf("%s:%d: assert(%s)\n", file, line, expr); + + for (;;) + __asm__ volatile(""); +} diff --git a/libpsn00b/libc/c++-support.cxx b/libpsn00b/libc/c++-support.cxx index d169fdb..d0c0f3a 100644 --- a/libpsn00b/libc/c++-support.cxx +++ b/libpsn00b/libc/c++-support.cxx @@ -1,28 +1,28 @@ -#include #include #include +#include -extern "C" +extern "C" void __cxa_pure_virtual(void) { + printf("__cxa_pure_virtual()\n"); -void __cxa_pure_virtual(void) { - /* Pure C++ virtual call; abort! */ - assert(false); + for (;;) + __asm__ volatile(""); } void* operator new(size_t size) { - return malloc(size); + return malloc(size); } void* operator new[](size_t size) { - return malloc(size); + return malloc(size); } void operator delete(void* ptr) { - free(ptr); + free(ptr); } void operator delete[](void* ptr) { - free(ptr); + free(ptr); } /*- @@ -35,5 +35,5 @@ void operator delete[](void* ptr) { * * A memory allocator can use the given size to be more efficient */ void operator delete(void* ptr, unsigned int) { - free(ptr); -} \ No newline at end of file + free(ptr); +} -- cgit v1.2.3 From 8c68b4b8a5bf7757b8e4d6bc2f68f10584b0deb1 Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Sat, 12 Mar 2022 14:28:11 +0100 Subject: Minor fixes, add C++ placement new, n00bdemo 573 support --- examples/demos/n00bdemo/main.c | 46 ++++++++++++++++++++++++++++---- examples/io/system573/CMakeLists.txt | 2 +- examples/lowlevel/cartrom/CMakeLists.txt | 2 +- examples/sound/spustream/main.c | 4 +++ libpsn00b/include/elf.h | 2 +- libpsn00b/libc/abort.c | 14 ++++++++++ libpsn00b/libc/c++-support.cxx | 39 ++++++++++++++++----------- libpsn00b/libc/putchar.s | 10 ------- 8 files changed, 85 insertions(+), 34 deletions(-) delete mode 100644 libpsn00b/libc/putchar.s (limited to 'libpsn00b/libc') diff --git a/examples/demos/n00bdemo/main.c b/examples/demos/n00bdemo/main.c index d2fe317..cb64c42 100644 --- a/examples/demos/n00bdemo/main.c +++ b/examples/demos/n00bdemo/main.c @@ -11,14 +11,19 @@ * * Changelog: * + * Mar 12, 2022 - Added Konami System 573 support. + * * May 10, 2021 - Variable types updated for psxgpu.h changes. * * Apr 4, 2019 - Some code clean-up and added more comments. * - * Mar 20, 2019 - Initial completed version. + * Mar 20, 2019 - Initial completed version. * */ - + +// Comment to disable 573 support +#define SYSTEM_573_SUPPORT + #include #include #include @@ -27,7 +32,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -64,6 +71,34 @@ SPRT psn00b_sprite; void sort_overlay(int showlotl); void lightdemo(); +#ifdef SYSTEM_573_SUPPORT +#define K573_WATCHDOG *((volatile uint16_t *) 0x1f5c0000) +#define K573_EXP1_CFG 0x24173f47 + +/* + The only thing required to support the 573 is to periodically reset the + watchdog. Hooking the vblank IRQ (through VSyncCallback) is the "right" way + to do it, however using a hardware timer running at a higher rate (100 Hz) + seems to improve stability. +*/ +void reset573Watchdog() { + K573_WATCHDOG = 0; +} + +void system573Setup() { + EnterCriticalSection(); + + EXP1_ADDR = 0x1f000000; + EXP1_DELAY_SIZE = K573_EXP1_CFG; + TIMER_CTRL(2) = 0x0258; // CLK/8 input, IRQ on reload + TIMER_RELOAD(2) = (F_CPU / 8) / 100; // 100 Hz + + // Configure timer 2 IRQ + ChangeClearRCnt(2, 0); + InterruptCallback(6, &reset573Watchdog); + ExitCriticalSection(); +} +#endif void UploadTIM(TIM_IMAGE *tim) { @@ -197,9 +232,10 @@ void unpackModels() { } void init() { - - int i; - +#ifdef SYSTEM_573_SUPPORT + system573Setup(); +#endif + // Init display initDisplay(); diff --git a/examples/io/system573/CMakeLists.txt b/examples/io/system573/CMakeLists.txt index 1c74347..2a362e8 100644 --- a/examples/io/system573/CMakeLists.txt +++ b/examples/io/system573/CMakeLists.txt @@ -1,7 +1,7 @@ # PSn00bSDK example CMake script # (C) 2021 spicyjpeg - MPL licensed -cmake_minimum_required(VERSION 3.21) +cmake_minimum_required(VERSION 3.20) project( system573 diff --git a/examples/lowlevel/cartrom/CMakeLists.txt b/examples/lowlevel/cartrom/CMakeLists.txt index 107cc3d..7d5e86e 100644 --- a/examples/lowlevel/cartrom/CMakeLists.txt +++ b/examples/lowlevel/cartrom/CMakeLists.txt @@ -1,7 +1,7 @@ # PSn00bSDK example CMake script # (C) 2021 spicyjpeg - MPL licensed -cmake_minimum_required(VERSION 3.21) +cmake_minimum_required(VERSION 3.20) project( cartrom diff --git a/examples/sound/spustream/main.c b/examples/sound/spustream/main.c index 6284c6d..6b9db93 100644 --- a/examples/sound/spustream/main.c +++ b/examples/sound/spustream/main.c @@ -308,6 +308,10 @@ void init_stream(CdlFILE *file) { CdReadyCallback(&cd_event_handler); ExitCriticalSection(); + // Configure the CD drive to read 2048-byte sectors at 2x speed. + uint8_t mode = CdlModeSpeed; + CdControl(CdlSetmode, (const uint8_t *) &mode, 0); + // Set the initial LBA of the stream file, which is going to be incremented // as the stream is played. str_ctx.lba = CdPosToInt(&(file->pos)); diff --git a/libpsn00b/include/elf.h b/libpsn00b/include/elf.h index b4c4408..abfb3d5 100644 --- a/libpsn00b/include/elf.h +++ b/libpsn00b/include/elf.h @@ -12,7 +12,7 @@ #ifndef __ELF_H #define __ELF_H -#include +#include typedef enum { DT_NULL = 0, /* Marks end of dynamic section */ diff --git a/libpsn00b/libc/abort.c b/libpsn00b/libc/abort.c index 1d07037..de4323d 100644 --- a/libpsn00b/libc/abort.c +++ b/libpsn00b/libc/abort.c @@ -1,5 +1,8 @@ + #include +/* Standard abort */ + void abort() { printf("abort()\n"); @@ -7,9 +10,20 @@ void abort() { __asm__ volatile(""); } +/* Internal function used by assert() macro */ + void _assert_abort(const char *file, int line, const char *expr) { printf("%s:%d: assert(%s)\n", file, line, expr); for (;;) __asm__ volatile(""); } + +/* Pure virtual function call (C++) */ + +void __cxa_pure_virtual(void) { + printf("__cxa_pure_virtual()\n"); + + for (;;) + __asm__ volatile(""); +} diff --git a/libpsn00b/libc/c++-support.cxx b/libpsn00b/libc/c++-support.cxx index d0c0f3a..38354dd 100644 --- a/libpsn00b/libc/c++-support.cxx +++ b/libpsn00b/libc/c++-support.cxx @@ -1,39 +1,46 @@ + #include #include #include -extern "C" void __cxa_pure_virtual(void) { - printf("__cxa_pure_virtual()\n"); - - for (;;) - __asm__ volatile(""); -} +/* Default new/delete operators */ -void* operator new(size_t size) { +void *operator new(size_t size) noexcept { return malloc(size); } -void* operator new[](size_t size) { +void *operator new[](size_t size) noexcept { return malloc(size); } -void operator delete(void* ptr) { +void operator delete(void *ptr) noexcept { free(ptr); } -void operator delete[](void* ptr) { +void operator delete[](void *ptr) noexcept { free(ptr); } -/*- - * +/* + * https://en.cppreference.com/w/cpp/memory/new/operator_delete * * Called if a user-defined replacement is provided, except that it's * unspecified whether other overloads or this overload is called when deleting - * objects of incomplete type and arrays of non-class and trivially-destructible - * class types. + * objects of incomplete type and arrays of non-class and trivially + * destructible class types. * - * A memory allocator can use the given size to be more efficient */ -void operator delete(void* ptr, unsigned int) { + * A memory allocator can use the given size to be more efficient. + */ +void operator delete(void *ptr, size_t size) noexcept { free(ptr); } + +/* Placement new operators */ + +void *operator new(size_t size, void *ptr) noexcept { + return ptr; +} + +void *operator new[](size_t size, void *ptr) noexcept { + return ptr; +} diff --git a/libpsn00b/libc/putchar.s b/libpsn00b/libc/putchar.s deleted file mode 100644 index a3f6c57..0000000 --- a/libpsn00b/libc/putchar.s +++ /dev/null @@ -1,10 +0,0 @@ -.set noreorder -.section .text - -.global putchar -.type putchar, @function -putchar: - addiu $t2, $0, 0xa0 - jr $t2 - addiu $t1, $0, 0x3c - \ No newline at end of file -- cgit v1.2.3 From 4bbfe640a8c357137524e797a8d2bd0a94d3abfa Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Sun, 20 Mar 2022 10:56:23 +0100 Subject: Remove stdint.h, fix n00bdemo crashing --- examples/demos/n00bdemo/logo.c | 4 +++- examples/demos/n00bdemo/main.c | 5 ++--- examples/io/pads/spi.c | 1 + examples/io/pads/spi.h | 1 + libpsn00b/include/stdint.h | 16 ---------------- libpsn00b/include/stdlib.h | 2 +- libpsn00b/libc/start.c | 23 ++++++++++++----------- 7 files changed, 20 insertions(+), 32 deletions(-) delete mode 100644 libpsn00b/include/stdint.h (limited to 'libpsn00b/libc') diff --git a/examples/demos/n00bdemo/logo.c b/examples/demos/n00bdemo/logo.c index 40160e7..784c9e1 100644 --- a/examples/demos/n00bdemo/logo.c +++ b/examples/demos/n00bdemo/logo.c @@ -51,9 +51,11 @@ typedef struct { int size; } NODE; +extern NODE _end[]; + void DumpHeap() { - NODE *n = (NODE*)GetBSSend(); + NODE *n = _end; printf( "--\n" ); diff --git a/examples/demos/n00bdemo/main.c b/examples/demos/n00bdemo/main.c index cb64c42..439bccc 100644 --- a/examples/demos/n00bdemo/main.c +++ b/examples/demos/n00bdemo/main.c @@ -232,12 +232,11 @@ void unpackModels() { } void init() { + // Init display + initDisplay(); #ifdef SYSTEM_573_SUPPORT system573Setup(); #endif - - // Init display - initDisplay(); FntLoad( 960, 0 ); diff --git a/examples/io/pads/spi.c b/examples/io/pads/spi.c index 43b5bc3..133782c 100644 --- a/examples/io/pads/spi.c +++ b/examples/io/pads/spi.c @@ -27,6 +27,7 @@ */ #include +#include #include #include #include diff --git a/examples/io/pads/spi.h b/examples/io/pads/spi.h index 7d4d75b..8c17df3 100644 --- a/examples/io/pads/spi.h +++ b/examples/io/pads/spi.h @@ -7,6 +7,7 @@ #define __SPI_H #include +#include #include // Maximum request/response length (34 bytes for pads, 140 for memory cards). diff --git a/libpsn00b/include/stdint.h b/libpsn00b/include/stdint.h deleted file mode 100644 index 83acb00..0000000 --- a/libpsn00b/include/stdint.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _STDINT_H -#define _STDINT_H - -typedef unsigned int size_t; - -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -typedef long long int64_t; - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -#endif // _STDINT_H \ No newline at end of file diff --git a/libpsn00b/include/stdlib.h b/libpsn00b/include/stdlib.h index b187a6f..4c4fcd3 100644 --- a/libpsn00b/include/stdlib.h +++ b/libpsn00b/include/stdlib.h @@ -44,7 +44,7 @@ double strtod(const char *nptr, char **endptr); float strtof(const char *nptr, char **endptr); // Memory allocation functions -unsigned int *GetBSSend(); +void _mem_init(int ram_size, int stack_max_size); void InitHeap(unsigned int *addr, int size); int SetHeapSize(int size); void *malloc(int size); diff --git a/libpsn00b/libc/start.c b/libpsn00b/libc/start.c index f190794..fd6fe33 100644 --- a/libpsn00b/libc/start.c +++ b/libpsn00b/libc/start.c @@ -6,19 +6,20 @@ #include #include #include +#include -#define KERNEL_ARG_STRING ((const char *) 0x80000180) -#define KERNEL_RETURN_VALUE ((volatile int *) 0x8000dffc) +#define KERNEL_ARG_STRING ((const char *) 0x80000180) +#define KERNEL_RETURN_VALUE ((volatile int *) 0x8000dffc) /* Argument parsing */ -int32_t __argc; -const char **__argv; +int __argc; +const char **__argv; #define ARGC_MAX 16 -static const char *_argv_buffer[ARGC_MAX]; -static char _arg_string_buffer[132]; +static const char *_argv_buffer[ARGC_MAX]; +static char _arg_string_buffer[132]; static void _parse_kernel_args() { // Copy the argument string from kernel memory into a private buffer (which @@ -61,10 +62,10 @@ extern uint8_t _end[]; // useful though to change the stack size and/or reinitialize the heap on // systems that have more than 2 MB of RAM (e.g. emulators, devkits, PS1-based // arcade boards). -void _mem_init(size_t ram_size, size_t stack_max_size) { - void *exe_end = _end + 4; - size_t exe_size = (size_t) exe_end - (size_t) __text_start; - size_t ram_used = (0x10000 + exe_size + stack_max_size) & 0xfffffffc; +void _mem_init(int ram_size, int stack_max_size) { + void *exe_end = _end + 4; + int exe_size = (int) exe_end - (int) __text_start; + int ram_used = (0x10000 + exe_size + stack_max_size) & 0xfffffffc; InitHeap(exe_end, ram_size - ram_used); } @@ -74,7 +75,7 @@ void _mem_init(size_t ram_size, size_t stack_max_size) { extern void (*__CTOR_LIST__[])(void); extern void (*__DTOR_LIST__[])(void); -extern int32_t main(int32_t argc, const char* argv[]); +extern int main(int argc, const char* argv[]); // Even though _start() usually takes no arguments, this implementation allows // parent executables to pass args directly to child executables without having -- cgit v1.2.3