デジホリのblog

釣りと自転車とDIYを愛するオヤジのブログ

タグ:ポケコン

そしてPokecom GO(SHARP)も更新しました。
いろいろとUI仕様が難しくて悩みましたが、、、

まずAndroid 10(Q)以降のストレージアクセスポリシーへの対応ですが、
もともとPokecom GOは外部ストレージに"pokecom"ディレクトリを作っていましたが、それができなくなってしまったので、Androidの標準ファイルピッカーを使ってユーザー指定させるようにしました。

アプリ起動画面のところでROMのディレクトリを指定させ、次回からはその設定に従うような感じ。"ACTION_OPEN_DOCUMENT_TREE"を使ってディレクトリ指定しています。

あと、ファイルのLOAD/SAVEに関しても、ファイル選択のところで標準のファイルピッカーを呼び出します。
ちなみに、Android Q以前のバージョンでは、今までの古いUIをデフォルトにしています。

それから、外部キーボードにも対応しました。
最近はWindows11やChrome bookでもAndroidアプリが動くので、ハードキー入力ができないと扱いづらいです。

今回のアップデート(V1.07.01)の紹介ビデオも作りました。



PC-1350を修理したので無性にプログラムを書きたくなり、定番?のパックマンcoffee breakを書いてみた。

エミュレータと実機の両方で動かしているところを動画に収めてみた。



例のBGMも実装しようと思ったんだけど、どうにもマルチスレッドっぽく作れなくて断念。。。
割り込みなし、タイマなしのシングルスレッド状態で、BGM鳴らしながら動かすのは難しいな。そもそもサウンド鳴らすのもPWM制御しないといけないので、うまくできる気がしないなぁ。

あと、キャラクタデータの転送は、今まで何も考えずに普通に IXL/IYS の命令を使っていたんだけど、内部メモリを使って MVWD/EXWD でブロック転送した方が速いことに今更だが気づいた。
これってもしかしたらSC61860使いには常識なのかも。

PC-1350がSAVE/LOADできないのでバラしてみた。

IMG_20210321_151244

そしたら、なんとカセットI/Fのコネクタ部分の配線が切れていた!
何度かバラした時に伸ばしたりしたせいで、半田付け部分が弱くなって切れていたのか。。

ということで、半田付けし直した。
しかし、最近は老眼がひどくて、細かな作業が億劫です。

なんとか修理して復帰しました。LOADもちゃんとできます。よかった!
IMG_20210321_164255


で、最近打ち込んだ Olphous と Anzas を動かしてみました。
これが Olphous
IMG_20210321_173839

こっちは Anzas
IMG_20210321_174242

ちゃんと動いた。
ちなみにコントラストを最大にしても画面が薄い。敵のミサイルがよく見えないな。

やっぱりエミュレータ+ゲームコントローラで動かすのがいいかなぁ。



PC-1245をブラインドROM吸い出ししてみる。

ご存知の通り、PC-1245のメモリマップは、
0x0000-0x1fff 内部ROM
0x4000-0x7fff 外部ROM
0xc000-0xc7fff RAM(2Kしかない!)

特に内部ROMの吸い出し方のロジックはPOEMSのサイトなどを見て欲しい。

1.内部ROMのデータをメモリに転送するマシン語プログラム
2.1をメモリに書き込むのとCSAVEするBASICプログラム
3.1の書き込みエリア0x400(1K)分

これらを0xc000-0xc7fffの中に配置するんだけど、後半の領域はBASIC実行のためのスタックやシステム管理情報に使われるので、実際は0xc600以降(正確には0xc6b0ぐらいからそれ以降)は使えない。
なので、
0xc000-0xc1?? BASICプログラム(大体256byteぐらいに収める)
0xc1a0-0xc1ff マシン語プログラム
0xc200-0xc5ff 1K分のワークエリア
という感じの配置を狙ってみる。

10 POKE &C1A0,&00,&03,&10,&C1,&C0,&84,&18,&07
20 POKE &C1A8,&02,&03,&34,&02,&FF,&34,&00,&01
30 POKE &C1B0,&82,&13,&04,&08,&90,&35,&90,&DB
40 POKE &C1B8,&04,&26,&2F,&0D,&2F,&12,&37
50 POKE &C1C0,&00,&00,&00,&C2
60 A=0
70 BEEP 1:PRINT A
80 POKE &C1C1,A:CALL &C1A0
90 CSAVEM &C200,&C5FF
95 A=A+4:IF A<&20 GOTO 70

