further optimize codesize
[pub/USBaspLoader.git] / firmware / main.c
index b8e17a0..2639644 100644 (file)
@@ -220,25 +220,21 @@ void __func_clearram(void) {
 }
 #endif
 
-#if (!USE_EXCESSIVE_ASSEMBLER) || (!(defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__) || defined (__AVR_ATmega8HVA__)))
 static void (*nullVector)(void) __attribute__((__noreturn__));
-#endif
 
-static void __attribute__((__noreturn__)) leaveBootloader()
-{
+static void __attribute__((naked)) __attribute__((__noreturn__)) leaveBootloader(void);
+static void leaveBootloader(void) {
 #if (USE_EXCESSIVE_ASSEMBLER) && (defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__) || defined (__AVR_ATmega8HVA__))
 asm  volatile  (
   "cli\n\t"
-  "clr         r30\n\t"
   "sbi         %[usbddr],      %[usbminus]\n\t"  
   "cbi         %[port],        %[bit]\n\t"
-  "out         %[usbintrenab], r30\n\t"
-  "out         %[usbintrcfg],  r30\n\t"
+  "out         %[usbintrenab], __zero_reg__\n\t"
+  "out         %[usbintrcfg],  __zero_reg__\n\t"
   "ldi         r31,            %[ivce]\n\t"
   "out         %[mygicr],      r31\n\t"
-  "out         %[mygicr],      r30\n\t"  
-  "clr         r31\n\t"
-  "icall\n\t"
+  "out         %[mygicr],      __zero_reg__\n\t"  
+  "rjmp                nullVector\n\t"
   :
   : [port]        "I" (_SFR_IO_ADDR(PIN_PORT(JUMPER_PORT))),
     [bit]         "I" (PIN(JUMPER_PORT, JUMPER_BIT)),