Fix GC/Wii linker error

Add example program (Currently only targets wii)
This commit is contained in:
Phillip Stephens 2015-10-16 02:46:18 -07:00
parent 8e8135370e
commit 1ee7c82d8b
7 changed files with 84 additions and 208 deletions

View File

@ -231,6 +231,11 @@ if(NOT GEKKO)
add_subdirectory(atdna)
endif()
##################
# Example import #
##################
add_subdirectory(Example)
#########
# CPack #
#########

13
Example/CMakeLists.txt Normal file
View File

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.0)
project(Example)
include_directories(${ATHENA_INCLUDE_DIR})
add_executable(Example
main.cpp)
if(GEKKO)
target_link_libraries(Example AthenaCore z wiiuse bte ogc m)
else()
#TODO: add normal link libraries
endif()

58
Example/main.cpp Normal file
View File

@ -0,0 +1,58 @@
#include <iostream>
#if GEKKO
#include <gccore.h>
#if HW_RVL
#include <wiiuse/wpad.h>
#endif
static void *xfb = nullptr;
static GXRModeObj* rmode = nullptr;
#endif
#include <Athena/MemoryReader.hpp>
int main()
{
#if GEKKO
VIDEO_Init();
#if HW_RVL
WPAD_Init();
#endif
PAD_Init();
rmode = VIDEO_GetPreferredMode(nullptr);
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
CON_Init(xfb, 20, 20, rmode->fbWidth, rmode->xfbHeight, rmode->fbWidth * VI_DISPLAY_PIX_SZ);
CON_EnableGecko(CARD_SLOTB, true);
VIDEO_Configure(rmode);
VIDEO_SetBlack(false);
VIDEO_Flush();
VIDEO_WaitVSync();
if (rmode->viTVMode & VI_NON_INTERLACE)
VIDEO_WaitVSync();
Athena::io::MemoryCopyReader test("sd:/test.dat");
while(true)
{
#if HW_RVL
WPAD_ScanPads();
#endif
PAD_ScanPads();
if (PAD_ButtonsDown(0) & PAD_BUTTON_START)
break;
#if HW_RVL
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME)
break;
#endif
VIDEO_WaitVSync();
}
#endif
return 0;
}

View File

@ -7,10 +7,6 @@
* Any changes to the types or namespacing must be reflected in 'atdna/main.cpp'
*/
#ifdef GEKKO
#include <stdlib.h>
#include <limits.h>
#endif
#include <string.h>
#include <yaml.h>
#include <utf8proc.h>

View File

@ -21,6 +21,7 @@ long long
strtoq(const char *nptr, char **endptr, int base);
unsigned long long
strtouq(const char *nptr, char **endptr, int base);
/* devkitppc doesn't properly declare strtof for some reason */
float
strtof(const char *string, char **endPtr );
#ifdef __cplusplus

View File

