1#!/bin/sh
2###############################################################################
3#
4# Copyright (C) 2009-2014 Nintendo.  All rights reserved.
5#
6# These coded instructions, statements, and computer programs contain
7# proprietary information of Nintendo of America Inc. and/or Nintendo
8# Company Ltd., and are protected by Federal copyright law.  They may
9# not be disclosed to third parties or copied or duplicated in any form,
10# in whole or in part, without the prior written consent of Nintendo.
11#
12###############################################################################
13
14MULTI_ARG="core"
15MAKECORE_DIR=.
16DBG_SRC_ROOT=$CAFE_ROOT/system/
17
18DO_MAKECORE=1
19LAUNCH_MULTI=1
20DISPLAY_HELP=0
21ERROR=0
22
23MIN_VER0=5
24MIN_VER1=3
25MIN_VER2=21
26MIN_VER="$MIN_VER0.$MIN_VER1.$MIN_VER2"
27PATCH="Core0 BETA"
28VER_TOO_OLD=0
29
30if [ -z $GHS_ROOT ] ; then
31    echo "Error: GHS_ROOT not defined. Exiting viewcore"
32    exit 1
33fi
34
35MULTI_DOS_PATH=`cygpath -d $GHS_ROOT/multi.exe`
36VERSION=`$GHS_ROOT/gversion -quiet $MULTI_DOS_PATH | cut -d',' -f 2`
37VER0=${VERSION:8:1}
38VER1=${VERSION:10:1}
39VER2=${VERSION:12:2}
40CORE=${VERSION:24:4}
41CORENUM=${VERSION:28:1}
42BETA=${VERSION:30:4}
43
44if [ $VER0 -lt 5 ] ; then
45    VER_TOO_OLD=1
46fi
47if [ $VER1 -lt 3 ] ; then
48    VER_TOO_OLD=1
49fi
50if [ $VER2 -lt 21 ] ; then
51    VER_TOO_OLD=1
52fi
53if [ $VER2 -eq 21 ] ; then
54
55    if [ "$CORE" != "Core" ] ; then
56        VER_TOO_OLD=1
57        CORE=""
58        CORENUM=""
59    else
60        if [ "$CORENUM" -lt 0 ] ; then
61            VER_TOO_OLD=1
62        fi
63    fi
64
65    if [ "$BETA" != "BETA" ] ; then
66        VER_TOO_OLD=1
67        BETA=""
68    fi
69fi
70if [ $VER2 -ge 22 ] ; then
71    if [ "$CORE" != "Core" ] ; then
72        CORE=""
73        CORENUM=""
74    fi
75
76    if [ "$BETA" != "BETA" ] ; then
77        BETA=""
78    fi
79fi
80
81if [ $VER_TOO_OLD -eq 1 ] ; then
82    echo "Error: MULTI version $MIN_VER $PATCH or later is needed. Current Version is $VER0.$VER1.$VER2 $CORE$CORENUM $BETA"
83    exit 1
84fi
85
86while [ $# -ge 1 ]; do
87    case $1 in
88        -o)     shift;  MULTI_ARG=$1 ;;
89        -i)     shift;  DO_MAKECORE=0;  MULTI_ARG=$1;;
90        -d)     shift;  DBG_SRC_ROOT=$1 ;;
91        -a)     DBG_SRC_ROOT="" ;;
92        -x)     AGE_OLD_DUMPS=1;;
93        -h)     DISPLAY_HELP=1; DO_MAKECORE=0; LAUNCH_MULTI=0;;
94        -help)  DISPLAY_HELP=1; DO_MAKECORE=0; LAUNCH_MULTI=0;;
95        -*)     echo "Error: $1 unrecognized options"; DISPLAY_HELP=1; DO_MAKECORE=0; LAUNCH_MULTI=0; ERROR=1;;
96        *)      MAKECORE_DIR=$1;;
97    esac
98    shift
99done
100
101if [ -n "$AGE_OLD_DUMPS" ] ; then
102    if [ ${CAFE_CRASH_DUMP_LIMIT:=5} -gt 0 ] ; then
103        for old_dump in `ls -1rt ${MAKECORE_DIR}/.. | head -n -${CAFE_CRASH_DUMP_LIMIT}`; do
104            rm -r ${MAKECORE_DIR}/../$old_dump
105        done
106    fi
107fi
108
109if [ $DO_MAKECORE -ne 0 ]; then
110    if [ -n "${CAFE_CRASH_DUMP_NOMULTI}" ] ; then
111        if [ ${CAFE_CRASH_DUMP_NOMULTI} -ne 0 ] ; then
112            echo "Making a core dump file, but NOT automatically launching GHS MULTI!"
113            LAUNCH_MULTI=0
114        fi
115    fi
116fi
117
118if [ -z "$DBG_SRC_ROOT" ] ; then
119    echo "Message: Use absolute path for all rpl"
120else
121    DBG_SRC_ROOT_DOS_PATH=`cygpath -d $DBG_SRC_ROOT`
122    DBG_SRC_ROOT="-d $DBG_SRC_ROOT_DOS_PATH"
123fi
124
125MAKECORE_ARG=`find $MAKECORE_DIR -maxdepth 1 -name "BLK*_A*_SZ*.bin"`
126MAKECORE_ARG=`cygpath -m $MAKECORE_ARG 2>/dev/null`
127
128if [ $DO_MAKECORE -eq 1 ] ; then
129    if [ -z "$MAKECORE_ARG" ] ; then
130	    echo "Error: No memory blocks found in $MAKECORE_DIR. Exiting viewcore." 1>&2
131	    DISPLAY_HELP=1
132	    ERROR=1
133	else
134        if [ -z "$MULTI_ARG" ] ; then
135            echo "Error: missing argument with option -o. Exiting viewcore." 1>&2
136            DISPLAY_HELP=1
137            ERROR=1
138        else
139            echo "Running makecore to process the following memory blocks:"
140            echo "$MAKECORE_ARG"
141            if makecore $MAKECORE_ARG -o $MULTI_ARG $DBG_SRC_ROOT; then
142                if [ ! $LAUNCH_MULTI == 0 ]; then
143                    echo "MULTI v$VER0.$VER1.$VER2 $CORE$CORENUM $BETA is launching $MULTI_ARG" 1>&2
144                    MULTI_ARG_DOS_PATH=`cygpath -d $MULTI_ARG`
145                    $GHS_ROOT/multi $MULTI_ARG_DOS_PATH
146                fi
147            else
148	            echo "Error: MULTI v$VER0.$VER1.$VER2 $CORE$CORENUM $BETA is not launched due to makecore error." 1>&2
149                DISPLAY_HELP=1
150	            ERROR=1
151	        fi
152	    fi
153    fi
154else
155    if [ $LAUNCH_MULTI -eq 1 ] ; then
156        if [ -z "$MULTI_ARG" ] ; then
157            echo "Error: missing argument with option -i. Exiting viewcore."
158            DISPLAY_HELP=1
159            ERROR=1
160        else
161            MULTI_ARG_COPY=$MULTI_ARG
162            MULTI_ARG_DOS_PATH=`cygpath -d $MULTI_ARG`
163            MULTI_ARG=`find $MULTI_ARG_DOS_PATH -maxdepth 0 -type f`
164            if [ -z "$MULTI_ARG" ] ; then
165                echo "Error: $MULTI_ARG_COPY not found, or is a directory. Exiting viewcore."
166                DISPLAY_HELP=1
167                ERROR=1
168            else
169                echo "MULTI v$VER0.$VER1.$VER2 $CORE$CORENUM $BETA is launching $MULTI_ARG" 1>&2
170                $GHS_ROOT/multi $MULTI_ARG_DOS_PATH
171            fi
172        fi
173    fi
174fi
175
176if [ $DISPLAY_HELP -eq 1 ]; then
177    echo ""
178    echo "viewcore"
179    echo "    Usage: viewcore [-o <file>] [-i <file>] [-d <dir>] [-a] [-h<elp>] [<directory>]"
180    echo "    Options:"
181    echo "      -o <file>    Specify output core dump file name. If unspecified,"
182    echo "                   \"core\" is used."
183    echo "      -i <file>    View core dump file \"file\". No memory"
184    echo "                   block files will be processed"
185    echo "      -d <dir>     Debug source root \"dir\". If unspecified,"
186    echo "                   \"$CAFE_ROOT/system\" is used"
187    echo "      -a           Treat path info stored in RPLs as absolute path.
188                             Use this option to process and view RPLs built
189                             before SDK2.11.02. "
190    echo "      -h<elp>      Print this menu"
191    echo "      <directory>  Look for memory block files in <directory> to be parsed"
192    echo "                   If unspecified, current working directory is used."
193fi
194
195if [ $ERROR -eq 1 ]; then
196    exit 1
197else
198    exit 0
199fi