honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

レトロアーケード PAC-MANを解析する

というわけで、近所のトイザらスで買ってきました。 

一応前から出ていることは知っていたのですが、ちょっと忙しいので見ないふりをしていたレトロアーケード(MICRO PLAYER RETRO ARCADE) PAC-MAN を解析してみました。

実はすでにある程度解析されていて、同一基板、同一FLASHのものをジャンパ設定で5種類のゲームに切り替えられる、というところまではわかっていたようです。

gorigo.exblog.jp

で、どうも内蔵しているゲームがファミコン版(をベースにしたもの)であるため、中身はファミコンだ、などと言われていたのですが、技術的に考えると、中身はファミコンじゃないんですよ。

("ファミコン"はCPUとかSRAMとかVPUとかで構成されているわけで、樹脂モールドされた中にそれがそのまま入っているわけではなく、また表示もNTSCではなくTFT液晶になっています。つまり、これはファミコンではないのです)

そのため、私は実はファミコン版からこの機器用のCPUに移植かなにかしたものが入っていて、ゲームの差し替えなんて全然望めないものである可能性もあり、それを確認するためにどうしても分解して確認する必要があったのです。

 

 

早速分解してみます。先駆者がいるため簡単に分解できました。

f:id:honeylab:20190423101839p:plain


初期ロットはジャンパ部分がむき出しで簡単にROMを切り替えてプレイできたようですが、対策版としてエポキシモールドされてしまっています。

ROMはGD25Q80C、Quad SPI Flashであることが事前にわかっていました。

f:id:honeylab:20190423183620p:plain


時々SPI Flashを読むためにArduinoでリーダを作ったりしていましたが、それが主目的ではないため、今回はAmazonでぽちっと中華リーダ・ライタを買ってみました。

f:id:honeylab:20190423102251p:plain

さて、肝心のSPI Flash、基板につけたままでは読み書きに問題が出る可能性がありますのでいったん取り外します。樹脂モールドがSPI Flashにもかかってしまっているので超音波カッターで基板を傷つけないように削っていきます。

一旦はんだを盛り、吸い取り線でFlashを剥がします。

f:id:honeylab:20190423162801p:plain

汚い!が、問題なし。

 

今回買ったFlashリーダ、親切にも変換基板が2枚もついていました。大変親切!

f:id:honeylab:20190423183031p:plain

変換基板に乗せます。

f:id:honeylab:20190423191356p:plain

リーダのドライバが署名なしのため、bcdeditでWindowsをテストモードにしてドライバを入れ、読み出しソフトを起動し、パラメータを合わせてREADします。

 

読めた!!!!

 

うーん、いきなりBANK0 っていう文字が見えてるけど、これが本体のファームに絡むものなのか、ゲームデータに絡むものなのかわからないな。

とりあえず全文検索NESヘッダを探してみるものの、見つからない。
NES形式ではないのか。とりあえずもうちょっと見てみよう。

COPYRIGHTの文字が見える。生ROMなんだろうか。

じゃぁ本来の生ROMと目コンペアしてみよう…

 

あ、一致するわ。これほんとにファミコン版のROMのバイナリパッチだ。

まじか。

というわけで、NESヘッダがないので非常に見つけにくいんだけど、
既存のROMとの比較で大体の存在位置を確認したのでそれを張っておく。

DIP ROM # hex offset hex size  
0 0 0 40000 ローリングサンダー
1 1 40000 8000 パックマン
2 2 48000 4000 マッピー
3 3 4C000 8000 ディグダグ
4 4 54000 6000 ギャラガ
5 5 5A000 6000 ギャラクシアン

FLASH全体で1MByte(8MBit)だけど、後半512KはFFだったので見てないと思う。
どっかにROMのオフセット表があると思うんだけどまだ見つからない。

そして、吸い出したROMにNESヘッダを付けてエミュレータに読み込ませてみたら

動いたwwww

 

さて、あとはROMを上書きして動かせるかどうかだな…
チェックサムを見てるかどうかとかを見るために一バイトだけ書き換えたりして試してみようかな。

 

 

 

プレステクラシックのカーネルの書き換え方

