自作CPU Advent Calendar 2022 3日目
CalicoCPU でラーメンタイマーを作った。
実行を開始してから約180クロック (正確には182クロック) でPORT1のビット0が1になるので、
1Hzのクロックで実行すれば約3分を計ることができる。
2-way Buzzer Board
今回は1Hzという遅いクロックで実行するため、CPUでブザー音を鳴らすことができない。
そこで、HIGHを入力するだけでブザー音が鳴る装置を作った。
それがこの「2-way Buzzer Board」である。
ON/OFFのみの制御でブザーを鳴らす「auto」と、音声信号を入力してブザーを鳴らす「manual」の2種類の端子を用意した。
余った端子には、とりあえずLEDをつけておいた。
今回は、この「auto」の端子をPORT1のビット0に接続して用いる。
プログラム
MikeAssembler 用のプログラムを以下に示す。
ちょうど16バイトに収まった。
target calico
ADDI A, -1
DRIVE 0, A
OUT 0, A
MOVI B, 1
DRIVE 1, B
loop1:
MOVI C, 8
MOVI D, loop2
loop2:
ADDI C, -1
JNZ C, D
SHR A, 1
OUT 0, A
MOVI D, loop1
JNZ A, D
OUT 1, B
MOVI D, end_loop
end_loop:
JNZ D, D
機械語を追加すると、以下のようになる。
00111111 ADDI A, -1
00010110 DRIVE 0, A
00010010 OUT 0, A
01100001 MOVI B, 1
01011110 DRIVE 1, B
loop1:
10101000 MOVI C, 8
11100111 MOVI D, loop2
loop2:
10111111 ADDI C, -1
10011111 JNZ C, D
00001011 SHR A, 1
00010010 OUT 0, A
11100101 MOVI D, loop1
00011111 JNZ A, D
01011010 OUT 1, B
11101111 MOVI D, end_loop
end_loop:
11011111 JNZ D, D
残り時間を表すため、最初にPORT0の8ビットを全て1にする。
内側のループで時間を稼ぎながら、外側のループでPORT0で1になっているビットを減らしていく。
PORT0の全てのビットが0になると、JNZ
命令でジャンプせず、ループから抜けてブザーを鳴らす処理に移行する。
実行の様子
PORT0に Pmod 8LD を、PORT1の下位ビットに 2-way Buzzer Board を接続してプログラムを実行した。
点灯しているLEDの数が減っていき、実行を開始してから約3分後にブザーが鳴った。
1
投稿者の人気記事
-
mikecat
さんが
2022/12/03
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する