'// FBF リロケートアセンブルツール Ver.2.3 //
'// (C)2011 Jun Amano

On Error Resume Next

'// 変数宣言 //
Dim strReadLabel(1)

'// オブジェクトの定義 //
Set objShell = CreateObject("Wscript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")

'// ロゴ表示 //
WScript.Echo "** FX-Binary-Filer RR形式ファイル作成支援ツール (Ver.2.2) ***"
WScript.ECho "(C)2010 Jun Amano, All Right Reserved."
WScript.Echo ""

' // 引数の確認 //
Set arg = WScript.Arguments
If arg.Count <> 2 Then 'もしオプションがついていなければ
	WScript.Echo "文法: cscript rrcre.vbs [ソールファイル] [RRファイル名(*)]"
	WScript.Echo "*= RRファイル名は6文字の英数字を指定します。自動的に拡張子(.R)が付与されます。"
        WScript.Echo "例) cscript rrcre.vbs sample.asm TEST"
        WScript.Echo " --> sample.asm のアセンブルを実行し、最終的に「TEST.R」のRR形式のPBFファイルを作成します。"
	WScript.Quit
Else 'オプションがついていれば、一つ目のオプションをパスとして読み込む
	strAsmFilePath = arg(0)
	strRRFileName = UCase(arg(1))
	If Len(strRRFileName) > 6 Then
		WScript.Echo "[エラー] RRファイル名が正しくありません。 6文字までの英数字を指定してください。"
		WScript.Quit (255)
	End If
End If

'// ファイル名処理 ファイル名・拡張子・スクリプトファイルの存在する場所を取得 //
'// Listファイル名 //
strAsmFileName = objFS.GetFileName(strAsmFilePath)
strAsmBaseName = objFS.GetBaseName(strAsmFilePath)
strAsmExtensionName = objFS.GetExtensionName(strAsmFilePath)

'// スクリプトのある場所 //
strScriptPath = objFS.GetParentFolderName(WScript.ScriptFullName)
If Right(strScriptPath,1) <> "\" Then strScriptPath = strScriptPath & "\"

'// 必要ファイルの存在チェック //
If objFS.FileExists(strScriptPath & "hd61.exe") = False Then
	WScript.Echo "[エラー] 'HD61.exe' が見つかりません。"
	WScript.Quit(255)
End If

If objFS.FileExists(strScriptPath & strAsmFilePath) = False Then
	WScript.Echo "[エラー] 指定したソースファイルが見つかりません。"
	WScript.Quit(255)
End If

'// 変数設定 //
If strAsmExtensionName = "" Then
	strRRAsmFilePath =  strScriptPath & strAsmBaseName & "_RR"
Else
	strRRAsmFilePath = strScriptPath & strAsmBaseName & "_RR." & strAsmExtensionName
End If

'// 不要ファイルの削除 //
objFS.DeleteFile strScriptPath & strAsmBaseName & ".bas"
objFS.DeleteFile strScriptPath & strAsmBaseName & ".pbf"
objFS.DeleteFile strScriptPath & strAsmBaseName & ".lst"
objFS.DeleteFile strScriptPath & strAsmBaseName & ".roc"
objFS.DeleteFile strRRAsmFilePath
objFS.DeleteFile strScriptPath & strAsmBaseName & "_RR.lst"
objFS.DeleteFile strScriptPath & strAsmBaseName & "_RR.pbf"

'// HD61.EXE を実行 //

WScript.Echo "ステップ 1 : アセンブル"
Set objWshScriptExec = objShell.Exec(strScriptPath & "HD61.EXE " & Chr(34) & strScriptPath & strAsmFilePath & Chr(34) & " /r") 
Set objStdOut = objWshScriptExec.StdOut 
 
