GMC-4 でラーメンタイマーを作ってみた。


チャルメラの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分経ったら)
エンド音を鳴らしてプログラム終了となっとります。


レジスタ間のデータやりくりが大変で
コードが複雑になってしまったよよよ…;;