;;**************************************************** ;* 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