プレステクラシックのBOOTIMG1,BOOTIMG2パーティションに収められているのはfitImage形式のブートイメージです。

これは、カーネルのバイナリ(ImageやzImage)と、ハードウェア定義であるDTBファイルを収めたものです。

カーネルを書き換えるには新たにfitImage形式のファイルを作り、BOOTIMG1に上書きしてやればいいです。

ただし、失敗するとちょっとやな感じなので、まず確実にもともとのBOOTIMG1のバックアップを取りましょう。

USB経由のスクリプトでも、シリアル経由でUSBメモリに保存してもいいですが、以下の方法でファイルを作り、大事に保存してください。

ただし、私の解釈ではこのファイルはGPLであり、著作権問題は発生しないと思っています。そのため、万が一忘れていたら、誰かにもらってもいいものだと思っています。

さて、どうにかしてシェルにログインします。一度前面USBをポートを使ってBleemSyncをインストールしている場合、BleemSyncのtelnetが簡単ですが、今後カーネルの書き換えやOTG化をした場合、自力で復活を試みれるように、生のシリアル経由で作業する方法も覚えておいたほうがいいと思います。

生のシリアル経由では、dmesgの出力が延々とでて邪魔なことがありますが、心の目で root [enter] でログインし、dmesg -n 1 をタイプすると黙らせることができます。

まずはバックアップです。

以下のコマンドを実行します。USBメモリは /media にマウントされているとします。

  • dd if=/dev/disk/by-partlabel/BOOTIMG1 of=/media/BOOTIMG1_ORIGINAL

root@bleemsync:~# dd if=/dev/disk/by-partlabel/BOOTIMG1 of=/media/BOOTIMG1_ORIGINAL


16384+0 records in
16384+0 records out
8388608 bytes (8.4 MB) copied, 0.191073 s, 43.9 MB/s

 BOOTIMG1 の代わりに /dev/mmcblk0p1 でもいいですが、番号だと間違えやすいです。/dev/disk/by- で[tab]を押して補完しながらやりましょう。

 

さて、カーネルファイルを準備します。

OTG対応、キーボード・マウス無視の、無効化、一部のUSB-Ethernet変換器のドライバを含めたカーネルをここに置きます。

 

www.dropbox.com

 

このカーネルを下のどちらかの方法で焼きます。

  • fastboot経由

本体を開け、fastboot用のパッドをショートしながら背面USBを接続し、fastbootモードに入ります。ホストPC用のfastbootやドライバはどこからか探してきてください。

fastboot flash BOOTIMG1

で書き込みます。パッドを戻し、電源を再接続します。

 

dd if=/media/otg_kernel.image of=/dev/disk/by-partlabel/BOOTIMG1

でOKです。再起動すると新しいカーネルで起動します。

前面USBをポートには何も影響がありませんので、BleemSyncかなにかが動いてる状態で以下のファイルを確認し、正常に書き込めているか確認します。

もしだめな場合、もう一度やり直しましょう。

 

万が一文鎮化してしまった場合

上記の「fastbootで書き込む方法」に準じ、fastbootに入ります。

fastboot flash BOOTIMG1 <BOOTIMG1_ORIGINALのフルパス>

で元のファイルを書き込みます。

 

正常にカーネルが更新されれば、以下の機能が追加されます。

  • キーボードの有効化
  • マウスの有効化
  • 背面USBのOTG(host)対応

ただし、OTGポートをhostとして動作させるには若干の工夫が必要です。

host/deviceの切り替えは以下のコマンドで実行できます。

  •  echo host > /sys/devices/platform/mt_usb/swmode
  •  echo device > /sys/devices/platform/mt_usb/swmode

起動後にうまいこと実行できるよう、起動スクリプトなどに以下の文を追加するといいでしょう。

私は、/usr/bin/start_pman の中に

if [ "$CHG_INFO" -eq "3" ]; then
echo change to hostmode
echo idle > /sys/devices/platform/mt_usb/swmode
sleep 1
echo host > /sys/devices/platform/mt_usb/swmode
sleep 1
fi

が入るようにしました。ちなみに

CHG_INFO=$(cat /sys/module/musb_hdrc/parameters/charger_info)

