aboutsummaryrefslogtreecommitdiff
path: root/core/bgdrtm/src/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/bgdrtm/src/misc.c')
-rw-r--r--core/bgdrtm/src/misc.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/core/bgdrtm/src/misc.c b/core/bgdrtm/src/misc.c
new file mode 100644
index 0000000..aeaf1f1
--- /dev/null
+++ b/core/bgdrtm/src/misc.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+/* --------------------------------------------------------------------------- */
+/*
+ * INCLUDES
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "bgdrtm.h"
+#include "offsets.h"
+#include "dcb.h"
+#include "sysprocs_p.h"
+#include "xstrings.h"
+
+#include "fmath.h"
+
+#if defined(TARGET_GP2X_WIZ) || defined(TARGET_CAANOO)
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+
+ #include <sys/mman.h>
+#endif
+
+/* --------------------------------------------------------------------------- */
+
+char * appname = NULL;
+char * appexename = NULL;
+char * appexepath = NULL;
+char * appexefullpath = NULL;
+
+/* --------------------------------------------------------------------------- */
+
+int debug = 0; /* 1 if running in debug mode */
+
+/* --------------------------------------------------------------------------- */
+
+/* os versions */
+#ifdef _WIN32
+#define _OS_ID OS_WIN32
+#endif
+
+#ifdef TARGET_LINUX
+#define _OS_ID OS_LINUX
+#endif
+
+#ifdef TARGET_BEOS
+#define _OS_ID OS_BEOS
+#endif
+
+#ifdef TARGET_MAC
+#define _OS_ID OS_MACOS
+#endif
+
+#ifdef TARGET_GP32
+#define _OS_ID OS_GP32
+#endif
+
+#ifdef TARGET_DC
+#define _OS_ID OS_DC
+#endif
+
+#ifdef TARGET_BSD
+#define _OS_ID OS_BSD
+#endif
+
+#ifdef TARGET_GP2X
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_GP2X
+#endif
+
+#ifdef TARGET_GP2X_WIZ
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_GP2X_WIZ
+#endif
+
+#ifdef TARGET_CAANOO
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_CAANOO
+#endif
+
+#ifdef TARGET_DINGUX_A320
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_DINGUX_A320
+#endif
+
+#ifdef TARGET_WII
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_WII
+#endif
+
+#ifdef TARGET_ANDROID
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_ANDROID
+#endif
+
+#ifdef TARGET_IOS
+#ifdef _OS_ID
+#undef _OS_ID
+#endif
+#define _OS_ID OS_IOS
+#endif
+
+/* --------------------------------------------------------------------------- */
+
+#if defined(TARGET_GP2X_WIZ) || defined(TARGET_CAANOO)
+
+#define TIMER_BASE3 0x1980
+#define TIMER_REG(x) __bgdrtm_memregl[(TIMER_BASE3 + x) >> 2]
+
+volatile unsigned long *__bgdrtm_memregl = NULL;
+int __bgdrtm_memdev = -1;
+
+#ifdef TARGET_CAANOO
+static unsigned long caanoo_firmware_version = 0;
+#endif
+
+void bgdrtm_ptimer_init(void)
+{
+#if defined(TARGET_GP2X_WIZ)
+ TIMER_REG(0x44) = 0x922;
+#else
+ if ( caanoo_firmware_version < 1000006 ) /* firmware version < 1.0.6 */
+ {
+ TIMER_REG(0x44) = 0x922;
+ }
+ else
+ {
+ TIMER_REG(0x44) = 0x0FF2;
+ }
+#endif
+ TIMER_REG(0x40) = 0x0c;
+ TIMER_REG(0x08) = 0x6b;
+}
+
+unsigned long bgdrtm_ptimer_get_ticks_us(void)
+{
+ TIMER_REG(0x08) = 0x4b; /* run timer, latch value */
+ return TIMER_REG(0);
+}
+
+void bgdrtm_ptimer_cleanup(void)
+{
+ TIMER_REG(0x40) = 0x0c;
+ TIMER_REG(0x08) = 0x23;
+ TIMER_REG(0x00) = 0;
+ TIMER_REG(0x40) = 0;
+ TIMER_REG(0x44) = 0;
+}
+
+#endif
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : strncmpi
+ *
+ * Compare two strings (case-insensitive version)
+ *
+ * PARAMS:
+ * str1 first string
+ * str2 second string
+ *
+ * RETURN VALUE:
+ * Result of the comparison
+ */
+
+int strncmpi( char * str1, char * str2, int sz )
+{
+ while (( *str1 || *str2 ) && sz )
+ {
+#ifdef _WIN32
+ if ( toupper( *str1 ) != toupper( *str2 ) ) return toupper( *str1 ) - toupper( *str2 );
+#else
+ if ( *str1 != *str2 ) return *str1 - *str2;
+#endif
+ str1++; str2++; sz--;
+ }
+
+ return 0 ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+void bgdrtm_entry( int argc, char * argv[] )
+{
+ int i;
+ int * args = (int *)&GLODWORD( ARGV_TABLE );
+ char * os_id;
+
+ GLODWORD( ARGC ) = argc ;
+
+ for ( i = 0 ; i < argc && i < 32; i++ )
+ {
+ args[i] = string_new( argv[i] ) ;
+ string_use( args[i] ) ;
+ }
+
+ if ( ( os_id = getenv( "OS_ID" ) ) )
+ GLODWORD( OS_ID ) = atol( os_id ) ;
+ else
+ GLODWORD( OS_ID ) = _OS_ID ;
+
+#if defined(TARGET_GP2X_WIZ) || defined(TARGET_CAANOO)
+
+#ifdef TARGET_CAANOO
+ {
+ FILE * fp = fopen( "/usr/gp2x/version", "r" );
+ if ( fp )
+ {
+ char *p1, *p2;
+ char b[32] = "";
+
+ fgets( b, sizeof(b), fp );
+ fclose( fp );
+
+ if ( ( p2 = strchr( b, '.' ) ) )
+ {
+ *p2++ = '\0';
+ caanoo_firmware_version = atol( b ) * 1000000L;
+ if ( ( p1 = strchr( p2, '.' ) ) )
+ {
+ *p1++ = '\0';
+ caanoo_firmware_version += atol( p2 ) * 1000L;
+ caanoo_firmware_version += atol( p1 );
+ }
+ else
+ {
+ caanoo_firmware_version += atol( p2 ) * 1000L;
+ }
+ }
+ }
+ }
+#endif
+
+ __bgdrtm_memdev = open( "/dev/mem", O_RDWR );
+ __bgdrtm_memregl = mmap( 0, 0x20000, PROT_READ|PROT_WRITE, MAP_SHARED, __bgdrtm_memdev, 0xc0000000 );
+
+ bgdrtm_ptimer_init();
+#endif
+
+ init_cos_tables();
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : bgdrtm_exit
+ *
+ * Exits from the program cleanly ending operations
+ *
+ * PARAMS:
+ * INT n: ERROR LEVEL to return to OS
+ *
+ * RETURN VALUE:
+ * No value
+ *
+ */
+
+void bgdrtm_exit( int exit_value )
+{
+ int n;
+ /* Finalize all modules */
+ if ( module_finalize_count )
+ for ( n = 0; n < module_finalize_count; n++ )
+ module_finalize_list[n]();
+
+#if defined(TARGET_GP2X_WIZ) || defined(TARGET_CAANOO)
+ bgdrtm_ptimer_cleanup();
+
+ __bgdrtm_memregl = munmap( 0, 0x20000 ); __bgdrtm_memregl = NULL;
+ close( __bgdrtm_memdev ); __bgdrtm_memdev = -1;
+#endif
+
+ exit( exit_value ) ;
+}
+
+/* --------------------------------------------------------------------------- */