Blame | Last modification | View Log | Download | RSS feed
#include <avr/io.h>#include "_ps2k.h";;--------------------------------------;.macro ps2k_dataline_upcbi _SFR_IO_ADDR(DDRD),6sbi _SFR_IO_ADDR(PORTD),6.endm;.macro ps2k_dataline_downcbi _SFR_IO_ADDR(PORTD),6sbi _SFR_IO_ADDR(DDRD),6.endm;.macro ps2k_clockline_upcbi _SFR_IO_ADDR(DDRE),4sbi _SFR_IO_ADDR(PORTE),4.endm;.macro ps2k_clockline_downcbi _SFR_IO_ADDR(PORTE),4sbi _SFR_IO_ADDR(DDRE),4.endm;;--------------------------------------;.global TIMER0_OVF_vect.func TIMER0_OVF_vectTIMER0_OVF_vect:ps2k_dataline_uppush r18in r18,_SFR_IO_ADDR(SREG)push r18in r18,_SFR_IO_ADDR(TIMSK)cbr r18,(1<<TOIE0)out _SFR_IO_ADDR(TIMSK),r18pop r18out _SFR_IO_ADDR(SREG),r18pop r18ps2k_clockline_upreti.endfunc;;--------------------------------------;.global INT4_vect.func INT4_vectINT4_vect:push r18in r18,_SFR_IO_ADDR(SREG)push r18push r19push r20push r21ldi r21,1lds r19,ps2k_datalds r20,ps2k_bit_countlds r18,ps2k_flagssbrc r18,PS2K_BIT_TXrjmp .L_int4tx_0cpi r20,9breq .L_int4rx9cpi r20,10brcc .L_int4rxstst r20brne .L_int4rx1;start bitsbic _SFR_IO_ADDR(PIND),6 ; data linerjmp .L_int4rx_clr_dcbr r18,(1<<PS2K_BIT_PARITY)inc r20rjmp .L_int4_exit;data bits.L_int4rx1:lsr r19sbis _SFR_IO_ADDR(PIND),6 ; data linerjmp .L_int4rx2ori r19,0b10000000eor r18,r21.L_int4rx2:inc r20rjmp .L_int4_exit;parity bit.L_int4rx9:sbic _SFR_IO_ADDR(PIND),6 ; data lineeor r18,r21sbrs r18,PS2K_BIT_PARITYrjmp .L_int4rx_clr_dinc r20rjmp .L_int4_exit;stop bit.L_int4rxs:sbis _SFR_IO_ADDR(PIND),6 ; data linerjmp .L_int4rx_clr_dsts ps2k_raw_ready,r20sts ps2k_raw_code,r19ps2k_clockline_downldi r20,0x80out _SFR_IO_ADDR(TCNT0),r20 ;Tclk*8*128=~92usldi r20,(1<<TOV0)out _SFR_IO_ADDR(TIFR),r20in r20,_SFR_IO_ADDR(TIMSK)ori r20,(1<<TOIE0)out _SFR_IO_ADDR(TIMSK),r20lds r20,ps2k_skiptst r20brne .L_int4rx_skipcpi r19,0xe1breq .L_int4rx_e1cpi r19,0xaabreq .L_int4rx_clr_fcpi r19,0xabbreq .L_int4rx_abcpi r19,0xeebreq .L_int4rx_clr_fcpi r19,0xfabreq .L_int4rx_clr_fcpi r19,0xfebreq .L_int4rx_clr_fcpi r19,0xe0breq .L_int4rx_e0cpi r19,0xf0breq .L_int4rx_f0sbr r18,(1<<PS2K_BIT_READY)sts ps2k_key_flags_and_code,r18sts (ps2k_key_flags_and_code)+1,r19rjmp .L_int4rx_clr_f.L_int4rx_e0:sbr r18,(1<<PS2K_BIT_EXTKEY)rjmp .L_int4rx_clr_d.L_int4rx_f0:sbr r18,(1<<PS2K_BIT_RELEASE)rjmp .L_int4rx_clr_d.L_int4rx_skip:dec r20sts ps2k_skip,r20brne .L_int4rx_clr_dlds r19,(ps2k_key_flags_and_code)+1cpi r19,0x7ebrne .L_int4rx_clr_dldi r18,(1<<PS2K_BIT_READY)|(1<<PS2K_BIT_RELEASE)|(1<<PS2K_BIT_EXTKEY)sts ps2k_key_flags_and_code,r18rjmp .L_int4rx_clr_f.L_int4rx_ab:clr r19sts (ps2k_key_flags_and_code)+1,r19sts ps2k_skip,r21rjmp .L_int4rx_clr_f.L_int4rx_e1:ldi r18,(1<<PS2K_BIT_READY)|(1<<PS2K_BIT_EXTKEY)sts ps2k_key_flags_and_code,r18ldi r19,0x7ests (ps2k_key_flags_and_code)+1,r19ldi r20,7sts ps2k_skip,r20.L_int4rx_clr_f:clr r18.L_int4rx_clr_d:clr r19clr r20rjmp .L_int4_exit;-------.L_int4tx_0:cpi r20,9breq .L_int4tx9cpi r20,10breq .L_int4txscpi r20,11brcc .L_int4txatst r20brne .L_int4tx1;start bitsbr r18,(1<<PS2K_BIT_PARITY)inc r20rjmp .L_int4_exit;data bits.L_int4tx1:ror r19brcc .L_int4tx2ps2k_dataline_upeor r18,r21inc r20rjmp .L_int4_exit.L_int4tx2:ps2k_dataline_downinc r20rjmp .L_int4_exit;parity bit.L_int4tx9:sbrc r18,PS2K_BIT_PARITYrjmp .L_int4txpps2k_dataline_downinc r20rjmp .L_int4_exit.L_int4txp:ps2k_dataline_upinc r20rjmp .L_int4_exit;stop bit.L_int4txs:ps2k_dataline_upinc r20rjmp .L_int4_exit;здесь раньше проверялся ack-bit, но CHRV знает ;); где есть такие клавиатуры, которые не выдают этот бит..L_int4txa:;clr r18;sbis _SFR_IO_ADDR(PIND),6 ; data lineldi r18,(1<<PS2K_BIT_ACKBIT)clr r19clr r20.L_int4_exit:sts ps2k_bit_count,r20sts ps2k_data,r19sts ps2k_flags,r18pop r21pop r20pop r19pop r18out _SFR_IO_ADDR(SREG),r18pop r18reti.endfunc;;--------------------------------------