Gigamix Online

懐かしの8bitおもちゃPC「MSX」を骨までしゃぶり尽くそう。MSXの最新ニュース、ブログ、自作ソフトの配布など。

Pana Amusement Cartridge(PAC)のSRAMアクセスに関する技術メモ

 Pana Amusement Cartridge(以後「PAC」と呼称)のSRAM(バッテリーバックアップ)に関する調査結果を書き残しています。随時更新します。

 最終的には拙作DMシステム2での利用を想定しています。

おさらい:PACとは

  • Pana Amusement Cartridgeの略称
  • 書き換え・長期保存可能な総容量 8KBのバッテリーバックアップメモリ(SRAM)がMSX用カートリッジの形状で提供されたもの
  • 主にゲームソフトのセーブデータ保存目的で用いられる
  • カートリッジ内にボタン型電池が装着されており、この電力によってSRAMのデータ保持が可能になっている
  • MSXパソコンを数多く生産していた松下電器(現・パナソニック)の製品だが、MSXの規格としては制定されていない松下電器の独自商品である
  • 中小規模のソフトメーカーがPACのSRAM対応ソフトをリリースしていたが、ソニーやサンヨーなど松下以外のハードメーカーがPACに対して後追い対応することは無かった

https://p.gigamix.jp/devmsx/cg/pac-sram_logo_640x480.png

 PACのSRAMバックアップシステムに対応しているハードウェアおよびソフトウェアには、このロゴマーク掲示されていることがあります。

技術的な特徴

  • 1ブロック 1024バイト(1KB)とし、計8ブロックのリード・ライトが可能(8ブロック目だけ1022バイトに減る)
  • ブロックと言いながら、セグメントの概念は無い。メモリは8KB連続しており、ブロックの途中アクセスやブロックをまたいだ連続アクセスも可能
  • ファイルシステムやコンフリクト保護機能、暗号化機能などのデータ管理機構は一切無い
  • 他アプリとの使用ブロック競合を避けたりする管理フローも仕様もおそらく存在しない
  • 自ソフトの使用区分は自前で検索処理が必要

PACのSRAM対応状況について

↓ 以下の記事に一覧表を掲載しています。 ↓ gigamix.hatenablog.com

PACのSRAMの識別方法・有効化

 SRAMの各ブロックはセグメントやページのような概念で分割されているのではなく8ブロック分リニアに繋がってはいますが、5FFEh と 5FFFh に 4Dh と 69h を 書き込んだ場合のみ有効化されます

  1. 5FFEh と 5FFFh の値を一時保存しておく
  2. 5FFEh と 5FFFh を読み取り、読み取った2つの値が FFh の場合は次へ進む。FFh以外の場合はPACではないので終了する
  3. 5FFEh に 4Dh を書き込み、5FFEh を読み取る。4Dh以外の場合は次へ進む。4Dhの場合はPACではないので一時保存した 5FFEh の値に書き戻して終了する
  4. 5FFFh に 69h を書き込み、5FFEh と 5FFFh を読み取り、読み取った2つの値がそれぞれ 4Dh と 69h の場合はPACである(この時イネーブルされる)。そうでない場合はPACではないので一時保存した 5FFEh・5FFFh の値に書き戻して終了する
  5. PACが認識できない場合は次のスロットを走査して1へ戻る
  6. スロット3-3でもPACが認識できない場合は、PACは存在しないものと判断する

 有効化されたSRAMは、4000h ~ 5FFDh に出現します。

サンプルソースコードはMSX Resource Centerへ ↓ www.msx.org

有効化したPACのSRAMの無効化(切り離し)

  1. 5FFEh に4Dh 以外の値 または 5FFFh に 69h 以外の値を書き込む(一般的に 0 が用いられる)
  2. 【参考】1の後 5FFEh と 5FFFh を読み取り、読み取った2つの値が FFh になれば、無効化が成功しています

 SRAMが無効になっている場合、2つのレジスタは読み取れなくなります。

公式のSRAMデータファイル

 FMPACを挿入した状態でBASICプロンプトで「CALL FMPAC(または _FMPAC)」を実行するとメンテナンスツール「PACコマンダー」が起動します。このツールでSRAMのバックアップ(ファイル保存)・書き戻し・クリア(初期化)等が行えます。

https://p.gigamix.jp/ds2/cg/pac-sram-access_pac-commander.png

 PAC(FM音源非搭載モデル)にはメンテナンスツールが搭載されていませんが、FMPACと同時挿しするとPACのSRAMもメンテナンスできます。

 なお、本体がDisk BASIC環境下でないとSRAMデータをファイルストレージへ保存できません。似非RAMディスクやNextorなど大容量ストレージは利用可能です。

仕様

  • ファイル名
    • ファイル名は任意の英数字8文字(DOS形式)
    • 拡張子は「.PAC」固定
  • データフォーマット
    • データ構造:ヘッダ+ブロックデータ×8
    • データ量:16+1024×7+1022=8206バイト
    • 先頭16バイトに「PAC2 BACKUP DATA」のヘッダ文字列が入る
    • 1ブロック 1024バイトだが、8ブロック目だけは1022バイト

