雑 tmoteカスタムビルドとガンコン2のOpenFire化進捗
Touch Mote独自ビルド Mayflash Bar対応版
公式の独自拡張版tmoteが公開されているのですが
MayflashBarで使うと、mouse cursorでは左右反転してしまうし
lightbar mouseは移動制限がかかる(四角形)という問題がありまして
issue投げたところ、開発者さんが2IR挙動を
修正してくださいまして無事に解決しました。
ご対応いただき、ほんとうに感謝です。
なおmouse cursorは至近距離可だが実照準とズレるので利用は非推奨
(でも遊ぶには便利)
Lightbar mouseはより離れる必要があるが正確になるそうです
Wiiの照準補正ありゲームと同等とのお話でした。
ダウンロード先
Tmote+4IR+x64+Jan26+v2.rarからはMayflash DolphinBarでも正常動作します
ただし2IRのみの対応になるので、そこは注意が必要です。
GunMote
こちらはTouchmoteのフォーク版で色々強化されています
ただMayflashDolphinBarでの動作確認はほぼされてないようなので
Windowsで使うなら素直にBT+IRLEDにしたほうが良さそう?
OpenFireやGUN4IRはハードルが高いと感じるようならば
4IR(2個のIRLED BAR)でBT経由のwiiリモコン接続が一番手軽なのかもしれません
ただし数百円のIRBARは出力が全く足らないので注意!!
最低でも純正改造かライトガン用の高出力でないとダメっぽいです。
ガンコン2のOpenFire化進捗

むりやりねじ込みました…カメラのケーブル長すぎるんですよ;
あと断線予防にホットボンド流し込みました
なんかセンサーが逆っぽいので要修正なんですけども
まともなIRLEDがまだないので、ボタンの動作確認だけ問題ないのを確認しました
バッファローのマイクロUSBケーブル2mがいい感じにフィットしてくれました。
Sensorstrip
基板屋さんに発注と表面実装へのハンダが必要ですが
IR LEDを自作したい人はこれがいいっぽいですね
〆
とりあえずはひと段落です
IRLEDは面倒なので発注済ですから到着後に検証ですね
今回はばーっと勢いで作れたので良かったですが、近接用パーツも必要かなぁ…






























