ND80K応用プログラム集

B5判 94ページ。2003年5月以降出荷分のND80Kにサービス品として同梱しています。
ND80KをZBK開発セットとともに購入していただいた方には、プログラム(フロッピーディスク)もサービスで同梱しています。

内容を紹介するには実物の一部をそのまま見ていただくのが一番です。以下は実物の一部、内容見本です。
マシン語プログラミングの参考書としてもなかなかのものだと自賛しているのですが、いかがでしょうか。
本書は2部に分かれています。第1部はゲームプログラムです。TK80全盛のころ出版された、岸田孝一著「マイコンゲーム21」(産報出版)からアイデアを勝手に拝借しました(岸田さん。ごめんなさい)。第2部は電子オルゴールプログラムとそのサンプルデータです。目次とそれぞれのはしがきと、ゲームプログラムの一部をそのまま紹介します。



 ND80K応用プログラム集 目次

第1部 ゲームプログラム …………………………………………………………… 1
  はじめに …………………………………………………………………………… 1
bP おはよー ………………………………………………………………………… 4
bQ CRAZY EIGHT ……………………………………………………… 7
bR Hi−Lo ………………………………………………………………………12
bS FLIPFLOP ………………………………………………………………16
bT SWAP …………………………………………………………………………20
bU CATCH ………………………………………………………………………25
bV もぐらたたき ……………………………………………………………………31
bW 神経衰弱 …………………………………………………………………………36
bX WANTED ……………………………………………………………………41
bP0 すごろく迷路 …………………………………………………………………46
bP1 REVERSE ………………………………………………………………52
bP2 ROCK CLIMBING ………………………………………………59
bP3 WILD SEVEN ………………………………………………………65
bP4 MOO …………………………………………………………………………70
bP5 SWAP2 ……………………………………………………………………76
第2部 電子オルゴール ………………………………………………………………82
  はじめに ……………………………………………………………………………82
1 電子オルゴールプログラム ………………………………………………………84
2 電子オルゴールデータ ……………………………………………………………92


