[1chipMSX]

1chipMSX を勝手に解析

※情報の正確さは保証できません。

・ソフトウェアインターフェース
 CPU である Z80 とのインターフェースは、I/Oポートを経由しています。

 PSG接続ポート
ポート 用途
A0h アドレスラッチ
A1h データライト
A2h データリード

 PSGには、設定レジスタとして 16本のレジスタを持っていますが、
 それらは Z80 のポートにダイレクトに接続されておらず、アドレスラッチ
 とデータリードライトに分けられています(ポートの節約のためかな?)

 (1) PSG内部レジスタに書き込む方法

  アドレスラッチポートに、PSG内部レジスタ番号を書き込む
  ↓
  データライトポートに、PSG内部レジスタに書き込みたい値を書き込む

  BASIC の SOUND 1, 100 に相当する動作を、BASIC の OUT 命令で記述すると
  
  OUT &HA0,1: OUT &HA1, 100
  
 (2) PSG内部レジスタの値を読み込む方法

  アドレスラッチポートに、PSG内部レジスタ番号を書き込む
  ↓
  データリードポートから値を読み出す

  アドレスラッチポートに内部レジスタアドレスを設定すると、データリードポートには
  その設定した内部レジスタが接続され、CPUから値を読み出せるようになります。

・内部動作

(1) アドレスラッチ
 アドレスデコードして A0H なら、単純に指定された値を FF にラッチするだけです。
 それ以降のアドレスでコードで A1H, A2H だと判断された場合は、ラッチしたアドレス
 値でデータセレクトする MUX を介して、内部レジスタの値へアクセスします。

(2) 動作
 内部は、基本的に 56kHz で動作しているようです。
 ただし、トーンの周波数に関しては、56kHz の音程を再生できるように倍速の 112kHz で分周しています。
 ベースクロックである 21MHz が入力されており、これを分周して 56kHz, 112kHz のパルスを作っています。

(3) トーンの周波数
 112kHz を PSG内部レジスタ 0, 1, 2, 3, 4, 5 で設定された分周値で分周したタイミング
 にて、矩形波の H, L を反転させています。
 つまり、分周値を 1 にした場合は、L が 1cycle @ 112kHz, H が 1cycle @ 112kHz となるため、
 音程としては 56kHz の音が鳴ります。

 また、必ず 56kHz の整数分の1の周波数しか再現できないため、音楽の音程という意味では、あまり正確な
 音程を再現できません。

 1 chip MSX では、デクリメントカウンタで実装されています。

(4) 音量
 内部レジスタ 8, 9, 10 に 0〜15 を指定すると矩形波の音量を指定できます。
 周波数分周器で生成した H, L の矩形波に対して、H の時には、指定の音量値。L の時には 0 に置換します。

(5) エンベロープ
 内部レジスタ 8, 9, 10 に 16 を指定するとエンベロープ波形を指定できます。
 エンベロープの波形は、10種類有り、内部レジスタ 13 で選択します。
 エンベロープ波形の波長は、内部レジスタ 11, 12 で指定します。
 発声器は3つありますが、エンベロープ波形及び波長は3つで共通になります。
 エンベロープ使用時は、音量の指定は無視して、エンベロープ演算器によって求められた音量が出力されます。

 1 chip MSX では、エンベロープ波形を演算回路にて算出しています。
 内部レジスタ 13 の 4bit を MSB 側から cont, attack, alter, hold と名付けており、
  cont(continue の略?) は、波形が繰り返される場合に 1、1波長しか再生しない場合は 0 となります。
  attack は、0 の場合は 減少波形、1 の場合は増加波形となります。
  alter は、cont = 1 の場合のみ機能し、偶数周期目の波形が反転する(1) か否(0) か。
  hold は、cont = 1 の場合のみ機能し、2周期目以降を、1周期目の最終値を維持し続ける(1) か否(0) か。
 という意味合いとして、31 〜 0 のデクリメントカウンタとあわせて処理しています。
 カウンタ値が 15〜0 ではなく、31〜0 なのは、bit4 を見ることによって偶数周期目か奇数周期目かを判断
 できるからです。
 デクリメントは、エンベロープ波長で繰り返す分周器にて作られたタイミングによりデクリメントします。

(6) ノイズ
 ノイズは、18bit のM系列乱数にて生成しています。
 乱数器の動作(シフトレジスタ)は、内部レジスタ 6 で指定されたノイズ波長の周期で駆動します。
 乱数器により生成された H, L を、トーンの周波数と OR 合成して音量/エンベロープに掛けます。

(7) 対数変換
 音量は 0〜15 の線形的な指定になっていますが、人間の感覚的に線形的に聞こえるように、対数変換しています。
 1chip MSX では大きな MUX で実装されています。

(8) ミキサ
 演算により求められた3つのトーンの音量を、加算平均して出力しています。

 改造版PSG

[▲上へ]