aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2022-10-08 10:12:31 +0200
committerspicyjpeg <thatspicyjpeg@gmail.com>2022-10-08 10:12:31 +0200
commit3acc4f93f3b6a96da484aab1f08d61f900085e43 (patch)
tree042ba2e5c35ba6b1e409c5c700177c7069e4c450
parent6ee55c23b042a1559e8cabfccf3b9d3320c4c5cc (diff)
downloadpsn00bsdk-3acc4f93f3b6a96da484aab1f08d61f900085e43.tar.gz
Fix DMACallback bug, disable logging in release builds
-rw-r--r--libpsn00b/libc/abort.c12
-rw-r--r--libpsn00b/psxapi/drivers.s24
-rw-r--r--libpsn00b/psxapi/stubs.json6
-rw-r--r--libpsn00b/psxcd/isofs.c251
-rw-r--r--libpsn00b/psxcd/psxcd.c22
-rw-r--r--libpsn00b/psxetc/interrupts.c12
-rw-r--r--libpsn00b/psxgpu/common.c14
-rw-r--r--libpsn00b/psxgpu/image.c14
-rw-r--r--libpsn00b/psxpress/mdec.c16
-rw-r--r--libpsn00b/psxspu/common.c22
10 files changed, 181 insertions, 212 deletions
diff --git a/libpsn00b/libc/abort.c b/libpsn00b/libc/abort.c
index de4323d..562b619 100644
--- a/libpsn00b/libc/abort.c
+++ b/libpsn00b/libc/abort.c
@@ -1,10 +1,16 @@
#include <stdio.h>
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
+
/* Standard abort */
void abort() {
- printf("abort()\n");
+ _LOG("abort()\n");
for (;;)
__asm__ volatile("");
@@ -13,7 +19,7 @@ void abort() {
/* 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);
+ _LOG("%s:%d: assert(%s)\n", file, line, expr);
for (;;)
__asm__ volatile("");
@@ -22,7 +28,7 @@ void _assert_abort(const char *file, int line, const char *expr) {
/* Pure virtual function call (C++) */
void __cxa_pure_virtual(void) {
- printf("__cxa_pure_virtual()\n");
+ _LOG("__cxa_pure_virtual()\n");
for (;;)
__asm__ volatile("");
diff --git a/libpsn00b/psxapi/drivers.s b/libpsn00b/psxapi/drivers.s
index 1cf5050..d991f90 100644
--- a/libpsn00b/psxapi/drivers.s
+++ b/libpsn00b/psxapi/drivers.s
@@ -90,26 +90,26 @@ ListDev:
jr $t2
li $t1, 0x49
-.section .text.InitCard
-.global InitCard
-.type InitCard, @function
-InitCard:
+.section .text.InitCARD
+.global InitCARD
+.type InitCARD, @function
+InitCARD:
li $t2, 0xb0
jr $t2
li $t1, 0x4a
-.section .text.StartCard
-.global StartCard
-.type StartCard, @function
-StartCard:
+.section .text.StartCARD
+.global StartCARD
+.type StartCARD, @function
+StartCARD:
li $t2, 0xb0
jr $t2
li $t1, 0x4b
-.section .text.StopCard
-.global StopCard
-.type StopCard, @function
-StopCard:
+.section .text.StopCARD
+.global StopCARD
+.type StopCARD, @function
+StopCARD:
li $t2, 0xb0
jr $t2
li $t1, 0x4c
diff --git a/libpsn00b/psxapi/stubs.json b/libpsn00b/psxapi/stubs.json
index 200cbc7..50ffb55 100644
--- a/libpsn00b/psxapi/stubs.json
+++ b/libpsn00b/psxapi/stubs.json
@@ -362,19 +362,19 @@
{
"type": "b",
"id": 74,
- "name": "InitCard",
+ "name": "InitCARD",
"file": "drivers.s"
},
{
"type": "b",
"id": 75,
- "name": "StartCard",
+ "name": "StartCARD",
"file": "drivers.s"
},
{
"type": "b",
"id": 76,
- "name": "StopCard",
+ "name": "StopCARD",
"file": "drivers.s"
},
{
diff --git a/libpsn00b/psxcd/isofs.c b/libpsn00b/psxcd/isofs.c
index d620377..6755d3f 100644
--- a/libpsn00b/psxcd/isofs.c
+++ b/libpsn00b/psxcd/isofs.c
@@ -10,6 +10,12 @@
// Uncommend to enable debug output
//#define DEBUG
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
+
#define DEFAULT_PATH_SEP '\\'
#define IS_PATH_SEP(ch) (((ch) == '/') || ((ch) == '\\'))
@@ -46,9 +52,8 @@ static int _CdReadIsoDescriptor(int session_offs)
CdControl(CdlNop, 0, 0);
if( (CdStatus()&0x10) )
{
-#ifdef DEBUG
- printf("psxcd: Lid is still open.\n");
-#endif
+ _LOG("psxcd: Lid is still open.\n");
+
_cd_iso_error = CdlIsoLidOpen;
return -1;
}
@@ -61,61 +66,47 @@ static int _CdReadIsoDescriptor(int session_offs)
{
return 0;
}
-
-#ifdef DEBUG
- printf("psxcd: Parsing ISO file system.\n");
-#endif
+
+ _LOG("psxcd: Parsing ISO file system.\n");
// Seek to volume descriptor
CdIntToPos(16+session_offs, &loc);
if( !CdControl(CdlSetloc, (uint8_t*)&loc, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Could not set seek destination.\n");
-#endif
+ _LOG("psxcd: Could not set seek destination.\n");
+
_cd_iso_error = CdlIsoSeekError;
return -1;
}
-#ifdef DEBUG
- printf("psxcd: Set seek target.\n");
-#endif
-
-#ifdef DEBUG
- printf("psxcd: Read sectors.\n");
-#endif
+ _LOG("psxcd: Read sectors.\n");
+
// Read volume descriptor
CdRead(1, (uint32_t*)_cd_iso_descriptor_buff, CdlModeSpeed);
if( CdReadSync(0, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Error reading ISO volume descriptor.\n");
-#endif
+ _LOG("psxcd: Error reading ISO volume descriptor.\n");
+
_cd_iso_error = CdlIsoReadError;
return -1;
}
-
-#ifdef DEBUG
- printf("psxcd: Read complete.\n");
-#endif
-
+
+ _LOG("psxcd: Read complete.\n");
+
// Verify if volume descriptor is present
descriptor = (ISO_DESCRIPTOR*)_cd_iso_descriptor_buff;
if( strncmp("CD001", descriptor->header.id, 5) )
{
-#ifdef DEBUG
- printf("psxcd: Disc does not contain a ISO9660 file system.\n");
-#endif
+ _LOG("psxcd: Disc does not contain a ISO9660 file system.\n");
+
_cd_iso_error = CdlIsoInvalidFs;
return -1;
}
-
-#ifdef DEBUG
- printf("psxcd_dbg: Path table LBA = %d\n", descriptor->pathTable1Offs);
- printf("psxcd_dbg: Path table len = %d\n", descriptor->pathTableSize.lsb);
-#endif
-
+
+ _LOG("psxcd: Path table LBA = %d\n", descriptor->pathTable1Offs);
+ _LOG("psxcd: Path table len = %d\n", descriptor->pathTableSize.lsb);
+
// Allocate path table buffer
i = ((2047+descriptor->pathTableSize.lsb)>>11)<<11;
if( _cd_iso_pathtable_buff )
@@ -123,20 +114,17 @@ static int _CdReadIsoDescriptor(int session_offs)
free(_cd_iso_pathtable_buff);
}
_cd_iso_pathtable_buff = (uint8_t*)malloc(i);
-
-#ifdef DEBUG
- printf("psxcd_dbg: Allocated %d bytes for path table.\n", i);
-#endif
-
+
+ _LOG("psxcd: Allocated %d bytes for path table.\n", i);
+
// Read path table
CdIntToPos(descriptor->pathTable1Offs, &loc);
CdControl(CdlSetloc, (uint8_t*)&loc, 0);
CdRead(i>>11, (uint32_t*)_cd_iso_pathtable_buff, CdlModeSpeed);
if( CdReadSync(0, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Error reading ISO path table.\n");
-#endif
+ _LOG("psxcd: Error reading ISO path table.\n");
+
_cd_iso_error = CdlIsoReadError;
return -1;
}
@@ -162,14 +150,13 @@ static int _CdReadIsoDirectory(int lba)
CdIntToPos(lba, &loc);
i = CdPosToInt(&loc);
-#ifdef DEBUG
- printf("psxcd_dbg: Seek to sector %d\n", i);
-#endif
+
+ _LOG("psxcd_dbg: Seek to sector %d\n", i);
+
if( !CdControl(CdlSetloc, (uint8_t*)&loc, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Could not set seek destination.\n");
-#endif
+ _LOG("psxcd: Could not set seek destination.\n");
+
_cd_iso_error = CdlIsoSeekError;
return -1;
}
@@ -184,28 +171,24 @@ static int _CdReadIsoDirectory(int lba)
CdRead(1, (uint32_t*)_cd_iso_directory_buff, CdlModeSpeed);
if( CdReadSync(0, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Error reading initial directory record.\n");
-#endif
+ _LOG("psxcd: Error reading initial directory record.\n");
+
_cd_iso_error = CdlIsoReadError;
return -1;
}
direntry = (ISO_DIR_ENTRY*)_cd_iso_directory_buff;
_cd_iso_directory_len = direntry->entrySize.lsb;
-
-#ifdef DEBUG
- printf("psxcd_dbg: Location of directory record = %d\n", direntry->entryOffs.lsb);
- printf("psxcd_dbg: Size of directory record = %d\n", _cd_iso_directory_len);
-#endif
+
+ _LOG("psxcd: Location of directory record = %d\n", direntry->entryOffs.lsb);
+ _LOG("psxcd: Size of directory record = %d\n", _cd_iso_directory_len);
if( _cd_iso_directory_len > 2048 )
{
if( !CdControl(CdlSetloc, (uint8_t*)&loc, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Could not set seek destination.\n");
-#endif
+ _LOG("psxcd: Could not set seek destination.\n");
+
_cd_iso_error = CdlIsoSeekError;
return -1;
}
@@ -213,16 +196,14 @@ static int _CdReadIsoDirectory(int lba)
free(_cd_iso_directory_buff);
i = ((2047+_cd_iso_directory_len)>>11)<<11;
_cd_iso_directory_buff = (uint8_t*)malloc(i);
-#ifdef DEBUG
- printf("psxcd_dbg: Allocated %d bytes for directory record.\n", i);
-#endif
+
+ _LOG("psxcd: Allocated %d bytes for directory record.\n", i);
CdRead(i>>11, (uint32_t*)_cd_iso_directory_buff, CdlModeSpeed);
if( CdReadSync(0, 0) )
{
-#ifdef DEBUG
- printf("psxcd: Error reading remaining directory record.\n");
-#endif
+ _LOG("psxcd: Error reading remaining directory record.\n");
+
_cd_iso_error = CdlIsoReadError;
return -1;
}
@@ -243,7 +224,7 @@ static void dump_directory(void)
ISO_DIR_ENTRY *dir_entry;
char namebuff[16];
- printf("psxcd_dbg: Cached directory record contents:\n");
+ _LOG("psxcd: Cached directory record contents:\n");
i = 0;
dir_pos = 0;
@@ -254,7 +235,7 @@ static void dump_directory(void)
strncpy(namebuff,
_cd_iso_directory_buff+dir_pos+sizeof(ISO_DIR_ENTRY), dir_entry->identifierLen);
- printf("P:%d L:%d %s\n", dir_pos, dir_entry->identifierLen, namebuff);
+ _LOG("P:%d L:%d %s\n", dir_pos, dir_entry->identifierLen, namebuff);
dir_pos += dir_entry->entryLength;
i++;
@@ -273,7 +254,7 @@ static void dump_directory(void)
}
}
- printf("--\n");
+ _LOG("--\n");
}
@@ -284,7 +265,7 @@ static void dump_pathtable(void)
ISO_DESCRIPTOR *descriptor;
char namebuff[16];
- printf("psxcd_dbg: Path table entries:\n");
+ _LOG("psxcd: Path table entries:\n");
descriptor = (ISO_DESCRIPTOR*)_cd_iso_descriptor_buff;
@@ -298,7 +279,7 @@ static void dump_pathtable(void)
tbl_pos+sizeof(ISO_PATHTABLE_ENTRY),
tbl_entry->nameLength);
- printf("psxcd_dbg: %s\n", namebuff);
+ _LOG("psxcd: %s\n", namebuff);
// Advance to next entry
tbl_pos += sizeof(ISO_PATHTABLE_ENTRY)
@@ -393,10 +374,8 @@ static int find_dir_entry(const char *name, ISO_DIR_ENTRY *dirent)
int dir_pos;
ISO_DIR_ENTRY *dir_entry;
char namebuff[16];
-
-#ifdef DEBUG
- printf( "psxcd_dbg: Locating file %s.\n", name );
-#endif
+
+ _LOG("psxcd: Locating file %s.\n", name);
i = 0;
dir_pos = 0;
@@ -489,14 +468,11 @@ CdlFILE *CdSearchFile(CdlFILE *fp, const char *filename)
// Read ISO descriptor and path table
if( _CdReadIsoDescriptor(0) )
{
-#ifdef DEBUG
- printf("psxcd: Could not read ISO file system.\n");
-#endif
+ _LOG("psxcd: Could not read ISO file system.\n");
return NULL;
}
-#ifdef DEBUG
- // printf("psxcd: ISO file system cache updated.\n");
-#endif
+
+ // _LOG("psxcd: ISO file system cache updated.\n");
// _cd_media_changed = 0;
//}
@@ -504,25 +480,23 @@ CdlFILE *CdSearchFile(CdlFILE *fp, const char *filename)
num_dirs = get_pathtable_entry(0, NULL, NULL);
#ifdef DEBUG
- printf("psxcd_dbg: Directories in path table: %d\n", num_dirs);
+ _LOG("psxcd: Directories in path table: %d\n", num_dirs);
rbuff = resolve_pathtable_path(num_dirs-1, tpath_rbuff+127);
if( !rbuff )
{
- printf("psxcd_dbg: Could not resolve path.\n");
+ _LOG("psxcd: Could not resolve path.\n");
}
else
{
- printf("psxcd_dbg: Longest path: %s|\n", rbuff);
+ _LOG("psxcd: Longest path: %s|\n", rbuff);
}
#endif
if( get_pathname(search_path, filename) )
{
-#ifdef DEBUG
- printf("psxcd_dbg: Search path = %s|\n", search_path);
-#endif
+ _LOG("psxcd: Search path = %s|\n", search_path);
}
// Search the pathtable for a matching path
@@ -530,9 +504,8 @@ CdlFILE *CdSearchFile(CdlFILE *fp, const char *filename)
for(i=1; i<num_dirs; i++)
{
rbuff = resolve_pathtable_path(i, tpath_rbuff+127);
-#ifdef DEBUG
- printf("psxcd_dbg: Found = %s|\n", rbuff);
-#endif
+ _LOG("psxcd: Found = %s|\n", rbuff);
+
if( rbuff )
{
if( strcmp(search_path, rbuff) == 0 )
@@ -545,24 +518,16 @@ CdlFILE *CdSearchFile(CdlFILE *fp, const char *filename)
if( !found_dir )
{
-#ifdef DEBUG
- printf("psxcd_dbg: Directory path not found.\n");
-#endif
+ _LOG("psxcd: Directory path not found.\n");
return NULL;
}
-
-#ifdef DEBUG
- printf("psxcd_dbg: Found directory at record %d!\n", found_dir);
-#endif
- get_pathtable_entry(found_dir, &tbl_entry, NULL);
+ _LOG("psxcd: Found directory at record %d!\n", found_dir);
-#ifdef DEBUG
- printf("psxcd_dbg: Directory LBA = %d\n", tbl_entry.dirOffs);
-#endif
+ get_pathtable_entry(found_dir, &tbl_entry, NULL);
+ _LOG("psxcd: Directory LBA = %d\n", tbl_entry.dirOffs);
_CdReadIsoDirectory(tbl_entry.dirOffs);
-
get_filename(fp->name, filename);
// Add version number if not specified
@@ -577,15 +542,12 @@ CdlFILE *CdSearchFile(CdlFILE *fp, const char *filename)
if( find_dir_entry(fp->name, &dir_entry) )
{
-#ifdef DEBUG
- printf("psxcd: Could not find file.\n");
-#endif
+ _LOG("psxcd: Could not find file.\n");
+
return NULL;
}
-
-#ifdef DEBUG
- printf("psxcd_dbg: Located file at LBA %d.\n", dir_entry.entryOffs.lsb);
-#endif
+
+ _LOG("psxcd: Located file at LBA %d.\n", dir_entry.entryOffs.lsb);
CdIntToPos(dir_entry.entryOffs.lsb, &fp->pos);
fp->size = dir_entry.entrySize.lsb;
@@ -609,14 +571,11 @@ CdlDIR *CdOpenDir(const char* path)
// Read ISO descriptor and path table
if( _CdReadIsoDescriptor( 0 ) )
{
-#ifdef DEBUG
- printf( "psxcd: Could not read ISO file system.\n" );
-#endif
+ _LOG( "psxcd: Could not read ISO file system.\n" );
return NULL;
}
-#ifdef DEBUG
-// printf( "psxcd: ISO file system cache updated.\n" );
-#endif
+
+// _LOG( "psxcd: ISO file system cache updated.\n" );
// _cd_media_changed = 0;
// }
@@ -626,9 +585,8 @@ CdlDIR *CdOpenDir(const char* path)
for( i=1; i<num_dirs; i++ )
{
rbuff = resolve_pathtable_path( i, tpath_rbuff+127 );
-#ifdef DEBUG
- printf( "psxcd_dbg: Found = %s|\n", rbuff );
-#endif
+ _LOG( "psxcd_dbg: Found = %s|\n", rbuff );
+
if( rbuff )
{
if( strcmp( path, rbuff ) == 0 )
@@ -641,21 +599,14 @@ CdlDIR *CdOpenDir(const char* path)
if( !found_dir )
{
-#ifdef DEBUG
- printf( "psxcd_dbg: Directory path not found.\n" );
-#endif
+ _LOG( "psxcd_dbg: Directory path not found.\n" );
return NULL;
}
-
-#ifdef DEBUG
- printf( "psxcd_dbg: Found directory at record %d!\n", found_dir );
-#endif
+
+ _LOG( "psxcd_dbg: Found directory at record %d!\n", found_dir );
get_pathtable_entry( found_dir, &tbl_entry, NULL );
-
-#ifdef DEBUG
- printf( "psxcd_dbg: Directory LBA = %d\n", tbl_entry.dirOffs );
-#endif
+ _LOG( "psxcd_dbg: Directory LBA = %d\n", tbl_entry.dirOffs );
_CdReadIsoDirectory( tbl_entry.dirOffs );
@@ -720,15 +671,11 @@ int CdReadDir(CdlDIR *dir, CdlFILE* file)
file->size = dir_entry->entrySize.lsb;
-#ifdef DEBUG
- printf("dir_entry->entryLength = %d, ", dir_entry->entryLength);
-#endif
-
+ _LOG("dir_entry->entryLength = %d, ", dir_entry->entryLength);
+
d_dir->_pos += dir_entry->entryLength;
-
-#ifdef DEBUG
- printf("d_dir->_pos = %d\n", d_dir->_pos);
-#endif
+
+ _LOG("d_dir->_pos = %d\n", d_dir->_pos);
// Check if padding is reached (end of record sector)
if( d_dir->_dir[d_dir->_pos] == 0 )
@@ -832,19 +779,15 @@ int CdLoadSession(int session)
int i;
// Seek to specified session
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Seeking to session %d...\n", session);
-#endif
+ _LOG("psxcd: CdLoadSession(): Seeking to session %d...\n", session);
CdControl(CdlSetsession, (unsigned char*)&session,
(unsigned char*)&resultbuff);
if( CdSync(0, 0) == CdlDiskError )
{
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Session seek failed, "
+ _LOG("psxcd: CdLoadSession(): Session seek failed, "
"session does not exist.\n");
- printf("psxcd: CdLoadSession(): Restarting CD-ROM...\n");
-#endif
+ _LOG("psxcd: CdLoadSession(): Restarting CD-ROM...\n");
// Restart CD-ROM on session seek failure
CdControl(CdlNop, 0, 0);
@@ -863,9 +806,8 @@ int CdLoadSession(int session)
_ses_scanbuff = scanbuff;
// Begin scan for an ISO volume descriptor
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Scanning for ISO9660 volume descriptor.\n");
-#endif
+ _LOG("psxcd: CdLoadSession(): Scanning for ISO9660 volume descriptor.\n");
+
i = CdlModeSpeed;
CdControl(CdlSetmode, (unsigned char*)&i, 0);
CdControl(CdlReadN, 0, (unsigned char*)resultbuff);
@@ -877,9 +819,8 @@ int CdLoadSession(int session)
if( !_ses_scanfound )
{
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Did not find volume descriptor.\n");
-#endif
+ _LOG("psxcd: CdLoadSession(): Did not find volume descriptor.\n");
+
_cd_iso_error = CdlIsoInvalidFs;
CdReadyCallback((CdlCB)ready_oldcb);
return -1;
@@ -901,16 +842,12 @@ int CdLoadSession(int session)
CdSync(0, 0);
loc = (CdlLOC*)resultbuff;
-
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Session found in %02d:%02d:%02d (LBA=%d)\n",
+
+ _LOG("psxcd: CdLoadSession(): Session found in %02d:%02d:%02d (LBA=%d)\n",
btoi(loc->minute), btoi(loc->second), btoi(loc->sector), CdPosToInt(loc));
-#endif
-
+
i = CdPosToInt(loc)-17;
-#ifdef DEBUG
- printf("psxcd: CdLoadSession(): Session starting at LBA=%d\n", i);
-#endif
+ _LOG("psxcd: CdLoadSession(): Session starting at LBA=%d\n", i);
_cd_media_changed = 1;
diff --git a/libpsn00b/psxcd/psxcd.c b/libpsn00b/psxcd/psxcd.c
index 6340638..ac93376 100644
--- a/libpsn00b/psxcd/psxcd.c
+++ b/libpsn00b/psxcd/psxcd.c
@@ -20,13 +20,18 @@ volatile int _cd_last_sector_count;
int _cd_media_changed;
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
+
void _cd_init(void);
void _cd_control(unsigned char com, const void *param, int plen);
void _cd_wait_ack(void);
void _cd_wait(void);
-int CdInit(void)
-{
+int CdInit(void) {
// Sets up CD-ROM hardware and low-level subsystem
_cd_init();
@@ -37,14 +42,11 @@ int CdInit(void)
CdControl(CdlNop, 0, 0);
CdControl(CdlInit, 0, 0);
- if( CdSync(0, 0) != CdlDiskError )
- {
+ if(CdSync(0, 0) != CdlDiskError) {
CdControl(CdlDemute, 0, 0);
- printf("psxcd: Init Ok!\n");
- }
- else
- {
- printf("psxcd: Error initializing. Bad disc/drive or no disc inserted.\n");
+ _LOG("psxcd: setup done\n");
+ } else {
+ _LOG("psxcd: initialization error, bad disc/drive or no disc inserted\n");
}
return 1;
@@ -319,7 +321,7 @@ static void CdDoRetry()
{
int cb;
- printf( "CdRead: Retrying...\n" );
+ _LOG("psxcd: retrying read...\n");
// Stop reading
CdControl(CdlPause, 0, 0);
diff --git a/libpsn00b/psxetc/interrupts.c b/libpsn00b/psxetc/interrupts.c
index 859209a..1b5ac32 100644
--- a/libpsn00b/psxetc/interrupts.c
+++ b/libpsn00b/psxetc/interrupts.c
@@ -90,7 +90,7 @@ static void _global_dma_handler(void) {
}
}
-/* Callback registration API */
+/* IRQ and DMA handler API */
void *InterruptCallback(int irq, void (*func)(void)) {
if ((irq < 0) || (irq >= NUM_IRQ_CHANNELS))
@@ -127,12 +127,12 @@ void *DMACallback(int dma, void (*func)(void)) {
// the callback is being registered or removed. The main DMA IRQ dispatcher
// is also registered if this is the first DMA callback being configured,
// or disabled if it's the last one being removed.
- if (func) {
+ if (!old_callback && func) {
DMA_DICR |= (0x10000 << dma) | (1 << 23);
if (!(_num_dma_handlers++))
InterruptCallback(3, &_global_dma_handler);
- } else {
+ } else if (old_callback && !func) {
if (--_num_dma_handlers) {
DMA_DICR &= ~(0x10000 << dma);
} else {
@@ -158,7 +158,7 @@ int ResetCallback(void) {
return -1;
EnterCriticalSection();
- _saved_irq_mask = 1 << 3; // Enable DMA IRQ by default
+ _saved_irq_mask = 0;
_saved_dma_dpcr = 0x03333333;
_saved_dma_dicr = 0;
@@ -167,10 +167,6 @@ int ResetCallback(void) {
for (int i = 0; i < NUM_DMA_CHANNELS; i++)
_dma_handlers[i] = (void *) 0;
- // Set up the DMA IRQ handler. This handler shall *not* be overridden using
- // InterruptCallback().
- _irq_handlers[3] = &_global_dma_handler;
-
_96_remove();
RestartCallback();
return 0;
diff --git a/libpsn00b/psxgpu/common.c b/libpsn00b/psxgpu/common.c
index cef1508..e06c63a 100644
--- a/libpsn00b/psxgpu/common.c
+++ b/libpsn00b/psxgpu/common.c
@@ -29,7 +29,13 @@ static volatile uint8_t _queue_head, _queue_tail, _queue_length;
static volatile uint32_t _vblank_counter;
static volatile uint16_t _last_hblank;
-/* Interrupt handlers */
+/* Private utilities and interrupt handlers */
+
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
static void _vblank_handler(void) {
_vblank_counter++;
@@ -69,7 +75,7 @@ void ResetGraph(int mode) {
_gpu_video_mode = (GPU_GP1 >> 20) & 1;
ExitCriticalSection();
- printf("psxgpu: setup done, default mode is %s\n", _gpu_video_mode ? "PAL" : "NTSC");
+ _LOG("psxgpu: setup done, default mode is %s\n", _gpu_video_mode ? "PAL" : "NTSC");
}
if (mode == 3) {
@@ -108,7 +114,7 @@ static void _default_vsync_halt(void) {
return;
}
- printf("psxgpu: VSync() timeout\n");
+ _LOG("psxgpu: VSync() timeout\n");
ChangeClearPAD(0);
ChangeClearRCnt(3, 0);
}
@@ -230,7 +236,7 @@ void DrawOTag(const uint32_t *ot) {
}
IRQ_MASK = mask;
- printf("psxgpu: DrawOTag() failed, draw queue full\n");
+ _LOG("psxgpu: DrawOTag() failed, draw queue full\n");
return;
}
diff --git a/libpsn00b/psxgpu/image.c b/libpsn00b/psxgpu/image.c
index da51e7d..6190c7a 100644
--- a/libpsn00b/psxgpu/image.c
+++ b/libpsn00b/psxgpu/image.c
@@ -10,7 +10,13 @@
#define DMA_CHUNK_LENGTH 8
-/* VRAM transfer API */
+/* Private utilities */
+
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
static void _load_store_image(
uint32_t command,
@@ -20,11 +26,11 @@ static void _load_store_image(
) {
size_t length = rect->w * rect->h;
if (length % 2)
- printf("psxgpu: can't transfer an odd number of pixels\n");
+ _LOG("psxgpu: can't transfer an odd number of pixels\n");
length /= 2;
if ((length >= DMA_CHUNK_LENGTH) && (length % DMA_CHUNK_LENGTH)) {
- printf("psxgpu: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
+ _LOG("psxgpu: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
length += DMA_CHUNK_LENGTH - 1;
}
@@ -50,6 +56,8 @@ static void _load_store_image(
DMA_CHCR(2) = 0x01000200 | ((mode & 1) ^ 1);
}
+/* VRAM transfer API */
+
void LoadImage(const RECT *rect, const uint32_t *data) {
_load_store_image(0xa0000000, 2, rect, (uint32_t *) data);
}
diff --git a/libpsn00b/psxpress/mdec.c b/libpsn00b/psxpress/mdec.c
index 9c82d6b..53c596e 100644
--- a/libpsn00b/psxpress/mdec.c
+++ b/libpsn00b/psxpress/mdec.c
@@ -10,7 +10,7 @@
#include <hwregs_c.h>
#define DMA_CHUNK_LENGTH 32
-#define MDEC_SYNC_TIMEOUT 0x1000000
+#define MDEC_SYNC_TIMEOUT 0x100000
/* Default IDCT matrix and quantization tables */
@@ -81,6 +81,14 @@ static const DECDCTENV _default_mdec_env = {
}
};
+/* Private utilities */
+
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
+
/* Public API */
void DecDCTReset(int mode) {
@@ -127,7 +135,7 @@ void DecDCTin(const uint32_t *data, int mode) {
// the stream.
void DecDCTinRaw(const uint32_t *data, size_t length) {
if ((length >= DMA_CHUNK_LENGTH) && (length % DMA_CHUNK_LENGTH)) {
- printf("psxmdec: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
+ _LOG("psxpress: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
length += DMA_CHUNK_LENGTH - 1;
}
@@ -149,7 +157,7 @@ int DecDCTinSync(int mode) {
return 0;
}
- printf("psxpress: DecDCTinSync() timeout\n");
+ _LOG("psxpress: DecDCTinSync() timeout\n");
return -1;
}
@@ -174,6 +182,6 @@ int DecDCToutSync(int mode) {
return 0;
}
- printf("psxpress: DecDCToutSync() timeout\n");
+ _LOG("psxpress: DecDCToutSync() timeout\n");
return -1;
}
diff --git a/libpsn00b/psxspu/common.c b/libpsn00b/psxspu/common.c
index 55a3dba..4809684 100644
--- a/libpsn00b/psxspu/common.c
+++ b/libpsn00b/psxspu/common.c
@@ -17,7 +17,13 @@
static SPU_TransferMode _transfer_mode = SPU_TRANSFER_BY_DMA;
static uint16_t _transfer_addr = WRITABLE_AREA_ADDR;
-/* SPU initialization */
+/* Private utilities */
+
+#ifdef DEBUG
+#define _LOG(...) printf(__VA_ARGS__)
+#else
+#define _LOG(...)
+#endif
static void _wait_status(uint16_t mask, uint16_t value) {
for (int i = STATUS_TIMEOUT; i; i--) {
@@ -25,9 +31,11 @@ static void _wait_status(uint16_t mask, uint16_t value) {
return;
}
- printf("psxspu: status register timeout (0x%04x)\n", SPU_STAT);
+ _LOG("psxspu: status register timeout (0x%04x)\n", SPU_STAT);
}
+/* Public API */
+
void SpuInit(void) {
SPU_CTRL = 0x0000; // SPU disabled
_wait_status(0x001f, 0x0000);
@@ -75,19 +83,17 @@ void SpuInit(void) {
SPU_KEY_ON = 0x00ffffff;
SPU_MASTER_VOL_L = 0x3fff;
SPU_MASTER_VOL_R = 0x3fff;
- SPU_CD_VOL_L = 0x3fff;
- SPU_CD_VOL_R = 0x3fff;
+ SPU_CD_VOL_L = 0x7fff;
+ SPU_CD_VOL_R = 0x7fff;
}
-/* SPU RAM transfer API */
-
static void _load_store_data(uint32_t *data, size_t length, int mode) {
if (length % 4)
- printf("psxspu: can't transfer a number of bytes that isn't multiple of 4\n");
+ _LOG("psxspu: can't transfer a number of bytes that isn't multiple of 4\n");
length /= 4;
if ((length >= DMA_CHUNK_LENGTH) && (length % DMA_CHUNK_LENGTH)) {
- printf("psxspu: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
+ _LOG("psxspu: transfer data length (%d) is not a multiple of %d, rounding\n", length, DMA_CHUNK_LENGTH);
length += DMA_CHUNK_LENGTH - 1;
}