第1部 ゲームプログラム
はじめに

 本編はND80Kのためのゲームプログラム集です。
 ND80Kは20年前にNECのTK80とソフトコンパチブルとして発売したND80の後継機種です。
 発売当初はTK80と同じくCPUは8080でしたが、その後Z80を採用し(NECは8085を使ったTK85を発売した)、マイコンがパソコンになって、Windows全盛の今日まで、当時に近い機能のまま今日に至っています。
 その間参考プログラム集の作成も検討はしてきたのですが、世の動きに合わせて私の関心も機械語からアセンブラへ移り(8080アセンブラを自作し、ついでに逆アセンブラも作りこれは後にZ80アセンブラ、逆アセンブラに発展します)、さらにはBASICへと展開していきました。当然のことながらBASICも整数型のBASICからNECのPC8001に刺激されて浮動小数点演算やカラーグラフィック機能をも搭載したBASICの製作とハードの製作という、およそ零細企業にあるまじき狂気のふるまいの中に埋没してしまい、ND80のZ80版であるND80Zも改良を続けながら販売しては来たのですがいつしか惰性に流され、ND80Z参考プログラム集の製作も着手しないまま今日まで来てしまいました。
 ND80KはCPUをZ80から川崎製鉄のKL5C8012に強化するとともに、DOS/Vパソコンと接続してプログラム開発ができる機能(オプション)をも付加して2000年に発売を開始しました。しかし過去からのいきさつからこのボードを作ったものの、今更TK80コンパチでもあるまいし、ということで、勿論あらためて参考プログラムを作る気もありませんでした。
 ところがつい先日(2003年4月)、当社のホームページを見た方から電話をいただき、TK80のシミュレーションソフトが販売されていること、そしてそれを購入したけれども、やはりパソコン上での模擬体験ではなく実物がさわってみたい、というお話しを聞きました。
 さっそくネットで検索して、はじめてそういうものが売られていることを知りました(いかに自分がTK80から離れていたかの証左です)。
 しかし!これはなんなのだ!ふつうシミュレーションとは実物が容易に体験できないものが対象であるはず(たとえば航空機の操縦とか、電車でGOとか)。しかるにたかがワンボードマイコンをバーチャルで体験するとは何たる世の中であるか!ここに実物が、ND80Kがあるではないか!
 もーぜんと闘志がわいてきました。
 参考プログラム集も作ってやろーではないか!と怒りにまかせてゴールデンウィークを棒に振って作成したのが本書です。
 本書中のプログラムのほとんどは、当時出版されていた、岸田孝一著「マイコンゲーム21」(産報出版)からアイデアを拝借しました。この本はいつか参考プログラム集を出すときに参考にしようと思い、本箱の隅に眠っていたものですが、私自身はゲームには興味がなくまたそんなひまもなかったのでプログラムを打ち込んでみることもなくそのままになっていました。
 参考プログラム集を作成しようと思い立ったとき真っ先に頭に浮かんだのが「マイコンゲーム21」でした。
 TK80ソフトコンパチを売り物にしてきたとはいえ、ND80KはTK80とはクロックもメモリ容量も比較にならぬほど速く、そして大容量です。「マイコンゲーム21」のニーモニックは8080(インテル)であるのに対して、ND80KではZ80(ザイログ)ニーモニックです。またZ80は8080に倍加する新しい命令が使えます。当然「マイコンゲーム21」のプログラムをそのまま使うというわけにはいきません。
 またどうせ作るなら、「マイコンゲーム21」で作者が述べているように、こちらもプロのプログラマが作ったらこうなるというところを見せようではないか、と思い至りました。そこでできるだけ「マイコンゲーム21」のゲームプログラムと同じ動作をするプログラムを作ってみることにしました。しかしプロの意地でもあって、参考にしたのは各ゲームの説明部分のみでプログラムリストそのものは読んでいません(説明のみを読んでこの程度のプログラムがすぐに書けないようではプロにはなれません)。
 この参考プログラム集は、そういうわけでプロの意地などという不純な動機でもって作成されたもので、良い教科書となりうるものではないかもしれません。かなりアクの強いテクニックを随所で用いています。このようなテクニックはプログラマとして必ずしも必要なものではありませんから、敢えて学ぶ必要は無いとも思います。こういうクセは知らず知らずのうちに身にしみついてきてしまいます。初心者にはわかりづらいところがあるかもしれません。そこは「意地」に免じてお許しください。できるだけ説明を入れるようにしました。
 もしも「マイコンゲーム21」をお持ちの方でしたら、両方のプログラムを比較することで、同じ動きをするプログラムでも作者が違うこととCPUが8080に対してZ80であることで全く異なっている(多分そのはずです)ことに驚かれると思います。
 「マイコンゲーム21」にはその名の通り21本のゲームが紹介されています。しかしこの参考プログラム集ではそのうち何本かは割愛しました。当時と違いパソコンやTVゲームがあるのですから、8ケタのLEDだけで2次元的なゲームを表現するのは余りに無理があるように感じたからです。
 ND80Kは最近のWindowsパソコンから見たらまるで新幹線と自転車のようですが、しかしながらWindowsパソコンでC++やVisual Basicなどのプログラムを作るのは相当の知識を必要とするのに対し、かえってむずかしいはずの機械語の方が簡単に扱えるように思えます。
 なにはともあれ、レトロなマイコンの世界をじっくりお楽しみ下さい。 


プログラムbQ CRAZY EIGHT

ゲームの説明
 4000番地からRUNするとスピーカからピーと音が出て、LEDが全部消え、キー入力待ちになります。
 ゲームはLED1〜LED8のどこをコンピュータが選ぶか予測してその番号をキー入力するものです。
 1〜8のいずれかのキーを押すとその数に対応するLEDに"8"の下半分が表示されます。次の瞬間にコンピュータが選んだ位置に"8"の上半分が表示されます。もし位置が一致すれば"8"の字が完成しピッピッという断続音とともにその"8"が点滅したあと点灯して静止します。位置が異なれば下半分と上半分が離れて表示されるだけで何もおこりません。続いて残った消灯しているLEDから同じようにコンピュータの選択を予測して、その位置の数をキー入力します。これを繰り返してブランクが全て無くなればゲーム終了です。約2秒後にLEDの右2桁に獲得した点数が表示されます。点数は"8"ができるごとに加算されます。加算される点数はその"8"の表示直前のLEDが消灯している数になります。ゲーム開始直後は全部消灯していますから、最初にうまくヒットして"8"ができれば8点ゲットです。失敗すると2ヶ所が点灯しますから残りは6個で、6点が次の"8"完成によって加算される得点になります。
 数を入力するときに間違えて1〜8以外のキーを押したり、すでに表示済みのLEDを示す数を入力しても無視されます。
 点数表示状態でどこかキーを押すと最初にもどって再びゲームが開始されます。このとき得点もゼロクリアされます。