@ -288,15 +288,8 @@ int vsnprintf(char *s, size_t n, const char *format, va_list ap) {
#endif
#include <sys/types.h>
#include <stdio.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/*
* PUBLIC: #ifndef HAVE_SNPRINTF
* PUBLIC: int snprintf __P((char *, size_t, const char *, ...));
@ -326,198 +319,3 @@ long long strtoq(const char *nptr, char **endptr, int base) {
unsigned long long strtouq(const char *nptr, char **endptr, int base) {
return strtoull(nptr, endptr, base);
}
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
const float _strtof_powersOf10_[] =
{ // Table giving binary powers of 10. Entry
10.0f, // is 10^2^i. Used to convert decimal
100.0f, // exponents into floating-point numbers.
1.0e4f, 1.0e8f, 1.0e16f, 1.0e32f};
/*
*----------------------------------------------------------------------
*
* strtof --
*
* This procedure converts a floating-point number from an ASCII
* decimal representation to internal double-precision format.
*
* Results:
* The return value is the double-precision floating-point
* representation of the characters in string. If endPtr isn't
* NULL, then *endPtr is filled in with the address of the
* next character after the last one that was part of the
* floating-point number.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
float strtof(const char *string, char **endPtr) {
int sign, expSign = FALSE;
float fraction, dblExp;
const float *d;
const char *p;
int c;
int exp = 0;
int fracExp = 0;
int mantSize;
int decPt;
const char *pExp;
p = string;
while (isspace(*p)) {
p += 1;
}
if (*p == '-') {
sign = TRUE;
p += 1;
} else {
if (*p == '+') {
p += 1;
}
sign = FALSE;
}
decPt = -1;
for (mantSize = 0;; mantSize += 1) {
c = *p;
if (!isdigit(c)) {
if ((c != '.') || (decPt >= 0)) {
break;
}
decPt = mantSize;
}
p += 1;
}
/*
* Now suck up the digits in the mantissa. Use two integers to
* collect 9 digits each (this is faster than using floating-point).
* If the mantissa has more than 18 digits, ignore the extras, since
* they can't affect tahe value anyway.
*/
pExp = p;
p -= mantSize;
if (decPt < 0) {
decPt = mantSize;
} else {
mantSize -= 1; /* One of the digits was the point. */
}
if (mantSize > 18) {
fracExp = decPt - 18;
mantSize = 18;
} else {
fracExp = decPt - mantSize;
}
if (mantSize == 0) {
fraction = 0.0;
p = string;
goto done;
} else {
int frac1, frac2;
frac1 = 0;
for (; mantSize > 9; mantSize -= 1) {
c = *p;
p += 1;
if (c == '.') {
c = *p;
p += 1;
}
frac1 = 10 * frac1 + (c - '0');
}
frac2 = 0;
for (; mantSize > 0; mantSize -= 1) {
c = *p;
p += 1;
if (c == '.') {
c = *p;
p += 1;
}
frac2 = 10 * frac2 + (c - '0');
}
fraction = (1.0e9f * frac1) + frac2;
}
/*
* Skim off the exponent.
*/
p = pExp;
if ((*p == 'E') || (*p == 'e')) {
p += 1;
if (*p == '-') {
expSign = TRUE;
p += 1;
} else {
if (*p == '+') {
p += 1;
}
expSign = FALSE;
}
while (isdigit(*p)) {
exp = exp * 10 + (*p - '0');
p += 1;
}
}
if (expSign) {
exp = fracExp - exp;
} else {
exp = fracExp + exp;
}
/*
* Generate a floating-point number that represents the exponent.
* Do this by processing the exponent one bit at a time to combine
* many powers of 2 of 10. Then combine the exponent with the
* fraction.
*/
if (exp < 0) {
expSign = TRUE;
exp = -exp;
} else {
expSign = FALSE;
}
const int maxExponent = 38; /* Largest possible base 10 exponent. Any
* exponent larger than this will already
* produce underflow or overflow, so there's
* no need to worry about additional digits.
*/
if (exp > maxExponent) {
exp = maxExponent;
}
dblExp = 1.0f;
for (d = _strtof_powersOf10_; exp != 0; exp >>= 1, d += 1) {
if (exp & 01) {
dblExp *= *d;
}
}
if (expSign) {
fraction /= dblExp;
} else {
fraction *= dblExp;
}
done:
if (endPtr != NULL) {
*endPtr = (char *)p;
}
if (sign) {
return -fraction;
}
return fraction;
}

View File

@ -4,7 +4,10 @@ set(CMAKE_SYSTEM_PROCESSOR powerpc-eabi)
set(DEVKITPRO $ENV{DEVKITPRO})
set(DEVKITPPC $ENV{DEVKITPPC})
set(GEKKO true)
add_definitions(-DGEKKO=1 -DHW_RVL=1)
# Let the project know we're targetting GEKKO
set(GEKKO TRUE)
if(NOT DEVKITPPC)
message(FATAL_ERROR "Please set DEVKITPPC in your environment")
@ -19,6 +22,8 @@ if(NOT LIBOGCDIR)
set(LIBOGCDIR ${DEVKITPRO}/libogc)
endif()
include_directories(${LIBOGCDIR}/include)
link_directories(${LIBOGCDIR}/lib/wii)
if(WIN32)
set(CMAKE_C_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-gcc.exe)
set(CMAKE_CXX_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-g++.exe)
@ -27,7 +32,7 @@ else()
set(CMAKE_CXX_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-g++)
endif()
set(MACHDEP "-DGEKKO -mrvl -mcpu=750 -meabi -mhard-float")
set(MACHDEP "-mrvl -mcpu=750 -meabi -mhard-float")
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${MACHDEP}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MACHDEP}")