電子書籍の厳選無料作品が豊富!

Z80に関しての宿題なのですが、
「コール命令を使った電子オルガン」
キーを入力したら対応する音が鳴るようにプログラミングする。(入力を
常に監視し、FFHでなかったらサウンド出力をする。)プログラムは4400H番地から書く。
 キー入力:CALL 2018Hと呼ぶとAレジスタに押されたキーの内容が入ってくる。
押されないとFFHが入っている。(いずれかのキーが押されるとAレジスタには00Hから17Hまでの対応する値が格納される。)
 サウンド出力:Aレジスタに00Hから17Hを入力してCALL 201BHと呼ぶと対応する音が鳴る。
   (1)キー入力を行った.Aレジスタにキーの内容が入る。
   (2)AレジスタがFFHの場合は(1)に戻る。そうでないときは(3)へ行く。
   (3)Aレジスタの内容により、サウンド出力を行った。
   (4)(1)に戻る。
  
  ニーモニック                       
CALL , 2018H
SUB FFH
JP Z , (4400H) ・・・・(ゼロフラグZが1の時、4400番地にジャンプする。)
ADD FFH
CALL , 201BH
JP 4400H

↑のようにすればよいのですが、なぜなのかいまいちわかりません。異なるコードで実装せよ。とのことなので理解したいです。おしえてください。

A 回答 (4件)

ジャンプ命令を変えるとかでも良いんですかね。


SUB FFHをADD 1にしてJP Cで判断するとか。
アキュムレータの内容を他のレジスタで保持してみるとか。

高等ワザでは、スタックに戻り番地をあらかじめ入れた上でCALLではなく無条件ジャンプでサブルーチンに飛んでみるとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になりました。

お礼日時:2010/05/22 10:50

> 3行目の命令にゼロフラグが1のとき・・とありますが、


> それはAレジスタの演算結果が00Hのとき1になって4400番地に
> ジャンプするとのことですが、それがどんなキー入力
> (00H~17H)のときにおこるのですか?

質問文の中に
> 押されないとFFHが入っている。
> (いずれかのキーが押されるとAレジスタには00Hから17Hまでの対応する値が格納される。)
とありますので、2018Hにあるサブルーチンはキーが押されている間は00H~17Hを
Aレジスタに入れて、キーを離した時はFFHを入れるように作られているのでしょう。

折角なら2018Hのサブルーチン側でキー押下有無をキャリーフラグに立てるような
修正をしたいところですが、サブルーチン側のソースがないので、自ずと修正できる
範囲は限られてくると思います。
(CALL命令の問題というよりも条件分岐の問題でしょうか。)

僕ならSUB FFHとADD A,FFHの2つを両方ともXOR Aに変えるくらいでしょうか。
(Z80のニーモニック表久し振りに見ましたが、Z80は比較命令ってなかったんですね)
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。参考になりました。

お礼日時:2010/05/22 10:52

CPUは人間と違って出来る「判断」が非常に少ないんだ。


判断というよりも条件分岐といった方が分かり易いかな。

その課題の場合、FFhとFFh以外で条件分岐しないといけないことは分かるよね。

その分岐のために「条件付ジャンプ命令」を使っているのだが、その条件(今回の場合Zフラグの内容)を立てるには“その条件を立てる命令を実行する”必要があるんだ。

Z80の命令表をよく見てみよう。
フラグについて「変化する」とか「変化しない」とかが必ず書かれているから。

 【参考】
  http://www.systemax.jp/doc/Z80_inst.html#inst_comp
  http://www.systemax.jp/doc/Z80_inst.html#inst_jump
    • good
    • 0
この回答へのお礼

回答ありがとうございます。URLまでとてもたすかります。

お礼日時:2010/05/22 10:53

懐かしいなあ、Z80だあ。


…宿題と言うことですのでヒントだけ出しておきますね。

んと、それぞれのコマンドのい意味が分かっていますか?
 CALL , 2018H  ・・・・(キー入力監視のためのコール)
 SUB FFH    ・・・・(FFHからAレジスタの値を引く)
 JP Z , (4400H) ・・・・(ゼロフラグZが1の時、4400番地にジャンプする。)
 ADD FFH    ・・・・(Aレジスタに FFHを入力)
 CALL , 201BH ・・・・(音を鳴らす)
 JP 4400H    ・・・・(4400H番地へジャンプ)
この中でイレギュラーな処理というか、質問文の内容と違いところを探せばOK。
そこを他に置き換えてやれば良いです。

この回答への補足

3行目の命令にゼロフラグが1のとき・・とありますが、それはAレジスタの演算結果が00Hのとき1になって4400番地にジャンプするとのことですが、それがどんなキー入力(00H~17H)のときにおこるのですか?すごく浅いとこから理解してませんで、すみません;

補足日時:2010/04/29 15:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!