;---------------------------------------
; ledtest.asm
; LED 0.5 秒点灯 0.5 秒消灯の繰り返し
; AT90S1200 + 4MHz レゾネーター
;---------------------------------------
.include	"c:\avrtools\appnotes\1200def.inc"

.def	temp	=r16		;このレジスタからr31まではすべての命令が使える
.def	cnt1	=r17		;PICでcnt1 equ 07hのように記述するのと同じ
.def	cnt2	=r18

;----- 初期設定 -----
	rjmp	reset		;パワーオンリセット この命令は2steps
	reti			;外部割り込みは未使用
	reti			;タイマー割り込みは未使用
	reti			;アナログコンパレータ割り込みは未使用

;----- メインルーチン -----
reset:	ldi	temp,$01		;temp=0b00000001
	out	DDRB,temp		;PB0のみ出力に設定
loop:
	ldi	temp,$01		;temp=0b00000001
	out	PORTB,temp	;PB0をセット(LED点灯)
	rcall	timer		;timerサブルーチンコール この命令は3steps
	rcall	timer		;今回のプログラムでは厳密に0.5秒点灯となっていない
	rcall	timer
	rcall	timer
	ldi	temp,$00		;temp=0b00000000
	out	PORTB,temp	;PB0をリセット(LED消灯)
	rcall	timer		;消灯時間も厳密に0.5秒になっていない
	rcall	timer		;点灯消灯のループステップ数は4004582steps
	rcall	timer		;4004582steps/4=1001145.5usecとなる
	rcall	timer		;つまり 1.0011455 秒周期なのだ
	rjmp	loop		;シミュレータのStopwatchでは1.00sと表示される
				;厳密にステップ数を調整すればぴったり1秒周期
				;が作れると思うが、今回は練習なのでここまでとした
;----- タイマーサブルーチン -----
timer:
	ldi	cnt1,255		;cnt1=255
tlp1:
	ldi	cnt2,196		;cnt2=196
tlp2:
	nop			;cnt1,cnt2の値とnopの組み合わせで時間を調整
	nop
	nop
	nop
	nop
	nop
	nop
	dec	cnt2		;cnt2=cnt2-1
	brne	tlp2		;cnt2がゼロでなければtlp2へ分岐 ゼロの時1stepゼロ以外は2steps
	dec	cnt1
	brne	tlp1
	ret			;この命令は4steps