; Copyright Sugihara Toshio.
; 音楽そのものは著作権切れです。
#include <P12F675.INC>
; PIC12F675
; Clock=XT 4.19MHz
; WDT=off, PowerUpTimer=on
; Protect=off
; GP3=GPIO, BrownOutDetect=off

; 変数の定義
timeleft	equ	H'20'
outbuf	equ	H'21'
gobuf	equ	H'22'
curpos	equ	H'23'
numhalf	equ	H'24'
numlen	equ	H'25'

; はじまり
	; リセットで始まる場合
	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のタイマ比率15.63msごとに繰り上がり
	movwf OPTION_REG
	clrf ANSEL		;ADコンバータは使わない
	clrf STATUS		;Select Bank 0
	;出力状態の初期化
	clrf GPIO
	;タイマ初期化
	clrf TMR0
	bcf INTCON,T0IF
	; 変数の初期化
	movlw H'01'
	movwf outbuf
	clrf curpos

nextloop
	;ちょっと(20ms)休み
	clrf GPIO
	movlw D'26'
	movwf numlen
nextloop1
	clrf timeleft	
nextloop2
	decfsz timeleft,F
	goto nextloop2
	decfsz numlen,F
	goto nextloop1

	;次の状態を読み取る
	movf	curpos,W
	call	setlen
	andlw	H'ff'
	btfsc	STATUS,Z	;長さ0の場合は
	goto 	boot		;ブートまで戻る
	movwf	numlen	;タイマくりあがり回数ぶんの長さ
	movf curpos,W
	call setmel		;音程番号
	call setfreq		;待ち数に変換
	movwf numhalf	;おおむね半波長ぶん命令数
	;音程コード0の場合は休符
	movf numhalf,W
	btfsc STATUS,Z	;半波長命令数が0の場合は
	goto yasumi		;休みルーチンへ
waveloop1
	;反転と初期値代入
	movf outbuf,W
	xorlw H'03'
	movwf outbuf
	movwf GPIO
	movf numhalf,W	;残り時間の
	movwf timeleft	;デフォルト値をセット 6
	;時間待ち
waveloop2
	goto waveloop20
waveloop20
	decfsz timeleft,F	;5*num-1
	goto waveloop2
	;タイマ判定
	btfss INTCON,T0IF
	goto waveloop1		;3
	;タイマが上がった場合
	bcf INTCON,T0IF	;タイマを下ろす
	decfsz numlen,F
	goto waveloop1	;まだ終わっていない 3
					;この音は終わり
	incf curpos,F
	goto nextloop
	
yasumi
	clrf GPIO
	btfss INTCON,T0IF
	goto yasumi
yasumi2
	bcf INTCON,T0IF
	decfsz numlen,F
	goto yasumi
	incf curpos,F
	goto nextloop

	org	H'200'	;512番地から始める
setfreq
	movwf gobuf
	movlw H'02'
	movwf PCLATH
	movf gobuf,W
	addwf PCL,F
	retlw D'0'
	retlw D'237'	;A
	retlw D'211'	;B	
	retlw D'199'	;C	
	retlw D'177'	;D
	retlw D'157'	;E
	retlw D'149'	;F
	retlw D'132'	;G
	retlw D'118'	;A
	retlw D'105'	;B
	retlw D'99'	;C
	retlw D'88'	;D
	retlw D'78'	;E
	retlw D'73'	;F
	retlw D'65'	;G
	retlw D'58'	;A

setmel
	movwf gobuf
	movlw H'02'
	movwf PCLATH
	movf gobuf,W
	addwf PCL,F

	;レレレシラソラシレレミレソ
	retlw	D'0'		;1 休符
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'9'		; シ
	retlw	D'8'		; ラ
	retlw	D'7'		; ソ
	retlw	D'8'		; ラ
	retlw	D'9'		; シ
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'5'		; ミ
	retlw	D'4'		; レ
	retlw	D'7'		; ソ
	;レレ Hレ シラソラシレレミレソ
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'11'	; Hレ
	retlw	D'9'		; シ
	retlw	D'8'		; ラ
	retlw	D'7'		; ソ
	retlw	D'8'		; ラ
	retlw	D'9'		; シ
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'5'		; ミ
	retlw	D'4'		; レ
	retlw	D'7'		; ソ
	;Hレ シソシラソラシ Hレ シソ Hレ Hミ Hミ
	retlw	D'11'	; Hレ
	retlw	D'9'		; シ
	retlw	D'7'		; ソ
	retlw	D'9'		; シ
	retlw	D'8'		; ラ
	retlw	D'7'		; ソ
	retlw	D'8'		; ラ
	retlw	D'9'		; シ
	retlw	D'11'	; Hレ
	retlw	D'9'		; シ
	retlw	D'7'		; ソ
	retlw	D'11'	; Hレ
	retlw	D'12'	; Hミ
	retlw	D'12'	; Hミ
	;Hレ シ Hド ラシソラシレレミレソ
	retlw	D'11'	; Hレ
	retlw	D'9'		; シ
	retlw	D'10'	; Hド
	retlw	D'8'		; ラ
	retlw	D'9'		; シ
	retlw	D'7'		; ソ
	retlw	D'8'		; ラ
	retlw	D'9'		; シ
	retlw	D'4'		; レ
	retlw	D'4'		; レ
	retlw	D'5'		; ミ
	retlw	D'4'		; レ
	retlw	D'7'		; ソ
	retlw	H'0'		;終端

	org H'300'
setlen
	movwf gobuf
	movlw H'03'
	movwf PCLATH
	movf gobuf,W
	addwf PCL,F

	;レレレシラソラシレレミレソソ
	retlw	D'19'	;1 およそ0.3s
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'72'
	;レレ Hレ シラソラシレレミレソソ
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'72'
	;Hレ シソシラソラシ Hレ シソ Hレ Hミ Hミ
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'60'
	retlw	D'12'
	;Hレ シ Hド ラシソラシレレミレソ	
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'24'
	retlw	D'12'
	retlw	D'72'
	retlw	H'0'		;終端

	end
