;蛍のプログラム
;#define	F873

#ifdef F873
	list	p=16f873a
	include	<p16f873a.inc>
	__CONFIG	_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _CPD_OFF

#define	pLed1	PORTA,0
#define	pLed2	PORTA,1
#define	pLed3	PORTA,2
#define	pLed4	PORTA,3

#define	LedPort	PORTA
#define	kMaskLed	0x0f

#else
	list	p=12f675
	include	<p12f675.inc>
	__CONFIG	_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _CPD_OFF

#define	pLed1	GPIO,0
#define	pLed2	GPIO,1
#define	pLed3	GPIO,2
#define	pLed4	GPIO,4

#define	LedPort	GPIO
#define	kMaskLed	0x17

#endif
	radix	dec
	errorlevel	-302


	cblock 0x20
	w_temp
	status_temp
	timer
	saveTimer
	pwm1		;GP0 duty 0-127
	pwm2		;GP1 duty
	pwm3		;GP2 duty
	pwm4		;GP4 duty

	count1:2		;H,L 0x000-0x3ff for PWM1
	count2:2		;H,L 0x000-0x3ff for PWM2
	count3:2		;H,L 0x000-0x3ff for PWM3
	count4:2		;H,L 0x000-0x3ff for PWM4

	temp
	endc


	org	0
	nop
	goto	Main

	org	4
	movwf	w_temp
	movf	STATUS,W
	movwf	status_temp

	bcf	INTCON,T0IF
PwmOnWait:
	movf	pwm1,W
	subwf	TMR0,W
	btfss	STATUS,C
	bsf	pLed1
	btfsc	STATUS,C
	bcf	pLed1

	movf	pwm2,W
	subwf	TMR0,W
	btfss	STATUS,C
	bsf	pLed2
	btfsc	STATUS,C
	bcf	pLed2

	movf	pwm3,W
	subwf	TMR0,W
	btfss	STATUS,C
	bsf	pLed3
	btfsc	STATUS,C
	bcf	pLed3

	movf	pwm4,W
	subwf	TMR0,W
	btfss	STATUS,C
	bsf	pLed4
	btfsc	STATUS,C
	bcf	pLed4

	movlw	kMaskLed
	andwf	LedPort,W
	bnz	PwmOnWait

	incf	timer,F

	movf	status_temp,W
	movwf	STATUS
	swapf	w_temp,F
	swapf	w_temp,W
	retfie

;*****************************
;count1-4を＋１する。最大は、0x3ff
CountInc	macro	dest
	movlw	1
	addwf	dest+1,F
	btfsc	STATUS,C
	incf	dest,F
	bcf	dest,2
	endm
;count1-4からpwm1-4を設定する
Count2Pwm macro	count,pwm
	LOCAL	Area000, Area100, Next
	movf	count,F
	bz	Area000
	movlw	1
	subwf	count,W
	bz	Area100
;area 0x200-0x3ff
	clrw
	goto	Next
;area 0x100-0x1ff
Area100:
	movf	count+1,W
	sublw	255
	movwf	temp
	bcf	STATUS,C
	rrf	temp,W
	goto	Next

;area 0x000-0x0ff
Area000:
	bcf	STATUS,C
	rrf	count+1,W
	movwf	pwm

Next:
	movwf	pwm
	endm

;*******************************
;Main
;*******************************
Main:
#ifndef F873
	call	0x3ff
	banksel	OSCCAL
	movwf	OSCCAL
#endif
	call	Init
MainLoop:
	movf	timer,W
	movwf	saveTimer
MainWait:
	clrwdt
	movf	timer,W
	subwf	saveTimer,W
	bz	MainWait

	CountInc	count1
	CountInc	count2
	CountInc	count3
	CountInc	count4

	Count2Pwm count1, pwm1
	Count2Pwm count2, pwm2
	Count2Pwm count3, pwm3
	Count2Pwm count4, pwm4

	goto	MainLoop


Init:
	banksel	OPTION_REG
	movlw	0x85
	movwf	OPTION_REG

	banksel	INTCON
	movlw	0x20
	movwf	INTCON

#ifdef F873
	banksel	ADCON1
	movlw	0x06
	movwf	ADCON1

	banksel	TRISA
	movlw	0x00
	movwf	TRISA

	banksel	PORTA
	clrf	PORTA
#else
	banksel	ANSEL
	clrf	ANSEL

	banksel	CMCON
	movlw	0x07
	movwf	CMCON

	banksel	TRISIO
	movlw	0x08		;xxoo iooo
	movwf	TRISIO

	banksel	GPIO
	clrf	GPIO
#endif
;count1-4,pwm1-4初期値
	clrf	count1
	movlw	3
	movwf	count2
	movlw	2
	movwf	count3
	movlw	1
	movwf	count4

	clrf	count1+1
	clrf	count2+1
	clrf	count3+1
	clrf	count4+1

	clrf	pwm1
	clrf	pwm2
	clrf	pwm3
	clrf	pwm4

	bsf	INTCON,GIE
	return


	org	0x3ff
	retlw	0x80	;dummy

	end
