1@if "%_ECHOON%" == "" echo off
2
3:: ###############################################################################
4:: #
5:: # Copyright (C) 2009-2013 Nintendo.  All rights reserved.
6:: #
7:: # These coded instructions, statements, and computer programs contain
8:: # proprietary information of Nintendo of America Inc. and/or Nintendo
9:: # Company Ltd., and are protected by Federal copyright law.  They may
10:: # not be disclosed to third parties or copied or duplicated in any form,
11:: # in whole or in part, without the prior written consent of Nintendo.::::
12:: #
13:: ###############################################################################
14
15:: ************************************************************
16:: * CAFE - Environment
17:: ************************************************************
18
19:: From here, variable changes to do not affect environment (unless that's what was asked)
20for %%i in (%*) do if /i "%%~i" == "-setenv" goto :DONT_SETLOCAL
21SETLOCAL
22:DONT_SETLOCAL
23
24if NOT  DEFINED USE_EXI_AS_DEBUG_CHANNEL  (
25    set  USE_EXI_AS_DEBUG_CHANNEL=1
26)
27
28:: Default location of CAFE_ROOT (location of cafe.bat)
29set CAFE_ROOT_DOS=%~dp0
30if NOT "%CAFE_ROOT_DOS:~-2%" == ":\" set CAFE_ROOT_DOS=%CAFE_ROOT_DOS:~0,-1%
31REM if NOT "%CAFE_ROOT%" == "" for %%i in (%CAFE_ROOT%) do set CAFE_ROOT_DOS=%%~fi
32
33REM ***
34REM Set options
35
36REM Anything pre-set in the environment takes
37REM effect, unless overriden by commandline options.
38    if "%USE_MULTI%" == "1" set SESSION_MANAGER=1&& REM Another name for this option
39
40REM Commandline (per-invocation) options.  Takes precedence.
41    if "%~1" == "" goto :getopt_done
42    set _CMDLINE=%*
43    set CAFE_SHELL_ARGS=
44
45    REM make sure we don't misinterpret any metacharacters
46    set _CMDLINE=%_CMDLINE:&=$amper$%
47    set _CMDLINE=%_CMDLINE:|=$pipebar$%
48    set _CMDLINE=%_CMDLINE:>=$gtrthan$%
49    set _CMDLINE=%_CMDLINE:<=$lessthan$%
50    setlocal enabledelayedexpansion && REM hackery for percent signs
51    set _CMDLINE=!_CMDLINE:%%=$percent$!
52    endlocal && set _CMDLINE=%_CMDLINE%
53    set _CMDLINE=%_CMDLINE:"=$quote$%
54
55    call :getopt_loop %_CMDLINE%
56    set _CMDLINE=
57    REM Aborting because of _USAGE?
58    if not "%_USAGE%" == "" set _USAGE=&& goto :END
59    goto :getopt_done
60
61    :getopt_loop
62    if "%~1" == "" goto :eof
63    REM Keep processing arguments progressively
64    for /f "tokens=1,*" %%i in ("%*") do call :getopt %%~i&call :getopt_loop %%~j
65    goto :eof
66
67    :getopt
68    set _ARG=%*
69    if not defined _ARG goto :getopt_done
70
71    for %%i in (-h -help --help) do if "%_ARG:$quote$=%" == "%%i" goto :usage
72    if "%_ARG:$quote$=%" == "-?" goto :usage && REM "-?" doesn't work in "for" loop 8-(
73
74    if /i "%_ARG:$quote$=%" == "-default" set _SETDEFAULTS=1&& goto :getopt_next
75    if /i "%_ARG:$quote$=%" == "-setenv" set _CAFE_SETENV=1&& goto :getopt_next
76    if /i "%_ARG:$quote$=%" == "-cafex" set USE_CAFEX=1&& goto :getopt_next
77    if /i "%_ARG:$quote$=%" == "-nocafex" set USE_CAFEX=0&& goto :getopt_next
78    if /i "%_ARG:$quote$=%" == "-multi" set SESSION_MANAGER=1&& goto :getopt_next
79    if /i "%_ARG:$quote$=%" == "-nomulti" set SESSION_MANAGER=0&& goto :getopt_next
80    if /i "%_ARG:$quote$=%" == "-session" set SESSION_MANAGER=1&& goto :getopt_next
81    if /i "%_ARG:$quote$=%" == "-nosession" set SESSION_MANAGER=0&& goto :getopt_next
82    if /i "%_ARG:$quote$=%" == "-syncsession" set DO_SYNC_SESSION=1&& goto :getopt_next
83    if /i "%_ARG:$quote$=%" == "-nosyncsession" set DO_SYNC_SESSION=0&& goto :getopt_next
84    if /i "%_ARG:$quote$=%" == "-pcfsoversata" set USE_PCFS_OVER_SATA=1&& goto :getopt_next
85    if /i "%_ARG:$quote$=%" == "-nopcfsoversata" set USE_PCFS_OVER_SATA=0&& goto :getopt_next
86    if /i "%_ARG:$quote$=%" == "-cygwin" set USE_CYGWIN=1&& goto :getopt_next
87    if /i "%_ARG:$quote$=%" == "-nocygwin" set USE_CYGWIN=0&& goto :getopt_next
88
89    if /i "%_ARG:$quote$=%" == "-bridge" set _BRIDGE_ARGS=2&& goto :getopt_next
90
91    if "%_BRIDGE_ARGS%" EQU "2" set BRIDGE_CURRENT_NAME=%_ARG:$quote$="%
92    if "%_BRIDGE_ARGS%" EQU "1" set BRIDGE_CURRENT_IP_ADDRESS=%_ARG:$quote$="%
93    if "%_BRIDGE_ARGS%" GTR "0" set /a _BRIDGE_ARGS=_BRIDGE_ARGS - 1 && goto :getopt_next
94
95    REM It's not an argument we recognize; add it to the command to be launched.
96    REM Translate all the metacharacters back.
97    for /f "delims=" %%i in ("%_ARG:$amper$=&%") do set _ARG=%%i
98    for /f "delims=" %%i in ("%_ARG:$pipebar$=|%") do set _ARG=%%i
99    for /f "delims=" %%i in ("%_ARG:$gtrthan$=>%") do set _ARG=%%i
100    for /f "delims=" %%i in ("%_ARG:$lessthan$=<%") do set _ARG=%%i
101    setlocal enabledelayedexpansion
102    for /f "delims=" %%i in ("!_ARG:$percent$=%%!") do set _ARG=%%i
103    endlocal && set CAFE_SHELL_ARGS=%CAFE_SHELL_ARGS% %_ARG:$quote$="%
104
105    :getopt_next
106    set _ARG=
107    goto :eof
108
109    :getopt_done
110    if "%_BRIDGE_ARGS%" GTR "0" echo Not enough arguments for -bridge option!&& set _BRIDGE_ARGS=&& goto :usage
111    set _BRIDGE_ARGS=
112
113REM Read defaults from config file, for anything that's not set yet.
114    set _CONFIG=%APPDATA%\Nintendo\cafe.defaults
115    if NOT EXIST "%_CONFIG%" goto :update_config
116
117    for /f "tokens=1,2 delims==" %%i in (%_CONFIG%) do call :set_config_value %%i %%j
118    if not exist "%APPDATA%\disable_pcfs_over_sata" goto :update_config
119        REM old "pcfs_over_sata" sentinel exists; update to new config file
120        set USE_PCFS_OVER_SATA=0
121        set _SETDEFAULTS=1
122        del /f "%APPDATA%\disable_pcfs_over_sata" 2>nul
123    goto :update_config
124
125    :set_config_value
126    if "%USE_CAFEX%" == "" if /i "%1" == "USE_CAFEX" set USE_CAFEX=%2
127    if "%SESSION_MANAGER%" == "" if /i "%1" == "SESSION_MANAGER" set SESSION_MANAGER=%2
128    if "%SESSION_MANAGER%" == "" if /i "%1" == "USE_MULTI" set SESSION_MANAGER=%2
129    if "%DO_SYNC_SESSION%" == "" if /i "%1" == "DO_SYNC_SESSION" set DO_SYNC_SESSION=%2
130    if "%USE_PCFS_OVER_SATA%" == "" if /i "%1" == "USE_PCFS_OVER_SATA" set USE_PCFS_OVER_SATA=%2
131    if "%USE_CYGWIN%" == "" if /i "%1" == "USE_CYGWIN" set USE_CYGWIN=%2
132    goto :eof
133
134    :update_config
135    REM rewrite config file if requested; NOT "thread-safe"!
136    if "%_SETDEFAULTS%" == "" goto :config_done
137
138    set _CONFIG="%_CONFIG%"
139    for %%i in (%_CONFIG%) do md %%~dpi 2>nul
140    del /f %_CONFIG% 2>nul
141    copy /y NUL %_CONFIG% 1>nul 2>nul
142    if NOT EXIST %_CONFIG% echo WARNING! Could not save options as default! && goto :config_done
143    for %%i in (%_CONFIG%) do if NOT "%%~zi" == "0" echo WARNING! Could not save options as default! && goto :config_done
144
145    if NOT "%USE_CAFEX%" == "" >>%_CONFIG% echo USE_CAFEX=%USE_CAFEX%
146    if NOT "%SESSION_MANAGER%" == "" >>%_CONFIG% echo SESSION_MANAGER=%SESSION_MANAGER%
147    if NOT "%DO_SYNC_SESSION%"  == "" >>%_CONFIG% echo DO_SYNC_SESSION=%DO_SYNC_SESSION%
148    if NOT "%USE_PCFS_OVER_SATA%"  == "" >>%_CONFIG% echo USE_PCFS_OVER_SATA=%USE_PCFS_OVER_SATA%
149    if NOT "%USE_CYGWIN%" == "" >>%_CONFIG% echo USE_CYGWIN=%USE_CYGWIN%
150    :config_done
151    set _CONFIG=
152
153REM Built in defaults for anything that's not set yet.
154    if "%USE_CAFEX%" == "" set USE_CAFEX=1
155    if "%USE_PCFS_OVER_SATA%"  == "" set USE_PCFS_OVER_SATA=1
156    if "%SESSION_MANAGER%"=="" set SESSION_MANAGER=0
157    if "%USE_CYGWIN%" == "" set USE_CYGWIN=1
158
159:: ************************************************************
160:: Windows paths (DOS)
161
162:: For this script only so Windows can start Cygwin
163:: NOTE: In cafe.bat shell, this is just "/"
164if "%USE_CYGWIN%" == "0" goto :no_cygwin_path
165if "%MSYS_PATH%" == "" if exist C:\MinGW\msys\1.0\msys.bat set MSYS_PATH=C:\MinGW\msys\1.0
166if "%CYGWIN_PATH%" == "" if exist C:\cygwin set CYGWIN_PATH=C:\cygwin
167if "%CYGWIN_PATH%" == "" if not "%MSYS_PATH%" == "" set CYGWIN_PATH=%MSYS_PATH%
168if "%CYGWIN_PATH%" == "" goto cygwin_error
169if not exist %CYGWIN_PATH% echo %CYGWIN_PATH% not found! && goto cygwin_error
170if not "%CAFE_TERM_USE%" == "" if not exist "%CAFE_TERM_USE%" echo %CAFE_TERM_USE% not found! && goto cygwin_error
171if not exist %CYGWIN_PATH%\bin\mintty.exe if not exist %CYGWIN_PATH%\bin\bash.exe echo bash.exe/mintty.exe not found in %CYGWIN_PATH%\bin! && goto cygwin_error
172:no_cygwin_path
173
174if "%USE_CYGWIN%" == "0" goto :no_use_cygwin
175if not exist %CYGWIN_PATH%\bin\cygcheck.exe goto :no_check_cygcheck
176:: ************************************************************
177:: Cygwin paths (UNIX)
178
179for /F "usebackq delims=" %%s in (`%CYGWIN_PATH%\bin\cygcheck -c cygwin ^| %CYGWIN_PATH%\bin\grep -m 1 "^cygwin .*1.7"`) do (set CYGCHECK=%%s)
180if "%CYGCHECK%" == "" echo WARNING: This version of cygwin is not supported.  The expected version is 1.7.x
181for /f %%i in ('%CYGWIN_PATH%\bin\uname -m 2^>nul') do if "%%i" == "x86_64" echo WARNING: 64-bit Cygwin is not supported.  You should install the 32-bit version!
182
183:no_check_cygcheck
184
185REM Find Cygwin or MSYS/MinGW version of cygpath.exe
186set _CYGPATH_DIR=%CYGWIN_PATH%\bin
187if not exist %_CYGPATH_DIR%\cygpath.exe set _CYGPATH_DIR=%CAFE_ROOT_DOS%\system\bin\tool\msys
188if not exist %_CYGPATH_DIR%\cygpath.exe set _CYGPATH_DIR=%CAFE_ROOT_DOS%\system\src\tool\bin\msys
189if not exist %_CYGPATH_DIR%\cygpath.exe echo Could not find cygpath.exe in your environment! && goto :END
190
191:no_use_cygwin
192
193:: Convert CAFE_ROOT_DOS to UNIX-style path
194::   NOTE: If CAFE_ROOT_DOS is a directory under CYGWIN_PATH (i.e. home), please
195::         manually set CAFE_ROOT below to use /cygdrive/<path> as starting path that the build system requires.
196:: An alternative is to set your enviroment variable HOME to your home
197::         directory using UNIX-style (e.g., /cygdrive/c/Users/me)
198::
199call:convert_dos_to_unix_path "CAFE_ROOT","%CAFE_ROOT_DOS%"
200
201:: Default environment for disc emulation directory if not set by Windows
202:: Clear the default flags in case we call cafe.bat from another cafe.bat.
203set CAFE_CONTENT_DEFAULT=
204set CAFE_META_DEFAULT=
205set CAFE_SAVE_DEFAULT=
206set CAFE_SLC_DEFAULT=
207set CAFE_MLC_DEFAULT=
208
209if "%CAFE_CONTENT_DIR%"=="" (
210    set CAFE_CONTENT_DEFAULT=1
211    set CAFE_CONTENT_DIR=%CAFE_ROOT%/data/disc/content
212)
213call:convert_dos_to_unix_path "CAFE_CONTENT_DIR","%CAFE_CONTENT_DIR%"
214
215:: Default environment for FSA /vol/meta if not set by Windows
216if "%CAFE_META_DIR%"=="" (
217    set CAFE_META_DEFAULT=1
218    set CAFE_META_DIR=%CAFE_ROOT%/data/disc/meta
219)
220call:convert_dos_to_unix_path "CAFE_META_DIR","%CAFE_META_DIR%"
221
222:: Default environment for FSA /vol/save if not set by Windows
223if "%CAFE_SAVE_DIR%"=="" (
224    set CAFE_SAVE_DEFAULT=1
225    set CAFE_SAVE_DIR=%CAFE_ROOT%/data/save
226)
227call:convert_dos_to_unix_path "CAFE_SAVE_DIR","%CAFE_SAVE_DIR%"
228
229:: Default environment for SLC emulation directory if not set by Windows
230if "%CAFE_SLC_DIR%"=="" (
231    set CAFE_SLC_DEFAULT=1
232    set CAFE_SLC_DIR=%CAFE_ROOT%/data/slc
233)
234call:convert_dos_to_unix_path "CAFE_SLC_DIR","%CAFE_SLC_DIR%"
235
236:: Default environment for MLC emulation directory if not set by Windows
237if "%CAFE_MLC_DIR%"=="" (
238    set CAFE_MLC_DEFAULT=1
239    set CAFE_MLC_DIR=%CAFE_ROOT%/data/mlc
240)
241call:convert_dos_to_unix_path "CAFE_MLC_DIR","%CAFE_MLC_DIR%"
242
243:: Default Mastering Tools directory
244if "%CAFE_MASTERING_TOOLS%"=="" set CAFE_MASTERING_TOOLS=%CAFE_ROOT%/system/bin/tool/mastering
245if "%CAFE_MASTERING_TOOLS%"=="%CAFE_ROOT%/system/bin/tool/mastering" set PATH=%CAFE_MASTERING_TOOLS%;%PATH%
246call:convert_dos_to_unix_path "CAFE_MASTERING_TOOLS","%CAFE_MASTERING_TOOLS%"
247
248:: Default TEMP directory
249if "%CAFE_TEMP%"=="" set CAFE_TEMP=%CAFE_ROOT%/temp/%USERNAME%
250if not exist "%CAFE_ROOT_DOS%/temp/%USERNAME%" mkdir  "%CAFE_ROOT_DOS%/temp/%USERNAME%"
251call:convert_dos_to_unix_path "CAFE_TEMP","%CAFE_TEMP%"
252
253:: Default boot mode
254:: Causes a system to boot from PCFS or NAND
255if "%CAFE_BOOT_MODE%" =="" set CAFE_BOOT_MODE=PCFS
256
257:: SDK_VER
258set SDK_VER=0.00.00
259if not exist "%CAFE_ROOT_DOS%/system/include/sdk_ver.h" goto :no_sdk_ver
260for /F "usebackq tokens=1,2,3" %%i in ("%CAFE_ROOT_DOS%/system/include/sdk_ver.h") do if "%%i" == "#define" if "%%j" == "CAFE_OS_SDK_VERSION" set ver=%%k
261if not "%ver%" == "" set SDK_VER=%ver:~0,-4%.%ver:~-4,-2%.%ver:~-2%
262:no_sdk_ver
263
264:: Check if HBM app.xml files are present
265set SHOW_HBM_WARNING=0
266if %USE_CYGWIN% == 1 (
267    call:convert_unix_to_dos_path "CAFE_MLC_DIR_DOS", %CAFE_MLC_DIR%
268) else set CAFE_MLC_DIR_DOS=%CAFE_MLC_DIR%
269if not exist "%CAFE_MLC_DIR_DOS%\sys\title\00050030\1001000a\code\app.xml" set SHOW_HBM_WARNING=1
270if not exist "%CAFE_MLC_DIR_DOS%\sys\title\00050030\1001010a\code\app.xml" set SHOW_HBM_WARNING=1
271if not exist "%CAFE_MLC_DIR_DOS%\sys\title\00050030\1001020a\code\app.xml" set SHOW_HBM_WARNING=1
272if %SHOW_HBM_WARNING% == 1 (
273    if %CAFE_BOOT_MODE% == PCFS (
274        echo Warning: Some system applications on the system might be missing. If the system fails to boot, please reinstall the SDK to restore the missing system applications and run cafeupdate.
275    )
276)
277
278:: ************************************************************
279:: Green Hills paths
280
281set GHS_ROOT_FROM_ENV="%GHS_ROOT%"
282if not "%GHS_ROOT%"=="" goto ghs_root_set
283:: No GHS_ROOT specified.
284:: Accept an installed version as new as the one in the first set below,
285:: otherwise search for increasingly older versions until the oldest allowed.
286set GHS_ROOT=C:\ghs\multi5322
287:ghs_root_set
288:: Now have a selected version.  Sanity check it.
289if exist "%GHS_ROOT%\multi.exe" goto multi_ok
290echo.
291echo *************************************
292echo WARNING: GHS MULTI.EXE not found at %GHS_ROOT%\
293echo.
294echo YOU MUST ACQUIRE AND INSTALL MULTI TO BUILD
295echo.
296echo *************************************
297set CAFE_GHS_VERSION="bad"
298goto done_set_toolchain
299:multi_ok
300if exist "%GHS_ROOT%\gversion.exe" goto version_ok
301echo.
302echo *************************************
303echo WARNING: GHS GVERSION.EXE not found at %GHS_ROOT%\
304echo.
305echo THERE IS SOMETHING WRONG WITH YOUR GHS INSTALLATION
306echo.
307echo *************************************
308set CAFE_GHS_VERSION="bad"
309goto done_set_toolchain
310:version_ok
311
312:: assume correct version, check_ghs_version will set version to last
313:: incorrect version seen
314
315set CAFE_GHS_VERSION_EXPECT=v5.3.22 P0
316:: because of windows treating v5.3.1 as greater than v5.3.1 P1
317:: if there is not a patch number add " P0"
318set CAFE_GHS_VERCMP_EXPECT=v5.3.22 P0
319set CAFE_GHS_VERSION=%CAFE_GHS_VERSION_EXPECT%
320set CAFE_GHS_VERCMP=%CAFE_GHS_VERCMP_EXPECT%
321:: check minimum versions supported
322call:check_ghs_version asppc, "v5.3.22", " P0"
323call:check_ghs_version ccppc, "v5.3.22", " P0"
324call:check_ghs_version cxppc, "v5.3.22", " P0"
325call:check_ghs_version ecomppc, "v5.3.22", " P0"
326call:check_ghs_version dblink, "v5.3.22", " P0"
327call:check_ghs_version elxr, "v5.3.22", " P0"
328call:check_ghs_version multi, "v5.3.22", " P0"
329call:check_ghs_version cafeserv, "v5.3.22", " P0"
330
331:: GUI version must check the date
332:: call:check_ghs_version_date cafeserv, "v5.0.6", " P0", 1297317659, "Wed Feb 09 22:00:59 PST 2011"
333
334if "%CAFE_GHS_VERSION%"=="" set CAFE_GHS_VERSION="unknown"
335
336call:convert_dos_to_unix_path "GHS_ROOT","%GHS_ROOT%"
337
338set CAFE_GHS_TLS_AVAILABLE=FALSE
339if "%CAFE_GHS_VERSION%" GEQ "v5.3.20" (
340    set CAFE_GHS_TLS_AVAILABLE=TRUE
341)
342
343set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=FALSE
344if "%CAFE_GHS_VERSION%" GEQ "v5.3.21" (
345    set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=TRUE
346)
347
348set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=FALSE
349if "%CAFE_GHS_VERSION%" GEQ "v5.3.21" (
350    set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=TRUE
351)
352
353if "%CAFE_GHS_VERCMP%" GEQ "%CAFE_GHS_VERCMP_EXPECT%" goto ghs_version_ok
354    echo.
355    echo **********************************************************
356    echo Newer version of GHS tools %CAFE_GHS_VERSION_EXPECT% is available please update
357    echo.
358    echo 	Copy MULTI5322_Nintendo.zip.
359    echo 	Expand and run MULTI5322_Nintendo/setup_windows.exe.
360    echo 	Do not install over 5.3.21. Install to
361    echo 	a new directory, for example:
362    echo 	C:/ghs/multi5322
363    echo.
364    echo then exit cafe.bat and rerun cafe.bat
365    echo.
366if not "GHS_ROOT_FROM_ENV"=="" (
367    echo If you have GHS_ROOT set in your environment to point to
368    echo 	%GHS_ROOT%
369    echo please update the system environment variable "GHS_ROOT"
370    echo (Windows Control Panel - System - Advanced System Settings
371    echo - Environment Variables)
372)
373    echo **********************************************************
374:ghs_version_ok
375
376:done_set_toolchain
377
378:: ************************************************************
379:: SDK environment variables
380
381set TOOLCHAIN=ghs
382set USE_GHS=1
383set CAFE_USE_RPZ=0
384set Platform=
385set PLATFORM=cafe
386:: Default output [cattoucan | toucan]
387if "%CAFE_CONSOLE%"=="" set CAFE_CONSOLE=cattoucan
388:: Default hardware board connected to PC for [catdevmp|catdev4]
389if "%CAFE_HARDWARE%"=="" set CAFE_HARDWARE=catdevmp
390
391:: ************************************************************
392
393:: ************************************************************
394:: *
395:: * DO NOT MODIFY BELOW HERE
396:: *
397:: ************************************************************
398
399:: PATH (Cygwin will add Windows PATH environment variable)
400set PATH=%CAFE_ROOT%/system/bin/tool;%CAFE_ROOT%/system/bin/win32;%PATH%
401REM If we're in an MSYS window, not Cygwin, add special MSYS-related tools to the PATH
402if NOT "%USE_CYGWIN%" == "0" if not exist %CYGWIN_PATH%\bin\cygwin1.dll set PATH=%PATH%;%_CYGPATH_DIR%
403
404:: Cygwin setup
405if NOT "%USE_CYGWIN%" == "0" set CYGWIN=nodosfilewarning
406
407:: ************************************************************
408:: Bridge environment variables
409if "%USE_SINGLE_CGI%" == "" set USE_SINGLE_CGI=1
410if not "%BRIDGE_CURRENT_NAME%"=="" goto :skip_mion
411if not exist "%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" goto skip_mion
412:mion_name
413for /f "usebackq tokens=5" %%i in (`"%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" -default`) do (
414    set BRIDGE_CURRENT_NAME=%%i
415    goto mion_ip_address
416)
417:mion_ip_address
418for /f "usebackq skip=1 tokens=5" %%i in (`"%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" -default`) do (
419    set BRIDGE_CURRENT_IP_ADDRESS=%%i
420)
421:skip_mion
422
423:: Match boot mode w/ what is running on the CAT-DEV
424if "%BRIDGE_CURRENT_IP_ADDRESS%"=="" goto nand_mode_set
425
426set MIONPS_PATH=%CAFE_ROOT_DOS%\system\bin\tool\mionps.exe
427if not exist "%MIONPS_PATH%" set MIONPS_PATH=%CAFE_ROOT_DOS%\system\src\tool\mionps\bin\win32\mionps.exe
428
429:: Match SDK Version w/ what is running on the CAT-DEV
430for /f "tokens=1,2,3,4 delims= " %%G in ('"%MIONPS_PATH%" %BRIDGE_CURRENT_IP_ADDRESS% 2 3 4 5') do (set NAND_MODE_BIT=%%G&set SDK_MAJ_VER=%%H&set SDK_MIN_VER=%%I&set SDK_MIC_VER=%%J);
431if "%NAND_MODE_BIT%"=="ERROR!" (
432    echo *** Your CAT-DEV is not accessible. It might be powered off or offline ***
433    goto nand_mode_set
434)
435
436set SDK_MIN_VER=0%SDK_MIN_VER%
437set SDK_MIN_VER=%SDK_MIN_VER:~-2%
438
439set SDK_MIC_VER=0%SDK_MIC_VER%
440set SDK_MIC_VER=%SDK_MIC_VER:~-2%
441
442if not "%SDK_MAJ_VER%.%SDK_MIN_VER%.%SDK_MIC_VER%" == "%SDK_VER%" (
443    echo.
444    echo !!! Your CAT-DEV is not at the same level as this SDK. !!!
445    echo SDK Version: %SDK_VER%  CAT-DEV SDK Version: %SDK_MAJ_VER%.%SDK_MIN_VER%.%SDK_MIC_VER%
446    echo !!! Please run cafeupdate to get them in sync. !!!
447    echo.
448)
449
450:nand_mode_set
451if "%NAND_MODE_BIT%"=="1" (
452    set CAFE_BOOT_MODE=NAND
453)
454
455:: ************************************************************
456:: Set the session specific variables and paths
457call:initsession
458
459if "%ERRORLEVEL%"=="5" (
460    exit /b %ERRORLEVEL%
461)
462
463REM Clean up temporary variables
464set _CYGPATH_DIR=
465
466:: ************************************************************
467
468:: If the extra arguments exist, skip echos.
469if DEFINED CAFE_SHELL_ARGS goto RUN_BASH
470
471@echo ==========================================================
472@echo Welcome to the Nintendo CAFE!
473@echo ==========================================================
474@echo Environment initialized for this session only.
475@echo  SDK_VER          = %SDK_VER%
476@echo  CAFE_ROOT        = %CAFE_ROOT%
477@echo  CAFE_HARDWARE    = %CAFE_HARDWARE%
478@echo  CAFE_BOOT_MODE   = %CAFE_BOOT_MODE%
479@if /i "%TOOLCHAIN%"=="ghs" echo  GHS_ROOT         = %GHS_ROOT%
480@if /i "%TOOLCHAIN%"=="ghs" echo  CAFE_GHS_VERSION = "%CAFE_GHS_VERSION%"
481@echo  CAFE_CONTENT_DIR = %CAFE_CONTENT_DIR%
482@echo  CAFE_SAVE_DIR    = %CAFE_SAVE_DIR%
483@echo  CAFE_META_DIR    = %CAFE_META_DIR%
484@echo  CAFE_SLC_DIR     = %CAFE_SLC_DIR%
485@echo  CAFE_MLC_DIR     = %CAFE_MLC_DIR%
486if "%BRIDGE_CURRENT_NAME%"=="" goto DONOTECHOMION
487@echo  Current bridge   = %BRIDGE_CURRENT_NAME%
488@echo  Bridge IP Addr   = %BRIDGE_CURRENT_IP_ADDRESS%
489:DONOTECHOMION
490@if "%SESSION_MANAGER%"=="1" (
491@echo  SESSION_NAME     = %SESSION_NAME%
492@echo  HIO_OUT_PORT     = %SESSION_HIO_OUT_PORT%
493@echo  CAFE_DATA_DIR    = %CAFE_DATA_DIR%
494)
495@echo.
496@echo ----------------------------------------------------------
497
498:RUN_BASH
499if "%USE_CYGWIN%" == "0" goto :USE_CMD
500
501:: Copy cafe.sh in /etc/profile.d to update the title
502md %CYGWIN_PATH%\etc\profile.d >nul 2>&1
503if "%SESSION_MANAGER%"=="1" copy "%CAFE_ROOT_DOS%\system\bin\tool\cafe_profile.sh" "%CYGWIN_PATH%\etc\profile.d\cafe.sh" > nul
504
505:: The extra arguments are for the buildsystem
506if "%CAFE_USE_MINTTY%" == "" goto USE_ENV
507if not exist "%CYGWIN_PATH%\bin\mintty.exe" goto USE_BASH
508
509echo Running mintty.
510%CYGWIN_PATH%\bin\mintty -e %CYGWIN_PATH%\bin\bash --login -i %*
511goto EXIT
512
513:USE_ENV
514if "%CAFE_TERM_USE%" == "" goto USE_BASH
515if not exist "%CAFE_TERM_USE%" goto USE_BASH
516
517echo Running user supplied terminal or shell.
518call %CAFE_TERM_USE%
519goto EXIT
520
521:USE_BASH
522%CYGWIN_PATH%\bin\bash --login -i %CAFE_SHELL_ARGS%
523goto :EXIT
524
525:USE_CMD
526set _TITLE=Nintendo CAFE
527if NOT "%BRIDGE_CURRENT_NAME%" == "" set _TITLE=%_TITLE% for %BRIDGE_CURRENT_NAME% (%BRIDGE_CURRENT_IP_ADDRESS%)
528
529REM If we're not opening a new window, just change the title and exit.
530if "%_CAFE_SETENV%" == "" goto :USE_CMD_NEWWINDOW
531title %_TITLE%
532set _CAFE_SETENV=
533set _TITLE=
534if DEFINED CAFE_SHELL_ARGS call %CAFE_SHELL_ARGS%
535goto :EXIT
536
537:USE_CMD_NEWWINDOW
538REM We want to update the title bar, but just for this invocation.  Since we can't
539REM read the value of the current title bar, we'll just create a little batch file
540REM which sets the title, then when it exits the original title will be reset.
541set _TEMPSCRIPT=%CAFE_TEMP%\tmpcafe_%RANDOM%%BRIDGE_CURRENT_IP_ADDRESS%.bat
542del /f /q %_TEMPSCRIPT% >nul 2>&1
543echo @title %_TITLE% > %_TEMPSCRIPT%
544if DEFINED CAFE_SHELL_ARGS >> %_TEMPSCRIPT% echo @cmd /c %CAFE_SHELL_ARGS%
545
546if     DEFINED CAFE_SHELL_ARGS cmd /c %_TEMPSCRIPT%
547if NOT DEFINED CAFE_SHELL_ARGS cmd /k %_TEMPSCRIPT%
548
549set _TEMP_ERRORLEVEL=%ERRORLEVEL%
550del /f /q %_TEMPSCRIPT% >nul 2>&1
551set ERRORLEVEL=%_TEMP_ERRORLEVEL%
552set _TEMP_ERRORLEVEL=
553set _TITLE=
554set _TEMPSCRIPT=
555goto :EXIT
556
557:EXIT
558:: Propagate error code from bash
559exit /b %ERRORLEVEL%
560
561:: ************************************************************
562:: *
563:: * FUNCTIONS
564:: *
565:: ************************************************************
566
567:convert_dos_to_unix_path
568if "%USE_CYGWIN%" == "0" for %%i in (%2) do set %~1=%%~fi& goto :eof
569for /F "delims=" %%s in ('%_CYGPATH_DIR%\cygpath "%~2"') do (set %~1=%%s)
570goto :eof
571
572:convert_unix_to_dos_path
573for /F "delims=" %%s in ('%_CYGPATH_DIR%\cygpath.exe -w "%~2"') do (set %~1=%%s)
574goto :eof
575
576:initsession
577:: See if we have a Current Bridge set.  If not, disable multi-session
578::   this can happen right after install before setting the default bridge
579if "%BRIDGE_CURRENT_NAME%"=="" (
580    set SESSION_MANAGER=0
581)
582
583if not "%SESSION_MANAGER%"=="1" goto :no_session_manager
584:: See if SessionManager is available. If not, fail soince we are enabled for multi-session
585if not exist "%MION_BRIDGE_TOOLS%\SessionManager.dll" (
586    echo.
587    echo ERROR: SessionManager.dll not found and multi-CATDEV is enabled!
588    echo.       Please install HostBridge version 3.2.2.3+ or disable the multi-CATDEV feature.
589    set /p x=
590    exit /b 5
591)
592
593:: Call the SessionManager to get the session information
594for /f "usebackq tokens=1,2,3,4,5,6,7" %%a in (`"%MION_BRIDGE_TOOLS%\SessionManagerUtil" -p NAME DEBUG_OUT DEBUG_CONTROL HIO_OUT LAUNCH_CTRL NET_MANAGE PCFS_SATA`) do (
595    set SESSION_NAME=%%a
596    set SESSION_DEBUG_OUT_PORT=%%b
597    set SESSION_DEBUG_CONTROL_PORT=%%c
598    set SESSION_HIO_OUT_PORT=%%d
599    set SESSION_LAUNCH_CTRL_PORT=%%e
600    set SESSION_NET_MANAGE_PORT=%%f
601    set SESSION_PCFS_SATA_PORT=%%g
602)
603
604set SESSION_PATH_PREFIX=%SESSION_NAME%_
605
606call :convert_dos_to_unix_path CAFE_DATA_DIR "%CAFE_ROOT%/%SESSION_PATH_PREFIX%data"
607if "%CAFE_CONTENT_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_CONTENT_DIR "%CAFE_DATA_DIR%/disc/content"
608if "%CAFE_META_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_META_DIR "%CAFE_DATA_DIR%/disc/meta"
609if "%CAFE_SAVE_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_SAVE_DIR "%CAFE_DATA_DIR%/save"
610if "%CAFE_SLC_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_SLC_DIR "%CAFE_DATA_DIR%/slc"
611if "%CAFE_MLC_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_MLC_DIR "%CAFE_DATA_DIR%/mlc"
612call :convert_dos_to_unix_path CAFE_DATA_TMP "%CAFE_DATA_DIR%/tmp"
613
614if "%DO_SYNC_SESSION%" == "0" set CAFERUN_OPTION_NO_DATA_SYNC=1
615
616goto :eof
617
618:no_session_manager
619:: SessionManager disabled or not present
620set SESSION_NAME=
621set SESSION_DEBUG_OUT_PORT=6001
622set SESSION_DEBUG_CONTROL_PORT=6002
623set SESSION_HIO_OUT_PORT=6003
624set SESSION_LAUNCH_CTRL_PORT=6006
625set SESSION_NET_MANAGE_PORT=6008
626set SESSION_PCFS_SATA_PORT=7500
627
628set SESSION_PATH_PREFIX=
629call :convert_dos_to_unix_path CAFE_DATA_DIR "%CAFE_ROOT%/data"
630goto :eof
631
632:check_ghs_version
633:: Expect something like (without quotes; note trailing space):
634:: "C:\ghs\multi5317\asppc: Green Hills Software, MULTI v5.3.17 Nintendo "
635for /f "usebackq tokens=6,*" %%i in (`"%GHS_ROOT%\gversion" -nomtime -quiet 1 %GHS_ROOT%\%~1`) do (
636	set verstr=%%i %%j
637	set verbase=%%i
638)
639for /f "tokens=1,2,3 delims=. " %%i in ("%verbase%") do (
640	set v1=%%i
641	set v2=%%j
642	set v3=%%k
643)
644
645for /f "tokens=1,2,3 delims=. " %%i in ("%~2%") do (
646	set in_v1=%%i
647	set in_v2=%%j
648	set in_v3=%%k
649)
650set /a delta=%v3% - %in_v3%
651set delta=%delta:-=N%
652set verstr=%verstr: Nintendo = %
653:: remove upto 7 trailing blanks
654set verstr=%verstr%XXXXX
655set verstr=%verstr:    XXXXX=XXXXX%
656set verstr=%verstr:  XXXXX=XXXXX%
657set verstr=%verstr: XXXXX=XXXXX%
658set verstr=%verstr:XXXXX=%
659if "%verbase%" == "%verstr%" (
660    set vercmp=%verstr% P0
661) else (
662    set vercmp=%verstr%
663)
664set fixversion=%verbase:*.%
665if "%~2%~3" == "%vercmp%" goto :ghs_verok
666:: if versions don't match and have not been changed yet change them
667if not "%CAFE_GHS_VERCMP%" == "%CAFE_GHS_VERCMP_EXPECT%" goto :ghs_noverchange
668    set CAFE_GHS_VERCMP=%vercmp%
669    set CAFE_GHS_VERSION=%verstr%
670:ghs_noverchange
671    if "%in_v1% %in_v2%" NEQ "%v1% %v2%" (
672	echo "%in_v1% %in_v2% vs %v1% %v2%"
673        echo Warning: %~1 %verstr% version is not supported expect %~2
674	goto :ghs_verok
675    )
676    if "%delta%" GEQ "N" (
677        echo Warning: %~1 %verstr% version is older than %~2
678::    ) else (
679::        echo Info: %~1 %verstr% version is newer than %~2
680    )
681:ghs_verok
682set verstr=
683set vercmp=
684set verbase=
685goto :eof
686
687:check_ghs_version_date
688for /f "usebackq skip=1 tokens=3" %%i in (`"%GHS_ROOT%\gversion" -value 0 %GHS_ROOT%\%~1`) do (
689	set verdatenum=%%i
690)
691if "%~4" == "%verdatenum%" goto :ghs_verdateok
692    for /f "usebackq tokens=6,*" %%i in (`"%GHS_ROOT%\gversion" -nomtime -quiet 1 %GHS_ROOT%\%~1`) do (
693        set verstr=%%i %%j
694	set verbase=%%i
695    )
696    set verstr=%verstr: Nintendo = %
697    set verstr=%verstr%XXXXX
698    set verstr=%verstr:    XXXXX=XXXXX%
699    set verstr=%verstr:  XXXXX=XXXXX%
700    set verstr=%verstr: XXXXX=XXXXX%
701    set verstr=%verstr:XXXXX=%
702    if "%verbase%" == "%verstr%" (
703        set vercmp=%verstr% P0
704    ) else (
705        set vercmp=%verstr%
706    )
707    for /f "usebackq skip=2 tokens=4,*" %%i in (`"%GHS_ROOT%\gversion" %GHS_ROOT%\%~1`) do (
708        set verdatestr=%verstr% %%i %%j
709    )
710    :: remove upto 7 trailing blanks
711    set verdatestr=%verdatestr%XXXXX
712    set verdatestr=%verdatestr:    XXXXX=XXXXX%
713    set verdatestr=%verdatestr:  XXXXX=XXXXX%
714    set verdatestr=%verdatestr: XXXXX=XXXXX%
715    set verdatestr=%verdatestr:XXXXX=%
716    if "%verdatenum%" LSS "%~4" (
717        echo Warning: %~1 %verdatestr% version is older then expected %~2 %~5
718    ) else (
719	echo Info: %~1 %verdatestr% version is newer than %~2 %~5
720    )
721    :: only change if it is not already changed
722    :: this assumes no mixed installations
723    :: and date compares have confusing version strings
724    :: as in v5.0.6 is newer then v5.3.0 P2
725    if "%CAFE_GHS_VERCMP%" == "%CAFE_GHS_VERCMP_EXPECT%" (
726        set CAFE_GHS_VERSION=%verdatestr%
727        set CAFE_GHS_VERCMP=%verdatestr%
728    )
729:ghs_verdateok
730set verstr=
731set verstr2=
732set verdatestr=
733goto :eof
734
735:cygwin_error
736echo Error: Can't find Cygwin. Please set CYGWIN_PATH or use install_cygwin.bat
737pause
738exit /b 1
739goto :eof
740
741:usage
742echo.
743echo ==================================================
744echo NINTENDO CAFE ENVIRONMENT!
745echo ==================================================
746echo.
747echo Usage: %~nx0 [options] [shell command]
748echo.
749echo Options:
750echo    -cafex           Use CafeX to run applications (default)
751echo    -nocafex         Do not use CafeX; uses Cygwin shell scripts
752echo    -multi           Enable multisession CAFE support
753echo    -nomulti         Do not enable multisession support (default)
754echo    -syncsession     Copy per-session files (default)
755echo    -nosyncsession   Do not copy files; data files shared across sessions
756echo    -pcfsoversata    Enable PCFS over SATA (default)
757echo    -nopcfsoversata  Disable PCFS over SATA; use PCFS over SDIO
758echo    -cygwin          Use Cygwin (default)
759echo    -nocygwin        Do not use Cygwin; for running apps only
760echo    -setenv          With -nocygwin, modify the current environment
761echo                     instead of opening a new window for Cafe
762echo.
763echo    -bridge ^<name^> ^<ipaddr^>
764echo                     Temporarily set current bridge for this window
765echo.
766echo    -default         Save these settings for future use
767echo.
768echo Any shell command is executed automatically in the CAFE environment.
769set _USAGE=1
770goto :eof
771
772:END
773
774ENDLOCAL
775