;///////////////////////////////////////////////////////////////////////
; Program name  : T10ASM.asm
; Descriptions  : Tiny10 アセンブラ TEST
; Micro computer: AVR Tiny10 @内蔵RC発振器1MHz
; Date          : 2011.10.02
; Author        : TAD でんし研 http://homepage2.nifty.com/denshiken/
; E-mail        : denshiken@pc.nifty.jp
;///////////////////////////////////////////////////////////////////////
; 内容
; Tiny10の動作テスト
;///////////////////////////////////////////////////////////////////////
.nolist
.include "tn10def.inc"
.list
.listmac

;*****************************
;* Global Register Variables *
;*****************************
.def	temp		= r16
.def	data		= r17
.def	cnt		= r18

.def	bps		= r19			; ボーレート,timer用
.def	bps_bak		= r20			; UART_dly用

;******************
;* Program MACROS *
;******************
.macro	outp
	ldi	temp,@1
	out	@0,temp
.endmacro

;*********************
;* Interrupt Vectors *
;*********************
.cseg						;code segment
.org	0
	rjmp	reset				;reset handler
	reti		;int0			;external interrupt0
	reti		;pcint0			;I/O pin change
	reti		;tim0_capt		;timer0 capture
	reti		;tim0_ovf		;timer0 overflow
	reti		;tim0_compA		;timer0 comp-A
	reti		;tim0_compB		;timer0 comp-B
	reti		;ana_comp		;analog comp
	reti		;watchdog		;watchdog timer
	reti		;vlm			;voltage level monitor
	reti		;adc			;A/D convert

;***************************************************************************
;*	RESET & MAIN
;***************************************************************************
reset:
;	cli					;int disable
;	wdr					;Watchdog Reset
	outp	SPL,RAMEND			;set stack pointer

;	outp	CCP,$D8				;変更保護
;	outp	CLKMSR,0x00			;内蔵8MHz

;	outp	CCP,$D8				;変更保護
;	outp	CLKPSR,0x03			;分周1MHz

		;|-----|-----|-----|-----|-----|------|------|------|
		;| PB  | PB  | PB5 | PB4 | PB3 | PB2  | PB1  | PB0  |
		;| xxx | xxx | xxx | xxx |(RST)| LED3 | LED2 | LED1 |
		;|-----|-----|-----|-----|-----|------|------|------|
main:
	outp	DDRB,0x07			;１で出力
	ldi	data,0x08			;reset=プルアップ
;	sei					;int enable

main_loop:
	ori	data,0x03			;PB1,PB0=H
	rcall	tr250sw

	andi	data,0xFC			;PB1,PB0=L
	rcall	tr250sw
	rjmp	main_loop

;***************************************************************************
;*	リセット(PB3)ポートの入力テスト付きソフトタイマー
;***************************************************************************
tr250sw:
	ldi	cnt,10
tr250lp:
	sbic	PINB,3				;resetポートの入力をPB2へ出力
	rjmp	tr250H
	andi	data,0xFB			;PB2=L
	rjmp	tr250jr
tr250H:
	ori	data,0x04			;PB2=H
tr250jr:
	out	PORTB,data			;ここでout
	rcall	tr25ms
	dec	cnt
	brne	tr250lp
	ret

;***************************************************************************
;*	ソフトタイマー
;***************************************************************************
timer:					;1mS単位 temp=5なら5mS
	tst	temp
	breq	timend			;ゼロは0mS
tim1ms:
	ldi	bps,27			;(1MHz*1mS)/38=26.3より多め
timlop:
	rcall	timend			; 7clock
	rcall	timend			;14
	rcall	timend			;21
timjp:	rcall	timend			;28
	rcall	timend			;35
	dec	bps			;36
	brne	timlop			;38
	dec	temp
	brne	tim1ms
timend:
	ret

tr25ms:					;単なるフラッシュ縮小用
	ldi	temp,25
	rjmp	timer

tr250ms:				;単なるフラッシュ縮小用
	ldi	temp,250
	rjmp	timer

;***************************************************************************
;*	ボーレート タイミング
;* getcharやputcharでの+13クロックやrcallも含め,bpsのクロックだけ遅らせる
;***************************************************************************
					;bpsは39以上必要
UART_delay:
	mov	bps_bak,bps		;TTT
	rcall	UART_dly		;1 115200/19200=6倍だが、put1bit_lsrなどの余分があるので8倍
	rcall	UART_dly		;2 
	rcall	UART_dly		;3
	rcall	UART_dly		;4
	rcall	UART_dly		;5
	rcall	UART_dly		;6
	rcall	UART_dly		;7
UART_dly:mov	bps,bps_bak		;8 TTT

	subi	bps,33+2		;(putchar+14,racll+3,ret+4,ここで+12)=33クロック余分
					;１ポート送受信用に+2
	mov	temp,bps
	andi	temp,0x03
	breq	UART_0			;0x00= 8clock(UART_3のnopの次まで)
	dec	temp
	breq	UART_1			;0x01= 9clock
	dec	temp
	breq	UART_2			;0x02=10clock
	dec	temp
	breq	UART_3			;0x03=11clock
UART_0:	nop
UART_1:	nop
UART_2:	nop
UART_3:	nop
	mov	temp,bps
	lsr	temp			;1/2
	lsr	temp			;1/4
UART_lop:
	nop
	dec	temp			;ここの+4は-1ループなので±ゼロ
	brne	UART_lop		;4clock*bpsでループ
	nop
	ret


;****** END of file ******
