From b84675780de303935f1cb42fdfceb6641daaf97d Mon Sep 17 00:00:00 2001 From: nakasima Date: Fri, 26 Dec 2008 04:06:25 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=87=E3=83=90=E3=83=83=E3=82=B0=E3=83=97?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=83=88=E9=96=A2=E6=95=B0=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@145 b871894f-2f95-9b40-918c-086798483c85 --- trunk/bootrom/build/buildtools/commondefs | 7 +- trunk/bootrom/build/libraries/Makefile | 1 + .../bootrom/build/libraries/os/ARM11/Makefile | 3 +- .../bootrom/build/libraries/os/ARM9/Makefile | 3 +- .../build/libraries/os/common/os_alarm.c | 1 - .../build/libraries/os/common/os_printf.c | 833 ++++++++++++++ .../build/libraries/vlink/ARM11/Makefile | 46 + .../build/libraries/vlink/ARM9/Makefile | 54 + trunk/bootrom/build/libraries/vlink/Makefile | 34 + .../build/libraries/vlink/common/osemu.c | 1023 +++++++++++++++++ trunk/bootrom/include/brom/os.h | 7 +- trunk/bootrom/include/brom/os/common/printf.h | 91 ++ trunk/bootrom/include/brom/vlink.h | 86 ++ trunk/build/buildtools/commondefs | 18 + trunk/include/ctr/hw/common/arm_reg_common.h | 3 +- 15 files changed, 2202 insertions(+), 8 deletions(-) create mode 100644 trunk/bootrom/build/libraries/os/common/os_printf.c create mode 100644 trunk/bootrom/build/libraries/vlink/ARM11/Makefile create mode 100644 trunk/bootrom/build/libraries/vlink/ARM9/Makefile create mode 100644 trunk/bootrom/build/libraries/vlink/Makefile create mode 100644 trunk/bootrom/build/libraries/vlink/common/osemu.c create mode 100644 trunk/bootrom/include/brom/os/common/printf.h create mode 100644 trunk/bootrom/include/brom/vlink.h diff --git a/trunk/bootrom/build/buildtools/commondefs b/trunk/bootrom/build/buildtools/commondefs index 4e2e298..90e7578 100644 --- a/trunk/bootrom/build/buildtools/commondefs +++ b/trunk/bootrom/build/buildtools/commondefs @@ -125,10 +125,13 @@ CTR_PMIC_REV ?= $(BROM_PMIC_REV) # # Debugger Type # -# one of [ISD/KMC/ARM] +# one of [ARM/KMC] # +ifeq ($(BROM_PLATFORM),MG20EMU) BROM_DEBUGGER ?= KMC +endif +BROM_DEBUGGER ?= ARM # replace TwlSDK CTR_DEBUGGER ?= $(BROM_DEBUGGER) @@ -246,6 +249,7 @@ ifeq ($(CODEGEN_PROC),ARM11) BROM_LIBS_BASE ?= \ libos \ libmi \ + libvlink \ ifdef BROM_PROFILE_TYPE BROM_LIBS_BASE += libos.$(BROM_PROFILE_TYPE) @@ -256,6 +260,7 @@ else # ($(CODEGEN_PROC),ARM9) BROM_LIBS_BASE ?= \ libos_sp \ libmi_sp \ + libvlink_sp \ ifdef BROM_PROFILE_TYPE BROM_LIBS_BASE += libos_sp.$(BROM_PROFILE_TYPE) diff --git a/trunk/bootrom/build/libraries/Makefile b/trunk/bootrom/build/libraries/Makefile index 43420c3..b4cc876 100644 --- a/trunk/bootrom/build/libraries/Makefile +++ b/trunk/bootrom/build/libraries/Makefile @@ -21,6 +21,7 @@ include $(CTRBROM_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- SUBDIRS = \ + vlink \ init \ os \ mi \ diff --git a/trunk/bootrom/build/libraries/os/ARM11/Makefile b/trunk/bootrom/build/libraries/os/ARM11/Makefile index e0bba32..e52d918 100644 --- a/trunk/bootrom/build/libraries/os/ARM11/Makefile +++ b/trunk/bootrom/build/libraries/os/ARM11/Makefile @@ -28,7 +28,7 @@ BROM_CODEGEN_ALL ?= TRUE SRCDIR = . ../common SRCS = \ - os_cache.c \ + os_printf.c \ os_init.c \ os_system.c \ os_timer.c \ @@ -39,6 +39,7 @@ SRCS = \ os_exception.c \ os_thread.c \ os_context.c \ + os_cache.c \ TARGET_LIB = libos$(BROM_LIBSUFFIX).a diff --git a/trunk/bootrom/build/libraries/os/ARM9/Makefile b/trunk/bootrom/build/libraries/os/ARM9/Makefile index b8aea91..0bea35b 100644 --- a/trunk/bootrom/build/libraries/os/ARM9/Makefile +++ b/trunk/bootrom/build/libraries/os/ARM9/Makefile @@ -31,7 +31,7 @@ BROM_PROC = ARM9 SRCDIR = . ../common SRCS = \ - os_cache.c \ + os_printf.c \ os_init.c \ os_system.c \ os_timer.c \ @@ -42,6 +42,7 @@ SRCS = \ os_exception.c \ os_thread.c \ os_context.c \ + os_cache.c \ TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a diff --git a/trunk/bootrom/build/libraries/os/common/os_alarm.c b/trunk/bootrom/build/libraries/os/common/os_alarm.c index 2e7e289..c9f1507 100644 --- a/trunk/bootrom/build/libraries/os/common/os_alarm.c +++ b/trunk/bootrom/build/libraries/os/common/os_alarm.c @@ -16,7 +16,6 @@ *---------------------------------------------------------------------------*/ #include -#define osPanic(...) ((void)0) //---------------------------------------------------------------------- #ifdef SDK_ARM9 diff --git a/trunk/bootrom/build/libraries/os/common/os_printf.c b/trunk/bootrom/build/libraries/os/common/os_printf.c new file mode 100644 index 0000000..0363190 --- /dev/null +++ b/trunk/bootrom/build/libraries/os/common/os_printf.c @@ -0,0 +1,833 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - libraries - OS + File: os_printf.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ +#include +#include +#include + + +#ifndef SDK_FINALROM +static char common_buffer[256]; // thread unsafe, but less use of stack +#endif + +#if !defined(SDK_FINALROM) && defined(SDK_NO_MESSAGE) +#undef i_osWarning +#undef i_osTWarning +#undef i_osPanic +#undef i_osTPanic +void i_osWarning(const char *file, int line, const char *fmt, ...); +void i_osTWarning(const char *file, int line, const char *fmt, ...); +void i_osPanic(const char *file, int line, const char *fmt, ...); +void i_osTPanic(const char *file, int line, const char *fmt, ...); +#endif /* SDK_NO_MESSAGE */ + + +/*---------------------------------------------------------------------------* + Name: osPutChar + + Description: put a letter for debug console + + Arguments: c : char code , shuild be 0x01-0xff + + Returns: None. + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +SDK_WEAK_SYMBOL void osPutChar(char c) +{ + char str[2]; + + str[0] = c; + str[1] = '\0'; + + // Because of no putchar-type function on ISDebugger library, + // use 'putstring' for a single letter outputting + osPutString(str); +} +#endif + +/*---------------------------------------------------------------------------* + Name: osPutString + + Description: put a string to debug console. + console port are automatically switched depends on emu/hw + + Arguments: str : string + + Returns: None. + *---------------------------------------------------------------------------*/ +static void osPutStringInit(const char *str); + +#ifndef SDK_FINALROM +static void osPutStringKMC(const char *str); + void osPutStringARM(const char *str); +#ifdef SDK_ARM7 +static void osPutStringPrnSrv(const char *str); +#endif +#endif + +#ifndef SDK_FINALROM +void (*osPutString) (const char *str) = osPutStringInit; +#endif + + +/*---------------------------------------------------------------------------* + Name: osPutStringInit + Description: osPutString initializer + *---------------------------------------------------------------------------*/ +static void osPutStringInit(const char *str) +{ +#ifndef SDK_FINALROM + OSIntrMode intr = osDisableInterrupts(); + + { +#ifdef SDK_DEBUGGER_KMC + osPutString = osPutStringKMC; +#else // SDK_DEBUGGER_ARM + osPutString = osPutStringARM; +#endif + } + + osPutString(str); + + (void)osRestoreInterrupts(intr); + +#else + (void)str; // avoiding to unused warning +#endif +} + + +/*---------------------------------------------------------------------------* + Name: osPutStringKMC + Description: osPutString for hardware emulator called KMC Debugger + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +static void osPutStringKMC(const char *str) +{ + vlink_dos_putstring_console((char *)str, strlen(str)); // STD_GetStringLength(str)); +} +#endif + + +/*---------------------------------------------------------------------------* + Name: osPutStringARM + Description: osPutString for hardware emulator called ARM Debugger + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +#include +asm void osPutStringARM(const char *str) +{ + mov r1, r0 + mov r0, #0x04 + swi 0x123456 + bx lr +} +#include +#endif + + +/*---------------------------------------------------------------------------* + Name: osVPrintf/osTVPrintf + + Description: print formatted strings (vprintf ver.) + + Arguments: fmt : format string + vlist : parameters + + Returns: None. + *---------------------------------------------------------------------------*/ +// If you want to use "vsnprintf()" in ARM7, define SDK_USE_VSNPRINTF. +// "vsnprintf()" is able to print float format but the code size become hugely bigger. +// #define SDK_USE_VSNPRINTF + +#ifndef SDK_FINALROM +#if defined(SDK_USE_VSNPRINTF) +SDK_WEAK_SYMBOL void osVPrintf(const char *fmt, va_list vlist) +{ + (void)vsnprintf(common_buffer, sizeof(common_buffer), fmt, vlist); + osPutString(common_buffer); +} +#else +SDK_WEAK_SYMBOL void osVPrintf(const char *fmt, va_list vlist) +{ + osTVPrintf(fmt, vlist); +} +#endif +SDK_WEAK_SYMBOL void osTVPrintf(const char *fmt, va_list vlist) +{ + (void)osVSNPrintf(common_buffer, sizeof(common_buffer), fmt, vlist); + osPutString(common_buffer); +} +#endif + +/*---------------------------------------------------------------------------* + Name: osPrintf/osTPrintf + + Description: print formatted strings. + + Arguments: fmt : format string + ... and parameters + + Returns: None. + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +SDK_WEAK_SYMBOL void osPrintf(const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + osVPrintf(fmt, vlist); + va_end(vlist); +} + +SDK_WEAK_SYMBOL void osTPrintf(const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + osTVPrintf(fmt, vlist); + va_end(vlist); +} +#endif + +/*---------------------------------------------------------------------------* + Name: i_osWarning / i_osTWarning + + Description: print warning message. + + Arguments: file : filename of warning location + line : line number of warning location + fmt : format string + ... and parameters + + Returns: None. + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +SDK_WEAK_SYMBOL void i_osWarning(const char *file, int line, const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + osPrintf("%s:%d Warning:", file, line); + osVPrintf(fmt, vlist); + osPrintf("\n"); + va_end(vlist); +} + + +SDK_WEAK_SYMBOL void i_osTWarning(const char *file, int line, const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + osTPrintf("%s:%d Warning:", file, line); + osTVPrintf(fmt, vlist); + osTPrintf("\n"); + va_end(vlist); +} +#endif + +/*---------------------------------------------------------------------------* + Name: i_osPanic/i_osTPanic + + Description: print panic message and halt cpu. + + Arguments: file : filename of panic location + line : line number of panic location + fmt : format string + ... and parameters + + Returns: None. + *---------------------------------------------------------------------------*/ +#ifndef SDK_FINALROM +void (*i_osFuncTerminate) (void) = osTerminate; + +SDK_WEAK_SYMBOL void i_osPanic(const char *file, int line, const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + (void)osDisableInterrupts(); + osPrintf("%s:%d Panic:", file, line); + osVPrintf(fmt, vlist); + osPrintf("\n"); + i_osFuncTerminate(); // Never Returns +} + +SDK_WEAK_SYMBOL void i_osTPanic(const char *file, int line, const char *fmt, ...) +{ + va_list vlist; + + va_start(vlist, fmt); + (void)osDisableInterrupts(); + osTPrintf("%s:%d Panic:", file, line); + osTVPrintf(fmt, vlist); + osTPrintf("\n"); + i_osFuncTerminate(); // Never Returns +} +#endif + + +#if defined(SDK_CW_WARNOFF_SAFESTRB) +#include +#endif + +/* inner function for sized-buffer output */ +typedef struct dst_string_tag +{ + size_t len; + char *cur; + char *base; +} +dst_string; + +static void string_put_char(dst_string * p, char c) +{ + if (p->len > 0) + *p->cur = c, --p->len; + ++p->cur; +} + +static void string_fill_char(dst_string * p, char c, int n) +{ + if (n > 0) + { + size_t i, k = p->len; + if (k > (size_t) n) + k = (size_t) n; + for (i = 0; i < k; ++i) + p->cur[i] = c; + p->len -= k; + p->cur += n; + } +} + +static void string_put_string(dst_string * p, const char *s, int n) +{ + if (n > 0) + { + size_t i, k = p->len; + if (k > (size_t) n) + k = (size_t) n; + for (i = 0; i < k; ++i) + p->cur[i] = s[i]; + p->len -= k; + p->cur += n; + } +} + +/*---------------------------------------------------------------------------* + Name: osSPrintf + + Description: equal to 'osVSPrintf' except argument style. + + Arguments: dst : destination buffer. + fmt : format string. + + Returns: length of the generated string. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL int osSPrintf(char *dst, const char *fmt, ...) +{ + int ret; + va_list va; + va_start(va, fmt); + ret = osVSPrintf(dst, fmt, va); + va_end(va); + return ret; +} + +/*---------------------------------------------------------------------------* + Name: osVSPrintf + + Description: equal to 'osVSNPrintf' except buffer size argument. + + Arguments: dst : destination buffer. + fmt : format string. + vlist : parameters. + + Returns: length of the generated string. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL int osVSPrintf(char *dst, const char *fmt, va_list vlist) +{ + return osVSNPrintf(dst, 0x7FFFFFFF, fmt, vlist); +} + +/*---------------------------------------------------------------------------* + Name: osSNPrintf + + Description: equal to 'osVSNPrintf' except argument style. + + Arguments: dst : destination buffer. + len : destination buffer size. + fmt : format string. + + Returns: length of the generated string. (except '\0') + if(result < len), + put NUL in dst[result]. + else if(len > 0), + put NUL in dst[len - 1]. + else, + do nothing. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL int osSNPrintf(char *dst, size_t len, const char *fmt, ...) +{ + int ret; + va_list va; + va_start(va, fmt); + ret = osVSNPrintf(dst, len, fmt, va); + va_end(va); + return ret; +} + +/*---------------------------------------------------------------------------* + Name: osVSNPrintf + + Description: small-size vsnprintf which is similar to 'vsnprintf' + without following supports. + * CodeWarrior Extensions (#s) + * MSL AltiVec Extensions (v, vh, vl, hv, lv, @) + * indexed argments (%m$, *m$) + * floating-point + * wchar_t + + Note: '+' and '#' do not work, MSL's sprintf(). + to keep same result, they are no implement. + { // exsample + char buf[5]; + sprintf(buf, "%-i\n", 45); // "45" (OK) + sprintf(buf, "%0i\n", 45); // "45" (OK) + sprintf(buf, "% i\n", 45); // " 45" (OK) + sprintf(buf, "%+i\n", 45); // "%+i" ("+45" expected) + sprintf(buf, "%#x\n", 45); // "%#x" ("0x2d" expected) + // but, this works correctly! + sprintf(buf, "% +i\n", 45); // "+45" (OK) + } + + Arguments: dst : destination buffer. + len : destination buffer size. + fmt : format string. + vlist : parameters. + + Returns: length of the generated string. (except '\0') + if(result < len), + put NUL in dst[result]. + else if(len > 0), + put NUL in dst[len - 1]. + else, + do nothing. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL int osVSNPrintf(char *dst, size_t len, const char *fmt, va_list vlist) +{ + char buf[24]; + int n_buf; + char prefix[2]; + int n_prefix; + + const char *s = fmt; + + dst_string str; + str.len = len, str.cur = str.base = dst; + + while (*s) + { + if ((unsigned int)(((unsigned char)*s ^ 0x20) - 0xA1) < 0x3C) + { + /* Shift JIS character */ + string_put_char(&str, *s++); + if (*s) + string_put_char(&str, *s++); + } + else if (*s != '%') + { + /* normal ASCII character */ + string_put_char(&str, *s++); + } + else + { + /* output with format */ + enum + { + flag_blank = 000001, /* ' ' */ + flag_plus = 000002, /* '+' */ + flag_sharp = 000004, /* '#' */ + flag_minus = 000010, /* '-' */ + flag_zero = 000020, /* '0' */ + flag_l1 = 000040, /* "l" */ + flag_h1 = 000100, /* "h" */ + flag_l2 = 000200, /* "ll" */ + flag_h2 = 000400, /* "hh" */ + flag_unsigned = 010000, /* 'o', 'u', ... */ + flag_end + }; + int flag = 0, width = 0, precision = -1, radix = 10; + char hex_char = 'a' - 10; + const char *p_start = s; + /* flags */ + for (;;) + { + switch (*++s) + { + case '+': + if (s[-1] != ' ') + break; + flag |= flag_plus; + continue; + case ' ': + flag |= flag_blank; + continue; + case '-': + flag |= flag_minus; + continue; + case '0': + flag |= flag_zero; + continue; + } + break; + } + /* width */ + if (*s == '*') + { + ++s, width = va_arg(vlist, int); + if (width < 0) + width = -width, flag |= flag_minus; + } + else + { + while ((*s >= '0') && (*s <= '9')) + width = (width * 10) + *s++ - '0'; + } + /* precision */ + if (*s == '.') + { + ++s, precision = 0; + if (*s == '*') + { + ++s, precision = va_arg(vlist, int); + if (precision < 0) + precision = -1; + } + else + { + while ((*s >= '0') && (*s <= '9')) + precision = (precision * 10) + *s++ - '0'; + } + } + /* option */ + switch (*s) + { + case 'h': + if (*++s != 'h') + flag |= flag_h1; + else + ++s, flag |= flag_h2; + break; + case 'l': + if (*++s != 'l') + flag |= flag_l1; + else + ++s, flag |= flag_l2; + break; + } + + /* type */ + switch (*s) + { + case 'd': /* signed decimal */ + case 'i': /* signed decimal */ + goto put_integer; + case 'o': /* unsigned octal */ + radix = 8; + flag |= flag_unsigned; + goto put_integer; + case 'u': /* unsigned decimal */ + flag |= flag_unsigned; + goto put_integer; + case 'X': /* unsigned hexadecimal */ + hex_char = 'A' - 10; + goto put_hexadecimal; + case 'x': /* unsigned hexadecimal */ + goto put_hexadecimal; + case 'p': /* pointer */ + /* equal to code warrior */ + flag |= flag_sharp; + precision = 8; + goto put_hexadecimal; + + case 'c': /* character */ + if (precision >= 0) + goto put_invalid; + { + int c = va_arg(vlist, int); + width -= 1; + if (flag & flag_minus) + { + string_put_char(&str, (char)c); + string_fill_char(&str, ' ', width); + } + else + { + char pad = (char)((flag & flag_zero) ? '0' : ' '); + string_fill_char(&str, pad, width); + string_put_char(&str, (char)c); + } + ++s; + } + break; + + case 's': /* string */ + { + int n_buf = 0; + const char *p_buf = va_arg(vlist, const char *); + if (precision < 0) + { + while (p_buf[n_buf]) + ++n_buf; + } + else + { + while ((n_buf < precision) && p_buf[n_buf]) + ++n_buf; + } + width -= n_buf; + if (flag & flag_minus) + { + string_put_string(&str, p_buf, n_buf); + string_fill_char(&str, ' ', width); + } + else + { + char pad = (char)((flag & flag_zero) ? '0' : ' '); + string_fill_char(&str, pad, width); + string_put_string(&str, p_buf, n_buf); + } + ++s; + } + break; + + case 'n': /* store the number of output */ + { + int pos = str.cur - str.base; + if (flag & flag_h2) + ; + else if (flag & flag_h1) + *va_arg(vlist, signed short *) = (signed short)pos; + else if (flag & flag_l2) + *va_arg(vlist, u64 *) = (u64)pos; + else + *va_arg(vlist, signed int *) = (signed int)pos; + } + ++s; + break; + + case '%': /* output '%' */ + if (p_start + 1 != s) + goto put_invalid; + string_put_char(&str, *s++); + break; + + default: /* invalid type */ + goto put_invalid; + + put_invalid: + string_put_string(&str, p_start, s - p_start); + break; + + put_hexadecimal: + radix = 16; + flag |= flag_unsigned; + put_integer: + { + u64 val = 0; + n_prefix = 0; + + if (flag & flag_minus) + flag &= ~flag_zero; + if (precision < 0) + precision = 1; + else + flag &= ~flag_zero; + + if (flag & flag_unsigned) + { + if (flag & flag_h2) + val = va_arg(vlist, unsigned char); + else if (flag & flag_h1) + val = va_arg(vlist, unsigned short); + else if (flag & flag_l2) + val = va_arg(vlist, u64); + else + val = va_arg(vlist, unsigned long); + flag &= ~(flag_plus | flag_blank); + if (flag & flag_sharp) + { + if (radix == 16) + { + if (val != 0) + { + prefix[0] = (char)(hex_char + (10 + 'x' - 'a')); + prefix[1] = '0'; + n_prefix = 2; + } + } + else if (radix == 8) + { + prefix[0] = '0'; + n_prefix = 1; + } + } + } + else + { + if (flag & flag_h2) + val = va_arg(vlist, char); + else if (flag & flag_h1) + val = va_arg(vlist, short); + else if (flag & flag_l2) + val = va_arg(vlist, u64); + else + val = va_arg(vlist, long); + if ((val >> 32) & 0x80000000) + { + val = ~val + 1; + prefix[0] = '-'; + n_prefix = 1; + } + else + { + if (val || precision) + { + if (flag & flag_plus) + { + prefix[0] = '+'; + n_prefix = 1; + } + else if (flag & flag_blank) + { + prefix[0] = ' '; + n_prefix = 1; + } + } + } + } + n_buf = 0; + switch (radix) + { + case 8: + while (val != 0) + { + int d = (int)(val & 0x07); + val >>= 3; + buf[n_buf++] = (char)(d + '0'); + } + break; + case 10: + if ((val >> 32) == 0) + { +#if defined(SDK_CW) || defined(__MWERKS__) +#pragma optimize_for_size off +#endif + u32 v = (u32)val; + while (v != 0) + { + // u32 と定数の除算であれば、コンパイラが自動的に + // マジックナンバーを使用した積算に変換する + u32 r = v / 10; + int d = (int)(v - (r * 10)); + v = r; + buf[n_buf++] = (char)(d + '0'); + } + } + else + { + while (val != 0) + { + u64 r = val / 10; + int d = (int)(val - (r * 10)); + val = r; + buf[n_buf++] = (char)(d + '0'); + } + } + break; + case 16: + while (val != 0) + { + int d = (int)(val & 0x0f); + val >>= 4; + buf[n_buf++] = (char)((d < 10) ? (d + '0') : (d + hex_char)); + } + break; + } + if ((n_prefix > 0) && (prefix[0] == '0')) + { + n_prefix = 0; + buf[n_buf++] = '0'; + } + } + goto put_to_stream; + + put_to_stream: + { + int n_pad = precision - n_buf; + if (flag & flag_zero) + { + if (n_pad < width - n_buf - n_prefix) + n_pad = width - n_buf - n_prefix; + } + if (n_pad > 0) + width -= n_pad; + width -= n_prefix + n_buf; + if (!(flag & flag_minus)) + string_fill_char(&str, ' ', width); + while (n_prefix > 0) + string_put_char(&str, prefix[--n_prefix]); + string_fill_char(&str, '0', n_pad); + while (n_buf > 0) + string_put_char(&str, buf[--n_buf]); + if (flag & flag_minus) + string_fill_char(&str, ' ', width); + ++s; + } + break; + } + } + } + + if (str.len > 0) + *str.cur = '\0'; + else if (len > 0) + str.base[len - 1] = '\0'; + return str.cur - str.base; +} + +#if defined(SDK_CW_WARNOFF_SAFESTRB) +#include +#endif + + + +//================================================================================ +// DUMMY PRINT (stub for FINALROM) +//================================================================================ +#ifdef SDK_FINALROM +#ifdef osPrintf +#undef osPrintf +#endif +void osPrintf(const char *fmt, ...); +void osPrintf(const char *fmt, ...) +{ +//#pragma unused( fmt ) +} +#endif diff --git a/trunk/bootrom/build/libraries/vlink/ARM11/Makefile b/trunk/bootrom/build/libraries/vlink/ARM11/Makefile new file mode 100644 index 0000000..859f849 --- /dev/null +++ b/trunk/bootrom/build/libraries/vlink/ARM11/Makefile @@ -0,0 +1,46 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries - os +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +SUBDIRS = +SUBMAKES = + + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +BROM_CODEGEN_ALL ?= TRUE + +SRCDIR = . ../common + +SRCS = \ + osemu.c \ + +TARGET_LIB = libvlink$(BROM_LIBSUFFIX).a + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(BROM_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/vlink/ARM9/Makefile b/trunk/bootrom/build/libraries/vlink/ARM9/Makefile new file mode 100644 index 0000000..cfc04aa --- /dev/null +++ b/trunk/bootrom/build/libraries/vlink/ARM9/Makefile @@ -0,0 +1,54 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlBrom - libraries_sp - vlink +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +SUBDIRS = +#SUBMAKES = Makefile.CALLTRACE \ +# Makefile.FUNCTIONCOST + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +BROM_CODEGEN_ALL ?= TRUE + +# Codegen for sub processer +BROM_PROC = ARM9 + +SRCDIR = . ../common + +SRCS = \ + osemu.c \ + +TARGET_LIB = libvlink_sp$(BROM_LIBSUFFIX).a + + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(BROM_INSTALL_LIBDIR) + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/vlink/Makefile b/trunk/bootrom/build/libraries/vlink/Makefile new file mode 100644 index 0000000..0c12e53 --- /dev/null +++ b/trunk/bootrom/build/libraries/vlink/Makefile @@ -0,0 +1,34 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries - os +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM11 + +#ifdef CTR_WITH_ARM9 +SUBDIRS += ARM9 +#endif + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/vlink/common/osemu.c b/trunk/bootrom/build/libraries/vlink/common/osemu.c new file mode 100644 index 0000000..54e4a7a --- /dev/null +++ b/trunk/bootrom/build/libraries/vlink/common/osemu.c @@ -0,0 +1,1023 @@ +/* + OSEMU.C + + Copyright (c) 1995-2002 by Kyoto Micro Computer Co.,LTD. + All Rights Reserved. + +*/ + +#include +#include + +void (*i_vlink_start_fnc)(void); +void (*i_vlink_end_fnc)(void); + +#define VLINK_START if(i_vlink_start_fnc!=0) i_vlink_start_fnc(); +#define VLINK_END if(i_vlink_end_fnc!=0) i_vlink_end_fnc(); + +#define __asm__ asm + +#define PORTSIZE unsigned char + +int vlink_dos_errno; + +#define UBYTE unsigned char +#define UWORD unsigned short +#define ULONG unsigned + +#define MONADR __et2_vlink_monadr +#define MONADR_H __et2_vlink_monadr_h +#define SHIFT_L __et2_vlink_shift_l +#define SHIFT_R __et2_vlink_shift_r +#define CMDWRS __et2_vlink_cmdwrs +#define CMDRD __et2_vlink_cmdrd +#define STAT __et2_vlink_stat + +ULONG MONADR=0; +ULONG SHIFT_L=0; +ULONG SHIFT_R=0; +ULONG MONADR_H=0; + +volatile PORTSIZE *CMDWRS=0; +volatile PORTSIZE *CMDRD=0; +volatile PORTSIZE *STAT=0; + + +#define OSEMU 0x83 +#define EMU_OPEN 0x0 +#define EMU_CREAT 0x1 +#define EMU_READ 0x2 +#define EMU_WRITE 0x3 +#define EMU_CLOSE 0x4 +#define EMU_LSEEK 0x5 +#define EMU_FILE_MODE 0x6 + +#define EMU_FIND_FIRST 0x8 +#define EMU_FIND_NEXT 0x9 +#define EMU_FIND_CLOSE 0xa +#define EMU_GET_IOCTL 0xb +#define EMU_GET_FILE_TM 0xc +#define EMU_GET_TIME 0xd +#define EMU_SET_FILE_TM 0xe +#define EMU_MKDIR 0xf +#define EMU_RMDIR 0x10 +#define EMU_REMOVE 0x11 +#define EMU_RENAME 0x12 +#define EMU_GETCWD 0x13 +#define EMU_CHDIR 0x14 +#define EMU_GETCDRV 0x15 + + +#define EMU_DUP 0x18 +#define EMU_DUP2 0x19 +#define EMU_VERSION 0x1a +#define EMU_EXIT 0x1b + +#define EMU_SLEEP 0x1d +#define EMU_ARG_ENV 0x1e +/* +char *_dos_arg; +char *_dos_env; +*/ + +static struct ffblk *ffblkp; + +static int putCMD_init(UBYTE c); +static int putCMD_not_use(UBYTE c); +static int not_use_vlink(void); + +int (*putCMD)(UBYTE) =putCMD_init; +void (*putPT)(UBYTE) =(void (*)(UBYTE))not_use_vlink; +UBYTE (*getPT)(void) =(UBYTE (*)(void))not_use_vlink; +UBYTE (*getPT_sync)(void) =(UBYTE (*)(void))not_use_vlink; +void (*putPT_sync)(UBYTE) =(void (*)(UBYTE))not_use_vlink; +void (*putPT_L)(ULONG) =(void (*)(ULONG))not_use_vlink; +ULONG (*getPT_L)(void) =(ULONG (*)(void))not_use_vlink; +void (*getPT_BLK)(UBYTE*,ULONG) =(void (*)(UBYTE*,ULONG))not_use_vlink; +void (*putPT_BLK)(UBYTE*,ULONG) =(void (*)(UBYTE*,ULONG))not_use_vlink; +UBYTE (*getSTAT)(void) =(UBYTE (*)(void))not_use_vlink; + +void (*putPT_flash)(void) =(void (*)(void))not_use_vlink; + + +static unsigned vlink_sync_stat; +static unsigned vlink_not_use_osemu; + +#include + +ASM int i_vlink_jtag_com_stat(void) /* bit0==1 受信でデータあり / bit1==0 送信可能 */ +{ + mrc p14,0,r0,c0,c0, 0 + bx lr +} + +ASM void i_vlink_jtag_com_put(ULONG r0) +{ + mcr p14,0,r0,c1,c0, 0 + bx lr +} + +ASM ULONG i_vlink_jtag_com_get(void) +{ + mrc p14,0,r0,c1,c0, 0 + bx lr +} + +ASM int i_vlink_jtag_com_stat11(void) /* bit30==1 受信でデータあり / bit29==0 送信可能 */ +{ + mrc p14,0,r0,c0,c1, 0 + bx lr +} + +ASM void i_vlink_jtag_com_put11(ULONG r0) +{ + mcr p14,0,r0,c0,c5, 0 + bx lr +} + +ASM ULONG i_vlink_jtag_com_get11(void) +{ + mrc p14,0,r0,c0,c5, 0 + bx lr +} + +ASM int i_vlink_jtag_cpuid(void) +{ +#ifdef SDK_ARM7 + mov r0, #0x00050000 +#else // SDK_ARM11 || SDK_ARM9 + mrc p15,0,r0,c0,c0, 0 /* bit[19..16] =7 ARMv6(ARM11) */ +#endif + bx lr +} + +#include + +static UBYTE VLC_getSTAT(void) +{ + return (i_vlink_jtag_com_stat() & 1); +} + +static void VLC_putPT(UBYTE c) +{ + while((i_vlink_jtag_com_stat() & 2)!=0){ + ; + } + i_vlink_jtag_com_put((ULONG)c); +} + +static int VLC_putCMD(UBYTE data) +{ + VLC_putPT(data); + return 0; +} + +static void VLC_putPT_L(ULONG c) +{ + while((i_vlink_jtag_com_stat() & 2)!=0){ + ; + } + i_vlink_jtag_com_put(c); +} + + +static UBYTE VLC_getPT(void) +{ + UBYTE c; + while((i_vlink_jtag_com_stat() & 1)==0){ + ; + } + c=(i_vlink_jtag_com_get()>>24); + return c; +} + +static ULONG VLC_getPT_L(void) +{ + ULONG c; + while((i_vlink_jtag_com_stat() & 1)==0){ + ; + } + c=i_vlink_jtag_com_get(); + return c; +} + +static UBYTE VLC_getSTAT11(void) +{ + return (i_vlink_jtag_com_stat11() & 0x40000000); +} + +static void VLC_putPT11(UBYTE c) +{ + while((i_vlink_jtag_com_stat11() & 0x20000000)!=0){ + ; + } + i_vlink_jtag_com_put11((ULONG)c); +} + +static int VLC_putCMD11(UBYTE data) +{ + VLC_putPT11(data); + return 0; +} + +static void VLC_putPT_L11(ULONG c) +{ + while((i_vlink_jtag_com_stat11() & 0x20000000)!=0){ + ; + } + i_vlink_jtag_com_put11(c); +} + + +static UBYTE VLC_getPT11(void) +{ + UBYTE c; + while((i_vlink_jtag_com_stat11() & 0x40000000)==0){ + ; + } + c=i_vlink_jtag_com_get11(); + return c; +} + +static ULONG VLC_getPT_L11(void) +{ + ULONG c; + while((i_vlink_jtag_com_stat11() & 0x40000000)==0){ + ; + } + c=i_vlink_jtag_com_get11(); + return c; +} + +#define VLC_BLK vlc_blk +#define EXT_CODE 0x12345678 +#define EOF_CODE 0x87654321 + +static void set_longp(void *p, ULONG dt) +{ + switch((ULONG)p&3) { + case 0: + *((ULONG *)p)= dt; + break; + case 2: + *((UWORD *)p)= dt; + dt >>= 16; + *((UWORD *)p+1)= dt; + break; + default: + *(UBYTE *)p=dt; + *((UBYTE *)p+1)=dt>>8; + *((UBYTE *)p+2)=dt>>16; + *((UBYTE *)p+3)=dt>>24; + } +} + +static void VLC_getPT_BLK(UBYTE *bufp,ULONG ct) +{ + ULONG data; + while(ct>=4){ + set_longp(bufp,getPT_L()); + bufp += 4; + ct -= 4; + } + if(ct!=0){ + data=getPT_L(); + do{ + *(bufp++)=(UBYTE)data; + data >>= 8; + }while(--ct) ; + } +} + + +static ULONG get_longp(void *p) +{ + ULONG dt; + + switch((ULONG)p&3) { + case 0: + dt= *((ULONG *)p) ; + break; + case 2: + dt=*((UWORD *)p+1); + dt<<=16; + dt|=*(UWORD *)(p); + break; + default: + dt=*((UBYTE *)p+3); + dt<<=8; + dt|=*((UBYTE *)p+2); + dt<<=8; + dt|=*((UBYTE *)p+1); + dt<<=8; + dt|=*(UBYTE *)p; + } + return dt; +} + +static void VLC_putPT_BLK(UBYTE *bufp,ULONG ct) +{ + ULONG data = 0; + + while(ct>=4){ + data = get_longp(bufp); + putPT_L(data); + bufp += 4; + ct -= 4; + } + if(ct!=0){ + do{ + data <<= 8; + --ct; + data |= *(bufp+ct); + }while(ct) ; + putPT_L(data); + } +} + + + + + +#if KMC_BUF /* { */ +static char *kmc_wp,*kmc_rp; +static char kmc_buffer[WDB_KMC_MTU]; +#endif /* } */ + +void i_vlink_et2_vlink_tbl(void) +{ + __et2_vlink_monadr=0; + __et2_vlink_monadr_h=0; + __et2_vlink_shift_l=0; + __et2_vlink_shift_r=0; + __et2_vlink_cmdwrs=0; + __et2_vlink_cmdrd=0; + __et2_vlink_stat=0; +} + +static void vlinkPutPTstring(char *p) +{ + char c; + + do{ + c=*(p++); + putPT(c); + } while (c!='\0') ; +} + + +#define putOSEMU(c) if(putCMD(c)) {VLINK_END;return -12345678;} + +int vlink_dos_put_console(char c) +{ + VLINK_START + putOSEMU(0); + getPT_sync(); + putPT_BLK((UBYTE*)&c,1); + putPT_flash(); + VLINK_END + return 0; +} + +int vlink_dos_putstring_console(char *str,int size) +{ + int len; + int ct; + int start; + + VLINK_START + start=1; + if(size==0){ + char *p; + p=str; + while(*p) ++p; + size=p-str; + } + len=size; + while(len){ + if(len>0x80){ + ct=0x80; + } + else{ + ct=len; + } + if(start){ + putOSEMU(ct-1); + start=0; + } + else{ + putPT(ct-1); + } + getPT_sync(); + putPT_BLK((UBYTE *)str,ct); + len -= ct; + str += ct; + } + putPT_flash(); + VLINK_END + return size; +} + + +int vlink_dos_stat_console(void) +{ + char c; + + VLINK_START + putOSEMU(0x80); + c=getPT(); + VLINK_END + if(c=='\x1b'){ + int i; + for(i=0;i<1000000;++i) ; + c=0; + } + return c; +} + +int vlink_dos_get_console(void) +{ + char c; + + VLINK_START + while((c=vlink_dos_stat_console())=='\0') ; + VLINK_END + return c; +} + + +int vlink_dos_open(char *fname,int mode) +{ + int fd; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_OPEN); + vlinkPutPTstring(fname); + putPT(mode); + fd=getPT(); + if(fd==0xff){ + vlink_dos_errno=getPT(); + fd=-1; + } + VLINK_END + return fd; +} + +int vlink_dos_creat(char *fname,int mode) +{ + int fd; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_CREAT); + vlinkPutPTstring(fname); + putPT(mode); + fd=getPT(); + if(fd==0xff){ + vlink_dos_errno=getPT(); + fd=-1; + } + VLINK_END + return fd; +} + +int vlink_dos_read(int fd,char *buf,int size) +{ + int rval; + + if(fd==0){ /* CON IN ? */ + if(size<0) return 0; + VLINK_START + *buf = vlink_dos_get_console(); + vlink_dos_write(1,buf,1); + if(*buf=='\r'){ +// *buf = 0; /* END */ + vlink_dos_write(1,"\n",1); + } + VLINK_END + return 1; + } + if(size<0) return -1; + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_READ); + putPT(fd); + putPT_L(size); + getPT_BLK((UBYTE *)buf,size); + putPT_sync(0); + rval=getPT_L(); + if(rval==-1){ + vlink_dos_errno=getPT(); + } + VLINK_END + return rval; +} + +int vlink_dos_write(int fd,char *buf,int size) +{ + int rval; + + if(size<0) return -1; + if(fd==1 || fd==2){ /* CON OUT ? */ + return vlink_dos_putstring_console(buf,size); + } + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_WRITE); + putPT(fd); + putPT_L(size); + putPT_BLK((UBYTE *)buf,size); + rval=getPT_L(); + if(rval==-1){ + vlink_dos_errno=getPT(); + } + VLINK_END + return rval; +} + +int vlink_dos_close(int fd) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_CLOSE); + putPT(fd); + rval=0; + if(getPT()!=0){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_lseek(int fd,int ofs,int pos) +{ + int ret_pos; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_LSEEK); + putPT(fd); + putPT_L(ofs); + putPT(pos); + if((ret_pos=getPT_L())==-1){ + vlink_dos_errno=getPT(); + } + VLINK_END + return ret_pos; +} + +int vlink_dos_file_mode(char *fname,int mode,int action) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_FILE_MODE); + vlinkPutPTstring(fname); + putPT_L(mode); + putPT(action); + if((mode=getPT_L())==-1){ + vlink_dos_errno=getPT(); + } + VLINK_END + return mode; +} + +int vlink_dos_set_dta(struct ffblk *fbp) +{ + ffblkp=fbp; + return 0; +} + + +int vlink_dos_find_first(char *fname,unsigned attrib) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_FIND_FIRST); + vlinkPutPTstring(fname); + rval=0; + if(getPT()!=0){ + rval=-1; + goto ret; + } + getPT_BLK((UBYTE *)ffblkp,sizeof(struct ffblk)); +ret: + VLINK_END + return rval; +} + +int vlink_dos_find_next(void) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_FIND_NEXT); + rval=0; + if(getPT()!=0){ + rval=-1; + goto ret; + } + getPT_BLK((UBYTE *)ffblkp,sizeof(struct ffblk)); +ret: + VLINK_END + return rval; +} + +int vlink_dos_find_close(void) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_FIND_CLOSE); + putPT_flash(); + VLINK_END + return 0; +} + +int vlink_dos_get_ioctl(int fd) +{ + int rval; + + if(fd==1){ /* CON OUT ? */ + return 0x80; + } + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_GET_IOCTL); + putPT(fd); + if((rval=getPT())==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_get_file_time(int fd,unsigned short *timep) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_GET_FILE_TM); + putPT(fd); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + else{ + *timep=(unsigned short)getPT_L(); + *(timep+1)=(unsigned short)getPT_L(); + } + VLINK_END + return rval; +} + +int vlink_dos_get_time(Vlink_dos_time *dtp) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_GET_TIME); + getPT_BLK((UBYTE *)dtp,sizeof(Vlink_dos_time)); + VLINK_END + return 0; +} + + +int vlink_dos_set_file_time(int fd,unsigned short *timep) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_SET_FILE_TM); + putPT(fd); + putPT_L(*timep); + putPT_L(*(timep+1)); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_mkdir(char *path) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_MKDIR); + vlinkPutPTstring(path); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_rmdir(char *path) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_RMDIR); + vlinkPutPTstring(path); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_remove(char *fname) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_REMOVE); + vlinkPutPTstring(fname); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_rename(char *old,char *new) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_RENAME); + vlinkPutPTstring(old); + vlinkPutPTstring(new); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + + +int vlink_dos_getcwd(char *path,int drvno) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_GETCWD); + putPT(drvno); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + else{ + do{ + *path=getPT(); + }while(*(path++)!='\0') ; + } + VLINK_END + return rval; +} + +int vlink_dos_chdir(char *path) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_CHDIR); + vlinkPutPTstring(path); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_getcdrv(void) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_GETCDRV); + rval=getPT(); + VLINK_END + return rval; +} + +int vlink_dos_dup(int fd) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_DUP); + putPT(fd); + if((fd=getPT())==0xff){ + vlink_dos_errno=getPT(); + fd=-1; + } + VLINK_END + return fd; +} + +int vlink_dos_dup2(int oldfd,int newfd) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_DUP2); + putPT(oldfd); + putPT(newfd); + rval=0; + if(getPT()==0xff){ + vlink_dos_errno=getPT(); + rval=-1; + } + VLINK_END + return rval; +} + +int vlink_dos_version(void) +{ + int rval; + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_VERSION); + rval=getPT_L(); + VLINK_END + return rval; +} + +int vlink_dos_exit(int retcode) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_EXIT); + putPT_L(retcode); + putPT_flash(); + VLINK_END + for(;;) ; +} + +int vlink_dos_sleep(int ms) +{ + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_SLEEP); + putPT_L(ms); + getPT(); + VLINK_END + return 0; +} +/* +int vlink_dos_arg_env(void) +{ + int arg_size; + int env_size; + char *malloc(); + + VLINK_START + putOSEMU(OSEMU); + putPT(EMU_ARG_ENV); + arg_size=getPT_L(); + env_size=getPT_L(); + vlink_dos_arg=malloc(arg_size+1); + vlink_dos_env=malloc(env_size+1); + getPT_BLK((UBYTE *)_dos_arg,arg_size); + putPT_sync(0); + getPT_BLK((UBYTE *)_dos_env,env_size); + *(_dos_arg+arg_size)='\0'; + *(_dos_env+env_size)='\0'; + VLINK_END + return 0; +} +*/ + + +#define READ_VIO 0 +#define WRITE_VIO 1 + +int vlinkRead_VIO_pt(void *dramAddr, int nbytes) +{ + int size; + + if(nbytes<=0) return nbytes; + VLINK_START + if(vlink_sync_stat==1){ + size=getPT_L(); + if(size>nbytes){ + nbytes=0; + goto ret; + } + nbytes=size; + } + else{ + putPT(0x82); + putPT(READ_VIO); + putPT_L(nbytes); + } + getPT_BLK((UBYTE *)dramAddr,nbytes); +ret: + VLINK_END + return nbytes; +} + +int vlinkWrite_VIO_pt(void *dramAddr,int nbytes) +{ + if(nbytes<=0) return nbytes; + VLINK_START + if(vlink_sync_stat!=1){ + putPT(0x82); + putPT(WRITE_VIO); + } + putPT_L(nbytes); + if(vlink_sync_stat==2){ + getPT(); + } + + putPT_BLK((UBYTE *)dramAddr,nbytes); + putPT_flash(); + VLINK_END + return nbytes; +} + +int i_vlink_init_osemu(void) +{ + int rval; + //ULONG *vtbl; + //char *malloc(); + +// vlinkInit(); // add by yutaka + + VLINK_START + rval=0; + + if((i_vlink_jtag_cpuid() & 0x000f0000)>=0x00070000){ /* ARM11 */ + putCMD=vlink_not_use_osemu ? putCMD_not_use:VLC_putCMD11; + putPT=VLC_putPT11; + getPT=VLC_getPT11; + putPT_L=VLC_putPT_L11; + getPT_L=VLC_getPT_L11; + getSTAT=VLC_getSTAT11; + } + else { + putCMD=vlink_not_use_osemu ? putCMD_not_use:VLC_putCMD; + putPT=VLC_putPT; + getPT=VLC_getPT; + putPT_L=VLC_putPT_L; + getPT_L=VLC_getPT_L; + getSTAT=VLC_getSTAT; + } + getPT_BLK=VLC_getPT_BLK; + putPT_BLK=VLC_putPT_BLK; + if(getSTAT()){ + getPT(); + } + //arm_loop_max=1000; + rval=2; + + VLINK_END + return rval; +} + +static int putCMD_init(UBYTE c) +{ + i_vlink_init_osemu(); + return putCMD(c); +} + +static int putCMD_not_use(UBYTE c) +{ + return 1; +} + +static int not_use_vlink(void) +{ + return 0; +} diff --git a/trunk/bootrom/include/brom/os.h b/trunk/bootrom/include/brom/os.h index 548a127..b3ce2d4 100644 --- a/trunk/bootrom/include/brom/os.h +++ b/trunk/bootrom/include/brom/os.h @@ -39,9 +39,9 @@ extern "C" { #include #include #include +#include #if 0 #include -#include #include #include #include @@ -49,11 +49,14 @@ extern "C" { #ifdef SDK_ARM9 #include #include -#include #include #endif // SDK_ARM9 #endif +#ifdef SDK_DEBUGGER_KMC +#include +#endif // SDK_DEBUGGER_KMC + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/trunk/bootrom/include/brom/os/common/printf.h b/trunk/bootrom/include/brom/os/common/printf.h new file mode 100644 index 0000000..1e3d4ac --- /dev/null +++ b/trunk/bootrom/include/brom/os/common/printf.h @@ -0,0 +1,91 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - OS - incldue + File: printf.h + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ +#ifndef BROM_OS_COMMON_PRINTF_H_ +#define BROM_OS_COMMON_PRINTF_H_ + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Prototypes +// +#ifndef SDK_FINALROM +//void osPutString(const char *str); +extern void (*osPutString) (const char *str); +#else +#define osPutString(x) ((void)0) +#endif + +int osSPrintf(char *dst, const char *fmt, ...); +int osVSPrintf(char *dst, const char *fmt, va_list vlist); +int osSNPrintf(char *dst, size_t len, const char *fmt, ...); +int osVSNPrintf(char *dst, size_t len, const char *fmt, va_list vlist); + +#ifndef SDK_FINALROM +void osPutChar(char c); +void osVPrintf(const char *fmt, va_list vlist); +void osTVPrintf(const char *fmt, va_list vlist); +void osPrintf(const char *fmt, ...); +void osTPrintf(const char *fmt, ...); +#ifndef SDK_NO_MESSAGE +void i_osWarning(const char *file, int line, const char *fmt, ...); +void i_osTWarning(const char *file, int line, const char *fmt, ...); +void i_osPanic(const char *file, int line, const char *fmt, ...); +void i_osTPanic(const char *file, int line, const char *fmt, ...); +#else +void osTerminate(); +#define i_osWarning( file, line, ... ) ((void)0) +#define i_osTWarning( file, line, ... ) ((void)0) +#define i_osPanic( file, line, ... ) osTerminate() +#define i_osTPanic( file, line, ... ) osTerminate() +#endif + +#define osWarning( ... ) i_osWarning( __FILE__, __LINE__, __VA_ARGS__ ); +#define osPanic( ... ) i_osPanic( __FILE__, __LINE__, __VA_ARGS__ ); +#define osTWarning( ... ) i_osTWarning( __FILE__, __LINE__, __VA_ARGS__ ); +#define osTPanic( ... ) i_osTPanic( __FILE__, __LINE__, __VA_ARGS__ ); + +#else +//---- invalidate debug functions when FINALROM +#define osPutChar( ... ) ((void)0) +#define osVPrintf( fmt, ... ) ((void)0) +#define osPrintf( ... ) ((void)0) +#define i_osWarning( file, line, ... ) ((void)0) +#define i_osPanic( file, line, ... ) osTerminate() +#define osWarning( ... ) ((void)0) +#define osPanic( ... ) osTerminate() + +#define osTVPrintf( fmt, ... ) ((void)0) +#define osTPrintf( ... ) ((void)0) +#define i_osTWarning( file, line, ... ) ((void)0) +#define i_osTPanic( file, line, ... ) osTerminate() +#define osTWarning( ... ) ((void)0) +#define osTPanic( ... ) osTerminate() +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* BROM_OS_COMMON_PRINTF_H_ */ +#endif diff --git a/trunk/bootrom/include/brom/vlink.h b/trunk/bootrom/include/brom/vlink.h new file mode 100644 index 0000000..7ec9162 --- /dev/null +++ b/trunk/bootrom/include/brom/vlink.h @@ -0,0 +1,86 @@ +#ifndef TWL_VLINK_H_ +#define TWL_VLINK_H_ + +#ifndef _IOREAD +#define _IOREAD 0x01 +#define _IOWRITE 0x02 +#define _IORW 0x04 +#define _IOEOF 0x08 +#define _IOFLUSH 0x10 +#define _IOERR 0x20 +#define _IOSTRING 0x40 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void vlinkInit(void); + +struct ffblk { + char ff_reserved[23]; + char ff_attrib; + unsigned short ff_ftime; + unsigned short ff_fdate; + struct { + unsigned short low,high; + } ff_fsize; + char ff_name[255+1]; +}; + +typedef struct { +unsigned year; +unsigned mon; +unsigned day; +unsigned hour; +unsigned min; +unsigned sec; +unsigned msec; +} Vlink_dos_time; + +int vlink_dos_put_console(char c); +int vlink_dos_putstring_console(char *str,int size); +int vlink_dos_stat_console(void); +int vlink_dos_get_console(void); +int vlink_dos_open(char *fname,int mode); +int vlink_dos_creat(char *fname,int mode); +int vlink_dos_read(int fd,char *buf,int size); +int vlink_dos_write(int fd,char *buf,int size); +int vlink_dos_close(int fd); +int vlink_dos_lseek(int fd,int ofs,int pos); +int vlink_dos_file_mode(char *fname,int mode,int action); +int vlink_dos_set_dta(struct ffblk *fbp); +int vlink_dos_find_first(char *fname,unsigned attrib); +int vlink_dos_find_next(void); +int vlink_dos_find_close(void); +int vlink_dos_get_ioctl(int fd); +int vlink_dos_get_file_time(int fd,unsigned short *timep); +int vlink_dos_get_time(Vlink_dos_time *dtp); +int vlink_dos_set_file_time(int fd,unsigned short *timep); +int vlink_dos_mkdir(char *path); +int vlink_dos_rmdir(char *path); +int vlink_dos_remove(char *fname); +int vlink_dos_rename(char *old,char *new); +int vlink_dos_getcwd(char *path,int drvno); +int vlink_dos_chdir(char *path); +int vlink_dos_getcdrv(void); +int vlink_dos_dup(int fd); +int vlink_dos_dup2(int oldfd,int newfd); +int vlink_dos_version(void); +int vlink_dos_exit(int retcode); +int vlink_dos_sleep(int ms); + +int vlinkRead_VIO_pt(void *dramAddr, int nbytes); +int vlinkWrite_VIO_pt(void *dramAddr,int nbytes); + +int i_vlink_init_osemu(void); + +void vlink_dos_printf(const char *text, ...); +void vlink_dos_fprintf(int fd, const char *text, ...); + + +#ifdef __cplusplus +} +#endif + +#endif // TWL_VLINK_H_ diff --git a/trunk/build/buildtools/commondefs b/trunk/build/buildtools/commondefs index 629f9f6..68f8f9d 100644 --- a/trunk/build/buildtools/commondefs +++ b/trunk/build/buildtools/commondefs @@ -117,6 +117,18 @@ CTR_BUILD_DIR ?= Release endif endif +# +# Debugger Type +# +# one of [ARM/KMC] +# + +ifeq ($(CTR_PLATFORM),MG20EMU) +CTR_DEBUGGER ?= KMC +endif +CTR_DEBUGGER ?= ARM + + #---------------------------------------------------------------- # @@ -632,6 +644,12 @@ CTR_INSTALL_ADDINS := $(CTR_INSTALL_ROOT)/add-ins -include $(CTR_BUILDTOOLSDIR)/@privatedefs +#---------------------------------------------------------------------------- +# Compiler flags +# +MACRO_FLAGS += -DSDK_DEBUGGER_$(CTR_DEBUGGER) + + #---------------------------------------------------------------------------- # Load add-ins' commondefs # diff --git a/trunk/include/ctr/hw/common/arm_reg_common.h b/trunk/include/ctr/hw/common/arm_reg_common.h index 6b048ea..34ebe3d 100644 --- a/trunk/include/ctr/hw/common/arm_reg_common.h +++ b/trunk/include/ctr/hw/common/arm_reg_common.h @@ -43,8 +43,7 @@ extern "C" { #define HW_PSR_IRQ_DISABLE 0x80 // IRQ Disable #define HW_PSR_IRQ_FIQ_DISABLE 0xc0 // IRQ & FIQ Disable -#ifdef SDK_ARM9 -#else // SDK_ARM11 +#ifdef SDK_ARM11 #define HW_PSR_IMPRECISE_ABORT 0x00000100 // Imprecise Abort #define HW_PSR_DATA_LITTLE_ENDIAN 0x00000000 // Data Little Endian