Linetracing program (Assembly)

This program is for the August 2015 IRO (China), using Aaron's arduino robot.

```
/*
    Copyright (C) 2015  Calvin Ng

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    See <http://www.gnu.org/licenses/> for the full license.

    Contact at calvinforum@rocketmail.com
*/

```

```
void setup() {
  asm volatile(
   "SBI %[DIRAnalog], %[PNA0] \n\t"
   "SBI %[DIR813], %[PN13]    \n\t"
   "CBI %[DIR813], %[PN12]    \n\t"
   "SBI %[DIR813], %[PN8]     \n\t"
   "SBI %[DIR813], %[PN9]     \n\t"
   "SBI %[DIR813], %[PN10]    \n\t"
   "SBI %[DIR813], %[PN11]    \n\t"
   "CBI %[DIR07], %[PN5]      \n\t"
   "CBI %[DIRAnalog], %[PNA1] \n\t"

  :: [DIR07] "I" (_SFR_IO_ADDR(DDRD)), [DIR813] "I" (_SFR_IO_ADDR(DDRB)),
     [PN8] "I" (DDB0), [PN9] "I" (DDB1), [PN10] "I" (DDB2), [PN11] "I" (DDB3),
     [PN0] "I" (DDD0), [PN5] "I" (DDD5), [PN13] "I" (DDB5), [PN12] "I" (DDB4),
     [DIRAnalog] "I" (_SFR_IO_ADDR(DDRC)), [PNA0] "I" (DDC0), [PNA1] "I" (DDC1)
  );
}

void loop() {
  asm volatile(
  "CBI  %[OUTAnalog], %[PNA0] \n\t"
  "CBI  %[OUT813], %[PN13]    \n\t"

  "CALL WaitMainSwitch        \n\t"

"Main:                        \n\t" //if-else loop starts here
  "SBIC %[INAnal], %[PNA1]    \n\t"
  "RJMP sense1                \n\t"
  "SBIC %[IN07], %[PN4]       \n\t"
  "RJMP sense7                \n\t"
  "SBIC %[IN07], %[PN2]       \n\t"
  "RJMP sense2                \n\t"
  "SBIC %[IN07], %[PN3]       \n\t"
  "RJMP sense6                \n\t"
  "SBIC %[IN07], %[PN7]       \n\t"
  "RJMP sense3                \n\t"
  "SBIC %[IN07], %[PN6]       \n\t"
  "RJMP sense5                \n\t"
  "CALL MoveFwd               \n\t"
  "RJMP Main                  \n\t"
"sense3:                      \n\t"
  "CALL SwvLeft               \n\t"
  "RJMP Main                  \n\t"
"sense5:                      \n\t"
  "CALL SwvRight              \n\t"
  "RJMP Main                  \n\t"
"sense1:                      \n\t"
  "CALL TurnLeft              \n\t"
  "SBIS %[IN07], %[PN5]       \n\t"
  "SBIS %[IN07], %[PN6]       \n\t"
  "RJMP sense1                \n\t"
  "RJMP Main                  \n\t"
"sense7:                      \n\t"
  "CALL TurnRight             \n\t"
  "SBIS %[IN07], %[PN5]       \n\t"
  "SBIS %[IN07], %[PN7]       \n\t"
  "RJMP sense7                \n\t"
  "RJMP Main                  \n\t"
"sense2:                      \n\t"
  "CALL HSwvL                 \n\t"
  "RJMP Main                  \n\t"
"sense6:                      \n\t"
  "CALL HSwvR                 \n\t"
  "RJMP Main                  \n\t" //end of if-else loop

"WaitMainSwitch:              \n\t"//Wait until main switch start
  "SBIS %[IN813], %[PN12]     \n\t"
  "RET                        \n\t"
  "RJMP WaitMainSwitch        \n\t"

  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [OUT07] "I" (_SFR_IO_ADDR(PORTD)),
     [PN8] "I" (PORTB0), [PN9] "I" (PORTB1), [PN10] "I" (PORTB2), [PN11] "I" (PORTB3),
     [IN07] "I" (_SFR_IO_ADDR(PIND)), [PN5] "I" (PIND5), [PN0] "I" (PORTD0),
     [PN13] "I" (PORTB5),
     [OUTAnalog] "I" (_SFR_IO_ADDR(PORTC)), [PNA0] "I" (PORTC0),
     [IN813] "I" (_SFR_IO_ADDR(PINB)), [PN12] "I" (PINB4), [PN6] "I" (PIND6), [PN7] "I" (PIND7),
     [INP07] "a" (PIND), [PN4] "I" (PIND4), [PN2] "I" (PIND2), [PN3] "I" (PIND3),
     [INAnal] "I" (_SFR_IO_ADDR(PINC)), [PNA1] "I" (PINC1)
  );

  asm volatile(
"MoveFwd: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 100);
  analogWrite(10, 100);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"SwvLeft: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 110);
  analogWrite(10, 60);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"SwvRight: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 60);
  analogWrite(10, 110);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"TurnRight: \n\t"
  "CBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 50);
  analogWrite(10, 70);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"TurnLeft: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "CBI %[OUT813], %[PN11]     \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 70);
  analogWrite(10, 50);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"HSwvR: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 30);
  analogWrite(10, 125);
  asm volatile(
  "RET"
  ::
  );
  asm volatile(
"HSwvL: \n\t"
  "SBI %[OUT813], %[PN8]      \n\t"
  "SBI %[OUT813], %[PN11]      \n\t"
  :: [OUT813] "I" (_SFR_IO_ADDR(PORTB)), [PN8] "I" (PORTB0), [PN11] "I" (PORTB3)
  );
  analogWrite(9, 125);
  analogWrite(10, 30);
  asm volatile(
  "RET"
  ::
  );
}

```