tunaでテトリスを吸い出す

 テトリスを吸い出すのにダイオードの向きがわからないけれども、ダイオードは2本だけなので4通り全部試してみればいい。まずは2本とも左向きとして0x30~0x31で試してみるとあっさり吸い出せました。ダイオード実装なしでたまたま吸い出せただけかもしれない。

/* テトリス */
board <- {
	mappernum = 3,
	cpu_rom = {
		size_base = 0x8000, size_max = 0x8000
		banksize = 0x8000
	},
	ppu_rom= {
		size_base = 0x8000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_ramfind = false, vram_mirrorfind = true
};
function cpu_dump(d, pagesize, banksize)
{
	cpu_read(d, 0x8000, 0x4000);
	cpu_read(d, 0xc000, 0x4000);
}
function ppu_dump(d, pagesize, banksize)
{
	cpu_write(d, 0x81d6, 0x30);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8e3f, 0x31);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8ed2, 0x32);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x92b5, 0x33);
	ppu_read(d, 0, 0x2000);
}

tunaでスターソルジャーを吸い出す

 スターソルジャーはna6koさんによると2本ともダイオードが右向きなのでバンク切り替えのデータをwriteするとき、D4とD5は両方ともLowでなければならない。D0とD1は切り替えたいバンクとして、他のビットD2、D3、D6、D7は何でも良いことになる。74161でラッチするときにデータが衝突しないようにwriteするのに都合の良いデータをROMから探します。

/* スターソルジャー */
board <- {
	mappernum = 3,
	cpu_rom = {
		size_base = 0x8000, size_max = 0x8000
		banksize = 0x8000
	},
	ppu_rom= {
		size_base = 0x8000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_ramfind = false, vram_mirrorfind = true
};
function cpu_dump(d, pagesize, banksize)
{
	cpu_read(d, 0x8000, 0x4000);
	cpu_read(d, 0xc000, 0x4000);
}
function ppu_dump(d, pagesize, banksize)
{
	cpu_write(d, 0x8011, 0x00);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8144, 0x01);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8250, 0x02);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8100, 0x03);
	ppu_read(d, 0, 0x2000);
}

tunaでグラディウスを吸い出す

 バンク切り替えについてEnriさんのところに詳しく書かれています。74161は同期4ビットカウンターですが、プリロードを使って4ビット分D0、D1、D4、D5をラッチしているような感じです。Wでロード設定、ROMSELの立ち上がりでD0->A13、D1->A14としてラッチしますから、バンク切り替えするためにはD0とD1とで切り替えたいバンクを指定してwriteすればいいことになります。Enriさんのところにはグラディウスについて、こう書かれています。

バンク#00を選択するには$8ACEに$30を書き込めばCHR$0000~$1FFFがバンク#00になります
バンク#01を選択するには$8AD0に$31を書き込めばCHR$0000~$1FFFがバンク#01になります
バンク#02を選択するには$8ACFに$32を書き込めばCHR$0000~$1FFFがバンク#02になります
バンク#03を選択するには$8AD1に$33を書き込めばCHR$0000~$1FFFがバンク#03になります

そのとおりにanagoのスクリプトを書きます。D4とD5はダイオードがついているので昨日の図で右向きならLowに、左向きならHighにしておけばアドレスバスで競合しないです。グラディウスは2本のダイオードが左向きについているのでしょう、たぶん。バンク切り替えのデータ書き込みはどのアドレスでも良いというわけではなく、グラディウスの場合、ROMがD4、D5ともHighのデータを格納しているところでwriteしないとデータバスで競合します。

/* グラディウス */
board <- {
	mappernum = 3,
	cpu_rom = {
		size_base = 0x8000, size_max = 0x8000
		banksize = 0x8000
	},
	ppu_rom= {
		size_base = 0x8000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_ramfind = false, vram_mirrorfind = true
};
function cpu_dump(d, pagesize, banksize)
{
	cpu_read(d, 0x8000, 0x4000);
	cpu_read(d, 0xc000, 0x4000);
}
function ppu_dump(d, pagesize, banksize)
{
	cpu_write(d, 0x8ace, 0x30);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8ad0, 0x31);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8acf, 0x32);
	ppu_read(d, 0, 0x2000);
	cpu_write(d, 0x8ad1, 0x33);
	ppu_read(d, 0, 0x2000);
}

これで吸い出せました。

