; Copyright Sugihara Toshio.
; 鳥の鳴き声そのものに著作権はありません。
#include <P12F675.INC>
; PIC12F675
; Clock=Internal No CLKOUT 4MHz
; WDT=off, PowerUpTimer=on
; Protect=off
; GP3=GPIO, BrownOutDetect=off

; 変数の定義
outbuf	equ	H'20'	;音が出るのは[0,1]と[4,5]
outmask	equ	H'21'	;このマスクで反転操作
ka		equ	H'22'
kb		equ	H'23'
kc		equ	H'24'
kd		equ	H'25'	
wait1	equ	H'26'
wait2	equ	H'27'
; はじまり
	; リセットで始まる場合
	org H'00'
boot
	goto start
	; 割り込みではじまる場合
	org H'04'	
warikomi
	goto start
	; 通常の起動
start
 	clrf INTCON	;割り込みの禁止
	clrf STATUS	;bank0を選択
	; I/Oの初期化
	clrf GPIO
 	movlw H'07'		; コンパレータを使わない
 	movwf CMCON
	bsf STATUS,RP0	;Select Bank 1
	clrf TRISIO		;全て出力の設定
	movlw B'11010101'		;プルアップ機能を無効に
						;1:64のタイマ比率16.38msごとに繰り上がり
	movwf OPTION_REG
	clrf ANSEL		;ADコンバータは使わない
	clrf STATUS		;Select Bank 0
	;出力状態の初期化
	clrf GPIO
	;タイマ初期化
	clrf TMR0
	bcf INTCON,T0IF

mainloop
	;少し(300ms)休む
	call wait100ms
	call wait100ms
	call wait100ms
	;鳴らす
	movlw H'01'
	movwf outbuf		;最初は[0,1]のほうから音を出す
	movlw H'03'
	movwf outmask
	call beepkakko
	;少し(600msと少し)休む
	call wait100ms
	call wait100ms
	call wait100ms
	call wait100ms
	call wait100ms
	call wait100ms
	movlw D'220'
	call waitW
	;鳴らす
	movlw H'10'
	movwf outbuf		;後は[4,5]のほうから音を出す
	movlw H'30'
	movwf outmask
	call beepkakko
	;少し休む
	call wait100ms
	call wait100ms
	call wait100ms
	movlw D'220'
	call waitW
	goto boot

beepkakko
	;初期の音程
	movlw D'40'
	movwf kc
	;768回
	movlw D'3'
	movwf kd
beepk0
	clrf kb
beepk1
	;現在の音程をセット
	movf kc,W
	movwf ka	
beepk2
	decfsz ka,F
	goto beepk2
	;出力反転
	movf outbuf,W
	xorwf outmask,W
	movwf outbuf
	movwf GPIO
	;32回に1回ずつ値を増やす
	movf kb,W
	andlw H'1f'
	btfsc STATUS,Z
	incf kc,F

	;回数チェック
	decfsz kb,F
	goto beepk1
	decfsz kd,F
	goto beepk0

	;出力終了
	clrf GPIO
	return

	;およそ100ms休む
wait100ms
	movlw D'43'
	movwf wait1
	movlw D'137'
	movwf wait2		;6
waitwhile2
	decfsz wait1,F
	goto waitwhile2	;256*3+2
	decfsz wait2,F	
	goto waitwhile2
	return			;1

; Wレジスタの値に比例して一休み。およそ136で100ms
waitW
	movwf wait2
	clrf wait1
waitW2
	decfsz wait1,F
	goto waitW2	
	decfsz wait2,F	
	goto waitW2
	return

	end
