;;****************************************************
;* R260 Hack					            *
;* For Attiny13                        		*
;* Mark Lerman                                		*
;* Version 1.10 - Start 2/16/2011              		* 
;* Programmed via usb programmer			  		*	
;* 9.6 MHz /8 fuse=1.2MHz clock                      *
;****************************************************

.Include "tn13def.inc"

.DEF rmp0	=R16	;multipurpose register
.DEF rmp1	=R17	;mpr
.DEF ticks	=R18	;interrupts counter`


; bit definitions
.EQU spoof	=1		;apg encoder spoof output


.CSEG
.Org $0000
;interrupt vectors are 1 byte in attiny13
	rjmp 	start 		; Reset Handler
	reti				; IRQ0 Handler
	reti 	  			; PCINT0 Handler
	reti				; Timer0 Overflow Handler
 	reti				; EEPROM Ready Handler
	reti				; Analog Comparator Handler
	rjmp	timint		; Timer0 CompareA Handler
	reti				; Timer0 CompareB Handler
	reti			 	; Watchdog Interrupt Handler
	reti		 		; ADC Conversion Handler

start:
	ldi		rmp0,low(ramend)	;set stack pointer to top of ram
	out		spl,rmp0
	rcall	set_ports
	rcall	set_ticks
	clr		ticks
	sbi		portb,spoof			;start hi
	sei


;spoofs apg sensor
;tabs are hi 14 msec
;spaces between are lo 25, 30, 53, and 89 msec
;sequence is tab-spac25-tab-space30-tab-space53-tab-space89, then repeat
apg_spoof:
	cpi		ticks,1		;start of tab?
	brne	apg2
	sbi		portb,spoof	;yes, start tab
	rjmp	apgend
apg2:
	cpi		ticks,14	;start of space?
	brne	apg3
	cbi		portb,spoof	;yes, start space
	rjmp	apgend
apg3:
	cpi		ticks,39	;start tab?
	brne	apg4
	sbi		portb,spoof	;yes, starttab
	rjmp	apgend

apg4:
	cpi		ticks,53	;start space?
	brne	apg5
	cbi		portb,spoof	;yes, start space
	rjmp	apgend
apg5:
	cpi		ticks,83	;start tab?
	brne	apg6
	sbi		portb,spoof	;yes,start tab
	rjmp	apgend
apg6:
	cpi		ticks,97	;start space?
	brne	apg7
	cbi		portb,spoof	;yes, start space
	rjmp	apgend		

apg7:
	cpi		ticks,150	;start tab?
	brne	apg8
	sbi		portb,spoof	;yes, start tab
	rjmp	apgend
apg8:
	cpi		ticks,164	;start space?
	brne	apg9
	cbi		portb,spoof	;yes,start space
	rjmp	apgend
apg9:
	cpi		ticks,253	;start tab?
	brne	apgend
	sbi		portb,spoof	;yes, start tab
	clr		ticks		;reset counter, start again!
apgend:
	rjmp	apg_spoof




;assign port

set_ports:
	ldi		rmp0,0xff	;all out
	out		ddrb,rmp0
	ldi		rmp0,0xff	;output hi - at tab

	out		portb,rmp0
	ret

;timer 0 set for 10 msec ticks
;9.6MHz osc/8 fuse=1.2MHz clock
;prescale by 256= 4687.5 Hz clock=213.333 usec/tick
;=.21333 msec/tick, so 10msec=46.875 counts=47 counts


set_ticks:
	ldi		rmp0,0x02	;
	out		tccr0a,rmp0
	ldi		rmp0,0x04	;/256
	out		tccr0b,rmp0	;
	ldi		rmp0,47		;10 usec
	out		ocr0a,rmp0
	ldi		rmp0,0x04	;match a interrupt
	out		timsk0,rmp0
	ret

;output compare interrupt routine
;10 msec interrupts
timint:
	inc		ticks
	reti




