[FM]FULLMSX for BLOG

詳しいMSXパソコンなどの情報はホームページで!
https://fullmsx.web.fc2.com/

UCODEが更新! テンキーからフリーキーボード10キーから最大20キーに Z80のJR命令で意外な方法?

2011-11-09 20:05:02 | Weblog

 各キーにギター、ピアノの演奏コードを入力してパッド代わりにするFM音源パッドUCODEの更新です。
ギターになるとCを押さえてFを押さえてGを押さえてとなかなかスムーズにはいきません。
「あ~わるい!わるい、Eだった。もう1回たのむ。」と
「おいおい、これで6回目だぞ。もうちょっと練習したほうがいいんじゃない?」となり

「いや、次は何とかするから。」と

フォローしながら練習でも合わせるのは一苦労です;

PCではキーを押すだけでリズムよくスムーズにできます。
今までは数字またはテンキーに演奏コードが最大10キー入りましたが、
今回は20キーまで入れるようにした為にPCの英数キーに対応することにしました。
 画面にはzsxdc…とパッドにするPCのキーボードでキーパッドの並びを作ります。
プリセットでzはC、sはC#という具合に入れていきます。
音は変更できるので、曲によっては演奏コードの配置を変えたり、
Shiftキーを押すと大文字にできますから、使い方によっては便利かもしれません。
FM音源のMMLを変えることで今までどおり音色を選ぶことができます。

近日公開予定です。

こんなことも★

まぁ、これからどうやってアセンブラをプログラミングしようかなと思っています;(えっ?)
他力本願(死語)でSUPER-Xとか、アセンブラできないか考えていますが、
「2パスのディスアセンブラ」という記述があって、
1パス目がCALL 0D030Hが2パス目でCALL JP0001なんか仮ラベルになるのかなと思っていたりしていました。
どちらにしても逆アセンブラは解析用で開発用ではありません。
「例えば00で空けたり、ラベルをメモリに直書きしたら、逆アセンブラで狂ってしまうかも。」
と、このままの方法はあまりよくありません。

何かいい方法がないかと思っていると、「そういえばJR命令ってありましたね?」(おい)
これをループに使えばリロケータブルしやすくなり、ループ元のアドレスが変わる場合の目印のラベルもいらないので便利ですね。
要するにJPは絶対アドレスでJRは相対(リラティブ)アドレスの指定ができます。
リラティブという言葉が馴染まないのでジャンプリターン(JumpReturn)と覚えています。
アドレスが絶対では0D000Hを指定でアドレスのジャンプ先をJP命令で変えることはできません。
それに対して相対は現在処理中のアドレス位置から±10Hというふうにアドレスのジャンプ先はJR命令で変えることができます。
これはBASICにはない機能で、一般的にループなどに使うと便利です。
JR命令はオペコード、引数の2バイト構成でJPに比べて1バイト節約でき、JR命令からのジャンプ先を±128アドレスまで指定できます。

具体的にはD000HにJR命令があるとCF80H~D07FHの範囲でジャンプできます。
一般的にはアセンブラでJR命令からの相対アドレスがハンドアセンブラでわかるのは、かなりの熟練者になります。

引数(パラメータ)は80Hを境にプラスマイナスで指定できます。ただし繰り返し(ループ)処理中の命令を変えると狂ってしまいます。
と、マシン語初心者には厄介な命令ですが、メモリを再配置してアドレスが変わる場合はJR命令を使うと
前例のようなダンプリスト打ち込み時のアドレスの書き直しが不要になりスッキリしますね。

waru:    sub    16
    inc    b                 
    cp    16
    jp    nc,waru

waru:    sub    16
    inc    b                 
    cp    16
    jr    nc,waru

と、ラベルが使えれば変わることになります。逆アセンブラからアセンブラとなると
ちょっとドリル的な反復学習できるプログラムツールを作って試してみたいと思います。
「この場合はJR命令からwaruのアドレスは-6になるのかな。」(ウソ)
そうすると00からデクリメントしていきFF,FE,FD,FC,FB,FAになります。指定のしかたは後でわかります。

Z80はどんな環境でも対応できるCPUと思いますね、たぶんMSXがなくても、ちょっとしたモニタで再配置できそうな感じです。
「簡易モニタに相対アドレスカウンタがあると便利かな…」

というわけで、作りました。これはD030hのアドレスをセットすると括弧内に相対アドレスがカウントされます。

D02E : JR Z,F9hという記述のときには次の命令のアドレスから0になりますので、
2バイトたしてD030hで、ここからF9hはD030hの-7でZフラグがセットの時にD029hにジャンプとわかるようになりますね。パチパチ

ここまでのプログラムを明日ごろ公開していきます。その後はもう少しいろいろと試してみたいと思います。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする