Z80を使用したコール命令を使った電子オルガンのプログラミング方法

このQ&Aのポイント
  • Z80を使用して、キー入力に応じた音を鳴らす電子オルガンのプログラムを書く方法がわかりません。
  • キー入力を常に監視し、押されたキーの内容をAレジスタに格納します。AレジスタがFFHでない場合、対応する音を鳴らします。
  • 具体的なプログラムは4400H番地から書きます。キー入力はCALL 2018H、サウンド出力はAレジスタに対応する値を入力してCALL 201BHを使います。
回答を見る
  • ベストアンサー

Z80に関しての宿題なのですが、

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

質問者が選んだベストアンサー

  • ベストアンサー
  • MOMON12345
  • ベストアンサー率32% (1125/3490)
回答No.3

ジャンプ命令を変えるとかでも良いんですかね。 SUB FFHをADD 1にしてJP Cで判断するとか。 アキュムレータの内容を他のレジスタで保持してみるとか。 高等ワザでは、スタックに戻り番地をあらかじめ入れた上でCALLではなく無条件ジャンプでサブルーチンに飛んでみるとか。

poppoppoppo
質問者

お礼

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

その他の回答 (3)

  • higeG
  • ベストアンサー率22% (4/18)
回答No.4

> 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は比較命令ってなかったんですね)

poppoppoppo
質問者

お礼

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

  • kusa_mochi
  • ベストアンサー率76% (1599/2089)
回答No.2

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

poppoppoppo
質問者

お礼

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

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

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

poppoppoppo
質問者

補足

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

関連するQ&A

  • マイクロプロセッサのZ80について学校で課題がでたのですが、

    マイクロプロセッサのZ80について学校で課題がでたのですが、 5100H番地に50H、5101H番地に10Hをキー入力であらかじめ書き込む。 4200H番地に以下のプログラムを書く。   (1)5100H番地、5101H番地の内容をそれぞれB、Cレジスタに取り込んだ。   (2)AレジスタにBレジスタの内容を転送し、AレジスタとCレジスタを加算し、その結果を5200H番地に格納した。   (3)AレジスタにBレジスタの内容を転送し、AレジスタからCレジスタを減算し、その結果を5201H番地に格納した。   (4)モニタに戻した。  JP  2006H  C30620 アセンブラプログラムーーーーー機械語 (1) LD A , (5100H)ーーーーー 3A0051 LD B , Aーーーーー 47 LD A , (5101H)ーーーーー 3A0151 LD C , A ーーーーー 4F (2)LD A , B ーーーーー 78 ADD A , C ーーーーー 81 LD (5200H) , A ーーーーー 320052 (3)LD A , Bーーーーー 78 SUB A , C ーーーーー 91 LD (5201H) , Aーーーーー 320132 (4)JP 2006H ーーーーー C30620 このプログラムコードの最適化(命令数の削減)を行え。 という課題がでました。どうすればよいかわかりません。どなたかおしえてください。

  • ワンボードマイコンMP-Z80を用いたプログラミング

    今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。

  • ニーモニックを使った命令の2進数表記

    計算機の、ニーモニックを使った命令を二進数表現するという問題なのですが、LOAD、STOREなどのニーモニックについては教科書に載っているのでわかりますが、以降のレジスタ、番地指定などの2進数表現が教科書に具体的に載っておらず、困ってます。 回答宜しくお願いします。 (問題は、r0の内容を300+r1番地に格納する命令です)

  • ワンボードマイコン Z-80のプログラム教えて!

    ワンボードマイコン Z-80のプログラムでわからないプログラムが3つあるので、教えて欲しいんです。 最初は  ORG 0C000H LD  SP、0C100H 最後は RST 38H END と入力するみたいです。 1.テンキーの0を押すとブザーが鳴り、1を押すとブザーが止まる。さらに2を押すとPC-8801のマシン語モニターに戻るというプログラム。 ただし、キーの入力ポートはすべて00Hであり、1を押すとFDHが2を押すとFBHがポートに出力される。またマシン語モニタに戻るにはRST 38H(38H番地へリターン)とすればよい。 2.テンキーの0を押すたびに、ブザーが鳴ったり、止まったりするプログラム。 3.テンキーの0を9回押すとブザーが鳴り、後は1.のプログラムと同じ動作をするプログラム。 よろしければ教えてください!!!

  • ワンボードマイコン Z80

    ワンボードマイコンMP-Z80のプログラムを勉強しているのですが、 次の二つの問題がわかりません。 1)8100(H)番地~813F(H)番地に格納されているデータを 8200(H)番地以降にコピーせよ。 2)8100(H)番地から810F(H)番地に格納されているデータを8ビットの 符号付絶対値表現とみなしたとき、各データを2の補数表現に変換し、 8200(H)番地から格納せよ。 1)は LD HL,8100 LD DE,8200 LD A,40H LD BC,A LDI LDIR HALT でいいのでしょうか。2)はまったくわかりません。 お願いします。

  • MP-Z80(10進数の加算)

    助けてください!全く分かりません MP-Z80で10進数1から10まで加算し、その結果をAレジスタに格納し、A以外のレジスタの内容は保存されるようにするプログラムの作成を教えてください

  • アセンブラで質問があります。

    Aレジスタの値が0(ゼロ)BHのとき、0(ゼロ)AHを実行すると、Zフラグはどのように変化しますか? また、Aレジスタの値が0(ゼロAHのとき、CP 0(ゼロ)AHを実行すると、Zフラグはどう変化しますか?

  • 'Alt+z'キーを押しながらマウスのドラッグを制御する方法

    お世話になっております。 VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。 実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。 どこか、問題個所はありますでしょうか?ご教授お願い致します。 Private Const VK_Z = 90 'Zキー Private Const MOUSE_MOVED = &H1 Private Const MOUSEEVENTF_LEFTUP = &H4 '左ボタンUP Private Const MOUSEEVENTF_LEFTDOWN = &H2 Call keybd_event(&H12, 0, 0, 0)'Altキー押下 Call keybd_event(VK_Z, 0, 0, 0)'Zキー押下 Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'マウス左ボタン Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) 'ボタンを押したまま移動 Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'ボタンを解除

  • CPU、Z80からステート数から命令時間を求める

    マイコンボードACTーZIIを用いて実験を行ったのですがステート数を用いて命令時間の求め方がわかりません。 CPUはZ-80、クロック周期4MHzを用いて以下のプログラムの実行回数とステート数を求めたのですがあっているのでしょうか? だれか、教えてください。 まちがっていた場合、詳しく説明していただけるとうれしいです。 ラベル ニーモニック  ステート数 実行回数 小計(命令時間) LD A, 0FFH 7 1 7 OUT (00H), A 10 1 10 LD B, 0EH 7 1 7 L1: LD C, 0B1H 7 1 7 L2: DEC C       4 3 12 JP NZ, L2 10 3 30 DEC B       4 3 12 JP NZ, L1 10 10 100 LD A, 00H 4 1 4 OUT (00H), A 10 1 10 LD B, 0EH 4 1 4 L3: LD C, 0B1H 4 1 4 L4: DEC C       4 3 12 JP NZ, L4 10 3 30 DEC B       4 3 12 JP NZ, L3 10 10 100 JP 8000H 10 46 460 合計      119 92 821

  • A 8000H

    A 8000H B 3200H C 1100H (1)ADD A,B Aレジスタの内容 フラグCy(Bw),V,S,Z (2)SUB B,C Bレジスタの内容 フラグCy(Bw),V,S,Z この問題の答えが分かりません。 (1)はB200Hで、Cy(Bw),V,S,Zは全部0かなと思っているのですが・・・