ディスカッション
コメント一覧
Steam「テクノス ザ・ワールド くにおくん & アーケードコレクション」に収録のSFCタイトルをメモリダンプしたものから切り出すプログラムをChatGPTに作ってもらいました
SFCロムには ROM Checker で表示される”ROMタイトル”があり、LoROMであればその場所から0x7fc0遡れば開始位置となる事から思いついた手法です
事前に対象romの”ROMタイトル”とファイルサイズを調べておく必要があります
ChatGPT以下の質問でPythonプログラムを作ってもらう
「バイナリファイルに対して、特定の文言を検索して開始位置を特定し、その切り出し場所から0x7fc0遡って、指定したサイズを切り出すプログラムを作成して欲しい」
→作ってもらったコードで、出力ファイルサイズを0x100000から0x80000、文字コードを encode(“ascii”) から encode(“ansi”)に変更し、extract-0x80000.pyとして保存
以下のコマンドでダンプファイルから切り出しできました
py extract-0x80000.py “Super Technos World くにおのおでん.DMP” “くにおのおでん.sfc” “クニオノオデン ”
”ROMタイトル”がカタカナだと検出し易いですが、COMBATRIBESのようにアルファベットだと厳しい模様
「MSXマガジン永久保存版3」に収録の アレスタ をメモリダンプから抽出するプログラムをChatGPTに作ってもらいました
ChatGPTへ下記内容で質問
「バイナリファイルで、1番目は0x41、2番目は0x42、5から16番目は0x00である箇所を検索して開始位置を特定し、256キロバイト切り出すプログラムを作成して欲しい」
↓
[MSX-extract-256KB.py]======================================================
def find_and_extract(
input_path: str,
output_path: str,
extract_size: int
):
with open(input_path, “rb”) as f:
data = f.read()
data_len = len(data)
for offset in range(data_len – extract_size + 1):
# 1番目と2番目
if data[offset] != 0x41:
continue
if data[offset + 1] != 0x42:
continue
# 5~16番目がすべて 0x00
if any(data[offset + i] != 0x00 for i in range(4, 16)):
continue
# 条件一致 → 切り出し
extracted = data[offset : offset + extract_size]
with open(output_path, “wb”) as out:
out.write(extracted)
print(f”開始位置: 0x{offset:X} ({offset})”)
return offset
print(“条件に一致するデータが見つかりませんでした”)
return None
# 使用例
if __name__ == “__main__”:
find_and_extract(
input_path=”input.bin”,
output_path=”output.bin”,
extract_size=262144 # 切り出したいサイズ(バイト)
)
============================================================================
↓
ダンプファイル名=input.bin とした上で MSX-extract-256KB.py を実行
→output.bin が出力されるので、アレスタ.rom にリネームして完了です
”切り出したいサイズ”の数値を変える事で他のタイトルでも使用できます
なるほどメモリダンプから切り出すんですね
MSXマガジン永久保存版3はイメージに暗号化かかってると聞いた記憶があったので納得です
投稿ありがとうございます!
ちなみに、Steam「テクノス ザ・ワールド くにおくん & アーケードコレクション」に収録のSFC「くにおのおでん」(512KB)をメモリダンプしたものから切り出すプログラムは以下になります
[extract-0x80000.py]==================================================
import sys
def extract_from_binary(
input_path,
output_path,
search_bytes,
back_offset=0x7FC0,
extract_size=0x10000
):
with open(input_path, “rb”) as f:
data = f.read()
# 文言検索
pos = data.find(search_bytes)
if pos == -1:
raise ValueError(“指定した文言が見つかりませんでした”)
print(f”検索文字列の開始位置: 0x{pos:X}”)
# 切り出し開始位置を計算
start = pos – back_offset
if start len(data):
raise ValueError(“切り出しサイズがファイルサイズを超えています”)
extracted = data[start:end]
with open(output_path, “wb”) as f:
f.write(extracted)
print(f”切り出し開始位置: 0x{start:X}”)
print(f”切り出しサイズ: 0x{extract_size:X}”)
print(f”出力ファイル: {output_path}”)
if __name__ == “__main__”:
# 例:
# python extract.py input.bin output.bin “TARGET”
if len(sys.argv) != 4:
print(“usage: python extract.py “)
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
search_string = sys.argv[3].encode(“ansi”) # 必要に応じて変更
extract_from_binary(
input_path=input_file,
output_path=output_file,
search_bytes=search_string,
back_offset=0x7FC0,
extract_size=0x80000 # ← 任意に変更
)
===================================================================
extract_size=の箇所を変えれば他のファイルサイズに対応可能です
「くにおくんのドッジボールだよ全員集合!」「コンバットライブス」はダメでしたが、他の5つは抽出できました
>Steam「テクノス ザ・ワールド くにおくん & アーケードコレクション」に収録のSFCタイトルをメモリダン>プしたものから切り出すプログラムをChatGPTに作ってもらいました
テクノスのSFCはすべてメモリダンプなどしなくても抽出できます
引き続き、メガドライブのROMをメモリダンプから抽出するプログラムをChatGPTに作ってもらいました
ChatGPTへ質問「バイナリファイルに対して、”SEGA MEGA DRIVE (C)” か “SEGA GENESIS (C)”を検索して開始位置を特定し、その切り出し場所から0x100遡って、指定したサイズを切り出すプログラムを作成して欲しい」
↓
[MD-extract.py]========================================================
import sys
def extract_sega_data(filename, output_filename, size):
pattern1 = b”SEGA MEGA DRIVE (C)”
pattern2 = b”SEGA GENESIS (C)”
with open(filename, “rb”) as f:
data = f.read()
# パターン検索
pos = data.find(pattern1)
if pos == -1:
pos = data.find(pattern2)
if pos == -1:
print(“該当するシグネチャが見つかりませんでした。”)
return
# 開始位置を決定
start = max(0, pos – 0x100)
end = start + size
# 切り出し
chunk = data[start:end]
# 出力
with open(output_filename, “wb”) as out:
out.write(chunk)
print(f”抽出完了: {output_filename}”)
print(f”シグネチャ位置: 0x{pos:X}”)
print(f”切り出し範囲: 0x{start:X} – 0x{end:X}”)
if __name__ == “__main__”:
if len(sys.argv) != 4:
print(“使い方: python extract_sega_rom.py “)
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
extract_size = int(sys.argv[3], 0) # 0x表記も可
extract_sega_data(input_file, output_file, extract_size)
=======================================================================
↓
Steam「Dino Land」のメモリダンプよりMD「超闘竜烈伝ディノランド」を抽出できました
コマンド:py MD-extract.py DINOLAND.DMP “超闘竜烈伝ディノランド.md” 0x80000