標準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. 電子オルガンプログラム

TK80回路のキーボードを利用して、各キーに対応する高さの音を発生させるプログラムです。
ここでは音の高さが周波数によって決まることを利用し、それぞれの音の高さに対応する周波数のパルスを発生させています。

●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

前へ
次へ
ホームページトップへ戻る