varError = True 
Do Until objStdOut.AtEndOfStream 
	strReadLine = objStdOut.ReadLine 

	If Instr(strReadLine , "HD61700 ASSEMBLER Rev") <> 0 Then
		strHD61VerArray = Split(strReadLine , " ")
		strHD61Ver = Left(strHD61VerArray(3) , 4)
		If strHD61Ver <= "0.42" Then
			WScript.Echo "[エラー] HD61 Rev 0.43 以上のバージョンをご利用ください。"
			Set objWshScriptExec = Nothing
			Set objStdOut = Nothing
			WScript.Quit (255)
		End If
	End If
	
	If Instr(strReadLine , "ERROR CODE") <> 0 Then
		WScript.Echo strReadLine
	End If

	If Instr(strReadLine , "ASSEMBLY COMPLETE, NO ERRORS FOUND") <> 0 Then
		varError = False
		Exit Do
	End If

Loop
Set objWshScriptExec = Nothing
Set objStdOut = Nothing 

'// 不要ファイル削除 その2 //
objFS.DeleteFile strScriptPath & strAsmBaseName & ".bas"

If varError = True Then
	WScript.Echo "[エラー] アセンブルエラーが発生しました。ソースファイルの内容を確認してください。"
	WScript.Quit (255)
End If

WScript.Echo "         ---> 処理終了"
WScript.Echo ""

'// ソースの結合 & 再アセンブル //
WScript.Echo "ステップ 2 : ソースファイルとリロケートデータを結合して再アセンブル"

'// ファイルをコピーする //
Err.Clear
objFS.CopyFile strScriptPath & strAsmFilePath , strRRAsmFilePath , True
If Err.Number <> 0 Then
	WScript.Echo "[エラー] 次のファイルにコピーできませんでした : " & objFS,GetFileName(strRRAsmFilePath)
	WScript.Quit(255)
End If

'// 書き込みファイルをオープンする //
Err.Clear
Set objText = objFS.OpenTextFile(strRRAsmFilePath , 8)
If Err.Number <> 0 Then
	WScript.Echo "[エラー] 次のファイルに書き込みできませんでした : " & objFS,GetFileName(strRRAsmFilePath)
	WScript.Quit(255)
End If

' // リロケート出力ファイルをオープンする //
Err.Clear
Set objRocFile = objFS.OpenTextFile(strScriptPath & strAsmBaseName & ".roc" , 1)
varErr = Err.Number
If varErr <> 0 Then
	WScript.Echo "[エラー] 次のリロケート情報ファイルを開くことができませんでした :" & strAsmBaseName , ".roc"
	WScript.Quit(255)
End If

'// リロケート情報をコピーする //
' 1行読み込む 
strReadAll = objRocFile.ReadAll

' 書き込みファイルへそのまま出力する
objText.WriteLine vbCrLf & strReadAll

objRocFile.Close
set objRocFile = Nothing

WScript.Echo "         ---> 結合完了"

' // 再アセンブル //
Set objWshScriptExec = objShell.Exec(strScriptPath & "HD61.EXE " & Chr(34) & strRRAsmFilePath & Chr(34) & " /p /o " & strRRFileName & ".R") 
Set objStdOut = objWshScriptExec.StdOut 
 
varError = True 
Do Until objStdOut.AtEndOfStream 
	strReadLine = objStdOut.ReadLine 
	
	If Instr(strReadLine , "ASSEMBLY COMPLETE, NO ERRORS FOUND") <> 0 Then
		varError = False
		Exit Do
	End If

Loop
Set objWshScriptExec = Nothing
Set objStdOut = Nothing 

'// 不要ファイル削除 その2 //
objFS.DeleteFile strScriptPath & strAsmBaseName & ".bas"

If varError = True Then
	WScript.Echo "[エラー] 再アセンブルでアセンブルエラーが発生しました。"
	WScript.Quit (255)
End If

WScript.Echo "         ---> 再アセンブル完了"

'// 不要ファイルの削除 その3 //
objFS.DeleteFile strScriptPath & strAsmBaseName & ".lst"
objFS.DeleteFile strScriptPath & strAsmBaseName & ".roc"

'// 終了メッセージ //
WScript.Echo ""
WScript.Echo "-------------------------------------------------------------------------"
WScript.Echo "すべての処理が正しく完了されました。"
WScript.Echo "PBF オブジェクト '" & strAsmBaseName & "_RR.PBF' が作成されました。"
WScript.Echo "-------------------------------------------------------------------------"
WScript.Quit(0)