プログラムの説明
 CPUのレジスタだけでは足りないのでメモリ上にワークエリアを設けます。キー入力位置を記憶するYRADRS(your addressのつもり。名前は自分がわかる適当な名前をつける。これはアセンブラに必要なもので機械語に直してしまえば、ただのアドレスになってしまう。この場合はE800)、LEDの残り消灯数を格納するREST、乱数の作業用にRNDDT、獲得した点数をカウントするCNTRです。
 CNTRは普通のRAMエリアではなくて、システムのデータエリアであるFFF7を指定しています。
[注]ここらへんが機械語プログラムを書くときにアクの強さが出てくるところです。FFF7はLEDの表示用のデータエリアで、このプログラムでは最後の点数表示以外では使用しないのではじめから表示用データエリアをカウンタとして使ってしまおうというわけです。なおこのカウンタは点数を加算し、それを10進で表示するため、バイナリではなくて10進で演算します。
 さてキー入力ですが、1〜8の入力のチェックにCP 09はよいのですが、OR A、JP Zとしないのはなぜでしょう?
 そうする代わりにDEC A、JP Mとしています。
 こういうところにプログラマの性格が現れます。なんともせっかちな…。
 じつはここで入力した数は、そのあとで対応するLEDアドレスを計算するのに使いますが、そこでは1〜8ではなくて0〜7でないと都合が悪いのです。どうせ後でDECするなら、ここでDECを実行して同時に0キー入力も除外してしまおうというささやかなアイデアです。
 なおLEDアドレスの算出は本来は、
LD HL,LED1
LD E,A
LD D,00
ADD HL,DE
 とするべきです。ここでは、ADD A,Lとしています。わかっていてするのはテクニックですが初心者は誤解してしまいます(教科書としては不適切です)。こういうプログラムを書くと学校のテストなら×になるかもしれません。しかし私が先生ならこの設定でこのプログラムは◎をあげます。
 上で例示したプログラムはどんな場合でも通用するプログラムです。初心者はこう書けば間違いありません。しかし今回はデータに一定範囲の条件があります。Aの値は0〜7で、HL=FFF8という条件です。この場合にはADD A,Lでも、OR A,Lでも構いません。
 さてMYTURNでは乱数を使って、コンピュータ側の1〜8を発生させています。実際には上と同じ理由で0〜7を用いています。乱数については後で説明します。
 とにかくサブルーチンRNDをCALLすると、00〜FFの範囲のランダムな数が得られます。その8ビットの数のうち下位3ビットだけを、AND 07で取り出すと0〜7が得られます。プレーヤーが入力した数(YRADRS)と一致すれば"8"になりますが、それ以外ですでに点灯済みのLEDを選択するのは無効ですから、それをチェックして、点灯済みなら乱数発生からやりなおします。
 結果が不一致の場合にはLEDの残りが2つ減りますから、(REST)に対して2回DECを実行します。その結果(REST)=0になったらゲーム終了です。
 結果が一致したらヒットです。HIT:でその処理をします。サウンドの出力と、"8"の点滅表示のあと、点数を加算します。(CNTR)に(REST)を加算します。10進数(BCD)として扱うため10進補正命令、DAAを使っています。
 ではなぜ10進数なのか?なぜ10進補正が必要なのか?
 それは(CNTR)の値を最後にLEDに表示させるためです。通常の2進演算の場合、09+01は0Aになります。これを(CNTR)に入れてLEDにそのまま表示させると、0Aと表示されてしまいます。09+01の加算後にDAAを実行するとAレジスタの値は、10になります。これをそのままLEDに表示すれば10進の計算結果として正しく点数が表示されることになります。
 結果が一致したときは、LEDの残りは1つしか減りません。(REST)に対してDECを1回だけ実行します。その結果(REST)=0になったらゲーム終了です。
 END:がゲーム終了での処理です。ここでやっとCNTRとしてLEDの表示用データレジスタをそのまま使用したわけが明らかになります(なんとずる賢い)。
 データ表示ルーチン200FをCALLすれば何もしなくても点数がLEDの右2桁に表示されます。残りの6桁には無関係な値が表示されてしまいますからLEDレジスタに00を書き込んでLED1〜LED6の表示を消してしまいます。