このプログラムは前半の内部ROMをワークメモリに書き込むマシン語プログラムを0xc1a0から書き込む処理と、後半の1KずつCSAVEMを8回実行する処理で構成している。
処理の途中でBEEPを鳴らし、PRINT処理(表示は見えないが)で一時停止させる。
ちなみにこのBASICプログラムは256byte(0xc000-0xc100に収まる)。

外部ROMは普通にCSAVEMすればいいだけなので、
10 A=&4000
20 BEEP 1:PRINT A
30 CSAVEM A, A+&fff
40 A=A+&1000:IF A<&8000 GOTO 20
これでいいかな。
一気にCSAVEMしてもいいんだけど、0x1000バイトずつ細切れで4回実施する。

キャプチャしたwavファイルをcload.plでマシン語のバイナリーデータにデコードし、つなぎ合わせればROMイメージの完成。
なお、0x2000-0x3fffはダミーデータで埋めればよく、また、PC-1245の場合は0x0000-0x7fff分があれば事足りる。


ということで、めでたく PC-1245 のブラインドROM吸い出しができることがわかった。
GoogleDriveなどを経由してAndroid端末の所定のフォルダにROMイメージを置きます。

→ /sdcard/pokecom/rom (端末によって微妙にディレクトリ構造が違うけど)
 

Screenshot_20200707_153114


Pokecom GOで動かせば、ROMイメージも救われる(魂は生きている、、なんのこっちゃ)

久々のポケコンネタ。
液晶がダメになったポケコン君が何台かあるんだけど、
IMG_20200706_194702

PC-1245君とPC-1251君
BEEP 1とかするとピッと鳴るので、ダメなのは液晶だけ。
簡単なコマンドならブラインド入力できるから、カセットI/Fでプログラムをロードして実行すればROMの吸い出しぐらいはできそう。
ということで、ブラインドROM吸い出しをやってみました。

【事前確認】
1.ポケコンがコマンドを受け付けること

"B.1"ENTERでピッと鳴ること。("B."はBEEPの省略表現)

2.CLOADができること

例えば、10 BEEP 3みたいな1行プログラムを書いて、bas2wav.plでwavファイルに変換し、ポケコンに転送する。転送後にRUNして動作確認する。(表示が出ないからBEEPの確認ぐらいしかできない)

3.CSAVEMが機能すること

例えば、10 CSAVEM &4000,&4100というプログラムをポケコンに転送(別にキーで打ち込んでもいいけど、正しく入力できる気がしない)し、RUNする。
うまく動くと「ピーーーーー、ギャギャギャ・・・」と可愛い音を出してくれる。

4.CSAVEMのデータをwavファイルにキャプチャしてcload.plでバイナリ変換できること

Audacityのような音声データ編集ソフトを使って「ピーーーーー、ギャギャギャ・・・」をキャプチャする。
必要なところをトリミングしてからwavファイルに書き出す。cload.plでバイナリ変換できることを確認する。


ここまで確認ができれば、動作環境的にはOK。
ということで、ひとつずつやってみる。

必要なものは、
ポケコンとカセットI/F
IMG_20200706_194928

マイク、イヤホン端子のあるパソコン
適当なOS(とりあえずLinux)と音声編集ソフト(とりあえずAudacity)、perlも使えるようにしておく。
Screenshot at 2020-07-06 20-56-15

BASICのソースコードをwavファイルに変換してくれるスクリプト bas2wav.pl はここのサイトのを使います。
wav ファイルをマシン語のバイナリーに変換してくれるスクリプト cload.pl は POEMSのサイトから入手できます。

wavファイルをポケコンに転送するときはCLOADが安定するように音量を調整する。大きめに設定しないとロードでエラーになる。もちろんエラー表示は確認できないので、ロード終了後にプログラムを実行してBEEP音がなることでロード成功を判断する。

一方、ポケコンからPCへのデータ転送も、Audacityの波形をみて入力レベルの調整をする。
ちなみに入力設定は
 サンプリング周波数:8,000Hz
 サンプル形式:16-bit
ファイル書き出し時の形式は WAV(Microsoft) unsigned 8bit PCM です。
ここで書き出した wavファイルは cload.pl にてポケコンのROM形式のバイナリファイルに変換する。

$perl cload.pl -old -o xxx.bin xxx.wav

というような感じだ。
POEMSのサイトでも解説か書かれているので参照されたし。
おいらのサイトでも解説しているので、合わせて見てちょ。

ここまでできたら環境構築はおしまい。
次回はいよいよ実際のROM吸い出しだ!

↑このページのトップヘ