1@if "%_ECHOON%" == "" echo off
2
3:: ###############################################################################
4:: #
5:: # Copyright (C) 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\multi5325
287if not exist "%GHS_ROOT%" set GHS_ROOT=C:\ghs\multi5324
288:ghs_root_set
289:: Now have a selected version.  Sanity check it.
290if exist "%GHS_ROOT%\multi.exe" goto multi_ok
291echo.
292echo *************************************
293echo WARNING: GHS MULTI.EXE not found at %GHS_ROOT%\
294echo.
295echo YOU MUST ACQUIRE AND INSTALL MULTI TO BUILD
296echo.
297echo *************************************
298set CAFE_GHS_VERSION="bad"
299goto done_set_toolchain
300:multi_ok
301if exist "%GHS_ROOT%\gversion.exe" goto version_ok
302echo.
303echo *************************************
304echo WARNING: GHS GVERSION.EXE not found at %GHS_ROOT%\
305echo.
306echo THERE IS SOMETHING WRONG WITH YOUR GHS INSTALLATION
307echo.
308echo *************************************
309set CAFE_GHS_VERSION="bad"
310goto done_set_toolchain
311:version_ok
312
313:: assume correct version, check_ghs_version will set version to last
314:: incorrect version seen
315
316set CAFE_GHS_VERSION_EXPECT=v5.3.24 P0
317:: because of windows treating v5.3.1 as greater than v5.3.1 P1
318:: if there is not a patch number add " P0"
319set CAFE_GHS_VERCMP_EXPECT=v5.3.24 P0
320set CAFE_GHS_VERSION=%CAFE_GHS_VERSION_EXPECT%
321set CAFE_GHS_VERCMP=%CAFE_GHS_VERCMP_EXPECT%
322:: check minimum versions supported
323call:check_ghs_version asppc, "v5.3.24", " P0"
324call:check_ghs_version ccppc, "v5.3.24", " P0"
325call:check_ghs_version cxppc, "v5.3.24", " P0"
326call:check_ghs_version ecomppc, "v5.3.24", " P0"
327call:check_ghs_version dblink, "v5.3.24", " P0"
328call:check_ghs_version elxr, "v5.3.24", " P0"
329call:check_ghs_version multi, "v5.3.24", " P0"
330call:check_ghs_version cafeserv, "v5.3.24", " P0"
331
332:: GUI version must check the date
333:: call:check_ghs_version_date cafeserv, "v5.0.6", " P0", 1297317659, "Wed Feb 09 22:00:59 PST 2011"
334
335if "%CAFE_GHS_VERSION%"=="" set CAFE_GHS_VERSION="unknown"
336
337call:convert_dos_to_unix_path "GHS_ROOT","%GHS_ROOT%"
338
339set CAFE_GHS_TLS_AVAILABLE=FALSE
340if "%CAFE_GHS_VERSION%" GEQ "v5.3.20" (
341    set CAFE_GHS_TLS_AVAILABLE=TRUE
342)
343
344set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=FALSE
345if "%CAFE_GHS_VERSION%" GEQ "v5.3.21" (
346    set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=TRUE
347)
348
349set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=FALSE
350if "%CAFE_GHS_VERSION%" GEQ "v5.3.21" (
351    set CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT=TRUE
352)
353
354if "%CAFE_GHS_VERCMP%" GEQ "%CAFE_GHS_VERCMP_EXPECT%" goto ghs_version_ok
355    echo.
356    echo **********************************************************
357    echo Newer version of GHS tools %CAFE_GHS_VERSION_EXPECT% is available please update
358    echo.
359    echo 	Copy MULTI5324_Nintendo.zip.
360    echo 	Expand and run MULTI5324_Nintendo/setup_windows.exe.
361    echo 	Do not install over 5.3.23. Install to
362    echo 	a new directory, for example:
363    echo 	C:/ghs/multi5324
364    echo.
365    echo then exit cafe.bat and rerun cafe.bat
366    echo.
367if not "GHS_ROOT_FROM_ENV"=="" (
368    echo If you have GHS_ROOT set in your environment to point to
369    echo 	%GHS_ROOT%
370    echo please update the system environment variable "GHS_ROOT"
371    echo (Windows Control Panel - System - Advanced System Settings
372    echo - Environment Variables)
373)
374    echo **********************************************************
375:ghs_version_ok
376
377:done_set_toolchain
378
379:: ************************************************************
380:: SDK environment variables
381
382set TOOLCHAIN=ghs
383set USE_GHS=1
384set CAFE_USE_RPZ=0
385set Platform=
386set PLATFORM=cafe
387:: Default output [cattoucan | toucan]
388if "%CAFE_CONSOLE%"=="" set CAFE_CONSOLE=cattoucan
389:: Default hardware board connected to PC for [catdevmp|catdev4]
390if "%CAFE_HARDWARE%"=="" set CAFE_HARDWARE=catdevmp
391
392:: ************************************************************
393
394:: ************************************************************
395:: *
396:: * DO NOT MODIFY BELOW HERE
397:: *
398:: ************************************************************
399
400:: PATH (Cygwin will add Windows PATH environment variable)
401set PATH=%CAFE_ROOT%/system/bin/tool;%CAFE_ROOT%/system/bin/win32;%PATH%
402REM If we're in an MSYS window, not Cygwin, add special MSYS-related tools to the PATH
403if NOT "%USE_CYGWIN%" == "0" if not exist %CYGWIN_PATH%\bin\cygwin1.dll set PATH=%PATH%;%_CYGPATH_DIR%
404
405:: Cygwin setup
406if NOT "%USE_CYGWIN%" == "0" set CYGWIN=nodosfilewarning
407
408:: ************************************************************
409:: Bridge environment variables
410if "%USE_SINGLE_CGI%" == "" set USE_SINGLE_CGI=1
411if not "%BRIDGE_CURRENT_NAME%"=="" goto :skip_mion
412if not exist "%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" goto skip_mion
413:mion_name
414for /f "usebackq tokens=5" %%i in (`"%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" -default`) do (
415    set BRIDGE_CURRENT_NAME=%%i
416    goto mion_ip_address
417)
418:mion_ip_address
419for /f "usebackq skip=1 tokens=5" %%i in (`"%MION_BRIDGE_TOOLS%\getbridgeconfig.exe" -default`) do (
420    set BRIDGE_CURRENT_IP_ADDRESS=%%i
421)
422:skip_mion
423
424:: Match boot mode w/ what is running on the CAT-DEV
425if "%BRIDGE_CURRENT_IP_ADDRESS%"=="" goto nand_mode_set
426
427set MIONPS_PATH=%CAFE_ROOT_DOS%\system\bin\tool\mionps.exe
428if not exist "%MIONPS_PATH%" set MIONPS_PATH=%CAFE_ROOT_DOS%\system\src\tool\mionps\bin\win32\mionps.exe
429
430:: Match SDK Version w/ what is running on the CAT-DEV
431for /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);
432if "%NAND_MODE_BIT%"=="ERROR!" (
433    echo *** Your CAT-DEV is not accessible. It might be powered off or offline ***
434    goto nand_mode_set
435)
436
437set SDK_MIN_VER=0%SDK_MIN_VER%
438set SDK_MIN_VER=%SDK_MIN_VER:~-2%
439
440set SDK_MIC_VER=0%SDK_MIC_VER%
441set SDK_MIC_VER=%SDK_MIC_VER:~-2%
442
443if not "%SDK_MAJ_VER%.%SDK_MIN_VER%.%SDK_MIC_VER%" == "%SDK_VER%" (
444    echo.
445    echo !!! Your CAT-DEV is not at the same level as this SDK. !!!
446    echo SDK Version: %SDK_VER%  CAT-DEV SDK Version: %SDK_MAJ_VER%.%SDK_MIN_VER%.%SDK_MIC_VER%
447    echo !!! Please run cafeupdate to get them in sync. !!!
448    echo.
449)
450
451:nand_mode_set
452if "%NAND_MODE_BIT%"=="1" (
453    set CAFE_BOOT_MODE=NAND
454)
455
456:: ************************************************************
457:: Set the session specific variables and paths
458call:initsession
459
460if "%ERRORLEVEL%"=="5" (
461    exit /b %ERRORLEVEL%
462)
463
464REM Clean up temporary variables
465set _CYGPATH_DIR=
466
467:: ************************************************************
468
469:: If the extra arguments exist, skip echos.
470if DEFINED CAFE_SHELL_ARGS goto RUN_BASH
471
472@echo ==========================================================
473@echo Welcome to the Nintendo CAFE!
474@echo ==========================================================
475@echo Environment initialized for this session only.
476@echo  SDK_VER          = %SDK_VER%
477@echo  CAFE_ROOT        = %CAFE_ROOT%
478@echo  CAFE_HARDWARE    = %CAFE_HARDWARE%
479@echo  CAFE_BOOT_MODE   = %CAFE_BOOT_MODE%
480@if /i "%TOOLCHAIN%"=="ghs" echo  GHS_ROOT         = %GHS_ROOT%
481@if /i "%TOOLCHAIN%"=="ghs" echo  CAFE_GHS_VERSION = "%CAFE_GHS_VERSION%"
482@echo  CAFE_CONTENT_DIR = %CAFE_CONTENT_DIR%
483@echo  CAFE_SAVE_DIR    = %CAFE_SAVE_DIR%
484@echo  CAFE_META_DIR    = %CAFE_META_DIR%
485@echo  CAFE_SLC_DIR     = %CAFE_SLC_DIR%
486@echo  CAFE_MLC_DIR     = %CAFE_MLC_DIR%
487if "%BRIDGE_CURRENT_NAME%"=="" goto DONOTECHOMION
488@echo  Current bridge   = %BRIDGE_CURRENT_NAME%
489@echo  Bridge IP Addr   = %BRIDGE_CURRENT_IP_ADDRESS%
490:DONOTECHOMION
491@if "%SESSION_MANAGER%"=="1" (
492@echo  SESSION_NAME     = %SESSION_NAME%
493@echo  HIO_OUT_PORT     = %SESSION_HIO_OUT_PORT%
494@echo  CAFE_DATA_DIR    = %CAFE_DATA_DIR%
495)
496@echo.
497@echo ----------------------------------------------------------
498
499:RUN_BASH
500if "%USE_CYGWIN%" == "0" goto :USE_CMD
501
502:: Copy cafe.sh in /etc/profile.d to update the title
503md %CYGWIN_PATH%\etc\profile.d >nul 2>&1
504if "%SESSION_MANAGER%"=="1" copy "%CAFE_ROOT_DOS%\system\bin\tool\cafe_profile.sh" "%CYGWIN_PATH%\etc\profile.d\cafe.sh" > nul
505
506:: The extra arguments are for the buildsystem
507if "%CAFE_USE_MINTTY%" == "" goto USE_ENV
508if not exist "%CYGWIN_PATH%\bin\mintty.exe" goto USE_BASH
509
510echo Running mintty.
511%CYGWIN_PATH%\bin\mintty -e %CYGWIN_PATH%\bin\bash --login -i %*
512goto EXIT
513
514:USE_ENV
515if "%CAFE_TERM_USE%" == "" goto USE_BASH
516if not exist "%CAFE_TERM_USE%" goto USE_BASH
517
518echo Running user supplied terminal or shell.
519call %CAFE_TERM_USE%
520goto EXIT
521
522:USE_BASH
523%CYGWIN_PATH%\bin\bash --login -i %CAFE_SHELL_ARGS%
524goto :EXIT
525
526:USE_CMD
527set _TITLE=Nintendo CAFE
528if NOT "%BRIDGE_CURRENT_NAME%" == "" set _TITLE=%_TITLE% for %BRIDGE_CURRENT_NAME% (%BRIDGE_CURRENT_IP_ADDRESS%)
529
530REM If we're not opening a new window, just change the title and exit.
531if "%_CAFE_SETENV%" == "" goto :USE_CMD_NEWWINDOW
532title %_TITLE%
533set _CAFE_SETENV=
534set _TITLE=
535if DEFINED CAFE_SHELL_ARGS call %CAFE_SHELL_ARGS%
536goto :EXIT
537
538:USE_CMD_NEWWINDOW
539REM We want to update the title bar, but just for this invocation.  Since we can't
540REM read the value of the current title bar, we'll just create a little batch file
541REM which sets the title, then when it exits the original title will be reset.
542set _TEMPSCRIPT=%CAFE_TEMP%\tmpcafe_%RANDOM%%BRIDGE_CURRENT_IP_ADDRESS%.bat
543del /f /q %_TEMPSCRIPT% >nul 2>&1
544echo @title %_TITLE% > %_TEMPSCRIPT%
545if DEFINED CAFE_SHELL_ARGS >> %_TEMPSCRIPT% echo @cmd /c %CAFE_SHELL_ARGS%
546
547if     DEFINED CAFE_SHELL_ARGS cmd /c %_TEMPSCRIPT%
548if NOT DEFINED CAFE_SHELL_ARGS cmd /k %_TEMPSCRIPT%
549
550set _TEMP_ERRORLEVEL=%ERRORLEVEL%
551del /f /q %_TEMPSCRIPT% >nul 2>&1
552set ERRORLEVEL=%_TEMP_ERRORLEVEL%
553set _TEMP_ERRORLEVEL=
554set _TITLE=
555set _TEMPSCRIPT=
556goto :EXIT
557
558:EXIT
559:: Propagate error code from bash
560exit /b %ERRORLEVEL%
561
562:: ************************************************************
563:: *
564:: * FUNCTIONS
565:: *
566:: ************************************************************
567
568:convert_dos_to_unix_path
569if "%USE_CYGWIN%" == "0" for %%i in (%2) do set %~1=%%~fi& goto :eof
570for /F "delims=" %%s in ('%_CYGPATH_DIR%\cygpath "%~2"') do (set %~1=%%s)
571goto :eof
572
573:convert_unix_to_dos_path
574for /F "delims=" %%s in ('%_CYGPATH_DIR%\cygpath.exe -w "%~2"') do (set %~1=%%s)
575goto :eof
576
577:initsession
578:: See if we have a Current Bridge set.  If not, disable multi-session
579::   this can happen right after install before setting the default bridge
580if "%BRIDGE_CURRENT_NAME%"=="" (
581    set SESSION_MANAGER=0
582)
583
584if not "%SESSION_MANAGER%"=="1" goto :no_session_manager
585:: See if SessionManager is available. If not, fail soince we are enabled for multi-session
586if not exist "%MION_BRIDGE_TOOLS%\SessionManager.dll" (
587    echo.
588    echo ERROR: SessionManager.dll not found and multi-CATDEV is enabled!
589    echo.       Please install HostBridge version 3.2.2.3+ or disable the multi-CATDEV feature.
590    set /p x=
591    exit /b 5
592)
593
594:: Call the SessionManager to get the session information
595for /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 (
596    set SESSION_NAME=%%a
597    set SESSION_DEBUG_OUT_PORT=%%b
598    set SESSION_DEBUG_CONTROL_PORT=%%c
599    set SESSION_HIO_OUT_PORT=%%d
600    set SESSION_LAUNCH_CTRL_PORT=%%e
601    set SESSION_NET_MANAGE_PORT=%%f
602    set SESSION_PCFS_SATA_PORT=%%g
603)
604
605set SESSION_PATH_PREFIX=%SESSION_NAME%_
606
607call :convert_dos_to_unix_path CAFE_DATA_DIR "%CAFE_ROOT%/%SESSION_PATH_PREFIX%data"
608if "%CAFE_CONTENT_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_CONTENT_DIR "%CAFE_DATA_DIR%/disc/content"
609if "%CAFE_META_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_META_DIR "%CAFE_DATA_DIR%/disc/meta"
610if "%CAFE_SAVE_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_SAVE_DIR "%CAFE_DATA_DIR%/save"
611if "%CAFE_SLC_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_SLC_DIR "%CAFE_DATA_DIR%/slc"
612if "%CAFE_MLC_DEFAULT%"=="1" call :convert_dos_to_unix_path CAFE_MLC_DIR "%CAFE_DATA_DIR%/mlc"
613call :convert_dos_to_unix_path CAFE_DATA_TMP "%CAFE_DATA_DIR%/tmp"
614
615if "%DO_SYNC_SESSION%" == "0" set CAFERUN_OPTION_NO_DATA_SYNC=1
616
617goto :eof
618
619:no_session_manager
620:: SessionManager disabled or not present
621set SESSION_NAME=
622set SESSION_DEBUG_OUT_PORT=6001
623set SESSION_DEBUG_CONTROL_PORT=6002
624set SESSION_HIO_OUT_PORT=6003
625set SESSION_LAUNCH_CTRL_PORT=6006
626set SESSION_NET_MANAGE_PORT=6008
627set SESSION_PCFS_SATA_PORT=7500
628
629set SESSION_PATH_PREFIX=
630call :convert_dos_to_unix_path CAFE_DATA_DIR "%CAFE_ROOT%/data"
631goto :eof
632
633:check_ghs_version
634:: Expect something like (without quotes; note trailing space):
635:: "C:\ghs\multi5317\asppc: Green Hills Software, MULTI v5.3.17 Nintendo "
636for /f "usebackq tokens=6,*" %%i in (`"%GHS_ROOT%\gversion" -nomtime -quiet 1 %GHS_ROOT%\%~1`) do (
637	set verstr=%%i %%j
638	set verbase=%%i
639)
640for /f "tokens=1,2,3 delims=. " %%i in ("%verbase%") do (
641	set v1=%%i
642	set v2=%%j
643	set v3=%%k
644)
645
646for /f "tokens=1,2,3 delims=. " %%i in ("%~2%") do (
647	set in_v1=%%i
648	set in_v2=%%j
649	set in_v3=%%k
650)
651set /a delta=%v3% - %in_v3%
652set delta=%delta:-=N%
653set verstr=%verstr: Nintendo = %
654:: remove upto 7 trailing blanks
655set verstr=%verstr%XXXXX
656set verstr=%verstr:    XXXXX=XXXXX%
657set verstr=%verstr:  XXXXX=XXXXX%
658set verstr=%verstr: XXXXX=XXXXX%
659set verstr=%verstr:XXXXX=%
660if "%verbase%" == "%verstr%" (
661    set vercmp=%verstr% P0
662) else (
663    set vercmp=%verstr%
664)
665set fixversion=%verbase:*.%
666if "%~2%~3" == "%vercmp%" goto :ghs_verok
667:: if versions don't match and have not been changed yet change them
668if not "%CAFE_GHS_VERCMP%" == "%CAFE_GHS_VERCMP_EXPECT%" goto :ghs_noverchange
669    set CAFE_GHS_VERCMP=%vercmp%
670    set CAFE_GHS_VERSION=%verstr%
671:ghs_noverchange
672    if "%in_v1% %in_v2%" NEQ "%v1% %v2%" (
673	echo "%in_v1% %in_v2% vs %v1% %v2%"
674        echo Warning: %~1 %verstr% version is not supported expect %~2
675	goto :ghs_verok
676    )
677    if "%delta%" GEQ "N" (
678        echo Warning: %~1 %verstr% version is older than %~2
679::    ) else (
680::        echo Info: %~1 %verstr% version is newer than %~2
681    )
682:ghs_verok
683set verstr=
684set vercmp=
685set verbase=
686goto :eof
687
688:check_ghs_version_date
689for /f "usebackq skip=1 tokens=3" %%i in (`"%GHS_ROOT%\gversion" -value 0 %GHS_ROOT%\%~1`) do (
690	set verdatenum=%%i
691)
692if "%~4" == "%verdatenum%" goto :ghs_verdateok
693    for /f "usebackq tokens=6,*" %%i in (`"%GHS_ROOT%\gversion" -nomtime -quiet 1 %GHS_ROOT%\%~1`) do (
694        set verstr=%%i %%j
695	set verbase=%%i
696    )
697    set verstr=%verstr: Nintendo = %
698    set verstr=%verstr%XXXXX
699    set verstr=%verstr:    XXXXX=XXXXX%
700    set verstr=%verstr:  XXXXX=XXXXX%
701    set verstr=%verstr: XXXXX=XXXXX%
702    set verstr=%verstr:XXXXX=%
703    if "%verbase%" == "%verstr%" (
704        set vercmp=%verstr% P0
705    ) else (
706        set vercmp=%verstr%
707    )
708    for /f "usebackq skip=2 tokens=4,*" %%i in (`"%GHS_ROOT%\gversion" %GHS_ROOT%\%~1`) do (
709        set verdatestr=%verstr% %%i %%j
710    )
711    :: remove upto 7 trailing blanks
712    set verdatestr=%verdatestr%XXXXX
713    set verdatestr=%verdatestr:    XXXXX=XXXXX%
714    set verdatestr=%verdatestr:  XXXXX=XXXXX%
715    set verdatestr=%verdatestr: XXXXX=XXXXX%
716    set verdatestr=%verdatestr:XXXXX=%
717    if "%verdatenum%" LSS "%~4" (
718        echo Warning: %~1 %verdatestr% version is older then expected %~2 %~5
719    ) else (
720	echo Info: %~1 %verdatestr% version is newer than %~2 %~5
721    )
722    :: only change if it is not already changed
723    :: this assumes no mixed installations
724    :: and date compares have confusing version strings
725    :: as in v5.0.6 is newer then v5.3.0 P2
726    if "%CAFE_GHS_VERCMP%" == "%CAFE_GHS_VERCMP_EXPECT%" (
727        set CAFE_GHS_VERSION=%verdatestr%
728        set CAFE_GHS_VERCMP=%verdatestr%
729    )
730:ghs_verdateok
731set verstr=
732set verstr2=
733set verdatestr=
734goto :eof
735
736:cygwin_error
737echo Error: Can't find Cygwin. Please set CYGWIN_PATH or use install_cygwin.bat
738pause
739exit /b 1
740goto :eof
741
742:usage
743echo.
744echo ==================================================
745echo NINTENDO CAFE ENVIRONMENT!
746echo ==================================================
747echo.
748echo Usage: %~nx0 [options] [shell command]
749echo.
750echo Options:
751echo    -cafex           Use CafeX to run applications (default)
752echo    -nocafex         Do not use CafeX; uses Cygwin shell scripts
753echo    -multi           Enable multisession CAFE support
754echo    -nomulti         Do not enable multisession support (default)
755echo    -syncsession     Copy per-session files (default)
756echo    -nosyncsession   Do not copy files; data files shared across sessions
757echo    -pcfsoversata    Enable PCFS over SATA (default)
758echo    -nopcfsoversata  Disable PCFS over SATA; use PCFS over SDIO
759echo    -cygwin          Use Cygwin (default)
760echo    -nocygwin        Do not use Cygwin; for running apps only
761echo    -setenv          With -nocygwin, modify the current environment
762echo                     instead of opening a new window for Cafe
763echo.
764echo    -bridge ^<name^> ^<ipaddr^>
765echo                     Temporarily set current bridge for this window
766echo.
767echo    -default         Save these settings for future use
768echo.
769echo Any shell command is executed automatically in the CAFE environment.
770set _USAGE=1
771goto :eof
772
773:END
774
775ENDLOCAL
776