MSX実機用「PAC Saver」

 MSX-DOSの外部コマンドで、PACのSRAMを読み書きできます。

↓ PAC Saverのダウンロードはこちら ↓ www.yo.rim.or.jp

仕様

  • ファイル名:任意だが、拡張子は「.PAC」を推奨
  • データフォーマット
    • データ構造:コメント+1Ah+セーブブロック+ブロックデータ
    • データ量:可変
    • ブロック単位で保存領域を指定できる(最小1・最大8)
    • 1ブロック 1024バイト(8ブロック目も1024バイト。末尾2バイトは 4Dh, 69h)
    • 保存時に個人的認識用コメントとして入力した文字列がそのままデータ先頭に格納され、コメントの末尾に1Ah(EOF)が付加される
      • 1Ahを付与しないとデータの先頭から走査して1Ahが出てくるまで全てコメント扱いになる
    • コメント末尾の1Ahの後に、セーブブロックが1バイト(01h~FFh)付加される
      • bit7 ブロック8(0:データ無し、1:データ有り)
      • bit6 ブロック7(0:データ無し、1:データ有り)
      • bit5 ブロック6(0:データ無し、1:データ有り)
      • bit4 ブロック5(0:データ無し、1:データ有り)
      • bit3 ブロック4(0:データ無し、1:データ有り)
      • bit2 ブロック3(0:データ無し、1:データ有り)
      • bit1 ブロック2(0:データ無し、1:データ有り)
      • bit0 ブロック1(0:データ無し、1:データ有り)
  • データ上には保存したブロック番号が記載されているが、SRAMへ書き戻し(ロード)する際に保存ブロック以外の番号を指定することもできる

MSXエミュレータSRAMデータファイル

 各種MSXエミュレータで用いるSRAMデータは、公式のSRAMデータと全く同一のフォーマットです。

対象エミュレータ

  • openMSX
  • WebMSX

仕様

  • ファイル名
    • openMSXは「pac.pac」及び「fmpac.pac」
    • WebMSXは「PAC SRAM.pac」
  • データフォーマット
    • データ構造:ヘッダ+ブロックデータ×8
    • データ量:16+1024×7+1022=8206バイト
    • 先頭16バイトに「PAC2 BACKUP DATA」のヘッダ文字列が入る
    • 1ブロック 1024バイトだが、8ブロック目だけは1022バイト
    • PAC・FMPACともに同じデータフォーマット
  • openMSXのデータ格納フォルダ
    • PAC:openMSX\persistent\pac\untitled1\pac.pac
    • FMPAC:openMSX\persistent\fmpac\untitled1\fmpac.pac

PACのSRAMの初期化

昨夜PACコマンダーで「クリア(初期化)」したPACのSRAMをファイル保存して中身を見たら「PAC2 BACKUP DATA」というヘッダの後FFhが8ブロック分(1024×7+1022)続くデータだった。これはopenMSXやWebMSXと全く同じフォーマット。こっちが本流だったか。で、FFhで埋めるのが公式のブランク状態なのか。 pic.twitter.com/QxTiNGXQcV — Takashi Kobayashi (@nf_ban) 2024年8月6日

 0xFFを8190バイト(1024×7+1022=8190)連続させたデータが、公式の初期化状態と言えそうです。

拡張BASIC「DMシステム2」での利用

PACSAVEは未だ調査中だけどPACLOADについては原因が判明したかもしれない。まさかの、前述のソースコードのラベルPACRDで即RETになっている件である。PACのSRAMに顔文字を仕込んでおいて、当該アドレスのRETをNOPに変えたらPACのSRAMが読めるようになった😅。機能潰してるじゃん…なぜそんなことに… pic.twitter.com/7GIpbITeEG — Takashi Kobayashi (@nf_ban) 2024年8月6日
PACSAVEもなんとなく原因判明した。機能は生きてるけどPACSAVEで保存対象とするRAMの指定アドレスをページ3以外にすると違う内容が書き込まれる(PACLOADはページ0・2・3に指定可)。実質的にページ3でしかPACのSRAMデータを制御できない状態になっている。まぁ使えないこともないけども~🥴 pic.twitter.com/7sbHDjhe2F — Takashi Kobayashi (@nf_ban) 2024年8月7日

 当クラブでリリースするMSXミドルウェア「DMシステム2」ではPACへのアクセス機能を拡張BASICで提供しておりますが、PACに関して以下の不具合が判明しました。

  1. PACからメモリへの転送(CALL PACLOAD)では、システムインストール時は機能が無効化されているので有効化しなければならない
  2. メモリからPACへのデータ転送(CALL PACSAVE)では、**RAMのページ3以外でPACアクセス機能を使用すると正常に読み書きできない不具合が発生しますので、ご注意ください。

 不具合の内訳と対策については、以下の不具合情報ページをご覧ください。大変申し訳ございません。

↓ DMシステム2の不具合情報ページはこちら ↓ www.gigamix.jp