kazzo互換tunaでcnrom(mapper 3)を吸い出せない

 BAKUTENDOさんの情報を参考にkazzo互換のtunaを作りました。老眼に手半田はきついです。組み立て後に全然動かない(0xffのデータだけ返ってくる)ので回路を一本一本調べたらやっぱりブリッジがありました。それを治すとmapper0はちゃんと吸い出せる。

 でもmapper3が吸い出せない。手元にあるのはグラディウス、スターソルジャー、テトリス。使っていたcnrom.adは下記の通り。

board <- {
	mappernum = 3,
	cpu_rom = {
		size_base = 0x8000, size_max = 0x8000
		banksize = 0x8000
	},
	ppu_rom= {
		size_base = 0x8000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_ramfind = false, vram_mirrorfind = true
};
function cpu_dump(d, pagesize, banksize)
{
	cpu_read(d, 0x8000, 0x4000);
	cpu_read(d, 0xc000, 0x4000);
}
function ppu_dump(d, pagesize, banksize)
{
	for(local i = 0; i < pagesize; i++){
		cpu_write(d, 0x8000, i);
		ppu_read(d, 0, banksize);
	}
}

 webの検索では、cnrom.adで吸い出せたというものしか見つけることができない。でも自分の環境ではプログラムROMは吸い出せている(CRCがwebの情報と一致)けどキャラクターROMはダメ。エミュレータで起動してみると、ゲームは動いているけれどもちゃんと(w)キャラクターが化ける。
 mapper3のバンク切り替えの仕組みをきちんと理解していなかったということもあるし、anagoのスクリプトの仕様もよくわからない。キャラクターROMのバンク切り替えを自動でしてくれるくらいに思っていたので、ソフトウェアの問題なのかハードウェアの問題なのか切り分けができず悩みました。まだどこかにブリッジやハンダ不良があるかもしれないとか。
 吸い出したバイナリを見てみると0x8000~と同じデータが0xc000~に出てきている。これはバンク切り替えができていないですね。mapper3のバンク切り替え周りの回路は下記のような感じとのこと。ここらへんの信号を見ることにする。

 anagoにはtuna_canという簡易デバッガがついているのでビルドして実行。writeやdumpが個別にできるんですね。これは良い。単発でwriteができる。オシロをつないで書き込み時のD4やD5を見るとROMSELが来たあとにデータが変化しているんです。本来Highのデータwriteなのにレベル的にHighとLowの中間(自分の環境では)Low寄りが見える。カートリッジを外してみるとちゃんとHighで安定。あーこれはプルアップが足らないの?と最初は思ったけど、ROMSELが来てからレベルが落ちるのでコンフリクトですね。

 A11、A12に正しいアドレスがいくためにはD4とD5に正しいデータが出てくるアドレスにwriteしないと書き込みのデータとROMから出てくるデータとが衝突しちゃうと。cnrom.adが何か自動でやってくれるわけではないとそういうことですね。

電気書院の読み放題サービス

 電気書院の読み放題サービスが始まりました。プレオープン記念ということで60日間無料ですので使ってみました。「電験1・2種」のサブスクリプションを契約。すでに所有している本もありますが(koboで買っているので当然ながら)一括管理できるものではないです。

 ブラウザベースで読むことができるものなのですが、うちでは常用に耐えないことが判明しました。ページをしばらく捲っていると突然不安定になります。表示がされなく(真っ白の空白ページに)なったり、なにかバツマークのついたアイコンがページ中央に表示されたりします。ページを戻ったり進んだりすると表示されたり、されなかったり。そのうちにchromeが固まります。タスクマネージャからchromeを殺して再起動しても状況は変わらず。PCの再起動が必要です。おま環かもしれませんけどね。

IPv4アドレスを設定しないとIX2105をNetMeisterに登録できない

 我が家はURの賃貸マンションなのでBB-EASTというプロバイダを利用しています。IPv6をサポートしているので実家とのVPN接続にはIPv6で対向を指定したIX2215を使っています。IX2215を選択したのはCiscoライクでオークションで安く入手できたから。昔(もう10年以上前)仕事でそこそこ使ったことあるのはCiscoとYAMAHAだけなんですよ。Ciscoは高いしファーム入手できないし、YAMAHAも意外と高い。IXシリーズは人気ないのでしょうか、安いですよね。
 v6で対向指定している理由は、BB-EASTはv4ではプライベートアドレスしか貰えないのでVPN的には難しそうだから。v6ならグルーバルアドレスだからDDNSで簡単簡単。

 実家とのVPN速度は100Mbps程度しか出ていないので大きなIX2215ではなくもっと小さいものが欲しかったところ、IX2105を入手できましたので手元で設定を始めました。そうするとNetMeisterにちゃんと登録できない。

ix2105(config)# sh nm inf
NetMeister Client:
Result : Success (20000)
Last Request: 2023/0x/xx 11:04:08
Next Request: 2023/0X/xx 14:53:01 (remain 358388 sec)
Information:
IPv4 Address:
IPv4 Domain :
IPv6 Address: xxxx
IPv6 Domain : xxxx.v6.nmddns.jp
Interval : 168 hour
API-GW:
gpid : xxxx
stid : xxxx
htid : xxxx
Interval : 0 sec
Next Request: 2023/0X/xx 11:25:21 (remain 328 sec)
Status : Unregistered
MQTT:
Interval : 0 sec
Status : Disconnected

 NetMeisterのサイトだとDDNSは登録されているけれども装置としては登録されていない。そういえばIX2215を設定しているときにも同じ状態になったような気がする。VPN設定には問題ない感じで自宅と実家にIX2215を配置したら簡単に(VPNとして)疎通取れたし、装置としても登録されていたのでスルーしていました。

 ログにはNMC.046: Communication failure: CONNECT (update)とでている。検索しても有益な情報には出会えません。v6をまだ良くわかってなくて(IX2105は既設IX2215の内側に居るから)NDプロキシのときのフィルタルールとかが間違っているのか自信が持てず絞り込めない。IX2105(Version 10.2.42)で起こっているのでこれもちょっと違う。以前に起きたような気もするIX2215もVersion 10.7.18なので違うんじゃないかな。

 しばらく検索しててもわからないのでパケットダンプしました。DNSにapi.nw-meister.jpのAとかdeviceif.nw-meister.jpのAAAAとかを要求して通信してるんですよ。なのでinterfaceにv4アドレスを振ってみたらあっさり解決。v6だけだとだめなんですね。v4だけでいけるかは試してないです。

ファイナルファンタジーI-VI ピクセルリマスター Iだけプレイ

 Iをプレイしました。経験値とギル4倍モードでストーリーを追う感じで。ギルは途中でカンストしちゃうのでそこからは1倍にしました。セーブとエンカウントのON/OFFがどこでもできるのはいいですね。ゲームについては、オリジナルの内容を忘れていて普通に迷ったし、楽しめました。
 クリア後のスタフッフロールは日本語(漢字かな混じり)ではなく英語(ローマ字)表記でした。

Synology Virtual MachineへUbuntuインストール時に固まる

 SynologyのNASにVirtual Machineという仮想マシンを作成する機能があるのですが、Ubuntuインストール時に固まります。環境はDS220+、DSM 6.2.4-25556 Update 7、Virtual Machine Manager 2.5.3-9760、使ったイメージはubuntu-22.04.2-live-server-amd64.iso。

 ここの人の情報通り、ビデオカードの設定においてvmvgaがデフォルトですがvgaにすることで正常にインストールできました。

WordPressをアップデートできなかった

 WordPress6.2が利用可能です。今すぐ更新してくださいっていうので、更新しようとするとダウンロードでコケる。SuiteXだとphpのsys_temp_dirの容量制限があるらしく、php.iniを編集して sys_temp_dirをユーザ管理のディレクトリに一時的に変更してアップデートしろとのこと。php.iniの編集は専用のweb UIで編集できます。それで編集しましたけれど反映されないですねぇ。記述が誤っているのか、apacheの再起動かなんかが必要なのかがわからないです。apacheの再起動は共用のサーバだからできないですよね、きっと。そうするとphp.iniを動的に読み込む仕組みがなんかあるんですかね。

 こういうの仕事でやっていたのは10年以上前だから今一つ自信ない。通常はapacheを再起動するんですよね?。SuiteXだとどうするんでしょうか。ちょっとすぐにはわからなかったのですが、なんとかできました。使っているphpが5.6のモジュールタイプでした。用意されているphp.iniの編集UIではCGIタイプのものしかないので設定変更ができてなかったのですね(5.6のCGIタイプを編集してました)。まずphpのバージョンを7.4に変更してphp.iniでsys_temp_dirを編集してアップデートできました。