#define CONTROLLER_PORT PORTB #define CONTROLLER_PIN PINB #define CONTROLLER_DDR DDRB #define CONTROLLER_BITNAME PB1 #define CONTROLLER_BIT (1 << 1) .global SendControllerByte .global ReadControllerByte .global InitController Nop16: // 3 cycles rcall nop nop nop nop nop nop nop nop nop ret // 4 cycles ret Nop8: // 3 cycles rcall nop ret // 4 cycles ret InitController: in r20, CONTROLLER_PORT andi r20, ~CONTROLLER_BIT out CONTROLLER_PORT, r20 in r20, CONTROLLER_DDR andi r20, ~CONTROLLER_BIT out CONTROLLER_DDR, r20 mov r21, r20 ori r21, CONTROLLER_BIT // r20 = not setted, r21 = setted ret SendControllerBit: // r24, r25, r22, r23, r20, r21 ... sbrc r24, 1 rjmp SendZero SendOne: out CONTROLLER_DDR, r21 // pull low rcall Nop16 out CONTROLLER_DDR, r20 // high Z -> ext. pull up rcall Nop16 rcall Nop16 rcall Nop16 rjmp SendEnd SendZero: out CONTROLLER_DDR, r21 // 1 cycle rcall Nop16 rcall Nop16 rcall Nop16 out CONTROLLER_DDR, r20 rcall Nop16 SendEnd: ret // LSB send first SendControllerByte: rcall InitController rcall SendControllerBit // bit 1 lsr r24 rcall SendControllerBit // bit 2 lsr r24 rcall SendControllerBit // bit 3 lsr r24 rcall SendControllerBit // bit 4 lsr r24 rcall SendControllerBit // bit 5 lsr r24 rcall SendControllerBit // bit 6 lsr r24 rcall SendControllerBit // bit 7 lsr r24 rcall SendControllerBit // bit 8 ret