Blame | Last modification | View Log | Download | RSS feed
#include <avr/io.h>#include "_t_ps2m.h";;--------------------------------------;.macro ps2m_dataline_upcbi _SFR_IO_ADDR(DDRD),7sbi _SFR_IO_ADDR(PORTD),7.endm;.macro ps2m_dataline_downcbi _SFR_IO_ADDR(PORTD),7sbi _SFR_IO_ADDR(DDRD),7.endm;.macro ps2m_clockline_upcbi _SFR_IO_ADDR(DDRE),5sbi _SFR_IO_ADDR(PORTE),5.endm;.macro ps2m_clockline_downcbi _SFR_IO_ADDR(PORTE),5sbi _SFR_IO_ADDR(DDRE),5.endm;;--------------------------------------;.global INT5_vect.func INT5_vectINT5_vect:push r18in r18,_SFR_IO_ADDR(SREG)push r18push r19push r20push r21ldi r21,1lds r19,ps2m_datalds r20,ps2m_bit_countlds r18,ps2m_flagssbrc r18,PS2M_BIT_TXrjmp .L_int5tx_0cpi r20,9breq .L_int5rx9cpi r20,10brcc .L_int5rxstst r20brne .L_int5rx1;start bitsbic _SFR_IO_ADDR(PIND),7 ; data linerjmp .L_int5rx_clr_dcbr r18,(1<<PS2M_BIT_PARITY)inc r20rjmp .L_int5_exit;data bits.L_int5rx1:lsr r19sbis _SFR_IO_ADDR(PIND),7 ; data linerjmp .L_int5rx2ori r19,0b10000000eor r18,r21.L_int5rx2:inc r20rjmp .L_int5_exit;parity bit.L_int5rx9:sbic _SFR_IO_ADDR(PIND),7 ; data lineeor r18,r21sbrs r18,PS2M_BIT_PARITYrjmp .L_int5rx_clr_dinc r20rjmp .L_int5_exit;stop bit.L_int5rxs:sbis _SFR_IO_ADDR(PIND),7 ; data linerjmp .L_int5rx_clr_dsts ps2m_raw_ready,r20sts ps2m_raw_code,r19.L_int5rx_clr_f:clr r18.L_int5rx_clr_d:clr r19clr r20rjmp .L_int5_exit;-------.L_int5tx_0:cpi r20,9breq .L_int5tx9cpi r20,10breq .L_int5txscpi r20,11brcc .L_int5txatst r20brne .L_int5tx1;start bitsbr r18,(1<<PS2M_BIT_PARITY)inc r20rjmp .L_int5_exit;data bits.L_int5tx1:ror r19brcc .L_int5tx2ps2m_dataline_upeor r18,r21inc r20rjmp .L_int5_exit.L_int5tx2:ps2m_dataline_downinc r20rjmp .L_int5_exit;parity bit.L_int5tx9:sbrc r18,PS2M_BIT_PARITYrjmp .L_int5txpps2m_dataline_downinc r20rjmp .L_int5_exit.L_int5txp:ps2m_dataline_upinc r20rjmp .L_int5_exit;stop bit.L_int5txs:ps2m_dataline_upinc r20rjmp .L_int5_exit;ack-bit.L_int5txa:clr r18sbis _SFR_IO_ADDR(PIND),7 ; data lineldi r18,(1<<PS2M_BIT_ACKBIT)clr r19clr r20.L_int5_exit:sts ps2m_bit_count,r20sts ps2m_data,r19sts ps2m_flags,r18pop r21pop r20pop r19pop r18out _SFR_IO_ADDR(SREG),r18pop r18reti.endfunc;;--------------------------------------;