乱数について
 ゲームではよくサイコロを使います。ところがコンピュータでサイコロを作るのはなかなか大変なのです。本格的な乱数発生の計算方法もいろいろ考案されているらしいのですが、たかがワンボードのゲームのために複雑な計算をするのはちょっと考え物です。といっていいかげんではゲームになりません。一番よいのは乱数表をメモリに入れておくことなのですが、仮にそうしたとしても、そのどこを読むかが問題です。毎回同じアドレスを選択したり、その選択する順序が毎回同じであったりすれば乱数にはなりません。
 ここでは擬似的な乱数表として、ROMに書かれたプログラムの命令コードを利用しています。コードの並びはプログラムとしては意味がありますが、数としてみれば大小順序はばらばらで乱数的と言えます。しかし完全ではなくて、よく使われる命令コードやアドレスは頻繁に現れます。
 乱数発生サブルーチンRNDではなるべくデータが片寄らないように4バイト分のデータをもとにして計算し、また次のアドレスを算出するときも毎回同じ流れにならないようにするため、Rレジスタの値を利用しています。Rレジスタは8080にはない特殊なレジスタで、Z80にダイナミックメモリを接続したとき、そのリフレッシュをZ80自身が行えるように工夫された機能のためのレジスタです(なんだかわからない人にはさっぱりわからないでしょうが、まあ理解する必要はありません)。ともかくプログラムには必要のないレジスタで、00〜7Fの範囲の値をもち、命令実行毎に+1されます。
 RNDの実行結果はまあまあですが、ときとして同じ数がつながったりちょっとできの悪いサイコロになることもあります。とりあえずは簡単なゲーム用ですから、こんなものでしょう。

[注記]以下のLIST部分は実物ではプレーンテキストで作成しているのですが、ホームページに持ってくると文字コードやら書式の関係でタテが不揃いになってしまいます。ちょっと見づらいところもありますが我慢してください。

              2003/5/9 21:1 CRAZY8.TXT
              END=40D1
              ; CRAZY EIGHT for NDZ
              ; 03/05/07 5/9
              ;
              ORG $4000
              YRADRS=$E800
              REST=$E801
              RNDDT=$E810;$E811
              CNTR=$FFF7;=DP4
              LED1=$FFF8
              ;
              DTDPS=$200F
              KEYIN1=$2015
              SOUND=$201B
              TM1M=$201E
              ;
              ;data set
4000 CDB840   START:CALL CLR
4003 AF          XOR A
4004 32F7FF      LD (CNTR),A;DECIMAL COUNTER clear
4007 3E08        LD A,08
4009 3201E8      LD (REST),A
             ;GAME START
400C 3E10       LD A,10;puuuu
400E 060A       LD B,0A
4010 CD1B20   START1:CALL SOUND
4013 10FB       DJNZ START1
4015 CD1520   KEY:CALL KEYIN1
4018 FE09       CP 09
401A D21540     JP NC,KEY
401D 3D        DEC A
401E FA1540     JP M,KEY
             ;keyin position check
4021 3200E8     LD (YRADRS),A;position save
4024 21F8FF     LD HL,LED1
4027 85        ADD A,L
4028 6F        LD L,A
4029 7E        LD A,(HL)
402A B7        OR A
402B C21540     JP NZ,KEY;already used
402E 365C       LD (HL),5C;"low" disp
             ;my turn
