チャルメラの1フレーズだけで56ニブルで挫折。
↓
チャルメラ半フレーズでも24ニブル。
↓
ラーメンタイマールーチンを頑張って組んでみるが74ニブル。orz
仕方ないのでこれで一旦妥協。
数字LEDのカウントダウン演出省いて
分チェックも1分おきじゃなく3分経ったらって判断で
尚且つもう少し良いデータやり繰りを見つければ
24ニブル確保出来そう?
RAMEN TIMER
; ;RAMEN TIMER ; START: KA ;キー入力待ち JUMP START ;入力があるまで待機 INIT: TIY 0 ;Yr 値初期化(Y'r 用のもの。15秒毎に1カウント。 ;値が 4 となることで1分経過したことになる) TIA 4 ;メモリ50番地用の値をロード(分表示用の値) AM ;メモリ50番地へ4をストア(分表示用の値) CNTMIN: CH ;15秒カウンタ初期値を Yr から Y'r へ退避(スワップ) TIY 0 ;M- 用に値をロード(データメモリ(50+Yr)である為) TIA 1 ;M- 用に減算値をロード(M- は M-Ar->Ar である為) M- ;メモリ50番地の値より1減算 AO ;残り分を数字LEDへ表示(減算結果値は Ar の中である為) AM ;減算結果値をメモリ50番地へストア(分表示の値) CIA 0 ;3分経過したか確認 JUMP CNTINS JUMP CNTEND ;3分経過してる場合終了処理へ CNTINI: CH ;Ar, Yr 値を裏レジスタへ戻す(スワップ) CNTINS: TIA 6 ;タイマーウエイト用の値(0.7秒分) TIY 1 ;16進なので最初に1加算しておき、 ;15秒カウントしたら桁超えするよう仕向ける CNTSEQ: CAL SHTS ;短いブザー音を鳴らす CAL TIMR ;0.7秒ウエイトする(ブザーと合わせて約1秒。 ;多少実時間より早くなってしまうのはご愛嬌) AIY 1 ;1秒経過毎にカウント JUMP CNTUP ;15秒経過したら(桁超えしたら)15秒カウンタ(上位カウンタ)の増分処理へ JUMP CNTSEQ ;まだ15秒を経過してなければ(下位カウンタ)カウントを続行 CNTUP: CH ;裏レジスタを一時的に表へ AIY 1 ;15秒経過する毎に1カウントアップ CHKMN1: CIY 4 ;1分経過したか確認 JUMP CHKMN2 JUMP CNTMIN ;1分経過してる場合 CHKMN2: CIY 8 ;2分経過したか確認 JUMP CHKMN3 JUMP CNTMIN ;2分経過してる場合 CHKMN3: CIY 0CH ;3分経過したか確認 JUMP CNTINI JUMP CNTMIN ;3分経過してる場合 CNTEND: ;終了処理 CAL ENDS ;エンド音を鳴らす END: ;無限ループにてプログラム終了 JUMP END
address code mnemonic 00 (0000000) 0 KA 01 (0000001) F 0 0 JUMP <00> 04 (0000100) A 0 TIY <0> 06 (0000110) 8 4 TIA <4> 08 (0001000) 4 AM 09 (0001001) 2 CH 0A (0001010) A 0 TIY <0> 0C (0001100) 8 1 TIA <1> 0E (0001110) 7 M- 0F (0001111) 1 AO 10 (0010000) 4 AM 11 (0010001) C 0 CIA <0> 13 (0010011) F 1 A JUMP <1A> 16 (0010110) F 4 5 JUMP <45> 19 (0011001) 2 CH 1A (0011010) 8 6 TIA <6> 1C (0011100) A 1 TIY <1> 1E (0011110) E 9 CAL SHTS 20 (0100000) E C CAL TIMR 22 (0100010) B 1 AIY <1> 24 (0100100) F 2 A JUMP <2A> 27 (0100111) F 1 E JUMP <1E> 2A (0101010) 2 CH 2B (0101011) B 1 AIY <1> 2D (0101101) D 4 CIY <4> 2F (0101111) F 3 5 JUMP <35> 32 (0110010) F 0 9 JUMP <09> 35 (0110101) D 8 CIY <8> 37 (0110111) F 3 D JUMP <3D> 3A (0111010) F 0 9 JUMP <09> 3D (0111101) D C CIY <C> 3F (0111111) F 1 9 JUMP <19> 42 (1000010) F 0 9 JUMP <09> 45 (1000101) E 7 CAL ENDS 47 (1000111) F 4 7 JUMP <47>
このアセンブラの仕様上こうなってしまいました。
8ビットCPUなら構造化した上でもうちょっとマシなコードになりそうだけど。
動作としては
1秒毎に秒を知らせる音が鳴って
1分毎に数字LEDが3→2→1とカウントダウンしていき
表示が0になったら(3分経ったら)
エンド音を鳴らしてプログラム終了となっとります。
レジスタ間のデータやりくりが大変で
コードが複雑になってしまったよよよ…;;