@echo off :: ############################################################################### :: # :: # Copyright (C) 2009-2014 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.:::: :: # :: ############################################################################### set MULTI_ARG=core set MAKECORE_DIR=. set DBG_SRC_ROOT=%CAFE_ROOT%\system set DO_MAKECORE=1 set LAUNCH_MULTI=1 set DISPLAY_HELP=0 set MIN_VER0=5 set MIN_VER1=3 set MIN_VER2=21 set MIN_VER="%MIN_VER0.%MIN_VER1.%MIN_VER" set PATCH="Core0 BETA" set VER_TOO_OLD=0 if "%GHS_ROOT%" EQU "" ( echo Error: GHS_ROOT not defined. Exiting viewcore ) ::::: Check GHS version; should be newer than 5.3.21 Core0 BETA. ::::: If it's 5.3.22 or newer, doesn't have to check the patch name. for /f "usebackq tokens=7,8,9,11,12 delims=. " %%a in (`%GHS_ROOT%\gversion -quiet %GHS_ROOT%\multi.exe`) do ( if "%%a" EQU "v5" ( set VER0=%%a set VER1=%%b set VER2=%%c set CORE=%%d set BETA=%%e ) ) if %VER0% NEQ "v5" ( set VER_TOO_OLD=1 ) if %VER1% LSS 3 ( set VER_TOO_OLD=1 ) if %VER2% LSS 21 ( set VER_TOO_OLD=1 ) if %VER2% EQU 21 ( if "%CORE%" NEQ "Core0" ( set VER_TOO_OLD=1 set CORE="" ) if "%BETA%" NEQ "BETA" ( set VER_TOO_OLD=1 set BETA="" ) ) if %VER2% GEQ 22 ( if "%CORE%" NEQ "Core0" ( set CORE="" ) if "%BETA%" NEQ "BETA" ( set BETA="" ) ) if %CORE% EQU "" ( set CURRENT_VERSION=%VER0%.%VER1%.%VER2% ) if %CORE% NEQ "" ( if %BETA% EQU "" ( set CURRENT_VERSION=%VER0%.%VER1%.%VER2% %CORE% ) if %BETA% NEQ "" ( set CURRENT_VERSION=%VER0%.%VER1%.%VER2% %CORE% %BETA% ) ) if %VER_TOO_OLD EQU 1 ( echo Error: MULTI version %MIN_VER% %PATCH% or later is needed. Current Version is %CURRENT_VERSION% ) ::::: Get viewcore options :LOOP if "%~1" EQU "" goto CONTINUE if "%~1" EQU "-o" ( shift set MULTI_ARG="%~2" shift goto LOOP ) if "%~1" EQU "-i" ( shift set DO_MAKECORE=0 set MULTI_ARG="%~2" shift goto LOOP ) if "%~1" EQU "-d" ( shift set DBG_SRC_ROOT="%~2" shift goto LOOP ) if "%~1" EQU "-a" ( set DBG_SRC_ROOT="" shift goto LOOP ) if "%~1" EQU "-x" ( set AGE_OLD_DUMPS=1 shift goto LOOP ) if "%~1" EQU "-h" ( set DISPLAY_HELP=1 set DO_MAKECORE=0 set LAUNCH_MULTI=0 shift goto LOOP ) if "%~1" EQU "-help" ( set DISPLAY_HELP=1 set DO_MAKECORE=0 set LAUNCH_MULTI=0 shift goto LOOP ) if "%~1" EQU "-*" ( echo Error: $1 unrecognized options set DISPLAY_HELP=1 set DO_MAKECORE=0 set LAUNCH_MULTI=0 shift goto LOOP ) set MAKECORE_DIR="%~1" shift goto LOOP :CONTINUE ::::: Get all the memory blocks in current directory, or user specified directory :::: Automatically age old dump logs if "%AGE_OLD_DUMPS%" EQU "" goto :age_done if "%CAFE_CRASH_DUMP_LIMIT%" == "" set CAFE_CRASH_DUMP_LIMIT=5 set /a CAFE_CRASH_DUMP_LIMIT=CAFE_CRASH_DUMP_LIMIT + 0 if %CAFE_CRASH_DUMP_LIMIT% LEQ 0 goto :age_done set /a NUM_OLD_DUMPS = 0 for /f %%i in ('dir /o-d/b %MAKECORE_DIR%\..') do call :age_dump %%i goto :age_done :age_dump set /a NUM_OLD_DUMPS = NUM_OLD_DUMPS + 1 if %NUM_OLD_DUMPS% GTR %CAFE_CRASH_DUMP_LIMIT% rd /s/q %MAKECORE_DIR%\..\%1 goto :eof :age_done if %DO_MAKECORE% EQU 0 goto :nomulti_done if "%CAFE_CRASH_DUMP_NOMULTI%" == "" goto :nomulti_done if %CAFE_CRASH_DUMP_NOMULTI% EQU 0 goto :nomulti_done echo Making a core dump file, but NOT automatically launching GHS MULTI! set LAUNCH_MULTI=0 :nomulti_done if "%DBG_SRC_ROOT%" EQU "" ( echo Message: Use absolute path for all rpl ) if "%DBG_SRC_ROOT%" NEQ "" ( set DBG_SRC_ROOT=-d %DBG_SRC_ROOT% ) set "MAKECORE_ARG=" setLocal Enabledelayedexpansion for /f "usebackq" %%i in (`dir %MAKECORE_DIR%\BLK* /B 2^>nul`) do ( set "MAKECORE_ARG=%MAKECORE_DIR%\%%i !MAKECORE_ARG!" ) setlocal disabledelayedexpansion ::::: Remove "free " string in %MAKECORE_ARG% set MAKECORE_ARG=%MAKECORE_ARG:free =% ::::: Call makecore if %DO_MAKECORE% EQU 1 ( ::::: Specified directory doesn't have memory blocks if "%MAKECORE_ARG%" EQU "" ( echo Error: No memory blocks found in %MAKECORE_DIR. Exiting viewcore. 1>&2 set DISPLAY_HELP=1 ) if "%MAKECORE_ARG%" NEQ "" ( ::::: -o option is used without specified core dump name if %MULTI_ARG% EQU "" ( echo Error: missing argument with option -o. Exiting viewcore. 1>&2 set DISPLAY_HELP=1 ) ::::: makecore processes the memory blocks if %MULTI_ARG% NEQ "" ( echo Running makecore to process the following memory blocks: for %%x in (%MAKECORE_ARG%) do echo %%x makecore %MAKECORE_ARG% -o %MULTI_ARG% %DBG_SRC_ROOT% if ERRORLEVEL 0 ( if %LAUNCH_MULTI% NEQ 0 ( echo MULTI %CURRENT_VERSION% is launching %MULTI_ARG% 1>&2 %GHS_ROOT%\multi.exe %MULTI_ARG% ) goto END ) ::::: makecore returns non-zero echo Error: MULTI %CURRENT_VERSION% is not launched due to makecore error. 1>&2 set DISPLAY_HELP=1 ) ) ) ::::: Only view core dump file, does not call makecore if %DO_MAKECORE% NEQ 1 ( if %LAUNCH_MULTI% EQU 1 ( ::::: -i option is used without specified core dump file if %MULTI_ARG% EQU "" ( echo Error: missing argument with option -i. Exiting viewcore. set DISPLAY_HELP=1 goto HELP_MENU ) ::::: Test if the specified core dump file exist if %MULTI_ARG% NEQ "" ( for /f "usebackq" %%i in (`dir /b /a-d %MULTI_ARG%`) do ( echo.%MULTI_ARG% | findstr /C:"%%i" ::::: Specified core dump file is a directory or does not exist if ERRORLEVEL 1 ( echo Error: %MULTI_ARG% not found, or is a directory. Exiting viewcore. set DISPLAY_HELP=1 goto HELP_MENU ) ::::: Specified core dump file exists, call MULTI if ERRORLEVEL 0 ( echo MULTI %CURRENT_VERSION% is launching %MULTI_ARG% 1>&2 %GHS_ROOT%\multi.exe %MULTI_ARG% ) ) ) ) ) :HELP_MENU if %DISPLAY_HELP% EQU 1 ( echo. echo viewcore.bat echo Usage: viewcore.bat [-o ^] [-i ^] [-d ^] [-a] [-h^] [^] echo Options: echo -o ^ Specify output core dump file name. If unspecified, echo "core" is used. echo -i ^ View core dump file "file". No memory echo block files will be processed echo -d ^ Debug source root "dir". If unspecified, echo "%CAFE_ROOT%\system" is used echo -a Treat path info stored in RPLs as absolute path. echo Use this option to process and view RPLs built echo before SDK2.11.02 echo -h^ Print this menu echo ^ Look for memory block files in ^ to be parsed echo If unspecified, current working directory is used. ) :END