4030 CD9A40   MYTURN:CALL RND;1-8 select
4033 E607       AND 07
4035 57        LD D,A
4036 3A00E8     LD A,(YRADRS)
4039 BA        CP D
403A CA5540     JP Z,HIT
403D 7A        LD A,D
403E 21F8FF     LD HL,LED1
4041 85        ADD A,L
4042 6F        LD L,A
4043 7E        LD A,(HL)
4044 B7        OR A
4045 C23040     JP NZ,MYTURN;already used
4048 3663       LD (HL),63;"high" disp
404A 2101E8     LD HL,REST
404D 35        DEC (HL)
404E 35        DEC (HL)
404F C21540     JP NZ,KEY
4052 C38140     JP END
;
4055 21F8FF   HIT:LD HL,LED1
4058 85        ADD A,L
4059 6F        LD L,A
405A 0E05       LD C,05
405C 367F    HIT1:LD (HL),7F;"8" disp
405E 3E17       LD A,17;piii
4060 0603 L     D B,03
4062 CD1B20   HIT2:CALL SOUND
4065 10FB       DJNZ HIT2
4067 3600       LD (HL),00
4069 CDC340     CALL TM02S
406C 0D        DEC C
406D C25C40     JP NZ,HIT1
4070 367F       LD (HL),7F
4072 2101E8      LD HL,REST
4075 3AF7FF      LD A,(CNTR);point up
4078 86         ADD A,(HL)
4079 27         DAA
407A 32F7FF      LD (CNTR),A
407D 35         DEC (HL)
407E C21540      JP NZ,KEY
4081 0614      END:LD B,14;=20 ,2sec wait
4083 CDC640    WAIT:CALL TM01S
4086 10FB        DJNZ WAIT
4088 CD0F20       CALL DTDPS
408B 21F8FF       LD HL,LED1
408E 0606         LD B,06
4090 AF          XOR A
4091 CDBE40   END2:CALL CLR1
4094 CD1520      CALL KEYIN1
4097 C30040      JP START
              ;
              ;ransu
409A E5      RND:PUSH HL
409B D5        PUSH DE
409C 2A10E8     LD HL,(RNDDT)
409F ED5F       LD A,R
40A1 5F        LD E,A
40A2 19        ADD HL,DE
40A3 7C        LD A,H
40A4 E603       AND 03
40A6 67        LD H,A
40A7 7E        LD A,(HL)
40A8 23        INC HL
40A9 86        ADD A,(HL)
40AA 5F        LD E,A
40AB 23        INC HL
40AC 86        ADD A,(HL)
40AD 23        INC HL
40AE 86        ADD A,(HL)
40AF 57        LD D,A
40B0 ED5310E8   LD (RNDDT),DE
40B4 7A        LD A,D
40B5 D1        POP DE
40B6 E1        POP HL
40B7 C9        RET
             ;
             ;LED all clear
40B8 21F8FF   CLR:LD HL,LED1
40BB AF        XOR A
40BC 0608      LD B,08
40BE 77      CLR1:LD (HL),A
40BF 23        INC HL
40C0 10FC      DJNZ *CLR1
40C2 C9       RET
            ;
            ;0.2sec timer
40C3 CDC640  TM02S:CALL TM01S
            ;0.1sec timer
40C6 D5      TM01S:PUSH DE
40C7 1E64      LD E,64;=100
40C9 CD1E20   TM01S2:CALL TM1M
40CC 1D       DEC E
40CD C2C940    JP NZ,TM01S2
40D0 D1       POP DE
40D1 C9       RET
            ;
CLR =40B8      CLR1 =40BE        CNTR =FFF7
DTDPS =200F     END =4081        END2 =4091
HIT =4055       HIT1 =405C        HIT2 =4062
KEY =4015       KEYIN1 =2015      LED1 =FFF8
MYTURN =4030    REST =E801       RND =409A
RNDDT =E810     SOUND =201B      START =4000
START1 =4010    TM01S =40C6      TM01S2 =40C9
TM02S =40C3     TM1M =201E       WAIT =4083
YRADRS =E800


