スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MSXメモリマップからみるNRTDRVXとSFG-0xの鳴らし方

●MSXのメモリマップの基本

Z80には64kバイトのメモリ空間しかないので、
メモリを増やすには一部のメモリを切り替えるしかない。

そのため、MSXのメモリ管理はアドレスが4つに分割され、それを切り替える事にしている。

ページ0:0000-3FFF
ページ1:4000-7FFF
ページ2:8000-BFFF
ページ3:C000-FFFF

MSXには各ページの切り替え先として、
基本スロット(プライマリスロット)が4つと
拡張スロット(セカンダリスロット)が4つあり、
最大4x4=16の異なるスロット(メモリ)を各ページに接続することができる。

これらは他のプログラムとの整合性や、ハードウェアの仕様変更に備える為に、
RDSLTやWRSLT、CALSLTなど、BIOSコールによって切り替えることが推奨されている。
ただし、仕様によってBIOSコールによる切り替えにはいくつかの制約がある。

スロットは、本来禁止されているものの、技術的には基本スロットはI/Oポート、
拡張スロットはメモリマップドI/Oとして手動で切り替えるができる。

基本スロットの設定I/Oポートは、C-BIOSのhardware.asmによると、
$A8となっており、読み書き可能(R/W)になっていること。

ビット列と内容は、

76543210
33221100

となっていて、ページ番号が2bitづつ割り当てられている。
ページ2であれば、bit5とbit4であり、(V>>4)&0x03とすると、
現在の基本スロットのページ番号がわかる。

拡張スロットは設定は少し厄介であり、基本スロットのページ3、
$FFFFが拡張スロットの設定アドレスになる。

拡張スロットもR/Wではあるが、読み出し時には設定値は「反転」される。
Z80ではCPL命令を利用すると利用しやすい。
例えば、$24を設定した場合は$DBが読み出される。
なお、この現象は拡張スロットの認識にも利用される。

●制約から難しい事

「厄介」と書いたのはZ80の性質からであり、
Z80のページ3には基本的にスタックが置かれる場所であるということである。

スタックのある場所を切り替えてしまうということは次の命令ができなくなる。

PUSH/POP/CALL/RET

拡張スロットの切り替えを自分で行う場合には、
ページ3のメモリが使えず、スタックポインタがページ3の範囲内にある場合は、
スタックも使えないということで、十分に注意を行う必要がある。

また、動作中のプログラムの実行アドレス(PC)と同一ページの異なるスロットにプログラムと
書き換え先のメモリがある場合も、切り替えが難しいので注意したい。

●NRTDRVのメモリマップ

MSXのメモリ管理に合わせると次のようになる。

ページ0:ドライバ($1800-)
ページ1:曲データ($4000-)
ページ2:曲データ(続き)
ページ3:スタック

●SFG-0xの基本

SFG-0xのFM音源はメモリマップドI/Oとしてスロットに接続されている。

$3FF0:OPMレジスタ
$3FF1:OPMデータ

●どうやってアクセスする?

NRTDRVXの場合、
NRTLOAD.COM(DOSによって$100に配置、実行される)によって
NRTDRV.BINを$1800に読み出し、
NRTDRVX.BINをFDDのワークに衝突しない位置である$C800に読み出す事によって実行される。

NRTDRVX.BINが$C800にあるのは、
ページ0からでは、直接SFG-0xへのアクセスができないためである。
また、常に出現しているメモリなので、スロット切り替えのコストを減らし高速にアクセスできる。

●拡張スロット上のSFG-0xへのアクセス

NRTDRVXの次世代版が仮にあったとして、拡張スロットにあるSFG-0xへアクセスする場合は、
次の手法を取ることが望ましい。

128kbyte以上メモリがある場合、
・ページ1のRAMの別バンクにスロット切り替えルーチンを転送する
・ページ0にそのルーチンへのアクセス機能を置く

ページ1には曲データがあるため、基本的には破壊できない。
そこで別バンクを使うことで曲データを破壊しないようにできる。
ただし、スロット切り替えにはコスト(オーバーヘッド)があるので、注意したい。
スポンサーサイト

コメント

非公開コメント

プロフィール

BouKiCHi

Author:BouKiCHi
ABOUT ME
MAIL:alf_byncyou at hotmail.com

WEB:http://clogging.web.fc2.com/
TWITTER:@bkc_alf

月別アーカイブ

FC2カウンター

ブロとも申請フォーム

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。