の値は、通常のUSB-DATAケーブルを使っている場合1が、OTGスプリッタケーブルの場合3が入るようです。これで見分ければいいと思います。

用途によって、どちらか固定でいい場合があると思います。BleemSyncはWebUIを使う関係でDEVICEになる必要がありますが、そのほかのツールで外部USBメモリを差し込めば使えるような場合はHOSTに固定してしまってもいいかもしれません。

 

おまけですが、USB-Ethernetのドライバを含めてあります。

dmesgを確認して、ifconfig eth0 up をすることでUSB-LAN変換が有効になります。

systemd-networkはインストールされていないので、その類の設定方法は使えません。ifconfig で IPアドレスを指定するか、busybox に含まれている udhcpc アプレットIPアドレスを取得します。

USB-LANが有効になれば、telnetftpがRNDISと同じように使えるはずです。

自動スタートアップとしてどっかに置いておくといいと思います。

 

OTGを有効にしていろいろ動かしているデモがこちらです。

 

youtu.be

 

あくまでも、これはOTGに対応したカーネル、というだけなので、OTGを使っていろいろなことを実現するには追加でユーザランドを調整する必要があります。

まぁLinux使えるならいろいろできるでしょう。

OTG機能を使わなくても、マウスとキーボードがちゃんと使えるようになっているので

dosboxやneko projectとかが快適に遊べるようになるんじゃないでしょうか。

(キーボードのESCなどがRetroArchのUIにハンドルされないようにするにはScrollLock(デフォルトのバインド)を押すといいようです。F11でUIのマウスポインタが消えます)

 

こういったカーネル書き換えの方法やプレステクラシックの回路図なんかを載せた同人誌を 4/14 技術書典6 にて頒布します。

f:id:honeylab:20190412160640p:plain

プレイステーションクラシック魔改造日誌」本文白黒 68p ¥1000円

関係者の方は声かけてください 献本しますw

techbookfest.org

4月14日(日) 技術書展 #6 @ 池袋 に出ます

ブログやツイッターで書いていた記事や技術情報をまとめた本になります

こんなにまとめて書くの久しぶりなのでページ数の割に安くしときますたぶん

下のリンク先にサンプルページもあるのでご参考に…

 

techbookfest.org

 

現在のところ、電子化の予定はありません

気合い入れて余るぐらいするつもりではいますが…

 (刷った本が余ったら物理通販の予定です(時代錯誤感))

息子を預けるか引き連れての参加のため、早めに撤収する可能性があります。

 

日時 2019/04/14 (日) 11:00〜17:00
場所 池袋サンシャインシティ2F 展示ホールD(文化会館ビル2F)
主催 TechBooster/達人出版会
一般参加は11時~13時のみ有料

 

イベント詳細は以下のリンクからご確認ください。

techbookfest.org

"TrueBlue Mini Crackhead pack"が届きました

"TrueBlue Mini Crackhead pack"が届きました。

技術的には可能なんだけど、これをほんとに販売する気?と思いつつオーダーして約1カ月。 

100本のゲームを追加する!とは説明されていたけど、本当に何のゲームが入っているかは見てみるまでわかりませんからね…

 

f:id:honeylab:20190326225801p:plain

ほんとに届いたわ。チャイナテープも開封されてない。

中身が本当に入ってるなら税関でハネられるべきものなんだと思う。

中身もそうだけど、普通にプレイステーションのロゴが入ってるだけでアウトだろ…

f:id:honeylab:20190326124311j:plain

f:id:honeylab:20190326230101p:plain

尚、商品名は「adapter」です。

f:id:honeylab:20190326225818p:plain

うん、確かにadapterだな。

f:id:honeylab:20190326214131j:plain

大丈夫かなこれ。

 

というわけで、さっそく開封

 

して、パソコンに差す。

f:id:honeylab:20190326230428p:plain

f:id:honeylab:20190326230516p:plain

Windowsではあかんやつですね。ということはext4か。

Linuxに差す。

f:id:honeylab:20190326230646p:plain  f:id:honeylab:20190326230713p:plain

まぁ思った通りの構成。

気になるのは、LUPDATA.BINの内容。

どうやって解凍するんだっけかな…誰かやってくれるだろ

