ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
[第130回]
●電子サイレンプログラム(2)
前回はもともとTK−80用に書かれた「電子サイレンプログラム」をND80ZV用に書き直したものをお見せしました。
TK−80とND80ZVとはスピーカ出力回路のI/Oアドレスと出力ビットが異なっているため、そこを直したのです。
前回は時間がなくなってしまいましたので、そこまでで終わってしまったのですが、実はそのほかにも直さなければいけないところがあるのです。
いえ。
前回のプログラムでも、もちろんちゃんとND80ZV上で実行され、スピーカからしっかりサイレン音が出力されます。
ただ音が違います(TK−80で実行したときの音を聞いたわけではありませんが、確かな理由から、違うと思います)。
どうして音が違うかといいますと、それはCPUクロックの周波数が違うからです。
TK−80のCPUクロックは手元の資料によりますと約2MHz(2.048MHz)です。
ND80ZVのCPUクロックはその3倍の6MHzです。
つまりND80ZVではTK−80の3倍の速度でプログラムが実行されます。
電子サイレンプログラムは、音の高さ(周波数)をWAITサブルーチンで特定の命令を一定回数実行することで作り出しています。
命令の実行速度が上がれば、WAITサブルーチンの実行時間がそれだけ短くなり、そこで作り出される音の周波数が上がって、高い音が出力されることになります。
電子サイレンプログラムは高い音から段階的に低い音になり、それからまた高い音まで段階的に変化することを繰り返します。
その音がTK−80での場合よりも周波数で3倍高くなるとともに、実はその音の高→低→高のピッチも3倍速くなっていると考えられます。
まあ、ことはただのサイレン音ですから、この高さの音でなければならない、ということはありませんし、またこのピッチでなければならない、ということもないでしょうから、そこまでこだわることもないとは思いますが。
なに。
それほど難しいことでもありませんから。
こだわってしまいました。
これがそのプログラムです。
2011/12/8 21:33 SIREN_2.TXT END=823B ;;; SIREN from "maikon nyumon" for ND80Z3 ;;; ;;; 11.12.8 ; ORG $8200 ; 8200 0650 START:MVI B,50 8202 3EFF LOOP1:MVI A,FF ;TK-80 02 8204 D398 OUT 98 ;TK-80 02 8206 CD2F82 CALL WAIT 8209 3EDF MVI A,DF ;TK-80 00 820B D398 OUT 98 ;TK-80 02 820D CD2F82 CALL WAIT 8210 0B DCX B 8211 78 MOV A,B 8212 FE40 CPI 40 8214 C20282 JNZ LOOP1 8217 3EFF LOOP2:MVI A,FF ;TK-80 02 8219 D398 OUT 98 ;TK-80 02 821B CD2F82 CALL WAIT 821E 3EDF MVI A,DF ;TK-80 00 8220 D398 OUT 98 ;TK-80 02 8222 CD2F82 CALL WAIT 8225 03 INX B 8226 78 MOV A,B 8227 FE50 CPI 50 8229 C21782 JNZ LOOP2 822C C30082 JMP START ; 822F CD3582 WAIT:CALL WAIT1 8232 CD3582 CALL WAIT1 8235 C5 WAIT1:PUSH B 8236 05 WAIT2:DCR B 8237 C23682 JNZ WAIT2 823A C1 POP B 823B C9 RET ; LOOP1 =8202 LOOP2 =8217 START =8200 WAIT =822F WAIT1 =8235 WAIT2 =8236 |
2011/12/8 22:5 SIREN_3.TXT END=8238 ;;; SIREN from "maikon nyumon" for ND80Z3 ;;; ;;; 11.12.8 ; ORG $8200 ; 8200 0650 START:MVI B,50 8202 CD1982 LOOP1:CALL OUTSB 8205 05 DCR B 8206 78 MOV A,B 8207 FE40 CPI 40 8209 C20282 JNZ LOOP1 820C CD1982 LOOP2:CALL OUTSB 820F 04 INR B 8210 78 MOV A,B 8211 FE50 CPI 50 8213 C20C82 JNZ LOOP2 8216 C30282 JMP LOOP1 ; 8219 3EFF OUTSB:MVI A,FF ;TK-80 02 821B D398 OUT 98 ;TK-80 02 821D CD2C82 CALL WAIT 8220 3EDF MVI A,DF ;TK-80 00 8222 D398 OUT 98 ;TK-80 02 8224 CD2C82 CALL WAIT 8227 0D DCR C 8228 C21982 JNZ OUTSB 822B C9 RET ; 822C CD3282 WAIT:CALL WAIT1 822F CD3282 CALL WAIT1 8232 C5 WAIT1:PUSH B 8233 05 WAIT2:DCR B 8234 C23382 JNZ WAIT2 8237 C1 POP B 8238 C9 RET ; LOOP1 =8202 LOOP2 =820C OUTSB =8219 START =8200 WAIT =822C WAIT1 =8232 WAIT2 =8233 |
OUTSBがそのサブルーチンです。
もっともこのようにしたために、巧妙だったDCX B、INX Bが使えなくなってしまいました。
逆に考えれば、DCX B、INX Bを使ったために、ここをサブルーチンにすることができなかった、とも言えます。
私はここはオーソドックスに、Cレジスタをサブルーチン内で使う方が好きです。
なおオリジナルでは一回の高→低→高のサイクルが完了してもとに戻って繰り返すときに、STARTに戻っていますが、これはやはり冗長です。
ここは上のリストのように、LOOP1に戻るべきだと思います。
ワンボードマイコンをつくろう![第130回]
2011.12.9upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る