標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第363回]
●また、完成のメールをいただきました
[第361回]で、「トランジスタ技術」誌に以前連載したときの、「連載第1回」のトップページのコピーをお送りいただいたYI様からです。
YI様。おめでとうございます!
ご苦労さまでした。
YI様には、この連載記事の書き始めのころから、折に触れて貴重なアドバイスをいただき、また時には、くじけそうになるところを叱咤激励していただきました。
こころより感謝御礼申し上げます。
今後ともよろしくお願いいたします。
●時間がありません
本日はいっぱい書くことが(書かなくてはいけないことが)あるのですが、今日も一日悪戦苦闘していましたので、どうやらその時間がなくなってしまいそうです。
まずは、「なんでシフトレジスタを使わないの?」から始まって、なんと昔話に突入してしまった件の締めくくりをしなければいけません。
でも、これは、やっぱり今日はムリです。
次回以降に、ということにいたします。
そして、「残りのパーツはどうなっとるのか?はようせんかい!」というお叱りに対する言い訳と現状報告をしなければいけません。
いえ。お叱りのメールなどはぜんぜんいただいておりません。それは私の心の声です。
逆に、無理しなくていいよ、といたわっていただける方もいらっしゃって、親切が身にしみます。
でもまあ。とにかくいいかげんにしなければいけません。
まず結論から申しますと、やっとなんとかなりそうです。
多分、月曜日には全部の方に発送できるのでは、と思います。
で、何をやっておったのか?
ということにつきまして、本日だけでは全部説明は終わらないとは思いますが、順に説明をさせていただきます。
●自動演奏プログラム
今回のこのページの下の方に、TK80回路の操作説明書 6章 応用プログラム があります。
「オハヨー」と「電子オルガン」のプログラムです。
当初は、まあ、この2本でいいじゃないか、と考えていました。
しかし、何か物足りないのですよね。
なんか、こう、もうひとつ、おお、おお、と言っていただけるものがほしい。
じつは、当社のワンボードマイコンND80Kに、サンプロプログラムとして「電子オルゴール」というものをつけています。
そうそう、それがいいのでは。
そうは思ったのですが、実際リストを調べてみると、ダメダ、こりゃあ。
ND80Kは、CPUに川崎製鉄のKL5C80A12を使っています。
Z80互換ですから、まあ、なんとか8080に戻せないこともない。のですけれど、音の発生部分にCPUチップ内臓のタイマーをしっかり使ってしまっているのですよねぇ。
さらにCPUクロックが違いますから、結局最初から作り直しです。
音の高さについては、基本的には「電子オルガン」と同じでいい。
ところが自動演奏の場合には、音の長さ、つうのが必要なのです。
あの、おたまじゃくし、4分音符とか8分音符とかというやつです。
音楽については全くのシロートなのですが、なんでも音の高さは、平均律つうので決まっていて、たとえばオクターブ4の「ラ」は440Hz、もうひとつ上のオクターブ5の「ラ」は880Hzということになっているらしい。
これは、逆算してパルスのHとLをその周波数に合う時間だけ繰り返しだせばよろしい。
しかし、では音の長さはどうするのか?
「電子オルガン」の場合には、キーが押されている間だけ、その周波数のパルスを出せばよいわけですから、長さは全く考慮しなくてよろしい。
しかし、自動演奏となると、そうはいきません。
でも、たとえばプログラムで、ある周波数のパルスを一定回数出力するようにすると、440Hzの音は880Hzの音の倍の長さになってしまうのですよね。
ND80Kでは、そこのところをCPU内臓のタイマーを使って割り込みを発生させることで処理をしていました。
MYCPU80には内臓タイマーなどありません。
どうするか?
そこはそれ、頭は生きているうちに使うもの。なんとか考えて作ってしまいました。
さて、自動演奏プログラムは作ったものの、それだけでは、何もしてくれません。
フレーヤーがあるだけで、CDとかレコードがなければ何にもなりません。
ということは、楽曲データがいるじゃあありませんか。
こういうときには、私の妻の出番です。
彼女はもと小学校の音楽の先生だったのです。
わたしゃ小学校、中学校と、ずっと先生にいじめられてきたから、先生という種族はみんな敵だと思っておりましたのに、なんで敵と結婚などしてしまったのでありましょう。
そうか。捕虜になってしまったのだ。
さすがもとプロだけあって、こういう曲があるといいんだけどなー、と思いつく曲をリクエストすると、なんと、楽譜も見ないで、私が用意したコード表をもとに、いくつかのデータファイルを作成してくれたのでした。
そう書くといともたやすくできてしまったように聞こえますが、なかなかどうして、面倒な作業で、短い曲のデータを1本作るのでも、半日かがりでした(私がやれば、もちろん楽譜を見ながら、そしてそれにド、レ、ミ、とエンピツで書き入れながら、多分数倍の時間を費やすことになったでありましょう)。
できあがったファイルをロードして、さっそく聞いてみましたら、もうこれが、感激なのですよ。
そりゃあ、ただの方形波出力をちっちゃなスピーカーで受けるだけですから、いまどきのMIDIなどとは比べるべくもありません。
でもねぇ。
こうやって聞いてみると、なにか、情が移るんですよね。
なんか健気に、LEDをいっせいにちかちかさせながら、せいいっぱい演奏しているようで…。
この自動演奏プログラムと、曲データファイルはCDROMに入れてお届けいたします。TK80のLOADキーでメモリにロードして、聞いていただくことができます。
もちろん、皆様ご自身で楽譜をもとに、曲データファイルを作成していただくことができます。
どんな曲でも、というわけにはいきませんが、2.5オクターブの音階コードと16分音符から全音符までの長さ(休符も同じ)がありますから、一般的な曲ならたいていデータ化できると思います。
この自動演奏プログラムに関連してもう少し書きたいことがあるのですが、ちょっとやっぱり時間切れのようです。
それはまた次回にいたします。
☆☆☆TK80回路の操作説明の続きです☆☆☆
●MYCPU80(TK80回路)操作説明書 6章 応用プログラム
●1. OHAYO(オハヨー)
このプログラムは中日電工のオリジナルではありません。雑誌だったのか、どういう本に載っていたのかも思い出せません。もちろんプログラムリストなどありません。
確かこんな動作をしてたよねぇ、という感じで作ったのがこのプログラムです。
簡単なプログラムですが、なかなか味があって面白いと思います。
プログラムを入力して、[8][0][0][0][ADRSSET][RUN]とするとコンピュータが起きあがってのそりのそりと歩き始めます(LEDに表示されるのは足跡のみ)。
目をパチパチさせて、それからゆっくりと「おはよー」と声をかけます(言葉は話せませんからLEDにそれもローマ字で表示します)。
このプログラムはそれだけです。
●1.1 プログラムの説明
LEDに0〜F以外のパターンを表示するとか、表示を全部クリアして(0を表示するのではなくて)ブランクにしたいときなどは、LED表示アドレス($FFF8〜$FFFF)に直接書き込みます。各アドレスの8ビットのデータのうち1のビットに対応するLEDのセグメントが点灯し0のビットに対応するセグメントは消灯します。以下のプログラムの中でLED1〜LED8に対してデータを書き込んでいるところは全部この目的で使われています。
;EYE close/openやサブルーチンCLRがその例です。;ASIATO dispと;ohayo dispでは表示するデータを8バイト分用意しておいて、全部の表示を順次置換えています。
サブルーチンCLRは$FFF8〜$FFFFに00を書き込むことでLEDを全消灯しています。
●1.2 プログラムリスト
2009/10/1 14:16 OHAYO.TXT
END=8088
; OHAYO for MYCPU80
; 09/10/1
;
ORG $8000
LED1=$FFF8
LED4=$FFFB
MONRST=$0051
D1=$02DD
;
8000 CD5880 CALL CLR
;ASIATO disp
8003 217980 LXI H,ASIDT
8006 11F8FF LXI D,LED1
8009 0608 MVI B,08
800B CD6580 ASIDP2:CALL TM1S
800E 7E MOV A,M
800F 12 STAX D
8010 23 INX H
8011 13 INX D
8012 05 DCR B
8013 C20B80 JNZ ASIDP2
8016 CD6580 CALL TM1S
8019 CD5880 CALL CLR
801C CD6580 CALL TM1S
;EYE close/open
801F 0603 MVI B,03
8021 211C1C LXI H,$1C1C
8024 113F3F LXI D,$3F3F
8027 22FBFF EYE:SHLD LED4
802A CD6B80 CALL TM025
802D EB XCHG
802E 22FBFF SHLD LED4
8031 EB XCHG
8032 CD6880 CALL TM05
8035 05 DCR B
8036 C22780 JNZ EYE
8039 CD5880 CALL CLR
;ohayo disp
803C 218180 LXI H,OHAYODT
803F 11F8FF LXI D,LED1
8042 0608 MVI B,08
8044 CD6880 OHYDP2:CALL TM05
8047 7E MOV A,M
8048 12 STAX D
8049 23 INX H
804A 13 INX D
804B 05 DCR B
804C C24480 JNZ OHYDP2
804F CD6580 CALL TM1S
8052 CD6580 CALL TM1S
8055 C35100 JMP MONRST
;LED clear
8058 21F8FF CLR:LXI H,LED1
805B 010008 LXI B,$0800
805E 71 CLR2:MOV M,C
805F 23 INX H
8060 05 DCR B
8061 C25E80 JNZ CLR2
8064 C9 RET
;1sec timer/0.5sec timer
8065 CD6880 TM1S:CALL TM05
8068 CD6B80 TM05:CALL TM025
806B D5 TM025:PUSH D
806C C5 PUSH B
806D 0635 MVI B,35;=53
806F CDDD02 TM025_2:CALL D1;4.727MS
8072 05 DCR B
8073 C26F80 JNZ TM025_2
8076 C1 POP B
8077 D1 POP D
8078 C9 RET
;asiato data
8079 43 ASIDT:DB 43
807A 4C DB 4C
807B 43 DB 43
807C 4C DB 4C
807D 43 DB 43
807E 4C DB 4C
807F 43 DB 43
8080 4C DB 4C
;"ohayo---"
8081 3F OHAYODT:DB 3F;O
8082 76 DB 76;H
8083 77 DB 77;A
8084 6E DB 6E;y
8085 3F DB 3F;O
8086 40 DB 40;-
8087 40 DB,40;-
8088 40 DB 40;-
;
ASIDP2 =800B ASIDT =8079 CLR =8058
CLR2 =805E D1 =02DD EYE =8027
LED1 =FFF8 LED4 =FFFB MONRST =0051
OHAYODT =8081 OHYDP2 =8044 TM025 =806B
TM025_2 =806F TM05 =8068 TM1S =8065
●2.1 プログラムリスト
2009/10/9 17:11 sound.txt
END=804D
;;; sound 09.10.1 10.9
;;;
ORG $8000
;
KEY=$0247
;
8000 CD4702 SND:CALL KEY
8003 3C INR A
8004 CA0080 JZ SND
8007 3D DCR A
8008 CD0E80 CALL SNDSB
800B C30080 JMP SND
;
800E F5 SNDSB:PUSH PSW
800F E5 PUSH H
8010 D5 PUSH D
8011 213680 LXI H,SNDTBL
8014 85 ADD L
8015 6F MOV L,A
8016 1E1A MVI E,1A
8018 56 SNDS1:MOV D,M
8019 3E14 MVI A,14
801B D398 OUT 98
801D 00 SNDS2:NOP
801E 00 NOP
801F 15 DCR D
8020 C21D80 JNZ SNDS2
8023 56 MOV D,M
8024 3E04 MVI A,04
8026 D398 OUT 98
8028 00 SNDS3:NOP
8029 00 NOP
802A 15 DCR D
802B C22880 JNZ SNDS3
802E 1D DCR E
802F C21880 JNZ SNDS1
8032 D1 POP D
8033 E1 POP H
8034 F1 POP PSW
8035 C9 RET
;
; SOUND TABLE
8036 7F SNDTBL:DB 7F;so4
8037 77 DB 77;so#4
8038 71 DB 71;ra4
8039 6A DB 6A;ra#4
803A 5F DB 5F;do5
803B 59 DB 59;do#5
803C 54 DB 54;re5
803D 4F DB 4F;re#5
803E 47 DB 47;fa5
803F 43 DB 43;fa#5
8040 3F DB 3F;so5
8041 3B DB 3B;so#5
8042 35 DB 35;ra#5
8043 32 DB 32;si5
8044 2F DB 2F;do6
8045 2C DB 2C;do#6
8046 25 DB 25;mi6
8047 27 DB 27;re#6
8048 2A DB 2A;re6
8049 4B DB 4B;mi5
804A 38 DB 38;ra5
804B 64 DB 64;si4
804C 23 DB 23;fa6
804D 21 DB 21;fa#6
;END
KEY =0247 SND =8000 SNDS1 =8018
SNDS2 =801D SNDS3 =8028 SNDSB =800E
SNDTBL =8036
●2.1 各キーと音との対応
[注記]各音の表示の下の(4)〜(6)はオクターブを示しています。
●2.3 操作
プログラムを入力後、8000番地からRUNさせると、それ以後はキーを押すとその間中キーに対応する高さの音がスピーカから出力されます。
なおモニタサブルーチン0247は、キーの状態を一回だけスキャンしてチェックしどのキーも押されていなければAレジスタにFFHを入れてリターンします。
キーが押されたときはそのキーコード(00H〜17H)をAレジスタに入れてリターンします。
[キー操作例]
次のようにキーを押していってみてください(さて何の曲でしょう?)。
2009.10.15upload
前へ
次へ
ホームページトップへ戻る