True Blue PSC Hack dump · GitHub

というわけで、やってもらった。

実は、この商品にBleemSyncかAutoBleemかpsxc_expandrか何かの一部が含まれるんじゃないかと思ったんですが、いろいろごちゃまぜのオリジナルブレンドのようです。

swingflip氏によればBleemSyncの古いコードが多く含まれるとのことです。

 

また、BleemSyncは起動中にUSBメモリに書き込みするためPoweredハブがあったほうがいいですが、読み込みだけで古めのUSBメモリを使うことでそのへんをクリアしているようですね。かしこい。

ちなみに、これが本当にPSCで動くかどうかは興味がないので試してません。

 

せっかくなので分解しよう。

たぶん安物のUSBストレージ

f:id:honeylab:20190326231955j:plain

f:id:honeylab:20190326231707j:plain

f:id:honeylab:20190326231929j:plain

これ、メモリチップにSanDiskって書いてあるけど、それすら信じられないなw…

せっかく2000円で買ったので、64GBのUSBメモリとして使ってみますが、いつまで動くかなw

 

 

 

で、税関に、これはあかんやつやで、って報告したったらいいのかな。

Amazonにも同じの売ってるんだけど、これマジで駄目なやつじゃないか…

 

PSCにUSB無線ドングルのドライバを入れようとしてハマった話

PSCに無線LANUSBを繋ぐ方法を標準化しようと思ってアレコレしている中で、
上手く行かない事象があったので記録しておきます。
多分ここに書いてあるようにすれば解決するし、PSC以外の似た環境でも発生しうることだと思います。

PSCのKernelはSONYからリリースされていて、configも整っているので、
make menuconfigからモジュールを設定してやれば自由にinsmod可能なモジュールを追加することができます。

f:id:honeylab:20190202205126p:plain

なので、適当に手持ちや安価に買える無線LANUSBドライバをコンパイルしてテストしていたのですが、せっかく使おうと思ったTP-LinkのTN-WN725を使うために

RTL8188EUの(stagingですが)ドライバをコンパイルし、insmodしたところカーネルがクラッシュしてしまいました。

[ 134.697838] <1>.(1)[1276:insmod]r8188eu: module is from the staging directory, the quality is unknown, you have been warned.
[ 134.703522] <1>.(1)[1276:insmod]Chip Version Info: CHIP_8188E_Normal_Chip_TSMC_D_CUT_1T1R_RomVer(0)
[ 134.729163] <2>.(2)[1276:insmod]Unable to handle kernel NULL pointer dereference at virtual address 00000004
[ 134.730441] <2>.(2)[1276:insmod]pgd = d96b8000
[ 134.731013] [00000004] *pgd=7f6db835
[ 134.731487] <2>-(2)[1276:insmod]Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[ 134.732416] Modules linked in: r8188eu(C+) mac80211

 検索で引っかかるように↑に貼っておきます。

ぱっと見る感じ、NULLポインタアクセスっぽいのですが、
動作中に不安定なるとかならまだしも、stagingとはいえ、insmodした瞬間に落ちるようなバグが残っているとは思えません。
もしあったとしても、凡バグでちょっといじれば直せそうな気がしたので、
その近くにprintfを入れたり、insmodのパラメータでdebugを指定したりしてみました。

そうすると、どうやら usb_intf.c の

  memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);

 この行で落ちているようです。
メジャーなバグならもっと報告があるはず。ですが、数件レポートがあるだけで
解決したという報告もありません。


その周辺を見てみても、このアドレスを触っている文はありません。
で、pnetdevの型は…

struct net_device *pnetdev  

らしい。
もしかすると、特定のカーネルから急に構造が変わって対応していないのかもしれない、と思ってバージョン違いを見れそうなサイトを見てみました。

https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h

 該当のメンバは

f:id:honeylab:20190202210500p:plain

1926行で宣言されていました。ズルズルっと上にたどってみていると

f:id:honeylab:20190202210622p:plain

ifdefの山…

そして偶然目に止まった

f:id:honeylab:20190202210735p:plain

この CONFIG_WIRESS_EXT

見覚えがある…