第2部 電子オルゴール
はじめに


 ゲームプログラムを作る過程でスピーカーから音を出す部分をいくつか作りました。しかしみんなピーとかブーとかという情けない音ばかりで、これではいくら小さなスピーカーだといっても、余りにスピーカーがかわいそうではないか、とついスピーカーに同情したのが運のつきで、とんでもない作業にはまってしまいました(おまけにこともあろうにウチのカミさんまで犠牲者にしてしまった!)。
 もともとND80Zの時代から、モニタプログラムの中に電子オルガンという機能は入れてありました。各キーにそれぞれドレミの音が割り当ててあり、キーを押すとその高さの音がスピーカーから出るというものです。
 しかしこれだけでは今ひとつパンチに欠けます。
 やっぱり音楽の演奏だなぁ。そういえばその昔のTK80の応用プログラムにも電子オルゴールらしきものがあったようだったし。最初はパンチの利いたところで、今年は鉄腕アトムの誕生した年だということなので、じゃあ「鉄腕アトム」でいくか、などと考えました。しかし近年はねこもしゃくしも著作権、著作権とやたらうるさくて(昔はおおらかでよかったですよー)、こんな零細企業でもひょっとして訴えられるかもしれない(その方が新聞やテレビに名前が出てただで宣伝になってよいか。オイ、オイ)。
 ここはひとつウチのカミさんを巻き込んでしまうことにしました。彼女はもと小学校の音楽の先生だったのです。
 さっそくインターネットから著作権が切れたと思われる、誰でも知っている短い楽譜を入手して、データの製作にとりかかりました(まだ著作権が切れていないものがありましたら無知なものですからお許しを)。
 余談ですが、こういう場合、たいてい国内の検索は役に立ちません。やっぱり海外のサイトです。yahoo.com(yahoo.co.jpではありません)がお役に立ちます(最近はexciteも横文字でキーワードを入力すると海外のページを表示してくれるようですが、どうせ海外のページを検索するなら、yahoo.comに行った方が早いと思います)。
 電子オルガンのプログラムを利用しようと思ったのですが、長さのデータがうまく入れられないことに気づき、最初から独立したプログラムとして作ることにしました。選択した曲も短いものばかりだったので、2オクターブも出せればよいということで(なーにもわからんので全部カミさんに聞きました)、わりと簡単にプログラムは完成しました。肝心のデータは、さすがもとプロだけあって、こちらが用意した音の高さとコードの表を渡すと、楽譜を見ながらいとも簡単にデータリストを書き上げてしまいました。
 さっそくプログラムとデータを打ち込んで、RUNさせてみると!今までピーとブーだけだったのが、何とミュージックではありませんか!こりゃぁいい。なかなかのものです。そりゃあ今どきのMidiとか何とかには及びもつかないでしょうが、何しろこんな小さなスピーカーから、おまけに振幅一定の方形波しか出していないのですよ!
 しばし感激にひたっていました。思えばそこまでで止めておけば良かったのです。
 「エリーゼのために」がいけなかったのです。何よりも、うちのカミさんがもと音楽の教師だったのがいけなかったのです。つい悪魔のささやきに耳をかたむけてしまいました。
 「エリーゼのために」の作曲者は、何と、かのベートーベンだったのですね。全然、知らなかった(うちのカミさんはどーしてこういう男と結婚する気になったのでしょーか)。
 そこでハタと疑問を感じて、聞かなくてもよいことを聞いてしまったのです。
 「ベートーベンって、ひょっとしてあの「運命」を書いた人か?」(私のことを世間では専門バカと呼んでいるらしい)
 「そうよ」
 「それにしてはちょっと短かすぎるようだが」
 「本当はもう少し長いのよ。ただオルゴールとか着メロとかはみんなここまでね」
 「そーか。そーだったのか。まだ続きがあったんだ。世間のみんなが知らなかっただけなんだ(意味不明。妻も無言)」
 「じゃあ、もし、もしも、全体の楽譜が手に入ったら、全部データに書きかえることができる、か?」
 「多分、手に入ればね。でも2オクターブでは無理ね。4〜5オクターブは必要だと思うし、繰り返しも入れたいし…」
 「う、う、う。それでいこう。それで。すごいぞー。5オクターブか。やるぞー」
 ということで、さっそくプログラムの追加修正にとりかかったのでしたが…。音階データの部分は勿論当初の倍以上にふくれ上がってしまい、プログラムも複雑なものになってしまいました。
 肝心の「エリーゼのために」のデータリストですが、こちらも、その続きの部分というのは結構データが多くて、大変なボリュームになってしまいました。
 いざ出来上がってみてはじめて「やりすぎた」ことに気がつきました。応用プログラムなのですから、はじめに作った短いもので十分だったのです。ところが本人は「改良」したつもりだったので、最初に作った短いプログラムはあっさりと消去してしまって、もう残っていないのです。
 そんなわけで、「エリーゼのために」以外のサンプル曲を演奏するには全く余分な部分が沢山入ったプログラムを入力していただかなくてはいけません。がんばってください。
 そしてせっかくプログラムを入力していただけたのでしたら、ぜひとも「エリーゼのために」もデータを打ち込んで、うちのカミさんの労に応えてやってください。疲れたら途中まででデータの入力を止めてもそこまでは演奏させることができます。途中でデータを止めるときは最後は奇数アドレスで止めて、その次の偶数アドレスにFFを書きます。

HOMEにもどる
ND80Kにもどる