そう、昨日家に転がっていたGW-450D をコンパイルしようとして失敗し、検索して見つけた

メモがわりのブログ: Debian Sid + Linux 4.6-rc1でPlanex GW-450D KATANAを使う

を参考にしてこのフラグをセットしていたのだ。

どうやら、一部の無線LANのドライバで使用されるこのメンバを利用するモジュールconfigで選択した際に、このフラグがセットされるようだ。

 

PSCに内蔵されているカーネルではCONFIG_WIRESS_EXTがセットされていないため、構造体メンバの違うカーネルとドライバを組み合わせようとしてクラッシュするのは当然だ。

PSCには普通に考えたら無線LANドライバは入れないからな…
とはいえ、ソースツリーは、なんでそんな事になってるのよ…

今まで似たようなテストをしていてさらっと通っていたのは、多分カーネルも一緒にビルドして書き換えていたのできちんと組み合わせができていたからだと思う。
オリジナルのカーネルに戻していたので初めて気がついた。

というわけで、今後リリースされるカーネルではなにか適当な無線LANドライバをselectしておくことで、insmodできるドライバを増やせるように上記フラグをセットしておくといいんじゃないかな…

BleemSync1.0を使ってプレステクラシックにソフトを追加する(と、バグ回避方法)

modmyclassic.com

1.0はいつ出るんだ、2月30日じゃないのか、と言われ続けてましたが先日ようやくリリースされました。

0.xではUIもなく、手動で配置したゲームイメージを再構築するコンソールアプリと
ペイロードと呼ばれるプレステクラシック上で起動するスクリプト一式で構成されていましたが、
1.0ではWebサーバを内蔵し、USBケーブルでPCに接続するとAndroid Gadget(RNDIS)として認識され、ブラウザからゲームをアップロードできるようになりました。
詳しい使用方法は公式サイトからリンクされているYoutube動画を参考にするといいと思います。

 

ちょっとハマった点として、イメージを作成するときに自動的に .BIN .CUEファイルが作られていたのですが、プレステクラシック側ではどうも小文字拡張子でしか正常に動作しないようです。
そのため、最初はファイル名だけリネームしていたのですが、CUEファイル内にBINファイルの記述があり、こちらもbinに治す必要がありました。
この辺、アップローダで自動でハンドルできるようになるといいんですけどね。

ソースコードは全部公開されているので、誰か直してプルリクするんだ)

 

加えて、現時点では一部の機能(EMMCとUSBに入れたゲームを同時に内蔵メニューに表示させる)に日本タイトル版のコンソールでのみ発生するバグが有り、この機能を有効にしたままでは内蔵メニューの起動すらできない状態になっています。
そのため、公式サイトの使い方を参照した上で、以下のオプションを無効にすることで
USBに入れたメニューのみを表示する方法で使用することができます。

f:id:honeylab:20190126212655p:plain

日本版のプレステミニに含まれるゲームタイトルが格納されたDBのカラムに改行が含まれているせいで、EMMCとUSBのゲームをまとめるスクリプトが想定外の動作をしているようです(一時ファイルにCSVを使用していた)。
日本版以外ではそんなことはないので、昨日実行して詳細にデバッグするまで気づきませんでした。

近々パッチが出るはずですので、それまでは上のオプションを無効にしてください。

はい、というわけでやっとこさBleemSyncで動きましたよ、と。

 

CD-ROM driver On Playstation Classic

It is technical test.It is NOT useful to you.

I Use USB-IDE converter and 5-inch CD-ROM drive.

 

1. Stock kernel is not include scsi/cdrom driver.
 There are drivers for CD-ROM on Playstation Classic default kernel.

Dropbox - cdrom.tar.gz

2.Extract them and copy to working USB or any.

3. on console...

> insmod cdrom.ko
> insmod sg.ko
> insmod sr_mod.ko

4.Plug USB-IDE-CDROM drive to PSC

If insmod succeeded , /dev/sr0 will appear.

5.Mount filesystem

> mount -r -t iso9660 /dev/sr0 /tmp/cdrom/

You can read CD-ROM files on PSC.

f:id:honeylab:20190116001539p:plain

Can I create ISO on PSC... ? what tools...